熱線電話:13121318867

登錄
首頁數據分析教程數據分析師教程《統計學極簡入門》第8節 再看t檢驗、F檢驗、卡方檢驗
數據分析師教程《統計學極簡入門》第8節 再看t檢驗、F檢驗、卡方檢驗
2024-10-09
收藏

8. 再看t檢驗、F檢驗、檢驗

前面在假設檢驗的部分經學過t檢驗、F檢驗、檢驗,之所以再看,是想通過縱向對比這幾個檢驗統計量以加深理解:

t檢驗

針對不同的場景,主要分為單樣本T檢驗、獨立樣本T檢驗、配對樣本T檢驗:

單樣本的t檢驗

主要用于分析 一組定量數據指定值的差異,例如檢驗食鹽的實際稱重是否不夠標重的份量。

單樣本T檢驗需要滿足正態分布的假設,若不滿足可采用單樣本Wilcoxon檢驗。

例5.2 檢驗汽車實際排放是否低于其聲稱的排放標準

汽車廠商聲稱其發動機排放標準的一個指標平均低于20個單位。在抽查了10臺發動機之后,得到下面的排放數據: 17.0 21.7 17.9 22.9 20.7 22.4 17.3 21.8 24.2 25.4 該樣本均值為21.13.究竟能否由此認為該指標均值超過20?

分析過程: 由于廠家聲稱指標平均低于20個單位,因此原假設為總體均值等于20個單位(被懷疑對象總是放在零假設)。而且由于樣本均值大于20(這是懷疑的根據),把備擇假設設定為總體均值大于20個單位

于是我們有了原假設和備擇假設

:

讀取數據如下

data = [17.021.717.922.920.722.417.321.824.225.4]

分步驟計算過程如下:

步驟一:計算樣本均值 =(17+21.7+...+25.4)/10=21.13

用Python:

x_bar = np.array(data).mean()
x_bar
# 21.13

步驟二:計算樣本標準差

用Python計算:

s = np.sqrt(((data-x_bar)**2).sum()/len(data))
s
# 2.7481084403640255

步驟三:計算統計量

,其中 為整體均值20,自由度n-1為9

t = (x_bar - 20)/(s/np.sqrt(len(data)-1))
t
# 1.2335757753252794

步驟四:查表或用軟件查詢p值與

p_value = scipy.stats.t.sf(t,len(data)-1 )
p_value 
# 0.1243024777589817

結論: 選擇顯著性水平 0.01 的話,P=0.1243 > 0.05, 故無法拒絕原假設。具體來說就是該結果無法支持指標均值超過20的備則假設。說明發動機排放指標是不合格的。

對于以上過程,我們也可以用scipy.stats.ttest_1samp函數,一步到位進行t檢驗,直接返回的就是t統計量和p值:

import scipy.stats
t, pval = scipy.stats.ttest_1samp(a = data, popmean=20,alternative = 'greater')
# 說明  
# 單一樣本的t檢驗,檢驗單一樣本是否與給定的均值popmean差異顯著的函數,第一個參數為給定的樣本,第二個函數為給定的均值popmean,可以以列表的形式傳輸多個單一樣本和均值。
# a  為給定的樣本數據
# popmean 為給定的總體均值
# alternative 定義備擇假設。以下選項可用(默認為“two-sided”):
# ‘two-sided’:樣本均值與給定的總體均值(popmean)不同
# ‘less’:樣本均值小于給定總體均值(popmean)
# ‘greater’:樣本均值大于給定總體均值(popmean)

print(t, pval)

# '''
# P= 0.004793 < 5%, 拒絕原假設,接受備擇假設樣本
# '''

結論: 選擇顯著性水平 0.01 的話,P=0.1243 > 0.05, 故無法拒絕原假設。具體來說就是該結果無法支持指標均值超過20的備則假設。

獨立樣本的t檢驗

主要用于分析定量數據和**定類數據(2組)**的差異。原理是推論差異發生的概率,從而比較兩個平均數的差異是否顯著。通俗的說就是用樣本均數和已知總體均數進行比較,來觀察此組樣本與總體的差異性。

例如有一個班的學生身高數據,如果學生的身高服從正態分布,想要研究身高和性別的關系,這個時候就相當于是兩個獨立樣本。

獨立樣本的T檢驗也需要滿足正態分布的假設,如果不滿足可采用 Wilcoxon檢驗(也稱MannWhitney檢驗); 如果滿足但方差不等可采用 Welch T檢驗

計算公式如下:

、 代表兩組數據的均值,

、 代表樣本數,

、 代表兩組數組的方差。

從計算公式能看出來,t越小則兩組數據差異性越小。具體多小就根據置信度和自由度查表對比理論統計量的大小得出兩組數據差異性是否顯著。

例5.6(數據:drug.txt) 檢驗某藥物在實驗組的指標是否低于對照組

為檢測某種藥物對情緒的影響,對實驗組的100名服藥者和對照組的150名非服藥者進行心理測試,得到相應的某指標。需要檢驗實驗組指標的總體均值是否大于對照組的指標的總體均值。這里假定兩個總體獨立地服從正態分布。相應的假設檢驗問題為:

分析過程:由于目標是檢驗實驗組指標的總體均值是否大于對照組的指標的總體均值,因此選擇上側檢驗

于是我們有了原假設和備擇假設

:

data = pd.read_table("./t-data/drug.txt",sep = ' ')
data.sample(5)
ah id
4.4 2
6.8 2
9.6 2
4.8 2
13.2 1
a = data[data['id']==1]['ah']
b = data[data['id']==2]['ah']
'''
H0: 實驗組的均值等于對照組
H1: 實驗組的均值大于對照組

'''

t, pval = scipy.stats.ttest_ind(a,b,alternative = 'greater')
# 獨立樣本的T檢驗,檢驗兩個樣本的均值差異,該檢驗方法假定了樣本的通過了F檢驗,即兩個獨立樣本的方差相同


# 另一個方法是: 
# stats.ttest_ind_from_stats(mean1, std1, nobs1, mean2, std2, nobs2, equal_var=True)
# 檢驗兩個樣本的均值差異(同上),輸出的參數兩個樣本的統計量,包括均值,標準差,和樣本大小:直接輸入樣本的描述統計量(均值,標準差,樣本數)即可



print(t,pval)
# 0.9109168350628888 0.18161186154576608

結論: 選擇顯著性水平 0.05 的話,p = 0.1816 > 0.05,無法拒絕H0,具體來說就是該結果無法支持實驗組均值大于對照組的備則假設。

配對樣本t檢驗

主要用于分析配對定量數據的差異。

常見的使用場景有:

①同一對象處理前后的對比(同一組人員采用同一種減肥方法前后的效果對比);

②同一對象采用兩種方法檢驗的結果的對比(同一組人員分別服用兩種減肥藥后的效果對比);

③配對的兩個對象分別接受兩種處理后的結果對比(兩組人員,按照體重進行配對,服用不同的減肥藥,對比服藥后的兩組人員的體重)。

例如,假設一個班上男女生的成績不存在差異,顯著性水平為0.05,可理解為只有5%的概率會出現“男女生成績差異顯著”的情況,若計算出的檢驗p值若小于0.05,則可以拒絕原假設。反之不能拒絕原假設。

此外,t檢驗注意事項

①無論哪種t檢驗、都要數據服從正態或者近似正態分布。正態性的檢驗方法有:正態圖、正態性檢驗、P-P圖/Q-Q圖等。

②兩個獨立樣本的t檢驗,通常需要先進行F檢驗(方差齊次檢驗),檢驗兩個獨立樣本的方差是否相同,若兩總體方差相等,則直接用t檢驗,若不等,可采用t’檢驗或變量變換或秩和檢驗等方法。

例5.7(數據: diet.txt) 檢驗減肥前后的重量是否有顯著性差異(是否有減肥效果)

這里有兩列50對減肥數據。其中一列數據(變量名before)是減肥前的重量,另一列(變量名after)是減肥后的重量(單位: 公斤),人們希望比較50個人在減肥前和減肥后的重量。

分析過程:這里不能用前面的獨立樣本均值差的檢驗,這是因為兩個樣本并不獨立。每一個人減肥后的重量都和自己減肥前的重量有關,但不同人之間卻是獨立的,所以應該用配對樣本檢驗。同時,由于研究的是減肥前后的重量變化,期望減肥前的重量大于減肥后的重量,所以備擇假設是期望減肥前的重量大于減肥后的重量

于是我們有了原假設和備擇假設:

:

步驟一、計算兩組樣本數據差值d,即58-50,76-71,69-65,68-76,81-75

