python数据分析——(一)
程序员文章站
2024-03-17 14:17:37
...
数据来源于数据团学社,探究下成为领导的秘诀是什么?
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 设置图表风格,并且解决seaborn的中文显示问题
sns.set_style('white', {'font.sans-serif':['Microsoft YaHei', 'Arial']})
这里中文字体用的微软雅黑,黑体可用SimHei替换。
data = pd.read_csv('C://Users\\Administrator\\Desktop\\data.csv', encoding = 'gbk', engine = 'python ')
data.head()
# 查看前5条数据
字段较多,就放部分字段的前5条数据了。
data.info()
可以看到部分字段含有空值
print(data.columns.tolist())
data.describe()
# 查看描述性统计
part1_‘性别构成’
data_gender = data['性别']
data_gender_re = data_gender[data_gender.notnull()] # 删除空值
print(data_gender_re.head())
count = len(data_gender_re)
count_m = len(data_gender_re[data_gender_re == '男']) # 统计性别“男”的人数
count_w = len(data_gender_re[data_gender_re == '女']) # 统计性别“女”的人数
rate_m = count_m / count # 计算男性占比
rate_w = count_w / count # 计算女性占比
print('样本量:' + str(count) + '\n',
'男性样本量:' + str(count_m) + '\n',
'女性样本量:' + str(count_w) + '\n',
'男性占比:' + str(rate_m * 100)[:4] + '%' + '\n',
'女性占比:' + str(rate_w * 100)[:4] + '%'
)
领导主要是以男性为主,占97.2%,女性领导只占2.76%。那就看一下女性领导都分布在哪些省份?
# 按省份分析市委书记的女性比例
data_gender2 = data[['省级政区名称','性别']]
data_gender2_re = data_gender2[data_gender2['性别'].notnull()]
print(data_gender2_re.head())
print('-----------')
pt = pd.crosstab(data_gender2_re['省级政区名称'],data_gender2_re['性别'])
print(pt.head())
print('-----------')
pt['女性占比'] = pt['女'] / (pt['女'] + pt['男'])
pt2 = pt.sort_values(by = ['女性占比'], ascending = False)
print(pt2)
可以看到。辽宁省的女性*数最多,陕西省次之。下面做一下可视化,看起来更直观一些
pt2['女性占比百分数'] = pt2['女性占比'] * 100
fig_q1 = plt.figure(figsize = (10,4))
sns.barplot(pt2.index[:10],
pt2['女性占比百分数'][:10],
palette = 'BuPu_r')
plt.title('不同省份女性市委书记占比情况')
plt.xlabel('省份')
plt.ylabel('占比(%)')
sns.despine(bottom = True)
plt.show()
part2_年龄情况
data_age = data[['党委书记姓名','出生年份','年份']]
data_age_re = data_age[data_age['出生年份'].notnull()]
print(data_age_re.head(10))
print(data_age_re['出生年份'].unique())
# 年龄整体分布
df1 = 2017 - data_age_re['出生年份']
print(df1.head())
print('------------')
# 入职年份分布
df2_yearmin = data_age_re[['党委书记姓名','年份']].groupby(data_age_re['党委书记姓名']).min()
df2 = df2_yearmin['年份'].groupby(df2_yearmin['年份']).count()
print(df2)
print('------------')
# 卸任年份分布
df3_yearmax = data_age_re[['党委书记姓名','年份']].groupby(data_age_re['党委书记姓名']).max()
df3 = df3_yearmax['年份'].groupby(df3_yearmax['年份']).count()
print(df3)
print('------------')
密密麻麻看起来麻烦,做下可视化
fig_q2 = plt.figure(figsize = (12,8))
ax1 = fig_q2.add_subplot(2,3,1)
ax2 = fig_q2.add_subplot(2,3,2)
ax3 = fig_q2.add_subplot(2,3,3)
ax1.hist(df1, bins = 10, color = 'gray', edgecolor = 'black', alpha = 0.9)
ax1.set_title('整体年龄分布')
ax1.grid(True, linestyle = '--')
ax2.plot(df2, color = 'r', marker = 'o', alpha = 0.9)
ax2.set_title('入职年份分布')
ax2.set_xticks(range(2000,2011,2))
ax2.grid(True, linestyle = 'dashed')
ax3.plot(df3, color = 'g', marker = 'o', alpha = 0.9)
ax3.set_title('卸任年份分布')
ax3.set_xticks(range(2000,2011,2))
ax3.grid(True, linestyle = 'dashed')
plt.show()
part3_专业情况
data_major = data[['党委书记姓名','年份','专业:人文','专业:社科','专业:理工','专业:农科','专业:医科']]
data_major_re = data_major[data_major['专业:人文'].notnull()]
data_major_re['专业'] = data_major_re[['专业:人文','专业:社科','专业:理工','专业:农科','专业:医科']].idxmax(axis=1)
print(data_major_re.head())
print('----------')
data_major_st = data_major_re[['党委书记姓名','专业']].drop_duplicates() # 去重
print(data_major_st.head())
print('----------')
# 计算专业结构
df4 = data_major_st['专业'].groupby(data_major_st['专业']).count()
print(df4)
print('----------')
# 计算每年的市委书记专业数据
df5 = pd.crosstab(data_major_re['年份'],data_major_re['专业'])
print(df5)
print('----------')
# 计算每年专业大类的分布数据
df5['社科比例'] = df5['专业:社科'] / (df5['专业:人文'] + df5['专业:农科'] + df5['专业:医科'] + df5['专业:理工'] + df5['专业:社科'])
df5['人文比例'] = df5['专业:人文'] / (df5['专业:人文'] + df5['专业:农科'] + df5['专业:医科'] + df5['专业:理工'] + df5['专业:社科'])
df5['理工农医比例'] = (df5['专业:理工'] + df5['专业:农科'] + df5['专业:医科']) / (df5['专业:人文'] + df5['专业:农科'] + df5['专业:医科'] + df5['专业:理工'] + df5['专业:社科'])
print(df5[['社科比例','人文比例','理工农医比例']])
fig_q3 = plt.figure(figsize = (12,8))
ax4 = fig_q2.add_subplot(2,3,1)
ax5 = fig_q2.add_subplot(2,3,2)
ax6 = fig_q2.add_subplot(2,3,3)
ax4.bar(range(len(df4)), df4, color = 'y', tick_label = ['人文','农科','医科','理工','社科'], alpha = 0.9)
ax4.set_title('专业结构')
ax4.grid(True, linestyle = 'dashed')
ax5.plot(df5[['专业:人文','专业:社科','专业:理工','专业:农科','专业:医科']], alpha = 0.9)
ax5.set_title('专业整体情况')
ax5.legend(['人文','农科','医科','理工','社科'], loc = 'best')
ax5.grid(True, linestyle = 'dashed')
ax6.bar(df5.index, df5['社科比例'], color = 'darkred', alpha = 0.7)
ax6.bar(df5.index, df5['人文比例'], bottom = df5['社科比例'], color = 'darkred', alpha = 0.5)
ax6.bar(df5.index, df5['理工农医比例'], bottom = df5['社科比例'] + df5['人文比例'], color = 'darkred', alpha = 0.3)
ax6.set_title('专业大类分布')
ax6.legend(['社科比例','人文比例','理工农医比例'], loc = 'best')
ax6.grid(True, linestyle = 'dashed')
plt.show()
领导的专业以社科、人文为主。看来,报考这两专业大类的人成为领导的机会多一些。
part4_任期情况
# 出生年份和任期的关系
data_term = data[['党委书记姓名','年份','出生年份']]
data_term_re = data_term[data_term['出生年份'].notnull()]
print(data_term_re.head())
print('------------')
# 任期由任职的最大年份-最小年份
# 计算最大年份
year_max = data_term_re[['出生年份','年份']].groupby(data_term_re['党委书记姓名']).max()
year_max.rename(columns = {'年份':'年份max'}, inplace = True) # .rename()更改列名
year_max['姓名'] = year_max.index
#print(year_max.head())
#print('------------')
# 计算最小年份
year_min = data_term_re[['出生年份','年份']].groupby(data_term_re['党委书记姓名']).min()
year_min.rename(columns = {'年份':'年份min'}, inplace = True)
year_min['姓名'] = year_min.index
#print(year_min.head())
#print('------------')
# 合并成一个表
data_term_fin = pd.merge(year_max,year_min)
print(data_term_fin.head())
print(data_term_fin.dtypes)
print('------------')
data_term_fin['任期'] = data_term_fin['年份max'] - data_term_fin['年份min'] + 1
print(data_term_fin.head())
print('------------')
# 更改一下风格设置成‘ticks’,带有刻度的样式
sns.set_style('ticks', {'font.sans-serif':['Mirosoft YaHei','Arial']})
sns.set_context('notebook')
df = pd.crosstab(data_term_fin['任期'],data_term_fin['出生年份'])
fig = plt.figure(figsize = (12,8))
sns.heatmap(df, annot = True, fmt = 'd', linewidths = 0.2, linecolor = 'k')
plt.show()
出生年份范围在[1953,1957]的领导大多都任期3年