數據分析之正態分布檢驗及python實現

2022-01-02 Python之王


正態分布(Normal distribution),也稱「常態分布」,又名高斯分布(Gaussian distribution),最早由A.棣莫弗在求二項分布的漸近公式中得到。C.F.高斯在研究測量誤差時從另一個角度導出了它。P.S.拉普拉斯和高斯研究了它的性質。是一個在數學、物理及工程等領域都非常重要的概率分布,在統計學的許多方面有著重大的影響力。

正態曲線呈鍾型,兩頭低,中間高,左右對稱因其曲線呈鐘形,因此人們又經常稱之為鐘形曲線。

正太性檢驗

利用觀測數據判斷總體是否服從正態分布的檢驗稱為正態性檢驗,它是統計判決中重要的一種特殊的擬合優度假設檢驗。

直方圖初判 / QQ圖判斷 / K-S檢驗

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()
# 繪製數據分布圖

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()
# 繪製直方圖
# 呈現較明顯的正太性

這裡的直方圖呈現出非常明顯的正態分布特性。

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)  # 重新排序
print(s.head())
s_r = s.reset_index(drop = False)  # 重新排序後,更新index
print("\n", s_r.head())
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%']
# x2 ,y2 = 0.75, st['75%']
# 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)
# ax3.plot([x1,x2],[y1,y2],'-r')
# plt.grid()
# # 繪製QQ圖,直線為四分之一位數、四分之三位數的連線,基本符合正態分布

KS檢驗,理論推導

使用K-S檢驗一個數列是否服從正態分布、兩個數列是否服從相同的分布

使用K-S檢驗一個數列是否服從正態分布、兩個數列是否服從相同的分布 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)

# 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['累計頻率'].plot(style = '--k.')
df_s['理論分布'].plot(style = '--r.')
plt.legend(loc = 'upper left')
plt.grid()
# 密度圖表示

df_s

下面是正態分布表和顯著性對照表 因為樣本數為35,大於30且小於50,所以p值在這個區間 另外的,由於D值為0.1597. 大於0.158,小於0.197,且樣本數量接近於30.所以我們可以認為P值的取值區間在0.20 - 0.40 滿足p > 0.5的情況,所以服從正態分布。

直接用算法做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))
# .kstest方法:KS檢驗,參數分別是:待檢驗的數據,檢驗方法(這裡設置成norm正態分布),均值與標準差
# 結果返回兩個值:statistic → D值,pvalue → P值
# p值大於0.05,為正態分布

此時,pvalue > 0.05,不拒絕原假設。因此上面的數據服從正態分布。且一般情況下, stats.kstest(df[『value』], 『norm』, (u, std))一條語句就得到p值的結果。

