Python筆記 · 基於72萬知乎用戶信息的數據可視化
之前寫過一個獲取知乎用戶主頁信息的多線程爬蟲: Python筆記 · 一個多線程知乎用戶爬蟲的實現 ,大概獲取了72萬知乎用戶的主頁信息。
這幾天試著用這些數據和Python的一些工具,比如jupyter,numpy,matplotlib和wordcloud等做了一些數據可視化,下面把一些成果分享給大家。
數據可視化的代碼主要使用jupyter notebook編寫,也放在了之前的爬蟲項目下的analysis文件夾中:moranzcw/Zhihu-Spider 。
首先是使用常規的直方圖統計了一些信息。
贊同數和感謝數分布:
橫坐標是贊同數或感謝數,縱坐標是在這個贊同數或感謝數上的用戶人數。可以看到,理所當然是一個長尾分布,人們更喜歡用贊同而不是感謝。
為什麼分成六幅圖而不是一幅圖,原因在於,隨著贊同數或感謝數升高,用戶數量衰減得太快,若畫在一幅圖中,趨勢非常貼近坐標系,效果會非常差。
另外,第六幅圖右下角獲得三百多萬贊同的用戶,大家應該可以很容易猜到是誰了。
贊同數和感謝數的空間分布:
現在,可以更進一步,使用x軸表示贊同數,y軸表示感謝數,z軸表示用戶數量,這樣我們得到了一個「空間直方圖」。
這裡注意,為了更好的展示效果,z軸不是等比例的,而是指數遞增的。
可以看到,用戶分布非常貼近x軸,也就是說點贊的使用率要遠高於感謝。
關注數和被關注數分布:
用戶的關注數和被關注數的趨勢大致相近,但是高被關注數的用戶要多於高關注數的用戶。這也確實符合一般常識:一般用戶通常至多關注幾百用戶,而一個熱門用戶往往可以被數萬用戶關注。
另外,我們也能注意到一個很有意思的細節,第一幅圖中,關注者數為0的用戶不存在,這顯然不符合常理,但是數據是沒有問題的,問題在數據的篩選上。之前講爬蟲的文章中,我們獲取用戶的策略是廣度優先搜索,並且是使用用戶的關注列表來搜索,這就決定了獲取到的用戶都至少有一個關注者。
關注數和被關注數空間分布:
可以看出,原點存在一個峰值,數據分布貼近x軸和y軸向兩邊延展,存在一定的極化,由此判斷,可以不嚴謹地將用戶分幾類:熱門用戶(高關注者數,低關注數),普通用戶(低關注者數,低關注數),重度用戶(低關注者數,高關注數)。
同時,我們可以注意到,在x軸 ,關注數5000的位置,存在一個峰值,關注數高於5000的用戶幾乎沒有,這是因為知乎對每個用戶的關注數限制為5000,導致一些重度用戶集中在5000這個位置,無法繼續關注更多用戶。
還有一些例如回答數,收藏數等的統計,個人認為過於單調,不一一放上來了。
全國知乎用戶地理分布:
這個圖沒有用更好的工具做,是直接用matplotlib硬來的,其實用一些如Echarts,Plotly等更高級的工具反倒更簡單,但是之前都用的matplotlib,這裡畢竟只為了一個圖就引入其他庫了。
這個圖製作流程大致就是,用百度地圖API截取一張自己需要的地圖作為背景,然後依然使用百度地圖API將用戶信息里的中文地名批量轉換到經緯度,再依次經緯度繪製在圖上就可以了。
從圖上看,這個分布確實很符合常理,大量用戶集中在沿海發達城市。知乎以年輕用戶為主。
然後使用了詞雲工具展示一些數據,效果也還不錯。
(鑒於有人說圖片晃眼睛,於是改了一下配色)
獲得贊同最多的用戶:
這一堆ID大家應該很熟悉,都是各位時間線的主要構成。
獲得感謝最多的用戶:
獲得關注最多的用戶:
答案被收藏最多的用戶:
感謝數,關注數,贊同數和收藏數基本上就是幾個大V霸屏了,比如 @張佳瑋 @肥肥貓 等。
回答數最多的用戶:
文章數最多的用戶:
提問最多的用戶:
提問,文章和回答數的熱門用戶就和之前的區別大了,反正這上面大多數ID我都不認識,看來,往往大V們喜歡回答,而喜歡寫文章和提問的往往又不是普通用戶熟悉的大V。
最後統計了用戶的一些標籤信息。
最熱門的學校:
都說知乎985起步,常春藤平均水平,看起來好像不是開玩笑哈哈哈。不過這個圖依然只能當作參考,首先是爬取的用戶只有72萬,不代表整個知乎,其次爬取策略上,也會優先爬取熱門用戶,最後,也是評論區提到的,往往學歷較高的用戶都會認真填寫學歷信息。這些都會影響統計結果。
最熱門的專業:
IT依舊是最熱門的行業,大家都知道了。
最熱門的公司:
BAT,華為,網易等非常熱門,這圖看起來不像是統計熱門公司,而是統計熱門IT公司。
最熱門的職位:
在知乎上被黑出翔的產品經理居然是最熱門的。
最熱門的行業:
可以說知乎就是一個程序員次文化社區。
(以上統計結果僅僅基於72萬用戶數據,僅作參考。)
推薦閱讀:
※Python爬蟲實戰之使用Scrapy爬起點網的完本小說
※第四章:動態網頁抓取 (解析真實地址 + selenium)
※汽車之家字體反爬破解實踐
※爬取張佳瑋138萬知乎關注者:數據可視化
※python爬蟲之圖片下載APP1.0