數據分析之假設檢驗


數據分析之假設檢驗

假設檢驗的Python實例


一、批判性思維

1、什麼是批判性思維

批判性思維(critical thinking)是一種將知識的表象與本質區分開的能力,為了理解知識或觀點(結論)的本質是什麼,我們應試圖為其提供合理的支撐(前提)。

2、如何提高批判性思維

通過對觀點進行邏輯細分,並檢驗細分觀點是否有合理的支撐,從而提高批判性思維,具體可分為以下幾個步驟:

  • 該觀點的前提假設是什麼
  • 由前提到結論,是否滿足邏輯的合理性(logically sound)
  • 由前提到結論,是否滿足邏輯的嚴密性(logically valid)
  • 在此前提下,都可以衍生出何種邏輯推論

3、假設檢驗

推斷統計學一般有兩種方法,一是使用置信區間估算總體的參數,二是對總體參數的假設值進行判斷。前者是區間估計,後者稱之為假設檢驗。假設檢驗的邏輯類似於反證法,先設立兩個相互對立的原假設與備選假設,通過在原假設成立的前提下進行計算,如果p值(即原假設為真時所得到樣本觀測結果出現的概率)小於顯著性水平,則認為原假設事件不可能發生,即備選假設為真。

二、假設檢驗的類型與步驟

2.1假設檢驗的步驟:

  1. 確定問題:
    1. 原假設(H0)與備選假設(H1)
    2. 假設檢驗類型:根據問題背景,樣本數據特點進行判斷
    3. 抽樣分佈類型:根據樣本大小確定
    4. 假設檢驗方向:根據問題背景確定
  2. 尋找證據:在原假設的基礎上,計算得到檢驗統計量和p值
  3. 做出判斷:根據顯著性水平alpha大小以及檢驗方向,做出判斷

2.2假設檢驗的類型:

  • 單樣本檢驗:以汽車引擎排放水平測試為例
  • 相關配對檢驗:以特魯普效應為例
  • 獨立雙樣本檢驗:以鍵盤佈局影響用戶體驗A/B Test為例

2.3抽樣分佈的類型:

  • 大樣本n>=30:正態分佈
  • 小樣本n<30:t分佈或其他(需查看數據分佈)

2.4假設檢驗的方向(根據備選假設而定):

  • 單尾檢驗:左or右
  • 雙尾檢驗

三、相關指標

3.1判斷顯著水平的相關指標(是與否)

  1. p值(P value):當原假設為真時,樣本觀察結果出現的概率值。p值越小,則原假設發生的概率越小
  2. 顯著性水平α:如果原假設為真,而檢驗的結論卻勸你放棄原假設的概率(即第一類錯誤)。

一般而言,把要檢驗的假設稱之為原假設,記為H0;把與H0相對應的假設稱之為備選假設,記為H1。

  • 第一類錯誤:原假設為真,而檢驗的結論是放棄原假設。
  • 第二類錯誤:原假設為假,而檢驗的結論是接受原假設。
  • 一般設α為0.05、0.025及0.01三種情況。(統計學中,通常將發生幾率小於5%的事件稱之為“不可能事件”)

3.2判斷不同處理下效應大小的指標(多與少)先判斷是否達到顯著水平,然後判斷效應量(effect size)的大小,如果效應量過小說明差異不大,缺乏實用價值。度量效應量的指標有兩大類:

1、差異度量

    • 均數比較:Cohen's d,代表以標準差為單位,樣本均值和總體均值之間的差異大小,不受樣本大小影響,反映不同處理下總體均值之間差異的大小。
      Cohen's d=(Mean1-Mean2)/標準差,0.20為小的效應、0.50為中等效應、0.80為高的效應。

2、相關度度量

    • R平方:決定係數,反映因變量的全部變異能通過迴歸關係被自變量解釋的比例。
      R^2=t^2/(t^2+df),這裡的t^2是指t檢驗中t值的平方,df是自由度。如果R平方為0.8,則說明迴歸關係可以解釋因變量80%的變異。