相關焦點

  • 正態分布的常用數據 - CSDN
    #尋找真知派#如上一篇文章所述,樣本所屬總體服從正態分布是數據分析和數據挖掘等數據處理的重要前提。如果我們採集的樣本並不能確認其總體是否服從正態分布,那麼數據處理的結果就是不可靠的。因此,對樣本數據進行正態分布檢驗十分必要。
  • Python數據分析 | 正態分布與t檢驗
    均值:變量的數值之和除以變量的個數。極差:變量的最大值與最小值之差。方差,標準差反映數據的離散程度,其值越大,數據波動越大。/ 01 / 正態分布在實際情況裡,總體的信息往往難以獲取,所以需要抽樣,通過樣本來估計總體。
  • R統計-正態性分布檢驗[Translation]
    2.4 顯著性檢驗正態性分布我在進行正態性檢驗時,很少用可視化數據方法。因為它不能給一個明確的結果。人眼觀察分布形狀,檢查數據是否呈正態分布通常是不可靠的。可以用顯著性檢驗將樣本分布與正態分布進行比較,以確定數據是否與正態分布有嚴重的偏差。
  • 常用統計檢驗的Python實現
    和我一起,成為更好的自己前言今天給大家整理了一些使用python進行常用統計檢驗的命令與說明,請注意,本文僅介紹如何使用python進行不同的統計檢驗,對於文中涉及的假設檢驗、統計量、正態性檢驗是檢驗數據是否符合正態分布,也是很多統計建模的必要步驟,在Python中實現正態性檢驗可以使用W檢驗(SHAPIRO-WILK TEST)檢驗原假設:樣本服從正態分布Python
  • R與生物專題 | 第六講 R-數據正態分布檢驗
    在「R與生物統計專題」中,我們會從介紹R的基本知識展開到生物統計原理及其在R中的實現。
  • 方差、標準差、正態分布、超幾何分布、卡方檢驗、t檢驗基礎概念
    正態分布正態分布(Normal distribution),也稱「常態分布」,又名高斯分布,正態曲線呈鍾型,兩頭低,中間高,左右對稱因其曲線呈鐘形,因此人們又經常稱之為鐘形曲線。若隨機變量X服從一個數學期望為μ、方差為σ^2的正態分布,記為N(μ,σ^2)。其概率密度函數為正態分布的期望值μ決定了其位置,其標準差標準差σ決定了分布的幅度。當μ = 0,σ = 1時的正態分布是標準正態分布。
  • python 生成正態分布數據,並繪圖和解析
    這篇文章主要介紹了python 生成正態分布數據,並繪圖和解析,幫助大家更好的利用python進行數據分析,感興趣的朋友可以了解下
  • 常用統計檢驗的Python實現和結果解釋
    前言今天給大家整理了一些使用python進行常用統計檢驗的命令與說明,請注意,本文僅介紹如何使用python進行不同的統計檢驗,對於文中涉及的假設檢驗、統計量、p值、正態性檢驗是檢驗數據是否符合正態分布,也是很多統計建模的必要步驟,在Python中實現正態性檢驗可以使用W檢驗(SHAPIRO-WILK TEST)檢驗原假設:樣本服從正態分布Python命令 stat,
  • SPSS正態分布以及方差齊性檢驗以及Wilcox檢驗
    第二篇關於三種t檢驗的適用情況說明(單一樣本t檢驗,配對樣本t檢驗,獨立樣本t檢驗),是我幾天前看到採集而來,一併放到這裡做個簡單的匯總。t檢驗要求數據正態分布以及方差齊性。一般來說一些常見的表型數據符合正態分布以及方差齊性的要求。但對於其他類型的數據,就不一定滿足這兩點了。所以在進行t檢驗之前,首先要進行數據的正態檢驗以及方差齊性檢驗。
  • Matlab中的數據分析之概率分布與檢驗實例講解
    直方圖所展示的身高的分布形狀可看作正態分布,當然也可以用這組數據對分布作假設檢驗。Matlab 統計工具箱(Toolbox\Stats)中的概率分布Matlab 統計工具箱中有 27 種概率分布,這裡只對常見的 4 種分布列出命令的字符:norm 正態分布; chi2 χ2分布;t   t 分布
  • 關於正態分布和貝塔分布的案例介紹
    打開APP 關於正態分布和貝塔分布的案例介紹 賈恩東 發表於 2020-10-12 11:25:57 正態分布 正態分布,是一種非常常見的連續概率分布,其也叫做常態分布(normal distribution),或者根據其前期的研究貢獻者之一高斯的名字來稱呼,高斯分布(Gaussian distribution)。正態分布是自然科學與行為科學中的定量現象的一個方便模型。
  • 審稿人說,你的數據是偏態分布的,統計方法不對?怎麼辦?
    鄭老師的第一反映是,你是不是又不分正態偏態,統統拿過來進行t檢驗了吧?這一點,確實該受到批評。這年頭,秩和檢驗方法又不是什麼難以通過SPSS實現的方法,你就不試試?一般出於兩點情況,第一,有些變量,理論上就是偏態分布的。第二,標準差特別大,在觀察值都是正值的情況下,標準差比均數還要大。比如,下面的例子,病程的標準差比均數還要大,那麼就可以懷疑是偏態分布。
  • 偏度與峰度的正態性分布判斷
  • 正態分布
  • 第三節 正態性檢驗與兩方差的齊性檢驗
    (4)查附表6得P值,作出推斷結論,按n查得W(n,α),α是檢驗前指定的檢驗水準,若W>W(n,α)則在α水準上按受H0,資料來自正態分布總體,或服從正態分布;若W≤W(n,α),則在α水準上拒絕H0,接受H1,資料非正態。
  • 【教育統計答疑】如何理解正態分布、均值分布、χ^2分布、t分布和F分布
    正態分布的重要性還體現在用樣本數據來推斷總體時,當樣本的數量足夠大的時,可以利用樣本的某些特徵數據服從正態分布,進行推斷,獲得準確的結果。正態分布一般記作  x~N(μ, σ^2),它的分布函數表達式為 其中,π是圓周率;e是自然對數的底;x為隨機變量的取值;μ為正態分布的均值(期望),σ^2是正態分布的方差。
  • R語言 | 正態性檢驗qqplot和ppplot
    rank()函數作用是計算出某數在該向量中從小到大排列的序號  Step 2: 根據累積比例數計算出正態分布對應的百分位數值q <- qnorm(t)  直接繪製點圖即為qqplot圖plot(q, a)Step 3: 可以查看一下q
  • Python實現常用的假設檢驗 !
    這篇文章,教大家用Python實現常用的假設檢驗!服從什麼分布,就用什麼區間估計方式,也就就用什麼檢驗!
  • 標準正態分布
    標準正態分布有很多特殊性,其概率密度函數有很好的性質,其大小可以通過查表獲得(見分享圖片),所以在處理一般正態分布的問題的時候往往先轉化為標準正態分布. 預備知識分布函數是概率密度函數的自變量從負無窮到某定值對應因變量取值累加的結果,又叫累計概率函數,常用F(x)表示. 於是
  • Q-Q圖原理詳解及Python實現
    【導讀】在之前的《數據挖掘概念與技術 第2章》的文章中我們介紹了Q-Q圖的概念,並且通過調用現成的python函數, 畫出了Q-Q圖, 驗證了Q-Q圖的兩個主要作用,1. 檢驗一列數據是否符合正態分布 2. 檢驗兩列數據是否符合同一分布。