數據分析案例練習——中國姓氏排行研究

目的和背景

目的

對中國姓氏數據進行處理,查看姓氏「廣泛指數」和奔波指數html

數據背景

三張數據表,兩張我的信息表(數據量總和263w+),一張中國行政代碼對照表(數據量3500+)json

數據預處理

數據讀取

os.chdir('G:\數據分析資料*******')
#讀取數據:
df1=pd.read_csv('data01.csv',encoding='utf-8')
df2=pd.read_csv('data02.csv',encoding='utf-8')
df3=pd.read_excel('中國行政代碼對照表.xlsx',sheet_name =0,encoding='utf-8')
複製代碼

數據錶鏈接與合併

#數據錶鏈接,結合「戶籍地城市編號」及「中國城市代碼對照表」數據,將城市經緯度鏈接進數據中
def data_combine(df_data01,df_data02,df_code):
    #df_data01,df_data02爲兩張我的信息表,df_code爲城市代碼對照表
    df_con=pd.concat([df_data01,df_data02])#合併成一個數據表
    df_code['行政編碼']=pd.to_numeric(df_code['行政編碼'],errors='coerce')
    df_con['戶籍地城市編號']=pd.to_numeric(df_con['戶籍地城市編號'],errors='coerce')
    df_code['行政編碼']=pd.to_numeric(df_code['行政編碼'],errors='coerce')  
    data_01=pd.merge(df_con,df_code,left_on='戶籍地城市編號',right_on='行政編碼')
    print('merge前的數據爲:',len(df_con),'\n,merge後的數據爲:',len(data_01))
    del data_01['戶籍地城市編號']
    del data_01['行政編碼']
    data_01['工做地']=data_01['工做地'].str[:15]
    return(data_01)
data_01=data_combine(df1,df2,df3)
複製代碼

這裏值得一提的是數據表merge合併的時候須要統一轉換數據類型和考慮數據有效性。我開始直接合並,報錯,我試着用pd.astype()函數直接都轉換爲字符型,合併後發現260w+的數據少了接近200w數據。而後使用了pandas.to_numeric(arg,errors ='raise',downcast = None )函數轉換數據才使得合併後的數據量正常。c#

提取工做地的省、市、縣(區)以及未識別值處理

def get_provinces(df):#提取省
    df['工做地_省']=df['工做地'].str.split('省').str[0]
    return(df)
data_01=get_provinces(data_01)
def get_city(df):#提取市
    df['工做地_市'] = df['工做地'].str.split('省').str[1].str.split('市').str[0]
    df['工做地_市'][df['工做地_省'].str.len() > 5] = df['工做地_省'].str.split('市').str[0]
    return(df)
data_02=get_city(data_01)
def get_county(df):#提取區縣
    df['工做地_區縣']=''
    df['工做地_區縣'][(df['工做地_市'].str.len() < 5)&(df['工做地'].str.contains('區'))] = df['工做地'].str.split('市').str[1].str.split('區').str[0] + '區'  
    df['工做地_區縣'][(df['工做地_市'].str.len() > 5)&(df['工做地'].str.contains('區'))] = df['工做地'].str.split('區').str[0] + '區'
    df['工做地_區縣'][(df['工做地_市'].str.len() < 5)&(df['工做地'].str.contains('縣'))] = df['工做地'].str.split('市').str[1].str.split('縣').str[0] + '縣'  
    df['工做地_區縣'][(df['工做地_市'].str.len() > 5)&(df['工做地'].str.contains('縣'))] = df['工做地'].str.split('縣').str[0] + '縣'
    return(df)
data_03=get_county(data_02)
def get_else(df):#整理未識別工做地
    df['工做地_省'][df['工做地_省'].str.len() > 5] = '未識別'
    df['工做地_市'][df['工做地_市'].str.len() > 5] = '未識別'
    df['工做地_區縣'][(df['工做地_區縣'].str.len() > 5) | (df['工做地_區縣'].str.len() < 2)] = '未識別'
    return(df)
data_04=get_else(data_03)
data_04.columns = ['姓', '工做地', '戶籍所在地_省', '戶籍所在地_市','戶籍所在地_區縣', '戶籍所在地_lng', '戶籍所在地_lat', '工做地_省','工做地_市','工做地_區縣' ]
#調整數據列順序
複製代碼

數據可視化

二維統計

這塊使用bokeh作可視化api

import matplotlib.pyplot as plt
from bokeh.plotting import figure,show,output_file
from bokeh.models import ColumnDataSource,HoverTool
from bokeh.layouts import gridplot
#(1)數將數據按照「姓」作統計,找到數量最多的TOP20
name_count=data_04['姓'].value_counts()[:20]
result_01=pd.DataFrame({
    'count':name_count,
    'count_per':name_count/name_count.sum()
})
name_list=result_01.index.tolist()
source=ColumnDataSource(result_01)
output_file('name_rank.html')

#姓氏top20計數圖
hover1 = HoverTool(tooltips = [('姓氏計數', "@count")])
result1=figure(plot_width = 800, plot_height = 250, x_range = name_list,
                 title = '中國姓氏TOP20 - 計數',
                 tools = [hover1, 'reset, xwheel_zoom, pan'])
result1.vbar(x='index', top='count', source=source,width=0.9, alpha = 0.8,color = 'lightseagreen') 
result1.ygrid.grid_line_dash = [6, 4]
result1.xgrid.grid_line_dash = [6, 4]

#姓氏top20佔比圖
hover2=HoverTool(tooltips=[('姓氏佔比',"@count_per")])
result2=figure(plot_width = 800, plot_height = 250, x_range = name_list,
                 title = '中國姓氏TOP20 - 佔比',
                 tools = [hover2, 'reset, xwheel_zoom, pan'])
result2.vbar(x='index', top='count_per', source=source,width=0.9, alpha = 0.8,color = 'deeppink') 
result2.ygrid.grid_line_dash = [6, 4]
result2.xgrid.grid_line_dash = [6, 4]

p = gridplot([result1], [result2])
show(p)
複製代碼

可視化圖形以下bash

能夠看出,中國姓氏前三甲爲‘王’,‘張’,‘李’,其次是‘劉’姓、‘陳’姓、‘楊’姓,後面的‘吳趙周徐黃孫’姓數量都比較接近(數據僅供訓練,沒有任何實際意義)

人羣地理位置分佈可視化

這裏選擇查看老王家的姓氏全國分佈,先獲取老王的數據,並讀取到本地‘.xlsx’文件中echarts

data_wang=data_04[data_04['姓']=='王']
write_file=pd.ExcelWriter('G:\數據分析資料\數據分析師羣資料\【很是重要】項目資料\項目09中國姓氏排行研究(更新地圖shp)\項目09中國姓氏排行研究\wangb1.xlsx')
data_wang.to_excel(write_file,'sheet1',index=False)
write_file.save()
複製代碼

打開文件,這裏使用Excel的powermap製做,函數

打開3D地圖ui

3D人口柱狀圖編碼

打開powermap後,選擇平面地圖——>點的經度、維度——>主題環境spa

製做人口柱狀圖以下: 以姓的數量做爲柱狀圖的高度

人口熱力圖

echarts製圖

生成echarts製圖須要的數據

data_wang2=data_wang.groupby(['戶籍所在地_lng', '戶籍所在地_lat', '戶籍所在地_市'])['姓'].count()
data_wang2 = data_wang2.reset_index()
data_wang2.columns = ['lng', 'lat', 'name', 'value'] 
writer=pd.ExcelWriter('G:\數據分析資料\數據分析師羣資料\【很是重要】項目資料\項目09中國姓氏排行研究(更新地圖shp)\項目09中國姓氏排行研究\wangb2.xlsx')
data_wang2.to_excel(writer,'sheet1',index=False)
writer.save()
複製代碼

將‘wangb2.xlsx’替換到‘data.xlsx’文件中

將數據轉換爲方便echarts讀取的json格式

import pandas as pd
import os
os.chdir('G:\數據分析資料******\ch0403_空間柱狀圖\data02_3D_Bar_Map')  # 輸入文件所在路徑,'
data = pd.read_excel('data.xlsx', sheetname=0,header=0)
datajs = data.to_json(orient='records',force_ascii=False)
print('轉換後數據爲:\n',datajs)
複製代碼

而後將此數據複製echarts的data中

生圖以下

圖形上的點都比較小,並且分佈須要調整

打開座標拾取器,選取中部地區武漢的經緯度,作地圖中心點

調整地圖的中心點座標,視角遠近,點柱大小

最後,echarts製做的3D柱狀圖以下

能夠看出老王在全國均有分佈,東部地區偏多,其次是中部地區(未完待續)
相關文章
相關標籤/搜索