[python爬蟲]爬取人口普查數據分析雲南性別歧視/教育問題


之所以做這個東西是因為在NGA上看到了張桂梅校長相關的討論,有些網友以“張校長用國家的錢建女校,是否有違性別公平“”身邊讀過書的女孩子數量遠多於男孩子“等理由抨擊張校長,本着沒有調查就沒有發言權的原則,我爬取了2010年(為什么不選2020年的原因是想調查更早之前雲南省的情況),並做了些數據可視化。先放上結論:女性的受教育人口遠低於男性,建女校的錢沒白花,而且還需加大投入。

數據來源:http://www.stats.gov.cn/tjsj/pcsj/rkpc/6rp/indexch.htm

 

 

 

首先是爬蟲部分:

 1 import json
 2 import requests
 3 from requests.exceptions import RequestException
 4 import re
 5 import time
 6 
 7 def get_one_page(url):
 8     try:
 9         headers = {
10             'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36'
11         }
12         response = requests.get(url, headers=headers)
13         if response.status_code == 200:
14             return response.content.decode('ANSI')
15         return None
16     except RequestException:
17         return None
18 
19 url = 'http://www.stats.gov.cn/tjsj/pcsj/rkpc/6rp/left.htm'
20 
21 html = get_one_page(url)

 

 

 

這里把url改成http://www.stats.gov.cn/tjsj/pcsj/rkpc/6rp/left.htm,獲取左側索引欄

下載數據:

 1 from bs4 import BeautifulSoup
 2 
 3 soup = BeautifulSoup(html,'lxml')
 4 
 5 soup.prettify()
 6 data_name_list = []
 7 data_xls_list = []
 8 pre_url = 'http://www.stats.gov.cn/tjsj/pcsj/rkpc/6rp/'
 9 for ul in soup.find_all('ul'):
10     for li in ul.find_all(name='li'):
11         a = li.a
12         #數據格式為xls,去掉其他的
13         if a != None and a.attrs['href'][-1] != 'm':
14             data_name_list.append(li.get_text())
15             data_xls_list.append(pre_url + a.attrs['href'])
16 
17 import urllib
18 import os
19 path = 'C:\\Users\\00\\Desktop\\census_data\\'
20 i = 0
21 for url in data_xls_list:
22     print(url)
23     filename = os.path.join(path, data_name_list[i] + '.xls')
24     urllib.request.urlretrieve(url, filename)
25     i += 1

爬下來的數據如圖所示:

 

 

 

 用pandas讀取后有一些無用的行,刪除之:

 

 1 import pandas as pd
 2 path = 'C:\\Users\\00\\Desktop\\census_data\\'
 3 xls_path = path + '1-1  各地區戶數、人口數和性別比.xls'
 4 df=pd.read_excel(xls_path,sheet_name=0,header=None)
 5 
 6 for i in range(7):
 7     df = df.drop(i,axis=0)
 8 df = df.reset_index()
 9 
10 del df['index']
11 
12 df

 

 列命名:

1 new_col = ['地區','戶數合計','家庭戶合計','集體戶合計','人口總數',
2            '男性總數','女性總數','性別比','家庭戶人口數','家庭戶男性總數',
3           '家庭戶女性總數','家庭戶性別比','集體戶人口數','集體戶男性總數',
4           '集體戶女性總數','集體戶性別比','平均戶規模']
5 df.columns = new_col
6 
7 df.info()

 

 全國人口性別比可視化:

 1 import matplotlib.pyplot as plt
 2 %matplotlib inline
 3 
 4 df1 = df
 5 df1 = df1.drop(0,axis=0)
 6 df1
 7 
 8 import seaborn as sns
 9 import numpy as np
10 bar_width = 0.4
11 plt.rcParams['font.sans-serif']=['SimHei']
12 plt.rcParams['axes.unicode_minus']=False
13 plt.bar(np.arange(len(df1))-0.2,df1['男性總數'],width=0.4,label='男性總數')
14 plt.bar(np.arange(len(df1))+bar_width-0.2,df1['女性總數'],width=0.4,label='女性總數')
15 plt.xticks(np.arange(len(df1)),df1['地區'])
16 fig = plt.gcf()
17 fig.set_size_inches(20, 10)
18 plt.title('全國人口性別比',fontdict = {'fontsize' : 30})
19 plt.tick_params(labelsize=10)
20 plt.tight_layout()
21 plt.legend()

 

 后面全是數據可視化處理了

 

df1 = df1.sort_values(by=['性別比'],ascending=True,axis=0)

df1 = df1.reset_index()
df1 = df1.drop('index',axis=1)

plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.bar(np.arange(len(df1)),df1['性別比']/100,label='性別比')
plt.ylim(1, 1.1)
plt.xticks(np.arange(len(df1)),df1['地區'])
fig = plt.gcf()
fig.set_size_inches(20, 10)
plt.title('全國人口性別比',fontdict = {'fontsize' : 30})
plt.tight_layout()
plt.legend()
全國人口性別比

 

 

 雲南性別失衡還挺嚴重的,不過性別失衡似乎與經濟關系不大,廣東、北京、上海、江蘇等經濟發達地區的性別失衡狀態差距挺大的

bar_width = 0.4
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.bar(np.arange(len(df1))-0.2,df1['家庭戶性別比']/100,width=0.4,label='家庭戶性別比')
plt.bar(np.arange(len(df1))+bar_width-0.2,df1['集體戶性別比']/100,width=0.4,label='集體戶性別比')
plt.xticks(np.arange(len(df1)),df1['地區'])
plt.ylim(0.9, 2)
fig = plt.gcf()
fig.set_size_inches(20, 10)
plt.plot([-1,len(df1)],[1,1])
plt.title('全國人口性別比(家庭戶/集體戶)',fontdict = {'fontsize' : 30})
plt.tight_layout()
plt.legend()
全國人口性別比(家庭戶/集體戶)

 

 

 

集體戶主要反映外來人口情況,看來男性更傾向於出省打工?

import pandas as pd

xls_path = path + '1-7  各地區分年齡、性別的人口.xls'
df1=pd.read_excel(xls_path,sheet_name=0,header=None)

for i in range(5):
    df1 = df1.drop(i,axis=0)

df1 = df1.reset_index()

df1 = df1.drop('index',axis=1)

new_col = ['地區','人口總數','男性總數','女性總數','0歲人口總數','0歲男性總數','0歲女性總數']
for i in range(1):
    new_col.append(str(i*4+1) + '-' + str(i*4+4) + '歲人口總數')
    new_col.append(str(i*4+1) + '-' + str(i*4+4) + '歲男性總數')
    new_col.append(str(i*4+1) + '-' + str(i*4+4) + '歲女性總數')
for i in range(1,20):
    new_col.append(str(i*5) + '-' + str(i*5+4) + '歲人口總數')
    new_col.append(str(i*5) + '-' + str(i*5+4) + '歲男性總數')
    new_col.append(str(i*5) + '-' + str(i*5+4) + '歲女性總數')
new_col.append('100歲以上人口總數')
new_col.append('100歲以上男性人口總數')
new_col.append('100歲以上女性人口總數')
df1.columns = new_col

xticks = ['0歲']
for i in range(1):
    xticks.append(str(i*4+1) + '-' + str(i*4+4) + '')
for i in range(1,20):
    xticks.append(str(i*5) + '-' + str(i*5+4) + '')
xticks.append('100歲以上')

xinbiebi = []
for i in range(22):
    xinbiebi.append(df1.iloc[0,i*3+5]/df1.iloc[0,i*3+6])
yunnanxinbiebi = []
for i in range(22):
    yunnanxinbiebi.append(df1.iloc[25,i*3+5]/df1.iloc[25,i*3+6])

plt.plot(xticks, xinbiebi,label='全國人口性別比')
plt.plot(xticks, yunnanxinbiebi,label='雲南人口性別比')
fig = plt.gcf()
fig.set_size_inches(20, 10)
plt.tight_layout()
plt.title('人口性別比',fontdict = {'fontsize' : 30})
plt.tick_params(labelsize=15)
plt.plot([-1,len(xticks)],[1,1])
plt.legend()
性別比(分年齡)

 

 

 據說女性壽命比男性長4年左右,並且戰爭時代男性死亡數應該比女性多,所以老齡人口女性比較多;建國之后男性人口數就開始反超並拉開差距了

xls_path = path + '1-8  各地區分性別、受教育程度的6歲及以上人口.xls'
df2 = pd.read_excel(xls_path,sheet_name=0,header=None)
for i in range(5):
    df2 = df2.drop(i,axis=0)
df2 = df2.reset_index()
df2 = df2.drop('index',axis=1)

new_col = ['地區','6歲以上人口總數','6歲以上男性總數','6歲以上女性總數',
           '未上過學人口總數','未上過學男性總數','未上過學女性總數',
           '小學人口總數','小學男性總數','小學女性總數',
           '初中人口總數','初中男性總數','初中女性總數',
           '高中人口總數','高中男性總數','高中女性總數',
           '專科人口總數','專科男性總數','專科女性總數',
           '本科人口總數','本科男性總數','本科女性總數',
           '研究生人口總數','研究生男性總數','研究生女性總數',]
df2.columns = new_col

xticks = ['未上過學','小學','初中','高中','專科','本科','研究生',]

xinbiebi = []
for i in range(len(xticks)):
    xinbiebi.append(df2.iloc[0,i*3+5]/df2.iloc[0,i*3+6])
yunnanxinbiebi = []
for i in range(len(xticks)):
    yunnanxinbiebi.append(df2.iloc[25,i*3+5]/df2.iloc[25,i*3+6])
    
bar_width = 0.4
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.bar(np.arange(len(xinbiebi))-0.2,xinbiebi,width=0.4,label='全國教育人口性別比')
plt.bar(np.arange(len(xinbiebi))+bar_width-0.2,yunnanxinbiebi,width=0.4,label='雲南教育人口性別比')
plt.xticks(np.arange(len(xticks)),xticks)
fig = plt.gcf()
plt.title('全國教育人口性別比(以女性為基數)',fontdict = {'fontsize' : 30})
plt.plot([-1,len(xinbiebi)],[1,1])
fig.set_size_inches(20, 10)
plt.tick_params(labelsize=25)
plt.tight_layout()
plt.legend()
全國教育人口性別比(以女性為基數)

很明顯男性受教育人口遠超女性,身邊統計學可以休矣!但這是不是由於男性人口較多導致的還需再驗證

 1 xticks = ['未上過學','小學','初中','高中','專科','本科','研究生',]
 2 
 3 xinbiebi = []
 4 for i in range(len(xticks)):
 5     xinbiebi.append(df2.iloc[25,i*3+5])
 6 yunnanxinbiebi = []
 7 for i in range(len(xticks)):
 8     yunnanxinbiebi.append(df2.iloc[25,i*3+6])
 9     
10 bar_width = 0.4
11 plt.rcParams['font.sans-serif']=['SimHei']
12 plt.rcParams['axes.unicode_minus']=False
13 plt.bar(np.arange(len(xinbiebi))-0.2,xinbiebi,width=0.4,label='')
14 plt.bar(np.arange(len(xinbiebi))+bar_width-0.2,yunnanxinbiebi,width=0.4,label='')
15 plt.xticks(np.arange(len(xticks)),xticks)
16 fig = plt.gcf()
17 plt.title('雲南教育人口(分性別)',fontdict = {'fontsize' : 30})
18 plt.plot([-1,len(xinbiebi)],[1,1])
19 fig.set_size_inches(20, 10)
20 plt.tick_params(labelsize=25)
21 plt.tight_layout()
22 plt.legend()
雲南受教育人口(分性別)

 

 

 想要婦女撐起半邊天,還得先從娃娃的教育抓起啊~未受過教育人口女性是男性的兩倍,經濟實力又與受教育程度、家庭地位相掛鈎,所以加大教育投入勢在必行~

xticks = ['未上過學','小學','初中','高中','專科','本科','研究生',]

xinbiebi = []
for i in range(len(xticks)):
    xinbiebi.append(df2.iloc[0,i*3+5])
yunnanxinbiebi = []
for i in range(len(xticks)):
    yunnanxinbiebi.append(df2.iloc[0,i*3+6])
    
bar_width = 0.4
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.bar(np.arange(len(xinbiebi))-0.2,xinbiebi,width=0.4,label='')
plt.bar(np.arange(len(xinbiebi))+bar_width-0.2,yunnanxinbiebi,width=0.4,label='')
plt.xticks(np.arange(len(xticks)),xticks)
fig = plt.gcf()
plt.title('全國教育人口(分性別)',fontdict = {'fontsize' : 30})
plt.plot([-1,len(xinbiebi)],[1,1])
fig.set_size_inches(20, 10)
plt.tick_params(labelsize=25)
plt.tight_layout()
plt.legend()
全國受教育人口(分性別)

 

 

 全國情況稍微好一點點,也僅限於義務教育范圍內了

xticks = ['未上過學','小學','初中','高中','專科','本科','研究生',]
men = []
for i in range(len(xticks)):
    men.append(df2.iloc[0,i*3+5]*100/(df2.iloc[0,i*3+5]+df2.iloc[0,i*3+6]))
women = []
for i in range(len(xticks)):
    women.append(df2.iloc[0,i*3+6]*100/(df2.iloc[0,i*3+5]+df2.iloc[0,i*3+6]))

yunnan_men = []
for i in range(len(xticks)):
    yunnan_men.append(df2.iloc[25,i*3+5]*100/(df2.iloc[25,i*3+5]+df2.iloc[25,i*3+6]))
