數據集
數據集來源:http://jse.amstat.org/v4n2/datasets.shoemaker.html ,我們取其中的體溫測試是否滿足正態分佈。
驗證
import pandas as pd
from scipy import stats
import matplotlib.pyplot as plt
import matplotlib as mpl
#讀取數據
df = pd.read_csv('http://jse.amstat.org/datasets/normtemp.dat.txt', header = None,sep = '\s+' ,names=['體溫','性別','心率'])
#查看數據概覽
df.head()
結果數據:
# 查看數據描述
df['體溫'].describe()
輸出:
# 計算偏態係數
stats.skew(df['體溫'])
# out:-0.004367976879198404
# 偏態係數小於0且接近0,曲線呈微左偏,大致呈對稱分佈
# 峯態係數
stats.kurtosis(df['體溫'])
# 峯態係數0.7049597854114715
# 峯態係數大於0且接近0,說明曲線微高聳
我們知道正態分佈時堆對稱的,偏度爲0,峯度爲0,從以上兩個係數可以判斷,體溫的分佈近似正態分佈,那到底是不是滿足分佈的正態性呢,需要使用真正的統計檢驗方法,而不是簡單地檢查峯度或偏度。
這裏使用 scipy.stats 提供的 shapiro 函數,對體溫分佈進行 Shapiro-Wilk 檢驗。該函數有兩個返回值,一個是檢驗的t統計量,另一個是p值。我們只需要知道如何使用p值判斷數據的正態性:如果p值小於等於0.05,就拒絕正態性假設,得出數據非正態分佈的結論。
# 檢驗是否滿足正態分佈
stats.shapiro(df['體溫'])
# out:(0.9865769743919373, 0.2331680953502655)
# 輸出結果中第一個爲統計數,第二個爲P值
# p值小於0.05,所以體溫滿足正態分佈
呈現
體溫滿足正態分佈,我們將繪製正態分佈曲線
import matplotlib.pyplot as plt
import matplotlib as mpl
#解決亂碼
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
#繪製正態分佈圖形
t = df['體溫'].sort_values()
#計算合適的位置和比例
loc,scale = stats.norm.fit(t)
plt.plot(t, stats.norm.pdf(t,loc,scale),'b-',label = 'norm')
plt.title(u'體溫正態分佈圖')
plt.show()
輸出: