您现在的位置是:网站首页> 编程资料编程资料

数据分析2020年全国各省高考成绩分布情况_其它综合_

2023-05-27 372人已围观

简介 数据分析2020年全国各省高考成绩分布情况_其它综合_

开始

突发奇想, 想看下高考成绩的分布, 如果把每个省市的成绩划线成0-100 分会怎么样,简单的来说, 认为最高分的考了100分,最低分考了0分, 计算一下各个分数段的人数就好了,

顺便可以用这个数据看每个省市的一本线划分比率,还有其他相关的数据,

看起来还是比较简单的, 动手试试

数据收集

网上找了一下, 每年的高考人数, 现在已经超过千万人高考了,河南更是超过了100万,
数据来源:新浪教育 https://edu.sina.cn/zt_d/gkbm

省/市2020年2019年2018年2017年2016年2015年2014年2013年2012年
全国1071万↑1031万↑975万↑940万940万↓942万↑939万↑912万↓915万↓
河南115.8万↑100万+↑98.3万↑86.3万↑82万↑77.2万↑72.4万↓71.63万↓80.5万↑
广东78.8万↑76.8万↑75.8万↑75.7万↑73.3万↓75.4万↓75.6万↑72.7万↑69.2万↑
四川67万↑65万↑62万↑58.3万↑57.13万超57万57.17万↑54万↑53.8万↑
河北62.48万↑55.96万↑48.6万↑43.6万↑42.31万↑40.48万↓41.82万↓44.98万↓45.93万↓
安徽52.38万↑51.3万↑49.9万49.9万↓50.99万↓54.6万↑52.7万↑51.1万↑50.6万↓
湖南53.7万↑50万↑45.2万↑41.1万↑40.16万↑38.99万↑37.8万↑37.3万↑35.2万↓
山东53万↓55.99万↑59.2万↑58.3万↓60.2万↑69.61万↑55.8万↑50万↓51万↓
广西50.7万↑46万↑40万↑36.5万↑33万余↑近31万↓31.5万↑29.8万↑28.5万↓
贵州47万↑45.8万↑44.1万↑41.2万↑37.38万↑33.05万↑29.27万↑24.78万↓24.8万↑
江西38.94万↓42.1万↑38万↑36.5万↑36.06万↑35.46万↑32.59万↑27.43万↑26.9万↓
湖北39.48万↑38.4万↑37.4万↑36.2万↑36.14万↓36.84万↓40.27万↓43.8万↓45.7万↓
江苏34.89万↑33.9万↑33万33万↓36.04万↓39.29万↓42.57万↓45.1万↓47.4万↓
山西32.6万↑31.4万↑30.5万↓31.7万↓33.9万↓34.22万↑34.16万↓35.8万↓36.1万↑
云南34.3万↑32.6万↑30万↑29.3万↑28万↑27.21万↑25.59万↑23.6万↑21万↓
陕西32.23万↓32.59万↑31.9万31.9万↓32.8万余↓34.4万↓35.3万↓36.65万↓37.53万↓
浙江32.57万↑31.5万↑30.6万↑29.1万↓30.74万↓31.79万↑30.86万↓31.3万↓31.6万↑
重庆28.3万↑26.4万↑25万↑24.7万↓24.88万↓25.54万↑25.06万↑23.5万↑23万↑
辽宁24.4万↑18.5万↓20.8万↓21.82万↓22.51万↓23.9万↓25.4万↓25.6万↑
甘肃26.31万↑21.8万↓27.3万↓28.5万↓29.6万余↓30.38万↑29.7万↑28.3万↓29.6↓
黑龙江21.1万↑20.6万↑16.9万↓18.8万↓19.7万↓19.8万↓20.4万↓20.8万↓21万↑
福建20.26万↓20.78万↑20万↑18.8万↑17.5万↓18.93万↓25.5万25.5万↑25万↓
内蒙古197901↑19.5万↓19.8万↓20.11万↓18.4万↓18.8万↓19.3万↑18.95万↓
新疆22.93万↑20.7万↑18.4万↑16.61万↑16.05万↓16.26万↑15.87万↑15.47万↑
吉林15万余↑15万↑14.3万↓14.85万↓13.76万↓16.02万↑15.9万↓16.2万↓
宁夏60298↓7.17万↑6.9万6.9万6.9万↑6.7万↑6.4万↑5.87万↓6.02万↑
海南57336↓5.9万↑5.8万↑5.7万↓6.04万↓6.2万↑6.1万↑5.6万↑5.5万↑
北京49225↓5.9万↓6.3万↑6万↓6.12万↓6.8万↓7.05万↓7.27万↓7.3万↓
青海46620↑44313↑4.2万↓4.6万↑4.5万↑4.2万↑3.97万↓4.06万↑3.8万↓
天津56258↑5.5万5.5万↓5.7万↓约6万↓6.1万↓约6万6.3万↓6.4万↓
上海5万5万+约5.1万5.1万↓5.2万↓5.3万↓5.5万↓
西藏32973↑2.5万↓2.8万↑2.4万↑2.1万↑1.96万↑1.89万↓1.9万↑

这个表的数据是统计的全国各个省市(除港澳台)之外的数据, 各个省市在出成绩之后会出各自的一分一段表, 统计每一分的成绩的人数, 我们以这个数据为准, 由于个人还是没有太多精力去收集数据的,网上找到了 高考100-一分一段表
这个网站, 给出了各个省市的一分一段表, excel 版本, 稍微检查了一下, 数据应该是对的,我就暂时以这个数据为准,

数据太多, 我暂时只做 35万 以上人的省市,只有11个省市,加上 北京上海两个城市的数据,

  • 河南
  • 河北
  • 广东
  • 广西
  • 湖南
  • 湖北
  • 江西
  • 贵州
  • 安徽
  • 四川
  • 山东
  • 北京
  • 上海

其中北京上海不分科,山东是选择一门考试进行考核, 所以 一共23个数据表,后续的话,我尽量将数据也一并上传了

数据整理

上面也提到了北京上海山东的分科比较特殊, 我们就按文理一起算,每个省都是给出最高分及以上的数据, 然后给出100分及以下的数据,但是不是每个省都是100分以下,所以还要特殊考虑,

不同高考政策与分类

山东的高考政策具体不清楚, 但是似乎是考生是在6门副科中任选3门,从一图了解山东高考改革要点
这里查到的

我们就不做分科了, 直接看山东的全体成绩即可。

不同统计方式

北京的人数更少,在400分以下每10分段给出人数,我们为了便于方便 默认每个分数平均人数, 比如 390-399分段的人有813人,我们认为每个分段都有81.3人,暂时这么处理。

不同省市对于最高分数的表示都是 最高分数及以上, 但是对于最低分数的处理就不太一样了, 这里不做评价
比如很多省市是合并在一起 100分以下总计, 有些则只是100分的成绩, 100分以下的成绩是没有给出的,这里最后处理的时候, 我们把0分的人都删除了, 只计算1-100 的人,反正不影响整个曲线

最终我们整理得到数据表, 每个Sheet 表示一个省市的文理科目,然后最上面一行数据分别对应 总分,人数, 累计人数,

数据处理

数据处理思路

这里为了方便 顺手用 Python 来做的, 使用的 pandas 读取的 excel 文件,
我们统计所有的数据的目标就是 将成绩化为 0-100分
那么

\[变换后分数 = \frac{当前分数-最低分}{最高分-最低分} \times 100\]

对于每个省的成绩将其调整到 [0,100], 这里使用的是 四舍五入, 导致实际在计算过程中的数据会重叠,比如相邻的两个成绩一个舍去,一个入上,在统一分数,导致数据噪声较大, 这是使用 一维的中值滤波平滑一下数据就好了,

以河南文科为例, 我们直接绘制归一化之后的成绩并进行中值滤波之后对比,
(图为测试过程中归一化到500分的图像,不影响理解)

各省市分数分布

我们在之前已经整理得到的数据, 然后我们 就要动手做了,

 # 整理数据,将各省市的成绩归一到100分之后的分布比率 # 引入 pandas import pandas as pd import matplotlib import matplotlib.pyplot as plt import scipy.signal as ss # 设定中文字体 plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签 plt.rcParams['axes.unicode_minus']=False #用来正常显示负号 # 设定图像尺寸 与分辨率 plt.rcParams['figure.figsize'] = (8.0, 4.0) # 设置figure_size尺寸 plt.rcParams['image.interpolation'] = 'nearest' # 设置 interpolation style plt.rcParams['savefig.dpi'] = 300 #图片像素 plt.rcParams['figure.dpi'] = 300 #分辨率 # 将成绩统一到 [0,] 区间 MAX_SCORE = 100 MIN_SCORE = 0 data_file = 'Data/data.xlsx' res_file = 'Data/res-'+str(MAX_SCORE-MIN_SCORE)+'.xlsx' # 读取excel , 获取所有表单名字 excel_info = pd.ExcelFile(data_file) all_data = {} all_data_ratio = {} # 获取表中的每一个数据文件 并将数据归一化到 0-500 for index in range(len(excel_info.sheet_names)): # 读取每一个表单 cur_sheetname = excel_info.sheet_names[index] df_sheet = pd.read_excel(data_file, sheet_name=cur_sheetname) # 获取每一个表中的 总分数 和对应分数的人数 scores = df_sheet[df_sheet.columns.values[0]] nums = df_sheet[df_sheet.columns.values[1]] # 数据 对应 每个分数的人数 表 ROWS = MAX_SCORE - MIN_SCORE + 1 trans_scores_nums = [0] * ROWS rows = len(scores) cur_max_score = scores[0] cur_min_score = scores[rows - 1] cur_index = 0; for s in scores: # 计算 变换之后的分数 四舍五入 trans_score = (int)(round((s - cur_min_score) / (cur_max_score - cur_min_score) * (MAX_SCORE - MIN_SCORE))) # 在计算分数的位置上 加上对应分数的人数 trans_scores_nums[trans_score - 1] += nums[cur_index]; cur_index += 1 # 数据稍微处理一下, 做简单的平滑处理, 去除最低分数据 except0data = [0] * (ROWS - 1) for i in range(ROWS - 1): except0data[i] = trans_scores_nums[i + 1]; # 中值滤波去除噪点 smooth_trans = ss.medfilt(except0data, 7) # 将数据转换成比例, 更具有一般性 sum = 0 smooth_trans_ratio = [0] * (ROWS - 1) for i in range(ROWS - 1): sum += smooth_trans[i] for i in range(ROWS - 1): smooth_trans_ratio[i] = smooth_trans[i] / sum all_data[cur_sheetname] = smooth_trans all_data_ratio[cur_sheetname] = smooth_trans_ratio print('正在进行 {0}/{1}, 表名:{2}'.format(index +
                
                

-六神源码网