首页 > 解决方案 > 熊猫中没有正确可视化箱线图

问题描述

有一个清晰的、准备好的可视化数据集。

        category_id             views   likes   dislikes    comment_count
0       politics/celebrities    34785     308    26         413
1       talk show               69844     3417   33         160
2       talk show               1496225   16116  236        605
3       talk show               1497519   15504  353        1084
4       various video           225286    1731   193        206
... ... ... ... ... ...
4119    music clips             6004782   210802 4166       15169
4120    talk show               5564576   46351  2295       2861
4121    music clips             5534278   45128  1591       806
4122    music clips             23502572  676467 15993      52432
4123    talk show               1066451   48068  1032       3992

当试图在箱线图上用

data.boxplot('views')

采取不正确的可视化

在此处输入图像描述

而不是普通的箱线图类型。在数据集的一小部分(数据 [0:10])上它工作正常,但在整个集合上 - 不。怎么了?

标签: pythonpandasdata-visualization

解决方案


正如我在评论中所说,您views可能遵循Zipf 定律分布

为了用一个可重现的例子来说明,让我们使用维基百科在en.wikipedia.org一天内排名前 1000 的文章的页面浏览量:

import urllib.request, json 

url = 'https://wikimedia.org/api/rest_v1/metrics/pageviews/top/en.wikipedia.org/all-access/2021/04/11'
with urllib.request.urlopen(url) as f:
    data = json.loads(f.read().decode())

df = pd.json_normalize(data, ['items', 'articles'])

请注意,仅绘制箱线图views与您观察到的非常相似:

df.boxplot('views')

现在这里是 loglog 图,它显示了该数据的 Zipf 定律的独特说明:

(事实证明,排名已经包含在上面的维基百科数据中,但为了通用性,我们将再次计算它)。

plt.loglog(df['views'].rank(ascending=False), df['views'])
plt.grid(True)
plt.xlabel('rank')
plt.ylabel('views')
plt.title('en.wikipedia views of top 1000 articles\non 2020-04-11')

考虑到这一点,您可以看到“异常值”的概念是如何难以为幂律定义的。再多的过滤也无助于您的箱线图,因为这样的分布大致是尺度不变的。


推荐阅读