Part 1: 動機
作為一個知乎的重度用戶,我深深的被知乎社區(qū)的高素質(zhì)群體所吸引,這也是我在微信朋友圈、新浪微博、baidutieba等社區(qū)見不到的東西。那么為什么知乎這個社區(qū)的群體素質(zhì)偏高呢,這些用戶究竟都是干什么的,來自哪里,從事什么職業(yè),愛好什么話題呢,有多少名校的學(xué)生?等等,這些有趣的問題都是我所關(guān)心的。
Part 2: 數(shù)據(jù)
我用scrapy爬取了知乎328w用戶的基本信息。這些信息包括:
aggree_count: 得到的點贊數(shù)
answer_count: 得到的支持數(shù)
carrer : 職業(yè)
city :所在城市
company :所在公司
education :哪所大學(xué)畢業(yè)
most_good_topic :最擅長的話題
topic_list: 關(guān)注哪些話題
job :工作
這些信息被我放在了user1.json-user48.json這48個json文件中。共計差不多1.7G,如果想要數(shù)據(jù)的話,可以私信我,或者直接發(fā)郵件給我。郵箱和聯(lián)系方式我都會在下面給出。
Part 3: 讀取并清理數(shù)據(jù)
import os
import ujson as json #使用ujson解析更快一些
import pandas as pd
data_list = []
base_dir = 'E:\研究生階段課程作業(yè)\python\數(shù)據(jù)堂數(shù)據(jù)\data1\zhihu_bigdata'data_list = []
for i in range(1,49):
file_name = 'user%d.json' %i
df = json.load(open(os.path.join(base_dir,file_name)))
data_list.extend(df)
df = pd.DataFrame(data_list)
上面的10多行代碼的作用是:一次解析user1.json到user48.json文件,最后轉(zhuǎn)化成pandas.Dataframe中。
df.info() #總體了解一下信息
out: <class 'pandas.core.frame.DataFrame'>
Int64Index: 3288208 entries, 0 to 3288207
Data columns (total 15 columns):
aggree_count object
answer_count object
article_count object
article_list object
carrer object
city object
company object
education object
job object
most_good_topic object
name object
question_count object
thanks_count object
topic_list object
url object
dtypes: object(15)
memory usage: 401.4+ MB
我們的df數(shù)據(jù)幀中包含了328w條數(shù)據(jù),共計有15個字段,只有部分字段是我們感興趣的,我們提取感興趣的字段。并隨機抽樣1個用戶查看結(jié)果:
df = df[["aggree_count","answer_count","carrer","company","job","education","city","most_good_topic","topic_list"]] #選取我們感興趣的話題
df.sample(1) #抽樣選取1個,查看情況
|aggree_count |answer_count |carrer |company |job |city |most_good_topic |topic_list |
| ------------- |:-------------:| -----:|
|[32] |[11] |[]|[]|[]|北京|[iOS] |[應(yīng)用, 設(shè)計, RSS, iPhoto, iPhone 應(yīng)用, 健康, Dribb...] |
從顯示結(jié)果上來看,每個數(shù)據(jù)段的格式都是list,這些并不是我們想要的,對于有的數(shù)據(jù)段,我們需要的是int格式,有的數(shù)據(jù)段,我們需要的是字符串格式。
def list2str(obj):
if (isinstance(obj,list)):
return ''.join(obj)
else:
return obj
def list2int(obj):
if(isinstance(obj,list)):
if obj:
return obj[0]
else:
return obj
上面兩個函數(shù)分別把list轉(zhuǎn)化成int和string
df.aggree_count = df.aggree_count.map(list2int)
df.answer_count = df.answer_count.map(list2int)
df.carrer = df.carrer.map(list2str)
df.company = df.company.map(list2str)
df.job = df.job.map(list2str)
df.city = df.city.map(list2str)
df.education = df.education.map(list2str)
df.most_good_topic = df.most_good_topic.map(list2str)
df.sample(10) #隨機抽取10個樣本查看

我們蛋疼的發(fā)現(xiàn),在carrer和job上,有的人只填了一個,或者兩個都填了,或者兩個都沒填,為了了解知乎用戶的具體職業(yè),我們?yōu)閿?shù)據(jù)框新添了一個字段:occupation
#我們再來了解一下,在知乎上活躍的人,都是做什么工作的:job和career
#因為有的用戶,只有job信息,或者career信息,或者都有,或者都沒有
#對于這兩項信息全部沒有的用戶,我們直接忽略
#如果都有,那么我們選擇career
#只有一個話,我們選擇有的那一個
def job_career2occupation(obj):
if obj['carrer'] and not obj['job']:
return obj['carrer']
elif (not obj['carrer'] and obj['job']):
return obj['job']
elif (not obj['carrer'] and not obj['job']):
return ''
else:
return obj['carrer']
df['occupation'] = df.apply(job_career2occupation,axis=1)
df.replace(to_replace = '',value = np.nan,inplace=True) #對于數(shù)據(jù)段出現(xiàn)空的字符段,我們用np.nan來代替。
Part 4: 數(shù)據(jù)可視化
4.1:出獲得點贊數(shù)最多的人,最擅長哪些領(lǐng)域
假如我們是一個知乎新用戶,我們希望得到更多人的關(guān)注和認可,那么我們首先應(yīng)該知道那些話題更容易得到別人點贊
我們嘗試著找出獲得點贊數(shù)最多的人,最擅長哪些領(lǐng)域
most_good_topic = df.sort(columns=['aggree_count','answer_count'],ascending = [False,False]).most_good_topic
most_good_topic.dropna(inplace=True)
most_good_topic.drop_duplicates(inplace = True)
most_good_topic.values[:20]
out: array(['人物 ', '德語 ', '心理學(xué)專業(yè) ', '閱讀 ', 'DotA ', '游戲 ', '社會現(xiàn)象 ', '健康 ',
'汽車 ', '調(diào)查類問題 ', '紐約 ', '電子商務(wù) ', '足球 ', '編程 ', '積累中 ', '工作體驗 ',
'攝影入門 ', '經(jīng)濟學(xué) ', '飛機 ', '視頻剪輯 '], dtype=object)
我們對在知乎上特別活躍的用戶進行了統(tǒng)計,發(fā)現(xiàn)獲得點贊數(shù)比較多的人,擅長哪些問題。
我們還想知道,知乎上的這些超級活躍的用戶,都是干什么工作的
most_occupation = df.sort(columns=['aggree_count','answer_count'],ascending = [False,False]).occupation
most_occupation.dropna(inplace=True)
most_occupation.drop_duplicates(inplace = True)
most_occupation.dropna(inplace=True)
out: array(['信息傳媒', '教育', '民用航空業(yè)', '高等教育', '地產(chǎn)建筑', '計算機硬件', '首席點贊師', '汽車',
'計算機軟件', '法律', '電子商務(wù)', '建筑設(shè)備', '互聯(lián)網(wǎng)', '金融', '飛行員', '政府', '創(chuàng)意藝術(shù)',
'高新科技', '廣播電視', '進出口貿(mào)易'], dtype=object)
從上面的結(jié)果上,可以看出,知乎上用戶高素質(zhì)也是有原因的,活躍的用戶大多數(shù)從事信息,互聯(lián)網(wǎng),高等教育等前沿職業(yè)。
我們想知道知乎上的用戶,在哪里工作。
換句話說,我們想知道那些地區(qū)的知乎用戶比較集中
我們提取用戶擁有量前20位的才城市
import matplotlib.pyplot as plt
import seaborn as sns
top_20city = df.city.value_counts()[:20]
sns.set_style("darkgrid")
bar_plot = sns.barplot(x=top_20city.index,y=top_20city.values,
palette="muted",
x_order=top_20city.index.tolist())
for label in bar_plot.get_xticklabels():
label.set_fontproperties(font)
plt.xticks(rotation=90)
plt.show()

從結(jié)果上看,北上深廣占據(jù)前四名,同時也說明了這四個大城市對人才的吸引力,另外杭州表現(xiàn)的也很突出,我覺得可能的原因是杭州也非常好的創(chuàng)業(yè)文化和基因,難道是阿里帶動的,這個需要進一步去發(fā)現(xiàn)。
我們想知道哪些高校的學(xué)生用知乎,換句話說,
我們希望找出擁有用戶數(shù)量最多的二十個高校。
import matplotlib.pyplot as plt
import seaborn as sns
top_20education = df.education.value_counts()[:20]
sns.set_style("darkgrid")
bar_plot = sns.barplot(x=top_20education.index,y=top_20education.values,
palette="muted",
x_order=top_20education.index.tolist())
for label in bar_plot.get_xticklabels():
label.set_fontproperties(font)
plt.xticks(rotation=90)
plt.show()

非常出乎我的意料,竟然浙江大學(xué)的知乎用戶最多,難道浙江大學(xué)招生已經(jīng)那么多啦,還是我的樣本數(shù)太少了(328w不算少啦),但是令我欣慰的是大武大排名第二,華中柯基大學(xué)竟然也排名第四,呵呵。
我們想知道各個地區(qū)的用戶的就業(yè)情況,準確來說,我們想知道各個城市的高素質(zhì)人群最喜歡從事什么職業(yè),這在城市之間有差別嗎,我們?nèi)∶總€城市,用戶從業(yè)最多的五個職業(yè)
上面的表述轉(zhuǎn)化成程序語言就是:對數(shù)據(jù)框按城市分組,再找出每個城市的人從業(yè)最多的五個職業(yè),為了簡單,我們只選擇那二十個大城市
df_big_city = df[df.city.isin(top_20city.index)] #我們的研究對象只是知乎用戶數(shù)量的前二十名城市
df_big_city_with_occupation = df_big_city[df_big_city.occupation.notnull()] #過濾掉職業(yè)為空的用戶
def get_top5_city_occupation(grouped):
grouped = grouped.occupation.value_counts()[:5]
return grouped
group = df_big_city_with_occupation.groupby('city')
group.apply(get_top5)
out:
city
上海 互聯(lián)網(wǎng) 28149
計算機軟件 8749
金融 4343
高新科技 3947
電子商務(wù) 3045
北京 互聯(lián)網(wǎng) 80233
計算機軟件 11418
高新科技 6138
金融 5250
電子商務(wù) 4802
南京 互聯(lián)網(wǎng) 4579
計算機軟件 2805
高等教育 1021
高新科技 949
通信 720
廈門 互聯(lián)網(wǎng) 2638
計算機軟件 692
電子商務(wù) 489
電子游戲 375
高新科技 368
大連 計算機軟件 869
互聯(lián)網(wǎng) 653
高等教育 225
金融 195
高新科技 189
天津 互聯(lián)網(wǎng) 1442
計算機軟件 687
高等教育 542
金融 340
地產(chǎn)建筑 325
...
由于篇幅有限,我沒有列出所有的城市,我們可以看到在前二十個城市中,排名前五的職業(yè),都有互聯(lián)網(wǎng)和計算機軟件,另外科研這個職業(yè)在所有的城市中,只出現(xiàn)一次,還是在美國,我們可以大致猜測一下,去美國工作的人應(yīng)該有相當(dāng)一部分擁有博士背景甚至更高的學(xué)歷,看來真的是美國的科研環(huán)境好一些,中國都是忙著賺錢呢。

Part 5 總結(jié)
其實我還遠遠沒有挖掘掉這320w用戶的信息,我們還可以得到更多的信息,數(shù)據(jù)是會說話的,如果我的工作對你有一點啟發(fā)或者幫助的話,那么我將很高興,如果你想與我討論的話,或者需要源代碼甚至所有的數(shù)據(jù)的話,請聯(lián)系我。我也可能會放在我的github上。
QQ :1527927373
EMAIL :QQ郵箱