恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
葡萄酒评分统计建模:Wilcoxon检验与主成分分析实战
首页
资讯中心
/
葡萄酒评分统计建模:Wilcoxon检验与主成分分析实战
葡萄酒评分统计建模:Wilcoxon检验与主成分分析实战
发布时间:2026/10/19 15:54:52
简介这份资源是2012年全国大学生数学建模竞赛A题一等奖论文《葡萄酒的评价》的完整PDF文档面向备战数学建模竞赛的高校学生、指导教师以及需要学习统计建模方法的读者可用于赛题复盘、论文写作参考与方法迁移。压缩包内共1个PDF文件大小约2.41MB内容为完整获奖论文涵盖摘要、问题重述、问题分析、模型假设、符号说明及四个问题的建模求解全过程。论文围绕葡萄酒质量评价展开依次运用单样本K-S检验、Wilcoxon符号秩检验、肯德尔和谐系数、主成分分析、典型相关分析和多元线性回归等方法解决评酒员评分显著性差异与信度比较、酿酒葡萄分级、葡萄与葡萄酒理化指标关联及质量预测等问题并借助MATLAB、SPSS、SAS和EXCEL完成计算。目前已有2907人学习下载读者可从中获取完整的赛题建模思路、统计方法选用依据、模型检验流程与论文组织框架适合作为竞赛训练与学术写作的实战范本。1. 葡萄酒评分背后的统计学为什么两组评酒员的结论会“打架”同一批酒同一套评分表两组评酒员给出的结论却可能截然不同。这不是玄学而是感官评价中普遍存在的系统性偏差。2012年数学建模A题一等奖论文《葡萄酒的评价》要解决的第一个问题就是两组评酒员的评价结果到底有没有显著性差异如果有哪一组更可信这个问题看似只是比较两组分数实际上触及了统计推断中一个核心矛盾——当数据来自主观评分、样本量有限、分布未知时传统的参数检验会直接翻车。论文给出的解法是先用K-S检验确认评分数据的概率分布再用Wilcoxon符号秩检验做配对样本的非参数检验最后用肯德尔和谐系数评定评分信度。这套组合拳的价值在于它不依赖正态分布假设只利用评分的秩信息就能在主观评价的噪声中提取出稳固的结论。搞懂这套机制不仅是在看一篇获奖论文更是在理解“当数据不听话时统计学家怎么让结论依然站得住脚”。2. 显著性差异检验Wilcoxon符号秩检验为什么能替代T检验2.1 从评分数据的分布说起K-S检验在做什么论文处理问题一的第一步不是直接做差异检验而是先确定评分数据的概率分布。这个顺序很关键。T检验的前提是数据服从正态分布如果评分数据本身偏离正态T检验的p值就是不可信的。论文采用单样本K-S检验Kolmogorov-Smirnov检验来验证这一点。K-S检验的底层逻辑是将样本数据的累积分布函数与理论正态分布的累积分布函数进行比较取两者之间的最大垂直距离作为检验统计量D。如果D值小于临界值就不能拒绝“数据来自正态分布”的原假设。论文中第一组红葡萄酒评价结果的K-S检验双边p值为0.525远大于0.05说明评分数据可以近似看作正态分布。但这里有一个容易被忽略的细节论文对每个葡萄酒样本计算了10个品酒员评分的均值然后对这组均值做正态性检验。这意味着检验的对象是“样本均值的分布”而不是原始评分。根据中心极限定理即使原始评分不完全正态均值的分布也会趋近正态。论文用P-P图辅助验证散点近似沿对角线分布进一步支持了正态性假设。注意K-S检验对大样本敏感对小样本保守。当样本量只有27个红葡萄酒样本时K-S检验的效力有限论文结合P-P图做视觉验证是合理的补充手段。2.2 Wilcoxon符号秩检验的机制为什么丢弃数值只保留秩确认了正态性之后论文并没有直接用配对T检验而是选择了Wilcoxon符号秩检验。这个选择背后有明确的考量两组评酒员对同一样本评分数据是配对的但配对差值是否服从正态分布并没有被验证。Wilcoxon符号秩检验只要求差值关于中位数对称不要求正态分布适用条件更宽松。检验的步骤可以拆解为import numpy as np from scipy.stats import wilcoxon # 假设 group1 和 group2 分别是两组评酒员对27个红葡萄酒样本的评分 # 计算配对差值 diff group1 - group2 # 剔除差值为0的样本Wilcoxon检验的标准处理 nonzero_diff diff[diff ! 0] # 对差值的绝对值排序并编秩 abs_diff np.abs(nonzero_diff) ranks np.argsort(np.argsort(abs_diff)) 1 # 最小秩为1 # 恢复正负号分别求正秩和与负秩和 positive_ranks ranks[nonzero_diff 0].sum() negative_ranks ranks[nonzero_diff 0].sum() # 取较小者作为检验统计量T T min(positive_ranks, negative_ranks) # 计算均值和方差无结点时的公式 n len(nonzero_diff) E_T n * (n 1) / 4 D_T n * (n 1) * (2 * n 1) / 24 # 标准化为z统计量 z (T - E_T) / np.sqrt(D_T) print(f检验统计量 z {z:.4f})这段代码的核心操作是把配对差值的绝对值按大小排序赋予秩次然后恢复正负号分别计算正秩和与负秩和。如果两组评分没有系统性差异正秩和与负秩和应该大致相等如果一组系统性地高于另一组正秩和或负秩和会显著偏大。论文计算得到的红葡萄酒检验统计量z值为-2.53绝对值大于1.96落在拒绝域内因此拒绝原假设认为两组评价结果存在显著性差异。白葡萄酒的z值为-2.23同样拒绝原假设。这里的关键设计动机是Wilcoxon符号秩检验丢弃了评分的具体数值只保留秩信息。这样做的好处是即使某个品酒员给出了极端分数比如77分这种明显异常值只要它的秩位置合理就不会对检验结果产生过度影响。这是一种“稳健性”设计——用信息的损失换取结论的可靠性。2.3 肯德尔和谐系数的计算与信度判定确认了两组评分存在差异之后下一个问题是哪一组更可信论文引入肯德尔和谐系数Kendalls W来度量评分信度。和谐系数的逻辑是如果一组品酒员对葡萄酒质量的排序高度一致那么这组评分的可信度就高。计算过程如下import numpy as np from scipy.stats import chi2 def kendall_w(data): data: m x n 矩阵m个品酒员n个样本 返回和谐系数W和卡方检验结果 m, n data.shape # 对每个品酒员的评分做秩变换按样本排序 ranks np.zeros_like(data, dtypefloat) for i in range(m): ranks[i] np.argsort(np.argsort(data[i])) 1 # 计算每个样本的秩和 R ranks.sum(axis0) # 计算秩和的平均值 R_bar R.mean() # 计算离差平方和 S ((R - R_bar) ** 2).sum() # 计算和谐系数W W 12 * S / (m ** 2 * (n ** 3 - n)) # 卡方检验 chi2_val m * (n - 1) * W df n - 1 p_value 1 - chi2.cdf(chi2_val, df) return W, chi2_val, p_value论文计算得到的四组W值分别为第一组红葡萄酒0.0444、第二组红葡萄酒0.0433、第一组白葡萄酒0.0400、第二组白葡萄酒0.0411。这些W值本身都很小说明品酒员之间的整体一致性并不高——这符合感官评价的实际情况。但比较而言红葡萄酒第一组的W值更大白葡萄酒第二组的W值更大因此论文得出结论红葡萄酒第一组评分更可信白葡萄酒第二组评分更可信。卡方检验进一步验证了和谐系数的显著性。论文中红葡萄酒第一组的卡方值为11.54第二组为11.26白葡萄酒第一组为10.81第二组为11.10。在自由度j27红和j28白下这些值对应的p值均小于0.01说明品酒员的评分之间存在显著的相关性不是随机打分。提示肯德尔和谐系数的值域是0到1越接近1表示一致性越高。但在感官评价中W值通常偏低因为品酒员的个人偏好差异很大。论文没有因为W值低就否定评分信度而是通过组间比较来判断哪组更可信这是合理的处理方式。3. 主成分分析与层次分析法酿酒葡萄分级模型的构建逻辑3.1 27个理化指标的主成分降维问题二要求根据酿酒葡萄的理化指标和葡萄酒质量对葡萄进行分级。酿酒葡萄有27个理化指标如果直接用于分级不仅计算量大而且指标之间存在强相关性会导致信息重叠。论文采用主成分分析PCA来解决这个问题。PCA的核心思想是通过线性变换将原始指标转换为一组互不相关的主成分每个主成分是原始指标的线性组合。第一主成分解释的方差最大第二主成分次之以此类推。论文以累计方差贡献率达到83.044%为标准提取了8个主成分。from sklearn.decomposition import PCA from sklearn.preprocessing import StandardScaler # 假设 X 是 27 x 27 的矩阵27个样本27个指标 scaler StandardScaler() X_scaled scaler.fit_transform(X) pca PCA() pca.fit(X_scaled) # 查看累计方差贡献率 cumulative_variance np.cumsum(pca.explained_variance_ratio_) print(累计方差贡献率:, cumulative_variance) # 找到达到83.044%所需的主成分数 n_components np.argmax(cumulative_variance 0.83044) 1 print(f需要 {n_components} 个主成分)论文中红葡萄的前8个主成分累计贡献率达到83.044%这意味着用8个主成分代替原来的27个指标保留了超过80%的信息。更重要的是通过正交旋转后的载荷矩阵可以解释每个主成分的物理含义。例如主成分1主要由葡萄总黄酮、总酚、DPPH自由基和单宁组成这些都与抗氧化能力相关主成分2由总糖、可溶性固形物和干物质含量组成与甜度和成熟度相关。这种降维的价值在于它不仅减少了指标数量还揭示了指标背后的潜在结构。27个指标并不是彼此独立的它们受到少数几个潜在因素的支配。PCA找到的就是这些潜在因素。3.2 层次分析法确定权重的判断矩阵降维之后论文用层次分析法AHP确定各指标的权重。AHP的核心是构造判断矩阵对每一对指标判断它们的相对重要程度用1到9的标度表示。论文给出的判断矩阵是一个8x8的矩阵对应8个主成分。判断矩阵的构造依据是“不同理化性质在样本中的分布情况以及不同样本的评分结果”。这句话的含义是如果某个主成分对应的指标在优质葡萄和劣质葡萄之间差异明显那么这个主成分的权重就应该更大。import numpy as np # 论文中的判断矩阵8x8 A np.array([ [1.0000, 1.1655, 1.6571, 1.9159, 1.9311, 2.0250, 2.3020, 2.7346], [0.8580, 1.0000, 1.4218, 1.6439, 1.6569, 1.7375, 1.9751, 2.3463], [0.6035, 0.7033, 1.0000, 1.1562, 1.1654, 1.2221, 1.3892, 1.6502], [0.5219, 0.6083, 0.8649, 1.0000, 1.0079, 1.0569, 1.2015, 1.4273], [0.5178, 0.6035, 0.8581, 0.9921, 1.0000, 1.0486, 1.1921, 1.4161], [0.4938, 0.5755, 0.8183, 0.9461, 0.9536, 1.0000, 1.1368, 1.3504], [0.4344, 0.5063, 0.7198, 0.8323, 0.8389, 0.8797, 1.0000, 1.1879], [0.3657, 0.4262, 0.6060, 0.7006, 0.7062, 0.7405, 0.8418, 1.0000] ]) # 计算特征值和特征向量 eigenvalues, eigenvectors np.linalg.eig(A) # 最大特征值对应的特征向量 max_idx np.argmax(eigenvalues.real) w eigenvectors[:, max_idx].real w w / w.sum() # 归一化 print(权重向量:, w) # 一致性检验 n A.shape[0] lambda_max eigenvalues.real[max_idx] CI (lambda_max - n) / (n - 1) RI 1.41 # n8时的随机一致性指标 CR CI / RI print(fCR {CR:.4f})论文计算得到判断矩阵的最大特征根为8CI0.013CR0.0290.1通过一致性检验。这意味着判断矩阵的逻辑是自洽的没有出现“A比B重要B比C重要但C比A重要”这种矛盾。权重向量中澄清度、色调、纯正度、浓度、质量等指标的权重被逐一分配。值得注意的是口感的“质量”指标权重最高0.0915整体评价次之0.0557这说明论文认为口感质量是决定葡萄酒质量的最关键因素。3.3 综合评价模型与分级阶梯的映射有了权重之后论文建立了线性加权求和的综合评价模型。综合评价值y的计算方式是逐层加权三级指标加权得到二级指标二级指标加权得到一级指标一级指标加权得到最终的综合评价值。def comprehensive_score(x, w): x: 27个三级指标的标准化值 w: 27个三级指标的权重 返回综合评价值 # 确保x和w的长度一致 assert len(x) len(w) # 线性加权求和 y np.dot(x, w) return y # 分级阶梯模型 def classify(y): if 0.8 y 1.0: return super elif 0.7 y 0.8: return 1st elif 0.6 y 0.7: return 2nd elif 0.5 y 0.6: return 3rd elif 0.4 y 0.5: return 4th elif 0.3 y 0.4: return 5th elif 0.2 y 0.3: return 6th else: return 7th分级阶梯的阈值设定是[0.8, 1.0]为特级[0.7, 0.8)为一级以此类推。论文计算得到的结果是27个红葡萄样本中样本23的综合评价值为0.80被评为特级样本12的评价值为0.23被评为六级。大多数样本集中在二级和三级。这个结果揭示了一个重要规律越高级别的葡萄对各项指标趋于最优的要求越高达到标准的样本数就越少。特级样本只有1个而二级和三级样本占了大多数这符合“优质总是稀缺”的分布特征。4. 典型相关分析与多元线性回归理化指标之间的因果链条4.1 典型相关分析如何量化两组变量的整体关联问题三要求分析酿酒葡萄与葡萄酒的理化指标之间的联系。这里有两组变量酿酒葡萄的理化指标X组30个指标和葡萄酒的理化指标Y组9个指标。如果分别计算X中每个指标与Y中每个指标的简单相关系数会得到30x9270个相关系数不仅数量庞大而且无法从整体上描述两组变量的关系。典型相关分析CCA的思路是分别找到X组和Y组的线性组合使得这两个线性组合之间的相关系数最大。这个最大相关系数就是第一典型相关系数对应的线性组合就是第一对典型变量。然后在与第一对典型变量不相关的条件下找第二对典型变量以此类推。import numpy as np from scipy.linalg import eig def canonical_correlation(X, Y): X: n x p 矩阵n个样本p个酿酒葡萄指标 Y: n x q 矩阵n个样本q个葡萄酒指标 返回典型相关系数和典型变量系数 n X.shape[0] # 标准化 X (X - X.mean(axis0)) / X.std(axis0) Y (Y - Y.mean(axis0)) / Y.std(axis0) # 计算相关系数矩阵 Sxx np.corrcoef(X, rowvarFalse) Syy np.corrcoef(Y, rowvarFalse) Sxy np.corrcoef(X, Y, rowvarFalse)[:X.shape[1], X.shape[1]:] Syx Sxy.T # 计算矩阵 A Sxx^{-1} Sxy Syy^{-1} Syx A np.linalg.inv(Sxx) Sxy np.linalg.inv(Syy) Syx # 求特征值和特征向量 eigenvalues, eigenvectors eig(A) # 典型相关系数是特征值的平方根 canonical_corrs np.sqrt(eigenvalues.real) # 按从大到小排序 idx np.argsort(canonical_corrs)[::-1] canonical_corrs canonical_corrs[idx] eigenvectors eigenvectors[:, idx] return canonical_corrs, eigenvectors论文通过典型相关分析发现第一增大酿酒葡萄果皮的含量对葡萄酒中DPPH半抑制体积含量的增加有重要影响第二酿酒葡萄中的苹果酸不仅能促进发酵还能保护红葡萄酒中的花色苷和单宁使红葡萄酒呈色亮丽第三葡萄总黄酮和总酚在抗氧化过程中协同作用将DPPH自由基转化为葡萄酒中的DPPH半抑制体积。这些结论的价值在于它们不是简单的“X和Y相关”而是揭示了“X中的哪些成分通过什么机制影响Y中的哪些指标”。果皮含量影响DPPH半抑制体积背后的机制是果皮中富含多酚类物质这些物质在发酵过程中被提取到酒中增强了抗氧化能力。苹果酸保护花色苷和单宁是因为苹果酸能调节发酵环境的pH值防止花色苷在低pH下发生降解。4.2 多元线性回归模型的变量筛选与验证问题四要求论证能否用酿酒葡萄和葡萄酒的理化指标来评价葡萄酒的质量。论文的思路是在问题三的基础上剔除那些可以被葡萄酒指标替代的葡萄指标然后用剩余的指标建立多元线性回归模型。变量筛选的逻辑是如果某个葡萄指标与某个葡萄酒指标高度相关那么在回归模型中只需要保留葡萄酒指标即可因为葡萄指标的信息已经包含在葡萄酒指标中了。这样可以避免多重共线性提高模型的稳定性。import statsmodels.api as sm def stepwise_regression(X, y, threshold_in0.05, threshold_out0.10): 逐步回归前向选择 后向剔除 X: 候选自变量矩阵 y: 因变量 included [] while True: # 前向步骤尝试加入每个未包含的变量 changed False excluded list(set(range(X.shape[1])) - set(included)) best_pval threshold_in for idx in excluded: model sm.OLS(y, sm.add_constant(X[:, included [idx]])).fit() pval model.pvalues[-1] if pval best_pval: best_pval pval best_idx idx if best_pval threshold_in: included.append(best_idx) changed True # 后向步骤尝试剔除每个已包含的变量 if included: model sm.OLS(y, sm.add_constant(X[:, included])).fit() pvals model.pvalues[1:] # 跳过常数项 worst_pval pvals.max() if worst_pval threshold_out: worst_idx included[np.argmax(pvals)] included.remove(worst_idx) changed True if not changed: break return included论文将样本随机分为两组一组用于建立回归方程训练集另一组用于验证模型的可行性测试集。通过对测试集的评价值与评分值进行显著性差异检验发现两者没有显著差异从而论证了用理化指标评价葡萄酒质量是可行的。这个验证方法的设计很巧妙它不是在训练集上评估模型拟合优度那会过拟合而是在独立的测试集上检验预测值与真实评分的一致性。如果预测值与真实评分没有显著差异说明模型捕捉到了理化指标与质量之间的真实关系而不是噪声。注意多元线性回归的前提是自变量之间不存在严重的多重共线性。论文通过问题三的典型相关分析预先剔除了高度相关的葡萄指标这一步是回归模型能够成立的关键。如果跳过这一步直接做回归VIF值可能会爆表导致系数估计不稳定。5. 避坑指南数学建模中统计方法选择的常见翻车点5.1 正态性检验没做就直接上T检验现象两组评分数据直接做配对T检验得到p值小于0.05但结论被质疑。原因T检验要求配对差值服从正态分布。如果差值分布严重偏态T检验的p值不可信。论文先用K-S检验确认评分数据的正态性再用Wilcoxon符号秩检验处理配对差值这是正确的顺序。解决任何参数检验之前先做正态性检验。如果数据不满足正态性改用非参数检验。对于配对数据Wilcoxon符号秩检验是T检验的稳健替代。5.2 主成分分析后不解释主成分的物理含义现象提取了8个主成分累计贡献率达标但不知道每个主成分代表什么后续分析无法展开。原因PCA的数学结果是载荷矩阵但载荷矩阵需要结合领域知识来解释。论文通过正交旋转后的载荷矩阵将主成分1解释为“葡萄总黄酮、总酚、DPPH自由基和单宁的组合”这才让后续的权重分配有了依据。解决PCA之后必须做载荷分析找出每个主成分中载荷绝对值较大的指标结合领域知识给出物理解释。如果无法解释说明主成分的提取可能有问题或者需要换一种旋转方法。5.3 层次分析法的判断矩阵不一致现象构造的判断矩阵计算出的CR值大于0.1但直接忽略继续用权重计算结果。原因判断矩阵不一致意味着逻辑矛盾比如“A比B重要B比C重要但C比A重要”。这种情况下计算出的权重是不可信的。解决如果CR0.1需要调整判断矩阵中的某些元素直到通过一致性检验。论文中CR0.029远小于0.1说明判断矩阵的逻辑是自洽的。5.4 典型相关分析不检验典型相关系数的显著性现象计算出典型相关系数后直接使用没有检验它是否显著不为零。原因如果两组变量之间本来就不相关典型相关分析的结果就没有意义。论文在Step4中明确对典型相关系数进行了显著性检验这是必要的步骤。解决对每个典型相关系数做Bartlett检验确认它显著不为零后再使用。如果第一典型相关系数不显著说明两组变量之间没有整体关联后续分析需要重新考虑。5.5 多元线性回归不做多重共线性诊断现象回归模型的R方很高但系数符号与预期相反或者系数估计不稳定。原因自变量之间存在高度共线性导致系数估计的方差膨胀。论文通过问题三的典型相关分析预先剔除了高度相关的葡萄指标这一步是回归模型能够成立的关键。解决计算每个自变量的VIF值如果VIF10说明存在严重共线性需要剔除相关变量或使用岭回归、主成分回归等方法。6. 从秩相关到回归统计建模中的信息损失与稳健性权衡这篇论文最值得深挖的设计取舍是在多个环节主动选择“丢弃信息”来换取结论的稳健性。Wilcoxon符号秩检验丢弃了评分的具体数值只保留秩信息肯德尔和谐系数同样只利用秩信息主成分分析丢弃了部分方差较小的方向典型相关分析只保留少数几对典型变量。每一次信息丢弃都是在“更精细的描述”和“更可靠的推断”之间做权衡。这种权衡在数学建模中尤为关键。竞赛论文的评审者不会只关注模型的复杂度更关注模型的选择是否有理有据。论文在每个方法的选择上都给出了明确的理由为什么用K-S检验而不是Shapiro-Wilk检验因为K-S检验对连续分布的检验更通用。为什么用Wilcoxon符号秩检验而不是符号检验因为符号检验只利用差值的正负号丢弃了差值大小的信息而Wilcoxon符号秩检验在保留部分大小信息的同时仍然稳健。为什么用典型相关分析而不是多元回归因为典型相关分析能同时处理两组变量之间的多重关系而多元回归只能处理一个因变量。如果要验证这篇论文的结论是否可靠一个可行的方法是做敏感性分析改变主成分的提取数量比如从8个改为7个或9个观察分级结果是否发生显著变化。如果样本23始终被评为特级样本12始终被评为六级说明结论对主成分数量的选择不敏感模型的稳健性较好。另一个方法是改变判断矩阵中的某些元素观察权重变化对分级结果的影响。如果分级结果基本不变说明模型对权重的微小扰动不敏感。从那以后我每次做统计建模都会强制走一遍“分布检验→方法选择→稳健性验证”的流程。先确认数据满足什么条件再选择匹配的方法最后用敏感性分析检验结论是否可靠。这个习惯帮我避开了很多“方法用错但结果看起来合理”的坑。希望帮到你。本文还有配套的精品资源点击获取