四、Python實例

4.1單樣本檢驗:以汽車引擎排放水平測試為例

案例:“超級引擎”是一家專門生產汽車引擎的公司,根據政府發佈的新排放要求,引擎排放平均值要低於20ppm。(ppm是英文百萬分之一的縮寫,這裡是按照環保要求汽車尾氣中碳氫化合物要低於20ppm)該公司製造出10臺引擎供測試使用,每臺的排放水平為:15.6 16.2 22.5 20.5 16.4 19.4 16.6 17.9 12.7 13.9。如何判斷,該公司生產的引擎是否符合政府規定?4.1.1描述統計分析在研究問題開展調查時,一般首先對數據進行描述統計分析。

<code>#導入包
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

#樣本數據集
dataSer=pd.Series([15.6,16.2,22.5,20.5,16.4 ,
19.4,16.6,17.9,12.7,13.9])
#計算樣本均值、樣本標準差
sample_mean=dataSer.mean()
sample_std=dataSer.std()
'''對某數據集求標準差是除n,求樣本標準差來估計總體標準差是除n-1,
pandas中計算標準差默認除以n-1,即計算的是樣本標準差,與numpy中有差別'''
print('樣本均值為:%.2fppm'%sample_mean)

print('樣本標準差為:%.2fppm'%sample_std)
>>>
樣本均值為:17.17ppm
樣本標準差為:2.98ppm/<code>

4.1.2推論統計分析

1)確定問題

原假設與備選假設

  • 原假設H0:公司引擎排放不滿足標準,即平均值u>=20
  • 備選假設H1:公司引擎排放滿足標準,即平均值u<20

假設檢驗類型

案例中只有一個樣本,因此選擇單樣本檢驗

抽樣分佈類型

案例中樣本大小為10(n<30),屬於小樣本,因此接下來我們判斷小樣本的抽樣分佈是否滿足t分佈。

<code>#通過直方圖查看數據分佈,還可做出擬合曲線 

sns.distplot(dataSer)
plt.title('數據集分佈')/<code>
數據分析之假設檢驗

通過觀察以上數據集分佈圖,數據近似正態分佈,滿足t分佈使用條件,因此抽樣分佈是t分佈,自由度df=(10-1)=9。

Python數據可視化可參考:

Python數據可視化--Matplotlib繪製圖形 - MsSpark的博客 - CSDN博客​blog.csdn.net

數據分析之假設檢驗

Python數據可視化-Seaborn繪製圖形 - MsSpark的博客 - CSDN博客​blog.csdn.net

數據分析之假設檢驗

檢驗方向根據備選假設公司引擎排放滿足標準,即平均值u<20,可知本次假設檢驗是單尾檢驗中的左尾檢驗。2)尋找證據計算檢驗統計量和p值計算p值的步驟:計算標準誤差、計算t值、查表得到概率p值。(注意區別在計算置信區間時的t_ci統計量)

<code>#1. 計算標準誤差
n=10
SE=sample_std/(np.sqrt(n))
#2. 計算t值
pop_mean=20
t=(sample_mean-pop_mean)/SE
print('標準誤差為%.2f'%SE)
print('t=%.3f'%t)
>>>
標準誤差為0.94
t=-3.002/<code>

3. 依據自由度df=9,t=-3.002查表相應的概率p值為:0.0149/2=0.007

通過該網站上工具直接計算概率p值:

P value calculator​www.graphpad.com

<code>'''方法二:用Python統計包scipy計算概率p值(此處的p值默認為雙尾檢驗)
輸入:樣本數據以及總體均值;輸出:t值以及概率p值'''

#單(lsamp)樣本t檢驗(ttest_lsamp)
#相關(related)配對t檢驗(ttest_rel)
#雙獨立(independent)樣本t檢驗(ttest_ind)
from scipy import stats
t,p_twotail=stats.ttest_1samp(dataSer,pop_mean)
p_onetail=p_twotail/2
print('假設檢驗t值為%.3f,相應的概率p值為%.4f'%(t,p_onetail))
>>>
假設檢驗t值為-3.002,相應的概率p值為0.0075/<code>

