population

国家统计局的第六次人口普查(2010年分年龄、性别人口数据)

  • 2010年第六次全国人口普查的对象是:普查标准时点在中华人民共和国境内的自然人以及在中华人民共和国境外但未定居的中国公民,不包括在中华人民共和国境内短期停留的港澳台居民和外籍人员
  • 本资料是按照实际登记直接汇总的数据,不包括人口普查漏登的人口;不包括230万现役军人;不包括465万难以确定常住地的人口

导入依赖包并爬取国家统计局数据

In [1040]:
import urllib
from urllib.request import urlopen
from bs4 import BeautifulSoup
import pandas as pd
from pandas import DataFrame
import matplotlib
import matplotlib.pyplot as plt
from pylab import * 
from matplotlib.font_manager import *
forcn = FontProperties(fname='/jupyterfile/simsun.ttf', size=14)
matplotlib.rcParams['axes.unicode_minus'] = False
url='http://www.stats.gov.cn/tjsj/pcsj/rkpc/6rp/html/A0107a.htm'
headers=('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36')
opener=urllib.request.build_opener()
opener.addheaders=[headers]
html=opener.open(url)
soup=BeautifulSoup(html, 'lxml')
pretdata=soup.prettify()
data=pd.read_html(pretdata)
df=pd.DataFrame(data)
d = df.iloc[0,0]

设定人口统计图表函数

In [1041]:
def popu(a):
    area=d.iloc[a, 0].replace(' ','')
    dmale=d.iloc[a:a+1, [5,8,11,14,17,20,23,26,29,32,35,38,41,44,47,50,53,56,59,62,65,68]]
    dfemale=d.iloc[a:a+1, [6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69]]
    idx = ['1-','1-4','5-9','10-14','15-19','20-24','25-29','30-34','35-39','40-44','45-49','50-54','55-59','60-64','65-69','70-74','75-79','80-84','85-89','90-94','95-99','100+']
    r=[]
    for i in np.arange(len(idx)):
        j = round(float(dmale.iloc[0, i])/float(dfemale.iloc[0, i]),2)
        r.append(j)
    data_bar_m = [-1*float(item) for item in list(dmale.iloc[0])]
    data_bar_f = [float(item) for item in list(dfemale.iloc[0])]
    fig = plt.figure(figsize=(14,6))
    l1=plt.barh(idx,data_bar_m , color='b',alpha=0.5,label='男', edgecolor='white')
    l2=plt.barh(idx,data_bar_f , color='g',alpha=0.5,label='女', edgecolor='white')
    plt.grid(True)
    plt.legend(handles=[l1, l2 ], loc = 2, frameon=False, prop=forcn)
    plt.xlabel('2010 YEAR')
    plt.title('2010 POPULATION'+' '+ area +'\n来源:www.jasper.wang', fontproperties=forcn)
    for i, xy in enumerate(zip(data_bar_m, idx)):
        plt.annotate(r[i], xy=xy, xytext=(-30, -5), textcoords='offset points')    
    plt.show()

全国人口数据

In [1042]:
popu(5)

上海人口数据

In [1043]:
popu(14)