1. 项目缘起:一次“非典型”的数据分析实践
去年年底,我在整理硬盘时,偶然翻到了一个尘封已久的压缩包,里面是2020年“华为杯”第十七届中国研究生数学建模竞赛的获奖名单。这份数据,当年比赛结束后,我只是粗略地扫了一眼,确认了本校队伍的成绩便没再深究。但这次重新打开,看着那密密麻麻的Excel表格,一个念头突然冒了出来:除了看个名次,这份数据还能告诉我们什么?它背后是否隐藏着一些关于竞赛格局、高校实力分布乃至题目难易度的有趣信息?
这并非一个严格意义上的学术研究项目,更像是一次基于好奇心的数据探索。没有预设的复杂模型,也没有宏大的分析目标。我的初衷很简单:用最基础的统计学方法和可视化工具,像“解谜”一样,去挖掘这份公开数据中那些被忽略的细节。对于参加过数模竞赛的同学,这可能是一次复盘和共鸣;对于准备参赛的同学,这或许能提供一些关于竞争态势的直观感受;而对于数据爱好者,这就是一个绝佳的、干净的、结构化的真实数据集,可以用来练手。
整个分析过程,我主要使用了Python的Pandas进行数据清洗与统计,Matplotlib和Seaborn进行可视化。下面,我就把这次探索的完整过程、发现的有趣结论,以及过程中踩过的坑和心得,毫无保留地分享出来。
2. 数据初探与清洗:从原始名单到结构化数据
拿到原始数据(通常是一份包含“获奖等级”、“参赛单位”、“队员姓名”、“指导教师”等列的Excel或PDF名单),第一步永远是“看”和“理”。
2.1 原始数据的“坑”与处理
这份名单的数据质量其实相当高,毕竟是官方发布的。但为了后续分析,仍需进行标准化处理。主要问题集中在“参赛单位”这一列。
- 名称不统一:同一个学校可能有多种表述。例如,“北京大学”和“北京大学(校本部)”,“武汉大学”和“武汉大学(主校区)”。这会导致在按学校统计时,同一个实体被拆分成多个。
- 二级单位混杂:很多名单会详细到学院,如“华中科技大学计算机科学与技术学院”。如果我们想分析学校层面的整体实力,就需要将其归并到“华中科技大学”。
我的处理策略是:
- 建立学校名称映射表:手动(对于几百所高校,写个小脚本半自动更高效)整理一个字典,将各种变体映射到标准名称。这是最耗时但最关键的一步,保证了统计口径的一致。
- 提取一级单位:对于包含学院的名称,使用简单的字符串匹配或正则表达式,提取出学校名。例如,用规则匹配“XX大学”或“XX学院”之前的文本。
# 示例:简单的名称清洗函数(实际处理更复杂) def clean_school_name(name): # 去除括号及括号内内容(如“(校本部)”) name = re.sub(r'(.*?)', '', name) name = re.sub(r'\(.*?\)', '', name) # 映射常见别名 name_mapping = { '北大': '北京大学', '清华': '清华大学', '华中科大': '华中科技大学', # ... 更多映射 } return name_mapping.get(name, name) # 提取一级单位(假设学院名在学校名之后,用空格或特殊字符分隔) def get_first_level_unit(full_name): # 这是一个简化的示例,实际情况需要根据数据特点调整 for university in ['大学', '学院']: if university in full_name: # 找到第一个“大学”或“学院”的位置,并取到该词为止 idx = full_name.find(university) if idx != -1: return full_name[:idx+2] # 包含“大学”或“学院”二字 return full_name # 如果未匹配,返回原名称注意:数据清洗没有银弹。尤其是中文机构名处理,必须结合数据实际情况反复检查和修正。我建议清洗后,对获奖数量前50的学校进行人工复核,确保万无一失。
2.2 关键字段的构建
清洗完单位名称后,我构建了几个核心字段用于后续分析:
- 获奖等级编码:将“一等奖”、“二等奖”、“三等奖”、“成功参赛奖”分别编码为数值(如4,3,2,1)或保留有序类别,便于加权计算。
- 学校类型标识:根据学校名称,判断其是否为“双一流”建设高校、原“985工程”高校、原“211工程”高校等。这部分数据需要外部知识库(我手动整理了一份列表)进行匹配。
- 区域划分:根据学校所在地,划分到华北、华东、华中、华南、西南、西北、东北等区域。
至此,我们得到了一份干净的结构化数据框(DataFrame),每一行代表一支获奖队伍,包含标准化后的学校、区域、获奖等级、学校类型等信息。真正的探索可以开始了。
3. 整体获奖格局透视:一等奖都去了哪儿?
首先,我们来俯瞰一下整体的获奖分布。2020年研赛共有来自全国500多所高校和科研院所的约5万支队伍参赛。我们分析的重点是获奖名单,这大约涵盖了前40%的队伍(一、二、三等奖及部分成功参赛奖)。
3.1 获奖等级分布
计算各等级获奖数量及占比,这是最基础的描述统计。结果通常符合预期:三等奖数量最多,二等奖次之,一等奖最少,呈金字塔结构。但有趣的是,可以计算一下“一等奖获奖率”(一等奖数量/获奖总数),这个比例可以粗略反映当年竞赛的“头部竞争”激烈程度。2020年的这个数字,与前后年份对比,或许能看出题目难度或评审尺度的微妙变化。
3.2 一等奖的院校集中度分析
这是第一个洞察点。我们统计所有一等奖队伍的学校分布。
- 计算Top N院校占比:计算获得一等奖数量最多的前10名、前20名院校,其一等奖总数占全国一等奖总数的比例。这个比例非常高。以2020年数据为例,一等奖的集中度非常显著,排名前20的院校囊括了超过60%的一等奖。这直观地表明,顶尖奖项的竞争主要在少数顶尖高校之间进行。
- 绘制一等奖院校排行榜:用柱状图展示一等奖数量Top 20的院校。不出所料,榜单前列清一色是传统的理工科强校和顶尖综合性大学,如清华大学、浙江大学、上海交通大学、华中科技大学、武汉大学等。
一个关键发现:在这个榜单中,除了第一梯队的顶尖高校,我还注意到一些非“顶尖985”但表现异常突出的高校。例如,国防科技大学、解放军理工大学(现陆军工程大学)等军队院校,以及一些特色鲜明的行业类高校(如中国石油大学、哈尔滨工程大学),它们的一等奖数量甚至超过了不少综合排名更高的985高校。这提示我们,在数学建模这项侧重解决实际工程、科学问题的竞赛中,学校的学科特色、对学生数理基础和工程实践能力的培养模式,可能比单纯的“综合排名”更具影响力。
4. 院校竞争力深度评估:不仅仅是数奖牌
如果只看一等奖数量,就像奥运金牌榜,虽然直接但略显片面。为了更全面地评估各院校的竞争力,我引入了两个量化指标:
4.1 “获奖积分”与院校排行榜
我设计了一个简单的“获奖积分”制度,为不同奖项赋予权重:
- 一等奖:5分
- 二等奖:3分
- 三等奖:1分
- 成功参赛奖:0.5分(若数据中包含)
每支队伍为其所在学校贡献相应的积分。将所有队伍积分按学校汇总,就得到了每个学校的“总获奖积分”。这个指标综合考虑了获奖的数量和质量。
制作“总获奖积分榜”Top 30,并与纯一等奖榜进行对比。变化出现了:
- 一些一等奖数量不多,但二、三等奖数量庞大的“巨无霸”型高校(例如部分省内学生基数大的重点大学),排名大幅上升。这反映了其深厚的参与基础和整体较强的实力。
- 少数“精英型”高校,虽然一等奖摘金能力很强,但可能因为参赛队伍总数相对较少,在总积分榜上的位置略有下滑。
这个榜单更能反映一所学校在该赛事上的整体实力和厚度。
4.2 “获奖效率”与“投入产出比”
总积分高,可能只是因为参赛队伍多。那么,如果考虑“投入”呢?虽然我们无法精确知道每个学校具体派出了多少支队伍,但我们可以用“获奖数量”来近似替代“产出”,并引入“获奖效率”的概念。
一个合理的代理指标是:一等奖数量 / 该校获奖总数。这个比值越高,说明该校获奖队伍中,摘得最高荣誉的比例越大,可能意味着其顶尖队伍的选拔和培养更有效率,或者其优势队伍的实力断层领先。
计算这个“一等奖效率比”并排序,会发现一些有趣的现象:
- 一些顶尖高校(如清华、北大、上交、复旦)的这个比值通常很高,维持在15%-25%的区间,这符合其生源和师资的顶尖水平。
- 而之前提到的某些军队院校和行业特色高校,这个比值可能异常突出,甚至超过部分顶尖高校。这强烈暗示,这些学校在数学建模竞赛上,采取了高度聚焦、资源倾斜的培养模式,其王牌队伍的实力极强,成功率极高。
- 相反,一些总积分榜上的“巨无霸”高校,这个比值可能相对较低。这说明其获奖主要依靠庞大的基数,在培养顶尖拔尖队伍方面还有提升空间。
实操心得:这种多维度交叉分析的价值就在于此。它避免了单一指标的片面性,帮助我们勾勒出更立体的院校画像:谁是“全能王”(总积分高),谁是“尖刀班”(一等奖效率高),谁是“集团军”(获奖总量大)。对于备赛学生来说,了解自己学校在哪个维度有优势,有助于找准定位和策略。
5. 区域对比与“地理”特征
将学校按所属区域分组,我们可以从地理维度观察竞赛版图。
5.1 各区域获奖总量与质量分布
计算华北、华东、华中、华南、西南、西北、东北七大区域的获奖总积分、一等奖数量。毫无悬念,华东地区(江浙沪鲁皖赣闽)和华北地区(京津冀晋蒙)是绝对的强势区域,两者合计贡献了超过全国一半的获奖积分和一等奖。这与其高等教育资源密集、经济发达、高水平大学数量多的现状完全吻合。
华中地区(鄂湘豫)紧随其后,表现强劲,尤其是湖北省(武大、华科等)堪称中流砥柱。相比之下,西南、西北、东北地区的总量份额较小,但区域内均有表现亮眼的“领头羊”高校。
5.2 区域内部分析与“校均产出”
更有趣的是看区域内部。我们引入“校均一等奖数”或“校均获奖积分”指标。即用该区域的总一等奖数(或总积分)除以该区域内拥有获奖记录的学校数量。
- 华东、华北虽然总量大,但由于区域内参赛高校数量也极多(从985到普通省属高校),其“校均产出”可能并不是最高。
- 华中地区,特别是湖北省,可能呈现出“总量可观,且校均强度高”的特点,说明该地区高校整体在该赛事上竞争力普遍较强。
- 某些总量不大的区域,其“校均产出”指标可能反而不错,这说明该地区少数重点高校在该赛事上投入大、表现专注,形成了区域内的“高地”。
这个分析对于观察高等教育资源的均衡性,以及不同地区对特定类型学科竞赛的重视程度,提供了一个微小的侧面参考。
6. 题目选择倾向性分析(如果数据支持)
这是一个更进阶的分析方向,依赖于更细粒度的数据。理想的原始数据应该包含每支队伍选择的赛题(A、B、C、D、E、F)。如果能有这部分信息,分析将极具价值。
我们可以分析:
- 不同层次高校的选题偏好:顶尖高校是否更倾向于选择理论性强、前沿性的题目(如A题)?而工程见长的高校是否更偏爱数据量大、需要编程实现的题目(如B/C题)?这可以反映不同学校培养方向的侧重。
- 题目难度与获奖等级关系:统计选择各题目的队伍中,获得一、二、三等奖的比例。理论上,如果所有题目评审尺度一致,这个比例应该相近。如果某个题目的一等奖比例显著偏低,可能意味着该题目当年难度较大或竞争更激烈;反之,则可能相对容易或“性价比”高。
- “题目-学校”关联挖掘:计算每个学校在不同题目上的获奖积分或一等奖数量。你可能会发现一些学校在特定类型的题目上具有传统优势,形成了“品牌效应”。例如,某校在“优化类”赛题上历年表现强势,这可能源于其运筹学学科的深厚底蕴。
踩坑提醒:这部分分析高度依赖数据完整性。如果原始名单未包含选题信息,则无法进行。我在本次分析中,因数据所限未能深入。但如果你能找到带选题的数据,这将是挖掘深度洞察的富矿。处理时需注意,有些队伍可能因未获奖而未出现在名单中,这会导致选题样本有偏,分析结论需谨慎外推。
7. 可视化呈现:让数据自己说话
数据分析的最终成果需要直观的呈现。我使用了以下几种可视化方式:
- 横向柱状图(条形图):用于展示院校一等奖排行榜、总积分排行榜。清晰直观,适合排名比较。
- 中国地图热力图:将各省(或各区域)的总获奖积分或一等奖数量映射到地图上,用颜色深浅表示强弱。可以瞬间把握全国范围内的实力分布格局。Python的
pyecharts或geopandas库可以很好地实现。 - 堆叠柱状图:展示Top 20院校内部一、二、三等奖的构成比例。既能看总量,又能看质量结构。
- 散点图:以“获奖总数”为X轴,“一等奖数量”为Y轴,每个点代表一所学校。可以添加一条趋势线,观察整体相关性。同时,可以按“学校类型”(如985/211/其他)给点着色,观察不同类型学校的分布规律。那些远离趋势线、位于左上角(一等奖多但总数不多)的点,就是我们要找的“效率王者”。
8. 分析局限与心得反思
最后,必须坦诚这次“业余分析”的局限性:
- 数据层面:我们只有获奖名单,缺乏未获奖队伍信息、每支队伍的具体得分、选题信息、队员专业背景等。这限制了许多更深度的分析(如准确计算获奖率、分析专业影响等)。
- 指标设计:“获奖积分”的权重分配是主观的。虽然符合常识,但改变权重可能会导致排名微调。
- 因果推断:我们观察到的是相关性,而非因果性。一所学校获奖多,是源于生源好、师资强、培训体系完善,还是单纯因为重视并组织了更多队伍参赛?无法从本数据中得出确凿结论。
尽管如此,这次探索的价值是毋庸置疑的:
- 对于参赛者:你可以清晰地看到自己所处学校在全国版图中的位置,是冲击最高奖的“种子选手”,还是依靠整体实力“稳中求进”?这有助于制定合理的参赛目标。你也能看到哪些学校是你的主要竞争对手。
- 对于组织者与教练:可以借鉴表现优异院校的分布特征和结构,反思自身的培训选拔机制。例如,是否在培养“尖子队”上力度不够?是否在选题策略上可以更有针对性?
- 对于数据爱好者:这是一个干净、有明确业务背景的数据集,非常适合练习数据清洗、多维分析和可视化。你可以复现我的分析,也可以尝试提出自己的新问题、新指标。
对我个人而言,最大的收获是重新认识到,即使面对一份看似简单的名单数据,只要提出正确的问题,并耐心地进行多维度、多指标的交叉审视,依然能挖掘出超越表面排名的、丰富的、具有启发性的信息。数据分析的魅力,不在于工具的复杂,而在于思维的深度。下次如果你手头也有一份类似的竞赛成绩单,不妨也试试看,或许会有意想不到的发现。