对品葱知名用户天下无贼点赞记录的数据分析
首先声明: 笔者和@天下无贼 并无个人恩怨,虽然在若干话题下,我跟天下无贼有过不甚愉快的互动,我对天下无贼立场、观点、讨论方式、对线策略等,也不能完全认同,但笔者坚定的支持按照个人意愿,在遵守论坛使用规则的前提下,参与品葱的各种讨论的权利。以下分析单纯是出于个人兴趣,而且数据获得是品葱公开的用户数据。 笔者在分析结果的展示中,会尽量避免个人的主观意见,单纯的展示数据和分析结果。 如果本文章违反了论坛使用规定,或者伤害到个人情感,可以开诚布公的告知我,我会酌情修改/删除。 谢谢。
notes: 如果有人感兴趣, 想要进一步analyze,或者想要验证/复现此次分析结果,可以通过私信索要数据和代码。
Without further ado, let's begin.
Section 1. 数据获取
在品葱的个人账号页面,选取了“送出的赞”,这一栏目数据作为此次分析用途。

原因如下:
1. 该数据栏目结构相对简单,不需要太过于复杂的数据清洗,即可获得结构清晰的数据源;
2. 该数据栏目包含赞(+1)和踩(-1),两类数据,可以反映用户使用行为的某些统计学特征;
3. 用户天下无贼在品葱高频度的活跃度,生产了不错的数据量,有助于提高分析结果的鲁棒性;
使用该数据集的不足:
1. 仅仅是反映了对于特定文章评论的方向性(binary)意见,因此分析仅仅停留在使用行为层面,无法深入到观点层面;
2. 在对使用行为的时序分析中,因为利用其他使用行为作为交叉分析,因此对时间尺度上的行为会有遗漏;
3. 点踩和点赞 只是用户意见的代理指标(proxy),可能无法反应用户的真实想法。
简单介绍下所使用数据集的概览(summary)
时间跨度:2021年9月5日 - 2023年10月31日
数据长度: 929条目
数据列目: 6列, 依次为 score赞踩数据(+1为赞,-1为踩, 0为点赞后又取消), user_name用户名(赞踩对象用户名), user_repu(赞踩对象声望值),user_vote(赞踩对象游戏币数), question_type(赞踩问题类型), question_id(赞踩的文章id)
notes: 数据清洗中,有一个很有意思的事情, 我发现品葱的该html页面对数据使用的分隔符为“•”,为十六进制的'\x95'特殊符号,并不符合UTF-8编码标准,因此在清洗过程中还给制造了一些小小麻烦,可能是因为笔者在html方面几乎白痴。
下面截图为清洗后的数据框概览:

Section 2. 赞踩行为单向分析结果

从单纯的赞踩行为,可以看到,在929条赞踩数据中, 68.89%为点赞行为, 28.74%为点踩行为, 2.36%为点赞后取消行为。
从赞踩数据的时序数据来看, 从2010年9月到2022年10月之前,赞踩数据都相对稀疏,进入到2023年之后,赞踩数据开始逐渐密集,尤其是2023年2-4月,2023年10月下旬,两个时间段的赞踩数据量占到了整个数据集的83%, 应可针对这两个时间段的国内外热点事件进行交叉分析。

按照赞踩记录的日期进行单日累加,并且对过去一周的赞踩行为进行了移动求和,得到了每日的周累计赞踩活动数据。 从上图可以看到一样的赞踩行为活跃度,此图标能更加方便identify到一些高密度的活动时期。

讲单日活动数据和周累计活动数据放到一个视图下,可以更加明显的看到以上规律。
以下为单日赞踩数据最高的前十个日期:
2023-10-31 13
2023-10-20 13
2022-12-12 12
2023-10-22 11
2022-08-06 11
2022-09-05 10
2022-02-07 10
2023-02-27 10
2023-04-06 9
2023-03-14 9
可以看到2023年10月31日 和 2023年10月20日 均为为一天13条,
其次为2022年12月12日,一天为12条, 以此类推
Section 3. 赞踩行为节假日活跃分析结果
在对赞踩数据进行时序分析之前,笔者先建立了一个2021年9月到2023年10月31日的日期时序作为数据框的index,然后将原始数据集中的活跃日期进行类别标签处理,再join到新建的数据框之中,这样就得到了一个每日活跃的新的数据列 Active, Active=0为当日未进行任何赞踩,Active=1为当日有赞踩行为。
然后对于每一个日期进行加节假日判断,产生新的两列数据, week_day和is_holiday。 在进行这项操作时,用到了由清华大学pip源提供的chinese_calendar包,对日期进行一键处理,这里点个赞。
下图为新的vote时序数据框的概览:

