箱线图(Box Plot)理论篇

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了箱线图(Box Plot)理论篇相关的知识,希望对你有一定的参考价值。

参考技术A

记得之前应该整理过的,但是找不到了,就再来一次吧

箱形图又称为盒须图、箱线图

箱形图针对的是单一变量,可以用来识别异常值

要理解和使用箱形图,需要搞清楚几个概念:

有两个点注意下:
从小到大排列
分成四等份

对于这三个分割点:

Q3与Q1的差距又称为四分位距(InterQuartile Range, IQR)

这个图呢,大概是说,为什么上边界和下边界之外的数据,也就是离群值(异常值)可以忽略掉的原因,貌似就是传说中的3σ原则

我看这里还会标注离群值和极端值,上、下边界外的值

使用Excel、Python或者其他工具画箱线图很容易,但是,通过这个图到底可以得到些什么启示呢?

感觉使用箱线图,是为了看数据的分布情况,看数据集中在哪里,分布有什么特征,数据是集中在较小值一侧还是较大值一侧,有没有异常值

这些资料都没啥特别的,刚才找到篇文章,狗熊会的,不错,对这个箱线图的使用场景算是来个对比,分享下

先附上原文地址: 丑图百讲 | 箱线图应该怎么用

箱线图是针对连续性变量使用的

我们也来看个实际例子,我就使用seaborn中的数据集好了

因为这里,并没有显示具体的各项指标数据,我们可以结合 describe 函数

也就是说,小费的中位数是2.9美元(不知道单位是啥,就当美元吧)
Q1是2美元,Q3是3.5625美元,50%的数据都集中在这个区间内
异常值都集中在上限

中位数和平均值比较接近

其实用箱线图来展示这个小费的分布,并不是非常好,如果用直方图的话,更加的直观

看,数据的集中程度,更加的明显一些

不是所有的数据都适合话箱线图,如果你的箱线图画出来就是一条横线,或者很扁,那就赶紧换一种图吧

通常有2个原因导致这种情况:

原作者总结的很好,直接贴过来了,学习下

作者还说了,这里有一种解决办法,就是做 对数变换
但是,我目前还不是很理解,做了对数变换,数据不就变了吗,这个展示出来没有影响嘛?又为什么可以这样做呢?
等我研究明白了再说

箱线图到底怎么用

配合着定性变量画分组箱线图,作比较!
我理解的是,在不同维度下,对数据进行对比,可以使用箱线图

作者整理了几点箱线图的特点,这里分享下:

嗯,学习了,还是得专业的人来分享

这一篇理论篇先到这,我去整理下seaborn中绘制boxplot

