作为示例应用程序,请考虑Stack Overflow用户的以下两个属性:信誉和配置文件视图计数。
可以预期,对于大多数用户来说,这两个值将成比例:高级代表用户会引起更多关注,从而获得更多的个人资料视图。
因此,搜索具有很多个人资料视图(相对于他们的整体声誉)的用户来说很有趣。
这可能表明该用户具有外部声誉。也许只是他们有有趣的古怪图片和名称。
从数学上来说,每个二维采样点都是一个用户,并且每个用户都有两个整数值,范围从0到+无穷大:
- 声誉
- 个人资料查看次数
预计这两个参数是线性相关的,我们希望找到与该假设最大离群的样本点。
天真的解决方案当然是只采用个人资料视图,按声誉划分和排序。
但是,这将导致结果在统计上没有意义。例如,如果一个用户回答问题,获得1个赞,并且由于某种原因有10个个人资料视图,很容易伪造,那么该用户将出现在一个更有趣的候选人面前,该候选人具有1000个赞和5000个个人资料视图。
在一个更“现实世界”的用例中,我们可以尝试回答“哪些创业公司是最有意义的独角兽?”。例如,如果您以很少的资金投资1美元,就会创建一个独角兽:https ://www.linkedin.com/feed/update/urn:li:activity: 6362648516858310656
混凝土清洁易用的真实世界数据
要测试您的问题的解决方案,您可以使用从2019-03年Stack Overflow数据转储中提取的这个小型文件(压缩后为7500万,用户约为1000万):
wget https://github.com/cirosantilli/media/raw/master/stack-overflow-data-dump/2019-03/users_rep_view.dat.7z
7z x users_rep_view.dat.7z
生成的UTF-8编码文件users_rep_view.dat
具有非常简单的纯文本空间分隔格式:
Id Reputation Views DisplayName
-1 1 649 Community
1 45742 454747 Jeff_Atwood
2 3582 24787 Geoff_Dalgas
3 13591 24985 Jarrod_Dixon
4 29230 75102 Joel_Spolsky
5 39973 12147 Jon_Galloway
8 942 6661 Eggs_McLaren
9 15163 5215 Kevin_Dente
10 101 3862 Sneakers_O'Toole
这是数据在对数刻度上的样子:
这样一来,看看您的解决方案是否真的可以帮助我们发现新的未知古怪用户就很有趣了!
初始数据是从2019-03数据转储中获得的,如下所示:
wget https://archive.org/download/stackexchange/stackoverflow.com-Users.7z
# Produces Users.xml
7z x stackoverflow.com-Users.7z
# Preprocess data to minimize it.
./users_xml_to_rep_view_dat.py Users.xml > users_rep_view.dat
7z a users_rep_view.dat.7z users_rep_view.dat
sha256sum stackoverflow.com-Users.7z users_rep_view.dat.7z > checksums
的来源users_xml_to_rep_view_dat.py
。
通过重新排序选择离群值之后users_rep_view.dat
,您可以获取带有超链接的HTML列表,以通过以下方式快速查看热门选择:
./users_rep_view_dat_to_html.py users_rep_view.dat | head -n 1000 > users_rep_view.html
xdg-open users_rep_view.html
的来源users_rep_view_dat_to_html.py
。
该脚本还可以作为如何将数据读入Python的快速参考。
手动数据分析
通过查看gnuplot图,我们立即看到了预期结果:
- 数据是大致成比例的,对于低代表或低观看次数用户而言,差异更大
- 低代表或低浏览量用户更清晰,这意味着他们具有较高的帐户ID,这意味着他们的帐户是较新的
为了获得有关数据的直观信息,我想在一些交互式绘图软件中深入挖掘一些要点。
Gnuplot和Matplotlib无法处理如此大的数据集,因此我第一次给VisIt做了一个尝试,它起作用了。这是我尝试过的所有绘图软件的详细概述:https : //stackoverflow.com/questions/5854515/large-plot-20-million-samples-gigabytes-of-data/55967461#55967461
OMG很难运行。我不得不:
- 手动下载可执行文件,没有Ubuntu软件包
- 通过
users_xml_to_rep_view_dat.py
快速黑客攻击将数据转换为CSV,因为我不容易找到如何用空格分隔的文件来填充数据(经验教训,下一次我将直接使用CSV) - 与使用者介面战斗3小时
- 默认的点大小是像素,这会与屏幕上的灰尘混淆。移至10个像素球体
- 某个用户的个人资料视图为0,VisIt正确地拒绝执行对数图,因此我使用数据限制来摆脱这一点。这使我想起gnuplot是非常宽容的,并且会愉快地绘制您扔给它的任何东西。
- 添加轴标题,删除用户名以及“控件”>“注释”下的其他内容
在我厌倦了这项手动工作之后,这是我的VisIt窗口的外观:
这些字母是我使用很棒的“选择”功能手动选择的点:
- 您可以通过在“选择”窗口>“浮动格式”中增加浮点精度来查看每个点的确切ID
%.10g
- 然后,您可以使用“另存为”将所有手捡到的点转储到txt文件中。这使我们能够通过一些基本的文本处理来生成有趣的配置文件URL的可单击列表。
待办事项,学习如何:
- 查看配置文件名称字符串,默认情况下它们会转换为0。我刚刚将个人资料ID粘贴到浏览器中
- 一口气挑出矩形中的所有点
因此,最后,这几个用户可能会在您的订购中占据较高的位置:
具有大量观看次数和低信息量的非常低代表用户。
这些用户可能以某种方式重定向流量。
相关:有一个元线程,供用户处理著名的问题金牌徽章,但我现在找不到它。
如果此类用户太多,那么我们的分析将很困难,我们将需要尝试考虑其他参数以避免此类“欺诈”:
- 一个1 143100 2445750 https://stackoverflow.com/users/2445750/muhammad-mahtab-saleem
- D 60 51111 2139869 https://stackoverflow.com/users/2139869/xxn
- E 40 23067 5740196 https://stackoverflow.com/users/5740196/listcrawler
- 传真11 7738 3313079 https://stackoverflow.com/users/3313079/rikitikitaco
- G 136 11123 4102129 https://stackoverflow.com/users/4102129/abhishek-deshpande
- K 377 24453 1012351 https://stackoverflow.com/users/1012351/overstack
- L 1489 57515 1249338 https://stackoverflow.com/users/1249338/frosty
- M 1767 40986 2578799 https://stackoverflow.com/users/2578799/naresh-walia
- 我发现这个用户集群很有趣,所有这些都在图中附近:
- 电话58 4331 1818755 https://stackoverflow.com/users/1818755/eerongal
- 我103 4366 1816274 https://stackoverflow.com/users/1816274/angelov
- J 157 4688 688552 https://stackoverflow.com/users/688552/oylex
外在声望:
- O 29799 170854 2274694 https://stackoverflow.com/users/2274694/lyndsey-scottex维多利亚的秘密模型:https : //en.wikipedia.org/wiki/Lyndsey_Scott
- P 45742 454747 1 https://stackoverflow.com/users/1/jeff-atwood SO联合创始人
- 是29230 75102 4 https://stackoverflow.com/users/4/joel-spolsky SO联合创始人
- 信誉最高的用户倾向于获得更多的个人资料视图,因为它们出现在“信誉最高的用户” Google查询/列表中:
- U 542861 401220 88656 https://stackoverflow.com/users/88656/eric-lippert 涉及C#设计
- V 852319 396830 157882 https://stackoverflow.com/users/157882/balusc前2名用户,疯狂的答案数量
古怪的个人资料:
- N 13690 108073 63550 https://stackoverflow.com/users/63550/peter-mortensen那张照片!我也认为他以前是主持人。
- R 143904 144287 895245 https://stackoverflow.com/users/895245/ciro-santilli-%e6%96%b0%e7%96%86%e6%94%b9%e9%80%a0%e4%b8%ad %e5%bf%83996icu%e5%85%ad%e5%9b%9b%e4%ba%8b%e4%bb%b6
- T 291742 161929 560648 https://stackoverflow.com/users/560648/lightness-races-in-orbit
当时被暂停的高级用户。啊,您的代表愚蠢地遵循1条规则:
- B 1 77456 285587 https://stackoverflow.com/users/285587/your-common-sense
不确定,我很想说视图操作:
- 问65788 126085 50776 https://stackoverflow.com/users/50776/casperone
- S 15655 81541 293594 https://stackoverflow.com/users/293594/xnx
- W 12019 37047 2227834 https://stackoverflow.com/users/2227834/unheilig
- X 1421 27963 1255427 https://stackoverflow.com/users/1255427/jack-nicholson
可能的解决方案
我从https://www.evanmiller.org/how-not-to-sort-by-average-rating.html听说过威尔逊得分的置信区间,该区间 “使积极评分的比例与不确定性保持平衡少量的观察结果”,但我不确定如何将其映射到此问题。
在那篇博文中,作者建议使用该算法来查找具有比向下投票更多的投票的项目,但是我不确定同一想法是否适用于向上投票/个人资料视图问题。我当时想服用:
- 个人资料查看==在那里投票
- 在这里投票==在这里投票(均为“坏”)
但我不确定是否有意义,因为在上/下投票问题上,要排序的每个项目都有N 0/1个投票事件。但是关于我的问题,每个项目都有两个关联的事件:获取更新和获取配置文件视图。
有没有一种众所周知的算法可以为此类问题提供良好的结果?即使知道确切的问题名称也可以帮助我找到现有的文献。
参考书目
- https://meta.stackoverflow.com/questions/307117/are-profile-views-on-stack-overflow-positively-correlated-to-the-level-of-reputa
- 测试双变量离群值
- /programming/41462073/multivariate-outlier-detection-using-r-with-probability
- 有检测异常值的简单方法吗?
- 线性回归分析应如何处理离群值?
- https://math.meta.stackexchange.com/questions/26137/who-maximizes-the-ratio-of-people-reached-to-questions-answered
在Ubuntu 18.10,VisIt 2.13.3中进行了测试。