论《如果35岁破产,还有多大可能逆袭?》

论《如果35岁破产,还有多大可能逆袭?》

  • “When people were drown in data, knowledge was nowhere to be found”—–Charlie Munger

最近一篇叫《如果25岁破产,还有多大可能逆袭?》的文章在互联网快速传播。作者从纯数学模拟的角度模拟了理想状况下财富的分配以及在不同条件下(可负债、有个好爸爸、税收等)的财富分配情况。相信文章结尾的一把鸡汤一定会让读者在读完严肃的模拟及结论后会心一笑。此外,作者的数据可视化的能力可见一斑。
不过,引起我兴趣的是文章中关于幂分布的结论。由于作者并未提供源代码,因此出于好奇,自己动动手写代码是唯一满足好奇的方法。然而,最终我得到的结论和作者的结论大相径庭。本文中代码都由Python语言编写,有兴趣的读者可以读一读代码,如能找出导致结论不一致的原因或其他勘误,还望望互通有无。
注:因为计算机产生的伪随机数每次都不同,因此读者如果得到的图像与下面的图像不完全相同是合理的,但其大概的统计学规律应该相同。

原题:
“我们不妨把这场游戏视作社会财富分配的简化模型,从而模拟这个世界的运行规律。我们假设:每个人在18岁带着100元的初始资金开始玩游戏,每天玩一次,一直玩到65岁退休。“每天拿出一元钱”可理解为基本的日常消费,“获得财富的概率随机”是为了……嗯……简化模型。以此计算,人一生要玩17000次游戏,即获得17000次财富分配的机会。”
更多题目细节及结论可在这里找到

Scenario 1: 不可负债

  • 所有玩家财富柱状图:
    所有玩家财富柱状图
  • 所有玩家财富直方图:
    所有玩家财富直方图
    从直方图可见概率分布形式和幂分布比起来更像正态分布

python代码:

def generate():
    import random
    wealth = [] 
    order = [] 
    for i in range(100):#定义100个人的序号
        order.append(i+1)
    for i in range(100):#定义财富
        wealth.append(100)
    for j in range(17000):#模拟17000天
        for i in range(100):#模拟每天100个人的财富交换
            if wealth[i]==0:#不可负债
                break
            else:
                wealth[i] = wealth[i] - 1
                rand_guy=random.choice([x for x in range(0,100) if x !=i])#其余99人用平均分布取出一个人
            wealth[rand_guy] = wealth[rand_guy] + 1
    wealth.sort()#对财富排序
    return wealth, order
wealth,order=generate()
#检验财富有无流失,return 10000则没有流失
print(sum(wealth))
#显示100个人的财富柱状图
import matplotlib.pyplot as plt
#fig1 = plt.figure()
plt.bar( order,wealth,0.4,color="green")
plt.title('Forbes')
plt.xlabel('Order of participants')
plt.ylabel('Fortune')
plt.show()
#统计100个人的财富,显示直方图,可从直方图中大概了解其财富的分布形式
n, bins, patches = plt.hist(wealth, bins=30, normed=0, facecolor='green', alpha=0.75)
plt.xlabel('Fortune')
plt.ylabel('number of participants')
plt.show()

Scenario 2: 可负债

  • 所有玩家财富柱状图:
    所有玩家财富柱状图2
  • 所有玩家财富直方图:
    所有玩家财富直方图2
    从直方图可见概率分布形式和幂分布比起来更像正态分布,其实在可负债情况下应该是比较严格的正态分布,从单个人的财富角度分析其财富可以看作是17000x99个相同的随机事件的和减去17000,根据中心极限定理,其财富是正态分布,而非幂分布。这就容易理解为什么拥有100元左右的人的人数最多。

python代码:

def generate():
    import random
    wealth = []
    order = []
    for i in range(100):
        order.append(i+1)
    for i in range(100):
        wealth.append(100)
    for j in range(17000):#可负债情况不需判断某人的金钱是否为0
        for i in range(100):
            wealth[i]=wealth[i]-1
            rand_guy=random.choice([x for x in range(0,100) if x!=i])
            wealth[rand_guy]=wealth[rand_guy]+1
    wealth.sort()
    return wealth, order
wealth,order=generate()
print(sum(wealth))
# barchart
import matplotlib.pyplot as plt
plt.bar( order,wealth,0.4,color="green")
plt.title('Forbes')
plt.xlabel('Order of participants')
plt.ylabel('Fortune')
plt.show()
# histogram
n, bins, patches = plt.hist(wealth, bins=30, normed=0, facecolor='green', alpha=0.75)
plt.xlabel('Fortune')
plt.ylabel('number of participants')
plt.show()

Scenario 3: 可负债和对富人征收40%赋税

  • 所有玩家财富柱状图:
    所有玩家财富柱状图3
  • 所有玩家财富直方图:
    所有玩家财富直方图3
    在征税的情况下要比Scenario2不征税情况下好得多,首先没有人破产了(当然这和选取的富人标准,征税标准及模拟的次数有关),其次财富分配要比Scenario2均匀的多。

python代码:

def generate():
    import random
    wealth = []
    order = []
    for i in range(100):
        order.append(i+1)
    for i in range(100):
        wealth.append(100.0)
    for j in range(17000):
        for i in range(100):
            wealth[i]=wealth[i]-1
            rand_guy=random.choice([x for x in range(0,100) if x!=i])
            if wealth[rand_guy]>=200.0:#对拥有大于200元的玩家征收40%的税
                wealth[rand_guy] = wealth[rand_guy] + 0.6
                wealth_transi = wealth[:]
                for m in range(4):#对最贫穷的4位玩家每人补贴0.1元
                    ind=wealth_transi.index(min(wealth_transi))
                    wealth[ind]=wealth[ind]+0.1
                    wealth_transi[ind]=100000000
            else:
                wealth[rand_guy] = wealth[rand_guy] + 1
    wealth.sort()
    return wealth, order
wealth,order=generate()
print(sum(wealth))
# barchart
import matplotlib.pyplot as plt
#fig1 = plt.figure()
plt.bar( order,wealth,0.4,color="green")
plt.title('Forbes')
plt.xlabel('Order of participants')
plt.ylabel('Fortune')
plt.show()
# histogram
n, bins, patches = plt.hist(wealth, bins=30, normed=0, facecolor='green', alpha=0.75)
plt.xlabel('Fortune')
plt.ylabel('number of participants')
plt.show()

Scenario 4: 有个好爸爸?

  • 所有玩家财富柱状图_初始状态:
    所有玩家财富柱状图4_0round
    红色代表10位富二代玩家
  • 所有玩家财富柱状图_5000天模拟:
    所有玩家财富柱状图4_5000round
  • 所有玩家财富柱状图_17000天模拟:
    所有玩家财富柱状图4_17000round

毫无疑问,有个好爸爸的情况下大部分富二代们可以有很长一段时间的赢家通吃的局面。但随着时间的推移,也出现了少数富二代玩家(2位)几乎败光了所有家产。而17000天模拟之后,只有5位富二代玩家的财富还维持在200元以上。

python代码:

def generate():
    import random
    wealth = []
    order = []
    for i in range(100):
        order.append(i+1)
    for i in range(10):#前10位玩家有个好爸爸,生来就比普通玩家多100元财富
        wealth.append(200.0)
    for i in range(10,100):
        wealth.append(100.0)
    for j in range(5000):#模拟5000轮财富分配
        for i in range(100):
            wealth[i]=wealth[i]-1
            rand_guy=random.choice([x for x in range(0,100) if x!=i])
            wealth[rand_guy]=wealth[rand_guy]+1
    #wealth.sort()#为观察前10位富二代财富变化,不排序
    return wealth, order