比如数据的第一行2022年9月19日列, Active=0为当日不活跃, weekday='Sunday' 当日为星期日, week_sum=6 前一周累计赞踩数据为6, is_holiday=True当日为非周末节假日, holiday_name='mid-autumn festival' 当日为中秋节
根据以上数据集得到如下分析结果:
缺席率
清明节 80.000%
劳动节 78.571%
端午节 71.429%
公历新年 66.667%
国庆节 51.852%
中秋节 50.000%
所有日期 49.174%
非节假日 48.043%
春节 44.444%
按照缺席率来看, @天下无贼用户在清明节期间赞踩活跃缺席率为80%, 也就是过去3年的累计清明节天数中,有80%的天数,用户没有进行任何赞踩行为;
其次的缺席率为劳动节, 78.57%的劳动节假期,用户没有任何赞踩行为;
端午节为71.43%, 公历新年为66.67%, 国庆节和中秋节约为一半的缺席率。
而所有的非节假日中,用户的赞踩行为缺席率为48.04%
在所有的节假日中,春节的缺席率最低, 为44.44%
对于每周的工作日和双休日进行分析:
天下无贼用户在一周之内活跃量统计:
Friday 63
Thursday 60
Sunday 58
Tuesday 58
Wednesday 56
Monday 55
Saturday 50
以上结果中 该用户在星期五活跃度最高,在过去3年内,有63个周五产生了赞踩使用记录。
活跃度最高的第三名为周日,有58个周日都产生了赞踩记录。
以下为不活跃的weekday天数统计:
Saturday 62
Monday 58
Wednesday 56
Sunday 55
Tuesday 55
Thursday 52
Friday 49
可以看到最不活跃的为周六,有62个星期六没有产生任何赞踩行为,其次为58个周一没有赞踩行为,然后是周三。
从以上数据可以得出一个结论, 该用户在周日赞踩行为最为活跃,在周六的赞踩行为最为不活跃, 工作日中周四的赞踩行为最为活跃,周一的赞踩行为最为不活跃。

以上结果显示, 天下无贼一周赞踩累计,最活跃的周均在2023年发生, 其中2023年10月29日一周,发生44次赞踩记录, 其次为2023年3月5日一周,赞踩记录为41条。
Section 4. 赞踩对象分析
因为品葱赞踩记录中,包含赞踩对象的用户名,威望,游戏币等信息,获得以下分析结果。

上图为天下无贼累计点赞前十名用户,在所有点赞记录中, 用户@疯狂习近平获得了累计43条点赞, yogafire获得了17条点赞, 蘑菇云和王匪沪宁均获得14条点赞。
同理相反,可以获得累计点踩前十名用户:

从上可以看到, @天下无贼 累计点踩次数最多的用户为@打狗棒专打共党,累次踩31次, @事已至此先吃饭吧 累计被踩12次, 笔者本人也不幸上榜,被累计点踩5次,不过再次声明,笔者和@天下无贼 无个人恩怨,虽然经常意见相左。
下图为交叉赞踩行为, 也就是针对一个用户,点赞和点踩两类记录之和,产生@天下无贼对该用户的net_vote 净点赞数

对@事已至此先吃饭吧,有两次点赞,12次点踩,净点赞数量为-10, 对fb_china_today,有3次点赞9次点踩,净点赞数为-6

Section 5. Predictive Analysis 预测性分析
最后对@天下无贼 的净点赞次数(up_vote - down_vote), 进行了一个简单的SLR预测模型,模型采用的OLS线性回归方法,模型如下:
net_vote 净点赞数 = α + β1* user_repu 用户声望 + β2*user_vote用户游戏币 + ε
值得指出的是,以上模型中, user_repu和user_vote 两个数据存在显著正相关性,将两列数据放入模型中,可能引入多重共线性偏差(multi-collinearity bias), 但是因为模型自变量非常少,当前数据集中直接可用的量化质量只有这两个,况且计量经济学前辈John Tukey 曾经说过: multi-collinearity is god's will. 因此笔者还是选择使用两个自变量作为建模输入。
以下为OLS回归结果:

从上述结果中可以看到, x1自变量(用户声望 user_repu)对净点赞数有95%的统计学显著性, 用户声望每提高1个单位, @天下无贼净点赞数同时增加0.39次, 也就是说,用户声望越高,@天下无为用户越可能送出更多的净点赞数。 而x2自变量 (用户游戏币 user_vote) 并没有显著的预测效果。 整个OLS模型对于@天下无贼用的净点赞记录的预测效率仅为R-squared = 6.5%。
此次分析的不足和待改进之处环:
1. 仅仅使用了赞踩行为数据集,无法全面客观反应用户的实际观点,态度,行为方式等。
2. 接下来可使用text mining的一些技术手段,对留言/回复中的情绪方向进行处理和分析。
3. 整合此次分析中一个通用型框架,来对品葱任意用户进行赞踩行为分析。
4. 在遵守品葱用户使用行为规范的前提下, 使用网页爬虫手段来自动获取页面数据,进行清晰并形成结构化的数据集。
5. 优化提升分析结果展示的用户可阅读性。
结束。
再次声明,以上分析结果仅为笔者个人兴趣, 并非针对特定用户, 在结果展示中,也尽量只讨论分析结果,不做个人主观观点输出, “一千个人眼中有一千个哈姆雷特”, 葱油们如果能从笔者拙略的分析中,获得一些自己观点和见解,那是各位的权利和自由。
谢谢各位,如果有任何批评,建议,问题, 可以在留言中互动。
再次声明,若本文伤害到某些葱油的感受,可以通过留言/私信 方式告知笔者。
notes: 如果有人感兴趣, 想要进一步analyze,或者想要验证/复现此次分析结果,可以通过私信索要数据和代码。
Without further ado, let's begin.
Section 1. 数据获取
在品葱的个人账号页面,选取了“送出的赞”,这一栏目数据作为此次分析用途。

原因如下:
1. 该数据栏目结构相对简单,不需要太过于复杂的数据清洗,即可获得结构清晰的数据源;
2. 该数据栏目包含赞(+1)和踩(-1),两类数据,可以反映用户使用行为的某些统计学特征;
3. 用户天下无贼在品葱高频度的活跃度,生产了不错的数据量,有助于提高分析结果的鲁棒性;
使用该数据集的不足:
1. 仅仅是反映了对于特定文章评论的方向性(binary)意见,因此分析仅仅停留在使用行为层面,无法深入到观点层面;
2. 在对使用行为的时序分析中,因为利用其他使用行为作为交叉分析,因此对时间尺度上的行为会有遗漏;
3. 点踩和点赞 只是用户意见的代理指标(proxy),可能无法反应用户的真实想法。
简单介绍下所使用数据集的概览(summary)
时间跨度:2021年9月5日 - 2023年10月31日
数据长度: 929条目
数据列目: 6列, 依次为 score赞踩数据(+1为赞,-1为踩, 0为点赞后又取消), user_name用户名(赞踩对象用户名), user_repu(赞踩对象声望值),user_vote(赞踩对象游戏币数), question_type(赞踩问题类型), question_id(赞踩的文章id)
notes: 数据清洗中,有一个很有意思的事情, 我发现品葱的该html页面对数据使用的分隔符为“•”,为十六进制的'\x95'特殊符号,并不符合UTF-8编码标准,因此在清洗过程中还给制造了一些小小麻烦,可能是因为笔者在html方面几乎白痴。
下面截图为清洗后的数据框概览:

Section 2. 赞踩行为单向分析结果

从单纯的赞踩行为,可以看到,在929条赞踩数据中, 68.89%为点赞行为, 28.74%为点踩行为, 2.36%为点赞后取消行为。
从赞踩数据的时序数据来看, 从2010年9月到2022年10月之前,赞踩数据都相对稀疏,进入到2023年之后,赞踩数据开始逐渐密集,尤其是2023年2-4月,2023年10月下旬,两个时间段的赞踩数据量占到了整个数据集的83%, 应可针对这两个时间段的国内外热点事件进行交叉分析。

按照赞踩记录的日期进行单日累加,并且对过去一周的赞踩行为进行了移动求和,得到了每日的周累计赞踩活动数据。 从上图可以看到一样的赞踩行为活跃度,此图标能更加方便identify到一些高密度的活动时期。

讲单日活动数据和周累计活动数据放到一个视图下,可以更加明显的看到以上规律。
以下为单日赞踩数据最高的前十个日期:
2023-10-31 13
2023-10-20 13
2022-12-12 12
2023-10-22 11
2022-08-06 11
2022-09-05 10
2022-02-07 10
2023-02-27 10
2023-04-06 9
2023-03-14 9
可以看到2023年10月31日 和 2023年10月20日 均为为一天13条,
其次为2022年12月12日,一天为12条, 以此类推
Section 3. 赞踩行为节假日活跃分析结果
在对赞踩数据进行时序分析之前,笔者先建立了一个2021年9月到2023年10月31日的日期时序作为数据框的index,然后将原始数据集中的活跃日期进行类别标签处理,再join到新建的数据框之中,这样就得到了一个每日活跃的新的数据列 Active, Active=0为当日未进行任何赞踩,Active=1为当日有赞踩行为。
然后对于每一个日期进行加节假日判断,产生新的两列数据, week_day和is_holiday。 在进行这项操作时,用到了由清华大学pip源提供的chinese_calendar包,对日期进行一键处理,这里点个赞。
下图为新的vote时序数据框的概览:

比如数据的第一行2022年9月19日列, Active=0为当日不活跃, weekday='Sunday' 当日为星期日, week_sum=6 前一周累计赞踩数据为6, is_holiday=True当日为非周末节假日, holiday_name='mid-autumn festival' 当日为中秋节
根据以上数据集得到如下分析结果:
缺席率
清明节 80.000%
劳动节 78.571%
端午节 71.429%
公历新年 66.667%
国庆节 51.852%
中秋节 50.000%
所有日期 49.174%
非节假日 48.043%
春节 44.444%
按照缺席率来看, @天下无贼用户在清明节期间赞踩活跃缺席率为80%, 也就是过去3年的累计清明节天数中,有80%的天数,用户没有进行任何赞踩行为;
其次的缺席率为劳动节, 78.57%的劳动节假期,用户没有任何赞踩行为;
端午节为71.43%, 公历新年为66.67%, 国庆节和中秋节约为一半的缺席率。
而所有的非节假日中,用户的赞踩行为缺席率为48.04%
在所有的节假日中,春节的缺席率最低, 为44.44%
对于每周的工作日和双休日进行分析:
天下无贼用户在一周之内活跃量统计:
Friday 63
Thursday 60
Sunday 58
Tuesday 58
Wednesday 56
Monday 55
Saturday 50
以上结果中 该用户在星期五活跃度最高,在过去3年内,有63个周五产生了赞踩使用记录。
活跃度最高的第三名为周日,有58个周日都产生了赞踩记录。
以下为不活跃的weekday天数统计:
Saturday 62
Monday 58
Wednesday 56
Sunday 55
Tuesday 55
Thursday 52
Friday 49
可以看到最不活跃的为周六,有62个星期六没有产生任何赞踩行为,其次为58个周一没有赞踩行为,然后是周三。
从以上数据可以得出一个结论, 该用户在周日赞踩行为最为活跃,在周六的赞踩行为最为不活跃, 工作日中周四的赞踩行为最为活跃,周一的赞踩行为最为不活跃。

以上结果显示, 天下无贼一周赞踩累计,最活跃的周均在2023年发生, 其中2023年10月29日一周,发生44次赞踩记录, 其次为2023年3月5日一周,赞踩记录为41条。
Section 4. 赞踩对象分析
因为品葱赞踩记录中,包含赞踩对象的用户名,威望,游戏币等信息,获得以下分析结果。

上图为天下无贼累计点赞前十名用户,在所有点赞记录中, 用户@疯狂习近平获得了累计43条点赞, yogafire获得了17条点赞, 蘑菇云和王匪沪宁均获得14条点赞。
同理相反,可以获得累计点踩前十名用户:

从上可以看到, @天下无贼 累计点踩次数最多的用户为@打狗棒专打共党,累次踩31次, @事已至此先吃饭吧 累计被踩12次, 笔者本人也不幸上榜,被累计点踩5次,不过再次声明,笔者和@天下无贼 无个人恩怨,虽然经常意见相左。
下图为交叉赞踩行为, 也就是针对一个用户,点赞和点踩两类记录之和,产生@天下无贼对该用户的net_vote 净点赞数

对@事已至此先吃饭吧,有两次点赞,12次点踩,净点赞数量为-10, 对fb_china_today,有3次点赞9次点踩,净点赞数为-6

Section 5. Predictive Analysis 预测性分析
最后对@天下无贼 的净点赞次数(up_vote - down_vote), 进行了一个简单的SLR预测模型,模型采用的OLS线性回归方法,模型如下:
net_vote 净点赞数 = α + β1* user_repu 用户声望 + β2*user_vote用户游戏币 + ε
值得指出的是,以上模型中, user_repu和user_vote 两个数据存在显著正相关性,将两列数据放入模型中,可能引入多重共线性偏差(multi-collinearity bias), 但是因为模型自变量非常少,当前数据集中直接可用的量化质量只有这两个,况且计量经济学前辈John Tukey 曾经说过: multi-collinearity is god's will. 因此笔者还是选择使用两个自变量作为建模输入。
以下为OLS回归结果:

从上述结果中可以看到, x1自变量(用户声望 user_repu)对净点赞数有95%的统计学显著性, 用户声望每提高1个单位, @天下无贼净点赞数同时增加0.39次, 也就是说,用户声望越高,@天下无为用户越可能送出更多的净点赞数。 而x2自变量 (用户游戏币 user_vote) 并没有显著的预测效果。 整个OLS模型对于@天下无贼用的净点赞记录的预测效率仅为R-squared = 6.5%。
此次分析的不足和待改进之处环:
1. 仅仅使用了赞踩行为数据集,无法全面客观反应用户的实际观点,态度,行为方式等。
2. 接下来可使用text mining的一些技术手段,对留言/回复中的情绪方向进行处理和分析。
3. 整合此次分析中一个通用型框架,来对品葱任意用户进行赞踩行为分析。
4. 在遵守品葱用户使用行为规范的前提下, 使用网页爬虫手段来自动获取页面数据,进行清晰并形成结构化的数据集。
5. 优化提升分析结果展示的用户可阅读性。
结束。
再次声明,以上分析结果仅为笔者个人兴趣, 并非针对特定用户, 在结果展示中,也尽量只讨论分析结果,不做个人主观观点输出, “一千个人眼中有一千个哈姆雷特”, 葱油们如果能从笔者拙略的分析中,获得一些自己观点和见解,那是各位的权利和自由。
谢谢各位,如果有任何批评,建议,问题, 可以在留言中互动。
再次声明,若本文伤害到某些葱油的感受,可以通过留言/私信 方式告知笔者。
87 个评论
This account is registered to reply to this post and won’t be used later. Please don’t expect any reply. Below are some comments. Can’t guarantee the absence of mistakes. Please take what you need and judge for yourself how legit each piece is.
1. Descriptive: might be interesting to look at
a) Interactive behavior: does he only like posts by a certain group of users, who exclusively like back within a clique?
b) Comparison with users he likes the most / that like him the most: are there similar patterns between their behavior and his (active days, liking behavior, etc.)?
c) Comparison with other users, or users known not to be 50 cents: Do they differ at the descriptive level?
d) Authorship attribution (text analysis): Look for inconsistencies or evidence suggesting different people posting under his account.
2. Identification
a) SE: cluster or at least use robust ones. See https://economics.mit.edu/sites/default/files/2022-09/When%20Should%20You%20Adjust%20Standard%20Errors%20for%20Clustering.pdf
b) Multicolinearity: calculate VIF and examine its level; If severe, try dropping vars that lack predictive power.
c) OVS
i. # of posts each user writes (after his account was created, which likely correlates with repu; Or set Y = # posts liked / # all posts; beta regression or something else considering that Y belongs to [0,1]
ii. # of likes he received by each user
d) Note that likes differ by post type (article, question, article reply, question reply…) Might estimate at a more granular level by distinguishing between them.
3. Specification: instead of user level, you could also predict his behavior (like, none, dislike) at post level
a) Y = -1, 0, 1 -> multinomial probit or something suitable?
b) Control for post chars like length of post, # of views, # of likes (in total or by others in his clique), creator FE, time FE, (and others that you can possibly assign using ML, like topic, sentiment, political stance, radicalism etc.)
4. Robustness check
1. Descriptive: might be interesting to look at
a) Interactive behavior: does he only like posts by a certain group of users, who exclusively like back within a clique?
b) Comparison with users he likes the most / that like him the most: are there similar patterns between their behavior and his (active days, liking behavior, etc.)?
c) Comparison with other users, or users known not to be 50 cents: Do they differ at the descriptive level?
d) Authorship attribution (text analysis): Look for inconsistencies or evidence suggesting different people posting under his account.
2. Identification
a) SE: cluster or at least use robust ones. See https://economics.mit.edu/sites/default/files/2022-09/When%20Should%20You%20Adjust%20Standard%20Errors%20for%20Clustering.pdf
b) Multicolinearity: calculate VIF and examine its level; If severe, try dropping vars that lack predictive power.
c) OVS
i. # of posts each user writes (after his account was created, which likely correlates with repu; Or set Y = # posts liked / # all posts; beta regression or something else considering that Y belongs to [0,1]
ii. # of likes he received by each user
d) Note that likes differ by post type (article, question, article reply, question reply…) Might estimate at a more granular level by distinguishing between them.
3. Specification: instead of user level, you could also predict his behavior (like, none, dislike) at post level
a) Y = -1, 0, 1 -> multinomial probit or something suitable?
b) Control for post chars like length of post, # of views, # of likes (in total or by others in his clique), creator FE, time FE, (and others that you can possibly assign using ML, like topic, sentiment, political stance, radicalism etc.)
4. Robustness check