1. 程式人生 > >數據特征分析:4.正態分布與正態性體驗

數據特征分析:4.正態分布與正態性體驗

體驗 去掉 matplot 比較 正態分布 strong sca 附近 line

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)  # 創建子圖2
s.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))

② 排序後,計算出每個數據對應的百分位p{ i } ,即第i個數據x(i)為p(i)分位數,其中p(i)=(i-0.5)/n (pi有多重算法,這裏以最常用方法為主)
③ 繪制直方圖 + 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.正態分布與正態性體驗