d = data['before'] - data['after']

步驟二、計算差值d的平均值 ,即(-1+0+1+0)/4=0

d_bar = ( d).sum()/len(data)

步驟三、計算差值d的標準差 ,計算公式為

s_d = np.sqrt(((d -d_bar)**2).sum()/(len(data)-1))
s_d

步驟四、計算統計量t,計算公式為

t = (d_bar)/(s_d/np.sqrt(len(data))) # 這里mu是0
t
#

計算p值

p_value = scipy.stats.t.sf(t, len(data)-1)
p_value 
# 0.0007694243254842176

其中 為理論總體差值均值0,n為樣本數。

結論 選擇顯著性水平 0.05 的話,p = 0.0007 < 0.05,故應該拒絕原假設。具體來說就是該結果傾向支持減肥前后的重量之差大于零(即減肥前重量大于減肥后,也就是有減肥效果)的備則假設。

同樣的,我們用現成的函數 stats.ttest_rel,一步到位進行t檢驗,直接返回的就是t統計量和p值:

data = pd.read_table("./t-data/diet.txt",sep = ' ')
data.sample(5)
before after
58 50
76 71
69 65
68 76
81 75
a = data['before']
b = data['after']
stats.ttest_rel(a, b,alternative = 'greater')
# #配對T檢驗,檢測兩個樣本的均值差異,輸入的參數是樣本的向量
# Ttest_relResult(statistic=3.3550474801424173, pvalue=0.000769424325484219)

結論 選擇顯著性水平 0.05 的話,p = 0.0007 < 0.05,故應該拒絕原假設。具體來說就是該結果傾向支持減肥前后的重量之差大于零(即減肥前重量大于減肥后,也就是有減肥效果)的備則假設。

F檢驗

F檢驗(F-test),最常用的別名叫做聯合假設檢驗(英語:joint hypotheses test),此外也稱方差比率檢驗、方差齊性檢驗。

用于: 判斷兩組數據方差是否存在顯著差異。

步驟一:分別計算兩組樣本數據的均值

步驟二:分別計算兩組樣本數據的標準方差的平方

步驟三:計算兩組樣本數據標準方差的平方比

,把平方大的作為分子,小的作為分母。

得到F值后根據兩組數據的自由度和置信度查表對比,同樣的,F值也是越小越說明差異性不顯著。

stats模塊中雖然沒有f檢驗的函數,但是卻有著f分布的生成函數,可以利用其進行f檢驗:

import numpy as np
from scipy.stats import f_oneway

# 創建兩個樣本
sample1 = np.array([1, 2, 3, 4, 5])
sample2 = np.array([2, 4, 6, 8, 10])

# 使用 f_oneway 函數進行 F 檢驗
f_statistic, p_value = f_oneway(sample1, sample2)

# 打印檢驗結果
print("F statistic:", f_statistic)
print("p-value:", p_value)

#在上述示例中,我們創建了兩個樣本 sample1 和 sample2,每個樣本包含五個觀測值。然后,我們使用 f_oneway 函數對這兩個樣本進行 F 檢驗。
#f_oneway 函數返回兩個值,第一個是 F 統計量,第二個是對應的 p 值。我們可以根據 p 值來判斷樣本方差是否有顯著差異。如果 p 值小于設定的顯著性水平(通常為 0.05),則可以拒絕原假設,認為樣本方差存在顯著差異。
#在上述示例中,我們可以得到 F 統計量為 4.0,p 值為 0.078。由于 p 值大于 0.05,我們不能拒絕原假設,即無法認為這兩個樣本的方差存在顯著差異。
#需要注意的是,在使用 f_oneway 函數進行 F 檢驗時,輸入的樣本應該是一維數組或列表形式。如果有多個樣本,可以將它們作為函數的參數傳入。

也可以引入sklearn進行f檢驗

# 例子1
from sklearn.datasets import make_classification
from sklearn.feature_selection import f_classif 

# 生成樣本數據集
X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, n_redundant=5, random_state=42)

# F檢驗
F, pval = f_classif(X, y)  

# 輸出結果
print(F) 
print(pval)

