數據特征分析-正太分布


期望值,即在一個離散性隨機變量試驗中每次可能結果的概率乘以其結果的總和。

若隨機變量X服從一個數學期望為μ、方差為σ^2的正態分布,記為N(μ,σ^2),其概率密度函數為正態分布的期望值μ決定了其位置,其標准差σ決定了分布的幅度。當μ = 0、σ = 1時的正態分布是標准正態分布。正態分布的圖示如下:

在實際場景中,數據可能不完全符合正態分布,因此需要對數據進行檢驗,驗證是否符合正態分布。

一、通過直方圖初步判斷

df = pd.DataFrame(np.random.randn(1000)+2,columns=['value'])
fig,axes = plt.subplots(1,2,figsize = (10,4))
ax1 = axes[0]
ax1.scatter(df.index,df.values)

ax2 = axes[1]
df.hist(bins = 20,alpha = 0.7,ax = ax2)
df.plot(kind = 'kde',secondary_y = True,ax = ax2)  #使用y軸作為副坐標軸

 

二、通過qq圖判斷

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 圖,直方圖作為參考

# qq圖判斷
df = pd.DataFrame(np.random.randn(1000)+2,columns=['value'])
mean = df['value'].mean()
std = df['value'].std()
print('平均值為%.2f,標准差為%.2f'%(mean,std))
df.sort_values('value',inplace = True)
df_r = df.reset_index(drop = False) #t變為DataFrame
df_r['p'] = (df_r.index-0.5)/len(df_r)
df_r['q'] = (df_r['value']-mean)/std
print(df_r.head())
fig,axes = plt.subplots(1,3,figsize = (20,4))
des = df['value'].describe()
# x1,y1 = 0.25,des['25%']
# x2,y2 = 0.75,des['75%']

ax1 = axes[0]
ax1.scatter(df.index,df['value'])

ax2 = axes[1]
df['value'].hist(bins = 20,ax = ax2)
df['value'].plot(kind='kde',secondary_y = True,ax = ax2)

ax3 = axes[2]
ax3.plot(df_r['p'],df_r['value'],'b')
# ax3.plot([x1,x2],[y1,y2],'r')
ax3.plot([0.25,0.75],[des['25%'],des['75%']],'r')

 

 

三、k-s檢驗

k-s是比較一個頻率分布f(x)與理論分布g(x)的檢測方法,將樣本數據的累計頻率分布與特定的理論分布(比如正態分布)進行比較,如果兩者差距小,則推論樣本分布取自某特定分布。

H0:樣本的總體分布 服從 某特定分布

H1:樣本的總體分布 不服從 某特定分布

f(x):樣本的累計分布函數

g(x):理論分布的分布函數

D:f(x)-g(x)的絕對值的最大值,即max(abs(f(x)-g(x)))

根據D與D(u,a)比較,如果p>0.05則接受H0,p<0.05則拒絕H0接受H1.

from scipy import stats
data = np.random.randint(70,80,100)
df = pd.DataFrame(data,columns=['value'])
u = df['value'].mean()  #求均值
std = df['value'].std()  #求標准差
stats.kstest(df['value'],'norm',(u,std))
# KstestResult(statistic=0.12748380545258786, pvalue=0.07085249921876394)
# 結果中pvalue=0.07,大於0.05

 

k-s檢驗的推導過程

df = pd.DataFrame(data,columns=['value'])
u = df['value'].mean()  #求均值
std = df['value'].std()  #求標准差
print('樣本均值%.2f,標准差%.2f'%(u,std))
s = df['value'].value_counts().sort_index()
df_s = pd.DataFrame({'血糖濃度':s.index,'頻數':s.values})
df_s['累計頻數'] = df_s['頻數'].cumsum()
df_s['累計頻率'] = df_s['累計頻數']/df_s['頻數'].sum()
df_s['標准化取值'] = (df_s['血糖濃度'] - u)/std
df_s['理論分布'] = [0.0764,0.1314,0.2090,0.3085,0.4247,0.5438,0.6628,0.7673,0.8508,0.9099]  #根據標准化取值查詢正態分布表得到
df_s['D'] = abs(df_s['累計頻率'] - df_s['理論分布'])
dmax = df_s['D'].max()
print('實際觀測D值為%.4f'%dmax)
df_s['累計頻率'].plot(style = '--r')
df_s['理論分布'].plot(style = '--g')
plt.legend(loc = 'upper left')   #紅色虛線表示累計頻率、綠色虛線表示理論分布的注釋位置
# 樣本均值74.64,標准差3.23
# 實際觀測D值為0.1110

根據D值為0.11,查詢顯著性水平表,可得知p>0.1,即滿足正態分布。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM