Apriori算法实例——322万知乎用户的关注话题关联分析

用以前爬的知乎用户行为数据,跑了一下Apriori算法,发现了一些有意思的关联规则。以下是简略的分析过程。

数据采集

数据怎么来的?当然不是知乎给的,是爬虫来的。怎么爬的?这篇文章就不说了。

数据处理

之前爬虫的时候为了存储方便,把一个用户关联的话题以及每个话题下的回答情况存放一个长的字符串,这是一个坑。现在为了建模,得先把数据处理一下,用Python正则表达式从长字符串中把话题id抽取出来,然后使之变成一对多的规整的结构化数据框。这个过程使3220712行数据变成了36856177行。

关联分析

当然这里依然用R调包的方法来做关联分析。不过这个数据体量太大了,全量读的话单机内存会爆,更别说Apriori进行全表扫描、逐步迭代计算……所以选择一部分样本即可,这里取100w条数据作为样本来跑模型。

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]  {旅行,美食,心理学} =>     {时尚} 0.1015915  0.7318048 3.065149  3479
[2]         {健身,美食} =>     {时尚} 0.1031099  0.6927604 2.901612  3531
[3]  {电影,旅行,心理学} =>     {时尚} 0.1069937  0.6879459 2.881447  3664
[4]       {美食,心理学} =>     {家居} 0.1003066  0.5069362 2.868005  3435
[5]    {电影,旅行,美食} =>     {时尚} 0.1104687  0.6830986 2.861144  3783
[6]  {电影,美食,心理学} =>     {时尚} 0.1116659  0.6745458 2.825320  3824
[7]       {健身,心理学} =>     {时尚} 0.1055921  0.6569767 2.751733  3616
[8]              {家居} =>     {时尚} 0.1146153  0.6484388 2.715972  3925
[9]       {旅行,心理学} =>     {时尚} 0.1209228  0.6474359 2.711771  4141
[10]        {健身,旅行} =>     {时尚} 0.1037232  0.6473483 2.711404  3552
[11]        {旅行,美食} =>     {时尚} 0.1232005  0.6455018 2.703671  4219
[12]   {电影,旅行,时尚} =>     {美食} 0.1104687  0.8419764 2.689440  3783
[13] {旅行,时尚,心理学} =>     {美食} 0.1015915  0.8401352 2.683559  3479
[14]             {商业} =>     {创业} 0.1386772  0.6043523 2.653679  4749
[15]             {创业} =>     {商业} 0.1386772  0.6089242 2.653679  4749
[16]      {美食,心理学} =>     {时尚} 0.1250986  0.6322314 2.648088  4284
[17]        {美食,设计} =>     {时尚} 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]      {设计,心理学} =>     {时尚} 0.1066433  0.6206662 2.599647  3652
[22]      {旅行,心理学} =>     {教育} 0.1022631  0.5475297 2.595536  3502
[23] {电影,时尚,心理学} =>     {美食} 0.1116659  0.8118896 2.593336  3824
[24] {美食,时尚,心理学} =>     {旅行} 0.1015915  0.8120915 2.586262  3479
[25]   {电影,美食,时尚} =>     {旅行} 0.1104687  0.8102377 2.580358  3783
[26] {电影,旅行,心理学} =>     {美食} 0.1241349  0.7981600 2.549481  4251
[27]      {家居,心理学} =>     {美食} 0.1003066  0.7958758 2.542185  3435
[28]           {经济学} =>     {商业} 0.1366915  0.5831568 2.541385  4681
[29]             {商业} =>   {经济学} 0.1366915  0.5956987 2.541385  4681
[30]      {旅行,心理学} => {职业发展} 0.1016791  0.5444028 2.538890  3482
[31]        {旅行,时尚} =>     {美食} 0.1232005  0.7948380 2.538870  4219
[32] {电影,健身,心理学} =>     {美食} 0.1009490  0.7898104 2.522811  3457
[33]      {美食,心理学} =>     {教育} 0.1051248  0.5312869 2.518538  3600
[34]        {电影,商业} =>   {互联网} 0.1016207  0.6815511 2.518041  3480
[35]        {创业,电影} =>   {互联网} 0.1006862  0.6791412 2.509137  3448
[36] {电影,健身,心理学} =>     {旅行} 0.1004818  0.7861549 2.503662  3441
[37]   {电影,健身,旅行} =>     {美食} 0.1030223  0.7826087 2.499807  3528
[38]             {健康} =>     {生活} 0.1190539  0.6937213 2.498579  4077
[39] {电影,设计,心理学} =>     {美食} 0.1091254  0.7806559 2.493570  3737
[40]             {教育} => {职业发展} 0.1122500  0.5321152 2.481586  3844
[41]         {职业发展} =>     {教育} 0.1122500  0.5234918 2.481586  3844
[42] {电影,时尚,心理学} =>     {旅行} 0.1069937  0.7779193 2.477434  3664
[43]        {健身,美食} =>     {旅行} 0.1156373  0.7769276 2.474276  3960
[44]      {美食,心理学} => {职业发展} 0.1046576  0.5289256 2.466711  3584
[45]        {电影,健身} =>     {时尚} 0.1102351  0.5883728 2.464387  3775
[46]      {电影,互联网} =>     {商业} 0.1016207  0.5648434 2.461576  3480
[47]        {设计,时尚} =>     {美食} 0.1017667  0.7699956 2.459519  3485
[48]        {健身,时尚} =>     {旅行} 0.1037232  0.7721739 2.459137  3552
[49]      {电影,互联网} =>     {创业} 0.1006862  0.5596494 2.457391  3448
[50]        {美食,时尚} =>     {旅行} 0.1232005  0.7705936 2.454104  4219

提升度最高的关联规则是{旅行,美食,心理学} => {时尚} ,达到了3倍多!事实上这些top50的关联规则很多都是导向“时尚”这个话题,果然不愧为逼乎。

plot(rules, method="graph", control=list(type="items"))
image.png

图就不解释了,一直都不是很懂关联规则可视化图怎么解读……

附加一下各话题关注人数top100:


知乎关注人数top100的话题

关联分析的结果可用作推荐系统。与协同过滤算法相比,它不必计算两两相似度的邻接矩阵,计算量相对小一点;而且协同过滤算法只能计算相似度,关联规则有支持度、置信度、提升度等指标,解释性较强一点。不过在协同过滤算法中,因为有两两的相似度,因为只要有一个新的input,总能根据最高的相似度进行推荐;而在关联规则中,只有触发了对应的关联规则才能推荐,因此它的覆盖面不如协同过滤广。

步骤总结

  • 首先把数据整理成id-item式的规整dataframe
  • 然后把dataframe转换成transaction
  • 设定关联规则参数(support、confident等)建立关联规则
  • 以关联规则按某个指标(lift、support等)排序、解析
  • 可视化关联规则

问题延伸

  • 还好刚换了一个游戏本,不然无论Python处理数据,还是跑Apriori模型,估计都会卡成狗
  • 这只是一个case study
  • Apriori算法在数据量大的时候计算量也大得可怕,可以考虑FP-growth
  • 用R在单机上调包建模的方法可以在学习时体会一下,但离工业级的建模仍有差距。这个case体量的数据建模的话,在Spark等分布式并行计算平台上跑算法才是正道
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容