第4章 分布可视化:直方图与核密度图——观察有效性率的分布形态

4.1 为什么要看分布形态?

我们做化学有效性率分析,手头一堆数据——几十次、几百次实验的有效性率。光看平均值和标准差,够吗?

不够。我遇到过不止一个项目,大家盯着平均有效性率 72% 觉得还不错,结果画出来一看,数据是双峰的:一批集中在 85% 以上,另一批掉到了 55% 以下。平均值把两拨人强行撮合在一起,掩盖了真实问题。

分布可视化,说白了就是让你「看见」数据的全貌。它能告诉你:

  • 数据是单峰还是多峰?
  • 有没有异常的离群点?
  • 分布是对称的还是偏斜的?
  • 大部分实验集中在什么区间?

直方图和核密度图,是干这活最常用的两个工具。我个人的习惯是,先快速画个直方图看个大概,再用核密度图做平滑判断。两者配合,心里就有底了。

4.2 直方图:最朴素的分布观察工具

直方图不复杂。你把有效性率从 0% 到 100% 切成若干区间(也叫「组距」或「桶」),数一数每个区间里落了多少个数据点,然后画成柱子。

举个例子,假设我们有 50 组实验的有效性率数据:

有效性率(%): 68, 72, 85, 91, 67, 73, 88, 94, 70, 76,
               82, 79, 85, 90, 66, 71, 84, 89, 75, 78,
               83, 87, 92, 69, 74, 80, 86, 93, 77, 81,
               95, 65, 73, 84, 88, 91, 70, 76, 82, 79,
               85, 90, 68, 72, 83, 87, 92, 69, 75, 80

把数据按 5% 的组距分组:

区间 (%) 频数 频率 (%)
65–70510
70–75816
75–801020
80–851224
85–90918
90–95510
95–10012

从这张表就能看出,大部分实验的有效性率集中在 75%–85% 之间。但注意,这只是 5% 组距下的情况。组距一变,图形就变了——这也是直方图一个挺让人头疼的地方。

关键点: 组距的大小直接影响直方图的「长相」。组距太大,细节全丢;组距太小,又容易受随机波动干扰,满屏锯齿。我一般会试 3–5 个不同的组距值,看哪个能稳定反映数据的整体趋势。

小技巧: 可以用 Freedman-Diaconis 公式估算组距——组距 = 2 * IQR * n⁻¹/³。它比凭感觉拍脑袋靠谱得多。

4.3 核密度图:平滑版的直方图

直方图有个「硬伤」:柱子边界是人为切的,数据稍微挪一点儿,可能就从这桶掉到那桶了。核密度图(KDE)就是为了解决这个问题来的。

它的思路是这样的——在每个数据点位置,叠一个平滑的「小丘」(核函数),然后把所有小丘加起来归一化。这样就得到了一条连续的曲线,不受组距的影响。

常见的核函数有这么几种:

核函数 公式 特点
高斯核K(u) = (1/√(2π)) * exp(-u²/2)平滑性最好,最常用
EpanechnikovK(u) = 0.75 * (1 - u²), |u| ≤ 1均方误差最优
三角核K(u) = 1 - |u|, |u| ≤ 1计算简单
均匀核K(u) = 0.5, |u| ≤ 1存在边界跳跃

实践中,我几乎只用高斯核。它生成的曲线最自然,不容易出现奇怪的拐角。

核密度图还有一个关键参数——带宽(bandwidth)。它决定了每个「小丘」的宽度。带宽越大,曲线越平滑,但可能抹掉真实结构;带宽越小,曲线越崎岖,容易把噪声当信号。

注意了: 带宽的选择比核函数的选择重要得多。我见过有人随便用默认带宽,结果多峰分布被平滑成了单峰,直接把重要发现给「平滑」掉了。建议对比 3 个带宽值(0.5×默认、默认、2×默认),看看结构是否稳健。

4.4 直方图 vs 核密度图:怎么选?

