Python seaborn-2-histogram & boxplot

Python seaborn-2-histogram & boxplot

Python 数据可视化 (data visualization)库 – seaborn,该库的底层是 matplotlib,。但 seaborn 比 matplotlib 更简单,也更现代化一点。本问着重介绍统计学使用的各种图表以及 seaborn 中对应的使用。

本文是第二节,讲述 seanborn 的 直方图(histogram) 和 箱型图 (boxplot) 的绘制

数据集来源下面有给出,使用 pandas package 表征数据,后面可能会出 pandas 使用的小节

reference: python graph gallery

在所有代码前面都要下面的句子

1. 直方图 (histogram)

单变量用直方图表示非常方便, seaborn 库使用 distplot 函数

参数:

  • hist: bool, whether to plot a (normed) histogram
  • kde: bool , Whether to plot a gaussian kernel density estimate (高斯核概率密度估计).
  • rug: bool , whether to draw a rugplot on the support axis
  • {hist, kde, rug, fit}_kws: dictionaries: keyword arguments for underlying plotting functions

参数:

  • vertial: bool , If True, observed values are on y-axis

1.1 直方图和箱型图搭配

首先使用 subplots 分割, create a figure and a set of subplots

参数:

  • nrows, ncols: int, optional number of rows / columns of the subplot grid
  • sharex, sharey: bool or {'none', 'all', 'row', 'col'}
    • True or ‘all’: x- or y-axis will be shared among all subplots.
    • False or ‘none’: each subplot x- or y- axis will be independent.
    • ‘row’: each subplot row will share an x- or y-axis.
    • ‘col’: each subplot column will share an x- or y-axis.

返回值:

  • fig: class matplotlib.figure.Figure object

  • ax: Axes object or array of Axes objects
    这里一定要理解 axesaxis 是不同的,axes 基本和 subplot 是一个意思,表示一个子图,包含两个轴 x axisy axis

回到 sns.distplot() 的参数:

  • ax: matplotlib Axes, optional Axes object to draw the plot onto, otherwise uses the current Axes. 指定绘图的坐标轴

1.2 多变量直方图

第一个方法是在同一个 figure 中绘制多个 variables

第二个方法是在多个 subplot 中绘制多个

2. 箱型图 (boxplot)

箱型图可以对数值变量有形象的总结。

It gives a nice summary of one or several numeric variables. The line that divides the box into 2 parts represents the median of the data. The end of the box shows the upper and lower quartiles. The extreme lines shows the highest and lowest value excluding outliers (奇值).

2.1 outlier

先解释下什么是 outlier ? 参考 一个Outlier的江湖 – 经典统计观

  1. 奇值 (outlier): 合理的 (explainable) 小概率事件 (rare)
  2. 异值(anomaly): 不合理的小概率事件

小概率事件: 一种可视化是看频率分布,在频率直方图 (frequency histogram), 如果部分数据原理高频中心 (3倍标准差之外),而且频率很低,那么很可能是 outlier. 另一种可视化是直接看空间分布,点分布图 (points plot) 是最直观的空间分布图,如果数据远离聚集 (cluster) 中心,而且很稀疏,那么很可能是 outlier

首先看下熟悉的正态分布,\([-\sigma, \sigma]\) 的范围为 68.2%, \([-2 \sigma, 2 \sigma]\) 的范围为 95.4%, \([-3 \sigma, 3 \sigma]\) 区间的范围为 99.7%。

因此我们把 \([-3 \sigma, 3 \sigma]\) 范围之外的称为小概率事件

2.2 boxplot 的含义

在变量分布未知的情况,我们一般可以假设为正态分布

Box-n-Whisker Plot (BWP) 采用四分位 (quartile)。先按 中位值(median) 一分为2,然后再按 25% 的值和 75% 的值定义出来 Q1 (1分位) 和 Q3 (3分位)点。

定义: \(IQR\)(inter quartile range) = Q3 – Q1: 中心值周围 50% 的范围

于是,我们看到:

\(1 \; IQR \to 50\%\) 中心范围, \([-\sigma, \sigma] \to 68\%\) 中心范围, 于是: \[
1 \; IQR \approx [- {50 \over 68}\sigma, {50 \over 68} \sigma] \approx [- 0.7\sigma, 0.7\sigma] \approx 1.4 \sigma
\]
于是: \(1.5 IQR \approx 2.1 \sigma\), 推出: \[
1.5 IQR + 1 IQR + 1.5 IQR \approx 2.1 \sigma + 1.4 \sigma + 2.1 \sigma = 5.6 \sigma \approx [-3 \sigma, 3 \sigma]
\]
也就是说,在 \(IQR\) 两端分别向外扩展 \(1.5IQR\) ,获得 inner fence (\(3\sigma\)), 之外的就是疑是 outlier 点 (suspected outlier)。继续向外扩展 \(1.5 IQR\) ,获得 outer fence,在这个边界之外肯定是 outlier

总结一下:

  • 如果 \(P \gt Q3 + 1.5 IQR\) 或者 \(P \lt Q1 – 1.5 IQR\)
    P 是 Outlier / Suspected Outlier。

  • 如果 \(P \gt Q3 + 3 IQR\) 或者 \(P \lt Q1 – 3 IQR\)
    P 是 Extreme Outlier / Outlier 。

2.3 seaborn 表示

首先展示单变量,多变量箱型图展示。然后如果 x axis

参数:

  • linewidth: float width of the gray lines that frame the plot elements
  • notch: boolean whether to “notch” the box to indicate a confidence interval for the median
  • width: float width of a full element should be shifted along the categorical axis.

参考前面博客 seaborn color, 这里给出颜色定制的多种方案:

下图一次展示使用 palette 色彩面板,以及 color 单色,指定颜色的 palette (分别用 dict 和 list 两种方式演示),第5幅其实还是 palette 的使用,只是使用了 pandas 和 generator 的技巧而已。最后一个就当见过吧,感觉要对 matplotlib 很熟悉才可以做出来

参数 hue 可以实现 grouped boxplot

参数 order, hue_order 实现自定义显示顺序

Order to plot the categorical levels in, otherwise the levels are inferred from the data objects.

add jitter over box 增加可视化

One thought on “Python seaborn-2-histogram & boxplot

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d 博主赞过: