ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

葡萄酒评价中的统计检验与多指标建模

葡萄酒评价中的统计检验与多指标建模

简介:面向数学建模竞赛参赛者与统计分析学习者,这份2012年全国大学生数学建模竞赛A题一等奖论文围绕「葡萄酒的评价」给出了完整的获奖方案,可用于赛题复盘、统计建模方法对照与论文写作参考。全文以PDF形式收录,资源包共1个文件、约2.41MB,单篇论文结构完整,涵盖问题重述、模型假设、符号说明、模型建立与求解及模型推广等章节。论文针对评酒员评分差异与信度问题,运用K-S检验、Wilcoxon符号秩检验和肯德尔和谐系数进行非参数分析;通过主成分分析构建酿酒葡萄综合评价指标体系并完成分级,借助典型相关分析量化葡萄与葡萄酒理化指标间的联系,最后建立多元线性回归模型论证理化指标评价葡萄酒质量的可行性。目前已有2908人学习,适合需要理解统计模型选型、检验步骤与结果解释的读者按问题逐一拆解模仿。

1. 同一批酒、两拨评酒员:两组分数为什么不能直接取平均比高低

把同一批酒样分给两拨评酒员各自打分,再把两组总分并排放在一起,多数人的第一反应是比均值:哪组平均分高,哪组就“手松”。这个直觉在葡萄酒评价里会失效。两组均值的差距可能只来自一两个极端样本,而真正决定分数能不能用的,是十个人对二十多款酒给出的排序是否稳定。

这道题把葡萄酒评价拆成了四层递进:先确认评分数据服从什么分布,再用符号秩检验判断两组评价有没有系统性偏移,然后用肯德尔和谐系数比较哪一组的排序更整齐,最后才把挑选出的那组分数当作“质量标签”,去和理化指标建立联系。整套流程里,没有一步是“算个平均分”那么简单,每一步都在回答同一个问题:这个数字,凭什么可信。

2. 秩的杠杆:Wilcoxon 符号秩检验与肯德尔和谐系数如何拆开“差异”与“信度”

显著性差异和可信度是两件事。两组分数可以差异显著,但两组都很可信;也可以差异不显著,却两组都在乱打。论文把这两件事分给两个模型:Wilcoxon 符号秩检验管“有没有差异”,肯德尔和谐系数管“谁排得更一致”。分开处理,是整道题最关键的结构选择。

2.1 缺失值与异常值:显著性检验的前置清洗

原始评分表里既有缺失也有明显录入错误。第一组白葡萄酒品尝数据中,7 号品酒员对样品 3 的持久性打了 77 分,而相邻品酒员的分数在 5 到 7 之间——这是三位数落在个位数评分栏里的典型手工录入事故,不是“这位评酒员口味独特”。

处理策略分两种。缺失值用均值替换:把该品酒员在该项上剩余的有效评分求平均,填回空缺。论文给出的式子是 $\bar{x}^*=\left\lfloor \frac{1}{m-1}\sum_{k=1,k\neq m}^{10}x_k\right\rfloor$,取整是为了让填回去的值仍然落在评分表的整数刻度上。异常值则“先剔除、后替换”:先把 77 摘掉,再按同一列其余品酒员的均值补回。

均值替换能成立的前提是“同一酒样、同一项目上,十位评酒员的分差不大”。这个前提在本题的数据里大致成立,但它有一个隐性代价——替换会压缩方差。如果缺失是成片出现的,或者缺失本身和酒样质量相关(比如好酒的某几项没人愿意打低分),均值替换会把真实的离散度抹平,后面所有基于方差的检验都会被带偏。我一般会额外跑一遍“剔除含缺失样本”的对照组,两种处理下结论一致才敢往下走。

清洗完的下一步是确认分布类型。论文计算每个酒样 10 位品酒员的总分均值,得到 27 个(红)和 28 个(白)观测点,再对四组数据分别做单样本 K-S 检验,配合正态 P-P 图观察散点是否贴近对角线。第一组红葡萄酒的结果是 $p=0.525>0.05$,四组数据的散点都近似落在直线附近,因此接受“评分服从正态分布”的假设。

import numpy as np from scipy import stats def ks_normality(x): """单样本 K-S 检验:H0 为样本来自正态分布 x: 每个酒样的组内平均分,长度等于酒样数 """ x = np.asarray(x, dtype=float) mu, sd = x.mean(), x.std(ddof=1) # 用样本估计的 mu/sd 代入,统计量 D 是经验分布与理论分布的最大偏差 d, p = stats.kstest(x, 'norm', args=(mu, sd)) return d, p scores = [78.5, 81.2, 75.9, 84.1] # 省略,实际是 27 个酒样均分 d, p = ks_normality(scores) print(f"D={d:.4f}, p={p:.4f}")

这段代码回答的是“能不能用参数检验”的问题。关键在于args=(mu, sd):均值和标准差是从同一批数据估出来的,而不是事先给定。这会让 K-S 检验的 p 值偏大(偏保守),严格做法应查 Lilliefors 临界值表,或者直接改用statsmodels里的lilliefors。不过本题样本量只有 27,检验功效本来就低,p 值偏大意味着“更容易不拒绝正态”,这对后续选非参数方法反而是安全方向的偏差——因为论文最终并没有依赖正态性去做 t 检验,正态性检验只是为“两组数据能不能配对比较”提供一个背景判断。

2.2 Wilcoxon 符号秩:为什么配对 t 检验在这里不合适

两组评酒员评的是同一批酒样,所以这是配对数据,而不是两组独立样本。配对数据的经典做法是配对 t 检验,检验统计量建立在差值 $D_i$ 之上,要求 $D_i$ 服从正态分布。问题在于,即使原始评分近似正态,差值 $D_i$ 的分布也未必正态——评酒员之间存在评价尺度、评价位置和评价方向的差异,有人整体偏严,有人对某些风味特别敏感,差值里混着这些个体效应,尾部往往比正态更厚。

Wilcoxon 符号秩检验只要求差值关于零对称,不要求正态,正好绕开这个约束。它的构造思路很“秩”:把每对差值的绝对值从小到大排等级,最小记 1,最大记 $n$,绝对值相等时取平均秩;然后恢复正负号,分别求正秩和 $T_+$ 与负秩和 $T_-$,取较小者为统计量 $T$。

原假设 $H_0$ 是两组评价结果相同。在 $H_0$ 下,正负号应当随机分配,因此

$$E(T)=\frac{n(n+1)}{4},\qquad D(T)=\frac{n(n+1)(2n+1)}{24}$$

标准化后 $z=\dfrac{T-E(T)}{\sqrt{D(T)}}$ 近似服从标准正态。红葡萄酒的 $n=27$,代入算得 $z\approx-2.53$;白葡萄酒 $z\approx-2.23$。双侧检验在 $\alpha=0.05$ 下的临界值是 1.96,两个 $|z|$ 都超过临界值,于是拒绝 $H_0$,两组评酒员对红、白葡萄酒的评价结果均存在显著性差异。

import numpy as np from scipy.stats import norm def signed_rank_test(a, b): """配对 Wilcoxon 符号秩检验(大样本正态近似版) a, b: 两组总分,顺序必须一一对应同一个酒样 """ d = np.asarray(a, float) - np.asarray(b, float) d = d[d != 0] # 差值为 0 的样本不参与编秩 n = len(d) order = np.argsort(np.abs(d)) ranks = np.empty(n) ranks[order] = np.arange(1, n + 1) # 绝对值升序编秩,并列时此处未做平均秩 t_plus = ranks[d > 0].sum() t_minus = ranks[d < 0].sum() T = min(t_plus, t_minus) # 取较小者为统计量 mu = n * (n + 1) / 4 sigma = np.sqrt(n * (n + 1) * (2 * n + 1) / 24) z = (T - mu) / sigma return T, z, 2 * norm.cdf(-abs(z)) # 双侧 p 值 z_red = signed_rank_test(score_g1_red, score_g2_red) # 约 -2.53 z_white = signed_rank_test(score_g1_white, score_g2_white) # 约 -2.23

代码里有两点值得盯住。一是d = d[d != 0]:差值为零的样本要从 $n$ 里剔除,否则编秩会出现空位,$n$ 也算错,统计量的均值和方差跟着全错。二是并列秩:手写版这里直接arange,如果多个绝对值相等就会打破平均秩约定,$z$ 会有小幅漂移,工程上直接用scipy.stats.wilcoxon更稳妥,它默认带连续性校正和并列秩修正。