yunnan_women = []
for i in range(len(xticks)):
    yunnan_women.append(df2.iloc[25,i*3+6]*100/(df2.iloc[25,i*3+5]+df2.iloc[25,i*3+6])) 
    
bar_width = 0.4

plt.bar(np.arange(len(xticks)),men,width=0.4,label='全國男')
plt.bar(np.arange(len(xticks)),women,bottom=men,width=0.4,label='全國女')
# plt.bar(np.arange(len(xticks)+0.4),yunnan_men,width=0.4,label='雲南男')
# plt.bar(np.arange(len(xticks)+0.4),yunnan_women,bottom=yunnan_men,width=0.4,label='雲南女')
fig = plt.gcf()
plt.title('全國教育人口(分性別)',fontdict = {'fontsize' : 30})
plt.plot([-1,len(xticks)],[50,50])
plt.xticks(np.arange(len(xticks)),xticks)
fig.set_size_inches(20, 10)
plt.tick_params(labelsize=25)
plt.tight_layout()
plt.show()
全國教育人口分性別對比

 

 

 

xticks = ['未上過學','小學','初中','高中','專科','本科','研究生',]
men = []
for i in range(len(xticks)):
    men.append(df2.iloc[0,i*3+5]*100/(df2.iloc[0,i*3+5]+df2.iloc[0,i*3+6]))
women = []
for i in range(len(xticks)):
    women.append(df2.iloc[0,i*3+6]*100/(df2.iloc[0,i*3+5]+df2.iloc[0,i*3+6]))

yunnan_men = []
for i in range(len(xticks)):
    yunnan_men.append(df2.iloc[25,i*3+5]*100/(df2.iloc[25,i*3+5]+df2.iloc[25,i*3+6]))
yunnan_women = []
for i in range(len(xticks)):
    yunnan_women.append(df2.iloc[25,i*3+6]*100/(df2.iloc[25,i*3+5]+df2.iloc[25,i*3+6])) 
    
bar_width = 0.4

# plt.bar(np.arange(len(xticks)),men,width=0.4,label='全國男')
# plt.bar(np.arange(len(xticks)),women,bottom=men,width=0.4,label='全國女')
plt.bar(np.arange(len(xticks)),yunnan_men,width=0.4,label='雲南男')
plt.bar(np.arange(len(xticks)),yunnan_women,bottom=yunnan_men,width=0.4,label='雲南女')
fig = plt.gcf()
plt.title('雲南教育人口(分性別)',fontdict = {'fontsize' : 30})
plt.plot([-1,len(xticks)],[50,50])
plt.xticks(np.arange(len(xticks)),xticks)
fig.set_size_inches(20, 10)
plt.tick_params(labelsize=25)
plt.tight_layout()
plt.show()
雲南受教育人口分性別對比

 

 

 

xls_path = path + '1-9  各地區分性別的15歲及以上文盲人口.xls'
df3 = pd.read_excel(xls_path,sheet_name=0,header=None)
for i in range(6):
    df3 = df3.drop(i,axis=0)
df3 = df3.reset_index()
df3 = df3.drop('index',axis=1)

new_col = ['地區','15歲以上人口總數','15歲以上男性總數','15歲以上女性總數',
           '文盲人口總數','文盲男性總數','文盲女性總數',
           '文盲人口占15歲及以上人口比重','男性文盲人口占15歲及以上人口比重','女性文盲人口占15歲及以上人口比重',]
df3.columns = new_col

bar_width = 0.4
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.bar(np.arange(len(df3))-0.2,df3['男性文盲人口占15歲及以上人口比重'],width=0.4,label='男性文盲人口占15歲及以上人口比重')
plt.bar(np.arange(len(df3))+bar_width-0.2,df3['女性文盲人口占15歲及以上人口比重'],width=0.4,label='女性文盲人口占15歲及以上人口比重')
plt.xticks(np.arange(len(df3)),df3['地區'])
fig = plt.gcf()
fig.set_size_inches(20, 10)
plt.title('全國人口文盲人口占15歲及以上人口比重性別對比',fontdict = {'fontsize' : 30})
plt.tick_params(labelsize=10)
plt.tight_layout()
plt.legend()
全國人口文盲人口占15歲及以上人口比重性別對比

 1 bar_width = 0.4
 2 plt.rcParams['font.sans-serif']=['SimHei']
 3 plt.rcParams['axes.unicode_minus']=False
 4 plt.bar(np.arange(len(df3))-0.2,df3['文盲男性總數'],width=0.4,label='文盲男性總數')
 5 plt.bar(np.arange(len(df3))+bar_width-0.2,df3['文盲女性總數'],width=0.4,label='文盲女性總數')
 6 plt.xticks(np.arange(len(df3)),df3['地區'])
 7 fig = plt.gcf()
 8 fig.set_size_inches(20, 10)
 9 plt.title('全國人口文盲人口性別對比',fontdict = {'fontsize' : 30})
