1. 程式人生 > >資料分析2020年全國各省高考成績分佈情況

資料分析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-一分一段表](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 有興趣的可隨便拿資料進行分析, 後續還會做完最