结果解读要小心:拒绝 $H_0$ 只说明“两组评分存在系统性差异”,并不说明“哪一组错了”。这正是下一节要补的缺口。

2.3 肯德尔和谐系数:把“可信”折算成排序一致性

显著性差异只回答了“不一样”,可信度要回答“哪一组内部更一致”。论文用肯德尔和谐系数 $W$ 来度量。

设 $m$ 位评酒员对 $j$ 个酒样评分,$R_j=\sum_{m}r_{mj}$ 是第 $j$ 个酒样所得的秩和。若全组意见一致,各 $R_j$ 之间会拉得很开;若各打各的,$R_j$ 会挤在一起。于是令

$$Q=\sum_{j=1}^{n}\left(R_j-\bar{R}\right)^2,\qquad W=\frac{12Q}{m^2\left(j^3-j\right)}$$

$W$ 落在 0 到 1 之间,越接近 1 表示一致性越高。检验统计量取 $\chi^2=m(j-1)W$,近似服从自由度 $j-1$ 的卡方分布。四组数据的计算结果如下:

组别$W$ 值$\chi^2$ 值
第一组红葡萄酒0.04436678811.535
第二组红葡萄酒0.04331465211.262
第一组白葡萄酒0.04003903910.811
第二组白葡萄酒0.04111205511.100

红葡萄酒第一组的 $\chi^2$ 更大,白葡萄酒第二组的 $\chi^2$ 更大,于是论文判定:红葡萄酒采用第一组评分,白葡萄酒采用第二组评分,后续建模就以这两组分数作为“质量标签”。

这个结论的力度需要打个问号。四组 $W$ 都在 0.04 附近,意味着十位评酒员对二十多个酒样的排序一致性只有 4% 左右——本来就接近“各排各的”。而组间差距是 0.0444 对 0.0433,落在第三位小数上。更关键的是,自由度 26 的卡方分布在 0.05 水平下的临界值约为 38.9,而四组 $\chi^2$ 全部在 11 上下,没有一组能拒绝“评分互不相关”的原假设。

也就是说,这道题真正给出的不是“某一组可信”,而是“两组都不太可信,只是相对而言某一组稍好”。论文的措辞是“存在相关的概率大于另一组”,这个相对化表述是诚实的,但读者容易把它读成“这一组可信”。这条边界后面还会反复出现——凡是用人的主观打分当标签,标签本身就带着噪声底。

3. 从 27 个指标到一个等级:主成分降维、层次分析赋权与阶梯分级的串联

第二问要拿酿酒葡萄的理化指标和葡萄酒的质量评分,把葡萄分出等级。难点不在“怎么算分”,而在“指标怎么选、权重怎么定、分数怎么切”。这三件事分别对应主成分分析、层次分析法和阶梯分段,串起来才是一条完整链路。

3.1 27 个指标为什么必须降维:相关系数矩阵里的共线性

附件给出的酿酒葡萄理化指标有 27 个,样本 27 个。指标数等于样本数,这是典型的“宽数据”困境:直接拿 27 维向量算距离或做加权,信息会大量重叠。葡萄总黄酮、总酚、DPPH 自由基清除能力、单宁这几项在生化上本就同源,相关系数矩阵里必然出现成片的高相关块。如果原样加权,等于给同一个因素重复计了好几次权重,分级结果会被这几个指标绑架。

主成分分析的处理是先标准化再求特征值。标准化用 $ \tilde{F}{ij}=\dfrac{F{ij}-\bar{F}_i}{s_i}$,目的是消掉量纲——总糖以 g/L 计、色差 a* 是无量纲、果皮质量以 g 计,不标准化的话方差最大的指标会自动成为“第一主成分”。

import numpy as np def pca_on_indicators(X, var_threshold=0.83): """X: n×p 的理化指标原始矩阵(n 个酒样,p 个指标) 返回保留的主成分个数、累计方差贡献率、载荷矩阵 """ Z = (X - X.mean(axis=0)) / X.std(axis=0, ddof=1) # 标准化,式(1) R = np.corrcoef(Z, rowvar=False) # p×p 相关系数阵 eigvals, eigvecs = np.linalg.eigh(R) # 对称阵用 eigh 更稳 idx = np.argsort(eigvals)[::-1] eigvals, eigvecs = eigvals[idx], eigvecs[:, idx] ratio = eigvals / eigvals.sum() cum = np.cumsum(ratio) k = int(np.searchsorted(cum, var_threshold) + 1) # 红葡萄落到 8 return k, cum[k-1], eigvecs[:, :k], ratio[:k]

