資料分析2020年全國各省高考成績分佈情況
阿新 • • 發佈:2020-07-29
## 開始
突發奇想, 想看下高考成績的分佈, 如果把每個省市的成績劃線成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-一分一段表](https://www.gk100.com/zhiyuan/list_2003.htm)
這個網站, 給出了各個省市的一分一段表, excel 版本, 稍微檢查了一下, 資料應該是對的,我就暫時以這個資料為準,
資料太多, 我暫時只做 35萬 以上人的省市,只有11個省市,加上 北京上海兩個城市的資料,
- 河南
- 河北
- 廣東
- 廣西
- 湖南
- 湖北
- 江西
- 貴州
- 安徽
- 四川
- 山東
- 北京
- 上海
其中北京上海不分科,山東是選擇一門考試進行考核, 所以 一共23個數據表,後續的話,我儘量將資料也一併上傳了
![35萬人以上省市+北京上海](https://gitee.com/schen00/BlogImage/raw/master/image/1595952537078.png)
## 資料整理
上面也提到了北京上海山東的分科比較特殊, 我們就按文理一起算,每個省都是給出最高分及以上的資料, 然後給出100分及以下的資料,但是不是每個省都是100分以下,所以還要特殊考慮,
### 不同高考政策與分類
山東的高考政策具體不清楚, 但是似乎是考生是在6門副科中任選3門,從[一圖瞭解山東高考改革要點](https://www.eol.cn/e_html/gk/tj/sd.shtml)
這裡查到的
![山東高考政策](https://gitee.com/schen00/BlogImage/raw/master/image/1595952537876.png)
我們就不做分科了, 直接看山東的全體成績即可。
### 不同統計方式
北京的人數更少,在400分以下每10分段給出人數,我們為了便於方便 預設每個分數平均人數, 比如 390-399分段的人有813人,我們認為每個分段都有81.3人,暫時這麼處理。
![北京400以下10分一段](https://gitee.com/schen00/BlogImage/raw/master/image/1595952537080.png)
不同省市對於最高分數的表示都是 最高分數及以上, 但是對於最低分數的處理就不太一樣了, 這裡不做評價
比如很多省市是合併在一起 100分以下總計, 有些則只是100分的成績, 100分以下的成績是沒有給出的,這裡最後處理的時候, 我們把0分的人都刪除了, 只計算1-100 的人,反正不影響整個曲線
![最低分數人數表示](https://gitee.com/schen00/BlogImage/raw/master/image/1595952537082.png)
最終我們整理得到資料表, 每個Sheet 表示一個省市的文理科目,然後最上面一行資料分別對應 總分,人數, 累計人數,
![資料清整理](https://gitee.com/schen00/BlogImage/raw/master/image/1595952537084.png)
## 資料處理
### 資料處理思路
這裡為了方便 順手用 Python 來做的, 使用的 pandas 讀取的 excel 檔案,
我們統計所有的資料的目標就是 將成績化為 0-100分
那麼
$$
變換後分數 = \frac{當前分數-最低分}{最高分-最低分} \times 100
$$
對於每個省的成績將其調整到 [0,100], 這裡使用的是 四捨五入, 導致實際在計算過程中的資料會重疊,比如相鄰的兩個成績一個捨去,一個入上,在統一分數,導致資料噪聲較大, 這是使用 一維的中值濾波平滑一下資料就好了,
以河南文科為例, 我們直接繪製歸一化之後的成績並進行中值濾波之後對比,
(圖為測試過程中歸一化到500分的影象,不影響理解)
![河南文科成績歸一化與中值平滑對比](https://gitee.com/schen00/BlogImage/raw/master/image/1595952537089.png)
### 各省市分數分佈
我們在之前已經整理得到的資料, 然後我們 就要動手做了,
```python
# 整理資料,將各省市的成績歸一到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 + 1, len(excel_info.sheet_names), cur_sheetname))
# plt.plot(smooth_trans2)
# write_data = pd.DataFrame(all_data)
# write_data.to_excel(res_file,sheet_name='res')
write_data_ratio = pd.DataFrame(all_data_ratio)
write_data_ratio.to_excel(res_file, sheet_name='ratio')
print('已經完成,儲存檔案:{0}'.format(res_file))
```
我們在這個程式裡面主要是 將資料提取出來, 計算成 100分制之後,重新存入 excel 表中,其中人數部分換成了各省市的人數比率,也方便查閱後續的資料
( 因為我感覺 plt 繪製圖像不好看,這邊使用了MATLAB 進行影象的繪製過程)
```matlab
% 將 原始資料繪製出來 並計算平均值和中值
% 讀取 excel 資料 獲取名稱以及各列名稱
data_file = 'Data/res-100.xlsx';
res_ratio = xlsread(data_file,1,'B2:X501');
res_name = {'河南文科', '河南理科', '北京', '上海', '河北文科', '河北理科', '山東', '廣東文科' '廣東理科' '湖北文科', '湖北理科', '湖南文科', '湖南理科', '四川文科', '四川理科', '安徽文科', '安徽理科', '廣西文科', '廣西理科', '貴州文科', '貴州理科', '江西文科', '江西理科'};
figure()
hold on
[rows,cols] = size(res_ratio);
avg = zeros(cols,1);
media =zeros(cols,1);
for i=1:cols
% 繪製百分比率圖
plot(res_ratio(:,i)*100);
% 計算平均值 中值
media_l = 0.5;
media_find_flg = 0;
for j = 1:rows
avg(i) = avg(i) + j*res_ratio(j,i);
% 統計比率超過一半的 數之後就是中值 找到後就不更新了
if(media_find_flg ==0)
if(media_l >0)
media_l = media_l - res_ratio(j,i);
else
media(i) = j;
media_find_flg = 1;
end
end
end
end
legend(res_name);
% 建立 xlabel
xlabel({'歸一化到100分後成績'});
% 建立 title
title({'各省市歸一化成績分佈比率'});
% 建立 ylabel
ylabel({'單位成績分佈比率'});
```
最終我們得到了這樣的一副圖, 細節部分比較多,且資料噪聲較大,但是資料的整體趨勢大概明白了,噪聲較大的黃色的線是北京的,暫時不做過多分析
![各省市成績分佈比率](https://gitee.com/schen00/BlogImage/raw/master/image/1595952537365.png)
### 各省市分數平均值與中值
我們這裡的計算平均值就是 每分段人數乘以該分段的比例,最終得到的結果,
然後, 中值這裡簡單除暴, 找到中間比率所在的區間就好了, 程式碼沒有去過多處理, 能跑出來結果就好
| **** | **平均數** | **中數** | **眾數** |
|:----:|:------------:|:------:|:------:|
| 河南文科 | 49\.48792233 | 50 | 46 |
| 河南理科 | 54\.58292813 | 58 | 65 |
| **北京** | **68\.04792125** | **70** | **70** |
| 上海 | 57\.56537197 | 60 | 62 |
| 河北文科 | 51\.23109382 | 52 | 37 |
| 河北理科 | 58\.00918618 | 61 | 66 |
| 山東 | 53\.14176529 | 56 | 60 |
| 廣東文科 | 47\.7185653 | 49 | 52 |
| 廣東理科 | 48\.64707915 | 51 | 55 |
| 湖北文科 | 48\.50952865 | 49 | 37 |
| 湖北理科 | 51\.9093088 | 55 | 64 |
| 湖南文科 | 60\.26081026 | 62 | 72 |
| 湖南理科 | 59\.09632919 | 62 | 65 |
| 四川文科 | 54\.82215427 | 57 | 59 |
| 四川理科 | 61\.59698771 | 64 | 60 |
| 安徽文科 | 51\.95829486 | 55 | 69 |
| 安徽理科 | 54\.62690506 | 57 | 56 |
| **廣西文科** | **37\.84799656** | **37** | **31** |
| 廣西理科 | 41\.46558284 | 41 | 33 |
| 貴州文科 | 63\.48516406 | 65 | 64 |
| 貴州理科 | 57\.96584346 | 58 | 56 |
| 江西文科 | 53\.35740184 | 55 | 71 |
| 江西理科 | 56\.85982591 | 61 | 62 |
### 資料簡單分析
我們在上一章節給出了一張圖, matlab 繪製的圖的顏色比較接近, 建議下載原圖觀看,給出了分佈圖,
我們把資料最為特殊的幾條線單獨繪製一下,
- 最偏右的 黃色 北京
- 最偏左的 紫色 廣西文科
- 最高的 淺藍色 貴州文科
- 最平均的 淺紫色 湖北理科
- 雙峰的 藍色 江西文科
![明顯資料分析](https://gitee.com/schen00/BlogImage/raw/master/image/1595952537254.png)
其實這些形態是有獨特的意義的,理論上的曲線是正太分佈的,但是由於各種原因,我們以實際曲線為主,
- 靠右表示 資料整體偏大
- 靠左整體偏小
- 最高的表示資料比較集中,
- 最低的表示資料分佈均勻
- 雙峰的表示資料割裂嚴重(我瞎編的)。。。
就總體而言, 各個省市的成績的峰值(眾數)也主頁也分為兩個部分,部分省市的峰值在40分左右,主要包括河南文科,河北文科,湖北文科,廣西文科,廣西理科
剩下的分數的眾數都集中在60分多一點的位置,
emmm, 就這麼多了, 再多的分析也沒有太多用, 畢竟北京NB
剩下的部分就是 高考本科上線率這種資料了, 但是各省對於本科的分數線真是不同
![本科分數線](https://gitee.com/schen00/BlogImage/raw/master/image/1595952537182.png)
我給出的資料是我在[各地高考歷年分數線(批次線)](http://www.eol.cn/e_html/gk/fsx/) 這個網頁上能看到2020 年各省高考批次線, 一般的省市都是劃分 1本2本專科, 除了北京,上海,河北,山東,廣東
後面想辦法再做吧, 估計會不做了
### 高考大省與高考小省
我們拿高考大省河南河北然後對比上海和北京, 看下資料
其實這裡應該去找資料軸上的最明顯特徵的線, 具體資料自己分析好了
但是我們暫時只看這幾個資料,
![四省市資料對比](https://gitee.com/schen00/BlogImage/raw/master/image/1595952537355.png)
| **** | **平均數** | **中數** | **眾數** |
|:----:|:------------:|:------:|:------:|
| 河南文科 | 49\.48792233 | 50 | 46 |
| 河南理科 | 54\.58292813 | 58 | 65 |
| **北京** | **68\.04792125** | **70** | **70** |
| 上海 | 57\.56537197 | 60 | 62 |
| 河北文科 | 51\.23109382 | 52 | 37 |
| 河北理科 | 58\.00918618 | 61 | 66 |
都是前面給出的資料, 我們繪製出來了
![四省市對比](https://gitee.com/schen00/BlogImage/raw/master/image/1595952537360.png)
北京的成績是明顯優於河北的,河南和上海的資料其實是一直的,即使是在全部曲線圖上也算比較中間的型別了,
## 總結
搞了半天, 屁用沒有,就是手癢然後就搞了一大堆, 越搞越多, 後續還有一堆要做的,
根據本篇資料而言, 北京的成績是比全國各個省市的成績要好的,可能與培養方式不同吧,
其實這種分數分佈並不一定是培養造成的, 還有部分是各省考試情況不同導致的,所以資料僅供參考, 北京NB
## 備註
我將所有的資料都存在了 Github 上
https://github.com/SChen1024/GaoKao
有興趣的可隨便拿資料進行分析, 後續還會做完最