2018年"华为杯"数学建模获奖名单挖掘分析
本文针对2018年"华为杯"数学建模6张拟获奖名单做一次简单的统计分析,以下分析结果仅代表思路,勿要以假乱真,权威结果统计以各大高校官方结果为准。以该2018年"华为杯"A,B,C,D,E,F共计6道题目的拟获奖名单为原材料。主要锻炼Python数据处理中的以下功能点的使用:
功能点:
1.把6张拟获奖名单进行拼接
··· 1.1.1.将6张表横向拼接;
··· 1.1.2.将6张表纵向拼接(后续处理主要使用按竖直方向拼接);
··· 1.1.3.简单的检索功能;
··· ··· ··· input:传入自己学校的名称即可整理出本校的参赛情况
··· ··· ···output:该校的参赛情况整合表
完成1中的处理针对单个高校信息的抽取已经可以完成,并在Excel表格中可以很容易的做出筛选和排序,并计算各个学校总的获奖率和每道题目对应的获奖率等等。但是要实现对全国参赛的上百组高校队伍的批量分析和统计,设计详细的数据结构存储数据是必须的。第二部分将实现对全国参赛的上百组高校队伍的参赛和获奖情况的批量分析和统计。
··· 1.1.4.对汇总表的数据探索
2.抽取参赛高校列表
3.分别抽取出来每个学校的参赛信息(按学校分群,高校名做索引)
4.统计每个学校的参赛信息
··· 4.1.设计存储每一个学校参赛相关信息的数据结构
··· 4.2.分别统计每一个大学的各个赛题参与和完成获奖情况
··· 这里由宏观到微观铺开整个数据结构的组织结果:
··· ···A.宏观(全部高校参赛情况对象字典,每一个高校参赛情况对象记为xuexiao1)
··· ···B.微观:xuexiao1对象的展开
··· ···C.xuexiao1对象中的"学校各题获奖明细"展开
5.统计shanghai地区大学的参赛情况
····5.1.统计shanghai地区大学的参赛情况
····5.2.统计shanghai地区部分大学的参赛获奖情况
····5.3.统计全国参赛的情况
注:由于学生队伍成员组队方式的灵活性,本文将以队伍为研究粒度来做统计分析。
6.参赛人数的统计
7.每个大学"答题明细"对象挖掘分析
以同济大学和SMU大学为例。
··· 7.2.1.两个学校6道赛题完成情况一览
··· 7.2.2.两个学校6道赛题一等奖情况一览
··· 7.2.3.高校数模战斗力排行榜(取战斗力前100名高校)
实现过程
1. 将6张拟获奖名单进行拼接
1.1.1.将6张表横向拼接;
import pandas as pd
import xlwt
import numpy as np
file_path=r'C:/Users/Administrator/Desktop/AAA/'
data_A=pd.read_excel(file_path+'2018年最终获奖名单_A题.xls',encode='gbk')
len(data_A) #678
data_A.columns.tolist()
#['序号', '题号', '队伍编号', '奖项', '队长姓名', '队长所在单位', '第一队友姓名', '第一队友所在单位', '第二队友姓名', '第二队友所在单位']
data_B=pd.read_excel(file_path+'2018年最终获奖名单_B题.xls',encode='gbk')
len(data_B) #1899
data_C=pd.read_excel(file_path+'2018年最终获奖名单_C题.xls',encode='gbk')
len(data_C) #5560
data_D=pd.read_excel(file_path+'2018年最终获奖名单_D题.xls',encode='gbk')
len(data_D) #557
data_E=pd.read_excel(file_path+'2018年最终获奖名单_E题.xls',encode='gbk')
len(data_E) #1509
data_F=pd.read_excel(file_path+'2018年最终获奖名单_F题.xls',encode='gbk')
len(data_F) #2004
data_all=pd.concat([data_A,data_B,data_C,data_D,data_E,data_F],axis=1)
#横向拼接设置axis=1,沿着水平方向来拼接。
print(data_all.head(10))
len(data_all) #5560
#data_all拼接后的维度大小为:rownum x 6*columnnum
rownum=max([len(data_A),len(data_B),len(data_C),len(data_D),len(data_E),len(data_F)])
columnnum=len(data_A.columns.tolist() )
print(data_all.head(5)) #出于尊重他人隐私的目的,详细的结果不在此给出,后续也希望参看该篇博客文章练习的同学勿轻易泄露他人信息为盼!!!
1.1.2.将6张表纵向拼接;
import pandas as pd
import xlwt
import numpy as np
file_path=r'C:/Users/Administrator/Desktop/AAA/'
data_A=pd.read_excel(file_path+'2018年最终获奖名单_A题.xls',encode='gbk')
len(data_A) #678
data_A.columns.tolist()
#['序号', '题号', '队伍编号', '奖项', '队长姓名', '队长所在单位', '第一队友姓名', '第一队友所在单位', '第二队友姓名', '第二队友所在单位']
data_B=pd.read_excel(file_path+'2018年最终获奖名单_B题.xls',encode='gbk')
len(data_B) #1899
data_C=pd.read_excel(file_path+'2018年最终获奖名单_C题.xls',encode='gbk')
len(data_C) #5560
data_D=pd.read_excel(file_path+'2018年最终获奖名单_D题.xls',encode='gbk')
len(data_D) #557
data_E=pd.read_excel(file_path+'2018年最终获奖名单_E题.xls',encode='gbk')
len(data_E) #1509
data_F=pd.read_excel(file_path+'2018年最终获奖名单_F题.xls',encode='gbk')
len(data_F) #2004
data_all=pd.concat([data_A,data_B,data_C,data_D,data_E,data_F],axis=0)
#横向拼接设置axis=0,沿着竖直方向来拼接。
print(data_all.head(10))
len(data_all) #5560
#data_all拼接后的维度大小为:rownum x columnnum
rownum=sum([len(data_A),len(data_B),len(data_C),len(data_D),len(data_E),len(data_F)]) #12207
columnnum=len(data_A.columns.tolist()) #10
print(data_all.head(5)) #出于尊重他人隐私的目的,详细的结果不在此给出,后续也希望参看该篇博客文章练习的同学勿轻易泄露他人信息为盼!!!
#保存全国竞赛汇总数据信息
data_all.to_excel(file_path+'2018全国研究生建模参赛信息汇总.xls',encoding='gbk')
1.1.3.简单的检索功能;
#1.检索自己学校的参赛情况
file_path=r'C:/Users/Administrator/Desktop/AAA/' #outputfile path
data_SMU=data_all[((data_all['队长所在单位']=='XX大学')|
(data_all['第一队友所在单位']=='XX大学')|
(data_all['第二队友所在单位']=='XX大学'))]
data_SMU.to_excel(file_path+'XX大学2018研究生建模参赛信息汇总.xls',encoding='gbk')
#2.#1.获奖队伍
prized=data_SMU[~(data_SMU['奖项']=='成功参与奖')]
#2.未获奖队伍
unprized=data_SMU[data_SMU['奖项']=='成功参与奖']
prized['奖项'].value_counts() #分别计算各个奖项获奖队伍数,默认是降序
"""
三等奖 63
二等奖 30
一等奖 3
"""
prizedCount=prized['奖项'].value_counts(ascending=True)
"""
一等奖 3
二等奖 30
三等奖 63
"""
unprizedCount=unprized['奖项'].value_counts() #计算成功参与奖的获奖队伍数
#成功参与奖 139
#2018华为杯全国研究生数学建模,XX大学队伍获奖率
prizedsum=np.sum(prizedCount[:])
prizeate=np.sum(prizedCount)/(np.sum(unprizedCount)+prizedsum) # 0.4393063583815029
prizeate # 0.4393063583815029
#XX大学总人数占2018年参赛队伍比重
rate=sum(sum(prizedCount)+unprizedCount)/data_all.shape[0] #参赛总人数=12207
rate
#3."""1.发现数据中: 一等奖(华为)和 一等奖同类异名,考虑去重复项并合并,使用正则表达式或者字符串替换"""
data_all['奖项']=data_all['奖项'].apply(lambda x:x.replace('一等奖(华为)','一等奖')) #同类异名的合并
#4.全国的获奖分层情况
chooses,category=[data_all['题号'].value_counts(ascending=True),data_all['奖项'].value_counts(ascending=True)]
chooses
category
totalNum=data_all.shape[0]
prize1_rate,prize2_rate,prize3_rate,unprize_rate=category/totalNum
print('\n一等奖: ',prize1_rate,'\n二等奖: ',prize2_rate,'\n三等奖: ',prize3_rate,'\n成功参与奖: ',unprize_rate)
#获奖人数&未获奖人数占比
lucky_count=sum(category[:3]) #获奖人数:4358
success_join_count=totalNum-lucky_count #未获奖人数:7849
print('2018年华为杯数学建模获奖率: ',prize1_rate+(prize2_rate+prize3_rate))
效果:
一等奖: 0.015073318587695584
二等奖: 0.13008929302859015
三等奖: 0.21184566232489555
成功参与奖: 0.6429917260588187
2018年华为杯数学建模获奖率: 0.3570082739411813
··· 1.1.4.对汇总表的数据探索
直接选中"2018全国研究生建模参赛信息汇总.xls"中的两列:“题号"和"奖项"即可做粗略的数据探索(excel中直接点击"插入”>"图表"即可自助生成很多好看的报表);
A.2018华为杯全国研究生数学建模各题队伍分布:
B.2018华为杯全国研究生数学建模奖项分布汇总:
1>宏观:
2>微观:
C.2018华为杯全国研究生数学建模一等奖的赛题分布:
2.抽取参赛高校列表
#高校名称列表
import pandas as pd
university_list=list(pd.concat([data_all['队长所在单位'],data_all['第一队友所在单位'],data_all['第二队友所在单位']]).unique())
university_list
['华北电力大学',
'吉林大学',
'东北林业大学',
'同济大学',
'华东师范大学',
……
'美国康奈尔大学',
'重庆医科大学',
'北京语言大学',
'中共上海市委党校',
'香港大学',
'新加坡国立大学',
'中国人民公安大学',
'中国航天科技集团公司航天时代电子公司(13所)',
'中国航天科技集团公司第五研究院(511 所)',
'中国航天科技集团公司第一研究院(14所)',
'密歇根大学',
'国家海洋局第一海洋研究所',
'中国航天科工集团公司第三研究院(35所)',
'中国地震局地球物理研究所',
'中国航天科技集团公司第一研究院(703所)']
3.分别抽取出来每个学校的参赛信息(对学校分群)
#分别抽取出来每个学校的参赛信息
#university=[] #将各个大学分群
university={} #将各个大学分群
totalNum=data_all.shape[0] #参赛队伍总支数
for i in range(len(university_list)):
#grade.append(university_list[i]+str(i))
del data_SMU