4. 描述性统计分析:失效时间直方图、核密度估计、经验分布函数(EDF)、箱线图分析
拿到一批失效时间数据,第一件事是什么?
我个人习惯,不是急着套模型,而是先“看数据”。
就像医生看病,先望闻问切,再开药方。描述性统计分析,就是可靠性数据分析的“望闻问切”。
今天咱们聊聊四个最常用的工具:直方图、核密度估计、经验分布函数和箱线图。它们能帮你快速摸清数据的脾气。
4.1 失效时间直方图:最直观的“数据画像”
直方图,说白了就是把数据分成若干段,数一数每段里有多少个失效。
我在项目中遇到过一件事:某批轴承的寿命数据,直接看数字觉得挺正常。但画成直方图后,发现有两个“小山峰”。
嗯,这就是典型的双峰分布——说明这批产品可能混入了两种不同的失效模式。
核心要点:
- 组数选择:组太少会掩盖细节,组太多会显得杂乱。我一般用Sturges公式:k = 1 + 3.322 * log10(n)
- 组距:等距分组最常用,但数据稀疏时可以考虑不等距
- 解读重点:看形状(对称?偏态?)、看峰值(单峰?多峰?)、看尾部(长尾?截尾?)
举个例子,假设我们有50个电子元件的失效时间(单位:小时):
# Python代码示例
import numpy as np
import matplotlib.pyplot as plt
# 模拟数据
np.random.seed(42)
failure_times = np.random.weibull(2, size=50) * 1000
# 绘制直方图
plt.hist(failure_times, bins=8, edgecolor='black', alpha=0.7)
plt.xlabel('失效时间 (小时)')
plt.ylabel('频数')
plt.title('失效时间直方图')
plt.show()
你想想看,如果直方图显示大部分失效集中在早期,那说明产品存在“早期失效”问题。如果分布比较均匀,那可能是“随机失效”为主。
4.2 核密度估计:平滑版的直方图
直方图有个毛病——它受组距影响太大。换个组距,图形可能就变了样。
核密度估计(KDE)就是来解决这个问题的。它用平滑的曲线来估计概率密度,不依赖人为分组。
我的经验:
KDE特别适合小样本数据。我曾经处理过只有12个样本的现场失效数据,直方图根本看不出形状,但KDE清晰地显示了双峰特征。
KDE的核心思想:在每个数据点位置放一个“核函数”(通常用高斯核),然后叠加起来。带宽(bandwidth)是关键参数——带宽太小,曲线毛刺多;带宽太大,会过度平滑。
# KDE示例
from scipy import stats
# 计算KDE
kde = stats.gaussian_kde(failure_times)
x_range = np.linspace(0, max(failure_times)*1.2, 200)
density = kde(x_range)
# 绘制
plt.plot(x_range, density, 'r-', linewidth=2, label='KDE')
plt.hist(failure_times, bins=8, density=True, alpha=0.5, label='直方图')
plt.legend()
plt.show()
你看,KDE曲线和直方图的大趋势一致,但更平滑、更稳定。我个人习惯把两者叠加在一起看,互相验证。
4.3 经验分布函数(EDF):无参数的累积分布
经验分布函数,说白了就是“数据本身的累积分布”。
它不需要假设任何理论分布,直接根据数据计算:F(t) = (小于等于t的失效数) / (总样本数)
我记得有一次做可靠性验证,客户要求证明产品在1000小时内的可靠度不低于0.9。我直接用EDF一看,1000小时处的累积失效概率是0.12,可靠度0.88——没达标。简单直接,客户也信服。
EDF的优点:
- 无偏性:不依赖任何分布假设
- 一致性:样本量越大,越接近真实分布
- 直观性:每个点都代表一个真实观测
# EDF示例
from statsmodels.distributions.empirical_distribution import ECDF
ecdf = ECDF(failure_times)
plt.step(ecdf.x, ecdf.y, where='post', label='EDF')
plt.xlabel('失效时间 (小时)')
plt.ylabel('累积概率')
plt.title('经验分布函数')
plt.grid(True, alpha=0.3)
plt.show()
这里要注意:EDF是阶梯函数,不是平滑曲线。如果你需要平滑的累积分布,可以考虑用核密度估计的积分形式。
4.4 箱线图分析:一眼看出异常值
箱线图,我称它为“数据体检报告”。
它能同时展示:中位数、四分位数、异常值。一张图,数据分布的全貌就出来了。
避坑指南:
我曾经犯过一个错误:只看平均值,忽略了箱线图。结果一批数据里混入了几个极端值,把平均值拉高了很多。后来用箱线图一查,发现上边缘之外有3个点——原来是测试设备故障导致的异常数据。
箱线图的构成:
- 箱体:从Q1(25%分位)到Q3(75%分位),箱体高度就是IQR(四分位距)
- 中位线:箱体中间的线,代表50%分位
- 须线:从箱体延伸出去,通常到1.5倍IQR处
- 异常点:超出须线的点,用圆圈标记
# 箱线图示例
plt.boxplot(failure_times, vert=True, patch_artist=True)
plt.ylabel('失效时间 (小时)')
plt.title('失效时间箱线图')
plt.grid(True, axis='y', alpha=0.3)
plt.show()
你想想看,如果箱体很窄,说明数据集中;如果须线很长,说明数据分散;如果异常点很多,那就要警惕数据质量了。
4.5 四种方法的对比与选择
说了这么多,到底什么时候用哪个?
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 直方图 | 初步探索,大样本 | 直观、易理解 | 受组距影响大 |
| 核密度估计 | 小样本,需要平滑曲线 | 平滑、稳定 | 带宽选择有主观性 |
| 经验分布函数 | 无分布假设,精确计算 | 无偏、一致 | 阶梯状,不够平滑 |
| 箱线图 | 异常值检测,多组对比 | 信息量大、抗异常值 | 丢失细节信息 |
我个人习惯的流程是:先用箱线图检查异常值,再用直方图看整体形状,然后用KDE确认细节,最后用EDF做精确的累积概率计算。四步走,数据基本就摸透了。
4.6 知识体系总览
下面这张图,帮你理清这四种方法的关系和定位:
嗯,以上就是描述性统计分析的四个核心工具。记住,数据不会说谎,但前提是你得用对方法去看它。下次拿到失效数据,别急着套Weibull模型,先画几张图看看——你会发现很多有意思的信息。
公众号:蓝海资料掘金营,微信deep3321