資料分析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 + 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 進行影象的繪製過程)
% 將 原始資料繪製出來 並計算平均值和中值 % 讀取 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({'單位成績分佈比率'});
最終我們得到了這樣的一副圖, 細節部分比較多,且資料噪聲較大,但是資料的整體趨勢大概明白了,噪聲較大的黃色的線是北京的,暫時不做過多分析
各省市分數平均值與中值
我們這裡的計算平均值就是 每分段人數乘以該分段的比例,最終得到的結果,
然後, 中值這裡簡單除暴, 找到中間比率所在的區間就好了, 程式碼沒有去過多處理, 能跑出來結果就好
**** | 平均數 | 中數 | 眾數 |
---|---|---|---|
河南文科 | 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 繪製的圖的顏色比較接近, 建議下載原圖觀看,給出了分佈圖,
我們把資料最為特殊的幾條線單獨繪製一下,
- 最偏右的 黃色 北京
- 最偏左的 紫色 廣西文科
- 最高的 淺藍色 貴州文科
- 最平均的 淺紫色 湖北理科
- 雙峰的 藍色 江西文科
其實這些形態是有獨特的意義的,理論上的曲線是正太分佈的,但是由於各種原因,我們以實際曲線為主,
- 靠右表示 資料整體偏大
- 靠左整體偏小
- 最高的表示資料比較集中,
- 最低的表示資料分佈均勻
- 雙峰的表示資料割裂嚴重(我瞎編的)。。。
就總體而言, 各個省市的成績的峰值(眾數)也主頁也分為兩個部分,部分省市的峰值在40分左右,主要包括河南文科,河北文科,湖北文科,廣西文科,廣西理科
剩下的分數的眾數都集中在60分多一點的位置,
emmm, 就這麼多了, 再多的分析也沒有太多用, 畢竟北京NB
剩下的部分就是 高考本科上線率這種資料了, 但是各省對於本科的分數線真是不同
我給出的資料是我在各地高考歷年分數線(批次線) 這個網頁上能看到2020 年各省高考批次線, 一般的省市都是劃分 1本2本專科, 除了北京,上海,河北,山東,廣東
後面想辦法再做吧, 估計會不做了
高考大省與高考小省
我們拿高考大省河南河北然後對比上海和北京, 看下資料
其實這裡應該去找資料軸上的最明顯特徵的線, 具體資料自己分析好了
但是我們暫時只看這幾個資料,
**** | 平均數 | 中數 | 眾數 |
---|---|---|---|
河南文科 | 49.48792233 | 50 | 46 |
河南理科 | 54.58292813 | 58 | 65 |
北京 | 68.04792125 | 70 | 70 |
上海 | 57.56537197 | 60 | 62 |
河北文科 | 51.23109382 | 52 | 37 |
河北理科 | 58.00918618 | 61 | 66 |
都是前面給出的資料, 我們繪製出來了
北京的成績是明顯優於河北的,河南和上海的資料其實是一直的,即使是在全部曲線圖上也算比較中間的型別了,
總結
搞了半天, 屁用沒有,就是手癢然後就搞了一大堆, 越搞越多, 後續還有一堆要做的,
根據本篇資料而言, 北京的成績是比全國各個省市的成績要好的,可能與培養方式不同吧,
其實這種分數分佈並不一定是培養造成的, 還有部分是各省考試情況不同導致的,所以資料僅供參考, 北京NB
備註
我將所有的資料都存在了 Github 上
https://github.com/SChen1024/GaoKao
有興趣的可隨便拿資料進行分析, 後續還會做完最後一點
到此這篇關於資料分析2020年全國各省高考成績分佈情況的文章就介紹到這了,更多相關2020年全國各省高考成績內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!