10 plt.tick_params(labelsize=10)
11 plt.tight_layout()
12 plt.legend()
全國文盲人口性別比

 

 

 

 

 沒想到文盲人口幾乎每個省份女性都是男性的兩倍以上...

 1 xls_path = path + '1-12  各地區分性別、月份的出生人口(2009.11.1-2010.10.31).xls'
 2 df4 = pd.read_excel(xls_path,sheet_name=0,header=None)
 3 for i in range(5):
 4     df4 = df4.drop(i,axis=0)
 5 df4 = df4.reset_index()
 6 df4 = df4.drop('index',axis=1)
 7 
 8 new_col = ['地區','出生人口總數','出生男性總數','出生女性總數',]
 9 year = 2009
10 month = 11
11 for i in range(12):
12     if month > 12 :
13         year += 1
14         month = 1
15     date = str(year) + '' + str(month) + ''
16     new_col.append(date + '出生人口總數')
17     new_col.append(date + '出生男性人口總數')
18     new_col.append(date + '出生女性人口總數')
19     month += 1
20 df4.columns = new_col
21 df4.info()
22 
23 xticks = []
24 year = 2009
25 month = 11
26 for i in range(12):
27     if month > 12 :
28         year += 1
29         month = 1
30     date = str(year) + '' + str(month) + ''
31     xticks.append(date)
32     month += 1
33 men = []
34 for i in range(12):
35     men.append(df4.iloc[0,5+i*3])
36 women = []
37 for i in range(12):
38     women.append(df4.iloc[0,6+i*3])
39 plt.plot(xticks, men,label='男性')
40 plt.plot(xticks, women,label='女性')
41 fig = plt.gcf()
42 fig.set_size_inches(20, 10)
43 plt.tight_layout()
44 plt.title('2009.11.1-2010.10.31全國人口出生趨勢',fontdict = {'fontsize' : 30})
45 plt.tick_params(labelsize=15)
46 plt.legend()
2009.11.1-2010.10.31全國人口出生趨勢

 

 

 

xticks = []
year = 2009
month = 11
for i in range(12):
    if month > 12 :
        year += 1
        month = 1
    date = str(year) + '' + str(month) + ''
    xticks.append(date)
    month += 1
xinbiebi = []
for i in range(12):
    xinbiebi.append(df4.iloc[0,5+i*3]/df4.iloc[0,6+i*3])
yunnan_xinbiebi = []
for i in range(12):
    yunnan_xinbiebi.append(df4.iloc[25,5+i*3]/df4.iloc[25,6+i*3])
plt.plot(xticks, yunnan_xinbiebi,label='雲南男性/女性出生人口比')
plt.plot(xticks, xinbiebi,label='全國男性/女性出生人口比')
fig = plt.gcf()
fig.set_size_inches(20, 10)
plt.tight_layout()
plt.title('2009.11.1-2010.10.31全國/雲南男性/女性出生人口比',fontdict = {'fontsize' : 30})
plt.tick_params(labelsize=15)
plt.legend()
2009.11.1-2010.10.31全國/雲南男性/女性出生人口比

 

 

 

xticks = []
year = 2009
month = 11
for i in range(12):
    if month > 12 :
        year += 1
        month = 1
    date = str(year) + '' + str(month) + ''
    xticks.append(date)
    month += 1
men = []
for i in range(12):
    men.append(df4.iloc[25,5+i*3])
women = []
for i in range(12):
    women.append(df4.iloc[25,6+i*3])
plt.plot(xticks, men,label='男性')
plt.plot(xticks, women,label='女性')
fig = plt.gcf()
fig.set_size_inches(20, 10)
plt.tight_layout()
plt.title('2009.11.1-2010.10.31雲南人口出生趨勢',fontdict = {'fontsize' : 30})
plt.tick_params(labelsize=15)
plt.legend()
2009.11.1-2010.10.31雲南人口出生趨勢

 

 

 

 

 

 聯想到背后的選擇性生育/墮胎問題,令人不寒而栗...

結論:對女性給予一定的教育補貼是沒錯的,甚至還得加大力度;什么時候女性的受教育水平起來了,女性的地位才能真正提高,而不是現在某些極端團體打打拳放放嘴炮就能解決的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM