利用Python获取全国人口迁徙OD数据及可视化
Hello大家好!今天为大家带来一篇良心硬货文章,这篇发完的话就可能会休息一段时间(因为要专心写论文了
本篇文章的主题是利用python获取全国人口迁徙的OD数据,并将其可视化,所以主要分为两个部分:一是数据的获取;二是数据的可视化。最后可能涉及一些inference,不过我作为只学过2学分城规原理和只自学了两章许学强老师《城市地理学》的业余中的业余选手,理论方面及其匮乏,对数据结果的理解可能不是很准确,还请大家不要在意。最后声明一下,本文所用的地图数据来自与aliyun的api,如果有什么问题请找aliyun,与本公众号无关
01. 百度迁徙及数据获取
关于百度迁徙,因为这次疫情,机缘巧合之下我了解到百度竟然还有这样一个产品(百度搜索百度迁徙即可)。总体概括一下就是,百度根据百度app用户的数据,搞了一个网站,上面包括了推算出来的全国各个城市、省份之间的迁徙数据,十分详细。具体长这样:
数据大概分为三个方面:迁入、迁出和城内出行强度。迁入和迁出包括两大部分:迁徙指数和来源地(目的地)排名,其中迁徙指数反映了迁徙的人数,是可以横向对比的。这样的话,我们就可以通过迁徙指数和排名,算出一个无量纲城市之间的迁徙指数,代表OD对之间的流量,用来做可视化分析。同时,百度迁徙这个网站十分的良心,我们直接可以抓包json,解析一下即可,我抓取了所有的数据,具体长这样:
迁徙指数:
城市排名:
此外还有城市级别的、市内出行强度今年去年同期对比数据等等,太多了我就不展示了,大家有兴趣的话欢迎后台私信我与我联系。
02. 数据的可视化
现在,我们数据有了,下面就要开始可视化。具体的思路是:先计算出所有城市之间的迁徙指数,然后获取每个城市形心的坐标,然后对每一个OD pair进行循环,每次循环画一条od线,OD线的宽度为流量,具体代码如下(这次加上了水印,大家做汇报或者做作业用我的图我不反对,但还是通知我一下比较好,至少也要说一下是我公众号上的吧
def plot_od(od,date):
fig,ax = plt.subplots(figsize=(12,12))
province_map.plot(ax=ax,facecolor='none',edgecolor='black',linewidth=0.2)
bound.plot(ax=ax,facecolor='none',edgecolor='black',linewidth=1)
plt.ylim(1900000,7300000)
right_inset_ax = fig.add_axes([0.75745, 0.226, 0.12, 0.12])
province_map.plot(ax=right_inset_ax,facecolor='none',edgecolor='black',linewidth=0.4)
right_inset_ax.set_ylim(100000,2800000)
right_inset_ax.set_xlim(11800000,13700000)
ax.axis('off')
right_inset_ax.xaxis.set_major_locator(plt.NullLocator())
right_inset_ax.yaxis.set_major_locator(plt.NullLocator())
for i in od.index:
ax.plot([od.loc[i,'origin_x'],od.loc[i,'destination_x']],[od.loc[i,'origin_y'],od.loc[i,'destination_y']],linewidth=od.loc[i,'flow']*0.8,color='red',alpha=0.7)
ax.text(10000000,4400000,'公众号:Yuan的数据分析',fontsize=30,alpha=0.32)
ax.set_title('{}全国人口迁徙OD(省级) 数据来源:百度迁徙'.format(date),fontsize=20)
plt.savefig('./省级od动态变化gif/{}全国人口迁徙OD(省级)水印.jpg'.format(date),dpi=300,bbox_inches='tight')
plt.show()
这样我们便能画出指定日期的OD图了,先看看按照省份(港澳台数据缺失)集计的OD:
嘎嘎,1.5号的OD就画出来了,可以看出,由于大家还在上班没有放假,所以全国并没有哪个地区的流量特别的大,(除了北京和河北,OD线贼粗,我估计是很多住到河北的人通勤所致
然后,我们看看春运的:
这个春运确实给力,大家都要回家过年,其中20号(腊月26左右)人流最大,可以看出,我国现在的几大地区内部的联系还是非常密切的:以广东为大哥的珠三角,带着广西、江西和湖南三个小弟;以上海为大哥的长三角,与江苏、浙江和安徽形成强大的互动;京津冀就不用说了;作为俺的第二故乡,成渝的联系也比较紧密,有老四的架势,未来可期;河南和湖北的话,混的比较开,跟谁都能勾搭上,九省通衢实至名归;至于我的hometown 大东百,算了不说了,看着几条小细线,都懂
值得注意的是,23号起武汉开始封城,随后全国各地也陆续开始封城,整个国家投入到抗击新冠的战斗中去,中国人民以极大的勇气与毅力与病毒斗争,其中最重要的一步就是控制人口的流动,避免病毒的传播,下面我们来看看1.23以后的迁徙状况:
显而易见,由于封城措施的强力实施,各省之间人口的流动降到了最低,31号几乎没有线与湖北相连了,事实上正是由于强有力的应对措施,我们国家的抗疫才能取得今天的成绩。
后期的话,直到现在,各省之间的人口流动也始终维持在一个较低的水平,要想恢复正常的运转(比如达到1.5号的水平),还是需要很长的时间。
最后做一个gif,动态展示一下从1.1至3.30号省级OD的变化情况:
看到这里,大家肯定大饱眼福了吧,不过还没完!省级的集计数据缺失了省内人口流动的信息(突然想起了位空间与流空间的概念),如果想更全面地了解mobility,更细粒度的分析必不可少,于是我同样用上面的方法画出了全国所有城市之间的OD图:
以上是在疫情之前的城市级迁徙OD,可以看出,各省还是以省会为中心向省内地区辐射,全国层面的话还是京津冀、长三角、珠三角的流量最大,其中珠三角似乎最具影响力,几乎辐射了整个华南地区;还有一点比较有意思,几乎所有大规模的流动都集中在胡焕庸线(蓝线)以东,即便在交通与科技如此发达的现在,与100年相比,中国的人口分布、流动格局还是没有太大的变化。最后关注一下俺的故乡与第二故乡,大东百就不说了,都懂(遥想当年,东方鲁尔,再看看现在,痛心啊)
下面再看看疫情之后的:
26号可能由于大家还在走亲戚,政策也在适应期,流量还是没有达到低点。
后期的话,2月1号整体流动控制的非常好;随着复工复产,珠三角和长三角也逐渐动了起来,不愧是中国经济的发动机,虽然疫情还未散去,但复工复产必须抓紧,毕竟人们还是要恰饭的。
至此,本篇文章的分析就告一段落,自己未来如果有机会的话也打算深入研究一下这个,结合一些地理类的相关研究方法,争取投一篇练笔的小文章。谢谢大家的观看!感谢大家的支持,本次的文章横跨规划、交通与地理,总有一个角度适合你(起码数据方面是扎实的,解释的部分有我瞎吹的成分还请见谅
往期文章: