手把手教你完成一個資料科學小專案(5):省份提取與視覺化

古柳_Deserts_X發表於2019-02-26

前言

請先閱讀“中國年輕人正帶領國家走向危機”,這鍋背是不背? 一文,以對“手把手教你完成一個資料科學小專案”系列有個全域性性的瞭解。

程式碼統一開源在 GitHub:DesertsX/gulius-projects ,感興趣的朋友可以先行 star 哈。(注:jupyter notebook 裡的圖片有些無法顯示,因為打算更新完本系列後再統一上傳,建議參照文章內容和實際程式碼執行結果進行理解)

截至目前我們已經完成了資料爬取資料提取與IP查詢資料異常與清洗評論數變化情況分析,本文繼續對地理資訊進行處理,並分別提取出省份和城市資料,從而可以用 pyecharts 進行地圖視覺化。

讀取資料

import pandas as pd
df = pd.read_csv('Sina_Finance_Comments_All_20180811_Cleaned.csv',encoding='utf-8')
df.head()
複製程式碼

經過之前的文章的洗禮,相信你對資料已經非常熟悉了吧:

本文只對'area'列進行處理,'ip_loc'列讀者可自行探索,比如提取並分析下移動、電信、聯通等的佔比
等。

df[['area','ip_loc']]
複製程式碼
5-area.jpg
5-area.jpg

統計 area

看看area列有多少種情況。

area_count = df.groupby('area')['area'].count().sort_values(ascending=False)
area_name = list(area_count.index)
area_values = area_count.values
print(len(area_name),len(area_values))
print(area_count)
複製程式碼

這裡展示area_count部分資料:

337 337
area
北京              319
上海              281
廣東廣州            176
四川成都            136
廣東深圳            131
湖北武漢            113
重慶               96
江蘇南京             96
浙江杭州             87
陝西西安             73
福建福州             73
浙江               68
江蘇蘇州             64
安徽合肥             52
天津               44
山東濟南             44
江蘇徐州             42
江蘇無錫             42
遼寧瀋陽             40
山東青島             40
複製程式碼

全部3000多條評論資料裡,地理資訊area_name共337個唯一值,為了分別對省份和城市進行統計和視覺化,需要從area_name裡找出可以分離出省份和城市的提取方法,以便apply應用到area列上。

讀者可在此處暫停思考下,自己的思路是什麼?該如何實現?

print(area_name)
複製程式碼

全部337條地理資訊彙總如下:

['北京', '上海', '廣東廣州', '四川成都', '廣東深圳', '湖北武漢', '重慶', '江蘇南京', '浙江杭州', '陝西西安', '福建福州', '浙江', '江蘇蘇州', '安徽合肥', '天津', '山東濟南', '江蘇徐州', '江蘇無錫', '遼寧瀋陽', '山東青島', '江西南昌', '河南鄭州', '香港', '廣東佛山', '廣東', '湖南長沙', '雲南昆明', '北京海淀', '山西太原', '廣西南寧', '廣東東莞', '甘肅蘭州', '澳大利亞', '內蒙古呼和浩特', '河南開封', '福建', '遼寧大連', '河北', '河北石家莊', '江蘇南通', '黑龍江哈爾濱', '湖南', '浙江紹興', '雲南', '山東', '日本', '吉林', '吉林長春', '遼寧盤錦', '浙江寧波', '福建廈門', '河南', '貴州貴陽', '浙江金華', '貴州', '山西晉城', '浙江溫州', '山東臨沂', '四川', '江蘇常州', '河南洛陽', '新疆烏魯木齊', '廣東汕頭', '江蘇揚州', '山東淄博', '四川內江', '江蘇泰州', '福建泉州', '廣東中山', '山東煙臺', '英國英格蘭', '浙江嘉興', '內蒙古包頭', '廣西', '湖北宜昌', '浙江湖州', '山東濟寧', '河北保定', '海南海口', '廣東惠州', '河北廊坊', '江蘇連雲港', '新加坡', '遼寧', '山東濰坊', '安徽淮北', '山西大同', '廣西柳州', '湖北襄陽', '浙江台州', '四川綿陽', '河北邯鄲', '江西九江', '河南周口', '安徽蕪湖', '浙江麗水', '美國', '寧夏銀川', '河南南陽', '河北承德', '河北唐山', '江蘇鹽城', '陝西寶雞', '青海西寧', '廣東揭陽', '河北秦皇島', '天津塘沽', '河北滄州', '山西長治', '廣東韶關', '湖北', '江西上饒', '廣西桂林', '江西宜春', '遼寧朝陽', '黑龍江', '湖南常德', '遼寧營口', '湖北黃岡', '遼寧鞍山', '貴州遵義', '山東聊城', '山西', '河南安陽', '安徽六安', '山西運城', '山東德州', '山東東營', '河北衡水', '江西贛州', '美國加利福尼亞州', '遼寧撫順', '安徽淮南', '陝西咸陽', '四川宜賓', '雲南曲靖', '海南三亞', '湖北荊州', '內蒙古赤峰', '四川南充', '福建龍巖', '美國紐約州', '廣西河池', '美國伊利諾伊州', '廣西梧州', '廣東清遠', '江蘇宿遷', '廣西玉林', '廣西北海', '廣東陽江', '福建莆田', '廣東茂名', '江蘇', '廣東湛江', '新疆昌吉回族自治州', '湖北咸寧', '廣東江門', '安徽滁州', '內蒙古', '青海海南藏族自治州', '四川自貢', '大韓民國', '陝西延安', '寧夏', '遼寧錦州', '英國', '安徽阜陽', '山東日照', '江蘇鎮江', '山西臨汾', '山西呂梁', '山西晉中', '福建寧德', '黑龍江齊齊哈爾', '法國', '河南駐馬店', '河南新鄉', '河南許昌', '湖南益陽', '河南漯河', '湖南衡陽', '甘肅武威', '湖南邵陽', '湖南株洲', '湖南湘潭', '遼寧阜新', '安徽黃山', '河南濮陽', '安徽池州', '遼寧遼陽', '山東威海', '福建南平', '山東棗莊', '河南鶴壁', '遼寧本溪', '湖南湘西土家族苗族自治州', '河南平頂山', '河南三門峽', '貴州畢節', '湖南郴州', '山西陽泉', '安徽安慶', '福建三明', '美國馬里蘭州', '加拿大安大略', '上海徐匯', '雲南保山', '雲南普洱', '湖北恩施土家族苗族自治州', '內蒙古興安盟', '黑龍江大慶', '浙江衢州', '內蒙古通遼', '內蒙古鄂爾多斯', '加拿大不列顛哥倫比亞', '浙江舟山', '泰國', '北京朝陽', '陝西銅川', '湖北黃石', '四川德陽', '四川瀘州', '陝西漢中', '四川資陽', '四川雅安', '湖南嶽陽', '寧夏吳忠', '英國蘇格蘭', '山東泰安', '新疆', '福建漳州', '廣西崇左', '美國康乃狄克州', '甘肅', '美國德克薩斯州', '美國俄亥俄州', '河北張家口', '美國佛羅里達州', '廣東珠海', '瑞典', '江西鷹潭', '廣西欽州', '江西', '新疆巴音郭楞蒙古自治州', '澳門', '江西萍鄉', '江蘇淮安', '湖北隨州', '四川廣安', '美國俄勒岡州', '馬來西亞', '陝西渭南', '湖北荊門', '江西景德鎮', '吉林松原', '紐西蘭', '四川廣元', '吉林白山', '新疆石河子', '吉林通化', '日本和歌山縣', '青海海東', '青海', '四川樂山', '北京東城', '加拿大', '加拿大艾伯塔', '日本岐阜縣', '上海黃浦', '黑龍江綏化', '雲南臨滄', '雲南大理白族自治州', '雲南怒江傈僳族自治州', '黑龍江牡丹江', '雲南昭通', '甘肅白銀', '雲南紅河哈尼族彝族自治州', '伊拉克', '海南', '內蒙古烏蘭察布', '美國喬治亞', '甘肅張掖', '內蒙古呼倫貝爾', '黑龍江伊春', '黑龍江雞西', '新疆塔城地區', '江西撫州', '四川眉山', '美國路易斯安那州', '湖南婁底', '新疆伊犁哈薩克自治州', '遼寧葫蘆島', '廣東肇慶', '廣東潮州', '河南商丘', '山東萊蕪', '山東菏澤', '遼寧丹東', '愛爾蘭', '美國新澤西州', '河南信陽', '越南胡志明市', '廣東河源', '廣東汕尾', '山西朔州', '湖北孝感', '西藏拉薩', '廣東梅州', '菲律賓西米沙鄢', '菲律賓', '澳大利亞澳大利亞首都領地', '廣東雲浮', '瑞士', '美國弗吉尼亞州', '遼寧鐵嶺', '安哥拉', '四川達州', '四川遂寧', '河北邢臺', '湖南懷化', '陝西商洛', '美國賓夕法尼亞州', '義大利皮埃蒙特', '寧夏固原', '義大利托斯卡納', '義大利', '美國密蘇里州', '廣西百色', '甘肅定西', '甘肅天水', '湖南永州', '美國密歇根州', '安徽蚌埠', '安徽銅陵', '河南焦作', '安徽馬鞍山', '美國田納西州']
複製程式碼

