python 分析世界高收入数据集

1、加载库

import os, sys, re
import numpy as np
import pandas  as pd
import matplotlib.pyplot as plt

2、读取数据

path = r'E:\数据集'
data_file = os.path.join(path, "income_dist.csv")
df = pd.read_csv(open(data_file))  # 路径含有中文字符,用 open() 函数
df.info()

 2180行, 354列

3、美国每年的平均收入

# 筛选行,设置年份为索引
df_i = df[df.Country == 'United States'].set_index('Year')

# 筛选列
data = data_1.loc[:, ['Country', 'Average income per tax unit']] 
ind = np.arange(len(data))  # 标识柱体的横轴位置的迭代器
    
# 以面向对象风格的接口绘图
fig = plt.figure(figsize=(22, 8))  # 初始化画布, 创建基准图表
ax = plt.subplot(111)  # 一行一列的绘图方格的坐标轴数组

ax.bar(ind, data.iloc[:, 1], width=0.85)  # 用' Average income per tax unit' 绘制柱状图,每个柱体宽度为 0.35
ax.set_xticks(np.arange(0, len(data), 4))  # 横轴刻度间隔为 4
ax.set_xticklabels(data.index[0::4],
                   fontdict={'size': 14, 'color': 'grey'},
                   rotation=45)  # 横轴刻度标签为间隔为 4 的年份,旋转 45 度
ax.set_ylabel('Income in USD',
              fontdict={'size': 18, 'color': 'yellow'})  # 纵轴标签
plt.title('U.S. Average Income 1913-2008',
          fontdict={'size': 20, 'color': 'yellow'})  # 设置图像标题

plt.yticks(size=14, color='grey')
plt.show()

 4、分析不同群组的美国高收入数据

前 10% 收入份额,前 5% 收入份额,前 1% 收入份额,前 0.5% 收入份,前 0.1% 收入份额

# 用正则筛选预期的列名成
i = df.columns.str.contains('Top (10|5|1|0.5|0.1)%.+share$', regex=True) columns = df.columns[i].tolist() df_i = df[df['Country']=='United States'].set_index('Year') # 筛选行, 设置年份为索引 df_ij = df_i[columns] # 筛选列, fig = plt.figure(figsize=(12, 8)) for col in df_ij: lab = re.search(r'Top .+%', col).group() df_ij[col].dropna().plot(label=lab) plt.yticks(fontproperties='Times New Roman', size=18, color='grey') plt.xticks(fontproperties='Times New Roman', size=18, color='grey') plt.legend(loc='best', fontsize=15) plt.xlim(1900, 2020) plt.ylim(0, 50) plt.xlabel('year', size=18, color='yellow') plt.show()

5、分析不同群组的美国高收入数据进行均值归一化,查看其变化趋势

# 用正则筛选预期的列名成
i = df.columns.str.contains('Top (10|5|1|0.5|0.1)%.+share$', regex=True)
columns = df.columns[i].tolist()

df_i = df[df['Country']=='United States'].set_index('Year')   # 筛选行, 设置年份为索引
df_ij = df_i[columns] # 筛选列,

fig = plt.figure(figsize=(12, 8))

for col in df_ij:
    lab = re.search(r'Top .+%', col).group()
    mean = df_ij[col].mean()  # 列均值
    norm = df_ij[col] / mean  # 均值归一化
    norm.dropna().plot(label=lab)  # 归一化后的的非空值绘图
    
plt.yticks(size=14, color='grey')
plt.xticks(size=14, color='grey')
plt.xlabel('year', size=18, color='yellow')
plt.xlim(1900, 2020)
plt.legend()
plt.show()

6、美国的高收群体不同组的资本收益数据

# 选取包含资本收益和不包含资本收益的收入组
i_1 = df.columns.str.contains('Top (10|5|1|0.5|0.1)%.+share$', regex=True)
i_2 = df.columns.str.contains('Top (10|5|1|0.5|0.1)% in.+capital gains$', regex=True)
cols = zip(df.columns[i_1], df.columns[i_2])
cols = list(cols)

# 筛选行, 设置年份为索引
df_i = df[df['Country']=='United States'].set_index('Year')

fig = plt.figure(figsize=(14, 8))

# 资本收益 = 包含资本收益的收入 - 不包含资本收益的收入
for col_a, col_b in cols:  # cols 是二元元组的列表
    lab = re.search(r'Top .+%', col_a).group()
    capital_gains = df_i[col_a] - df_i[col_b] 
    capital_gains.dropna().plot(label=lab)

# 设置图形参数
plt.yticks(size=14, color='grey')
plt.xticks(size=14, color='grey')
plt.xlabel('year', size=18, color='yellow')
plt.xlim(1900, 2020)
plt.legend()
plt.show()

 

 7、进一步分析美国高收入群体中不同组的平均收入随时间的相对变动

# 筛选行, 设置年份为索引
df_i = df[df['Country']=='United States'].set_index('Year')

i = df_i.columns.str.contains('Top (10|5|1|0.5|0.1)% av.+income$')
cols = df_i.columns[i].tolist()
df_ij = df_i[columns]

plt.rcParams['font.sans-serif'] = 'SimHei'  #  使轴标题正常显示中文
fig = plt.figure(figsize=(14, 12))

# 资本收益 = 包含资本收益的收入 - 不包含资本收益的收入
for col in cols:
    lab = re.search(r'Top .+%', col).group()
    df_ij[col].dropna().plot(label=lab)
    
plt.yticks(range(0, 5000000, 500000), 
           range(0, 500, 50),
           size=14, color='grey')

plt.ylabel('income 单位:万', size=18, color='yellow')
plt.xticks(size=14, color='grey')
plt.xlabel('year', size=18, color='yellow')
plt.title('美国高收入群体不同组的平均收入', size=20, color='yellow')
plt.xlim(1900, 2020)
plt.legend()
plt.grid()
plt.show()

 8、美国最富裕群体的收入组成

%matplotlib inline
# 筛选行, 设置年份为索引
df_i = df[df['Country']=='United States'].set_index('Year')

# 选择期望的列名称
i = df.columns.str.contains('Top 10% income com.+?-[WDIRE]')
cols = df.columns[i].tolist()
cols.pop(3)  # Investment income 不需要

df_ij = df_i[cols] # 对筛选过行的数据框进行列筛选

# 图例标签
labs = ['Salary', 'Dividend', 'Interest', 'Rent', 'Business']

fig = plt.figure(figsize=(12, 8))
ax = plt.gca()

# 为了转换图例标签进行的数据框重命名
df_ = df_ij.rename(dict(zip(cols, labs)), axis=1) 

df_.plot(kind='area', ax=ax)
plt.yticks(size=14, color='grey')
plt.ylabel('收入构成百分比 单位:%', size=18, color='yellow')
plt.xticks(size=14, color='grey')
plt.xlabel('year', size=16, color='yellow')
plt.xlim(1915, 2010)
plt.legend(loc='best', fontsize=16)
plt.title('美国最富裕群体的收入组成', size=18, color='yellow')
plt.grid()
plt.show()

 

 

posted @ 2020-06-02 23:17  赏尔  阅读(607)  评论(1编辑  收藏  举报