Python分析學校四六級過關情況
這段時間看了數(shù)據(jù)分析方面的內(nèi)容,對Python中的numpy和pandas有了最基礎的了解。我知道如果我不用這些技能做些什么的話,很快我就會忘記。想起之前群里發(fā)過一個學校的四六級成績表,正好可以用來熟悉一下pandas中的一些用法。
1.數(shù)據(jù)介紹。
成績表中包含的字段十分詳細,里面有年級、性別、姓名、分數(shù)等等的一系列內(nèi)容,我只想簡單的分析一下我們學校的四六級過關率而已,所以去除了一些不必要的字段。留下的有如下幾個字段:

第一列是自增的序號,沒有什么實際意義。
第二列就是代表著該學生參加的是四級還是六級。
第三列是我們學校的院系名稱。
第四列是學校院系的各個專業(yè)。
第五列是年級,13代表著2013年入學。
第六列是性別。
后面的三列分別是總分、聽力、閱讀、寫作等。
其中總分為0的都是缺考的。一共有接近9000條數(shù)據(jù)(沒有報名的不在其中)。
2.預期結果。
我想利用這些數(shù)據(jù)最終通過圖標的形式展示出以下幾點:
1.各個學院的四六級平均分。
2.各個學院的四六級過關人數(shù)。
3.各個學院的各個年級過關人數(shù)。
4.各個年級的過關人數(shù)。
5.男生女生分別過關人數(shù)。
最終結果:
各個學院的四六級過關人數(shù):

3.實現(xiàn)過程。
(1)導入依賴包。
程序分別使用了pandas進行分組轉(zhuǎn)換,和matplotlib提供的繪圖功能。
import pandas as pd import matplotlib.pylab as plt
(2)加載數(shù)據(jù)。
想要分析數(shù)據(jù)自然要得到數(shù)據(jù)了,我將整理的數(shù)據(jù)存放在sj.xls中,是一個Excel類型的數(shù)據(jù)。
這一步使用pandas的read_excel即可,生成一個DataFrame對象。
#加載全部數(shù)據(jù) sj = pd.read_excel(r'F:\DataAnalysis\sj.xls')
加載完之后輸出一下看看內(nèi)容:

除了排版沒有對齊之外其他都一樣。
(3)統(tǒng)計各個學院平均分。
在這里就可以完成我們預期的第一個結果:
各個學院的四六級平均分:
想要各個學院的情況當然是要根據(jù)學院來進行分組了,同時也需要分出“CET4”和“CET6”兩組。使用groupby即可,這樣會生成一個SeriesGroupBy對象,然后再調(diào)用mean函數(shù)(默認是軸0計算,也就是我們想要的結果)即可統(tǒng)計出平均分情況。
#按照各個學院進行分組 xymean = sj['總分'].groupby([sj['院系名稱'],sj['語言級別']]) #計算各個學院的平均分數(shù) xymean = xymean.mean()
這個時候?qū)⑵漭敵龅脑挄玫饺缦陆Y果:

由于院系名稱和語言級別是層次化索引的緣故,看起來并不是十分的友好,因此使用unstack將語言級別轉(zhuǎn)從行轉(zhuǎn)換為列。
xymean = xymean.unstack(level='語言級別')
再次輸出的話結果就比較清晰了

使用pandas的繪圖功能進行繪圖:
#使用橫向柱狀圖顯示 xymean.plot(kind='barh') #在PyCharm中需要使用,在Ipython環(huán)境中如果以--pylab形式打開就不需要 plt.show()
運行一下看看結果:

可以看到這時候數(shù)據(jù)的結果都能夠顯示出來了,但是中文部分出現(xiàn)了問題,不過不要緊,科學上網(wǎng)一查就解決了:https://github.com/mwaskom/seaborn/issues/1009
添加一下代碼即可:
import matplotlib as mpl mpl.rcParams['font.sans-serif'] = ['SimHei'] mpl.rcParams['font.serif'] = ['SimHei']
再次運行就OK了。

接下來要分析過關的情況了。
(4)篩選數(shù)據(jù)。
既然已經(jīng)有了所有的數(shù)據(jù)內(nèi)容了,下一步就是篩選出所有過關的人數(shù)了。
#過濾出過關人數(shù) sjpass = sj[sj['總分'] >= 425]
這時候sjpass存放的就是所有的過關人數(shù)了。

在輸出結果的最下面就可以看到一共有1507行數(shù)據(jù),當然也可以使用len()或者shape[0]查看共有多少行。
(5)各個學院的四六級過關人數(shù)。
已經(jīng)有了全部過關人的數(shù)據(jù)了,接下來根據(jù)預期結果進行分組即可。同樣的根據(jù)“院系名稱”和“語言級別”對總分進行分組,然后使用count函數(shù)進行求和最后再用unstack進行調(diào)整繪圖展示。
#按照各個學院進行分組 xypass = sjpass['總分'].groupby([sjpass['院系名稱'],sjpass['語言級別']]) #計算各個學院的過關總?cè)藬?shù) xypass = xypass.count() #將語言級別作為columns xypass = xypass.unstack(level='語言級別') #進行繪圖 xypass.plot(kind='barh') plt.show()
繪圖結果:

(6)各個學院的各個年級過關人數(shù)。。
這次分組的時候加上年級即可,并且為了繪圖比較好看一點,這次可以將“年紀”轉(zhuǎn)換為列,并且像12年這種的有些學員已經(jīng)沒有人參加了,所以需要將缺失值用0填充:
#按照各個學院和年級進行分組 xypass = sjpass['總分'].groupby([sjpass['院系名稱'],sjpass['語言級別'],sjpass['年級']]) #計算各個學院的過關總?cè)藬?shù) xypass = xypass.count() #將語言級別作為columns,并且將缺失值用0進行填充 xypass = xypass.unstack(level='年級').fillna(0) xypass.plot(kind='barh') plt.show()
繪圖結果:

(7)各個年級的過關人數(shù)。
使用groupby對年級進行分組即可:
#-----------------各個年級過關人數(shù)------------------ njpass = sjpass['總分'].groupby([sjpass['年級'],sjpass['語言級別']]).count().unstack(level='語言級別') njpass.plot(kind='barh') plt.show()
繪圖結果:

(8)男生女生分別過關人數(shù)。
將性別和語言級別進行分組:
#---------------男生女生過關情況---------------------- nvpass = sjpass['總分'].groupby([sjpass['性別'],sjpass['語言級別']]).count().unstack(level='語言級別') nvpass.plot(kind='bar') plt.show()
繪圖結果:

4.結果分析。
從繪圖的結果上來看的話,各個學院之間音樂學院的平均分比較低,藝術設計和外國語學院的平均分都比較高,但是過關人數(shù)卻沒有那么的多,尤其是藝術設計的人數(shù)比較少,主要也是因為該學院的總?cè)藬?shù)比較少。
四級的過關人數(shù)明顯比六級的人數(shù)多的多,而且因為15級是大二年級,在我們學校大二才可以參加四六級考試,所以過關的人數(shù)里面15級占有比較大的比分。
而且不得不承認,女生的過關率要比男生高的不止一點。
源碼以及數(shù)據(jù):https://github.com/jiajia0/DataAnalysis
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
詳解Python 重學requests發(fā)起請求的基本方式
這篇文章主要介紹了詳解Python 重學requests發(fā)起請求的基本方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-02-02
淺談Python中range與Numpy中arange的比較
這篇文章主要介紹了淺談Python中range與Numpy中arange的比較,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
Python+OpenCV實現(xiàn)鼠標畫瞄準星的方法詳解
所謂瞄準星指的是一個圓圈加一個圓圈內(nèi)的十字線,就像玩射擊游戲狙擊槍開鏡的樣子一樣。本文將利用Python+OpenCV實現(xiàn)鼠標畫瞄準星,感興趣的可以嘗試一下2022-08-08
OpenCV-Python實現(xiàn)圖像梯度與Sobel濾波器
在實際應用中我們只需要將圖像矩陣與Sobel濾波器卷積就可以得到圖像的梯度矩陣了。具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-06-06
python之json文件轉(zhuǎn)xml文件案例講解
這篇文章主要介紹了python之json文件轉(zhuǎn)xml文件案例講解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08
tkinter高級布局之PanedWindow和notebook詳解
本文主要介紹了tkinter中的兩種布局控件,分別是可以動態(tài)劃分子控件的PanedWindow,和提供了選項卡工具的notebook,感興趣的小伙伴可以學習一下2023-08-08

