如何找到在两个点的值之间具有统计上有意义的大离群比的样本点?


12

作为示例应用程序,请考虑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

这是数据在对数刻度上的样子:

在此处输入图片说明

gnuplot脚本

这样一来,看看您的解决方案是否真的可以帮助我们发现新的未知古怪用户就很有趣了!

初始数据是从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粘贴到浏览器中
  • 一口气挑出矩形中的所有点

因此,最后,这几个用户可能会在您的订购中占据较高的位置:

可能的解决方案

我从https://www.evanmiller.org/how-not-to-sort-by-average-rating.html听说过威尔逊得分的置信区间,该区间 “使积极评分的比例与不确定性保持平衡少量的观察结果”,但我不确定如何将其映射到此问题。

在那篇博文中,作者建议使用该算法来查找具有比向下投票更多的投票的项目,但是我不确定同一想法是否适用于向上投票/个人资料视图问题。我当时想服用:

  • 个人资料查看==在那里投票
  • 在这里投票==在这里投票(均为“坏”)

但我不确定是否有意义,因为在上/下投票问题上,要排序的每个项目都有N 0/1个投票事件。但是关于我的问题,每个项目都有两个关联的事件:获取更新和获取配置文件视图。

有没有一种众所周知的算法可以为此类问题提供良好的结果?即使知道确切的问题名称也可以帮助我找到现有的文献。

参考书目

在Ubuntu 18.10,VisIt 2.13.3中进行了测试。


1
我是新手,请随时编辑标题/问题以使术语更正确。谢谢。
Ciro Santilli冠状病毒审查六四事件法轮功

看起来您正在寻找异常值。我会在此空间中使用一种技术
概率

1
@probabilityislogic顺便说一句,我已经用一些易于使用的具体数据更新了这个问题。
Ciro Santilli冠状病毒审查六四事件法轮功

1
我只想说这不仅是一个有趣的问题,而且是非常具体且格式正确的。一个例子。干得好@Ciro!
朱利奥·塞萨尔·席尔瓦

1
@JulioCezarSilva谢谢!这次我没想到要学习高性能的交互式绘图,但是我做到了。经典。
西罗Santilli冠状病毒审查六四事件法轮功

Answers:


4

我认为Wilson得分的置信区间可以直接应用于您的问题。博客中使用的分数是置信区间的下限,而不是期望值。

解决此问题的另一种方法是将我们的估计值校正(偏向)于我们所掌握的某些先验知识,例如总体视图/重复率。

vñμσμ

μpμ

μ中号一个P=ñμ中号大号Ë+Cμ0ñ+C
ñCμ中号大号Ëμ0


为了比较这两种方法(Wilson得分置信区间下限和MAP),当有足够的数据(重复数)时,它们都可以提供准确的估计;当重复次数很小时,Wilson下限方法将偏向零,而MAP将偏向零。偏向均值。


1
感谢您的回复!我已经用一些具体且易于使用的数据更新了这个问题,让我们看看是否有人能够做出一些有趣的发现。
Ciro Santilli冠状病毒审查六四事件法轮功

1
@CiroSantilli新疆改造中心996ICU六四事件干得好!
dontloo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.