np.corrcoef而不是np.cov是关键:相关系数阵等价于对标准化数据求协方差,特征值之和等于指标个数 $p$,各主成分的方差贡献率才有“占比”的含义。eigh专门处理对称矩阵,比通用eig快且保证特征向量正交,避免复特征值。searchsorted找的是累计贡献率首次越过阈值的位置,本题红葡萄在 8 个主成分处达到 83.044%。

这 8 个主成分的含义,论文用正交旋转后的载荷来命名:第一主成分是葡萄总黄酮、总酚、DPPH 自由基和单宁的组合;第二主成分是总糖、可溶性固形物和干物质含量;第三是苹果酸与褐变度;第四是果皮质量与果穗质量;第五是色差 a* 与 b*;第六是可滴定酸与固酸比;第七是黄酮醇;第八是酒石酸。

这套命名在机理上是自洽的:前两个主成分分别对应“抗氧化活性”和“糖成熟度”,是酿酒葡萄最核心的两条品质轴;苹果酸与褐变度绑在一起,因为苹果酸代谢直接影响氧化褐变速率;色差 a*/b* 单独成分为颜色维度;可滴定酸与固酸比互为倒数关系,天然成对。八个主成分覆盖了 83% 的信息,剩下的 17% 被当作噪声舍弃。

注意一个容易翻车的点:主成分的“命名”是人给它贴的标签,不是算法输出。旋转之后载荷会重新分配,同一批数据换一种旋转方法,第三、第四主成分的构成可能对调。论文在正文里明确说“这组合说明……可能在同一方面起重要作用”,用了“可能”,这个措辞是对的。

3.2 层次分析赋权:8×8 判断矩阵与一致性检验

降维解决的是“指标太多”,但降维后的 8 个主成分也并非等权。论文接着用层次分析法确定权重,构建的指标体系是三层:一级指标 2 个(酿酒葡萄理化指标 $R_1$、葡萄酒质量 $R_2$),二级指标 $R_1$ 下 8 个主成分、$R_2$ 下 4 个品评维度(外观、香气、口感、整体),三级指标共 27 个(17 个理化 + 10 个品评)。

判断矩阵取 8×8,元素 $a_{ij}$ 表示因子 $i$ 相对因子 $j$ 的重要程度。矩阵第一行是 1.0000、1.1655、1.6571、1.9159、1.9311、2.0250、2.3020、2.7346,逐行递减,转置位置取倒数。求解最大特征向量并归一化,得到 27 维权向量,前几项为 0.025338、0.050677、0.037031、0.049375、0.098749……

一致性检验报告的结果是:最大特征根为 8,$CI=0.013$,$CR^{(1)}=CR^{(2)}=0$,组合一致性比率 $CR=0.029<0.1$。

这里有一个数值上的巧合值得指出:8 阶判断矩阵的最大特征根恰好等于阶数 8,这是一致性矩阵的精确特征——只有当 $a_{ij}=w_i/w_j$ 对所有 $i,j$ 严格成立时,$\lambda_{\max}$ 才正好等于 $n$。而论文同时报出 $CI=0.013$(对应 $\lambda_{\max}=8.091$),两个数并排放着并不自洽。实操中我一般会用幂法重新迭代一遍,把 $\lambda_{\max}$、$CI$、$CR$ 三个数从判断矩阵直接算出来,而不是分开引用。这类小瑕疵不影响方法本身,但会影响复现。

3.3 一致化、无量纲化与阶梯分级:把评价值压进 [0,1]

指标体系建好后,还有两道预处理。第一道是指标类型一致化:27 个三级指标里混着极大型(越大越好,如总酚)、极小型(越小越好)和中间型(落在某区间最好,如可滴定酸)。极小型用平移变换 $x'i=M_i-x_i$;中间型用分段线性变换,把 $[m_i,M_i]$ 映射成以中点为峰值的折线。第二道是无量纲化,用极差化 $x^*{ij}=\dfrac{x_{ij}-m_i}{M_i-m_i}$,把所有指标压进 $[0,1]$。

