↑ 关注 星标 ~ 有趣的不像个技术号
每晚九点,我们准时相约
各省市平均工资怎么样?
你每年调薪百分之多少才不低于平均值?
9年时间可以有多大的发展差距?
预测2019年各省市人平均收入应该是多少?
这篇文章告诉你!
今天逛kaggle看到一个数据集[1],其中有一部分是一个叫做income的表格文档。虽然最后的数据是2017年,但也值得研究一下。嗯,拿来捋一捋。
这次分析用到pandas、matplotlib 以及一些分析思路,比较浅显求评论区多指教。
信息概览
拿到一个陌生的文档第一步是先粗略的看一下,用到以下代码
代码语言:javascript复制dtincome=pd.read_excel('income.xls')
print(dtincome.shape)
dtincome.info()
输出结果如下:31行10列;1列地区area,9列年份,没有空值;使用2.5 kB内存
代码语言:javascript复制(31, 10)
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 31 entries, 0 to 30
Data columns (total 10 columns):
area 31 non-null object
2017 31 non-null int64
2016 31 non-null int64
2015 31 non-null int64
2014 31 non-null int64
2013 31 non-null int64
2012 31 non-null int64
2011 31 non-null int64
2010 31 non-null int64
2009 31 non-null int64
dtypes: int64(9), object(1)
memory usage: 2.5 KB
通过head函数查看的本表头部信息如下:按地区、年代展示了收入数据
但这个数据表没有明说这个表是什么,看样子理解是人均年收入?拿北京的搜索验证一下,得到的答案是:北京职工年平均工资。
看上边头部信息那个表,因为索引列是编号,为了方便,我想改为area为索引列,那么需要用函数转化一下:得到图的图如下,修改了哪里可以与上边图对比一下首列(没了01234)。
代码语言:javascript复制dtincome=dtincome.set_index('area')
dtincome.head()
分析部分
上边的数据概览跟索引列设置完了,下边开始一些简单分析
2017年收入排序
我想取出2009,2017年数据,按照2017数据降序排列,然后做柱状图
代码语言:javascript复制x=dtincome[2009].sort_values(ascending=False)
y=dtincome[2017].sort_values(ascending=False)
plt.figure(figsize=(16,9))
total_width, n = 0.8, 2
width = total_width / n
plt.bar(dtincome.index, y, width=2*width,label='2017',color='#334252')
plt.bar(dtincome.index, x, width=width, label='2009', color='#fd5f00')
plt.legend()
plt.ylabel('单位:元')
plt.xlabel('省,直辖市')
plt.xticks(rotation=80, fontsize=14)
plt.savefig('2017降序bar.png')
plt.show()
通过这张图可以看到:北京、上海、西藏、天津人均收入居全国之首,但跟我认知不一样,西藏这么高呀,广东没在前面?
针对西藏再google一下找到一个链接。
http://finance.china.com.cn/news/20191030/5109469.shtml
31省市前三季居民收入榜单:京沪突破5万元 西藏增速第一,看来数据没得问题。
此外下图2009年原本最低的江西、海南等,也不再垫底。
青海贵州也是名列前茅。
极差值
那么2017年最高的北京和最低的河南差多少呢?
代码语言:javascript复制dtincome.max()-dtincome.min()
2017年最高的北京市比最低的河南省差了78997元。往年极差数据如上。
9年净增加额
现在想知道一下两个数据:
1. 每个省市自身9年间增加了多少收入?
2. 如果以2009年为基数,增长率是多少?
代码语言:javascript复制addnum=dtincome[2017]-dtincome[2009] # 增长数字计算
dtincome.insert(0,'addnum',addnum) # 将计算数字加入首列
dtincome.head(10) # 展示头部信息
通过得到的addnum列可以看到9年间收入都是翻了一番的。所以增长率应该是大于1,以北京、河南为例计算:
代码语言:javascript复制add_rate_bj=dtincome.loc['北京市']['addnum']/dtincome.loc['北京市'][2009]
add_rate_hn=dtincome.loc['河南省']['addnum']/dtincome.loc['河南省'][2009]
print(add_rate_hn)
print(add_rate_bj)
1.32
1.05
结果显示,北京九年增长了1.32倍,河南省增长了1.05倍。
但这个衡量指标不够完善,我们知道收入增加都是在往年基础上更进一步的,就像调工资都是以之前工资水准上调,不会一直以入司时候公司为基数,所以想算一下9年的复增长率,这个指标就像存钱的复利。
复利率计算
复利公式 :F=P*(1 i)^n
利率公式:i=(F/P)^1/n-1
在这里p相当于2009年的收入,F相当于2017年收入,n为8年
代码语言:javascript复制i_bj=(pow(dtincome.loc['北京市'][2017]/dtincome.loc['北京市'][2009],1/8)-1)*100
i_hn=(pow(dtincome.loc['河南省'][2017]/dtincome.loc['河南省'][2009],1/8)-1)*100
print('北京市8年复利:%.3f ' % i_bj)
print('北京市8年复利:%.3f ' % i_hn)
计算结果是:北京市8年复利:11.104 ;河南省8年复利:9.367
北京基数大,增长率也高;河南基数小,增长率也小于北京。
也就是过去9年如果你都在上班,工资每年调薪10%才满足正常水平。
复利率全部计算一遍
现在想把所有省市的增长复利率都计算一遍,并加入原表,所以需要写一个函数方便计算,整体代码如下:
代码语言:javascript复制# 先想办法取到area作为列表
province=list(dtincome.index)
# 定义计算函数
def fuli_i(future,now,year):
return (pow(future/now,1/year)-1)*100
# 计算的i存列表
fuli_i_list=[]
for z in province:
future=dtincome.loc[z][2017]
now=dtincome.loc[z][2009]
i=fuli_i(future,now,8)
fuli_i_list.append(i)
# 打印看看
print(fuli_i_list)
通过上边代码跑出数据如下:OK,成功了。
代码语言:javascript复制[11.104060121135761, 10.07405428410808, 10.96948932120323, 10.11699074109298, 10.38839823219011, 9.124444064311987, 11.554847909745991, 10.735531812575317, 9.43918486872537, 10.493957164921696, 10.42016967823416, 10.914307419581725, 11.611272768884827, 12.434260050070067, 11.179048603584052, 9.367185582178106, 12.118485437358494, 11.673351814934364, 10.364474505013742, 11.260148139091243, 13.58105530869107, 11.367474245793607, 12.179151115437591, 13.003995739791186, 13.34245416624098, 11.39070340256878, 10.569453392495465, 11.671400047653036, 10.854454505533129, 9.947441194548222, 11.9848334119395]
既然成功了,那就加入原表首列
代码语言:javascript复制dtincome.insert(0,'fuli_i',fuli_i_list)
dtincome.head(5)
可以看到,最大增加率13%,最小9.12% ,50%分位数是11.1%,也就是50%的人工资增长率在11%以上 。
最后做个图展示一下
可以看到9年下来,海南省增长速度最高,年平均增长13.58%,辽宁最低9.12%。我大中华发展真是太猛了!
最后一点就是,这是工资平均增速,所以,你拖后腿了么......
为了验证是否拖后腿,继续再写一部分
2019平均工资预测
验证思路:用这9年算出的年增长率(fuli_i那列)来测算一下2019年各个省市的平均工资吧,如果出乎意料,请看下方分析。
还是那句话:Show you my code
代码语言:javascript复制# 复利公式:F=P*(1 i)^n 参照这个公式定义函数
def prelook(now,i,year):
return now*((1 i)**year)
# 拿到2019预测值
wage2019=[]
for z in prov:
now=dtincome.loc[z][2017]
i =dtincome.loc[z]['fuli_i']/100 #换算回小数
wage=prelook(now,i,2)
wage2019.append(int(wage)) #与之前的统一格式,取整
# 插入表格
dtincome.insert(0,'2019',wage2019)
# 作图
x=dtincome['2019'].sort_values(ascending=False)
plt.figure(figsize=(16,9))
x.plot(kind='bar')
plt.ylabel('单位:元')
plt.xlabel('省,直辖市')
plt.savefig('2019降序bar.png')
plt.show()
计算结果是预测北京2019年人均收入166638元/年,平均13886元/月;河南5581元/月。
跟下图这个预测稍有差距[2]。
各省市的大家可以自己对照。
分析差异原因有两点:
- 2018-2019两年经济形势不好,所以用前9年增长率保持不变来预测2019年工资会导致偏高。
- 年收入包括奖金、各类补助补贴的合计值,并不是月薪*12这么简单。
- 社会上28定律导致财富不均衡。
- 这个数据集本身准不准并没有验证。
- 工资这事,冷暖自知,比如这图。
解释一大堆就是。。。我拖后腿了,严重的、病入膏肓的。
欢迎关注公众号:SUMER
参考来源:
- ^kaggle数据集https://www.kaggle.com/tduan007/china-marriage-and-divorce-data#income.xls
- https://www.xinchou.com/AverageWage/110000/2019