总结分布类相关的可视化图像
可视化图表矩阵
图表类型 | 数据维度 | 适合数据量 | 显示信息 | 异常值检测 | 交互性 |
---|---|---|---|---|---|
直方图 | 单变量 | 1k-1M | 频次分布 | ❌ | ❌ |
密度图 | 单/多变量 | 1k-100k | 概率密度 | ❌ | ✅ |
箱线图 | 单/多变量 | 10-10k | 五数概括 | ✅ | ❌ |
小提琴图 | 多变量 | 1k-100k | 密度形态 | ✅ | ✅ |
累积分布 | 单变量 | 任意 | 概率累积 | ❌ | ✅ |
蜂群图 | 单变量 | 10-1k | 原始分布 | ✅ | ❌ |
Q-Q图 | 单变量 | 任意 | 分布检验 | ✅ | ❌ |
豆荚图 | 多变量 | 1k-100k | 多峰分布 | ✅ | ✅ |
核心图表详解
一、 直方图(Histogram)
-
视觉特征:柱状堆积形态,X轴为数据分段,Y轴为频数
-
最佳实践:
-
使用Sturges公式计算最佳bins:
bins = 1 + log2(N)
-
叠加KDE曲线显示概率密度趋势
-
1. 直方图(Histogram)
特点:
用矩形条(bin)的高度表示数据落入某区间的频数或频率。
分箱数(bins)影响分布形态的呈现,需根据数据量调整。
直观但非连续,适合展示数据的粗略分布结构。
应用场景:
快速查看数据的分布形状(如是否对称、是否存在多峰)。
对比不同组数据的分布差异(叠加直方图)。 -
# 完整直方图代码 import matplotlib.pyplot as plt import seaborn as sns import numpy as np # 生成数据:均值为0,标准差为1的正态分布,1000个样本点 data = np.random.normal(loc=0, scale=1, size=1000) # 创建画布 plt.figure(figsize=(10, 6)) # 绘制直方图(分30个区间,禁用KDE曲线) sns.histplot( data=data, bins=30, # 分箱数,值越大柱子越细 kde=False, # 不显示密度曲线 color='#1f77b4', edgecolor='white' ) # 添加标题和标签 plt.title('Histogram of Normal Distribution', fontsize=14, pad=20) plt.xlabel('Value', fontsize=12) plt.ylabel('Frequency', fontsize=12) # 显示网格线 plt.grid(axis='y', linestyle='--', alpha=0.7) # 显示图形 plt.show()
结果:生成蓝色直方图,横轴为数值区间,纵轴为频数。柱子高度反映各区间数据量,正态分布数据集中在均值0附近,两侧对称
二、 密度图
密度图(Density Plot)是一种基于核密度估计(KDE)的可视化工具,用于展示连续变量的概率密度分布。它通过平滑的曲线表示数据的分布情况,横轴表示数据值,纵轴表示概率密度。密度图能够清晰地展示数据的分布形态,如对称性、偏态、多峰性等,帮助用户更好地理解数据的集中趋势和离散程度。密度图常用于比较多个数据集的分布情况,特别是在需要展示数据的细微变化时。特点:通过核密度估计(KDE)生成连续平滑曲线,反映概率密度,曲线下面积为1,便于对比不同数据集的分布形态,可能因带宽选择过度平滑或欠平滑。
应用场景:展示连续变量的概率密度分布,对比多个分布的形状。import matplotlib.pyplot as plt import seaborn as sns import numpy as np plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False data1 = np.random.normal(-1, 0.8, 300) data2 = np.random.normal(2, 1.2, 700) data = np.concatenate([data1, data2]) plt.figure(figsize=(10,6)) sns.kdeplot(data, color='purple', label='默认带宽', fill=True) sns.kdeplot(data, bw_adjust=0.3, color='orange', label='宽带=0.3', fill=True, alpha=0.3) plt.title('核密度估计图:带宽调整对比') plt.legend() plt.show()
三、箱线图
1.概念
箱线图(Box Plot),又称盒须图,是一种常用的统计图表,用于展示一组数据的分布特征。箱线图(箱形图、盒须图)是一种基于5个统计量(上边界、上四分位数、中位数、下四分位数以及下边界)显示数据分布的标准化方法,其可以用来检测数据的异常值和数据分布的形状,以及数据集的离散程度。它通常由一个矩形盒子和两端的“须”组成。矩形框显示数据集的上下四分位数,而矩形框中延伸出的线段(触须)则用于显示其余数据的分布位置,剩下超过上下四分位间距的数据点则被视为“异常值”。2.特点
(1)展示数据的五个重要数值
最大值:数据集中最大的一项,通常是数据中不被认为是异常值的最大值。
最小值:数据集中最小的一项,通常是数据中不被认为是异常值的最小值。
中位数:数据的中间值,将数据集分成两半。
上四分位数(Q3):数据集中第75%的数据小于等于该值。
下四分位数(Q1):数据集中第25%的数据小于等于该值。
(2)箱线图通过在“须”的范围外绘制离群点来标识数据中的异常值。通常,离群点是指大于Q3 + 1.5 * IQR 或小于 Q1 - 1.5 * IQR 的数据点,其中 IQR(Interquartile Range)是 Q3 - Q1 的差值。
(3)箱线图能够直观地展示数据的分布范围、集中趋势以及分散程度。中位数和四分位数的相对位置可以揭示数据的对称性或偏态。
(4)箱线图特别适用于比较多个数据集的分布情况。通过将多个箱线图绘制在同一坐标系中,可以直接比较它们的中位数、四分位数、最大值、最小值以及离群点。
(5)箱线图适用于连续型数据,特别是在数据分布比较复杂时,能够提供清晰的统计描述。3.应用场景
(1)数据分布与对称性分析:箱线图能帮助分析数据是否对称或偏斜。例如,如果中位数偏离箱体的中心,或者上四分位数和下四分位数的间距不对称,可能表示数据存在偏态。
(2)异常值检测:箱线图通过识别位于“须”之外的数据点(即离群点),能够快速帮助发现数据中的异常值。这在数据清洗和异常值检测中非常有用。
(3)比较不同组的分布:在进行分组比较时,箱线图能够直观地展示不同组数据的分布情况。例如,比较两种产品的价格分布,或者不同实验组的测量值分布。
(4)描述性统计分析:箱线图常常作为数据的初步分析工具,通过可视化的方式描述数据的中心位置、分散程度以及分布范围,是数据分析中的一个基础步骤。
(5)检验假设:箱线图可以用于探索是否存在组间差异。在进行假设检验之前,使用箱线图进行可视化能够帮助更直观地判断是否存在显著差异。
(6)检测数据的变化趋势:在时间序列数据中,箱线图可以帮助识别数据随着时间变化的趋势。例如,比较不同时间段(如按月、按季、按年)数据的分布差异。4.使用Python实现
用python绘制箱线图,绘制两种不同风格的箱线图:一个是标准的矩形箱线图,另一个是带有缺口的箱线图。通过对比观察不同样式的箱线图在展示数据分布、离群点等方面的差异,并且在每个箱体上使用不同的颜色来增强可视化效果。import matplotlib.pyplot as plt import numpy as np plt.rcParams['font.family'] = ["Times New Roman", 'SimSun'] # 生成一个包含三个随机数的数组,每个随机数包含100个数据,且他们的标准差分别为1,2,3 all_data = [np.random.normal(0, std, size=100) for std in range(1, 4)] labels = ['$x_1$', '$x_2$', '$x_3$'] fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(9, 4)) bplot_rect = ax1.boxplot( x=all_data, # 需要绘制的数据 vert=True, # 垂直排列箱线图 widths=0.3, # 箱形宽度 labels=labels, # 箱形图的标签 patch_artist=True, # 是否为箱子填充颜色,默认为False medianprops={ # 设置中位线属性 'linestyle': '-', 'color': 'r', 'linewidth': 1.5 }, showfliers=True, # 是否显示异常值,默认为True flierprops={ # 设置异常点属性 'marker': '^', 'markersize': 6.75, 'markeredgewidth': 0.75, 'markerfacecolor': '#ee5500', 'markeredgecolor': 'k' }, whiskerprops={ # 设置须的线条属性 'linestyle': '--', 'linewidth': 1.2, 'color': '#480656' }, capprops={ 'linestyle': '-', 'linewidth': 1.5, 'color': '#480656' } ) title_rect = ax1.set_title("矩形箱形图") bplot_notch = ax2.boxplot( x=all_data, # 需要绘制的数据 notch=True, # 是否带有缺口,默认False # vert=True, # 垂直排列箱线图,默认为True widths=0.3, # 箱形宽度 labels=labels, # 箱形图的标签 patch_artist=True, # 是否为箱子填充颜色,默认为False medianprops={ # 设置中位线属性 'linestyle': '-', 'color': 'r', 'linewidth': 1.5 }, showfliers=True, # 是否显示异常值,默认为True flierprops={ # 设置异常点属性 'marker': '^', 'markersize': 6.75, 'markeredgewidth': 0.75, 'markerfacecolor': '#ee5500', 'markeredgecolor': 'k' }, whiskerprops={ # 设置须的线条属性 'linestyle': '--', 'linewidth': 1.2, 'color': '#480656' }, capprops={ 'linestyle': '-', 'linewidth': 1.5, 'color': '#480656' }, ) title_notch = ax2.set_title("带有缺口的箱形图") colors = ['pink', 'lightblue', 'lightgreen'] for bplot in (bplot_rect, bplot_notch): for patch, color in zip(bplot['boxes'], colors): patch.set_facecolor(color) for ax in [ax1, ax2]: ax.yaxis.grid(True) ax.set_xlabel("样本") ax.set_ylabel("观测值") plt.show()
四、小提琴图
1.概念
小提琴图是一种数据可视化工具,用于展示数据的分布情况。它结合了 箱线图(Boxplot)和 密度图(Density Plot)的特点,既展示了数据的集中趋势和离散情况,又能够提供数据分布的详细形状。小提琴图的结构包括:中心的箱线图:表示数据的中位数、四分位数等统计信息,类似于传统的箱线图。左右的“对称”的密度曲线:显示数据的分布形态,类似于核密度估计(KDE),两侧对称地展示数据的概率密度,形状类似小提琴,因此得名。2.特点
(1)小提琴图不仅可以展示数据的集中趋势(如中位数、四分位数等),还可以显示数据的分布形态,帮助理解数据的集中区域、分布范围以及多峰性等特点。
(2)小提琴图的左右两边通常是对称的,这样可以清楚地看到数据分布的密度和形状。密度较大的区域会变得较宽,而密度较小的区域则较窄。
(3)小提琴图能够很好地展示不同类别或组的数据分布,尤其是在不同类别之间进行比较时,可以非常直观地看到它们的差异。
(4)与箱线图相比,小提琴图提供了更多的信息,能够展示分布的多个方面,而不仅仅是中位数和四分位数。
(5)小提琴图对于处理非对称数据和偏态数据非常有效,可以帮助揭示数据分布的偏斜程度。3.应用场景
(1)数据分布的可视化:小提琴图非常适合用于查看单个变量或多个变量的分布情况,尤其是在数据的分布呈现复杂性时(例如多峰分布、偏态分布等)。它比箱线图提供了更多的分布信息。
(2)多组数据的对比:在比较多个类别的数据时,小提琴图能够直观地展示各组数据的分布差异。例如,比较不同产品或不同组别的销售额、测试成绩等。
(3)探索性数据分析(EDA):小提琴图常用于探索性数据分析中,用于检查数据的分布、识别异常值、揭示数据模式等。它能快速帮助分析师识别数据的异常分布或潜在规律。
(4)统计学分析:在统计分析中,尤其是在需要对不同组的数据进行比较时(如实验组与对照组的比较),小提琴图是一个有效的工具。例如,比较两组病人群体的临床测试结果。
(5)医学和生物学研究:小提琴图广泛应用于生物学和医学研究中,帮助研究人员查看不同治疗组、不同实验组之间的分布差异,特别是在基因数据、实验结果等领域。
(6)教育和心理学研究:小提琴图也用于教育领域,例如比较不同教育方法或教学组的学习成绩分布,以揭示学习成果的差异性。4.使用Python实现
通过 seaborn 和 matplotlib 库绘制一个 小提琴图,展示周六周天不同性别客户在酒吧的消费额情况.import pandas as pd import matplotlib.pyplot as plt import seaborn as sns plt.style.use('ggplot') # 处理中文乱码 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] plt.rcParams['axes.unicode_minus'] = False tips = pd.read_excel(r"C:\Users\Desktop\酒吧消费数据.xlsx") print(tips.head()) sns.violinplot( x="day", # 指定x轴的数据 y="total_bill", # 指定y轴的数据 hue="sex", # 指定分组变量 data=tips, # 指定绘图的数据集 order=['Thur', 'Fri', 'Sat', 'Sun'], # 指定x轴刻度标签的顺序 scale='count', # 以男女客户数调节小提琴图左右的宽度 split=True, # 将小提琴图从中间割裂开,形成不同的密度曲线 palette='RdBu' # 指定不同性别对应的颜色(因为hue参数为设置为性别变量) ) plt.title('每天不同性别客户的酒吧消费额情况') plt.legend(loc='upper right', ncol=2) plt.axis([-0.5, 3.5, 0, 70]) plt.show()
-