Python 数据预处理 5 步法基于 2023 电工杯 B 题数据的实战清洗与可视化数学建模竞赛中数据预处理环节往往决定了后续分析的成败。2023 年电工杯 B 题人工智能对大学生学习影响的评价提供了一个典型的教育类数据集其中包含问卷收集的混合型数据数值、文本、分类变量。本文将演示如何用 Python 构建端到端的数据预处理流水线涵盖从原始数据到建模就绪格式的全过程。1. 数据质量诊断与缺失值处理加载数据后的第一步是系统性检查数据质量。使用 Pandas 的profile_report可以快速生成诊断报告import pandas as pd from pandas_profiling import ProfileReport df pd.read_excel(电工杯B题数据.xlsx) profile ProfileReport(df, title数据质量报告) profile.to_file(data_quality.html)常见的数据质量问题包括缺失值分布问卷数据常出现部分问题未作答异常取值范围5 级量表出现 0 或 6 等非法值文本型数值数字被存储为字符串格式分类变量基数爆炸开放填空题包含过多唯一值针对缺失值我们采用分层处理策略缺失比例处理方式代码实现5%直接删除df.dropna(subset[列名])5-20%同类均值/众数填充df.fillna(df.groupby(分组列)[目标列].transform(mean))20%新增是否缺失标志列df[缺失标志] df[列名].isnull().astype(int)对于电工杯这类问卷数据特别要注意反向计分题的转换。例如# 假设Q1_3是反向计分题原量表1-5 df[Q1_3] 6 - df[Q1_3] # 转换为正向分数2. 异常值检测与处理问卷数据中的异常值通常表现为一致性检验失败相同构面的题目得分差异过大答题时间异常完成问卷时间过短随机作答模式化应答连续多个相同选项如全部选3使用统计学方法结合业务规则进行检测# 基于IQR的数值型异常值检测 Q1 df[学习时间].quantile(0.25) Q3 df[学习时间].quantile(0.75) IQR Q3 - Q1 df df[~((df[学习时间] (Q1 - 1.5*IQR)) | (df[学习时间] (Q3 1.5*IQR)))] # 文本型异常值检测如开放题中的无效回答 invalid_responses [不知道, 无, ...] df df[~df[开放题列].isin(invalid_responses)]对于时间序列数据如学习行为日志还可以使用滑动窗口检测# 滑动窗口Z-score检测 def zscore_outliers(series, window30, threshold3): rolling_mean series.rolling(windowwindow).mean() rolling_std series.rolling(windowwindow).std() z_scores (series - rolling_mean) / rolling_std return np.abs(z_scores) threshold3. 数据标准化与归一化建模前需要统一量纲常用方法对比方法公式适用场景Python实现Z-score标准化(x - μ)/σ数据近似正态分布sklearn.preprocessing.StandardScalerMin-Max缩放(x - min)/(max - min)有明确边界的数据sklearn.preprocessing.MinMaxScalerRobust缩放(x - median)/(IQR)存在显著异常值sklearn.preprocessing.RobustScaler小数定标法x/10^j (jlog10(max|x|))保持数值解释性自定义实现对于分类变量推荐使用靶向编码Target Encoding替代传统的one-hotfrom category_encoders import TargetEncoder encoder TargetEncoder(cols[专业类别]) df[专业类别_encoded] encoder.fit_transform(df[专业类别], df[GPA])4. 特征工程实战技巧基于问卷数据的特点我们可以构造以下特征类型统计特征df[学习效率] df[成绩提升] / df[学习时间] df[AI使用多样性] df[[AI工具1,AI工具2,AI工具3]].nunique(axis1)交互特征df[理论实践平衡度] df[理论学习时间] * df[实践时间] / (df[理论学习时间] df[实践时间])**2时间序列特征如有学习行为日志def extract_ts_features(series): return { entropy: entropy(series.value_counts(normalizeTrue)), autocorr: series.autocorr(), weekday_ratio: series.dt.weekday.value_counts(normalizeTrue)[5] }文本特征针对开放题from sklearn.feature_extraction.text import TfidfVectorizer tfidf TfidfVectorizer(max_features50, stop_words[的,是,在]) text_features tfidf.fit_transform(df[开放题回答])5. 探索性分析与可视化使用 Plotly Express 创建交互式可视化import plotly.express as px # 平行坐标图展示多维度关系 fig px.parallel_coordinates(df, dimensions[AI使用频率,学习时间,成绩提升], colorGPA, color_continuous_scalepx.colors.diverging.Tealrose) fig.show() # 雷达图展示能力维度 fig px.line_polar(df, r[df[记忆能力],df[理解能力],df[应用能力]], theta[记忆,理解,应用], line_closeTrue) fig.update_traces(filltoself)针对建模竞赛特别推荐使用sweetviz库快速生成对比分析报告import sweetviz as sv report sv.compare([df[df[AI使用组]1], 使用组], [df[df[AI使用组]0], 对照组]) report.show_html()完整代码框架以下是可复用的预处理流水线模板from sklearn.pipeline import Pipeline from sklearn.compose import ColumnTransformer # 定义不同列的处理方式 numeric_features [年龄, 学习时间] categorical_features [专业, AI使用频率] text_features [开放题回答] preprocessor ColumnTransformer( transformers[ (num, StandardScaler(), numeric_features), (cat, TargetEncoder(), categorical_features), (txt, TfidfVectorizer(), text_features) ]) pipeline Pipeline(steps[ (preprocessor, preprocessor), (imputer, IterativeImputer()), (feature_selector, SelectKBest(score_funcf_classif, k20)) ]) # 保存预处理模型 import joblib joblib.dump(pipeline, preprocessor.pkl)在实际竞赛中建议将每个处理步骤封装为函数并保存中间结果def process_data(raw_df): # 步骤1数据清洗 df clean_data(raw_df) # 步骤2特征工程 df feature_engineering(df) # 步骤3数据分割 X_train, X_test train_test_split(df) return X_train, X_test