- 选题背景
近年来,我国人口总量惯性增长,人口增速有所放缓。与之前相比,人口老龄化加速,人口数量红利进入尾声。当前我国人口的特征是高龄少子,适龄人口生育意愿显著下降,人口老龄化严重。众所周知人口是影响国家经济发展的重要因素,因此对于我国人口形势发生严峻的变化,我们要开始正视这个情况。为此,本作品通过对我国近十年的人口比率进行可视化分析,可以更清楚、更直观地了解到我国近十年的人口增长形势。
- 大数据分析设计方案
数据集包括了近十年的我国的人口出生率、人口死亡率、人口自然增长率的信息。采用了分布分析和对比分析,统计分析,正态性分析等数据特征分析来诠释中国近十年人口的增长比率。本次方案显示采用爬虫的方案,爬取出中国近十年的人口比率,然后应用可视化分析的方法展示,能够让大家更明朗的认识到我国的人口形势。
- 数据分析步骤
1、数据源
本次报告的数据集是通过采集来完成的,使用用百度搜索国家统计局官网https://data.stats.gov.cn/easyquery.htm?cn=C01&zb=A0302&sj=2021
首先访问网址,进入国家数据统计局官网页面搜索国家人口比率,搜索范围为年度报告并勾选近十年的数据,得到近十年我国人口比率的报表并下载报表后生成excel表格。运用python中的requests、pandas、BeautifulSoup等库获取将近三百条左右的数据信息,存储于.xlsx文件中。
2、数据清洗
由于此次方案是应用爬虫爬取的方式从而获得的数据,所以没有出现重复、缺失值、异常值等。所以仅用了 plt.rcParams['font.sans-serif']=['SimHei'](为图表的中文文本设置默认字体,以避免中文显示乱码问题);plt.rcParams['axes.unicode_minus'] = False(解决坐标值为复数时无法显示负号的问题)进行数据清理。
- 大数据分析过程及采用的算法
本次报告采用了推排序算法。算法步骤:创建一个堆H[0..n-1]把堆首(最大值)和堆尾互换把堆的尺寸缩小 1,并调用 shift_down(0), 目的是把新的数组顶端数据调整到相应位置重复步骤2,直到堆的尺寸为1。
4、数据可视化
首先用月份作为x轴增长率作为y轴用一个折线图展示出人口比率xlsx.中我国近十年的人口形势。根据折线图可知近十年我国的人口出生率至2019年后呈断崖式下降。由于年轻人的生育意愿不高导致人口的自然增长率趋于水平状态。
接着用多组柱状图进行对比可以清楚的看出2013至2020年我国的人口自然增长率还是处于相对稳定的状况,2021年后增长率开始下降。
通过饼图我们可以清楚的看到人口出生率和人口死亡率相较于以前的没每一年没有多大的变化,人口自然增长率至愈渐下降至2022年仅剩0.7%。说明我国人口增长缓慢。
根据人口出生率的饼图我们可以看到我国的人口出生率从2013年的12.5%下降至2022年的6.4%下降接近一倍。
通过用月份为x轴,人口死亡率为y轴绘制的人口死亡率的棉棒图可以看出我国近十年的人口死亡率相对稳定。
根据人口自然增长率的棉棒图我们能看出尽管在三胎的政策下我国的人口增长率还是呈现递现象。
根据以增长率为x轴月份为y轴绘制的哑铃图我们可以看到近十年的人口死亡率相对于前面的每一年相对稳定,人口出生率相较于前一年呈现逐步下降的趋势。
根据人口自然增长率和人口死亡率的哑铃图我们可以看出,我国近十年的人口自然增长率逐年递减,人口增长缓慢,人口的增长形势逐年严峻。
5、完整代码
import pandas as pd
import matplotlib.pyplot as plt
#引用中文包,防止中文报错,一下代码均使用,所以仅出现一次
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
bar_width=0.3
#引入数据
df=pd.read_excel(r"E:\pythonProject2\2022年人口数据.xls")
#绘制三大地带折线图
plt.plot(df["年份"],df["人口出生率"],label='人口出生率',linewidth=2,linestyle='-',color='r',marker='D',markerfacecolor='black',markersize=5)
plt.plot(df["年份"],df["人口死亡率"],label='人口死亡率',linewidth=2,linestyle=':',color='b',marker='o',markerfacecolor='black',markersize=5)
plt.plot(df["年份"],df["人口自然增长率"],label='人口自然增长率',linewidth=2,linestyle='--',color='g',marker='s',markerfacecolor='black',markersize=5)
plt.xlabel("年份",fontdict={'size':15})
plt.ylabel('增长率',fontdict={'size':15})
plt.title('2022年人口数据',fontdict={'size':20})
plt.legend()
#设置网格
plt.grid()
plt.tick_params(axis='x',labelrotation=60)
plt.show()
import pandas as pd
import matplotlib.pyplot as plt
#引用中文包,防止中文报错,一下代码均使用,所以仅出现一次
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
bar_width=0.3
#引入数据
df=pd.read_excel(r"E:\pythonProject2\2022年人口数据.xls")
#绘制堆积柱形图
plt.bar(df["年份"],df["人口出生率"],label='人口出生率',linewidth=2,color='#FFCC00',width=bar_width)
plt.bar(df["年份"],df["人口死亡率"],bottom=df["人口死亡率"],label='人口死亡率',linewidth=2,color='#B0C4DE',width=bar_width)
plt.bar(df["年份"],df["人口自然增长率"],bottom=df["人口自然增长率"],label='人口自然增长率',linewidth=2,color='c',width=bar_width)
#设置x轴,y轴坐标标题的字体大小
plt.xlabel("年份",fontdict={'size':15})
plt.ylabel('增长率',fontdict={'size':15})
#设置主标题的字体大小
plt.title("2022年人口数据",fontdict={'size':20})
#设置图例
plt.legend()
#将x轴标签旋转
plt.tick_params(axis='x',labelrotation=60)
plt.show()
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
#引用中文包,防止中文报错,一下代码均使用,所以仅出现一次
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
bar_width=0.3
#引入数据
df=pd.read_excel(r"E:\pythonProject2\2022年人口数据.xls")
#获取excel中的时间作为x轴
x=df["年份"]
#获取的数据
y_w=df["人口出生率"]
y_e=df["人口死亡率"]
y_m=df["人口自然增长率"]
#设置文本为excel中的时间
labels=df["年份"]
#将画布规划成等分布局的2*1的矩阵区域,之后在索引为1的区域中绘制子图
ax1=plt.subplot(211)
#绘制饼图:外圆半径为1,楔形宽度为0.5,保留小数为一位小数,数据圆心比例0.75
ax1.pie(y_w,radius=1,wedgeprops={'width':0.5},labels=labels,autopct='%3.1f%%',pctdistance=0.75)
ax1.set_title('人口出生率',fontdict={'size':15})
#将画布规划成等分布局的2*2的矩阵区域,之后在索引为3的区域中绘制子图
ax1=plt.subplot(223)
#绘制饼图:外圆半径为1,楔形宽度为0.5,保留小数为一位小数,数据圆心比例0.75
ax1.pie(y_e,radius=1,wedgeprops={'width':0.5},labels=labels,autopct='%3.1f%%',pctdistance=0.75)
ax1.set_title('人口死亡率',fontdict={'size':15})
#将画布规划成等分布局的2*2的矩阵区域,之后在索引为4的区域中绘制子图
ax1=plt.subplot(224)
#绘制饼图:外圆半径为1,楔形宽度为0.5,保留小数为一位小数,数据圆心比例0.75
ax1.pie(y_m,radius=1,wedgeprops={'width':0.5},labels=labels,autopct='%3.1f%%',pctdistance=0.75)
ax1.set_title('人口自然增长率',fontdict={'size':15})
#调整子图之间的距离
plt.tight_layout()
#显示
plt.show()
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
#引用中文包,防止中文报错,一下代码均使用,所以仅出现一次
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
bar_width=0.3
#引入数据
df=pd.read_excel(r"E:\pythonProject2\2022年人口数据.xls")
fig=plt.figure()
#设置画布长、宽为10
fig.set_figheight(10)
fig.set_figwidth(10)
#绘制饼图:半径0.7,设置显示阴影,起始绘制角度90
plt.pie(df["人口出生率"],labels=df["年份"],radius=0.7,autopct='%3.1f%%',shadow=True,startangle=90)
plt.title('人口出生率',fontdict={'size':20})
#设置图例为3列,调整为最合适的位置
plt.legend(ncol=3,loc="best")
#绘制饼图表格
plt.table(cellText=[df["人口出生率"]],
cellLoc='center',#单元格文本对齐方式
rowLabels=['增长率'],
colWidths = [0.1]*13,#设置每列的宽度
colLabels=df["年份"],
loc='lower center')#表格与绘图区域对齐方式
plt.show()
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
#引用中文包,防止中文报错,一下代码均使用,所以仅出现一次
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
bar_width=0.3
#引入数据
df=pd.read_excel(r"E:\pythonProject2\2022年人口数据.xls")
#选取excel文件中时间作为x轴,选取西部总和的数据作为y轴
x=df["年份"]
y=df["人口死亡率"]
labels=df["年份"]
#设置画布
fig=plt.figure(figsize=(12,10),dpi=80)
ax=fig.add_subplot(111)
#绘制棉棒图
markerline, stemlines, baseline=ax.stem(x,y,linefmt='--',markerfmt='o',label='TestStem',use_line_collection=True)
#设置棉棒图的属性
plt.setp(stemlines,lw=2)
ax.set_title('人口死亡率',fontdict={'size':20})
ax.set_ylabel('人口死亡率)',fontdict={'size':15},rotation=90)
ax.set_xticks(x)
ax.set_xticklabels(labels,rotation=60)
#设置棉棒图的数据,设定在棉棒的上方中间
for temp_x,temp_y in zip(x,y): ax.text(temp_x,temp_y+0.5,s='{}'.format(temp_y),ha='center',va='bottom',fontsize=14)
plt.show()
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
#引用中文包,防止中文报错,一下代码均使用,所以仅出现一次
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
bar_width=0.3
#引入数据
df=pd.read_excel(r"E:\pythonProject2\2022年人口数据.xls")
#选取excel文件中时间作为x轴,选取西部总和的数据作为y轴
x=df["年份"]
y=df["人口自然增长率"]
labels=df["年份"]
#设置画布
fig=plt.figure(figsize=(12,10),dpi=80)
ax=fig.add_subplot(111)
#绘制棉棒图
markerline, stemlines, baseline=ax.stem(x,y,linefmt='--',markerfmt='o',label='TestStem',use_line_collection=True)
#设置棉棒图的属性
plt.setp(stemlines,lw=2)
ax.set_title('人口自然增长率',fontdict={'size':20})
ax.set_ylabel('人口自然增长率)',fontdict={'size':15},rotation=90)
ax.set_xticks(x)
ax.set_xticklabels(labels,rotation=60)
#设置棉棒图的数据,设定在棉棒的上方中间
for temp_x,temp_y in zip(x,y): ax.text(temp_x,temp_y+0.5,s='{}'.format(temp_y),ha='center',va='bottom',fontsize=14)
plt.show()
import pandas as pd
import matplotlib as mpl
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.lines as mlines
#引用中文包,防止中文报错,一下代码均使用,所以仅出现一次
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
bar_width=0.3
#引入数据
df=pd.read_excel(r"E:\pythonProject2\2022年人口数据.xls")
df.reset_index(inplace=True)
df=df.sort_values(by="index")
def newline(p1,p2,color='black'):
ax=plt.gca() #获取当前的绘图区域
l=mlines.Line2D([p1[0],p2[0]],[p1[1],p2[1]],color='skyblue')
ax.add_line(l)
return l
fig,ax =plt.subplots(1,1,figsize=(12,10))
#绘制散点
ax.scatter(y=df['index'],x=df['人口出生率'],s=50,color='b',alpha=0.7,label="人口出生率")
ax.scatter(y=df['index'],x=df['人口死亡率'],s=50,color='r',alpha=0.7,label="人口死亡率")
#绘制线条
for i,p1,p2 in zip(df['index'],df['人口出生率'],df['人口死亡率']):
newline([p1,i],[p2,i])
#设置哑铃图两边点的数据
ax.text(p1,i+0.2,s='{}'.format(p1),ha='center',va='bottom',fontsize=12)
ax.text(p2,i-0.3,s='{}'.format(p2),ha='center',va='bottom',fontsize=12)
ax.set_title("人口出生率和人口死亡率", fontdict={'size':20})
ax.set_xlim(0,20)
ax.set_xlabel('增长率', fontdict={'size':15})
ax.set_yticks(df['index'])
ax.set_yticklabels(df['年份'])
ax.set_ylabel('年份', fontdict={'size':15})
ax.grid(alpha=0.5, axis='x')
plt.legend(ncol=2)
plt.show()
import pandas as pd
import matplotlib as mpl
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.lines as mlines
#引用中文包,防止中文报错,一下代码均使用,所以仅出现一次
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
bar_width=0.3
#引入数据
df=pd.read_excel(r"E:\pythonProject2\2022年人口数据.xls")
df.reset_index(inplace=True)
df=df.sort_values(by="index")
def newline(p1,p2,color='black'):
ax=plt.gca() #获取当前的绘图区域
l=mlines.Line2D([p1[0],p2[0]],[p1[1],p2[1]],color='skyblue')
ax.add_line(l)
return l
fig,ax =plt.subplots(1,1,figsize=(12,10))
#绘制散点
ax.scatter(y=df['index'],x=df['人口自然增长率'],s=50,color='b',alpha=0.7,label="人口自然增长率")
ax.scatter(y=df['index'],x=df['人口死亡率'],s=50,color='r',alpha=0.7,label="人口死亡率")
#绘制线条
for i,p1,p2 in zip(df['index'],df['人口自然增长率'],df['人口死亡率']):
newline([p1,i],[p2,i])
#设置哑铃图两边点的数据
ax.text(p1,i+0.2,s='{}'.format(p1),ha='center',va='bottom',fontsize=12)
ax.text(p2,i-0.3,s='{}'.format(p2),ha='center',va='bottom',fontsize=12)
ax.set_title("人口自然增长率和人口死亡率", fontdict={'size':20})
ax.set_xlim(0,20)
ax.set_xlabel('增长率', fontdict={'size':15})
ax.set_yticks(df['index'])
ax.set_yticklabels(df['年份'])
ax.set_ylabel('年份', fontdict={'size':15})
ax.grid(alpha=0.5, axis='x')
plt.legend(ncol=2)
plt.show()
四、总结
通过这次实验不仅掌握了爬虫和可视化的内容,更深层次的了解了大数据分析。
这次实验锻炼了自己的动手能力,巩固了专业技能,收获了很多的专业知识。
对于编程基础较差的我懂的了在敲代码的时候不能操之过急,要一步一个脚印,这样能够保证出现的错误不会很多。当然在解决报错的问题中也学到了很多知识。学会了耐心沉稳的对待问题,去问同学、去百度搜索,锻炼了自己,解决问题。收获颇丰。
标签:数据分析,近十年,plt,df,人口,set,ax,比率,size From: https://www.cnblogs.com/xuecj/p/17000958.html