import numpy as np def composite_grade(X, w, thresholds=(0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2)): """X: n×27 的三级指标(已完成类型一致化);w: 27 维 AHP 权重 返回综合评价值 y 与等级标签 """ X = np.asarray(X, float) lo, hi = X.min(axis=0), X.max(axis=0) Xn = (X - lo) / np.where(hi - lo == 0, 1, hi - lo) # 极差化,防零除 y = Xn @ np.asarray(w, float) / np.sum(w) # 线性加权求和 labels = ['7th', '6th', '5th', '4th', '3rd', '2sec', '1st', 'super'] # digitize 返回 0..7,对应从最差到最优,阈值升序 grade = np.array(labels)[np.digitize(y, thresholds[::-1])] return y, grade

np.where(hi - lo == 0, 1, hi - lo)这一行是防呆:如果某个指标在所有样本上取值相同(极差为零),直接除会得到 nan,一个 nan 会污染整行加权和。digitize的阈值必须升序传入,而论文的阶梯是从 0.8 往下排的,所以要thresholds[::-1]反转,否则索引会整体错位一级——这种错位不会报错,只会让所有样本的分级悄悄偏移一档,是最难查的一类 bug。

分级结果:27 个红葡萄样本中,23 号样品评价值 0.80,落在 super 区间,是唯一的特级;12 号样品 0.23,落入 6th,是最差的一个;其余样本大量集中在 2sec 和 3rd。这个分布本身是合理的——分级阈值是等距切的,而综合评价值在中间段样本最密,两头自然稀疏。

4. 两组变量的对话:典型相关分析与多元线性回归,凭什么敢用理化指标替代品酒员

第三、四问的方向反过来了:不再用指标算分数,而是问葡萄的理化指标和葡萄酒的理化指标之间是什么关系,以及这两组指标能不能反过来预测葡萄酒质量。前者是两组变量对两组变量,后者是多对一。

4.1 典型相关的骨架:先在组内白化,再在组间找最大相关

如果拿葡萄的每个指标去和葡萄酒的每个指标做简单相关,会得到几十个相关系数,且每个系数都忽略了组内其他变量的影响——总酚和单宁高度相关,它们各自与葡萄酒颜色的相关系数里混着对方的作用,单看哪一个都会高估。典型相关分析的做法是:在两组变量内部各找一个线性组合,让这两个组合之间的相关系数最大。

设葡萄侧指标为 $X=(X_1,\dots,X_p)'$,葡萄酒侧为 $Y=(Y_1,\dots,Y_q)'$,观测阵中心化后为 $Z=(X\ Y)$。标准化后算相关系数阵并分块:

$$R=\begin{bmatrix}R_{11}&R_{12}\R_{21}&R_{22}\end{bmatrix}$$

其中 $R_{11}$、$R_{22}$ 是组内相关,$R_{12}$、$R_{21}$ 是组间相关。构造 $A=R_{11}^{-1}R_{12}R_{22}^{-1}R_{21}$,求它的特征根 $\lambda_i^2$ 与特征向量,$\lambda_i$ 就是第 $i$ 个典型相关系数,典型变量为 $V_i=\alpha_i'X$、$W_i=\beta_i'Y$。

import numpy as np def canonical_correlation(X, Y, ridge=1e-8): """X: n×p 葡萄指标,Y: n×q 葡萄酒指标 返回典型相关系数(降序)与葡萄侧典型变量系数 """ Xc = (X - X.mean(0)) / X.std(0, ddof=1) Yc = (Y - Y.mean(0)) / Y.std(0, ddof=1) R = np.corrcoef(np.hstack([Xc, Yc]), rowvar=False) p, q = X.shape[1], Y.shape[1] R11, R12 = R[:p, :p], R[:p, p:] R21, R22 = R[p:, :p], R[p:, p:] # 岭正则:R11/R22 在强共线性下可能接近奇异,直接求逆会炸 R11 = R11 + ridge * np.eye(p) R22 = R22 + ridge * np.eye(q) M = np.linalg.solve(R11, R12) @ np.linalg.solve(R22, R21) eigvals, eigvecs = np.linalg.eig(M) order = np.argsort(eigvals.real)[::-1] lam = np.sqrt(np.clip(eigvals.real[order], 0, None)) # 典型相关系数 return lam, eigvecs[:, order].real

