尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

2026数模国赛模块求解skill:问题分析、数据处理与图表绘制

2026数模国赛模块求解skill:问题分析、数据处理与图表绘制 1. 数学建模中的“skill”到底是什么每年到了国赛季很多队伍都会面临同一个问题题目能读懂模型能选出来但真正动手做的时候总卡在三个环节上——问题分析太散、数据处理太乱、图表绘制太丑。这三个环节恰好就是数学建模竞赛中最消耗时间、也最容易拉开差距的部分。最近在各类AI编程工具和建模社群中“skill”这个词出现频率很高。所谓skill本质上就是把一类高频复用的事情沉淀成一套标准化的流程和代码模板。放在数模国赛的语境下就是围绕“问题分析”“数据处理”“图表绘制”这三个模块分别建立一套可复用的求解方案。这篇文章就来完整拆解这套“2026数模国赛模块求解skill”的搭建思路。我们会先讲清楚每个模块的核心方法论再给出可以直接复制运行的Python代码最后用一个综合案例把三个模块串起来。无论你是第一次参加国赛还是已经有一定建模经验想提升效率这篇文章都值得收藏备用。下面先从一个核心概念开始。2. 问题分析skill把一道赛题拆成可求解的结构2.1 为什么问题分析往往是队伍的“隐形短板”很多队伍拿到赛题后第一反应是查资料、找数据、跑模型。但真正优秀的论文第一步花在“问题分析”上的时间往往是最多的。问题分析的核心不是表决心而是通过严谨的结构梳理把一道开放性赛题转化为一组可计算、可验证、可评价的具体问题。常见的失败场景是这样的把题目抄了一遍没有提炼出关键约束和变量。直接上来就说“我们用层次分析法”缺少选择理由。没有区分“必须完成的任务”和“可以优化的目标”。忽略了对数据特征的预判导致后续处理时反复返工。问题分析skill要解决的问题就是把这些模糊的思考过程固化成一张清晰的“分析地图”。2.2 问题分析的标准四步法结合国赛近几年的命题风格我推荐使用以下四步分析法。第一步圈定问题边界。需要回答三个问题题目给出了哪些数据目标变量是什么约束条件有哪些这一步要把题面里的自然语言转换为结构化的要素表。第二步拆解子问题。国赛题目通常是多小问结构小问之间往往存在依赖关系。建议用依赖图或任务列表把子问题串起来明确每一步的输出是什么下一步需要用到哪份数据。第三步建立初步建模假设。例如“假设数据缺失模式为随机缺失”“假设气象因素与目标变量存在线性相关关系”假设越早写明后面的数据处理和模型选择就越有依据。第四步确定方法与检验标准。不是每个问题都需要上深度学习大部分国赛题目用线性回归、时间序列、优化模型、综合评价方法就能解决。关键是说明你选用某方法的理由以及最终用什么指标评价效果。2.3 问题分析模板示例下面给出一份可以直接复用的分析模板后续写论文时也能直接摘取问题一XXX预测/评价/优化问题 - 数据来源题目附件X / 公开数据集 - 目标变量XXX - 关键特征XXX, XXX, XXX - 建模方法XXX - 评价指标MAE / RMSE / 综合得分 - 输出结果预测值表格 / 排序结果 / 方案组合这里需要提醒的是问题分析不是写作文尽量用短句和结构化语言让评委一眼看出你的思路链条。好的问题分析在论文评阅时可以直接转化为“模型建立”部分的逻辑框架。3. 环境准备与依赖版本说明在进入数据处理和图表绘制之前先把环境准备好。数模国赛通常使用Python作为主力语言因为Python在数据处理、建模、可视化方面生态最齐全。本文所有示例代码基于以下环境运行请根据你本机的实际情况调整版本工具/库说明Python3.9 及以上版本pandas数据读取与预处理numpy数值计算matplotlib基础绘图seaborn统计图表美化scikit-learn建模与数据划分openpyxl读取和写入 Excel 文件如果还没有安装这些库可以在终端执行pip install pandas numpy matplotlib seaborn scikit-learn openpyxl国内网络环境下如果下载速度较慢可以临时使用镜像源pip install pandas numpy matplotlib seaborn scikit-learn openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple这里要特别说明一下版本问题。pandas、numpy这类库的API整体稳定但个别方法在不同版本间有细微变化。比如pandas 1.x和2.x在部分字符串处理、时间序列操作上存在差异。如果你在运行示例代码时遇到报错优先检查库版本而不是怀疑代码本身。本文的重点是展示思路代码在主流版本下均可运行。4. 数据处理skill建立一套标准的预处理管道4.1 数据处理在国赛中的角色国赛题目的数据质量参差不齐有些附件数据非常规范有些则需要大幅清洗。数据处理做得好不好直接决定后续模型效果和论文说服力。不过要强调一点数据处理不是“为了处理而处理”。每一步操作都应该有明确理由并且要在论文中交代清楚。比如“删除缺失率超过30%的列”和“对缺失值进行多重插补”前者保留信息更少但简单后者信息保留更多但复杂度高具体选哪种要结合后续模型需求。4.2 一个通用的数据预处理函数直接给出一个可复用的数据预处理管道代码中详细注释了每一步的作用import pandas as pd import numpy as np def data_preprocessing(df, target_colNone, drop_ratio0.3): 通用数据预处理管道 参数: df: pandas DataFrame, 原始数据 target_col: str or None, 目标变量列名 drop_ratio: float, 缺失率超过该值的列将被删除 返回: df_clean: 清洗后的DataFrame report: 预处理报告(dict) df_clean df.copy() report {} # 第一步: 删除全空列或全空行 df_clean df_clean.dropna(axis1, howall) df_clean df_clean.dropna(axis0, howall) # 第二步: 删除缺失率过高的列 null_ratio df_clean.isnull().mean() drop_cols null_ratio[null_ratio drop_ratio].index.tolist() df_clean df_clean.drop(columnsdrop_cols) report[drop_cols] drop_cols # 第三步: 数值列缺失值填充(使用中位数, 避免受异常值影响) num_cols df_clean.select_dtypes(include[np.number]).columns for col in num_cols: if df_clean[col].isnull().any(): median_val df_clean[col].median() df_clean[col] df_clean[col].fillna(median_val) report[num_fill_cols] [c for c in num_cols if df_clean[c].isnull().sum() 0 and c in num_cols] # 第四步: 类别列缺失值填充(使用众数) cat_cols df_clean.select_dtypes(include[object]).columns for col in cat_cols: if df_clean[col].isnull().any(): mode_val df_clean[col].mode()[0] if not df_clean[col].mode().empty else unknown df_clean[col] df_clean[col].fillna(mode_val) # 第五步: 去掉重复行 dup_count df_clean.duplicated().sum() df_clean df_clean.drop_duplicates().reset_index(dropTrue) report[dup_count] dup_count report[remaining_rows] df_clean.shape[0] report[remaining_cols] df_clean.shape[1] return df_clean, report使用方式如下# 读取数据 df pd.read_excel(附件.xlsx, sheet_nameSheet1) # 执行预处理 df_clean, report data_preprocessing(df, target_coly, drop_ratio0.3) # 打印预处理报告 for key, val in report.items(): print(f{key}: {val})4.3 异常值检测与处理异常值处理是数据处理中比较棘手的一环。常见的做法有三种三倍标准差法、四分位距法IQR和基于业务规则的判断。这里给出一个IQR方法的示例def detect_outliers_iqr(series): 使用IQR方法检测异常值 返回异常值的索引列表 Q1 series.quantile(0.25) Q3 series.quantile(0.75) IQR Q3 - Q1 lower_bound Q1 - 1.5 * IQR upper_bound Q3 1.5 * IQR outlier_idx series[(series lower_bound) | (series upper_bound)].index return outlier_idx.tolist()使用示例# 对某一列检测异常值 outlier_idx detect_outliers_iqr(df_clean[temperature]) print(f检测到 {len(outlier_idx)} 个异常值) # 处理方式一: 删除异常值所在行 # df_clean df_clean.drop(indexoutlier_idx) # 处理方式二: 用上下边界值缩尾替换 # lower df_clean[temperature].quantile(0.25) - 1.5 * (df_clean[temperature].quantile(0.75) - df_clean[temperature].quantile(0.25)) # upper df_clean[temperature].quantile(0.75) 1.5 * (df_clean[temperature].quantile(0.75) - df_clean[temperature].quantile(0.25)) # df_clean.loc[outlier_idx, temperature] df_clean.loc[outlier_idx, temperature].clip(lower, upper)如果你的数据量很小不建议直接删除异常值因为删除会影响样本代表性。更稳妥的做法是缩尾处理保留样本数量的同时削弱极端取值的影响。具体采用哪种方式建议在论文的“数据处理”部分说明理由。4.4 特征工程与数据标准化特征工程是国赛中被低估的环节。很多时候模型效果提升靠的不是换更复杂的算法而是构造了更有解释力的特征。以下几类特征工程操作在国赛中很常见统计特征均值、方差、最大值、最小值、分位数。时间特征年、月、日、星期、是否为节假日。比值特征两个相关字段的比值例如“人均消费金额”“单位面积产量”。独热编码对类别型变量进行编码使其能被模型直接使用。标准化操作则是消除量纲影响的关键步骤from sklearn.preprocessing import StandardScaler # 假设特征列名为 feature_cols feature_cols [x1, x2, x3] scaler StandardScaler() df_clean[feature_cols] scaler.fit_transform(df_clean[feature_cols])标准化之后数据均值为0、标准差为1适合输入到距离类模型如KNN、SVM或梯度下降类模型中。但如果你使用的是决策树、随机森林这类树模型标准化不是必须的因为树模型基于分裂阈值不受量纲影响。5. 图表绘制skill用可视化讲清楚数据故事5.1 数模论文中图表的三个核心作用在国赛论文中图表的作用不是装饰而是服务于以下三个目的第一描述数据分布和变化趋势。比如用折线图展示时间序列走势用直方图展示数据分布形态用箱线图展示离散程度这些都是数据探索阶段常用的图表。第二支撑模型结论。例如模型拟合效果可以用散点图拟合线来展示评价指标的对比可以用柱状图或雷达图。第三提升论文可读性。一份图表清晰、排版整齐的论文在评阅时天然占据优势因为评委能在更短的时间内理解你的建模逻辑。5.2 一张规范论文图表的自查清单在动手画图之前先记住这份自查清单中文字体是否正确显示。matplotlib默认字体不支持中文需要在绘图前设置字体。坐标轴标签是否完整包括单位。图例是否包含且不遮挡数据区域。配色是否统一不建议超过3种主色。图片分辨率是否达到300dpi以上。是否保存为论文所需格式一般推荐PNG或PDF。5.3 matplotlib 中文显示与基础美化模板每次使用matplotlib绘图前先加载下面的通用配置代码import matplotlib.pyplot as plt import matplotlib as mpl # 解决中文显示问题 plt.rcParams[font.sans-serif] [SimHei] # Windows 系统使用黑体 plt.rcParams[axes.unicode_minus] False # 解决负号显示问题 # 全局绘图风格 plt.rcParams[figure.dpi] 100 plt.rcParams[savefig.dpi] 300 plt.rcParams[savefig.bbox] tight如果你使用的是Mac系统SimHei可能不存在可以换成plt.rcParams[font.sans-serif] [Arial Unicode MS] plt.rcParams[axes.unicode_minus] False5.4 四类高频图表绘制示例下面直接给出建模过程中最常用的四类图表代码。每段代码都可以独立运行。折线图适合展示趋势例如时间序列数据import matplotlib.pyplot as plt # 示例数据 x [2020, 2021, 2022, 2023, 2024, 2025] y [30, 45, 42, 58, 63, 72] plt.figure(figsize(8, 5)) plt.plot(x, y, markero, linewidth2, color#2E86AB, markersize6) plt.xlabel(年份) plt.ylabel(数值) plt.title(历年数据变化趋势) plt.grid(axisy, linestyle--, alpha0.6) plt.tight_layout() plt.show()散点图适合展示两个变量之间的关系import numpy as np import matplotlib.pyplot as plt # 生成示例数据 rng np.random.default_rng(42) x_data rng.normal(100, 15, 200) y_data 2.5 * x_data rng.normal(0, 20, 200) plt.figure(figsize(7, 5)) plt.scatter(x_data, y_data, alpha0.7, s18, color#E8833A, edgecolorswhite) plt.xlabel(特征 X) plt.ylabel(目标 Y) plt.title(散点图X与Y相关性观察) plt.tight_layout() plt.show()柱状图适合展示类别比较例如不同方案的得分对比import matplotlib.pyplot as plt categories [方案A, 方案B, 方案C, 方案D] scores [82.5, 89.3, 76.8, 91.2] colors [#2E86AB, #A23B72, #F18F01, #6A994E] plt.figure(figsize(7, 5)) bars plt.bar(categories, scores, colorcolors, edgecolorblack, linewidth0.5) plt.ylabel(综合得分) plt.title(不同方案得分对比) # 在柱子上方标注数值 for bar in bars: height bar.get_height() plt.text(bar.get_x() bar.get_width() / 2, height 1, f{height:.1f}, hacenter, vabottom, fontsize10) plt.ylim(0, 105) plt.tight_layout() plt.show()箱线图适合展示数据分布的离散程度和异常情况import matplotlib.pyplot as plt # 生成三组示例数据 rng np.random.default_rng(2026) group1 rng.normal(50, 8, 100) group2 rng.normal(60, 12, 100) group3 rng.normal(45, 6, 100) plt.figure(figsize(7, 5)) plt.boxplot([group1, group2, group3], labels[A组, B组, C组], patch_artistTrue) plt.ylabel(数值) plt.title(不同分组的数据分布) plt.tight_layout() plt.show()5.5 进阶seaborn 快速绘制统计图表seaborn是matplotlib的上层封装特别适合统计类图表的绘制代码更简洁配色也更美观。import seaborn as sns import matplotlib.pyplot as plt # 计算相关系数矩阵 corr_matrix df_clean[feature_cols].corr() # 绘制热力图 plt.figure(figsize(9, 7)) sns.heatmap(corr_matrix, annotTrue, cmapcoolwarm, fmt.2f, squareTrue, cbar_kws{shrink: 0.8}) plt.title(特征相关性热力图) plt.tight_layout() plt.show()相关性热力图在数据探索阶段特别实用可以直观看到哪些特征与目标变量相关性较强为后续特征筛选提供依据。6. 全流程实战一道典型国赛题目的skill串联6.1 案例背景假设赛题给出某城市过去10年的逐日气象数据与空气质量指数AQI数据要求完成以下任务任务1分析各气象因素与AQI的关系找出对AQI影响最显著的气象因素。任务2构建模型预测未来7天的AQI值。任务3对空气质量等级分布进行可视化分析并提出治理建议。这一类题目在国赛中出现频率很高非常适合用来演示“问题分析→数据处理→图表绘制”三个skill的综合运用。6.2 第一步问题分析结构化按照前面讲的方法将题目拆解为子问题核心目标主要方法输出结果任务1识别AQI的关键影响因素相关性分析 回归系数分析显著性排序表任务2未来7天AQI预测时间序列模型如Prophet、ARIMA预测值与置信区间任务3等级分布与趋势分析统计分组 可视化图表与建议这一页分析表可以直接放进论文的“问题分析”章节既清晰又专业。6.3 第二步数据处理完整代码import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns # 1. 读取数据 df pd.read_excel(weather_airquality.xlsx) print(原始数据形状:, df.shape) print(缺失值统计:) print(df.isnull().sum()) # 2. 日期列解析 df[date] pd.to_datetime(df[date]) df.set_index(date, inplaceTrue) # 3. 调用前面定义的数据预处理函数 df_clean, report data_preprocessing(df, drop_ratio0.3) print(预处理后数据形状:, df_clean.shape)6.4 第三步图表绘制完整代码# 1. 相关系数矩阵热力图 numeric_cols df_clean.select_dtypes(include[np.number]).columns corr df_clean[numeric_cols].corr() plt.figure(figsize(10, 8)) sns.heatmap(corr, annotTrue, fmt.2f, cmapcoolwarm, squareTrue, linewidths0.5) plt.title(气象因素与AQI相关系数矩阵) plt.tight_layout() plt.savefig(correlation.png, dpi300) plt.show() # 2. AQI时间序列趋势图 plt.figure(figsize(12, 5)) plt.plot(df_clean.index, df_clean[aqi], linewidth0.8, color#2E86AB) plt.xlabel(日期) plt.ylabel(AQI) plt.title(空气质量指数时间序列) plt.tight_layout() plt.savefig(aqi_trend.png, dpi300) plt.show() # 3. 季节或月度AQI均值柱状图 monthly_avg df_clean[aqi].resample(M).mean() plt.figure(figsize(10, 5)) plt.bar(monthly_avg.index.strftime(%Y-%m), monthly_avg.values, color#6A994E, alpha0.8) plt.xticks(rotation45) plt.ylabel(月均AQI) plt.title(月度AQI均值) plt.tight_layout() plt.savefig(monthly_aqi.png, dpi300) plt.show()6.5 第四步模型构建与预测在数据处理完成后进入模型求解阶段。下面以线性回归模型为例演示如何快速完成从训练到预测的闭环from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score # 假设目标变量为 aqi X df_clean.drop(columns[aqi]) y df_clean[aqi] # 划分训练集与测试集 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42 ) # 训练模型 model LinearRegression() model.fit(X_train, y_train) # 预测与评价 y_pred model.predict(X_test) rmse mean_squared_error(y_test, y_pred, squaredFalse) r2 r2_score(y_test, y_pred) print(fRMSE: {rmse:.4f}) print(fR2: {r2:.4f})这里要说明一点对于时间序列数据直接使用随机划分训练集和测试集不太合理因为时间序列要求按顺序切分。更严谨的做法是使用时间序列交叉验证或者直接按时间先后划分# 按时间顺序划分 split_idx int(len(df_clean) * 0.8) train_data df_clean.iloc[:split_idx] test_data df_clean.iloc[split_idx:] X_train train_data.drop(columns[aqi]) y_train train_data[aqi] X_test test_data.drop(columns[aqi]) y_test test_data[aqi]7. 常见问题与排查思路在数模比赛中数据处理和绘图环节的报错频率很高。下面整理了一份高频问题清单建议保存备查。问题现象常见原因解决思路matplotlib无法显示中文系统字体配置缺失使用plt.rcParams设置中文字体或下载中文字体文件pandas读取Excel失败缺少openpyxl或xlrdpip install openpyxl xlrd数据中的日期列变成字符串未解析为datetime类型使用pd.to_datetime()转换相关系数矩阵出现NaN列中存在缺失值先进行缺失值处理再计算相关性模型预测出现负值数据分布包含极端异常值检查是否有异常值未处理或考虑使用非负模型图片保存后模糊分辨率设置不足设置dpi300以上seaborn风格冲突seaborn覆盖matplotlib配置使用sns.set_theme()统一管理样式时间序列划分出错错误使用了随机划分使用按时间顺序划分或TimeSeriesSplit实际建模过程中如果在某个代码块卡住建议先做最小化测试。例如单独打印DataFrame的前5行单独计算某一列的统计量逐步缩小问题范围不要在整个管道中盲目修改参数。8. 最佳实践与工程建议8.1 数据处理的工程规范第一保留原始数据。无论后续怎么清洗原始数据文件都不要修改所有操作复制到新DataFrame中执行。这是防止操作失误后无法恢复的底线策略。第二过程可追溯。每一步处理后输出相应的报告信息比如“删除了哪三列”“填充了哪些特征的缺失值”“去重后还剩多少行”。这些信息一方面可以帮你自查数据处理逻辑是否合理另一方面可以直接转化成论文中“数据预处理”部分的写作素材。第三不要引入数据泄露。所谓数据泄露就是在划分训练集和测试集之前就使用了全局统计量如均值、中位数进行填充。这种做法会导致测试集信息污染训练过程使评估结果虚高。正确做法是只在训练集上计算填充值再应用到测试集。8.2 图表绘制的论文级要求论文配图并非“能看就行”以下是评委视角中比较看重的几个细节坐标轴字体大小至少要能看清建议图内文字不小于8号。同一章节中所有图片的配色尽量统一不要每张图换一种风格。图片尺寸适中单栏图宽约8cm双栏图宽约16cm避免缩放到比例失真。图题建议放在图下方使用“图1 某市月度AQI变化趋势”格式。图表若来自数据处理过程在图注中简要说明数据来源和处理方式。实际中很多队伍在论文排版环节才发现图片模糊、字体显示异常临时修改非常耗时。建议从第一张图开始就用300dpi保存。8.3 时间管理的建议国赛时间非常紧凑满打满算三天。按照往年队伍的经验时间分配可以参考以下比例第一天上午完成问题分析确定数据范围和建模方向。第一天下午到晚上完成主要的数据处理和质量报告。第二天完成主模型构建与求解产出核心图表。第三天上午检查模型稳定性补充对比实验。第三天下午集中精力写作、排版、核对摘要。这套节奏的核心思路是“先框架后细节”。不要在第一天就陷入某个模型的参数调优中先把流程跑通再逐步迭代完善。9. 总结与下一步建议这篇文章围绕2026数模国赛的核心痛点搭建了一套完整的模块化求解方案。从问题分析的标准四步法到数据处理管道函数再到论文级图表模板核心思路可以总结为一句话把复杂度高、重复性强的环节沉淀为可复用的模板把宝贵的时间留给模型思考与论文写作。如果你正在备战国赛接下来可以做三件事第一把文中代码完整运行一遍理解每个函数的设计意图然后改造成适合自己赛题的形式。第二收集往年赛题在不需要建模的前提下只做“问题分析数据处理图表绘制”三个步骤的练习掐表训练速度。第三建立自己的代码库按“数据读取”“数据清洗”“可视化”“常用模型”四个目录分类比赛时直接索引调用。文中的代码只是一个起点。真正有价值的是你通过持续练习把这份模板内化成自己的建模能力。如果你觉得这篇内容对备赛有帮助可以收藏备用后续我会继续更新模型选择、论文写作和排版相关的实战经验。
返回列表