4. 探索性数据分析与分布初判

在完成输入参数的识别与数据采集之后,我们手里往往只有一张原始数据表:几百到几千行、若干列参数值。此时直接套用某个分布去拟合,风险很高——数据里可能藏着双峰、离群点、截断或量测分辨率造成的堆积,这些结构一旦被忽略,后续抽样就会系统性偏离真实不确定性。探索性数据分析(EDA)的任务,就是在拟合之前先用图形把数据的"形状"看清楚,并据此形成候选分布族的初步判断。

本节聚焦四类最常用的可视化工具:直方图、经验累积分布函数(ECDF)、箱线图与分位数图(Q-Q 图)。它们各自回答不同的问题,组合使用才能形成较完整的判断。

四类图形的分工

直方图回答"数据大致长什么样"。它把取值范围切成若干等宽区间,统计落入每个区间的样本数。观察要点包括:峰的数量(单峰还是双峰)、对称性(是否明显右偏)、尾部厚度(是否有长尾)、端点行为(是否在某个值处突然截断)。分箱数对形状影响很大,样本量 n 在数百量级时,可先用 Sturges 规则 k≈1+3.322·log₁₀n 起步,再上下调整观察稳定性;若形状随分箱数剧烈变化,说明样本不足或结构复杂,需要谨慎。

ECDF回答"任意阈值以下占多大比例"。它不需要分箱,因而没有分箱主观性,对样本量小的情况尤其稳健。ECDF 的斜率反映局部密度:斜率陡说明该区间样本密集,斜率平说明稀疏。两个 ECDF 的对比还能直观看出两组数据(例如不同工况、不同批次)是否整体平移或形状不同。

箱线图回答"中心、离散与离群点在哪里"。五数概括(最小值、Q1、中位数、Q3、最大值)加上 1.5 倍四分位距(IQR)规则的离群点标记,能快速暴露偏态(中位数不居中)和异常值数量。注意:箱线图对双峰不敏感,不能单独用来判断分布族。

分位数图(Q-Q 图)回答"数据与某个候选分布有多接近"。把样本分位数与候选分布的理论分位数作图,若数据来自该分布,点应大致落在 45° 参考线上。尾部偏离提示尾部行为不符(例如正态拟合下两端上翘说明实际尾部更厚),中部弯曲提示偏态或位置—尺度不匹配。Q-Q 图是"初判"阶段最有力的确认工具,但它是针对特定候选分布逐一检验的,因此需要先用前三类图缩小候选范围。

同一组右偏样本的四类图形判读 示例数据:n=300,右偏、单峰、上尾较厚(教学假设数据) ① 直方图:看峰数、偏态、尾部 参数取值 → 频数 单峰、右偏 长尾 ② ECDF:看比例与局部密度 F=0.5 参数取值 → 累积概率 中段陡:样本密集 尾部平缓 ③ 箱线图:看中心、离散、离群 Q1 Q3 中位数 1.5·IQR 外离群点 中位数偏左、上须长 → 右偏 ④ Q-Q 图:与候选分布逐点比对 理论分位数(候选分布)→ 样本分位数 上端偏离参考线 → 尾部更厚

从图形到候选分布族的判断逻辑

四类图形不是并列的,而是有先后与互补关系。一个可操作的判断顺序是:先用直方图与 ECDF 确定"单峰/多峰、对称/偏斜、有界/无界、尾部厚薄",再用箱线图核对离群点规模与中位数位置,最后用 Q-Q 图对 2~3 个候选分布逐一检验,看哪个在主体段与尾部都贴合得更好。

把常见形状与候选族对应起来,可以形成如下经验映射(仅作初判起点,最终仍需拟合优度检验):

图形特征 可能的候选分布族 需要进一步确认的点
单峰、对称、尾部中等 正态、t 分布 Q-Q 两端是否上翘(厚尾则倾向 t)
单峰、右偏、取值非负 对数正态、伽马、威布尔 取对数后是否近似对称;下端是否趋零
双峰或明显分组 混合分布,或数据本身含两个子总体 先追查分组变量(工况、批次、测点)
在某一端突然截断 截断正态、截断对数正态 截断点是物理限值还是筛选规则造成
离散取值、在整数处堆积 泊松、负二项、二项 方差与均值的关系(是否过度离散)

一个可复现的示例

假设某结构参数(教学假设数据,n=300)的直方图呈单峰右偏、取值全部为正、上尾较长;ECDF 中段陡、尾部平缓;箱线图中位数靠近 Q1、上须明显长于下须,1.5·IQR 之外有 4 个离群点;对正态做 Q-Q 图时两端明显上翘。综合判断:右偏、非负、厚尾,候选族优先考虑对数正态与威布尔,正态仅作为对照。下一步应对数据取自然对数后再看直方图与 Q-Q 图——若对数变换后近似对称且 Q-Q 贴合,则对数正态的可信度显著提高。

用 Python 快速完成上述探索的骨架如下(示例代码,数据需替换为实际样本):

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

x = np.asarray(samples)          # 一维样本数组

fig, ax = plt.subplots(2, 2, figsize=(10, 8))

# ① 直方图 + 核密度
ax[0, 0].hist(x, bins=20, density=True, alpha=0.6, color="#5aa9e6")
ax[0, 0].set_title("直方图")

# ② ECDF
xs = np.sort(x)
ys = np.arange(1, len(xs) + 1) / len(xs)
ax[0, 1].step(xs, ys, where="post", color="#1f8a70")
ax[0, 1].set_title("经验累积分布")

# ③ 箱线图
ax[1, 0].boxplot(x, vert=False)
ax[1, 0].set_title("箱线图")

# ④ Q-Q 图(以对数正态为候选)
stats.probplot(np.log(x), dist="norm", plot=ax[1, 1])
ax[1, 1].set_title("ln(x) 的正态 Q-Q 图")

plt.tight_layout()
plt.show()

注意最后一张图的做法:对右偏非负数据,直接对原值做正态 Q-Q 图几乎必然失败,正确做法是先取对数再检验其正态性,这等价于检验原值是否服从对数正态。这一"变换后再检验"的思路,是把图形判读转化为候选分布族结论的关键一步。

分位数图对样本量敏感:n 小于约 30 时,Q-Q 图两端点波动很大,不宜据此否定一个分布;此时应更依赖 ECDF 的整体形状与领域机理判断。
离群点不等于错误数据。在删除或修正之前,必须先追溯其来源(录入错误、量测异常、真实极端工况)。若确属真实极端值,应保留并在分布选择时考虑厚尾族,而不是简单剔除后拟合正态。

初判结论的记录方式

探索性分析的产出不应只是几张图,而应形成一条可追溯的判断记录,供后续拟合与校验环节复核。建议至少记录:样本量与来源、各图形的关键观察(峰数、偏态方向、离群点数量、Q-Q 偏离位置)、候选分布族排序及理由、以及被排除的分布族及排除依据。这样在后续做拟合优度检验(如 K-S、A-D 检验)时,若检验结果与初判冲突,就能快速定位是数据问题还是模型假设问题。

需要强调的是,EDA 阶段的结论是"候选"而非"定论"。图形判读带有主观性,不同人看同一张直方图可能给出不同分箱下的不同印象。因此初判的作用是缩小搜索空间、避免明显错误的分布假设,真正的取舍仍要交给参数估计与拟合优度检验。把这一步做扎实,后续的分布拟合才不至于在错误的方向上反复调整。