一个数据点上的 Pandas 箱线图错误

Posted

技术标签:

【中文标题】一个数据点上的 Pandas 箱线图错误【英文标题】:Pandas box plot error on one datapoint 【发布时间】:2018-04-28 19:33:51 【问题描述】:

我正在使用 pandas 绘制箱形图。

我的 DataFrame 是这样的

Year                 2013      2014      2015      2016      2017
dfMin            1.091603  0.973346  1.040000  0.855209  1.079500
dfLowerQuartile  1.727191  1.684009  1.275601  1.136703  2.262654
dfUpperQuartile  2.225000  2.000000  1.857570  2.120644  2.435724
dfMax            2.687323  2.350000  2.105000  2.250000  2.566467

我的图表代码是这样的

chartDF.boxplot(grid=False, figsize=(9,4))

导致这样的情节

我对 2017 年出现的较低价值感到困惑。

有人知道如何解决这个问题吗?

【问题讨论】:

【参考方案1】:

这是预期的行为。 2017 年的最小值比所提供的四个数据点的第一个四分位数低 1.5 IQR 以上,在这种情况下,最小值显示为异常值(一个点)。

从the docs 到whisboxplot强调我的):

whis:浮点数、序列或字符串(默认 = 1.5)

作为浮点数,确定胡须的范围超出第一和第三四分位数。换句话说,如果 IQR 是四分位数范围 (Q3-Q1),则上须线将延伸到小于 Q3 + whis*IQR) 的最后一个基准。同样,下须线将延伸到大于Q1 - whis*IQR 的第一个基准。 除须外,数据被视为异常值并绘制为单个点。将此设置为不合理的高值以强制胡须显示最小值和最大值。或者,将其设置为百分位数的升序(例如 [5, 95])以将须线设置在数据的特定百分位数。 最后,whis 可以是字符串 'range' 以强制胡须为数据的最小值和最大值

所以如果你想让胡须一直延伸,

df.boxplot(grid=False, figsize=(9, 4), whis='range')

【讨论】:

谢谢,我不知道异常值功能:) @HenrikPoulsen 但请记住,数据框中的索引 dfLowerQuartiledfUpperQuartile 不会被 boxplot 函数解释,它只是一个值!改组这些值根本不会改变最终的情节。 很酷的功能。尽管如果不小心,可能会伪装异常值,而实际上数据中存在异常值。 @Sosel 在这里提出了一个很好的观点 - 我假设你给了我们很好的四分位数,因为你知道它们对箱线图的重要性......请记住 boxplot 没有 i> - 它只是将每个值解释为一个数据点。 基本上我从另一个来源获取格式化数据,我将尝试直接从底层数据库获取数据,为自己节省几个步骤。但就异常值而言,数据是干净的,我们希望按顺序显示价差以说明几点,以及我们 2017 年的数据不完整的事实(我们正在测量 8000 之间的销售价格)大部分在每年一次的企业)【参考方案2】:

以下情况会发生什么?

import pandas as pd
df = pd.DataFrame("a": [1, 2, 2.1, 2.3])
df.boxplot()

它从这四个值中计算分位数,值 1 被解释为异常值。所以:您使用的实际索引将被忽略,pandas 将这些值作为数据点。

因此,实际上,与其自己设置最小值、最大值和分位数,不如将数据帧中的完整数据传递给箱线图。

【讨论】:

谢谢,我试试这个【参考方案3】:

这是 2017 年的异常值。如果您对该观察结果不感兴趣,您应该在数据集中删除它,因为它会改变相应统计测量的值。

【讨论】:

【参考方案4】:

这不是问题。基本上箱线图显示平均值周围的值。如果你有一个点超出矩形,这意味着具有该值的点是异常值。

更多关于异常值的信息:Outlier

【讨论】:

以上是关于一个数据点上的 Pandas 箱线图错误的主要内容,如果未能解决你的问题,请参考以下文章

Seaborn 和 Pandas,分组箱线图

同一图上 Pandas 数据框多列的箱线图(seaborn)

Pandas 按类别分组箱线图以比较 3 个数据集 Matplotlib

将实际数据覆盖在来自 pandas 数据框的箱线图上

箱线图按python pandas中的列分层

将分割图(点图)添加到分组箱线图 - Pandas 和 Seaborn