3)做出判斷

本案例中設定顯著水平α=0.05

  • 左尾判斷條件:t<0,且概率p值
  • 右尾判斷條件:t>0,且概率p值
<code>#做出結論
alpha=0.05
if (t<0 and p_onetail<alpha> print('拒絕原假設,有統計顯著,即汽車引擎排放達到標準')
else:
print('接受原假設,無統計顯著,即汽車引擎排放未達到標準')
>>>
拒絕原假設,有統計顯著,即汽車引擎排放達到標準/<alpha>/<code>

4.1.3置信區間

  1. 根據置信水平及自由度,查表得到相應t值
  2. 計算置信區間上下限
    置信區間上限:a=樣本均值-t*標準誤差
    置信區間下限:a=樣本均值+t*標準誤差
<code>#計算置信區間:
#按照df=9,置信水平為95%查表得t值(此處應為雙尾)
t_ci=2.2622
SE=stats.sem(dataSer) #scipy計算標準誤差
#置信區間上下限
a=sample_mean-t_ci*SE
b=sample_mean+t_ci*SE
print('單個平均值的置信區間,95置信水平CI=[%.3f,%.3f]'%(a,b))
>>>
單個平均值的置信區間,95置信水平CI=[15.037,19.303]/<code>

4.1.4效應量

查看均數比較值Cohen's d以及R方

<code>#均值比較值:Cohen's d
d=(sample_mean-pop_mean)/sample_std
#R平方
df=n-1
R2=(t*t)/(t*t+df)
print('d=%.2F'%d)
print('R2=%.2F'%R2)
>>>
d=-0.95
R2=0.50/<code>

4.1.5數據分析報告

  1. 描述統計分析

樣本均值為17.17ppm,樣本標準差為2.98ppm。

  1. 推論統計分析

1)假設檢驗

獨立樣本t(9)=-3.00,p=0.0075(α=0.05),單尾檢驗(左尾)。

公司引擎排放滿足標準。

2)置信區間

平均值的置信區間,95% CI=[15.037,19.303],該區間值均低於20ppm。

3)效應量

Cohen's d=0.95,R2=0.50


4.2相關配對檢驗:以特魯普效應為例(Stroop Effect)

案例:簡單來說,特魯普效應(Stroop Effect)是指當出現與原有認知不同的情況時,人們的反應時間會變長。

本案例通過Stroop實驗測試人們的反應時間,在實驗中,每名參與者得到兩組有顏色的文字,第一組數據中文字內容和字體顏色相一致,第二組中內容和顏色不一致。每名參與者對根據文字內容說出字體顏色,並分別統計完成每組的時間。

數據分析之假設檢驗

第一組

數據分析之假設檢驗

第二組

本次實驗共記錄24組數據,實驗鏈接為:

Text and Color Only​faculty.washington.edu

4.2.1描述統計分析

<code>#導入包
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
import warnings
warnings.filterwarnings('ignore')

#樣本數據集
data=pd.read_csv('/Users/spark/Python數據/StroopTest.csv')
data.head(3) #查看前幾項
>>>
Congruent\tIncongruent
0\t12.079\t19.278
1\t16.791\t18.741
2\t9.564\t21.214

data.describe() #查看描述性統計信息/<code>

計算均值和標準差

<code>#第一組數據的描述性統計信息
con1_mean=data['Congruent'].mean()
con1_std=data['Congruent'].std()
#第二組數據的描述性統計信息
con2_mean=data['Incongruent'].mean()
con2_std=data['Incongruent'].std()
#作圖
data.plot(kind='bar',figsize=(7,4))

plt.xlabel('測試者序號')
plt.ylabel('平均反應時間')
plt.show()/<code>
數據分析之假設檢驗

描述統計分析結果:

  • 第一組數據:文字內容與字體顏色一致情況下,實驗者的平均反應時間為:13.89秒,標準差為3.47秒;
  • 第二組數據:文字內容與字體顏色不一致情況下,實驗者的平均反應時間為:22.62秒,標準差為5.09秒。

從數據分佈圖來看,內容與字體顏色“不一致”情況下反應時間均大於“一致”情況。

4.2.2推論統計分析

1)確定問題

先確定研究問題中的自變量與因變量: 本案例中有兩個變量,文字內容與字體顏色的一致與否以及測試者的反應時間,其中自變量為文字內容與字體顏色是否一致,因變量為測試者的反應時間。

因此本文的問題是:是否存在特魯普效應,當內容與顏色不一致時,人們反應時間延遲。

原假設與備選假設

假設第一組“一致”的反應時間均值為m1,第二組“不一致”的反應時間為m2:

  • 原假設H0:不存在特魯普效應,人們的反應時間不會因文字內容與字體顏色不同而增加(m1-m2>=0);
  • 備選假設H1:存在特魯普效應,即在顏色與內容不一致時,人們反應時間會增加(m1-m2<0)。

假設檢驗類型

案例中使用的兩組數據是相關樣本,因此選擇相關配對檢驗。 (相關配對檢驗只關注每對相關數據的差值,從而避免得到的結論受到不同參與人員正常反應時間獨立性的影響)

<code>#獲取差值集合
data['diff']=data['Congruent']-data['Incongruent']
data.head(3)
>>>
\tCongruent Incongruent diff
0\t12.079\t19.278\t-7.199
1\t16.791\t18.741\t-1.950
2\t9.564\t21.214\t-11.650/<code>

抽樣分佈類型

案例中樣本大小為24(n<30),屬於小樣本,因此接下來我們判斷小樣本的抽樣分佈是否滿足t分佈。

<code>#繪圖查看差值數據集的分佈特徵
sns.distplot(data['diff'],label='diff')
plt.xlabel('反應時間差值')
plt.title('差值數據集分佈')/<code>
數據分析之假設檢驗

通過觀察差值數據集分佈,近似正態分佈滿足t分佈使用條件,因此可以使用相關樣本t檢驗進行分析,t檢驗的自由度df=n-1=23。檢驗方向根據備選假設:特魯普效應存在,即m1-m2<0,可知本次假設檢驗是單尾檢驗中的左尾檢驗。2)尋找證據計算檢驗統計量和p值查看在原假設成立時,相應樣本均值的概率p值大小。

<code>#求相應的t值以及概率p值
from scipy import stats
t,p_twotail=stats.ttest_rel(data['Congruent'],data['Incongruent'])
p_onetail=p_twotail/2
print('假設檢驗的t值=%.3f'%t,'左尾檢驗p值=',p_onetail)
>>>
假設檢驗的t值=-8.089 左尾檢驗p值= 1.7743595748624577e-08/<code>

3)做出判斷

判斷是否達到顯著水平

本案例中設定顯著水平α=0.05

