數據特征分析:4.正態分布與正態性體驗
1.正態分布
期望值u(均值)決定位置,標準差決定它的分布幅度,可以驗證分布曲線的高矮胖瘦,越胖代表它的離中趨勢越明顯,越高代表它集中的值越高。
2. 正太性檢驗
利用觀測數據判斷總體是否服從正態分布的檢驗稱為正態性檢驗,它是統計判決中重要的一種特殊的擬合優度假設檢驗。
直方圖初判 / QQ圖判斷 / K-S檢驗
2.1直方圖初判
import numpy as np import pandas as pd import matplotlib.pyplot as plt % matplotlib inline
#直方圖判斷 s = pd.DataFrame(np.random.randn(1000)+10, columns = [‘value‘]) print(s.head()) #創建隨機數據 fig = plt.figure(figsize = (10, 6)) ax1 = fig.add_subplot(2, 1, 1) # 創建子圖1 ax1.scatter(s.index, s.values)
plt.grid() #繪制數據分布圖
s = pd.DataFrame(np.random.rand(1000)+10, columns = [‘value‘])#這樣子改下,其他不變,就是均勻分布了
ax2 = fig.add_subplot(2,1,2) # 創建子圖2s.hist(bins=30,alpha = 0.5,ax = ax2) s.plot(kind = ‘kde‘, secondary_y=True,ax = ax2) plt.grid() # 繪制直方圖 # 呈現較明顯的正太性
2.2 QQ圖判斷
QQ圖通過把測試樣本數據的分位數與已知分布相比較,從而來檢驗數據的分布情況
QQ圖是一種散點圖,對應於正態分布的QQ圖,就是由標準正態分布的分位數為橫坐標,樣本值為縱坐標的散點圖
參考直線:四分之一分位點和四分之三分位點這兩點確定,看散點是否落在這條線的附近
繪制思路
① 在做好數據清洗後,對數據進行排序(次序統計量:x(1)<x(2)<....<x(n))
③ 繪制直方圖 + qq圖,直方圖作為參考
繪制散點圖,橫坐標是它的分位,就是分布的位置,做下排序,看是否很多的點在某條直線上,這條直線一般是拿它的一分位和三分位做一下相減,
s = pd.DataFrame(np.random.randn(1000) + 10, columns = [‘value‘]) print(s.head()) #創建隨機數據 mean = s[‘value‘].mean() std = s[‘value‘].std() print(‘均值為:%.2f,標準差為:%.2f‘ % (mean,std)) print(‘------‘) # 計算均值,標準差
s.sort_values(by = ‘value‘, inplace = True) #index值跟著改變了。 重新排序 s_r = s.reset_index(drop = False) #給index重新排序下,drop = False是是否保留原來的 s_r[‘p‘] = (s_r.index - 0.5) / len(s_r) s_r[‘q‘] = (s_r[‘value‘] - mean) / std #每個值標準化之後的結果 print(s_r.head()) print(‘------‘) #計算百分位數 p(i) # 計算q值
st = s[‘value‘].describe() x1 ,y1 = 0.25, st[‘25%‘] #1/4位點 x2 ,y2 = 0.75, st[‘75%‘] #3/4位點 print(‘四分之一位數為:%.2f,四分之三位數為:%.2f‘ % (y1,y2)) print(‘------‘) # 計算四分之一位數、四分之三位數
fig = plt.figure(figsize = (10,9)) ax1 = fig.add_subplot(3,1,1) # 創建子圖1 ax1.scatter(s.index, s.values) plt.grid() # 繪制數據分布圖 ax2 = fig.add_subplot(3,1,2) # 創建子圖2 s.hist(bins=30,alpha = 0.5,ax = ax2) s.plot(kind = ‘kde‘, secondary_y=True,ax = ax2) plt.grid() # 繪制直方圖 ax3 = fig.add_subplot(3,1,3) # 創建子圖3 ax3.plot(s_r[‘p‘],s_r[‘value‘],‘k.‘,alpha = 0.1) #s_r[‘value‘]也可以用s_r[‘q‘],最後結果是一樣的 ax3.plot([x1,x2],[y1,y2],‘-r‘) #這兩個點做一個紅線 plt.grid() # # 繪制QQ圖,直線為四分之一位數、四分之三位數的連線,基本符合正態分布
2.3K - S檢驗
# KS檢驗,理論推導 data = [87,77,92,68,80,78,84,77,81,80,80,77,92,86, 76,80,81,75,77,72,81,72,84,86,80,68,77,87, 76,77,78,92,75,80,78] # 樣本數據,35位健康男性在未進食之前的血糖濃度 df = pd.DataFrame(data, columns =[‘value‘]) u = df[‘value‘].mean() std = df[‘value‘].std() print("樣本均值為:%.2f,樣本標準差為:%.2f" % (u,std)) print(‘------‘) # 查看數據基本統計量 s = df[‘value‘].value_counts().sort_index() df_s = pd.DataFrame({‘血糖濃度‘:s.index,‘次數‘:s.values}) # 創建頻率數據 df_s[‘累計次數‘] = df_s[‘次數‘].cumsum() df_s[‘累計頻率‘] = df_s[‘累計次數‘] / len(data) df_s[‘標準化取值‘] = (df_s[‘血糖濃度‘] - u) / std df_s[‘理論分布‘] =[0.0244,0.0968,0.2148,0.2643,0.3228,0.3859,0.5160,0.5832,0.7611,0.8531,0.8888,0.9803] # 通過查閱正太分布表 df_s[‘D‘] = np.abs(df_s[‘累計頻率‘] - df_s[‘理論分布‘]) dmax = df_s[‘D‘].max() print("實際觀測D值為:%.4f" % dmax) # D值序列計算結果表格 df_s
把一個非標準正態分布變成一個標準正態分布----->把非標準正態分布的值變成X = (x-u) /方差----->可以找到理論值。;
拿這個標準化取值去跟正態分布表去對
標準化取值的值它本 身就符合正態分布;系統分布與標準分布相減,如果這個函數滿足標準正態分布,它的值就應該滿足這個表。比如說標準化取值2.064315,其對應的查正態分布表值為0.9803,它的理論分布值是0.9803; 標準化取值-1.9777,找的時候把它的負號去掉,查正態分布表為0.9756,正的是0.9756,負的就是1-0.9756=0.0244.可以看到與理論分布值是相對應的。 ----- >>>理論分布就相當於是g(x)就是F0(x),F(n)就是原來的F(n)累計頻率。累計頻率 - 理論分布 = D
df_s[‘累計頻率‘].plot(style = ‘--k.‘) df_s[‘理論分布‘].plot(style = ‘--r.‘) plt.legend(loc = ‘upper left‘) plt.grid() # 密度圖表示
實際觀測D值為:0.1597 對應的0.1597放到顯著性對照表,我們的樣本數據一共35個,在50以內,按0.05的值去算的話,0.1587介於0.158和0.190之間,它所對應的P值是0.2和0.4,這個P值是大於
0.05的。 拿到這個D值去那個表裏邊查,如果大於0.05就說明滿足正態分布,這是理論推導,實際工作中就更簡單了。
# 直接用算法做KS檢驗 from scipy import stats # scipy包是一個高級的科學計算庫,它和Numpy聯系很密切,Scipy一般都是操控Numpy數組來進行科學計算 data = [87,77,92,68,80,78,84,77,81,80,80,77,92,86, 76,80,81,75,77,72,81,72,84,86,80,68,77,87, 76,77,78,92,75,80,78] # 樣本數據,35位健康男性在未進食之前的血糖濃度 df = pd.DataFrame(data, columns =[‘value‘]) u = df[‘value‘].mean() # 計算均值 std = df[‘value‘].std() # 計算標準差 stats.kstest(df[‘value‘], ‘norm‘, (u, std)) #value值直接寫樣本就可以了,中間是norm默認是以正態分布去做判斷,後邊是均值和方差 # .kstest方法:KS檢驗,參數分別是:待檢驗的數據,檢驗方法(這裏設置成norm正態分布),均值與標準差 # 結果返回兩個值:statistic → D值,pvalue → P值 # p值(pvalue)大於0.05,為正態分布
數據特征分析:4.正態分布與正態性體驗