维度 直方图 核密度图
直观性非常好,非技术人员也能看懂需要一点解释
受参数影响组距敏感带宽敏感
多峰识别组距选对时可以通常比直方图更灵敏
离群点影响只在对应桶里加一根柱子会在离群点周围造一个「鼓包」
适合数据量大样本(≥50)表现稳定中小样本也能工作
重叠比较多个直方图叠在一起很难看多条密度曲线可以优雅叠加

我个人习惯是这么用:

  • 第一步: 用直方图做快速检查。选 2–3 个组距快速看一看,排除明显的数据错误。
  • 第二步: 用核密度图做精细判断。带宽用 Silverman 经验法则算一个初始值,再手动调 1–2 次确认稳定性。
  • 第三步: 如果发现多峰,去回溯实验条件,看看是不是不同批次、不同催化剂批次或不同操作员造成的。

4.5 实践中的坑与避坑指南

坑一:样本量太小还硬画分布

我曾经有一个项目,只有 12 组实验数据。甲方要求「画个分布看看」。直方图画出来全是锯齿,核密度图因为带宽灵敏度极高,每次跑出来的曲线都不一样。怎么办?我的做法是不画分布,改用散点排布图(strip plot),每个数据点画成一个点,一行排开,既保留了全部信息,又不误导人。

坑二:忽略边界效应

有效性率有天然的边界——0% 和 100%。高斯核是无界的,所以在边界附近会把质量「泄露」到界外。比如,有效性率 98% 的数据点,高斯核会往 100% 以上也分配一些密度。这就尴尬了。我一般用「反射边界法」或者直接截断处理。Python 的 seaborn 库有个 clip 参数,可以指定边界。

坑三:只看图形,不看数据量

两个 100 个样本的分布叠在一起,和两个 10 个样本的分布叠在一起,即使形状差不多,可信度天差地别。我会在图上标注样本量 n,看的人心里有数,不会被视觉误导。

4.6 案例实操:两组催化剂的有效性率对比

某次项目要对比 A、B 两种催化剂的有效性率。原始数据大概长这样:

cat A: 81, 84, 78, 92, 85, 79, 88, 83, 76, 90, 87, 82
cat B: 65, 72, 68, 70, 66, 71, 69, 73, 67, 74, 68, 70

A 组平均 83.75%,B 组平均 69.42%。光看均值,A 明显强于 B。但分布形态给了我们更多信息:

  • A 组分布较宽(标准差 4.9%),说明稳定性一般,有的实验做得好,有的差一些。
  • B 组分布极窄(标准差 2.7%),虽然整体偏低,但非常稳定。
  • 两个分布完全没有重叠——说明差异是系统性的,不是随机波动造成的。

这个结论对后续决策很有用:如果工艺要求稳定可靠,B 组反而更可控;如果追求最高效率,A 组的上限更高,但要接受它的波动。

经验之谈: 分布形态能告诉你「有没有重叠」。如果两组分布大面积重叠,均值差异可能没有实际意义。这种情况我在配方优化项目中遇到过好几次——算出来 p 值显著,但一画图,两组数据混在一起,根本没法在工程上区分。

4.7 本章知识体系

分布可视化知识体系 分布可视化知识体系 分布可视化 直方图 核密度图 (KDE) 组距选择 频数 vs 频率 组距敏感性问题 核函数选择 带宽 (bandwidth) 边界效应处理 实践:先直方图快速检查 → 再 KDE 精细判断 ⚠ 样本量 < 20 时 建议用散点排布图 替代直方图

4.8 小结

直方图和核密度图,就像分布可视化的「两条腿」。

  • 直方图简单直接,适合快速沟通和初步探索。
  • 核密度图平滑灵活,适合精细分析和多组对比。

别让工具的「默认参数」替你做决定。组距和带宽,手动调一调,对比看一看——你对自己数据的理解会深得多。遇到多峰分布也别慌,那往往是发现新故事的线索。