2. 描述性统计与数据探索

拿到一份数据后,第一件事不是急着套模型,而是先回答三个问题:数据长什么样、中心在哪里、离散程度有多大。描述性统计就是这套“体检工具”,它用少量指标把成千上万个观测值压缩成可比较、可判断的数字。本章围绕均值、方差、偏度、峰度四个核心统计量,配合箱线图、直方图、相关性热图,以及缺失值与异常值识别,最后在 MATLAB 实时脚本中完成一次完整的数据清洗实战。

一、四个核心统计量:位置、离散与形状

均值刻画数据的重心,对极端值敏感;中位数是排序后位于中间的值,抗干扰能力强。当均值明显大于中位数时,数据往往右偏。方差与标准差衡量数据围绕均值的波动,标准差与原数据同量纲,更便于解释。偏度(skewness)描述分布的不对称方向和程度:偏度大于 0 表示右尾较长,小于 0 表示左尾较长,接近 0 则近似对称。峰度(kurtosis)描述分布的尖峭或平坦程度,MATLAB 的 kurtosis 默认返回的是超额峰度,正态分布对应 0,大于 0 表示尖峰厚尾,小于 0 表示相对平坦。

这四个量构成一组互补的“位置—离散—形状”描述。仅看均值会掩盖波动,仅看方差会忽略偏斜,只有组合起来才能判断数据是否适合后续的均值检验、方差分析或回归建模。例如某批次零件尺寸均值为 50.02 mm、标准差 0.15 mm,看似稳定,但若偏度达到 1.8,说明存在少量偏大的异常件,需要进一步排查。

描述性统计四指标与分布形态对应关系 右偏(正偏) 中位数 均值 偏度 > 0 近似对称(正态) 均值≈中位数 偏度≈0,峰度≈0 左偏(负偏) 中位数 均值 偏度 < 0 均值 / 中位数 位置:中心在哪里 mean / median 方差 / 标准差 离散:波动有多大 var / std 偏度 形状:左右是否对称 skewness 峰度 形状:尖峭或平坦 kurtosis

二、箱线图与直方图:把数字变成图形

箱线图用五数概括(最小值、下四分位数 Q1、中位数、上四分位数 Q3、最大值)展示分布,箱体高度即四分位距 IQR = Q3 − Q1。MATLAB 中用 boxplot(x) 或 boxchart(x) 绘制,箱线图最实用的价值是异常值识别:通常把超出 [Q1 − 1.5×IQR, Q3 + 1.5×IQR] 的点标记为离群点。直方图则用 histogram(x) 展示频数分布,通过调整 BinWidth 可以观察不同粒度下的形态,判断是否双峰、是否长尾。

两者配合使用效果最好:直方图看整体形状,箱线图看分组差异和离群点。例如比较三条产线的产品重量,用 boxchart(group, weight) 可以一眼看出哪条产线中位数偏移、哪条产线离散更大。

三、相关性热图:变量之间的线性关系

多变量数据需要判断变量间是否高度相关,以避免回归中的多重共线性。计算相关系数矩阵 R = corr(X),再用 heatmap 或 imagesc 可视化。相关系数取值在 [−1, 1],接近 ±1 表示强线性相关,接近 0 表示线性关系弱。热图用颜色深浅表达强度,通常正相关用暖色、负相关用冷色,对角线恒为 1。需要注意:相关不等于因果,且 Pearson 相关系数只捕捉线性关系,遇到非线性或异常值时应结合散点图判断。

四、缺失值与异常值识别

缺失值在 MATLAB 中常用 NaN 表示,用 ismissing 或 isnan 检测,sum(isnan(x)) 统计数量。处理策略有三类:删除(rmmissing)、填充(均值、中位数、前向填充 fillmissing)、或保留并让模型自行处理。异常值识别除箱线图法则外,还可用 3σ 法则(超出均值 ±3 倍标准差)或 isoutlier 函数,后者支持 'quartiles'、'mean'、'median' 等多种方法。

异常值不等于错误值。它可能是录入错误,也可能是真实但罕见的极端事件。删除前必须结合业务背景判断,盲目删除会损失重要信息,甚至引入偏差。

五、MATLAB 实时脚本与数据清洗实战

实时脚本(.mlx)把代码、输出、图形和文字说明放在同一文档中,适合边探索边记录。下面给出一段可复现的清洗流程示例,数据为合理假设的某传感器 200 条读数,含少量缺失与异常。

% 1. 读取并查看数据概况
T = readtable('sensor_data.csv');
summary(T)

% 2. 缺失值检测与填充
missRate = sum(ismissing(T.value)) / height(T);
T.value = fillmissing(T.value, 'movmedian', 5);

% 3. 异常值识别(四分位法)
idxOut = isoutlier(T.value, 'quartiles');
fprintf('检测到异常值 %d 个\n', sum(idxOut));

% 4. 描述性统计
stats = [mean(T.value), std(T.value), ...
         skewness(T.value), kurtosis(T.value)];
disp(array2table(stats, 'VariableNames', ...
    {'均值','标准差','偏度','峰度'}))

% 5. 可视化
figure;
subplot(1,2,1); histogram(T.value, 20); title('直方图');
subplot(1,2,2); boxchart(T.value); title('箱线图');

运行后应重点观察:填充前后缺失率是否归零、异常值数量是否与箱线图标记一致、偏度峰度是否落在合理范围。若偏度绝对值大于 1 或峰度绝对值大于 3,说明分布明显偏离正态,后续若要做 t 检验或方差分析,应考虑变换或改用非参数方法。清洗完成后,建议把处理前后的统计量并列对比,形成可追溯的记录,这也是实时脚本相比普通脚本的最大优势。

数据探索的产出不是“跑完代码”,而是一份能支撑后续建模决策的判断:数据是否干净、分布是否可用、变量间是否存在冗余、异常是否需要单独处理。