中國姓氏數(shù)量眾多酥泛,歷史源遠(yuǎn)流長杨幼。中華民族歷史上的姓氏歷來有百家姓之說,常云:“趙錢孫李恢口、周吳鄭王孝宗、馮陳褚衛(wèi)、蔣沈韓楊”耕肩,中國人見于文獻(xiàn)的姓氏有5662個(gè)因妇,其中單姓3484個(gè),復(fù)姓2032個(gè)猿诸,三字姓146個(gè)婚被。(沒想到吧,單姓數(shù)目只約占6成)
今天两芳,我們來好好研究一下各姓氏人群的分布情況摔寨。
一、哪個(gè)姓氏人數(shù)最多怖辆?
1.1 清洗數(shù)據(jù)
- 首先導(dǎo)入數(shù)據(jù)文件是复,并對數(shù)據(jù)進(jìn)行合并
"""
導(dǎo)入所需函數(shù)庫
"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
% matplotlib inline
import warnings
warnings.filterwarnings('ignore')
# 不發(fā)出警告
from bokeh.io import output_notebook
output_notebook()
# 導(dǎo)入notebook繪圖模塊
from bokeh.plotting import figure,show
from bokeh.models import ColumnDataSource
# 導(dǎo)入圖表繪制、圖標(biāo)展示模塊
# 導(dǎo)入ColumnDataSource模塊
"""
清洗數(shù)據(jù)
"""
import os
os.chdir('E:\\數(shù)據(jù)分析\\項(xiàng)目09中國姓氏排行研究')
# 創(chuàng)建工作路徑
df01 = pd.read_csv('data01.csv',encoding = 'utf-8')
df02 = pd.read_csv('data02.csv',encoding = 'utf-8')
df_city = pd.read_excel('中國行政代碼對照表.xlsx')
# 讀取數(shù)據(jù)
df = pd.concat([df01,df02])
df['戶籍地城市編號'] = pd.to_numeric(df['戶籍地城市編號'] , errors='coerce')
# 使用to_numeric轉(zhuǎn)為數(shù)值竖螃。默認(rèn)情況下淑廊,它不能處理字母型的字符串'pandas'√嘏兀可以將無效值強(qiáng)制轉(zhuǎn)換為NaN
df = pd.merge(df,df_city,left_on='戶籍地城市編號',right_on = '行政編碼')
df['工作地'] = df['工作地'].str[:15] # 只提取工作地前15個(gè)字符即可
del df['行政編碼']
del df['戶籍地城市編號']
# 合并數(shù)據(jù)季惩,添加經(jīng)緯度字段
# 刪除無用字段
print('讀取數(shù)據(jù)共%i條' % len(df))
df.head(20)
- 接著整理數(shù)據(jù)录粱,形成所需格式。查看識別后的單元格画拾,如果字?jǐn)?shù)超過5則為“未識別”
df['工作地_省'] = df['工作地'].str.split('省').str[0]
# 識別工作地-省
df['工作地_市'] = df['工作地'].str.split('省').str[1].str.split('市').str[0]
df['工作地_市'][df['工作地_省'].str.len() > 5] = df['工作地_省'].str.split('市').str[0]
# 識別工作地-市
# 在未識別出省的數(shù)據(jù)中啥繁,可能會有市的信息
df['工作地_區(qū)縣'] = ''
df['工作地_區(qū)縣'][(df['工作地_市'].str.len() < 5)&(df['工作地'].str.contains('區(qū)'))] = df['工作地'].str.split('市').str[1].str.split('區(qū)').str[0] + '區(qū)'
df['工作地_區(qū)縣'][(df['工作地_市'].str.len() > 5)&(df['工作地'].str.contains('區(qū)'))] = df['工作地'].str.split('區(qū)').str[0] + '區(qū)'
df['工作地_區(qū)縣'][(df['工作地_市'].str.len() < 5)&(df['工作地'].str.contains('縣'))] = df['工作地'].str.split('市').str[1].str.split('縣').str[0] + '縣'
df['工作地_區(qū)縣'][(df['工作地_市'].str.len() > 5)&(df['工作地'].str.contains('縣'))] = df['工作地'].str.split('縣').str[0] + '縣'
# 識別工作地-區(qū)縣
df['工作地_省'][df['工作地_省'].str.len() > 5] = '未識別'
df['工作地_市'][df['工作地_市'].str.len() > 5] = '未識別'
df['工作地_區(qū)縣'][(df['工作地_區(qū)縣'].str.len() > 5) | (df['工作地_區(qū)縣'].str.len() < 2)] = '未識別'
# 整理未識別單元格
df.columns = ['姓','工作地','戶籍所在地_省','戶籍所在地_市','戶籍所在地_區(qū)縣','戶籍所在地_lng','戶籍所在地_lat',
'工作地_省','工作地_市','工作地_區(qū)縣']
print('讀取數(shù)據(jù)共%i條' % len(df))
# 數(shù)據(jù)整理
df.head(20)
1.2 top20姓氏
# 將數(shù)據(jù)按照“姓”做統(tǒng)計(jì),找到數(shù)量最多的TOP20
name_count = df['姓'].value_counts()[:20]
result1_01 = pd.DataFrame({'count':name_count, 'count_pre':name_count/name_count.sum()})
# bokeh出聯(lián)動柱狀圖
from bokeh.models import HoverTool
from bokeh.layouts import gridplot
# 導(dǎo)入模塊
name_lst = result1_01.index.tolist()
source = ColumnDataSource(result1_01)
# 創(chuàng)建ColumnDataSource數(shù)據(jù)
hover1 = HoverTool(tooltips=[("姓氏計(jì)數(shù)", "@count")]) # 設(shè)置標(biāo)簽顯示內(nèi)容
result1 = figure(plot_width=800, plot_height=250,x_range = name_lst,
title="中國姓氏TOP20 - 計(jì)數(shù)" ,
tools=[hover1,'reset,xwheel_zoom,pan']) # 構(gòu)建繪圖空間
result1.vbar(x='index', top='count', source=source,width=0.9, alpha = 0.7,color = 'red')
result1.ygrid.grid_line_dash = [6, 4]
result1.xgrid.grid_line_dash = [6, 4]
# 柱狀圖1
hover2 = HoverTool(tooltips=[("姓氏占比", "@count_pre")]) # 設(shè)置標(biāo)簽顯示內(nèi)容
result2 = figure(plot_width=800, plot_height=250,x_range = result1.x_range,
title="中國姓氏TOP20 - 占比" ,
tools=[hover2,'reset,xwheel_zoom,pan'])
result2.vbar(x='index', top='count_pre', source=source,width=0.9, alpha = 0.7,color = 'green')
result2.ygrid.grid_line_dash = [6, 4]
result2.xgrid.grid_line_dash = [6, 4]
# 柱狀圖2
p = gridplot([[result1], [result2]])
# 組合圖表
show(p)
PS : 數(shù)據(jù)樣本較小青抛,僅代表大致趨勢
數(shù)據(jù)可見旗闽,“王張李劉陳”霸占中國姓氏人數(shù)前五,總和約占總?cè)藬?shù)一半蜜另。你的朋友中适室,是否有一半是“王張李劉陳”的一員呢?举瑰!
(在5662個(gè)姓氏中脫穎而出捣辆,老王真是無處不在)
1.3 查看某一姓氏的全國分布
在了解中國姓氏數(shù)量的排行后,我們再來看看每一姓氏在中國大陸的分布情況
1.3.1 查看“王”姓的全國分布
data_wang1 = df[df['姓'] == '王']
writer = pd.ExcelWriter('C:/Users/QJ/Desktop/wang1.xlsx')
data_wang1.to_excel(writer,'sheet1',index=False)
writer.save()
# 導(dǎo)出數(shù)據(jù)1
data_wang2 = data_wang1.groupby(['姓','戶籍所在地_lng','戶籍所在地_lat'])['戶籍所在地_市'].count()
data_wang2 = data_wang2.reset_index()
writer = pd.ExcelWriter('C:/Users/QJ/Desktop/wang2.xlsx')
data_wang2.to_excel(writer,'sheet1',index=False)
writer.save()
# 導(dǎo)出數(shù)據(jù)2
print('導(dǎo)出完成此迅!')
接著在EXCEL中打開 wang1.xlsx 文件汽畴,用power map 制作熱力圖,查看老王們在中國的分布情況邮屁。
可以發(fā)現(xiàn)整袁,“王”姓的分布情況與想象中的國內(nèi)人口分布情況大體一致。只是佑吝,南方地區(qū)分布較少坐昙,基本集中在長江中下游地區(qū)。
1.3.2 查看“甄”姓的全國分布
同理芋忿,再來看看本人“甄”姓的國內(nèi)分布情況
# 查看“甄”姓的全國分布
data_zhen1 = df[df['姓'] == '甄']
writer = pd.ExcelWriter('C:/Users/QJ/Desktop/zhen1.xlsx')
data_zhen1.to_excel(writer,'sheet1',index=False)
writer.save()
# 導(dǎo)出數(shù)據(jù)1
data_zhen2 = data_zhen1.groupby(['姓','戶籍所在地_lng','戶籍所在地_lat'])['戶籍所在地_市'].count()
data_zhen2 = data_zhen2.reset_index()
writer = pd.ExcelWriter('C:/Users/QJ/Desktop/zhen2.xlsx')
data_zhen2.to_excel(writer,'sheet1',index=False)
writer.save()
# 導(dǎo)出數(shù)據(jù)2
print('導(dǎo)出完成炸客!')
不同于遍地開花的“王”姓人,“甄”姓家族的人數(shù)較少戈钢。除了常見的集中在長江中下游地區(qū)痹仙,“甄”姓人在廣東有兩個(gè)集中點(diǎn),分別是開平和臺山殉了,也是著名華僑地區(qū)开仰,這里的人們多選擇出國闖蕩,諸如美國唐人街能時(shí)常聽見臺山話薪铜。
二众弓、姓氏遷徙情況
2.1 計(jì)算奔波指數(shù)
查看姓氏遷徙情況,我們需要算出“奔波指數(shù)”隔箍。其中奔波指數(shù)=姓氏人均遷徙距離谓娃,遷徙距離為戶籍地所在地級市與現(xiàn)居住地所在地級市的距離。
# 計(jì)算并查看“葉”姓氏的奔波指數(shù)
data_zhen = df[['姓','戶籍所在地_lng','戶籍所在地_lat','工作地_市','工作地_區(qū)縣']][df['姓'] == '葉']
data_zhen = data_zhen[data_zhen['工作地_市'] != '未識別']
data_zhen = data_zhen[data_zhen['工作地_區(qū)縣'] != '未識別']
data_zhen.columns = ['familyname','birth_lng','birth_lat','work_city','work_district']
# 篩選并清洗數(shù)據(jù)
writer = pd.ExcelWriter('C:/Users/QJ/Desktop/zhen_qianxi.xlsx')
data_zhen.to_excel(writer,'sheet1',index=False)
writer.save()
# 導(dǎo)出數(shù)據(jù)
print('數(shù)據(jù)條數(shù)為%i條' % len(data_zhen))
data_zhen.head(10)
獲得戶籍經(jīng)緯度地址和工作地址
2.2 空間可視化結(jié)果
把工作地址利用Geocoding工具蜒滩,轉(zhuǎn)化成對應(yīng)經(jīng)緯度坐標(biāo)
-
把數(shù)據(jù)文件導(dǎo)入QGIS中滨达,分別給籍貫坐標(biāo)和工作坐標(biāo)取點(diǎn)
-
利用lineplotter插件兩點(diǎn)連線奶稠,并設(shè)置好 “l(fā)ength”字段,以此漸變數(shù)值作圖
-
最后捡遍,優(yōu)化圖表锌订,實(shí)現(xiàn)動態(tài)可視化(簡書無法呈現(xiàn)效果)
可見,“葉”姓群體多集中工作在南京地區(qū)