ridge那一行不是可有可无的装饰。$R_{11}$ 是 27 个葡萄指标的组内相关阵,里面存在成片的高相关块(总酚、单宁、黄酮同源),矩阵条件数很大,np.linalg.solve会给出数值上不稳定甚至符号翻转的解。加一个 $10^{-8}$ 量级的对角扰动,相当于在求逆前先把矩阵往正定方向推一点,代价是典型相关系数会有极小偏差,换来的是特征向量方向稳定、可解释。

np.clip(..., 0, None)处理的是数值噪声:理论上 $\lambda_i^2$ 非负,但浮点运算可能给出 $-10^{-16}$ 这样的值,不裁剪的话开方会得到 nan。

论文从典型相关里读出三条结论。第一条,增大酿酒葡萄果皮含量,对葡萄酒中 DPPH 半抑制体积含量的增加有重要影响——果皮是酚类物质的主要储库,浸渍过程把这些物质带进酒里。第二条,葡萄中的苹果酸不仅促进发酵,还对红葡萄酒起主要呈色作用的花色苷、以及对花色苷起辅色作用的单宁起保护作用。第三条,葡萄总黄酮的抗氧化作用与总酚的清除自由基作用叠加,把葡萄中的 DPPH 自由基转化为葡萄酒中的 DPPH 半抑制体积。

这三条不是从单个相关系数里挑出来的,而是从典型变量的系数符号和量级里读出来的——某个指标在典型变量里的系数大且符号为正,说明它对“这一对典型变量所刻画的相关方向”贡献大。这也是典型相关比简单相关更耐读的地方:它给出的是“组合对组合”的关系,而不是“一对一”的散点。

4.2 多元回归:先做指标筛选,再做样本外验证

第四问要论证“用葡萄和葡萄酒的理化指标评价葡萄酒质量是否可行”。这里有一个隐患:如果直接把两组理化指标全塞进回归,葡萄酒侧的某些指标(如酒精度、残糖)本身就和品评得分高度相关,模型会显得拟合很好,但这只是“用葡萄酒解释葡萄酒”,没有回答葡萄侧有没有增量信息。

论文的处理是先做筛选:保留葡萄酒指标,剔除酿酒葡萄指标中那些“可以被对应葡萄酒指标代表”的部分。比如葡萄总糖和葡萄酒酒精度、葡萄总酚和葡萄酒总酚,前者在发酵后基本转化进后者,两项同时进模型会造成严重共线性,回归系数会失真甚至反号。筛选后的指标集再建多元线性回归:

$$y=\beta_0+\sum_{i}\beta_i x_i+\varepsilon$$

验证方式是把样本随机分成两组,一组建方程,另一组做检验,再对检验组的模型评价值与真实评分做显著性差异检验。

import numpy as np import statsmodels.api as sm from scipy import stats # 随机划分样本组与检验组,固定随机种子保证可复现 rng = np.random.default_rng(2012) idx = rng.permutation(len(y)) train, test = idx[:18], idx[18:] X_train = sm.add_constant(X_selected[train]) # 加常数列,否则回归无截距 model = sm.OLS(y[train], X_train).fit() y_pred = model.predict(sm.add_constant(X_selected[test])) # 检验组:模型评价值与真实评分是否无显著差异 t_stat, p_val = stats.ttest_rel(y_pred, y[test])

sm.add_constant是必须的,OLS默认不自动加截距,漏掉会强制回归线过原点,系数整体偏移。ttest_rel是配对 t 检验,这里检验的是“预测值和真实值之间有没有系统性偏差”——$p$ 值大(不拒绝原假设)反而是好消息,说明模型没有系统性高估或低估。

论文最终报告,检验组的线性回归模型评价值与评分值之间无显著性差异,因此“用葡萄和葡萄酒的理化指标来评价葡萄酒的质量是可行的”。这个结论的措辞很克制:可行,不代表精确。回归方程解释的是方差的一部分,剩下的部分仍然留给品酒员。

5. 避坑:这几步最容易翻车的地方

这套流程走下来,每一步都有“能跑通但结论不对”的岔路。下面五条是复盘时最容易踩的,每条按现象、原因、解决来写。

5.1 缺失值一律用均值填,方差被悄悄压扁

