
简介这是一份红酒数据集分析完整大作业资源面向数据分析初学者和需要完成统计建模作业的高校学生以单个docx文档呈现从数据预处理、相关分析到回归建模与分类的完整流程。文档先介绍红酒物理属性非挥发性酸度、挥发性酸度、柠檬酸、残糖、氯化物、二氧化硫、密度、pH、硫酸盐、酒精共11项与评分010分之间的关系通过相关性矩阵识别出挥发性酸度、硫酸盐、酒精是影响评分的关键因素而残糖、游离二氧化硫和pH值可作降维剔除。接着对比多元线性回归与主成分回归前者给出p-1.22130x20.67898x100.30920x112.61104的预测式后者提取五个主成分并还原为原变量系数同时展示置信区间和预测区间结果。压缩包内仅含1个docx文件大小202KB代码截图与R/Python关键步骤均在文档中标注方便按步骤复现。已有4265人浏览学习适合作为红酒品质影响因素分析或数据统计课程设计的直接参考。1. 红酒数据集分析这份作业要解决评分预测、属性筛选与分类三个问题红酒数据集分析是数据分析课程作业里出现频率最高的题目之一数据公开、变量连续、结论好写但它真正考验人的地方不在跑代码而在“怎么从十一个物理属性里找出跟评分真正相关的因素再用合适的模型把关系表达出来”。我拿到这份《数据分析大作业-红酒数据集的分析》时完整做了一遍下来的体感是这个过程天然分成三段——先做相关性分析判断哪些变量值得留下再做多元线性回归和主成分回归来解释评分最后用 KNN 做分类作为方法对比。适合正在做课设、需要一份能直接套用完整分析流程的人参考也适合想看看回归和分类在同一个数据集上怎么衔接的从业者。整套流程从数据读取到模型预测都有可复现的代码。2. 数据预处理与相关性分析先看数据分布再谈建模2.1 从 csv 到 xlsx数据读取的第一道坎原始数据集以 csv 格式存储共 1559 条样本评分范围为 3 到 8 分其中绝大多数集中在 5 到 6 分之间。这个分布信息非常重要后面分析 KNN 准确率偏低时还要回过头来看它。csv 文件可以直接用 read.csv 读取但原文的处理方式是先用 Python 把 csv 转成 xlsx再用 R 的 readxl 包读取。这个转换不是多此一举xlsx 格式在列名识别和调试查看时更直观尤其在 RStudio 里用 View() 查看数据框时不容易出现中文乱码或列类型识别错误。import pandas as pd df pd.read_csv(winequality-red.csv, header0) df.columns [x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, q] df.to_excel(redwine.xlsx, indexFalse, sheet_nameSheet1)这里把列名直接重命名为 x1 到 x11 加上评分 q是为了后续在 R 里写公式时更简洁。如果你打算保留原始英文列名也可以但中文列名在 R 的 formula 里会遇到编码问题我一般会提前重命名。转换完成后用 df.shape 确认行列数再检查有没有空值和重复行数据集本身比较干净这一步通常不会卡住。2.2 用 spearman 计算相关性为什么不用 pearson数据读取进来之后下一步就是相关性分析。原文用的是 cor() 函数加 method spearman这个选择是有讲究的pearson 相关系数假设变量之间是线性关系且近似正态分布而评分 q 是离散的 3 到 8 分整数值分布明显偏斜pearson 容易低估变量间的关联强度。spearman 基于秩次计算对非线性但单调的关系更敏感在评分这类离散变量上更稳妥。library(readxl) df - read_excel(redwine.xlsx, sheet 1, col_names TRUE) cor_matrix - cor(df, method spearman) write.csv(cor_matrix, cor_matrix.csv)cor() 一次计算所有变量两两之间的相关系数得到一个 12×12 的相关矩阵。建议把矩阵导出成 csv 后在 Excel 里用条件格式给相关系数上色高相关变量一眼就能看出来比盯着 R 控制台里的数字直观得多。相关矩阵中评分为目标的列是重点观察对象。2.3 相关性结论如何指导变量取舍从相关矩阵能得到两组关键结论。第一组是针对评分 q 的相关性x4残糖、x6游离二氧化硫、x9pH与评分的 spearman 相关系数绝对值较低可以暂时剔除达到降维目的x2挥发性酸度与评分呈明显负相关x10硫酸盐、x11酒精与评分正相关这三个变量是后续回归分析的主力。第二组结论是变量之间的相关性这同样会影响建模质量。pH 与非挥发性酸度相关性很高这一点符合化学直觉非挥发性酸含量高会拉低 pH酒精含量与密度也有相关性因为酒精密度低于水酒精含量越高整体密度越低。变量之间存在相关性意味着后续全变量回归可能出现共线性问题这也是为什么不能把十一个属性一股脑全部丢进回归模型。3. 多元线性回归从全变量回归到三变量模型3.1 全变量回归为什么不可靠在完成相关性筛选之后我先把剩余八个变量做了一次多元线性回归。选择 x1、x2、x3、x5、x7、x8、x10、x11 进入模型也就是剔除了残糖、游离二氧化硫和 pH。用 lm() 拟合后看 summary() 输出第一反应是有些变量的系数并没有通过显著性检验p 值大于 0.05 的变量在模型中属于“留着没帮助、去掉也不影响”的状态。lm.sol - lm(q ~ x1 x2 x3 x5 x7 x8 x10 x11, data df) summary(lm.sol)问题出在变量之间的共线性上。柠檬酸和非挥发性酸度都跟 pH 强相关把它们同时放进模型系数估计会互相拉扯标准误变大显著性检验自然不过。这不是模型写错了而是数据集本身的结构决定的。这时候不要强行解释每个系数的含义而是退一步做变量筛选。3.2 三变量回归显著性通过但决定系数不高根据相关性分析的结论筛选出与评分关联最强的三个变量x2挥发性酸度、x10硫酸盐、x11酒精重新拟合模型。lm.sol2 - lm(q ~ x2 x10 x11, data df) summary(lm.sol2)这一次所有参数都通过了 t 检验模型的拟合方程为p -1.22130 × x2 0.67898 × x10 0.30920 × x11 2.61104三个变量的方向和业务常识一致挥发性酸度系数为负说明挥发酸含量高会让酒闻起来像醋评分下降硫酸盐和酒精系数为正适量亚硫酸盐起到抗氧化、保持风味的作用酒精则直接关联酒体和口感强度。但模型的 Multiple R-squared 只有 0.6589意味着评分中约 34% 的变异仍然无法由这三个属性解释。红酒的感官评分还受单宁、香气复杂度、个人偏好等因素影响而这些没有包含在数据集的物理属性中。R² 0.6589 这个水平在红酒评分预测这类偏主观的回归任务里属于中等可用水平。用它判断相对趋势没问题用它做精确到小数点后一位的评分预测就会露怯。3.3 用模型预测新样本置信区间与预测区间的区别拟合完模型还有个重要动作用留出的样本做预测验证。原数据读取时专门留下一组数据不参与拟合这组真实评分为 6 的样本属性为 x20.31、x100.66、x1111。new - data.frame(x2 0.31, x10 0.66, x11 11) lm.conf - predict(lm.sol2, new, interval confidence) lm.pred - predict(lm.sol2, new, interval prediction)predict() 函数里 interval 参数取 confidence 和 prediction 会得到两种不同的区间。置信区间描述的是“在 x2、x10、x11 取这组值时评分条件均值的可能范围”它的区间较窄预测区间描述的是“单个新样本评分值的可能范围”因为叠加了残差波动区间明显更宽。课程报告里经常有人只贴一行点预测值我一般建议把两种区间都输出区分清楚能体现对统计概念的理解。实际预测值与真实值 6 比较接近说明模型在这组数据上有一定可靠性。4. 主成分回归解决共线性并还原原始变量系数4.1 主成分提取为什么一定要用相关阵多元线性回归虽然筛到只剩三个变量但最初十一个物理属性之间明显存在相关性直接把所有变量放进回归必然出问题。主成分回归的思路是先把十一个变量压缩成少数几个互不相关的综合变量再用这几个综合变量对评分做回归。library(readxl) wine - read_excel(redwine.xlsx, sheet 1, col_names TRUE, range A1:K1559) wine.pr - princomp(wine, cor TRUE) summary(wine.pr, loadings TRUE)princomp() 的 cor 参数是决定结果差异的关键点。cor TRUE 表示基于相关矩阵做主成分分析先把每个变量标准化成均值为 0、方差为 1 再计算主成分如果用 cor FALSE则基于协方差矩阵量纲大的变量会主导主成分方向比如二氧化硫的数值范围远大于酒精结果会被它带偏。这里必须用 cor TRUE。summary() 输出的标准差和累计方差贡献率表明前五个主成分已经能解释数据的大部分变异因此取前五个主成分进入回归。4.2 从主成分得分到回归建模全部通过显著性检验得到主成分之后需要先 predict() 求每个样本在各个主成分上的得分再取前五列作为新的自变量。pre - predict(wine.pr) z1 - pre[, 1] z2 - pre[, 2] z3 - pre[, 3] z4 - pre[, 4] z5 - pre[, 5] redd - data.frame(q df$q, z1, z2, z3, z4, z5) lm.solp - lm(q ~ z1 z2 z3 z4 z5, data redd) summary(lm.solp)这次回归的结果里参数基本都通过了显著性检验整体拟合优度比直接回归更稳定。主成分之间相互正交解决了原变量间的共线性问题这是主成分回归的内在优势。不过这里有个细节容易翻车主成分变量的取值是原始变量标准化后的线性组合数据范围差异很大直接用 summary 里输出的系数去解释“某个主成分增加一个单位评分变化多少”没有实际业务含义主成分本身只是数学构造不直接对应某个物理属性。4.3 系数还原把主成分空间拉回原变量空间主成分回归最大的坑在于模型最终要能对原始属性做解释但拟合出来的系数是在主成分空间里的。如果只报告“z1 到 z5 的系数”导师一定会追问“那原变量的系数是多少”。还原方法是用主成分系数的加权组合结合每个变量的均值和标准差。XX - cor(wine) A - eigen(XX)$vectors beta - coef(lm.solp) X.bar - c(8.3623, 0.5273, 0.2719, 2.5371, 0.0878, 15.7054, 46.4037, 0.9968, 3.309, 0.6583, 10.4114) X.sd - c(1.7415, 0.1791, 0.1947, 1.4103, 0.0471, 10.4627, 32.9041, 0.00189, 0.154, 0.1695, 1.0657) coef_value - (beta[2] * A[, 1] beta[3] * A[, 2] beta[4] * A[, 3] beta[5] * A[, 4]) / X.sd beta0 - beta[1] - sum(X.bar * coef_value) c(beta0, coef_value)还原逻辑是这样的主成分 Z 等于原始变量 X 标准化后的线性组合即 Z A × (X - X.bar) / X.sd其中 A 是相关矩阵的特征向量矩阵。回归模型是 q β0 β1 × z1 β2 × z2 ...把 Z 的表达式代进去展开就能得到 q 关于原始 x 的线性表达式。A[, 1] 到 A[, 4] 对应前四个特征向量beta[2] 到 beta[5] 是回归系数。展开后常数项合并为 beta0每个变量的系数是特征向量和回归系数的加权和再除以标准差。最终结果会给出一个带常数项的输出这就是主成分回归在原始变量空间的等价表达式。很多资料到这一步就停了只告诉你“主成分回归结果不错”不告诉你系数怎么换算回去导致报告里留下一块黑匣子。5. KNN 分类实现与避坑准确率不高时先排查这几点5.1 KNN 实现特征选择、距离度量与多数表决KNN 用在新样本分类上的逻辑直观找到训练集中与测试样本距离最近的 K 个已知样本让这 K 个样本通过多数表决决定新样本的类别。原文把评分当作类别标签选择 x2挥发性酸度、x5氯化物、x7总二氧化硫、x10硫酸盐、x11酒精五项属性计算欧氏距离取距离最近的 20 个点以这 20 个点中出现次数最多的评分作为预测结果。import openpyxl def read_excel(input_file_name): workbook openpyxl.load_workbook(input_file_name) table workbook[Sheet1] objects [] for row in range(1, table.max_row): obj [] for col in range(table.max_column): if col in (1, 4, 6, 9, 10, 11): obj.append(table.cell(row 1, col 1).value) objects.append(obj) return objects def knndis(nowa, objects): distances [] for item in objects: dist sum((item[j] - nowa[j]) ** 2 for j in range(5)) ** 0.5 distances.append(dist) return distances def classify(nowa, objects, k20): distances knndis(nowa, objects) sorted_idx sorted(range(len(distances)), keylambda i: distances[i]) votes {} for i in sorted_idx[:k]: label objects[i][5] votes[label] votes.get(label, 0) 1 return max(votes, keyvotes.get)read_excel 里 col in (1, 4, 6, 9, 10, 11) 对应 x2、x5、x7、x10、x11 这五个特征在原始表里的位置objects[i][5] 是这条样本的评分标签。knndis 计算欧氏距离时注意五点同时相减再求和开方每一个维度的量纲差异都直接影响距离。原始代码里手动把最小距离改成 100 来模拟“移除已选点”sort 加切片更干净效果相同。5.2 避坑一评分分布不均衡让“准确率”失去意义现象KNN 总体准确率很低看起来像是分类器完全失效。原因这个数据集的评分大量集中在 5 和 6 分3 分和 8 分的样本极少。模型在多数表决时天然偏向频率高的类别即使距离最近的一批样本里有几个 7 分也会被更多的 5 分和 6 分“淹没”。准确率被少数类别的稀疏分布拉低不代表模型完全没有区分能力。解决先画评分分布直方图确认类别均衡情况。对不均衡数据报告里不建议只报整体准确率改成按评分值分别计算召回率或报告“最近邻评分分布”。原文在测试中也发现如果只看距离测试点最近的那个点的评分准确度明显更高这个观察正好说明问题不在算法实现而在类别分布。5.3 避坑二特征和评分相关性强弱直接影响距离度量现象无论怎么调 K预测结果都和真实评分对不上距离计算看起来像是在“随机找邻居”。原因KNN 的距离是五个特征维度上的综合距离如果某些特征与评分几乎不相关它们贡献的距离反而成为噪音。比如氯化物和总二氧化硫跟评分的相关性很弱这两个维度在距离中的存在相当于把样本在无关方向上拉开真正与评分相关的挥发性酸度、硫酸盐、酒精的信号被稀释了。解决结合第 2 章的相关性分析结果选择特征。既然相关性分析已经告诉我们 x2、x10、x11 和评分关联最强可以先只用这三个特征做距离度量再看准确率变化。如果结果变好说明降维对 KNN 同样有效。这个实验对比写进课设里很有说服力线性回归里的变量筛选结论在 KNN 里被再次验证。5.4 避坑三K 值取太大反而比 1 近邻差现象K20 时准确率平平尝试 K1 只看最近邻反而和真实评分吻合得更好。原因评分数据本身是 3 到 8 的离散整数相邻评分之间的差异只有 1 分K 越大引入的“远亲”越多多数表决结果容易向众数类别收敛等于把分类退化成了“猜 5 分 6 分”。K 值过大的本质是偏差和方差的权衡对类别密集的评分数据来说K20 过于平滑。解决把 K 作为超参数扫一遍从 1 到 30 逐个测试记录每个 K 值的准确率曲线。你会发现 K 从 5 到 10 之间通常会有一个相对更好的平台再往上走准确率反而下降。这段调参过程应当截图放进报告它展示了 KNN 三要素中 k 值选择的实际影响比单纯给结论更有说服力。距离度量方式也一样尝试曼哈顿距离或加权距离距离越近权重越大对比结果后选一个解释最顺的。6. 验收与答辩如何把分析流程讲清楚并扛住追问课程设计或大作业交上去之后最怕的不是代码跑不出来而是被问到“为什么这么做”时答不上来。验收前建议把整个分析过程压缩成一条故事线从 1559 条样本、11 个属性、评分 3 到 8 分的数据现状出发先通过 spearman 相关性分析筛掉与评分弱相关的残糖、游离二氧化硫和 pH再用筛选后的三变量做多元回归得到方程 p -1.22130x2 0.67898x10 0.30920x11 2.61104接着用主成分回归解决变量共线性并还原原始系数最后用 KNN 做分类对比。这条线每一环都在回答上一个结论遗留的问题讲的时候按这条线走导师跟着你的逻辑走就不会跑偏。答辩时有三个问题基本必问。第一个是“为什么相关性分析用 spearman 不用 pearson”回答要点是评分是离散整数且分布偏斜spearman 基于秩次更稳健。第二个是“R 方只有 0.6589 你怎么解释”不要回避直接说评分是主观感受现有物理属性无法覆盖全部影响因素这个模型反映的是主要趋势而非精确预测。第三个是“主成分回归得到的系数和普通回归有什么不同”回答主成分回归消除了共线性对系数估计的干扰并通过特征向量还原成了原始变量空间的可解释系数。演示环节建议只展示三张核心输出相关性矩阵的热力图、三变量回归的 summary 输出、主成分系数还原后的最终表达式。这三张图能支撑起 80% 的讲解内容。有一个实战技巧是提前准备一张真实的预测对比表把留出样本的真实评分、多元回归预测值、主成分回归预测值、KNN 预测结果四列放在一起现场演示时直接指出每个方法的偏差大小比空讲理论有力得多。数据来源如果不是作业指定的记得在参考文献里标注数据集出处简单一行说明来源名称和下载日期就可以。从那以后我每次交数据分析作业都强制走一遍“数据分布观察 → 相关性分析 → 回归建模 → 降维对比 → 分类验证”的完整流程哪怕某个环节结论不理想比如 R 方不高或者 KNN 准确率偏低也要把原因讲清楚再往下走。别人交的是结果你交的是思路。希望帮到你。本文还有配套的精品资源点击获取