用以前爬的知乎用戶行為數(shù)據(jù),跑了一下Apriori算法,發(fā)現(xiàn)了一些有意思的關(guān)聯(lián)規(guī)則线脚。以下是簡略的分析過程漂问。
數(shù)據(jù)采集
數(shù)據(jù)怎么來的泞坦?當(dāng)然不是知乎給的口四,是爬蟲來的曹锨。怎么爬的舵盈?這篇文章就不說了毡咏。
數(shù)據(jù)處理
之前爬蟲的時(shí)候?yàn)榱舜鎯?chǔ)方便驮宴,把一個(gè)用戶關(guān)聯(lián)的話題以及每個(gè)話題下的回答情況存放一個(gè)長的字符串,這是一個(gè)坑∨荤裕現(xiàn)在為了建模堵泽,得先把數(shù)據(jù)處理一下,用Python正則表達(dá)式從長字符串中把話題id抽取出來恢总,然后使之變成一對(duì)多的規(guī)整的結(jié)構(gòu)化數(shù)據(jù)框迎罗。這個(gè)過程使3220712行數(shù)據(jù)變成了36856177行。
關(guān)聯(lián)分析
當(dāng)然這里依然用R調(diào)包的方法來做關(guān)聯(lián)分析片仿。不過這個(gè)數(shù)據(jù)體量太大了纹安,全量讀的話單機(jī)內(nèi)存會(huì)爆,更別說Apriori進(jìn)行全表掃描砂豌、逐步迭代計(jì)算……所以選擇一部分樣本即可厢岂,這里取100w條數(shù)據(jù)作為樣本來跑模型。
library(readr)
library(arules)
library(arulesViz)
library(dplyr)
topic_info <- read_csv("E:/data/data/zhihu_topics.csv")
Encoding(topic_info$topic) <- "gbk"
user_topic_sample <- read_csv("E:/data/data/zhihu_user_topic_sample.csv")
user_topic_sample <- user_topic_sample %>% left_join(topic_info[,1:2])
trans <- as(split(user_topic_sample$topic,user_topic_sample$user_token),"transactions")
rules <- apriori(trans,parameter = list(supp=0.1,conf=0.5,minlen=2))
summary(rules)
rules.sorted <- sort(rules, by="lift")
inspect(rules.sorted) %>% head(50)
lhs rhs support confidence lift count
[1] {旅行,美食,心理學(xué)} => {時(shí)尚} 0.1015915 0.7318048 3.065149 3479
[2] {健身,美食} => {時(shí)尚} 0.1031099 0.6927604 2.901612 3531
[3] {電影,旅行,心理學(xué)} => {時(shí)尚} 0.1069937 0.6879459 2.881447 3664
[4] {美食,心理學(xué)} => {家居} 0.1003066 0.5069362 2.868005 3435
[5] {電影,旅行,美食} => {時(shí)尚} 0.1104687 0.6830986 2.861144 3783
[6] {電影,美食,心理學(xué)} => {時(shí)尚} 0.1116659 0.6745458 2.825320 3824
[7] {健身,心理學(xué)} => {時(shí)尚} 0.1055921 0.6569767 2.751733 3616
[8] {家居} => {時(shí)尚} 0.1146153 0.6484388 2.715972 3925
[9] {旅行,心理學(xué)} => {時(shí)尚} 0.1209228 0.6474359 2.711771 4141
[10] {健身,旅行} => {時(shí)尚} 0.1037232 0.6473483 2.711404 3552
[11] {旅行,美食} => {時(shí)尚} 0.1232005 0.6455018 2.703671 4219
[12] {電影,旅行,時(shí)尚} => {美食} 0.1104687 0.8419764 2.689440 3783
[13] {旅行,時(shí)尚,心理學(xué)} => {美食} 0.1015915 0.8401352 2.683559 3479
[14] {商業(yè)} => {創(chuàng)業(yè)} 0.1386772 0.6043523 2.653679 4749
[15] {創(chuàng)業(yè)} => {商業(yè)} 0.1386772 0.6089242 2.653679 4749
[16] {美食,心理學(xué)} => {時(shí)尚} 0.1250986 0.6322314 2.648088 4284
[17] {美食,設(shè)計(jì)} => {時(shí)尚} 0.1017667 0.6320276 2.647234 3485
[18] {電影,健身,美食} => {旅行} 0.1030223 0.8275862 2.635608 3528
[19] {電影,家居} => {美食} 0.1067601 0.8175313 2.611357 3656
[20] {電影,生活} => {音樂} 0.1106731 0.6273796 2.605143 3790
[21] {設(shè)計(jì),心理學(xué)} => {時(shí)尚} 0.1066433 0.6206662 2.599647 3652
[22] {旅行,心理學(xué)} => {教育} 0.1022631 0.5475297 2.595536 3502
[23] {電影,時(shí)尚,心理學(xué)} => {美食} 0.1116659 0.8118896 2.593336 3824
[24] {美食,時(shí)尚,心理學(xué)} => {旅行} 0.1015915 0.8120915 2.586262 3479
[25] {電影,美食,時(shí)尚} => {旅行} 0.1104687 0.8102377 2.580358 3783
[26] {電影,旅行,心理學(xué)} => {美食} 0.1241349 0.7981600 2.549481 4251
[27] {家居,心理學(xué)} => {美食} 0.1003066 0.7958758 2.542185 3435
[28] {經(jīng)濟(jì)學(xué)} => {商業(yè)} 0.1366915 0.5831568 2.541385 4681
[29] {商業(yè)} => {經(jīng)濟(jì)學(xué)} 0.1366915 0.5956987 2.541385 4681
[30] {旅行,心理學(xué)} => {職業(yè)發(fā)展} 0.1016791 0.5444028 2.538890 3482
[31] {旅行,時(shí)尚} => {美食} 0.1232005 0.7948380 2.538870 4219
[32] {電影,健身,心理學(xué)} => {美食} 0.1009490 0.7898104 2.522811 3457
[33] {美食,心理學(xué)} => {教育} 0.1051248 0.5312869 2.518538 3600
[34] {電影,商業(yè)} => {互聯(lián)網(wǎng)} 0.1016207 0.6815511 2.518041 3480
[35] {創(chuàng)業(yè),電影} => {互聯(lián)網(wǎng)} 0.1006862 0.6791412 2.509137 3448
[36] {電影,健身,心理學(xué)} => {旅行} 0.1004818 0.7861549 2.503662 3441
[37] {電影,健身,旅行} => {美食} 0.1030223 0.7826087 2.499807 3528
[38] {健康} => {生活} 0.1190539 0.6937213 2.498579 4077
[39] {電影,設(shè)計(jì),心理學(xué)} => {美食} 0.1091254 0.7806559 2.493570 3737
[40] {教育} => {職業(yè)發(fā)展} 0.1122500 0.5321152 2.481586 3844
[41] {職業(yè)發(fā)展} => {教育} 0.1122500 0.5234918 2.481586 3844
[42] {電影,時(shí)尚,心理學(xué)} => {旅行} 0.1069937 0.7779193 2.477434 3664
[43] {健身,美食} => {旅行} 0.1156373 0.7769276 2.474276 3960
[44] {美食,心理學(xué)} => {職業(yè)發(fā)展} 0.1046576 0.5289256 2.466711 3584
[45] {電影,健身} => {時(shí)尚} 0.1102351 0.5883728 2.464387 3775
[46] {電影,互聯(lián)網(wǎng)} => {商業(yè)} 0.1016207 0.5648434 2.461576 3480
[47] {設(shè)計(jì),時(shí)尚} => {美食} 0.1017667 0.7699956 2.459519 3485
[48] {健身,時(shí)尚} => {旅行} 0.1037232 0.7721739 2.459137 3552
[49] {電影,互聯(lián)網(wǎng)} => {創(chuàng)業(yè)} 0.1006862 0.5596494 2.457391 3448
[50] {美食,時(shí)尚} => {旅行} 0.1232005 0.7705936 2.454104 4219
提升度最高的關(guān)聯(lián)規(guī)則是{旅行,美食,心理學(xué)} => {時(shí)尚} 阳距,達(dá)到了3倍多塔粒!事實(shí)上這些top50的關(guān)聯(lián)規(guī)則很多都是導(dǎo)向“時(shí)尚”這個(gè)話題,果然不愧為逼乎筐摘。
plot(rules, method="graph", control=list(type="items"))
圖就不解釋了卒茬,一直都不是很懂關(guān)聯(lián)規(guī)則可視化圖怎么解讀……
附加一下各話題關(guān)注人數(shù)top100:
關(guān)聯(lián)分析的結(jié)果可用作推薦系統(tǒng)。與協(xié)同過濾算法相比咖熟,它不必計(jì)算兩兩相似度的鄰接矩陣圃酵,計(jì)算量相對(duì)小一點(diǎn);而且協(xié)同過濾算法只能計(jì)算相似度馍管,關(guān)聯(lián)規(guī)則有支持度郭赐、置信度、提升度等指標(biāo)咽斧,解釋性較強(qiáng)一點(diǎn)堪置。不過在協(xié)同過濾算法中,因?yàn)橛袃蓛傻南嗨贫日湃牵驗(yàn)橹灰幸粋€(gè)新的input,總能根據(jù)最高的相似度進(jìn)行推薦岭洲;而在關(guān)聯(lián)規(guī)則中宛逗,只有觸發(fā)了對(duì)應(yīng)的關(guān)聯(lián)規(guī)則才能推薦,因此它的覆蓋面不如協(xié)同過濾廣盾剩。
步驟總結(jié)
- 首先把數(shù)據(jù)整理成id-item式的規(guī)整dataframe
- 然后把dataframe轉(zhuǎn)換成transaction
- 設(shè)定關(guān)聯(lián)規(guī)則參數(shù)(support雷激、confident等)建立關(guān)聯(lián)規(guī)則
- 以關(guān)聯(lián)規(guī)則按某個(gè)指標(biāo)(lift替蔬、support等)排序、解析
- 可視化關(guān)聯(lián)規(guī)則
問題延伸
- 還好剛換了一個(gè)游戲本屎暇,不然無論P(yáng)ython處理數(shù)據(jù)承桥,還是跑Apriori模型,估計(jì)都會(huì)卡成狗
- 這只是一個(gè)case study
- Apriori算法在數(shù)據(jù)量大的時(shí)候計(jì)算量也大得可怕根悼,可以考慮FP-growth
- 用R在單機(jī)上調(diào)包建模的方法可以在學(xué)習(xí)時(shí)體會(huì)一下凶异,但離工業(yè)級(jí)的建模仍有差距。這個(gè)case體量的數(shù)據(jù)建模的話挤巡,在Spark等分布式并行計(jì)算平臺(tái)上跑算法才是正道