地理資訊的處理,算是本系列文章的一大亮點,面對這樣略顯雜亂的資料,新手小白或許會和古柳一樣有些頭大,(今天你頭大了嗎?),回想當初做《爬取張佳瑋138w+知乎關注者:資料視覺化》專案時,篩選了張佳瑋的138萬關注中自身100+關注的全部4萬多知乎使用者後,打算分析和視覺化時,看到資料的髒亂程度也是一言難盡,為了給大家一個直觀的感受,特意翻出資料來展示下,不知道能否得清:

鬼知道古柳當初是怎麼統計的呢!

現在看來,這回的資料真的算好的了,地理資訊都是真實的,不會有使用者自定義、瞎填的情況出現;格式較為統一,而且資料量也小,再不濟,哪怕手動提取省份和城市也不是不可以…(手動是不可能手動的,這輩子都不可能再手動的)


但有個背景需要交代,古柳在完成這個專案時是全部一起做的,也就是說在一個 jupyter notebook 裡一步步從爬蟲測試與資料爬取、IP 查詢與資料提取、評論數變化情況分析和視覺化、BUG 遭遇戰與異常處理、以及後續文章將涉及的 emoji 提取、評論內容分析、詞雲展示、情感分析,還有本文的地理資訊處理、經緯度查詢、用 BDP 實現評論動態熱力圖等等。“工作量”也不小,雖說現在寫成了系列文章的形式,一個 notebook 掰成了八九瓣,讀者可能覺察不到,但“如人飲水,冷暖自知”,推進到這一步,確認過地理資訊後,“糟糕,是心肌梗塞的感覺”。好了,扯完犢子,還是開始講下古柳的處理思路吧。

資料處理思路

首先再次明確下這次的目的是提取出省份和城市資訊,且由於資料量不大,所以後續只在中國地圖上進行視覺化,因而海外地理資訊統一可以篩選出去,實現的方式是構建一個unchina的列表,用來儲存出現過的海外國家,然後遍歷所有的337條area_name元素,包含這些國家名的就新增到drop列表裡,然後根據其他國內的地理資訊的長度分別列印出來,這樣資料就清晰多了!過程中可能有些會被誤分,需要核查一遍。

Talk is cheap, show you the code.

area_len_2 = []
area_len_3 = []
area_len_4 = []
area_len_5 = []
unchina = ['英國','美國','日本','瑞士','法國','瑞典','越南','泰國',
           '義大利','加拿大','菲律賓','新加坡','紐西蘭','伊拉克','愛爾蘭','安哥拉',
           '澳大利亞', '大韓民國', '馬來西亞']
droped = []
for area in area_name:
    for unarea in unchina:
        if unarea in area: 
            droped.append(area)
    if len(area)==2 and area not in droped: area_len_2.append(area) # 我國共有34個省級行政區域,包括23個省,5個自治區,4個直轄市,2個特別行政區。
    if len(area)==3 and area not in droped: area_len_3.append(area)
    if len(area)==4 and area not in droped: area_len_4.append(area)
    if len(area)>=5 and area not in droped: area_len_5.append(area)
print(len(droped),'\n', droped)
print(len(area_len_2),'\n', area_len_2)
print(len(area_len_3),'\n', area_len_3)
print(len(area_len_4),'\n', area_len_4)
print(len(area_len_5),'\n', area_len_5)
複製程式碼

