PythonMatplotlib实战数学建模A题数据清洗与箱线图可视化全流程解析数学建模竞赛中数据处理与可视化是核心技能。本文将以2023年深圳杯A题为例手把手教你用Python完整复现获奖论文的数据分析流程。不同于简单的代码翻译我们将深入探讨如何用Pandas优雅地处理复杂条件判断用Matplotlib绘制专业级箱线图并分享实际项目中的优化技巧。1. 环境准备与数据加载工欲善其事必先利其器。我们需要配置适合科学计算的Python环境# 推荐使用conda创建虚拟环境 conda create -n math_modeling python3.9 conda activate math_modeling pip install pandas numpy matplotlib scipy scikit-learn jupyter数据集通常以Excel格式提供Pandas提供了多种读取方式import pandas as pd # 读取Excel数据跳过前两行非数据内容 raw_data pd.read_excel(慢性病及相关因素流调数据.xlsx, headerNone, skiprows2)处理缺失值是数据清洗的第一步。与MATLAB不同Python中更推荐使用fillna方法# 统一用0填充缺失值 cleaned_data raw_data.fillna(0) # 检查处理结果 print(f原始数据缺失值数量: {raw_data.isnull().sum().sum()}) print(f处理后缺失值数量: {cleaned_data.isnull().sum().sum()})2. 得分计算逻辑实现原题要求根据复杂条件计算五个维度的得分。我们将每个评分规则封装为独立函数提高代码可维护性2.1 食物多样性得分计算def calculate_food_diversity(df): 计算准则一食物多样合理搭配 参数: df: 清洗后的DataFrame 返回: 得分Series scores [] for _, row in df.iterrows(): score 0 # 条件1主食、蔬菜、蛋白质来源同时存在 cond1 ((row[53]0 or row[58]0 or row[63]0 or row[68]0) and (row[143]0 or row[173]0) and (row[78]0 or row[83]0 or row[88]0 or row[93]0 or row[98]0 or row[103]0 or row[108]0 or row[113]0)) # 条件2食物种类丰富度 a_columns [53,58,63,68,73,78,83,88,93,98,103,108,113,118, 123,128,133,138,143,148,153,158,163,168,173,178,183] b_columns [c1 for c in a_columns] # B组为A组对应列1 a_sum sum(row[a] for a in a_columns if row[a]0) c_sum sum(1 for a in a_columns if row[a]0 or row[b]0) cond2 (a_sum 12) and (c_sum 25) and cond1 # 计算最终得分 total_conditions 2 met_conditions sum([cond1, cond2]) scores.append(met_conditions / total_conditions) return pd.Series(scores, name食物多样性得分)2.2 BMI与运动得分计算def calculate_bmi_activity(df): 计算准则二吃动平衡健康体重 包含BMI和运动量两个指标 scores [] for _, row in df.iterrows(): score 0 # BMI计算 (身高单位:cm→m) height_m row[221] * 0.01 bmi row[222] / (height_m ** 2) if 18.5 bmi 24: score 1 # 运动量检查 if row[197] ! 0 and row[198] * 7 150: score 1 scores.append(score / 2) # 总分为满足条件数/总条件数 return pd.Series(scores, nameBMI运动得分)3. 数据可视化专业箱线图绘制Matplotlib的箱线图功能强大但默认样式较为简单。我们可以通过以下方式提升可视化效果3.1 基础箱线图绘制import matplotlib.pyplot as plt import numpy as np # 准备数据 scores pd.DataFrame({ 食物多样: food_scores, 吃动平衡: bmi_scores, 蔬果摄入: veg_scores, 蛋白质摄入: protein_scores, 少盐少油: salt_scores }) fig, ax plt.subplots(figsize(12, 6)) boxprops dict(linewidth2, colordarkblue) whiskerprops dict(linewidth1.5, linestyle--) medianprops dict(linewidth2.5, colorfirebrick) scores.boxplot(axax, boxpropsboxprops, whiskerpropswhiskerprops, medianpropsmedianprops, patch_artistTrue) ax.set_title(居民饮食习惯各维度得分分布, fontsize14) ax.set_ylabel(得分, fontsize12) ax.grid(True, linestyle:, alpha0.7)3.2 高级美化技巧要使图表达到发表水平还需要更多细节调整# 自定义颜色和样式 colors [#FF6B6B, #4ECDC4, #45B7D1, #FFA07A, #98D8C8] # 重新绘制以应用自定义样式 plt.figure(figsize(14, 7)) bp plt.boxplot(scores.values, labelsscores.columns, patch_artistTrue) # 设置箱体颜色 for patch, color in zip(bp[boxes], colors): patch.set_facecolor(color) patch.set_alpha(0.6) # 设置其他元素样式 for element in [whiskers, caps, medians, fliers]: plt.setp(bp[element], colorgray, linewidth1.5) # 添加数据点抖动散点图 for i, col in enumerate(scores.columns): y scores[col] x np.random.normal(i1, 0.04, sizelen(y)) plt.scatter(x, y, alpha0.4, colorcolors[i], s30) # 添加参考线和注释 plt.axhline(y0.8, colorr, linestyle--, alpha0.3) plt.text(5.5, 0.82, 优秀阈值, colorr) # 最终美化 plt.xticks(fontsize12) plt.yticks(fontsize11) plt.title(居民饮食习惯评估 - 五维度箱线图分析, fontsize16, pad20) plt.ylabel(标准化得分, fontsize13, labelpad10) plt.grid(axisy, alpha0.2) plt.tight_layout()4. 分析结果解读与优化建议通过可视化分析我们可以得出以下关键发现食物多样性得分普遍较低中位数约0.4表明大部分居民饮食结构单一BMI指标表现最好中位数0.75显示居民体重管理意识较强盐油控制得分两极分化严重部分居民完全不符合标准针对这些发现可以提出以下数据优化建议异常值处理对极端低分样本进行个案分析数据分箱按年龄、职业等分组比较动态可视化添加交互式控件探索不同群体表现# 示例按年龄分组分析 age_bins [0, 30, 45, 60, 100] age_labels [30, 30-45, 45-60, 60] scores[age_group] pd.cut(raw_data[220], binsage_bins, labelsage_labels) # 分组绘制箱线图 plt.figure(figsize(15, 8)) scores.boxplot(column食物多样, byage_group, patch_artistTrue) plt.title(不同年龄组食物多样性得分比较, fontsize14) plt.suptitle() # 去除自动生成的标题 plt.xlabel(年龄组, fontsize12) plt.ylabel(得分, fontsize12)在实际数学建模竞赛中这种深入的数据分析和专业的可视化呈现往往能显著提升论文质量。记得保存高分辨率图片用于报告plt.savefig(diet_score_analysis.png, dpi300, bbox_inchestight)