<code>#做出結論
alpha=0.05
if (t<0 and p_onetail<alpha> print('拒絕原假設,有統計顯著,即存在特魯普效應,當文字內容與字體顏色不同時人們的反應時間會增加')

else:
print('接受原假設,無統計顯著,即不存在特魯普效應')
>>>
拒絕原假設,有統計顯著,即存在特魯普效應,當文字內容與字體顏色不同時人們的反應時間會增加/<alpha>/<code>

4.2.3置信區間

  1. 根據置信水平及自由度,查表得到相應t值
  2. 計算置信區間上下限
    置信區間上限:a=樣本均值-t*標準誤差
    置信區間下限:a=樣本均值+t*標準誤差
<code>#計算置信區間:
#按照df=23,置信水平為95%查表得t值(此處應為雙尾)
t_ci=2.069
sample_mean=data['diff'].mean()
SE=stats.sem(data['diff']) #scipy計算標準誤差
#置信區間上下限
a=sample_mean-t_ci*SE
b=sample_mean+t_ci*SE
print('單個平均值的置信區間,95置信水平CI=[%.3f,%.3f]'%(a,b))
>>>
單個平均值的置信區間,95置信水平CI=[-10.579,-6.269]/<code>

4.2.4效應量

查看均數比較值Cohen's d

<code>#均值比較值:Cohen's d
pop_mean=0
sample_std=data['diff'].std()
d=(sample_mean-pop_mean)/sample_std
print('效應量d=%.2F'%d)
>>>
效應量d=-1.65/<code>

4.2.5數據分析報告

1、描述統計分析

第一組樣本數據:當內容與顏色一致時,平均反應時間為:13.89秒,標準差為3.47秒;第二組樣本數據:當內容與顏色不一致時,平均反應時間為:22.62秒,標準差為5.09秒。對比發現,內容與字體顏色“不一致”情況下反應時間均大於“一致”情況。

2、推論統計分析

1)假設檢驗獨立樣本t(23)=-8.089,p=1.7743595748624577e-08(α=0.05),單尾檢驗(左尾)統計上存在顯著水平,拒絕原假設,即存在特魯普效應。2)置信區間平均值的置信區間,95% CI=[-10.579,-6.269],說明當內容與顏色不一致時,反應時間平均要慢6至10秒的時間。3)效應量Cohen's d=-1.65

4.3雙獨立樣本檢驗:以鍵盤佈局對用戶體驗影響A/B測試為例(A/B Test)

案例:有一款輸入法app有兩種鍵盤佈局版本,作為產品經理,想在正式發佈產品前瞭解那種產品佈局的用戶體驗更好?首先,應找到合適的指標來衡量用戶體驗,本案例中用用戶拼錯字的數量來作為判斷依據。接下來採集數據,我們會將用戶隨機分配到不同版本中,通過監控並蒐集其交互行為,作為進一步分析的數據。本案例中,我們隨機抽取實驗者,將實驗者分成2組,每組25人,A組使用鍵盤佈局A,B組使用鍵盤佈局B。讓實驗者在30秒內打出制定的20個單詞文字消息,並記錄打錯字的數量。最後,對採集的兩組數據進行分析,驗證不同產品佈局對用戶體驗影響是否不同。4.3.1描述統計分析

<code>#導入包
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
import warnings
warnings.filterwarnings('ignore')

#樣本數據集
fileNameStr='/Users/spark/Python數據/鍵盤AB測試.xlsx'
xls=pd.ExcelFile(fileNameStr)
data=xls.parse('Sheet1')
data.head(3) #查看前幾項

>>>
A\tB
0\t6\t6
1\t6\t11
2\t2\t8

data.describe() #查看描述性統計信息
#A組數據的描述性統計信息
a_mean=data['A'].mean()
a_std=data['A'].std()
#B組數據的描述性統計信息
b_mean=data['B'].mean()
b_std=data['B'].std()

print('A版本樣本大小%i'%data['A'].size,'打錯字的均值為:%.2f,標準差為:%.2f'%(a_mean,a_std))
print('B版本樣本大小%i'%data['B'].size,'打錯字的均值為:%.2f,標準差為:%.2f'%(b_mean,b_std))
>>>
A版本樣本大小25 打錯字的均值為:5.08,標準差為:2.06
B版本樣本大小25 打錯字的均值為:7.80,標準差為:2.65

#作圖
sns.distplot(data['A'],label='A')
sns.distplot(data['B'],label='B')
plt.legend(loc='best')
plt.xlabel('打錯字數量')
plt.title('A/B兩種版本打錯字數量分佈')/<code>
數據分析之假設檢驗

從數據分佈圖來看,A/B兩組樣本數據分佈類似於正態分佈,符合t分佈條件。4.3.2推論統計分析1)確定問題原假設與備選假設要研究的問題是,不同版本的鍵盤佈局對用戶體驗的影響是否有差異。

  • 原假設H0:A版本與B版本之間沒有差別,即Ma=Mb;
  • 備選假設H1:A版本與B版本對用戶體驗的影響是有差異的,即Ma≠Mb。