尝试使用 df.plot(kind='box) 创建多个箱线图并收到“IndexError: index 0 is out of bounds for axis 0 with size 0”

【中文标题】尝试使用 df.plot(kind=\'box) 创建多个箱线图并收到“IndexError: index 0 is out of bounds for axis 0 with size 0”【英文标题】:Trying to create multiple boxplots using df.plot(kind='box) and receiving "IndexError: index 0 is out of bounds for axis 0 with size 0"尝试使用 df.plot(kind='box) 创建多个箱线图并收到“IndexError: index 0 is out of bounds for axis 0 with size 0” 【发布时间】:2021-10-26 21:02:39 【问题描述】:

我正在完成 Jason Brownlee 的“Machine Learning Mastery with Python”中的练习,在第 21 章中,我们使用Sonar dataset found in the UCI repository。

我已阅读 sonar.all-data 文件:

file = 'datasets/sonar.all-data'
df = pd.read_csv(file, sep=',', header=None)

数据的形状为(208, 61)

我现在想创建一个箱线图网格,将 df 中的每一列作为它自己的图。

df.plot(kind='box', subplots=True, layout=(8,8),
        sharex=False, sharey=False, figsize=(12, 12))

在笔记本中执行此代码时,出现以下错误:

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
~/Desktop/Python/Machine Learning Mastery with Python/mlmp_venv/lib/python3.9/site-packages/pandas/core/series.py in __setitem__(self, key, value)
   1061         try:
-> 1062             self._set_with_engine(key, value)
   1063         except (KeyError, ValueError):

~/Desktop/Python/Machine Learning Mastery with Python/mlmp_venv/lib/python3.9/site-packages/pandas/core/series.py in _set_with_engine(self, key, value)
   1094         # fails with AttributeError for IntervalIndex
-> 1095         loc = self.index._engine.get_loc(key)
   1096         # error: Argument 1 to "validate_numeric_casting" has incompatible type

~/Desktop/Python/Machine Learning Mastery with Python/mlmp_venv/lib/python3.9/site-packages/pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

~/Desktop/Python/Machine Learning Mastery with Python/mlmp_venv/lib/python3.9/site-packages/pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: 0

During handling of the above exception, another exception occurred:

IndexError                                Traceback (most recent call last)
/var/folders/v1/yp29bgzj6631r45byvnx3tc00000gn/T/ipykernel_29179/2130552721.py in <module>
----> 1 df.plot(kind='box', subplots=True, layout=(8,8), sharex=False, sharey=False, figsize=(12,12));

~/Desktop/Python/Machine Learning Mastery with Python/mlmp_venv/lib/python3.9/site-packages/pandas/plotting/_core.py in __call__(self, *args, **kwargs)
    970                     data.columns = label_name
    971 
--> 972         return plot_backend.plot(data, kind=kind, **kwargs)
    973 
    974     __call__.__doc__ = __doc__

~/Desktop/Python/Machine Learning Mastery with Python/mlmp_venv/lib/python3.9/site-packages/pandas/plotting/_matplotlib/__init__.py in plot(data, kind, **kwargs)
     69             kwargs["ax"] = getattr(ax, "left_ax", ax)
     70     plot_obj = PLOT_CLASSES[kind](data, **kwargs)
---> 71     plot_obj.generate()
     72     plot_obj.draw()
     73     return plot_obj.result

~/Desktop/Python/Machine Learning Mastery with Python/mlmp_venv/lib/python3.9/site-packages/pandas/plotting/_matplotlib/core.py in generate(self)
    286         self._compute_plot_data()
    287         self._setup_subplots()
--> 288         self._make_plot()
    289         self._add_table()
    290         self._make_legend()

~/Desktop/Python/Machine Learning Mastery with Python/mlmp_venv/lib/python3.9/site-packages/pandas/plotting/_matplotlib/boxplot.py in _make_plot(self)
    144                 )
    145                 self.maybe_color_bp(bp)
--> 146                 self._return_obj[label] = ret
    147 
    148                 label = [pprint_thing(label)]

~/Desktop/Python/Machine Learning Mastery with Python/mlmp_venv/lib/python3.9/site-packages/pandas/core/series.py in __setitem__(self, key, value)
   1065             if is_integer(key) and self.index.inferred_type != "integer":
   1066                 # positional setter
-> 1067                 values[key] = value
   1068             else:
   1069                 # GH#12862 adding a new key to the Series

IndexError: index 0 is out of bounds for axis 0 with size 0

有人可以帮我理解这个错误的含义、导致错误的原因以及如何解决它吗?

提前致谢!

【问题讨论】:

此错误表示索引key 为零,并且变量values 的大小也为0。values 的形状是什么? 【参考方案1】:

如果列标题未命名,则此箱线图不起作用。为每一列命名后,箱形图应该可以工作了。

【讨论】:

以上是关于箱线图(Box Plot)理论篇的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 df.plot(kind='box) 创建多个箱线图并收到“IndexError: index 0 is out of bounds for axis 0 with size 0”

07-matplotlib-箱线图

更改 seaborn 箱线图中的 X 轴标签

扩增子图表解读1箱线图:Alpha多样性

结合 plt.plot(x,y) 与 plt.boxplot()

通过箱线图判断偏向