简介围绕电工杯“人工智能对大学生学习影响的评价”赛题整理的完整论文文档面向备战数学建模竞赛、需要参考问卷分析与综合评价写法的学生与指导教师。文档按完整求解流程展开先对调查问卷做问题筛选、缺失值与异常值处理再将回答编码数值化并完成信效度检验随后构建基本信息、学习情况、AI态度、AI发展四个一级指标及二级指标结合KMO与Bartlett检验对通过检验的指标使用主成分分析降维未通过的采用t-SNE处理并以TOPSIS模型完成综合评价与排序最后对高影响群体做公共特征提取并给出积极、消极与未来发展三方面的非技术性分析。压缩包共1个docx文件约871KB适合按赛题步骤对照复现。已有201人学习可作为电工杯真题论文范本与建模流程参考。1. 一份问卷的距离为什么“数值化”才是这套评价模型真正的起点多数人翻这类人工智能影响评价的建模稿目光会直奔最后的 TOPSIS 排名觉得高光在综合评价那一步。真正决定结论可不可信的反而是最不起眼的一环把“您最常通过哪种方式上网”这种文字选项压成一张能进矩阵的数值表。选项一旦编错后面熵权法算出的权重、主成分载荷、正负理想解会集体跑偏排名看着漂亮结论却是假的。这套答卷值得看的地方就在于它把从原始问卷到可计算矩阵的每一步都摊开写了包括那次 KMO 只有 0.421、被迫从主成分分析切到 t-SNE 的分岔。搞清楚这条链路你才明白一个“人工智能对大学生学习影响”的结论究竟是怎么从几百份问卷里一步步长出来的以及哪一步塌了会全盘皆输。2. 数据清洗与信效度异常样本和 Cronbach α 各拦的是什么2.1 逻辑矛盾的 101 条样本异常值不等于统计学离群点附件 2 里有一类样本任何基于分布的异常检测都抓不到。第 6 题问每周上网时长选项里有“不上网”第 7 题问是否使用过学习软件工具选项是“是/否”。有人第 6 题勾了“不上网”第 7 题却勾了“是”——一个声称不上网的人怎么可能用过在线学习软件。这不是数值上的离群点3σ 准则和箱线图对它完全失效因为这两列是类别变量压根没有分布假设可言。它属于语义层面的互斥只能靠人工定义规则去筛。答卷里的做法很朴素用表格软件按两列条件筛或者用 matlab 的 find 定位把同时满足两个条件的行找出来累计 101 条整行剔除。换成代码逻辑是这样的import pandas as pd df pd.read_excel(附件2.xlsx) # Q6 的 E 选项代表“不上网”Q7 的 A 选项代表“使用过学习软件” # 两者同时成立即为逻辑互斥样本 mask_conflict (df[Q6] E) (df[Q7] A) # 关键列缺失的样本同样不可用一并标记 mask_missing df[[Q6, Q7]].isna().any(axis1) drop_index df.index[mask_conflict | mask_missing] print(逻辑矛盾样本数:, int(mask_conflict.sum())) print(本次剔除总数:, len(drop_index)) clean df.drop(indexdrop_index).reset_index(dropTrue)mask_conflict是一个与行数等长的布尔向量两侧必须加括号否则运算符优先级会让 pandas 报错。mask_missing用any(axis1)把“任一关键列为空”折叠成行级标记。最后reset_index(dropTrue)不能省行号断档会让后面按位置索引的矩阵拼接错位。这类清洗的价值在于它剔掉的是自相矛盾的记录而不是“看起来极端”的记录剔除标准可复现、可解释答辩时经得起追问。真正容易翻车的是剔除顺序。如果先做信度检验、再剔异常样本等于用脏数据算了一遍可靠性报出来的 α 系数和清洗后的真实值对不上。正确的固定顺序是缺失值判定 → 逻辑规则清洗 → 信效度检验 → 建模。这条顺序一旦定下中途不要调换。2.2 Cronbach α 与 KMO/Bartlett一个管可靠性一个管可降维性问卷清洗完接下来要回答两个不同的问题。Cronbach α 回答的是“这套题问得稳不稳”同一批人反复答结果会不会漂KMO 和 Bartlett 回答的是“这批题之间有没有足够的相关性能不能压缩”。两者经常被混为一谈其实是两个方向。α 系数的计算逻辑是拿题项方差和与总分方差做比较import pandas as pd def cronbach_alpha(items: pd.DataFrame) - float: items: 每列一个题项每行一个被试且已完成数值化 k items.shape[1] # 题项数量 item_var_sum items.var(axis0, ddof1).sum() # 各题项方差之和 total_var items.sum(axis1).var(ddof1) # 总分方差 return k / (k - 1) * (1 - item_var_sum / total_var)公式本身是α k/(k-1) × (1 - ΣS_i²/S_T²)ddof1表示用样本方差而非总体方差样本量不大时这个差别会体现在小数点后第二位。系数越接近 1说明题项之间越一致但一致性过高也未必是好事可能意味着好几道题在问同一件事属于冗余。答卷给出的结果是标准化 α 为 0.692、未标准化为 0.669按常见判定区间落在“信度一般、可以接受”这一档。0.6 到 0.7 之间本来就是个尴尬区间说它差不算差说它好也谈不上写结论时语气要留余地。KMO 和 Bartlett 则是降维的前置门禁from factor_analyzer.factor_analyzer import ( calculate_kmo, calculate_bartlett_sphericity, ) kmo_per_item, kmo_total calculate_kmo(items) chi2, p_value calculate_bartlett_sphericity(items) print(fKMO {kmo_total:.3f}) print(fBartlett 卡方 {chi2:.3f}, p {p_value:.4f})calculate_kmo返回两个值前者是每个题项各自的 KMO 值后者才是整组指标的总体 KMO。Bartlett 球形检验的原假设是“相关矩阵为单位阵”p 值小于 0.05 就拒绝原假设说明变量之间确实存在相关性值得做因子分析。答卷里 KMO 为 0.651、近似卡方 1300.811、自由度 210、显著性为 0这组数字说明问卷整体“勉强够格”做降维但远谈不上理想。2.3 编码表把“坚定型性格”变成可计算的数数值化是整条链路里最容易被轻视、又最容易埋雷的一步。答卷给出的编码表长这样题干编码选项Q2 性别1 / 2女 / 男Q3 专业1 / 2 / 3 / 4文法类 / 理工类 / 经管类 / 艺术教育类Q4 年级1 / 2 / 3 / 4大二 / 大一 / 大三 / 大四Q5 性格1 / 2 / 3 / 4 / 5 / 6其他 / 安静型 / 温顺型 / 坚定型 / 感性型 / 外向型Q6 上网方式1 / 2 / 3 / 4 / 5手机 / 网吧 / 寝室笔记本 / 平板 / 其他这张表里藏着两个必须警惕的点。第一性别、专业、性格都是名义变量1 和 2 之间没有大小关系把它们当连续数喂给熵权法等于凭空造出一个“男比女大”的序。第二年级的编码顺序是乱的——1 是大二、2 是大一、3 是大三、4 是大四如果后续模型把年级当作有序变量处理它读到的大小关系就是错的。这类错误不会报错只会让权重和载荷悄悄偏掉属于典型的黑匣子式翻车。常见的补救思路是名义变量先做独热编码再进模型确实需要保留单列时至少保证编码方向与业务含义一致并在附录里写清每个数字对应什么。有序变量比如 Likert 五级量表则可以保留单列但必须让编码单调递增。答卷在正文里给了编码表这一步做对了但后续熵权法仍把名义编码当数值用这个取舍在后文还会再提。3. 指标体系与熵权法权重为什么不能靠主观分配3.1 四个一级指标是怎么切出来的指标体系的骨架直接沿用问卷的四个板块调查者基本信息、调查者学习情况、调查者对人工智能的态度、人工智能发展。每个一级指标下面挂若干二级指标题号一一对应。基本信息挂性别、专业、年级、性格、上网方式、上网时长学习情况挂使用学习软件的时间、资料分享意愿、网络活动类型、入学后的主要困扰、对学习软件形式的关注点对人工智能态度挂完成作业/小测/论文的意愿、对大学生使用的赞同度、最不希望出现的问题、对回答可信度的判断、与教育结合后的适应方式人工智能发展挂期望效果、能否取代教师、安全性顾虑、重要方面、期望功能、应融合的教学环节。这套切法的合理性要从三个角度去论述。优先级上研究目标是“影响程度”所以“对人工智能态度”和“学习情况”权重天然高于“基本信息”基本信息更多是分层变量而非解释变量。科学性上每个二级指标都要能对应到具体题项不能出现“学习能力”这种问卷里根本测不到的抽象概念。可操作性上指标必须已经完成数值化缺失率低且题项表述不带引导性。真正让这套体系站得住脚的是下一节的相关性论证。指标不是拍脑袋列完就完事还要证明同一一级指标下的二级指标确实在测同一个东西。3.2 熵权法的信息论推导与实现熵权法的出发点是某个指标在样本间分布越分散它携带的区分信息越多权重就该越大反过来如果所有人在这道题上都选同一个选项这个指标对排序毫无贡献权重就该趋近于零。这套逻辑完全由数据决定不掺主观判断正好对上建模题里“客观赋权”的要求。计算分四步。先算第 j 个指标下第 i 个样本的比重p_ij x_ij / Σx_ij再算熵值e_j -k Σ p_ij ln(p_ij)其中k 1/ln(n)接着算差异系数d_j 1 - e_j最后归一化得到权重w_j d_j / Σd_j。import numpy as np def entropy_weight(X: np.ndarray) - np.ndarray: X: n 个样本 × m 个指标需预先正向化且全部非负 n, m X.shape # 1) 计算比重矩阵clip 防止 log(0) P X / X.sum(axis0, keepdimsTrue) P np.clip(P, 1e-12, None) # 2) 熵值k 1/ln(n) 使 e_j 落在 [0,1] k 1.0 / np.log(n) E -k * (P * np.log(P)).sum(axis0) # 3) 差异系数熵越大差异越小 D 1.0 - E # 4) 归一化为权重 return D / D.sum()keepdimsTrue保证广播时维度对齐np.clip那行是后悔药问卷里某个选项零人选时p会等于 0log(0)直接变-inf整列权重报废。n是有效样本数剔除 101 条异常样本后要用清洗后的行数不能沿用原始总数。答卷算出的权重分布很有代表性上网方式 45.903% 最高性别 14.574%、年级 13.249%、性格 11.915%、上网时长 8.732%专业只有 5.627%。上网方式权重畸高不是因为它对“学习影响”最重要而是因为样本里几乎没人选“网吧”选项分布极度不均熵值低、差异系数大权重被机械抬高。这是熵权法的固有特性也是它最容易被误读的地方——权重高只代表区分度大不代表业务重要性高。写结论时必须补一句解释否则评审会直接质疑“上网方式凭什么占近一半权重”。3.3 Pearson 相关性科学性论证还是自我循环相关性分析在这套流程里承担的是“指标选取合理性”的举证责任。答卷用的是 Pearson 相关系数公式为样本协方差除以两个样本标准差的乘积取值落在 -1 到 1 之间绝对值越大线性关系越强。import pandas as pd # 只取个人基本情况这一组二级指标 basic clean[[Q2, Q3, Q4, Q5, Q6, Q7]].astype(float) corr basic.corr(methodpearson) print(corr.round(3)) # 同时输出显著性样本量小时只看系数会误判 from scipy.stats import pearsonr for i in basic.columns: for j in basic.columns: if i j: r, p pearsonr(basic[i], basic[j]) print(f{i}-{j}: r{r:.3f}, p{p:.3f})corr只给系数不给显著性样本量一大很小的系数也会显著所以要配pearsonr一起看。答卷表 6 里性别与专业的相关为 -0.307、与年级为 -0.316都在 0.01 水平上显著说明这几个基本信息之间确实存在关联指标不是彼此独立的噪声。这里有个方法论上的隐患值得说透用相关性证明“指标选得合理”逻辑上有点循环。相关性高只能说明指标之间存在冗余恰恰是降维该处理的信号而不是“选得对”的证据。真正该论证的是覆盖度——四个一级指标是否把“学习影响”的各个侧面都框住了。相关性分析更适合放在降维之前用来判断哪些指标可以合并而不是放在指标体系之后当作合理性背书。这个取舍在后文的设计反思里还会展开。4. 降维的分岔路KMO 0.421 为什么必须换 t-SNE4.1 PCA 的前提KMO 0.421 意味着线性相关性不够主成分分析的本质是做一次正交变换把原始指标线性组合成少数几个互不相关的主成分用前几个主成分的累计方差贡献率来衡量信息保留程度。它能生效的前提是指标之间存在较强的线性相关——相关矩阵的特征值分布足够陡前几个特征值就能吃掉大部分方差。答卷对四个一级指标分别做了 KMO 和 Bartlett 检验结果分化明显一级指标KMO 值Bartlett p 值采用方法个人基本信息0.6650.000PCA对人工智能态度0.7650.000PCA个人学习情况0.4210.000t-SNE人工智能发展0.7140.000PCAKMO 的通行判定是0.9 以上极佳0.8 以上良好0.7 以上中等0.6 以上勉强0.5 以下不可接受。个人学习情况只有 0.421已经跌进“不可接受”区间。Bartlett 检验虽然显著但那只说明相关矩阵不是单位阵不代表相关性足够强到支撑线性降维。这一组指标问的是使用时间、分享意愿、网络活动、学习困扰、关注点彼此之间更多是非线性、类别化的关系硬上 PCA 的结果就是载荷矩阵符号乱跳主成分解释不出来。PCA 的实现要注意标准化这一步不能省from sklearn.decomposition import PCA from sklearn.preprocessing import StandardScaler # 各指标量纲差异大先标准化到均值 0、方差 1 Z StandardScaler().fit_transform(basic.astype(float)) # n_components 传小数表示保留的累计方差比例 pca PCA(n_components0.85, random_state42) score pca.fit_transform(Z) print(各主成分方差贡献率:, pca.explained_variance_ratio_.round(3)) print(累计贡献率:, pca.explained_variance_ratio_.cumsum().round(3))n_components0.85表示自动选取使累计方差达到 85% 的最少主成分个数也可以传整数直接指定个数。explained_variance_ratio_是每个主成分的方差占比累加后就是你实际保留了多少信息。阈值定 85% 还是 80%会直接改变主成分个数进而改变后面 TOPSIS 的输入维度这个参数必须在正文里写明并说明理由不能默认。4.2 t-SNE 的困惑度与局部结构t-SNE 走的是另一条路。它不追求线性组合而是在高维空间用高斯核构造样本间的相似度概率p_{j|i}在低维空间用 t 分布构造q_{j|i}然后最小化两个分布的 KL 散度。t 分布的长尾特性让低维空间里中等距离的点被拉得更开缓解了“拥挤问题”所以它在展示局部簇结构上比 PCA 强得多。代价是它几乎不保留全局距离输出坐标的绝对数值没有意义只有相对位置有意义。这对后续建模是个硬约束。from sklearn.manifold import TSNE X_study StandardScaler().fit_transform(study.astype(float)) tsne TSNE( n_components2, perplexity30, # 有效近邻数经验取值 5~50 learning_rateauto, initpca, # 用 PCA 初始化比随机初始化更稳 random_state42, # 必须固定否则每次结果不同 max_iter1000, ) emb tsne.fit_transform(X_study)perplexity大致等于每个点考虑的有效邻居数样本量小的时候要往下调否则会退化成一团。random_state是这套流程里最容易被忽略的参数不固定它同一份数据跑两次得到的二维坐标就不同接进 TOPSIS 后排名会漂移复现性直接归零。initpca比随机初始化稳定收敛更快代价是多算一次 PCA。4.3 两种降维结果怎么拼量纲对齐是隐藏的坑四个一级指标降完维要把结果汇总成一张矩阵送进综合评价。PCA 输出的是主成分得分数值范围可能在正负几十之间t-SNE 输出的是二维坐标范围通常在个位数。两者直接按列拼接距离计算会被数值范围大的那一块主导TOPSIS 的正负理想解几乎完全由 PCA 那几列决定t-SNE 那两列形同虚设。所以拼接前必须再做一次统一缩放import numpy as np from sklearn.preprocessing import MinMaxScaler scaler MinMaxScaler() # 每个降维块单独缩放到 [0,1]消除量纲差异 blocks [ scaler.fit_transform(pca_basic), scaler.fit_transform(pca_attitude), scaler.fit_transform(tsne_study), scaler.fit_transform(pca_development), ] # 样本顺序必须严格一致否则行与行对不上 X_final np.hstack(blocks) print(X_final.shape)hstack按列拼接要求所有块的样本行顺序完全一致。如果中途对某个块做过排序或剔除必须先对齐索引再拼否则会把 A 样本的降维结果安到 B 样本头上。MinMaxScaler把每块压到 [0,1]代价是抹掉了块内的绝对尺度差异但在这个场景里可比性比绝对尺度更重要。这套“PCA t-SNE 混合降维”的方案本质上是承认不同指标组的数据结构不一样线性相关强的走 PCA非线性、类别化的走 t-SNE。好处是每个一级指标都能落地不会因为一组 KMO 不达标就把整块指标扔掉代价是两条路径的输出语义不同拼接后的矩阵已经不是一个统一的度量空间后续 TOPSIS 的贴近度只能当作相对排序看不能解读成绝对影响大小。5. 常见问题与排查这套流程最容易翻车的五个地方5.1 把名义变量当连续变量喂进熵权法现象熵权法算出来“上网方式”权重 45.903%远高于其他指标评审一眼就问“凭什么”。原因性别、专业、上网方式都是名义变量编码 1、2、3 只是标签没有大小和距离含义。熵权法把它们当连续数处理选项分布的离散程度被直接换算成信息量一个几乎没人选的选项比如“网吧”会把整列的熵值拉低权重被机械抬高。解决名义变量进熵权法之前先做独热编码或者改用基于频数的权重方案确实要保留单列就在正文里明确声明“该权重反映的是区分度而非重要性”并补充业务解释。有序变量如 Likert 量表可以保留单列但编码必须单调。5.2 KMO 不达标仍强行做 PCA现象主成分载荷矩阵里正负号来回跳第一主成分解释不出任何业务含义累计贡献率怎么调都上不去。原因KMO 低于 0.5 说明指标间的偏相关性太弱线性降维的前提不成立。这时候硬跑 PCA得到的特征向量接近随机方向主成分只是数学产物没有实际意义。解决先看 KMO 分项值找出拉低整体的那几个题项考虑剔除或合并整组都不达标就切 t-SNE 或先做变量聚类再降维。答卷对个人学习情况切到 t-SNE正是这条规则的实际应用。5.3 t-SNE 没固定随机种子排名每次都不一样现象同一份数据、同一套代码隔天重跑TOPSIS 排名前十里换了两三个人结论没法复现。原因t-SNE 的初始化、早期夸张阶段的梯度下降都带随机性random_state不固定每次落到的局部最优不同perplexity设得过大或过小也会让嵌入结果不稳定。解决固定random_stateperplexity按样本量在 5 到 50 之间取值并记录init用pca降低随机性。条件允许的话跑多次取稳定解或者干脆把 t-SNE 结果只用于可视化不参与最终评分。5.4 信度系数正文与表格对不上现象正文写 α 为 0.629表格里却是 0.669 和 0.692评审翻到这一页直接停住。原因手写数字、多口径混用、清洗前后各算了一遍但只改了一处。标准化 α 和未标准化 α 本来就是两个值不注明口径就会打架。解决所有统计量由代码一次算出、直接落表正文引用表格数值而不是另抄一遍标准化与未标准化并列展示时明确标注哪个用于结论。清洗顺序固定为“清洗 → 检验 → 建模”避免中途重算。5.5 剔除样本后没有重跑检验现象剔除 101 条逻辑矛盾样本后KMO 从 0.651 变成了另一个值但正文里引用的还是清洗前的数字。原因检验在清洗之前做或者清洗后忘了把新数据集重新灌进检验函数。样本量变化会改变相关矩阵KMO 和 Bartlett 卡方都会跟着动。解决把“清洗 → 描述统计 → 信效度 → 降维 → 评价”写成固定流水线每一步的输入都是上一步的输出中间不手工干预。任何一次样本变动都要从信效度开始整条链重跑。6. TOPSIS 与设计取舍混合降维到底值不值把降维后的矩阵送进 TOPSIS剩下的事其实很标准。先正向化、归一化再取每列最大值构成正理想解、最小值构成负理想解算每个样本到两者的欧氏距离D和D-最后用C D- / (D D-)得到贴近度按C排序。贴近度越接近 1说明这个样本在“受人工智能影响”这件事上越靠近最优状态——注意是最优状态不是影响最大方向定义要在正文里写死否则结论会反。import numpy as np def topsis(X: np.ndarray, weights: np.ndarray): X 已正向化、非负weights 为各列权重和为 1 # 向量归一化消除量纲 norm X / np.sqrt((X ** 2).sum(axis0)) V norm * weights best V.max(axis0) # 正理想解 worst V.min(axis0) # 负理想解 d_pos np.sqrt(((V - best) ** 2).sum(axis1)) d_neg np.sqrt(((V - worst) ** 2).sum(axis1)) return d_neg / (d_pos d_neg) # 贴近度拿到贴近度排序后取排名靠前的那批样本回溯它们在原始问卷上的作答分布找共同特征哪类年级、哪种上网方式、对人工智能持什么态度。这一步才是整篇答卷真正出结论的地方——排名本身只是数字特征提取才把数字翻译成“谁受影响更深”。现在回到那个最核心的取舍PCA 和 t-SNE 混着用到底值不值。单方法的一致性好所有指标在同一个度量空间里TOPSIS 的贴近度可以横向比较但代价是 KMO 只有 0.421 的那组指标要么被硬塞进 PCA 变得不可解释要么被整块丢弃前者污染结论后者丢信息。混合方案保住了每一块指标代价是拼接后的矩阵语义不统一贴近度只能当相对排序看。我的判断是在“评价类”赛题里保信息比保可比性更优先因为结论要回答的是“哪些人受影响更深”而不是“影响有多大”这种绝对量。但这个取舍必须在论文里明写藏起来就是给自己埋雷。从那以后我每次做这类多方法混合的建模都会在附录里强制加一张“方法-指标-检验结果”对照表把每组指标走了哪条路、为什么走这条路、参数怎么定的一行一行锁死。评审不一定会看但自己回看时能立刻定位是哪一步把结论带偏的。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?