特征排序(如果不做機器學習可以忽略這一步)
indices = np.argsort(F)[-10:] 
print(indices)
#這里我們生成了一個包含10個特征的樣本分類數據集,其中5個特征包含區分兩類信息,5個特征冗余。
#使用f_classif函數可以計算每個特征的F-score和p值,F-score越高表示該特征越重要。
#最后通過argsort排序,輸出最重要的特征索引。
#F檢驗通過計算每個特征對目標類別的區分能力,來對特征重要性進行評估和排序,是一種常用的過濾式特征選擇方法。

# 例子2
import numpy as np
from sklearn.feature_selection import f_regression

# 創建特征矩陣 X 和目標向量 y
X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
y = np.array([1, 2, 3])

# 使用 f_regression 函數進行 F 檢驗
f_values, p_values = f_regression(X, y)

# 打印 F 統計量和 p 值
print("F values:", f_values)
print("p-values:", p_values)

例5.10(兩總體方差之比的假設檢驗) 檢驗修完Python課程的學生是否比修完數據庫課程的學生考CDA的成績方差更大

某高校數據科學專業的學生,修完一門數據庫課程的41名學生考CDA的方差,修完Python課程的31名學生考CDA的方差,這些數據是否表明,修完數據庫的學生要比修完Python的學生CDA成績的方差更大?

分析過程:由于目標是希望修完Python的學生CDA成績的方差更大,因此選擇上側檢驗。兩總體方差之比用F檢驗,將方差較大的數據庫課程的考試成績視為總體1

于是我們有了原假設和備擇假設

:


import numpy as np
from scipy import stats