wealth,order=generate()
print(sum(wealth))
print(sum(wealth[0:10]))#计算前10位富二代财富总和变化
#排序
wealth_transi=wealth[:]
wealth_sort=[]
order_rich=[]
wealth_rich=[]
order_normal=[]
wealth_normal=[]
for i in range(100):
    ind_min=wealth_transi.index(min(wealth_transi))
    wealth_sort.append(min(wealth_transi))
    wealth_transi[ind_min]=float('inf')
    if ind_min in [0,1,2,3,4,5,6,7,8,9]:
        order_rich.append(len(wealth_sort)-1)
        wealth_rich.append(wealth_sort[-1])
    else:
        order_normal.append(len(wealth_sort)-1)
        wealth_normal.append(wealth_sort[-1])
print(len(order_rich)==len(wealth_rich),len(order_normal)==len(wealth_normal))
# barchart
import matplotlib.pyplot as plt
#fig1 = plt.figure()
plt.bar( order_rich,wealth_rich,0.4,color="red")
plt.bar( order_normal,wealth_normal,0.4,color="green")
plt.title('Forbes')
plt.xlabel('Order of participants')
plt.ylabel('Fortune')
plt.show()
# histogram
n, bins, patches = plt.hist(wealth, bins=30, normed=0, facecolor='green', alpha=0.75)
plt.xlabel('Fortune')
plt.ylabel('number of participants')
plt.show()

Scenario 5: 更努力有用吗?

  • 所有玩家财富柱状图_1000天模拟:
    所有玩家财富柱状图5_1000round
  • 所有玩家财富柱状图_3000天模拟:
    所有玩家财富柱状图5_3000round
    非常明显10位努力的玩家在很早(1000天)就取得了令人钦佩的成绩,而在17000天之后更是甩开了普通人一大截。在模拟中,每个努力的玩家得到钱的概率是 999000 ,普通玩家得到钱的概率是 899000 ,即努力的玩家只比普通玩家多了约千分之一的胜率。但其结果令人兴奋不已。

python代码:

def generate():
    import random
    wealth = []
    order = []
    for i in range(100):
        order.append(i+1)
    for i in range(100):
        wealth.append(100)
    for j in range(1000):#此情况下只模拟1000天/3000天就能得到明显的结论
        for i in range(100):
            wealth[i]=wealth[i]-1
            rand_guylist1=[x for x in range(0,10) if x!=i]#定义0到9号玩家序号
            rand_guylist2 = [x for x in range(10, 100) if x != i]#定义10到99号玩家序号
            ind=random.randint(0,100)
            if ind<=10:#在0到9号玩家中取一个人的概率是11/100
                rand_guy = random.choice(rand_guylist1)
            else:#在10到99号玩家中取一个人的概率是(100-11)/100
                rand_guy = random.choice(rand_guylist2)
            #因此前10位玩家得到钱的概率要微大于后90位玩家,以此模拟10位更努力的玩家
            wealth[rand_guy]=wealth[rand_guy]+1
    #wealth.sort()#为展示前10位玩家财富变化,不进行排序
    return wealth, order
wealth,order=generate()
print(sum(wealth))
#排序
#排序
wealth_transi=wealth[:]
wealth_sort=[]
order_rich=[]
wealth_rich=[]
order_normal=[]
wealth_normal=[]
for i in range(100):
    ind_min=wealth_transi.index(min(wealth_transi))
    wealth_sort.append(min(wealth_transi))
    wealth_transi[ind_min]=float('inf')
    if ind_min in [0,1,2,3,4,5,6,7,8,9]:
        order_rich.append(len(wealth_sort)-1)
        wealth_rich.append(wealth_sort[-1])
    else:
        order_normal.append(len(wealth_sort)-1)
        wealth_normal.append(wealth_sort[-1])
print(len(order_rich)==len(wealth_rich),len(order_normal)==len(wealth_normal))
# barchart
import matplotlib.pyplot as plt
#fig1 = plt.figure()
plt.bar( order_rich,wealth_rich,0.4,color="red")
plt.bar( order_normal,wealth_normal,0.4,color="green")
plt.title('Forbes')
plt.xlabel('Order of participants')
plt.ylabel('Fortune')
plt.show()
# histogram
n, bins, patches = plt.hist(wealth, bins=30, normed=0, facecolor='green', alpha=0.75)
plt.xlabel('Fortune')
plt.ylabel('number of participants')
plt.show()

Scenario 6: 如果35岁破产,努力点有多大可能逆袭?

  • 所有玩家财富柱状图_0天模拟:
    所有玩家财富柱状图6_0
    0-9号的前10位玩家的初始财富值是0元
  • 所有玩家财富柱状图_1000天模拟:
    所有玩家财富柱状图6_1000round
  • 所有玩家财富柱状图_3000天模拟:
    所有玩家财富柱状图6_3000round
    在此模拟情况下,10位破产但努力的玩家仍然只比普通玩家多千分之一的机会。但结果令人振奋不已,在仅仅3000天模拟过后,他们成为了100位玩家当中最富有的一群人!

python代码:

def generate():
    import random
    wealth = []
    order = []
    for i in range(100):
        order.append(i+1)
    for i in range(10):#0到9号玩家是0元起家
        wealth.append(0)
    for i in range(90):#10到99号玩家是100元起家
        wealth.append(100)
    for j in range(3000):#此情况下只模拟3000天就能得到明显的结论
        for i in range(100):
            wealth[i]=wealth[i]-1
            rand_guylist1=[x for x in range(0,10) if x!=i]#定义0到9号玩家序号
            rand_guylist2 = [x for x in range(10, 100) if x != i]#定义10到99号玩家序号
            ind=random.randint(0,100)
            if ind<=10:#在0到9号玩家中取一个人的概率是11/100
                rand_guy = random.choice(rand_guylist1)
            else:#在10到99号玩家中取一个人的概率是(100-11)/100
                rand_guy = random.choice(rand_guylist2)
            #因此前10位玩家得到钱的概率要微大于后90位玩家,以此模拟10位更努力的玩家
            wealth[rand_guy]=wealth[rand_guy]+1
    #wealth.sort()#为展示前10位玩家财富变化,不进行排序
    return wealth, order
wealth,order=generate()
print(sum(wealth))
#排序
wealth_transi=wealth[:]
wealth_sort=[]
order_rich=[]
wealth_rich=[]
order_normal=[]
wealth_normal=[]
for i in range(100):
    ind_min=wealth_transi.index(min(wealth_transi))
    wealth_sort.append(min(wealth_transi))
    wealth_transi[ind_min]=float('inf')
    if ind_min in [0,1,2,3,4,5,6,7,8,9]:
        order_rich.append(len(wealth_sort)-1)
        wealth_rich.append(wealth_sort[-1])
    else:
        order_normal.append(len(wealth_sort)-1)
        wealth_normal.append(wealth_sort[-1])
print(len(order_rich)==len(wealth_rich),len(order_normal)==len(wealth_normal))
# barchart
import matplotlib.pyplot as plt
#fig1 = plt.figure()
plt.bar( order_rich,wealth_rich,0.4,color="red")
plt.bar( order_normal,wealth_normal,0.4,color="green")
plt.title('Forbes')
plt.xlabel('Order of participants')
plt.ylabel('Fortune')
plt.show()
# histogram
n, bins, patches = plt.hist(wealth, bins=30, normed=0, facecolor='green', alpha=0.75)
plt.xlabel('Fortune')
plt.ylabel('number of participants')
plt.show()

结论及思考

诚然原作者的数据可视化做的非常惊艳,但其中的一些结论仍然值得商榷:

  • 在可负债及不可负债的情况下是更接近幂分布还是正态分布?
  • 富二代会长时间内保持领先优势?

作者有个“发财要趁早,大龄屌丝逆袭更像是一个传说”的结论我更是不敢苟同,水滴石穿的力量总有一天会pay off。计算机模拟毕竟只是模拟,我相信作者会认同其局限性。古往今来多少英雄少年成名(如互联网行业的那些哗众取宠的少年CEO们)却最终不得善终。但反观那些少年不得志的“屌丝”,最终成为影响世界的人物的不止有曾文正公、李文忠公、毛泽东等等。忘记历史就等于背叛。
最后用电影《华尔街》中Lou的一句话与君共勉:

“Stick to the foundametals, goodthings sometimes take time”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值