python数据分析——(一)

数据来源于数据团学社,探究下成为领导的秘诀是什么?

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年

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值