def f_test_by_s_square(n1, n2, s1_square,s2_square, side ='two-sided'):
    """
    參數
    n1 :樣本1的數量
    n2 :樣本2的數量
    s1_square:樣本1的方差
    s2_square:樣本2的方差
    # 
    # F_value :F統計量的值
    # p_value :對應的p值
    "
""
    F_value = s1_square/s2_square
    F = stats.f(dfn = n1-1, dfd = n2-1)
    if side=='two-sided':
        print("two-sided")
        p_value = 2*min(F.cdf(F_value), 1-F.cdf(F_value))
        return F_value,p_value
    elif  side=='greater':
        print("greater")
        p_value = 1-F.cdf(F_value)
        return F_value,p_value
f_statistic , p_value= f_test_by_s_square(n1=41, n2=31,s1_square=120,s2_square=80,side='greater')# 打印檢驗結果
# 選擇上側檢驗所以side='greater'
print("F statistic:", f_statistic)
print("p-value:", p_value)

結論 選擇顯著性水平 0.05 的話,p = 0.1256 > 0.05,故無法原假設。結果無法支持修完數據庫的學生要比修完Python的學生CDA成績的方差更大的備則假設。

檢驗

卡方檢驗(chi-square test),也就是χ2檢驗,是以 分布為基礎的一種用途廣泛的分析定性數據差異性的方法,通過頻數進行檢驗。

之前假設檢驗一節中,我們知道卡方檢驗可以做指定方差和樣本方差是否有差異

例5.5 檢驗某考試中心升級題庫后考生分數的方差是否有顯著變化

某數據分析師認證考試機構CDA考試中心,歷史上的持證人考試分數的方差,現在升級了題庫,該考試中心希望新型考題的方差保持在原有水平上,為了研究該問題,收集到了30份新考題的考分組成的樣本,樣本方差,在 的顯著性水平下進行假設檢驗。

分析過程:由于目標是希望考試分數的方差保持原有水平,因此選擇雙側檢驗

于是我們有了原假設和備擇假設

:

import numpy as np
from scipy import stats

def chi2test(sample_var, sample_num,sigma_square,side, alpha=0.05):
    '''
    參數:
    sample_var--樣本方差
    sample_num--樣本容量
    sigma_square--H0方差
    返回值:
    pval
    '
''
    chi_square =((sample_num-1)*sample_var)/(sigma_square)
    p_value = None
    if side == 'two-sided':
        p = stats.chi2(df=sample_num-1).cdf(chi_square)
        p_value = 2*np.min([p, 1-p])
    elif side == 'less':
        p_value = stats.chi2(df=sample_num-1).cdf(chi_square)
    elif side == 'greater':
        p_value = stats.chi2(df=sample_num-1).sf(chi_square)
    return chi_square,p_value

p_value = chi2test(sample_var = 162, sample_num = 30, sigma_square = 100,side='two-sided')

print("p值:", p_value)
# p值: 0.07213100536907469

結論: 選擇顯著性水平 0.05 的話,P=0.0721 > 0.05, 故無法拒絕原假設。具體來說就是不支持方差發生了變化的備則假設。換句話說新題型的方差依然保持在原有水平上

那么,卡方檢驗還有什么應用呢?

統計樣本的實際觀測值與理論推斷值之間的偏離程度,實際觀測值與理論推斷值之間的偏離程度就決定卡方值的大小,如果卡方值越大,二者偏差程度越大;反之,二者偏差越??;若兩個值完全相等時,卡方值就為0,表明理論值完全符合。

卡方值計算公式:

①卡方優度檢驗 對一列數據進行統計檢驗,分析單個分類變量實際觀測的比例與期望的比例是否一致。

②配對卡方 研究實驗過程中,用不同方法檢測同一批人,看兩個方法的效果是否有顯著差異。

交叉表卡方

研究兩組分類變量的關系:如性別與看不看直播是否有關系。

例7.5(交叉表卡方):性別與對待吸煙的態度之間的相關性 一項研究調查了不同性別的成年人對在公眾場合吸煙的態度,結果如表所示。那么,性別與對待吸煙的態度之間的相關程度

- 贊同 反對
15 10
10 26

python中stats模塊,同樣有卡方檢驗的計算函數

from  scipy.stats import chi2_contingency
import numpy as np
data = np.array([[15,10], [10,26]])
chi2, p, dof, expected  = chi2_contingency(data,correction =False)
print(f'卡方值={chi2}, p值={p}, 自由度={dof}')
# 卡方值=6.3334567901234555, p值=0.011848116168529757, 自由度=1

結論:p = 0.0118<0.05,拒絕原假設,表明兩變量之間的正向關系很顯著。

sklearn中的特征選擇中也可以進行卡方檢驗。

from sklearn.feature_selection import chi2
import numpy as np

# 假設我們有一個包含100個樣本和5個特征的數據集
X = np.random.randint(0, 10, (40, 5))
y = np.random.randint(0, 2, 40)
# 使用chi2函數計算特征變量與目標變量之間的卡方統計量和p值
chi2_stats, p_values = chi2(X, y)

# 打印每個特征的卡方統計量和p值
for i in range(len(chi2_stats)):
    print(f"Feature {i+1}: chi2_stat = {chi2_stats[i]}, p_value = {p_values[i]}")

#在上面的例子中,我們生成了一個包含100個樣本和5個特征的隨機數據集。然后,我們使用chi2函數計算每個特征與目標變量之間的卡方統計量和p值。最后,我們打印出每個特征的卡方統計量和p值。
#根據卡方統計量和p值,我們可以判斷每個特征與目標變量之間的關聯程度。如果卡方統計量較大且p值較小,則說明特征與目標變量之間存在顯著關聯,可以考慮選擇該特征作為重要的特征進行建模。

至此,統計學的描述性統計、推斷統計基本告一段落,剩下的貝葉斯、線性回歸、邏輯回歸請讀者自行查閱資料進行學習,我們下個系列見!

(PS:可以在評價中寫下你想學的系列,包括不限于SQL、Pandas、Julia、機器學習、數學建模、數據治理

致謝

《統計學極簡入門》圖文系列教程的寫作過程中參考了諸多經典書籍,包括:

人大統計學教授吳喜之老師的 《統計學:從數據到結論》;

浙大盛驟教授的 概率論與數理統計》;

辛辛那提大學 David R. Anderson的 《商務經濟與統計》;

北海道大學的馬場真哉的 《用Python動手學統計學》 ;

千葉大學研究院教授栗原伸一的《統計學圖鑒》;

前阿里巴巴產品專家徐小磊的知乎:磊叔-數據化運營;

知乎舊夢的文章T檢驗、F檢驗、卡方檢驗詳細分析及應用場景總結;

csdn文章T檢驗、卡方檢驗、F檢驗;

以及CDA認證考試中心 提供的部分案例數據集

在此一并感謝以上內容的作者!

一死生為虛誕,齊彭殤為妄作。各位加油!

這里分享一個你一定用得到的小程序——CDA數據分析師考試小程序。 它是專為CDA數據分析認證考試報考打造的一款小程序??梢詭湍憧焖賵竺荚?、查成績、查證書、查積分,通過該小程序,考生可以享受更便捷的服務。 掃碼加入CDA小程序,與圈內考生一同學習、交流、進步!

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