假設檢驗類型案例中使用的兩組數據是隨機分配的,均為獨立樣本,因此選擇雙獨立檢驗。抽樣分佈類型案例中兩組數據樣本大小均為25(n<30),屬於小樣本,通過描述性統計分析中兩組樣本數據的分佈可以看出均滿足t分佈條件,因此抽樣分佈類型是t分佈。檢驗方向根據備選假設:A/B兩個版本對用戶體驗的影響是有差異的,即Ma≠Mb,因此屬於雙尾檢驗。

2)尋找證據計算檢驗統計量和p值

查看在原假設成立時,相應樣本均值的概率p值大小。

<code>#求相應的t值以及概率p值
'''因為Scipy中雙獨立樣本t檢驗不能返回自由度,不便於後續計算置信區間,因此我們選擇
statsmodels包進行求解'''
import statsmodels.stats.weightstats as st
t,p_twotail,df=st.ttest_ind(data['A'],data['B'],usevar='unequal') #usevar='unequal'表示兩個總體方差不同
print('假設檢驗的t值=%.3f'%t,'自由度為%.3f'%df,'雙尾檢驗p值=',p_twotail)
>>>
假設檢驗的t值=-4.056 自由度為45.278 雙尾檢驗p值= 0.00019457455307216092/<code>

3)做出判斷

判斷是否達到顯著水平

本案例中設定顯著水平α=0.05

  • 左尾判斷條件:t<0,且p_onetail
  • 右尾判斷條件:t>0,且p_onetail
  • 雙尾判斷條件:p_twotail
<code>#做出結論
alpha=0.05
if p_twotail<alpha> print('拒絕原假設,有統計顯著,即A/B兩個版本對用戶體驗影響存在差異')

else:
print('接受原假設,無統計顯著,即兩個版本對用戶體驗影響不存在差異')
>>>
拒絕原假設,有統計顯著,即A/B兩個版本對用戶體驗影響存在差異/<alpha>/<code>

4.2.3置信區間

  1. 根據置信水平及自由度,查表得到相應t值
  2. 計算置信區間上下限
    置信區間上限:a=樣本均值-t*標準誤差
    置信區間下限:a=樣本均值+t*標準誤差
<code>#計算置信區間:
#按照df=45,置信水平為95%查表得t值(此處應為雙尾)
t_ci=2.0141
sample_mean=a_mean-b_mean
SE=np.sqrt(np.square(a_std)/25+np.square(b_std)/25)
#置信區間上下限
a=sample_mean-t_ci*SE
b=sample_mean+t_ci*SE
print('雙獨立樣本的置信區間,95置信水平CI=[%.3f,%.3f]'%(a,b))
>>>
雙獨立樣本的置信區間,95置信水平CI=[-4.071,-1.369]/<code>

4.2.4效應量查看均數比較值Cohen's d及R平方

<code>#均值比較值:Cohen's d
sample_mean=a_mean-b_mean
sample_std=np.sqrt(24*np.square(a_std)+24*np.square(b_std))
d=(sample_mean)/sample_std
print('效應量d=%.3F'%d)

R2=(t*t)/(t*t+df)
print('R2=%.3F'%R2)
>>>
效應量d=-0.166
R2=0.266/<code>

4.2.5數據分析報告

1、描述統計分析

A版本樣本大小為25,打錯字數量平均為5.08個,標準差為2.06個;B版本樣本大小為25,打錯字數量平均為7.80個,標準差為2.65個。2、推論統計分析

1)假設檢驗雙獨立樣本t(45.278)=-4.056,p=0.00019457(α=0.05),雙尾檢驗統計上存在顯著水平,拒絕原假設,即A/B兩個版本對用戶體驗影響存在差異2)置信區間平均值的置信區間,95% CI=[-4.071,-1.369],即A版本中平均打錯字數量比B版本要少1至4個。3)效應量Cohen's d=-0.166R2=0.266


分享到:


相關文章: