【Python數據分析】四級成績分佈 -matplotlib,xlrd 應用

最近得到了一些四級成績數據,大概500多個,因而突發奇想是否可以看看這些成績數據是否知足所謂的正態分佈呢?說幹就幹,因而有了這篇文章。
文章順帶介紹了xlrd模塊的一些用法和matplotlib畫自定義數據的條形圖和隨機的條形圖的一些方法,而且提供了一些相關連接,可做爲學習matplotlib和numpy的資源,但願對讀者也有幫助。html

更優美的格式見這裏python

工具

  • Python 3.5
  • xlrd模塊
  • numpy模塊及一些依賴模塊(安裝請自行查詢方法,絕大部分pip就可搞定)
  • matplotlib繪圖模塊

xlrd基本用法

一、導入模塊

1
import xlrd

二、打開Excel文件讀取數據

1
data = xlrd.open_workbook('excelFile.xls')

三、使用技巧

  • 獲取一個工做表數組

    1
    2
    3
    table = data.sheets()[0] #經過索引順序獲取
    table = data.sheet_by_index(0) #經過索引順序獲取
    table = data.sheet_by_name(u'Sheet1')#經過名稱獲取
  • 獲取整行和整列的值(數組)dom

    1
    2
    3
    4
    5
    6
    7
    table.row_values(i)
    table.col_values(i)
    ```
    * 獲取行數和列數
    ```python
    nrows = table.nrows
    ncols = table.ncols
  • 循環行列表數據svn

    1
    2
    for i in range(nrows ):
    print table.row_values(i)
  • 單元格函數

    1
    2
    cell_A1 = table.cell(0,0).value
    cell_C4 = table.cell(2,3).value
  • 使用行列索引工具

    1
    2
    cell_A1 = table.row(0)[0].value
    cell_A2 = table.col(1)[0].value
  • 簡單的寫入學習

    1
    2
    3
    4
    5
    6
    7
    8
    row = 0
    col = 0
    #類型 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error
    ctype = 1 value = '單元格的值'
    xf = 0 # 擴展的格式化
    table.put_cell(row, col, ctype, value, xf)
    table.cell(0,0) #單元格的值'
    table.cell(0,0).value #單元格的值'

畫折線圖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import xlrd
import numpy as np
import matplotlib.pyplot as plt

data = xlrd.open_workbook('D:\\Python Workspace\\Data\\cet4.xls')

table = data.sheets()[0] #sheet 0

col5 = table.col_values(5)[1:] #取第5列的成績,並去掉列屬性名稱

count = [0 for i in range(0,650)] #初始化count
x = [i for i in range(0,650)]

for i in col5:
num = int(i)
count[num] += 1 #統計每一個人數的人數

plt.xlabel('Score')
plt.ylabel('Number of people')
plt.title('Distribution of CET-4 Scores')
plt.ylim(0,8)
plt.plot([i for i in range(250,650) if count[i] != 0],[i for i in count[250:] if i != 0],linewidth=1) #畫出折線圖
plt.show()

圖1圖1spa

畫直方圖並與正態分佈直方圖對比

import xlrd
import numpy as np
from math import *
import pylab as pl
import matplotlib.pyplot as plt

data = xlrd.open_workbook('D:\\Python Workspace\\Data\\cet4.xls')

table = data.sheets()[0]   #sheet 0

col5 = table.col_values(5)[1:]

ha = [int(i) for i in col5]     #成績數據
mu = np.mean(ha)      #平均值
sigma = np.std(ha)    #標準差
data = np.random.normal(mu,sigma,1000)  #生成正態分佈隨機數據

x = np.linspace(0,700,1000)
y = (1. / sqrt(2 * np.pi) / sigma)*np.exp( -((x-mu)**2/(2*sigma**2)) )

plt.hist(data,bins=100,facecolor='g',alpha=0.44)
plt.hist(ha,bins=70,facecolor='r',histtype='stepfilled')
plt.plot(x,y,color='b')   #正態分佈曲線

plt.xlabel('Score')
plt.ylabel('Number of people')
plt.title('Distribution of CET-4 Scores')
plt.show()

圖2圖2
且可求得數據的均值和標準差分別爲:476.743785851和104.816562585
由圖可見,綠色條形圖是$\mu$=476.743785851,$\sigma$=104.816562585的正態分佈條形圖,而紅色是四級成績數據的分佈圖,雖然因爲數據較少(500多個數據),因此擬合較差,可是能夠看出成績數據仍是基本知足正態分佈的。
不知道爲啥,正態曲線沒有畫出來,單獨畫正態曲線是能夠畫出來的,有待研究。
.net

繪製直方圖的一些參數解釋

繪圖均可以調用matplotlib.pyplot庫來進行,其中的hist函數能夠直接繪製直方圖。

調用方式:

1
n, bins, patches = plt.hist(arr, bins=10, normed=0, facecolor='black', edgecolor='black',alpha=1,histtype='bar')

 

hist的參數很是多,但經常使用的就這六個,只有第一個是必須的,後面四個可選

arr: 須要計算直方圖的一維數組

bins: 直方圖的柱數,可選項,默認爲10

normed: 是否將獲得的直方圖向量歸一化。默認爲0

facecolor: 直方圖顏色

edgecolor: 直方圖邊框顏色

alpha: 透明度

histtype: 直方圖類型,‘bar’, ‘barstacked’, ‘step’, ‘stepfilled’

返回值 :

n: 直方圖向量,是否歸一化由參數normed設定

bins: 返回各個bin的區間範圍

patches: 返回每一個bin裏面包含的數據,是一個list

摘自這裏 from denny

一些連接

matplotlib

庫的主頁
gallary

matplotlib的一些示例及其代碼,是很好的學習工具。
用python作科學計算

用Python做科學計算的一些工具
xlrd文檔
numpy的一些方法

相關文章
相關標籤/搜索