如何用蒙特卡洛模拟社会财富分配 2019-05-29

image.png

首先,介绍下什么是蒙特卡洛模拟(let's go)
蒙特卡罗(Monte Carlo)方法,又称随机抽样或统计试验方法,当所要求解的问题是某种事件出现的概率,或者是某个随机变量的期望值时,它们可以通过某种“试验”的方法,得到这种事件出现的频率,或者这个随机变数的平均值,并用它们作为问题的解。这就是蒙特卡罗方法的基本思想。蒙特卡罗方法通过抓住事物运动的几何数量和几何特征,利用数学方法来加以模拟,即进行一种数字模拟实验。它是以一个概率模型为基础,按照这个模型所描绘的过程,通过模拟实验的结果,作为问题的近似解。可以把蒙特卡罗解题归结为三个主要步骤:构造或描述概率过程;实现从已知概率分布抽样;建立各种估计量。
简单来说,就是通过随机数,对策略进行模拟和评估
那么,如何通过蒙特卡洛模拟对社会财富分配进行预估呢,此处有个不成熟的小案例,即:假设有100个人,每人的初始财富是100元,当财富值大于0时,需要随机向其他一人支付1元,当财富值为0时,无需支付,但仍有可能获得其他人支付的金额,基于以上假设进行需进行如下四步操作:
1、构建函数模型

#注意:当某人财富值为0时,该轮无需拿钱出来,但仍有机会获得别人的财富
def game1(data,roundi):
    if len(data[data[roundi-1]==0])>0:
        round_i=pd.DataFrame({'pre_round':data[roundi-1],'lost':0})
        con=round_i['pre_round']>0
        round_i['lost'][con]=1
        round_players_i=round_i[con]
        choice_i=pd.Series(np.random.choice(person_n,len(round_players_i)))
        gain_i=pd.DataFrame({'gain':choice_i.value_counts()})
        round_i = round_i.join(gain_i)
        round_i.fillna(0,inplace=True)
        return round_i['pre_round']-round_i['lost']+round_i['gain']
    else:
        round_i=pd.DataFrame({'pre_round':data[roundi-1],'lost':1})
        choice_i=pd.Series(np.random.choice(person_n,100))
        gain_i=pd.DataFrame({'gain':choice_i.value_counts()})
        round_i=round_i.join(gain_i)
        round_i.fillna(0,inplace=True)
        return round_i['pre_round']-round_i['lost']+round_i['gain']

运行模型,模拟财富分配

import time
person_n=[x for x in range(1,101)]
fortune=pd.DataFrame([100 for i in range(100)],index=person_n)
fortune.index.name='id'
#设定初始参数,游戏玩家100人,初始资金100元
starttime=time.time()
for round in range(1,17001)[:3000]:
    print('正在进行第%i次模拟'% round)
    fortune[round] = game1(fortune,round)
    #fortune[round] = game1(fortune,round)
game1_result=fortune.T
endtime=time.time()
print('模型总共用时%i秒' % (endtime - starttime))
game1_result

绘制柱状图
前100轮,按每10轮绘制一次,第100-1000轮,按照每100轮绘制1次,第1000-17000轮,按每400轮绘制一次
查看财富变化状况

def graph2(data,start,end,length):
    for n in list(range(start,end,length)):
        datai=data.iloc[n].sort_values().reset_index()[n]
        plt.figure(figsize=(10,3))
        plt.title('第%i轮'%n)
        plt.bar(datai.index,datai.values,color='gray',alpha=0.8,width=0.5)
        plt.xlabel('PlayerID')
        plt.ylabel('Fortune')
        plt.xlim(-10,110)
        plt.ylim(0,400)
        plt.grid(alpha=0.5,linestyle='--')
        
graph2(game1_result,0,100,10)
graph2(game1_result,100,1000,100)
graph2(game1_result,1000,17000,400)

得出结论
最后一轮中,最富有的人财富值为365元,相比于初始财富,翻了3.65倍
10%的人掌握着28%的财富,20%的人掌握着51%的财富?
60%的人财富缩水至100元以下了

round_17000_1 = pd.DataFrame({'money':game1_result.iloc[-1]}).
sort_values(by = 'money',ascending = False).reset_index()
# 最后一轮数据汇总,并排序
round_17000_1['fortune_pre'] = round_17000_1['money'] / round_17000_1['money'].sum()
# 计算每个人的财富占比
round_17000_1['fortune_cumsum'] = round_17000_1['fortune_pre'].cumsum()
# 计算积累财富占比
round_17000_1.head()

fortune_sum = round_17000_1['money'].sum()
top10 = round_17000_1[round_17000_1['fortune_cumsum']<0.1]
top20 = round_17000_1[round_17000_1['fortune_cumsum']<0.2]
# 汇总出掌握前10%/20%财富的人群

lessthan100_num = len(round_17000_1[round_17000_1['money']<100])/100

print('最后一轮中,最富有的人财富值为%.1f元,相比于初始财富,翻了%.2f倍'
% (round_17000_1.iloc[0]['money'],round_17000_1.iloc[0]['money']/100))
print('10%%的人掌握着%.2f%%的财富,20%%的人掌握着%.2f%%的财富'
% (top10['money'].sum()/10000*100,top20['money'].sum()/10000*100))
print('%.2f%%的人财富缩水至100元以下了' % (lessthan100_num*100))

注意:用蒙特卡洛模拟需要满足样本可用随机数试验的原则,样本分布必须是随机的,不能有偏好!
以上便是此次模拟过程~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容