處理過後,神清氣爽。雖然下面提取省份沒有用到,但對資料的組成有了更清晰的瞭解!

省份彙總

根據百度百科詞條裡的內容:省份 - 百科我國共有34個省級行政區域,包括23個省,5個自治區,4個直轄市,2個特別行政區。

複製過來所有省份,先手動去掉自治區和行政區的字尾文字,再用程式碼去掉無關的文字與字元。

prolist = '北京市,天津市,上海市,重慶市,河北省,山西省,遼寧省,吉林省,江蘇省,浙江省,安徽省,福建省,\
江西省,山東省,河南省,湖北省,湖南省,廣東省,海南省,四川省,貴州省,雲南省,陝西省,甘肅省,\
青海省,臺灣省,廣西,西藏,寧夏,新疆,香港,澳門,內蒙古,黑龍江省'
prolist = prolist.replace('市', '').replace('省', '').split(',')
print(len(prolist), prolist)
複製程式碼
34 ['北京', '天津', '上海', '重慶', '河北', '山西', '遼寧', '吉林', '江蘇', '浙江', '安徽', '福建', '江西', '山東', '河南', '湖北', '湖南', '廣東', '海南', '四川', '貴州', '雲南', '陝西', '甘肅', '青海', '臺灣', '廣西', '西藏', '寧夏', '新疆', '香港', '澳門', '內蒙古', '黑龍江']
複製程式碼

提取省份

area列提取出相應省份,非國內的則統一用海外表示:

def get_pro(area):
    prolist = ['北京', '天津', '上海', '重慶', '河北', '山西', '遼寧', '吉林', '江蘇', '浙江', '安徽', '福建', '江西', '山東', '河南', '湖北', '湖南', '廣東', '海南', '四川', '貴州', '雲南', '陝西', '甘肅', '青海', '臺灣', '廣西', '西藏', '寧夏', '新疆', '香港', '澳門', '內蒙古', '黑龍江']
    for pro in prolist:
        if pro in area:
            return pro
    return "海外"
df['pro'] = df.area.apply(get_pro)
df[['area','pro']]
複製程式碼

統計資料

pro_count = df.groupby('pro')['pro'].count().sort_values(ascending=False)
pro_count
複製程式碼

具體數值看柱狀圖就行。

pyecharts

pyecharts 自定義主題

先安裝主題外掛
pip install echarts-themes-pypkg

省份分佈柱形圖

from pyecharts import Bar
bar = Bar("省份分佈")
bar.use_theme("macarons") # 換主題
bar.add("省份", pro_count.index, pro_count.values,is_label_show=True,xaxis_interval=0,xaxis_rotate=-45)
bar
複製程式碼

省份分佈地圖

from pyecharts import Map
mapp = Map("省份分佈情況", width=1000, height=600)
#mapp.use_theme("macarons") # 換主題
mapp.add("", pro_count.index, pro_count.values, maptype='china', is_visualmap=True,
         visual_range=[0, 480], is_map_symbol_show=False, visual_text_color='#000', is_label_show=True)
mapp
複製程式碼

小結

省份提取相對比較簡單,只要網上搜下具體有哪些省份(暴露了古柳是地理小白),拿到省份名單之後就好辦了。不過之前對地理資訊資料的分組劃分,以便更清晰的瞭解資料和避免後續出錯的步驟倒是小小閃光點吧。逃…

下一篇文章將涉及提取城市資料,呼叫百度地圖 API 查詢經緯度,然後用 BDP 繪製動態熱力圖。非常建議讀者自行嘗試實現,應該有不一樣的實現方法,古柳的方法感覺還是麻煩了,不要被我的方法所限制!具體內容請看下文。未完待,續…


本系列專案將全面涉及從爬蟲、資料提取與準備、資料異常發現與清洗、分析與視覺化等細節,並將程式碼統一開源在GitHub:DesertsX/gulius-projects ,感興趣的朋友可以先行 star 哈。

本系列文章:
“中國年輕人正帶領國家走向危機”,這鍋背是不背?
手把手教你完成一個資料科學小專案(1):資料爬取
手把手教你完成一個資料科學小專案(2):資料提取、IP 查詢
手把手教你完成一個資料科學小專案(3):資料異常與清洗
手把手教你完成一個資料科學小專案(4):評論數變化情況


相關文章