现象:清洗后的评分数据看起来干净了,但后续 K-S 检验的 p 值异常大,显著性检验也更容易“不显著”。

原因:均值替换把缺失位置填成了中心值,等于人为增加了中心附近的样本、减少了尾部样本,方差被系统性低估。缺失比例越高,这种压缩越明显;如果缺失本身不是完全随机(比如某位评酒员对难喝的酒干脆不填),偏差会带方向性。

解决:先统计缺失比例。低于 5% 且分散在不同酒样上,均值替换可以接受;超过 10% 或集中出现在某位评酒员身上,改用多重插补,或者直接剔除该评酒员整列。做完填补后,对比“填补前”和“填补后”的方差,差距超过 10% 就要重新考虑策略。

5.2 K-S 检验的 p 值大,被当成“数据服从正态分布”的证明

现象:看到 $p=0.525>0.05$,就写“数据服从正态分布”,后面直接用参数检验。

原因:K-S 检验的原假设是“样本来自指定分布”,$p$ 值大只是“没有足够证据拒绝”,不等于“证明了”。样本量小的时候检验功效低,任何分布都容易被判为“不拒绝”。而且用样本估计的均值和标准差代入检验,本身就会让 p 值偏大。

解决:把正态性检验当成“排除明显偏离”的筛子,而不是“确认正态”的证书。样本量小于 30 时,配合 P-P 图或 Q-Q 图人工看散点是否成直线;同时无论检验结果如何,都优先选对分布假设不敏感的方法——这道题选 Wilcoxon 而不是配对 t 检验,就是这个思路。

5.3 肯德尔 W 的组间差距,被当成“谁更可信”的判决

现象:两组 $W$ 值分别是 0.0444 和 0.0433,差 0.001,据此判定第一组更可信,然后把该组分数当作后续建模的唯一标签。

原因:$W$ 的绝对值只有 0.04 量级,本身就说明十位评酒员的排序一致性极弱;两组差距落在第三位小数上,很可能只是抽样噪声。更关键的是,$\chi^2=m(j-1)W$ 算出来只有 11 上下,而自由度 26 的卡方分布在 0.05 水平下临界值约为 38.9,四组全部不显著。统计上根本支撑不起“某一组可信”的结论。

解决:报 $W$ 值的同时必须报 $\chi^2$ 和临界值,明确写出“是否拒绝评分互不相关的原假设”。如果所有组都不显著,就把结论降级为“相对比较”,并在后续模型里保留这种不确定性的影响——比如用两组分数的均值做敏感性分析,看分级结果会不会翻转。

5.4 旋转后的主成分命名,被读成生化机理

现象:把“第三主成分 = 苹果酸 + 褐变度”直接写成“苹果酸导致褐变”,并在结论里当作发现。

原因:主成分是线性组合,载荷是人根据数值大小贴的标签。正交旋转会重新分配方差,同一批数据换一种旋转方法,成分构成可能整体挪位。载荷大只说明“这几个指标在数据上共变”,不说明因果方向。

解决:命名时保留“组合”二字,写成“苹果酸与褐变度的组合”,而不是“苹果酸导致褐变”。要谈机理,得回到生化通路去论证,或者用典型相关、回归这类能给出方向的方法交叉验证。这道题第三问用典型相关去追机理,就是对主成分命名的补强。

5.5 AHP 判断矩阵的一致性检验,被当成方法可靠性的证明

现象:$CR=0.029<0.1$,就认为权重客观可信,直接用于加权。

原因:一致性检验只检验“判断矩阵内部的传递性有没有自相矛盾”(比如 A 比 B 重要、B 比 C 重要,那么 A 必须比 C 重要),它完全不检验“A 比 B 重要”这个判断本身对不对。判断矩阵的元素是人填的,主观性在填数那一刻就注定了。加上论文报告的最大特征根恰好等于阶数 8,与 $CI=0.013$ 在数值上不自洽,说明这几个数至少有一个需要复核。

解决:把 AHP 权重当作“一组可调的参数”,而不是“客观真值”。做法是敏感性分析:把权重向量在 ±20% 范围内随机扰动若干次,重跑综合评价,看分级结果中处于阈值边界附近的样本会不会跳级。跳级比例低,说明结论稳健;跳级比例高,就要

本文还有配套的精品资源,点击获取

返回列表