Python 数据分析微专业课程--项目实战12 财富分配实验

本文介绍了使用Python进行财富分配模拟的三个模型:不允许借贷、允许借贷及努力型人生。通过模拟得出,允许借贷加剧了贫富差距,而努力型人生的模型显示,付出更多努力的个体更可能成功。模拟结果呈现正态分布,并利用Monte Carlo方法进行分析和预测。
摘要由CSDN通过智能技术生成

1.项目说明

 构建财富分配模型,模拟不允许借贷情况下的财富分配,允许借贷下的财富分配,努力型人生的财富分配

2.项目具体要求

1、财富分配模型
模型假设:
① 每个人初始基金100元
② 从18岁到65岁,每天玩一次,简化运算按照一共玩17000轮
③ 每天拿出一元钱,并且随机分配给另一个人
④ 当某人的财富值降到0元时,他在该轮无需拿出1元钱给别人,但仍然有机会得到别人给出的钱
要求:
① 构建模型模拟(这里需要跑17000轮)
② 绘制柱状图,查看该轮财富情况
③ 查看最后财富分配数据是什么分布?
④ 最富有的人相比于初始财富,翻了多少倍?
⑤ 10%的人掌握着多少的财富?30%的人掌握着多少的财富?又有百分之多少人财富缩水至100元以下了?

2、在允许借贷情况下,研究以下问题
和初始模型的区别:
允许借贷意味着可以找亲友、银行、投资人借贷 → 资产为负时,仍然参与游戏
要求:
① 构建模型模拟,再次模拟财富分配情况
② 绘制柱状图,查看该轮财富情况
③ 游戏次数与财富分布的标准差的情况,绘图来表示
④ 玩家从18岁开始,在经过17年后为35岁,这个期间共进行游戏6200次左右,则此刻查看财富情况,将财富值为负的标记成“破产”,通过图表研究
   该类玩家在今后的游戏中能否成功“逆袭”(财富值从负到正为逆袭)

3、努力的人生会更好吗?
模型假设:
① 每个人初始基金仍为100元
② 一共玩17000轮
③ 每天拿出一元钱,并且随机分配给另一个人
④ 有10个人加倍努力,从而获得了1%的竞争优势
⑤ 允许借贷
要求:
① 构建模型模拟,再次模拟财富分配情况
② 努力的人,最后是否富有?
③ 绘制柱状图,查看该轮财富情况

3.实现思路:

1.首先构建模型的假设,这里有四个假设,根据这四个假设,使用随机数来模拟给钱和得到钱。首先模拟第一轮的财富分配,
然后扩展到多轮的分配,不考虑借贷的情况,使用for循环来进行多轮分配,并绘制柱状图,查看指定轮的财富情况

2.考虑借贷情况下构建模型,这里增加一个假设:当财富为0时可以向他人借贷继续游戏,即允许财富值为负数。通过多轮模拟情况研究一个问题,
即当玩家财富为负之后有多大可能变为正数。这里采用颜色标记的方法,在玩家为35岁时,将财富为负数的玩家标记为红色,然后查看红色标记的变迁情况。

3.这里在允许借贷的情况下再增加一个假设:如果有人的人生更加努力,竞争优势增加1%。在增加这个假设的情况下构建模型来模拟财富分配,
一次来研究努力型的人生是否可以获得更加多的财富

4.实现过程:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import os
import time

import warnings
warnings.filterwarnings('ignore')

start_time = time.time()

#模拟第一轮游戏分配,不考虑财富降到零的情况
person_n = [x for x in range(1,101)] #模拟100人Id
fortune = pd.DataFrame([100 for i in range(100)],index =person_n ) #初始财富状况
fortune.index.name = 'id'  #重命名index
round_r1 = pd.DataFrame({
  'pre_round':fortune[0],'lost':1}) #第一轮每个人拿出一块钱
choice_r1 = pd.Series(np.random.choice(person_n,100)) #100块对100人做随机分配
gain_r1 = pd.DataFrame({
  'gain':choice_r1.value_counts()}) #计算随机分配后的获利情况
round_r1 = round_r1.join(gain_r1) #将支出和获利数据连接
round_r1.fillna(0,inplace = True) #空值填充
fortune[1] = round_r1['pre_round']-round_r1['lost']+round_r1['gain'] #第一轮分配后的财富情况
print(fortune)

#模拟第一轮游戏分配,考虑财富降到零的情况
#过程与不考虑财富到零的情况大致相同
person_n = [x for x in range(1,101)]
fortune1 = pd.DataFrame([100 for i in range(100)],index =person_n )
fortune1.index.name = 'id'
round_r1 = pd.DataFrame({
  'pre_round':fortune1[0],'lost':1})
#判断前一轮分配后是否有人财富为0,若为0,则本次分配不需要支出1元,即支出为0
for i in range(1,101): 
    if round_r1.loc[i,'pre_round'] ==0:
        round_r1.loc[i,'lost']=0 
#计算本轮分配金额分配给100人
choice_r1 = pd.Series(np.random.choice(person_n,round_r1['lost'].sum()))
#计算随机分配后的获利情况
gain_r1 = pd.DataFrame({
  'gain':choice_r1.value_counts()})  
round_r1 = round_r1.join(gain_r1)
round_r1.fillna(0,inplace = True)
#计算本轮分配后的财富情况
fortune1[1] = round_r1['pre_round']-round_r1['lost']+round_r1['gain']
print(fortune)

#① 构建模型模拟(这里需要跑17000轮)'
#创建财富分配模型 ---初始模型
def fortune_game1(r):
    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'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值