简介数学建模电工杯赛题《人工智能对大学生学习影响的评价》的参赛论文完整收录文件为DOCX格式共1个文档压缩包大小871KB。该论文聚焦AI技术对大学生学习的实际影响从问卷数据预处理入手包括缺失值筛查、异常样本剔除、问卷信效度检验以及回答数值化编码在此基础上构建调查者基本信息、学习情况、对AI态度、AI发展四个一级指标并论证二级指标选取合理性。建模方面通过KMO与Bartlett球形检验、主成分分析和t-SNE降维完成指标体系压缩再借助TOPSIS综合评估影响程度并排序提取受影响较大人群的公共特征最终形成包含积极、消极与未来展望的分析报告。全文结构紧凑涵盖摘要、问题重述、模型假设、符号说明与完整求解过程既可作为数学建模竞赛的范文参考也能帮助学习者掌握数据清洗、综合评价等实用方法。目前已有200人学习下载值得相关方向研究者借鉴。1. 为什么说这道赛题拼的是数据处理和降维选型我拆完这套“数学建模电工杯-人工智能对大学生学习影响的评价”资源后最直观的感受是它不像常规预测类建模赛那样以准确率论英雄而是把大部分分值压在“问卷能不能被清洗成可信数据”和“指标体系该不该降维”这两件事上。很多队伍拿到赛题第一反应是去找AI工具跑分类但真正拉开差距的是数据清洗、信度效度检验、PCA/t-SNE/TOPSIS这条链路走得稳不稳。这套资源适合准备问卷型建模赛的参赛者也适合手里有问卷数据却不知道怎么构建综合评价指标的研究者它解决的是从原始Excel问卷到最终得分排序的完整流程而不是给你一个黑箱模型。2. 问卷数值化处理从残缺数据到可建模编码问卷型赛题的第一站不是建模而是把文本选项变成数字。这道题的附件里包含30多道题很多人的第一反应是把所有题都塞进模型但这会带来两个问题一是单选题和多选题混在一起选项之间还存在逻辑矛盾二是没有编码就直接计算后续信度、权重、降维都会失真。这一章我把资源里的数据清洗、编码、信度效度检验拆开讲每一步都对应一个可以直接跑的脚本。2.1 数据清洗先抓逻辑异常再谈缺失值原始问卷里最常见的脏数据是缺失值但比缺失值更隐蔽的是逻辑异常。这份赛题里面有一题问“每周上网时长”其中一个选项是“不上网”另一题问“是否使用过学习软件工具”选项是“是/否”。从数据上看确实有相当一批样本在第一题选了“不上网”却在第二题选了“是”这在真实场景中几乎不可能成立。如果不做处理这类样本会成为指标体系里的离群点影响KMO、信度和权重计算。我复现这份资源时用pandas把这两列取出来做了交叉筛选。常规的缺失值填充在这里反而会帮倒忙因为“不上网但使用学习软件”是逻辑矛盾不是随机缺失。import pandas as pd # 读入数据后先把列名映射成英文方便后续处理 # net_time: 每周上网时长 # use_soft: 是否使用学习软件 data pd.read_csv(questionnaire.csv, encodinggbk) # 逻辑异常样本选“不上网”但同时又“使用过学习软件” logic_error data[(data[net_time] 不上网) (data[use_soft] 是)].index print(f逻辑异常样本数: {len(logic_error)}) # 剔除这些样本并顺带删除完全空白的行 clean data.drop(indexlogic_error) clean clean.dropna(howall) clean.to_csv(questionnaire_clean.csv, indexFalse, encodingutf-8-sig)这段代码的核心不是删除动作而是先用组合条件圈定“逻辑矛盾样本”再整行剔除。原论文里给出的异常样本数是101个我核对后基本吻合。需要注意net_time和use_soft的文本必须和问卷里的选项完全一致如果导出数据里带了空格或全角标点要先做清洗统一否则筛选会漏掉样本。另外不要用data.isna().any()直接把所有含缺失值的行删掉很多样本只是个别题空着删掉会损失有效信息。2.2 编码方案设计让选择题变成可计算变量数据清洗后要做的是数值化编码。问卷里多数题是单选题直接按选项顺序映射成1、2、3即可但有几类题要特殊处理多选题要拆成多个0-1哑变量程度类选项要保证方向一致比如“非常赞同”到“非常反对”不能映射成3、2、1、0、-1后又被反向使用还有“是否使用过学习软件”这类二分变量按0/1编码即可。原资源里给了一张编码表部分内容如下题干编码变量选项映射您的性别gender女1男2您的专业major文法类1理工类2经管类3艺术教育类4您所在的年级grade大二1大一2大三3大四4您的性格personality其他1安静型2温顺型3坚定型4感性型5外向型6最常通过哪种方式上网net_mode手机1网吧2寝室笔记本3平板4其他5这里有一个容易被忽略的坑年级的编码不是按自然年级顺序从大一到大四而是问卷原本的选项顺序是“大二、大一、大三、大四”所以编码结果里大二的数值比大一还小。这个顺序本身不影响PCA和TOPSIS因为后续会做标准化但如果你拿这个变量去做回归解释解读方向就会反。# 单选题映射 encoding_map { gender: {女: 1, 男: 2}, major: {文法类: 1, 理工类: 2, 经管类: 3, 艺术教育类: 4}, } # 多选题拆分成0-1变量 # 例如q25“进入大学后困扰您的问题”是多选题 for option in [学习动力不足, 学习方法不当, 经验缺乏, 其他]: data[fq25_{option}] data[q25_text].apply( lambda x: 1 if option in str(x) else 0 )逻辑说明单选题用字典映射保证编码可追溯多选题按选项生成哑变量这样后续相关性分析和降维都不会把“多选”误当成一个连续变量。参数说明哑变量命名建议带原题号比如q25_学习方法不当否则后面做指标解释时根本找不到对应关系。我在复现时遇到过一个问题原始数据里多选题选项用中文逗号分隔直接str(x)匹配会把“学习动力不足”错配成“动力”所以必须用完整选项文本匹配或者先做split再匹配。2.3 信度效度检验为什么要看Cronbachs Alpha和KMO编码完成后不能直接进指标体系先做信度和效度检验。信度用Cronbachs Alpha衡量问卷内部一致性效度用KMO检验和Bartlett球形检验衡量变量之间是否有足够相关性去做因子类分析。原资源的统计结果Cronbachs Alpha为0.669KMO为0.651Bartlett球形检验p值小于0.05。按一般标准Alpha在0.6-0.7之间属于“信度一般但可接受”KMO在0.6-0.7之间属于“适合做因子分析但效果一般”。我一般会先分维度算Alpha而不是整个问卷一起算。整体Alpha偏低经常是因为题目维度太多比如把“基本信息”和“对AI态度”混在一起算信度自然被稀释。先按四个维度分别算再报告总量表的值这样既合理又能让评委看到你在关注问卷结构。KMO的计算公式是变量间简单相关系数平方和与偏相关系数平方和的比值简单说就是看变量之间的公共信息够不够多。Bartlett检验则判断相关矩阵是不是单位矩阵如果不是才说明变量不是互相独立的可以做降维。这里额外说一下我对效度检验顺序的执念正确顺序是清洗、编码、信度效度、指标体系。有人会先做信度效度再做编码这是错的因为信度效度处理的是数值化后的选项不是原始文本。比如“性别”的“男”“女”如果不映射成1和2KMO计算根本跑不起来。原资源里先做编码再进统计软件这个顺序不能乱。注意信度检验出问题不要急着调数据先检查有没有反向题没翻转。常见原因是“我支持AI辅助学习”和“我担心AI取代教师”这类题方向相反不翻转就合并计算会严重拉低Alpha。3. 指标体系构建与合理性论证熵权法和相关性分析问题要求从四个维度构建指标体系并论证指标选取的合理性。原资源把问卷题目分成“个人基本情况”“调查者学习情况”“对人工智能态度”“人工智能发展”四个一级指标每个一级指标下有若干二级指标。这一章重点说清楚指标怎么落地以及怎么用客观方法证明这些指标不是拍脑袋选的。3.1 四个一级指标和二级指标怎么来的我先把这套资源构建的指标体系骨架列出来方便你看清楚层级一级指标A个人基本情况。二级指标性别、专业、年级、性格、最常上网方式、每周上网时长。一级指标B调查者学习情况。二级指标使用学习软件的时间段、是否分享资料、网络主要活动、进入大学后的主要困扰、对学习软件形式的关注点。一级指标C对人工智能态度。二级指标是否有用AI完成作业的想法、完成小测验的想法、完成论文的想法、是否赞同大学生使用AI工具、最不希望出现的情况、对AI回答可信度的态度、AI与教育结合后学生如何适应。一级指标D人工智能发展。二级指标希望AI学习工具达到的效果、AI能否取代教师、关注哪些安全性、认为哪些方面重要、期望具备的功能、应该融合到哪个学习环节。这里有一个选指标的原则先根据研究目标圈定维度再在每个维度里删除与“学习影响”无关的题。比如问卷里可能有纯人口学的问题但如果它和AI使用态度没有逻辑关联就不要进指标体系。原资源把“性别”保留是因为后续要做公共特征提取需要判断不同性别受AI影响是否有差异。指标体系的合理性要从优先级、科学性、可操作性三个角度论证。优先级用熵权法算权重科学性用相关性分析可操作性就是保证每个二级指标都能从编码后的问卷数据中直接取到。3.2 熵权法计算权重客观权重怎么算熵权法的思想很直白一个指标的信息熵越小说明样本在该指标上的差异越大携带的信息越多权重就应该越高。原资源里用熵权法计算了个人基本情况各指标的权重其中“最常上网方式”权重接近46%而“专业”权重只有5.6%。这意味着在这个问卷里上网方式是区分学生受影响程度最有力的变量。计算步骤如下设原始数据矩阵为X有n个样本、m个指标先按列做归一化得到p_ij再计算每个指标的熵值e_j然后用1-e_j得到信息效用值最后归一化成权重w_j。我复现时写了这么一段import numpy as np def entropy_weight(X): # X: n x m 的数值矩阵, 已经编码完成 X np.array(X, dtypefloat).copy() # 平移消除负数影响保证非负 X X - X.min(axis0) # 归一化到 [0,1] 并防止0 p (X 1e-12) / (X.sum(axis0, keepdimsTrue) 1e-12) k 1.0 / np.log(X.shape[0]) e -k * (p * np.log(p)).sum(axis0) d 1 - e w d / d.sum() return w cols [gender, major, grade, personality, net_mode, net_time] weights entropy_weight(data[cols].values) print(weights)逻辑说明代码先做平移和归一化再用熵公式计算熵值之后用信息效用值归一化得到权重。参数说明1e-12是防止log(0)如果某个指标是二分变量且分布极不均衡比如“是否使用过软件”有95%是“是”熵值会接近1权重就会很小这符合熵权法“区分度越高越重要”的逻辑。需要特别提醒熵权法对缺失值敏感所以在计算前要确保数据已经清洗完不要用np.nan_to_num粗暴填充否则权重会被虚拟值带偏。3.3 相关性分析用皮尔逊系数论证指标重复和独立指标合理性论证的第二块是相关性分析。原资源用皮尔逊相关系数检验每个一级指标下二级指标之间的关联目的是说明这些指标不是简单的复制粘贴关系。皮尔逊相关系数公式是样本协方差除以两个样本标准差之积取值在[-1,1]之间。以个人基本情况为例计算结果显示性别与专业、年级之间的相关系数分别为-0.307和-0.316且在0.01水平显著。这个相关性不算高但也不低说明理工科男生多、低年级样本多指标之间的共线性还在可接受范围内。如果两个二级指标相关性超过0.8就说明它们测的东西重复了应该删掉一个否则后续PCA会把重复信息再放大一次。from scipy.stats import pearsonr cols [gender, major, grade, personality, net_mode, net_time] corr_matrix data[cols].corr(methodpearson) # 只看强相关位置 mask np.abs(corr_matrix) 0.5 print(corr_matrix[mask])逻辑说明这段代码用corr()直接得到相关系数矩阵mask筛出强相关的位置。参数说明methodpearson是默认如果问卷里有明显的序数变量也可以改用spearman做稳健性检验。原资源只报告了部分相关性我建议在论文里至少给一个附录完整相关性矩阵评委更容易找到你的合理性论证。在做完相关性分析后我还会顺手算一下VIF方差膨胀因子来量化共线性。虽然原资源没有提VIF但在这个场景下VIF是个很好的补充。VIF的计算方式是先让每个二级指标对同组其他指标做回归取R²然后VIF1/(1-R²)。如果某个指标VIF超过10说明它被其他指标预测得太好信息重复度高应该考虑删除或合并。在个人基本情况里VIF最高的通常是“上网方式”因为它是多分类哑变量里区分度最高的一个和“上网时长”有天然的相关性但两者信息内容不同可以保留。有了熵权权重和相关性结果论文里的合理性论证就不用再说“指标选择符合经验”这种空话而是用表格展示权重、相关系数、VIF值评委自然能看出你不是拍脑袋选的指标。4. 从质量检验到TOPSIS降维与综合评价的完整链路这一章是整套资源的技术核心。四个一级指标汇总起来有二十多个二级指标直接进模型会有共线性问题所以需要先做质量检验再决定用什么方法降维最后用TOPSIS得到综合得分。4.1 KMO和Bartlett检验确定哪些指标能走PCA主成分分析适合在变量相关性较强的场景下使用所以先做KMO和Bartlett球形检验。原资源对四个一级指标分别做了检验结果如下一级指标KMO值Bartlett p值降维方法个人基本情况0.6650.000PCA对人工智能态度0.7650.000PCA人工智能发展0.7140.000PCA个人学习情况0.4210.000t-SNE注意个人学习情况的KMO只有0.421低于0.5的常见可接受下限说明该维度下变量之间相关性太弱强行用PCA降维会把大量有效信息压缩进低维主成分里所以原资源在这种场景下改用t-SNE。这是一个很实用的判别逻辑不是PCA不好而是数据不满足它的前提。Bartlett球形检验p值小于0.05说明相关矩阵不是单位矩阵变量间存在整体显著的相关性可以做因子分析如果p值大于0.05说明变量几乎独立降维就失去意义。个人学习情况虽然p值也小于0.05但KMO太低所以不选PCA。4.2 PCA和t-SNE降维为什么个人学习情况必须用t-SNEPCA的流程是先对指标做z-score标准化再计算协方差矩阵的特征值和特征向量按累积贡献率提取主成分。原资源里个人基本信息、对AI态度、AI发展三个维度都走了PCA累积贡献率一般取80%以上。我复现时用sklearn一步到位from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA scaler StandardScaler() X_scaled scaler.fit_transform(data[cols_for_pca]) # 自动选择累积贡献率达到85%的主成分个数 pca PCA(n_components0.85, svd_solverfull) X_pca pca.fit_transform(X_scaled) print(pca.explained_variance_ratio_.cumsum())逻辑说明n_components0.85会自动选择让累积贡献率达到85%的主成分个数。参数说明svd_solverfull可以避免大数据量下的内存问题如果样本量小实际跑出来的解释率会很波动建议固定主成分个数为2或3方便后续的可视化和TOPSIS计算。PCA降维出来的每个主成分是原始指标的线性组合它的系数可正可负所以在解释主成分含义时不能只按系数绝对值大小来理解。比如“对人工智能态度”维度里“是否赞同大学生使用AI工具”有正载荷“是否担心AI回答不可信”有负载荷第一主成分代表的是“整体接受度”。在论文里一定要给每个主成分写一个明确名字否则TOPSIS得分排行出来读者不知道在排什么。t-SNE是另一套逻辑它把高维点映射到低维时强调保留局部结构适合变量相关性弱但样本存在类别结构的场景。原资源对个人学习情况维度用t-SNE降成2维。需要注意t-SNE的随机性很强必须固定随机种子。from sklearn.manifold import TSNE # perplexity一般取5到50样本量小取小值 tsne TSNE(n_components2, perplexity30, learning_rate200, random_state42) X_tsne tsne.fit_transform(scaler.fit_transform(data[cols_for_tsne]))参数说明perplexity控制每个点周围近邻的有效数量太小会忽略局部结构太大会忽略全局结构learning_rate通常200到1000太小会陷入局部最优太大会震荡。random_state42保证可复现如果不固定每次跑出来的二维坐标不一样后续TOPSIS得分也会跟着变这在建模竞赛里是硬伤。4.3 TOPSIS综合评价把降维结果汇总成得分排序三个PCA降维结果加一个t-SNE降维结果现在每个样本在四个维度上各有一个低维向量但它们的量纲和距离意义不同直接拼起来不行所以用TOPSIS做综合评价。TOPSIS的基本思想是构造理想解每个指标的最优值和负理想解最劣值然后计算每个样本到两者的距离用相对贴近度排序。def topsis(X, weights, cost_cols[]): # X: 样本-指标矩阵, weights: 各指标权重, cost_cols: 成本型指标列 X np.array(X, dtypefloat).copy() # 正向化成本型指标用最大值减去原值 for i in range(X.shape[1]): if i in cost_cols: X[:, i] X[:, i].max() - X[:, i] # 向量归一化 norm np.sqrt((X**2).sum(axis0)) Z X / norm # 加权 Z Z * weights z_plus Z.max(axis0) z_minus Z.min(axis0) d_plus np.sqrt(((Z - z_plus)**2).sum(axis1)) d_minus np.sqrt(((Z - z_minus)**2).sum(axis1)) c d_minus / (d_plus d_minus) return c score topsis(X_all, weights)逻辑说明TOPSIS里最重要的两步是正向化和归一化。如果不做正向化成本型指标的最优解方向搞反得分排序会完全颠倒。参数说明weights这里我习惯用各一级指标内部二级指标熵权法权重的平均值也可以在四个一级指标之间再做一次熵权法原资源里没有明确说明但竞赛中最好在论文里写清楚权重来源。在汇总四个维度的降维结果时维度之间的权重分配是个容易引起评委追问的地方。我的做法是先对四个一级指标内的二级指标用熵权法得到二级权重再把同一个一级指标下的二级权重求和得到该一级指标对总分的权重最后把这个权重乘到降维后的特征上再进TOPSIS。这样做的好处是权重来源全部是客观数据不需要人为设定四个维度各占多少解释起来干净。另一个细节是PCA和t-SNE降维后的列数不一致三个PCA维度可能各保留2到3个主成分t-SNE只有2列加在一起数字不一样。TOPSIS不看列名只看数值矩阵所以拼接时只要保证每行样本对齐即可。我会在拼接前用reset_index(dropTrue)统一索引不然会有隐式对齐导致的行错位这个坑在pandas里很常见。TOPSIS得到相对贴近度C值后按C值从高到低排序C值越高说明该样本受人工智能学习影响的综合程度越大。后续就能把排名前10%的样本找出来做公共特征提取。5. 避坑记录这份赛题最容易被坑的五个地方问卷型建模赛翻车通常不是死在模型复杂而是死在数据处理和对方法的误用。这一章我整理了五个在这套资源复现过程中真实踩过的坑每条都是现象、原因、解决对照着说。5.1 现象信度检验Alpha只有0.4论文写不下去原因我一开始把整卷30道题一起算Cronbachs Alpha结果Alpha只有0.4怎么看都不合格。后来发现问卷里有反向题比如“您是否赞同AI辅助完成作业”和“您是否担心AI学习工具出现错误”前者正向后者反向不翻转就合并算信度内部一致性当然会崩。解决先识别反向题统一翻转成同一方向。翻转公式是score max_scale min_scale - score也就是5点量表用6 - 原值。翻转后再分维度算Alpha整卷Alpha从0.4提到了0.66。从那以后我每次拿到问卷数据第一件事就是找反向题。5.2 现象KMO只有0.421还硬用PCA降维原因个人学习情况这个维度里的问题比较杂比如“用什么时间段学习软件”“是否分享资料”“关注学习软件哪方面”它们之间本来就不存在强线性关系KMO检验已经告诉你数据不适合PCA但我当时带着“PCA是很普遍的降维工具”的惯性思维直接跑了。解决先把KMO跑出来小于0.5就果断换t-SNE。t-SNE不需要线性相关前提对“相关性弱但存在局部结构”的数据有更好的保留效果。换完之后后续TOPSIS排序的合理性明显提升。5.3 现象TOPSIS得分排序和肉眼观察结果完全相反原因TOPSIS里的指标没有做正向化。例如“您是否担心AI工具不可信”是个成本型指标值越大说明越担心对学习影响可能是负向的但我的归一化函数把所有指标都按越大越优处理了导致最担心的人反而得分最高。解决给cost_cols参数传入成本型指标的列索引在TOPSIS循环里对这些列用最大值减原值做正向化。也可以在数据预处理阶段就统一正向化比如“最不希望出现的情况”这类选项编码后先取反再进模型。5.4 现象t-SNE每次跑出来结果都不一样排名来回变原因t-SNE使用随机初始化每次迭代起点不一样导致的低维坐标也不一样最终反映到TOPSIS得分上就是C值小幅波动。解决固定random_state42。如果真想看稳定性可以跑10次取平均C值但竞赛论文里最好直接给“固定随机种子可复现”的说明不要给评委留下“结果不可靠”的理由。5.5 现象异常值剔除把有效样本也删了原因我在清洗时条件写成data[data[net_time] 不上网]想只删掉“不上网”的人结果把正常不上网且不用学习软件的人也删了有效样本损失严重。解决异常值剔除必须先明确“哪里矛盾”再写组合条件(net_time 不上网) (use_soft 是)也就是“不上网但使用学习软件”这个交集。删除之前先打印样本数确认删除量级是合理的比如原资源中的101个再落盘。提示异常值和缺失值处理顺序不要搞反。先做缺失值填充可能掩盖逻辑矛盾比如你用众数把“不上网”填成“7小时以下”逻辑异常就不存在了但这是伪造数据。6. 进阶技巧用TOPSIS得分Top群体做公共特征提取很多参赛队做到TOPSIS排序就停了但原资源里还藏了一步很有价值的动作对排名靠前的人群做公共特征提取。这一步做得好能把综合评价结果转化成“哪些学生受AI影响最大”的具体描述直接服务问题四的分析报告。我一般会把C值排名前10%的样本定义成“高影响组”排名后10%定义成“低影响组”然后对比这两组在原始问卷上的分布差异。不用跑复杂模型就用交叉统计和均值对比就能找到几个鲜明特征。比如在原数据里高影响组的学生更集中在理工科每周上网时长普遍超过20小时而且对“用AI工具完成论文”的支持率远高于低影响组。这些特征就是从TOPSIS分数排名反推出来的比你直接看图说话更有说服力。# top_score: 前面topsis计算的C值 data[score] top_score top_group data[data[score] data[score].quantile(0.9)] low_group data[data[score] data[score].quantile(0.1)] # 对比离散特征的均值 for col in [gender, major, net_time]: print(col, top_group[col].mean(), low_group[col].mean()) # 对比多选题选项的占比 for col in [q23_学习资料, q25_学习方法不当]: print(col, top_group[col].mean(), low_group[col].mean())这里有一个容易忽略的细节提取公共特征时不要只盯着数值差异还要看差异方向是否和你的评价模型逻辑一致。比如高影响组里“认为AI可取代教师”的比例更高但这道题编码方向可能是“很不同意1很同意5”均值更高说明高影响组更认同替代这并不代表负面影响更大需要结合题目语义来解释。我在这上面翻过一次车后来形成习惯每次做这种对比都会先看一遍原问卷的选项顺序确认编码方向没有反。另一个进阶做法是给四个一级指标分别做TOPSIS子得分而不是只做一个总得分。这样你能看到一个人是因为“态度积极”排到前面还是因为“上网方式特殊”排到前面对分析报告里的“积极、消极、未来”三个部分都有更细的素材。原资源的主模型只给了一个总得分没有拆分我建议在附录里补一张子得分热力图。我整理这套资源时把清洗、编码、降维、TOPSIS四段脚本单独抽成了文件这样下次换一份问卷也能改改列名直接复用。从那以后我每次做问卷建模都强制先走一遍“逻辑异常、反向题翻转、KMO决定降维方法、固定t-SNE种子”四步预处理再开始建模基本没再因为数据问题返工。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?