以下数据基于统计局发布的2010年第六次人口普查工作,所有数据均可在统计局网址上下载。
这张图片给读者的第一直观感受就是集体户口男女性别比差距如此之大。(超过100就是男比女多)所谓集体户口,一般都是一些规模较大的学校或企业才有资格办理。可以推测,在我国凡是这种拥有相对封闭环境的大单位男女比例都严重失衡。
绘制图1的代码如下:
import pandas as pd
from matplotlib import pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
data = pd.read_csv('A0101a.csv',encoding='gbk')
frame = [data['地区'], data['性别比'], data['家庭户口性别比'], data['集体户口性别比']]
sex_compare = pd.concat(frame,axis=1)
sex_compare.set_index('地区', inplace=True)
sex_compare.sort_values('性别比', ascending=False,inplace=True)
sex_compare.plot(kind='bar')
plt.show()
图1并不能很直观的展示我国各省男女性别比的情况,图2使用热力图的方式很直观得表达了该信息。颜色越深代表性别比例越失衡。从图2可以发现,我国东北华北地区男女比例比较合理,而西北和西南最为严重。结合图1可知,中国男女比例最失衡的地方在天津,最平衡的地方在江苏。
图2代码如下:
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
from matplotlib.patches import Polygon
from matplotlib.colors import rgb2hex
import numpy as np
import pandas as pd
plt.figure(figsize=(16, 8))
map = Basemap(llcrnrlon=77,llcrnrlat=14,urcrnrlon=140,urcrnrlat=51,projection='lcc',lat_1=33,lat_2=45,lon_0=100)
map.drawcountries(linewidth=1.5)
map.drawcoastlines()
map.readshapefile('gadm36_CHN_1', 'states', drawbounds=True) #读取省份边界数据
df = pd.read_csv('sex_compare.csv', encoding='gbk') #读取GDP数据
df.set_index('地区', inplace=True) #将列名为地区这一列设为索引
provinces = map.states_info #读取省份信息
print(provinces)
statenames = []
colors = {}
cmap = plt.cm.YlOrRd #指定色彩映射种类
GDP_max = max(df['2010年'])
GDP_min = min(df['2010年'])
for each_province in provinces: #for循环中是对shapefile格式数据的处理,与主要程序逻辑无关
province_name = each_province['NL_NAME_1']
p = province_name.split('|')
if len(p) > 1:
s = p[1]
else:
s = p[0]
s = s[:2]
if s == '黑龍':
s = '黑龙江'
if s == '内蒙':
s = '内蒙古'
statenames.append(s)
GDP = df['2010年'][s]
colors[s] = cmap(np.sqrt((GDP - GDP_min) / (GDP_max - GDP_min)))[:3] #构建色彩和数据的映射关系
ax = plt.gca()
for nshape, seg in enumerate(map.states):
color = rgb2hex(colors[statenames[nshape]]) #将RGB色彩转为HEX色彩
poly = Polygon(seg, facecolor=color, edgecolor=color) #将每个省份对应的颜色进行填充
ax.add_patch(poly)
map.readshapefile('gadm36_TWN_0', 'states', drawbounds=True)
for nshape, seg in enumerate(map.states):
color = rgb2hex(colors[statenames[nshape]]) #将RGB色彩转为HEX色彩
poly = Polygon(seg, facecolor=color, edgecolor=color) #将每个省份对应的颜色进行填充
ax.add_patch(poly)
ax.set_title('China SEX heatmap')
plt.savefig('image_name', bbox_inches='tight')
plt.show()
图3反映的是中国的人口年龄结构。从图中可以发现2010年中国的人口结构有三个高峰,分别是20岁、40岁以及55岁。
图3代码如下:
import pandas as pd
from matplotlib import pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
data = pd.read_csv('A0301a.csv',encoding='gbk')
frame = [data['年龄'], data['人口合计'], data['男'], data['女']]
sex_compare = pd.concat(frame,axis=1)
sex_compare.columns.name = '人口数量'
sex_compare.drop([0],inplace=True)
sex_compare.set_index('年龄', inplace=True)
#sex_compare.sort_values('人口合计', ascending=False,inplace=True)
print(sex_compare)
sex_compare.plot(kind='bar')
plt.show()
图4算是对图3数据的进一步挖掘,表现了各年龄节点男女数量差异。规律很奇怪,在0-24这个区间内,男多女少,而且呈现差距缩减趋势,到了24岁,居然女生还比男生多一些。成年后,18-20这个区间男女差距最大,在18岁这个节点,男女数量之差达到75万。在22-30这个适婚年龄阶段,男女数量总差异在一百万左右,男多女少,也就是说,这个年龄段至少有一百万男光棍。
如果再考虑这个阶段的女生会考虑找30+的黄金单身汉,以及女生基本不考虑比自己小的男生,一百万这个数字绝对还要扩大N倍。
另外一个有趣的结论是,70岁往后女生的数量普遍多于男性,而且多的还不是一点。这与男性寿命普遍低于女性有关。因此70岁之后男性容易达到人生巅峰(哈哈哈哈,22-30的光棍不用伤心,能熬到70岁绝对可以脱单。)
图4代码如下:
import pandas as pd
from matplotlib import pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
data = pd.read_csv('A0301a.csv',encoding='gbk')
gap = data['男'] - data['女']
frame = [data['年龄'], gap]
gap_compare = pd.concat(frame,axis=1)
gap_compare.drop([0],inplace=True)
gap_compare.set_index('年龄', inplace=True)
gap_compare.columns = ['人口数量差距']
gap_compare.plot(kind='bar')
print(gap_compare)
plt.show()
图5展示各年龄节点的死亡数量。我国2010年死亡742万人,其中男生429万,女生313万,也就是说该年男生比女生多死了一百万多点。死亡数量基本随着年龄递增,在75-79区间内达到顶峰,这也是由于更高年龄人数量比较少导致的。
图5代码如下所示:
import pandas as pd
from matplotlib import pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
data = pd.read_csv('death1.csv',encoding='gbk')
data.set_index('年龄段',inplace=True)
data.plot(kind='bar')
plt.show()
图6算是对图5的归一化,消除了各年龄段数量不一的干扰,直观得体现各年龄段的死亡率,基本是依次提高的。
图6代码如下:
import pandas as pd
from matplotlib import pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
data1 = pd.read_csv('death1.csv',encoding='gbk')
data2 = pd.read_csv('population.csv',encoding='gbk')
frame = [data1['年龄段'],data1['死亡合计']/data2['合计'], data1['死亡男']/data2['男'], data1['死亡女']/data2['女']]
death = pd.concat(frame,axis=1)
death.set_index('年龄段',inplace=True)
death.columns = ['死亡率合计','男死亡率','女死亡率']
death.plot(kind='bar')
plt.show()
图7表现了各省的死亡率。图7不够直观。下面画个热力图,与图2的套路一样,不再展示图8的代码,换个文件就行。
图7代码如下:
import pandas as pd
from matplotlib import pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
data1 = pd.read_csv('death2.csv',encoding='gbk')
data2 = pd.read_csv('A0101a.csv',encoding='gbk')
frame = [data1['地区'],data1['合计']/data2['合计'], data1['男']/data2['男'], data1['女']/data2['女']]
death = pd.concat(frame,axis=1)
death.drop([0],inplace=True)
death.set_index('地区',inplace=True)
death.sort_values('合计', ascending=False,inplace=True)
death.plot(kind='bar')
plt.show()
从这张图可以看出,华北西南地区死亡率较高,但是华北地区的北京、天津出淤泥而不染,死亡率相当低,尤其是北京,是全国死亡率最低的地方。看来尽管北京的雾霾严重,但是其较好的医疗环境以及完善的居住配套设置还是提高了首都的生存率。
图9表现的是我国截止2010年人口受教育情况。可以发现我国的高中以下包括高中教育普及工作不错,但是高等教育仍然有很大发展空间。我国截止到2010年培养的研究生现存413万,数量虽然不少但是相比于我国庞大的人口基数还是不多,而且这个数量是40年高等教育发展积累的人数。
图9代码如下:
import pandas as pd
from matplotlib import pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
data = pd.read_csv('education.csv', encoding='gbk')
data.set_index('受教育程度',inplace=True)
data.plot(kind='bar')
plt.show()
图10反映了我国各行各业中婚姻现状比例情况。人数选自16岁以上,目前正在工作的群体,总人数七千多万。也就是说在2010年,全国总人数13亿3千多万人中,去掉年龄不合适的,选入该职业分类的只有七千多万。
因为都是正在工作的壮年,所以无论男女,已婚比例都很高。
但是也可以发现一些有趣的现象。比如,在专业技术人员分类中,女性单身人数居然高于男生。除了商业服务类男女单身人数相等外,其他大类中都是男性人数高于女性。另外,单身女生数量比较多专业技术人员分类中,女性已婚人数同样高于男性。
该图以婚姻状况为横坐标,反映了同一婚姻状况下不同工作的比例。
可以发现一些信息。在政府工作的已婚男最多,稳定啊。相反在女性中不是这样,在政府工作的女性已婚比例竟然最低!最多的是从事一些农业、渔业等行业的基础生产人员,并且服务业的女性已婚比例也相当高,不过,服务业女性的离婚率也是最高的。
还有一点比较突出的是,从事农、牧、渔等生产行业,比较容易丧偶。
先简单的分析到这里,这是最简单的EDA(探索性数据分析)。通过EDA发现大致规律后就需要深层次的数据挖掘探究可能的影响因子,找到因果关系。