Python分析學校四六級過關情況,python四六級

來源:互聯網
上載者:User

Python分析學校四六級過關情況,python四六級

這段時間看了資料分析方面的內容,對Python中的numpy和pandas有了最基礎的瞭解。我知道如果我不用這些技能做些什麼的話,很快我就會忘記。想起之前群裡發過一個學校的四六級成績表,正好可以用來熟悉一下pandas中的一些用法。

1.資料介紹。

成績表中包含的欄位十分詳細,裡面有年級、性別、姓名、分數等等的一系列內容,我只想簡單的分析一下我們學校的四六級過關率而已,所以去除了一些不必要的欄位。留下的有如下幾個欄位:

第一列是自增的序號,沒有什麼實際意義。

第二列就是代表著該學生參加的是四級還是六級。

第三列是我們學校的院系名稱。

第四列是學校院系的各個專業。

第五列是年級,13代表著2013年入學。

第六列是性別。

後面的三列分別是總分、聽力、閱讀、寫作等。

其中總分為0的都是缺考的。一共有接近9000條資料(沒有報名的不在其中)。

2.預期結果。

我想利用這些資料最終通過表徵圖的形式展示出以下幾點:

1.各個學院的四六級平均分。

2.各個學院的四六級過關人數。

3.各個學院的各個年級過關人數。

4.各個年級的過關人數。

5.男生女生分別過關人數。

最終結果:

各個學院的四六級過關人數:

3.實現過程。

(1)匯入依賴包。

程式分別使用了pandas進行分組轉換,和matplotlib提供的繪圖功能。

import pandas as pdimport matplotlib.pylab as plt

(2)載入資料。

想要分析資料自然要得到資料了,我將整理的資料存放在sj.xls中,是一個Excel類型的資料。
這一步使用pandas的read_excel即可,產生一個DataFrame對象。

#載入全部資料sj = pd.read_excel(r'F:\DataAnalysis\sj.xls')

載入完之後輸出一下看看內容:

除了排版沒有對齊之外其他都一樣。

(3)統計各個學院平均分。

在這裡就可以完成我們預期的第一個結果:

各個學院的四六級平均分:

想要各個學院的情況當然是要根據學院來進行分組了,同時也需要分出“CET4”和“CET6”兩組。使用groupby即可,這樣會產生一個SeriesGroupBy對象,然後再調用mean函數(預設是軸0計算,也就是我們想要的結果)即可統計出平均分情況。

#按照各個學院進行分組xymean = sj['總分'].groupby([sj['院系名稱'],sj['語言層級']])#計算各個學院的平均分數xymean = xymean.mean()

這個時候將其輸出的話會得到如下結果:

由於院系名稱和語言層級是層次化索引的緣故,看起來並不是十分的友好,因此使用unstack將語言層級轉從行轉換為列。

xymean = xymean.unstack(level='語言層級')

再次輸出的話結果就比較清晰了

使用pandas的繪圖功能進行繪圖:

#使用橫向柱狀圖顯示xymean.plot(kind='barh')#在PyCharm中需要使用,在Ipython環境中如果以--pylab形式開啟就不需要plt.show()

運行一下看看結果:

可以看到這時候資料的結果都能夠顯示出來了,但是中文部分出現了問題,不過不要緊,科學上網一查就解決了:https://github.com/mwaskom/seaborn/issues/1009

添加一下代碼即可:

import matplotlib as mplmpl.rcParams['font.sans-serif'] = ['SimHei']mpl.rcParams['font.serif'] = ['SimHei']

再次運行就OK了。

接下來要分析過關的情況了。

(4)篩選資料。

既然已經有了所有的資料內容了,下一步就是篩選出所有過關的人數了。

#過濾出過關人數sjpass = sj[sj['總分'] >= 425]

這時候sjpass存放的就是所有的過關人數了。

在輸出結果的最下面就可以看到一共有1507行資料,當然也可以使用len()或者shape[0]查看共有多少行。

(5)各個學院的四六級過關人數。

已經有了全部過關人的資料了,接下來根據預期結果進行分組即可。同樣的根據“院系名稱”和“語言層級”對總分進行分組,然後使用count函數進行求和最後再用unstack進行調整繪圖展示。

#按照各個學院進行分組xypass = sjpass['總分'].groupby([sjpass['院系名稱'],sjpass['語言層級']])#計算各個學院的過關總人數xypass = xypass.count()#將語言層級作為columnsxypass = xypass.unstack(level='語言層級')#進行繪圖xypass.plot(kind='barh')plt.show()

繪圖結果:

(6)各個學院的各個年級過關人數。。

這次分組的時候加上年級即可,並且為了繪圖比較好看一點,這次可以將“年紀”轉換為列,並且像12年這種的有些學員已經沒有人蔘加了,所以需要將缺失值用0填充:

#按照各個學院和年級進行分組xypass = sjpass['總分'].groupby([sjpass['院系名稱'],sjpass['語言層級'],sjpass['年級']])#計算各個學院的過關總人數xypass = xypass.count()#將語言層級作為columns,並且將缺失值用0進行填充xypass = xypass.unstack(level='年級').fillna(0)xypass.plot(kind='barh')plt.show()

繪圖結果:

(7)各個年級的過關人數。

使用groupby對年級進行分組即可:

#-----------------各個年級過關人數------------------njpass = sjpass['總分'].groupby([sjpass['年級'],sjpass['語言層級']]).count().unstack(level='語言層級')njpass.plot(kind='barh')plt.show()

繪圖結果:

(8)男生女生分別過關人數。

將性別和語言層級進行分組:

#---------------男生女生過關情況----------------------nvpass = sjpass['總分'].groupby([sjpass['性別'],sjpass['語言層級']]).count().unstack(level='語言層級')nvpass.plot(kind='bar')plt.show()

繪圖結果:

4.結果分析。

從繪圖的結果上來看的話,各個學院之間音樂學院的平均分比較低,藝術設計和外國語學院的平均分都比較高,但是過關人數卻沒有那麼的多,尤其是藝術設計的人數比較少,主要也是因為該學院的總人數比較少。

四級的過關人數明顯比六級的人數多的多,而且因為15級是大二年級,在我們學校大二才可以參加四六級考試,所以過關的人數裡面15級佔有比較大的比分。

而且不得不承認,女生的過關率要比男生高的不止一點。

源碼以及資料:https://github.com/jiajia0/DataAnalysis

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援幫客之家。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.