立雙樣本t檢驗(yàn)與z檢驗(yàn)全解析:從原理到Python實(shí)踐與避坑指南)
大家平時(shí)做數(shù)據(jù)分析只要涉及兩組數(shù)據(jù)對比基本繞不開“獨(dú)立雙樣本t檢驗(yàn)”和“z檢驗(yàn)”這兩個(gè)名字。我見過太多人一上來就問“我這個(gè)數(shù)據(jù)應(yīng)該用t檢驗(yàn)還是z檢驗(yàn)” 然后被回答“樣本量大于30用z檢驗(yàn)小于30用t檢驗(yàn)”拿回去就硬套結(jié)果出了不少問題。今天這篇就把這兩個(gè)檢驗(yàn)徹底講透。從數(shù)學(xué)原理到Python代碼從適用條件到結(jié)果解讀再到我實(shí)際分析中踩過的坑一步步帶你把它們搞明白??赐曛竽阒辽倌芨闱宄裁磿r(shí)候該用哪個(gè)、代碼怎么寫、結(jié)果怎么解讀、以及那些教科書上沒寫的注意事項(xiàng)。這篇文章適合剛接觸統(tǒng)計(jì)分析的數(shù)據(jù)分析師、轉(zhuǎn)行做數(shù)據(jù)科學(xué)的朋友也算給那些用了很久scipy.stats.ttest_ind卻沒深究過背后邏輯的同學(xué)補(bǔ)個(gè)底層原理課。1. 獨(dú)立雙樣本t檢驗(yàn) vs z檢驗(yàn)兩者到底差在哪1.1 從一場實(shí)際分析說起前陣子幫某業(yè)務(wù)部門做一個(gè)AB測試分析兩組用戶分別看到了不同版本的落地頁要判斷哪一版的轉(zhuǎn)化率更高。當(dāng)時(shí)有個(gè)同事直接甩給我一句“樣本量都過萬了用z檢驗(yàn)吧。”我問他為什么他說“不是樣本量大于30就用z檢驗(yàn)嗎”這個(gè)說法流傳太廣了但它把問題簡化得有點(diǎn)過頭。真實(shí)情況是選t檢驗(yàn)還是z檢驗(yàn)核心判斷依據(jù)不是樣本量而是總體標(biāo)準(zhǔn)差是否已知。如果總體標(biāo)準(zhǔn)差已知用z檢驗(yàn)如果未知哪怕樣本量是十萬嚴(yán)格來說也應(yīng)該用t檢驗(yàn)。不過現(xiàn)實(shí)操作中我們幾乎永遠(yuǎn)不知道總體標(biāo)準(zhǔn)差——我們只有樣本數(shù)據(jù)。所以更準(zhǔn)確的說法是獨(dú)立雙樣本場景下t檢驗(yàn)才是默認(rèn)選項(xiàng)z檢驗(yàn)反而需要額外理由才能登場。那為什么“n30用z檢驗(yàn)”的說法會流行因?yàn)楫?dāng)樣本量足夠大時(shí)t分布的形態(tài)會趨近于標(biāo)準(zhǔn)正態(tài)分布兩者的數(shù)值結(jié)果幾乎一致。這個(gè)現(xiàn)象源于中心極限定理。于是很多人在實(shí)踐里就簡化處理了但這個(gè)簡化前提是你得知道自己在做什么而不是機(jī)械套用。1.2 兩種檢驗(yàn)的數(shù)學(xué)底層邏輯這里我把公式擺出來大家感受一下它們的血緣關(guān)系。獨(dú)立雙樣本t檢驗(yàn)的統(tǒng)計(jì)量t (x?? - x??) / √(s?2/n? s?2/n?)其中x??和x??是兩個(gè)樣本的均值s?2和s?2是兩個(gè)樣本的方差n?和n?是樣本量。這個(gè)統(tǒng)計(jì)量服從自由度近似為Welch–Satterthwaite方程的自由度下的t分布。獨(dú)立雙樣本z檢驗(yàn)的統(tǒng)計(jì)量z (x?? - x??) / √(σ?2/n? σ?2/n?)形式上兩者一模一樣唯一的區(qū)別是t檢驗(yàn)的分母用的是樣本標(biāo)準(zhǔn)差sz檢驗(yàn)的分母用的是總體標(biāo)準(zhǔn)差σ。這個(gè)差異帶來的連鎖反應(yīng)是t檢驗(yàn)的分布形態(tài)在樣本量小時(shí)更“胖”尾部更厚算出來的p值更保守不容易犯第一類錯(cuò)誤假陽性。而z檢驗(yàn)在樣本量小時(shí)如果錯(cuò)誤地用樣本標(biāo)準(zhǔn)差去替代總體標(biāo)準(zhǔn)差會導(dǎo)致檢驗(yàn)結(jié)果過于樂觀夸大了差異的顯著性。1.3 樣本量到底怎么判斷我的個(gè)人建議是樣本量 30總體標(biāo)準(zhǔn)差未知直接用t檢驗(yàn)沒什么好猶豫的。樣本量 30 ~ 100t檢驗(yàn)和z檢驗(yàn)結(jié)果差不多但t檢驗(yàn)在統(tǒng)計(jì)推斷上更嚴(yán)謹(jǐn)默認(rèn)用t檢驗(yàn)。樣本量 100且兩組方差差異不大這時(shí)候z檢驗(yàn)和t檢驗(yàn)的結(jié)果差異基本可以忽略選哪個(gè)看使用場景。必須用z檢驗(yàn)的場景要么是已知總體標(biāo)準(zhǔn)差比如某些工業(yè)生產(chǎn)過程的質(zhì)量標(biāo)準(zhǔn)差長期穩(wěn)定要么是樣本量極大且需要標(biāo)準(zhǔn)化z分?jǐn)?shù)做進(jìn)一步分析。換句話說如果你在用Python做數(shù)據(jù)分析95%以上的“雙樣本均值比較”場景寫ttest_ind就對了。z檢驗(yàn)更多的是一種理論上的對照選項(xiàng)以及在部分業(yè)務(wù)指標(biāo)監(jiān)控系統(tǒng)里的應(yīng)用。2. 數(shù)據(jù)分析前的檢查清單用錯(cuò)前提比選錯(cuò)檢驗(yàn)更致命2.1 獨(dú)立性的判斷“獨(dú)立樣本”是個(gè)前置條件很多人直接忽略。所謂獨(dú)立是指兩組樣本之間互不影響、互不配對。比如“實(shí)驗(yàn)組和對照組”的轉(zhuǎn)化率數(shù)據(jù)這是獨(dú)立的而“同一批用戶在廣告投放前和投放后的消費(fèi)金額”這是配對樣本應(yīng)該用配對t檢驗(yàn)而不是雙樣本檢驗(yàn)。我見過有人拿同一組用戶的前后測數(shù)據(jù)愣是用ttest_ind去跑結(jié)果把同一個(gè)人的兩個(gè)時(shí)點(diǎn)數(shù)據(jù)當(dāng)作兩個(gè)獨(dú)立群體這會讓標(biāo)準(zhǔn)誤計(jì)算失真檢驗(yàn)結(jié)論自然會出問題。獨(dú)立性的判斷更多靠實(shí)驗(yàn)設(shè)計(jì)來保障而不是靠數(shù)據(jù)本身。2.2 正態(tài)性問題t檢驗(yàn)要求樣本均值近似正態(tài)分布這個(gè)條件其實(shí)比很多人想的要寬松。因?yàn)橹行臉O限定理告訴我們不管原始數(shù)據(jù)長什么樣只要樣本量足夠大樣本均值的抽樣分布都會趨近正態(tài)。但“足夠大”是多少這取決于原始分布的偏態(tài)程度。原始數(shù)據(jù)基本對稱時(shí)n15就可以接受原始數(shù)據(jù)嚴(yán)重右偏時(shí)比如用戶消費(fèi)金額長尾嚴(yán)重n得達(dá)到50甚至更多才靠譜。實(shí)操時(shí)可以用Shapiro-Wilk檢驗(yàn)做正態(tài)性判斷但要注意這個(gè)檢驗(yàn)在大樣本下極度敏感樣本量一大輕微偏離正態(tài)就會給出顯著結(jié)果反而誤導(dǎo)判斷。我實(shí)際分析中的做法是先看直方圖和Q-Q圖再結(jié)合偏度、峰度系數(shù)綜合判斷而不是把Shapiro檢驗(yàn)的p值當(dāng)成唯一的“圣旨”。2.3 方差齊性的影響?yīng)毩㈦p樣本t檢驗(yàn)有兩個(gè)版本Student‘s t-test假設(shè)方差齊性和Welch’s t-test不假設(shè)方差齊性。Python里scipy.stats.ttest_ind默認(rèn)equal_varFalse也就是默認(rèn)用Welch檢驗(yàn)這在統(tǒng)計(jì)界被認(rèn)為是更穩(wěn)妥的做法。原因很簡單在使用Levene檢驗(yàn)或Bartlett檢驗(yàn)做方差齊性判斷時(shí)如果樣本量差異懸殊這些檢驗(yàn)的準(zhǔn)確性也會受影響。與其依賴一個(gè)不穩(wěn)定的前置檢驗(yàn)結(jié)果來給你“指路”不如直接上Welch檢驗(yàn)——它在方差齊和不齊的情況下都有不錯(cuò)的表現(xiàn)。我的使用習(xí)慣是除非兩組樣本方差肉眼可見地接近比值在0.8到1.25之間否則一律用Welch檢驗(yàn)不做方差齊性檢驗(yàn)因?yàn)檫@本身就省掉了一個(gè)可能引入誤差的環(huán)節(jié)。3. Python實(shí)操從零跑通獨(dú)立雙樣本t檢驗(yàn)3.1 造一份可復(fù)現(xiàn)的示例數(shù)據(jù)我先用numpy生成兩組模擬數(shù)據(jù)一組是某課程的老版學(xué)習(xí)者的平均得分另一組是新版學(xué)習(xí)者的平均得分。代碼里我固定了隨機(jī)種子保證大家跑出來的結(jié)果和我一致方便對照。import numpy as np import pandas as pd from scipy import stats np.random.seed(42) # 生成老版本學(xué)習(xí)者的成績數(shù)據(jù)均值75標(biāo)準(zhǔn)差8 old_group np.random.normal(loc75, scale8, size60) # 生成新版本學(xué)習(xí)者的成績數(shù)據(jù)均值80標(biāo)準(zhǔn)差9 new_group np.random.normal(loc80, scale9, size65) df pd.DataFrame({ score: np.concatenate([old_group, new_group]), group: [old] * 60 [new] * 65 }) print(df.groupby(group)[score].describe())跑一下描述性統(tǒng)計(jì)你會看到new組的均值大約在80左右old組在75左右標(biāo)準(zhǔn)差也都接近我設(shè)置的參數(shù)。這里故意讓兩組的樣本量不完全一致60 vs 65因?yàn)楝F(xiàn)實(shí)數(shù)據(jù)很少是嚴(yán)格等組的。3.2 正態(tài)性快速檢查我畫一個(gè)分組直方圖再算一下偏度和峰度做個(gè)快速判斷for g in [old, new]: subset df[df[group] g][score] skewness stats.skew(subset) kurtosis stats.kurtosis(subset) print(f{g}: 樣本量{len(subset)}, 偏度{skewness:.3f}, 峰度{kurtosis:.3f})數(shù)據(jù)是np.random.normal生成的偏度接近0峰度接近0正態(tài)性沒問題。實(shí)際分析中直方圖如果呈現(xiàn)出明顯的偏態(tài)要謹(jǐn)慎對待。3.3 跑獨(dú)立雙樣本t檢驗(yàn)核心代碼其實(shí)就一行t_stat, p_value stats.ttest_ind(old_group, new_group, equal_varFalse) print(ft統(tǒng)計(jì)量 {t_stat:.4f}) print(fp值 {p_value:.6f})這里equal_varFalse走的是Welch檢驗(yàn)不依賴方差齊性假設(shè)是更穩(wěn)健的路線。如果兩組方差確實(shí)非常接近也可以設(shè)置equal_varTrue對比一下結(jié)果差異。運(yùn)行輸出的結(jié)果里p值會遠(yuǎn)小于0.05說明新版學(xué)習(xí)者的成績和老版學(xué)習(xí)者存在顯著差異。這時(shí)可以認(rèn)為新版本教學(xué)方案有效果但不能僅憑p值就斷定“新版更好”或“效果很大”——p值只說明“差異不是偶然”到底“差異有多大”要看效應(yīng)量。3.4 補(bǔ)充效應(yīng)量和置信區(qū)間p值解決“有沒有差異”的問題效應(yīng)量解決“差異有多大”的問題。這里給出Cohen‘s d的計(jì)算方法mean_old, mean_new np.mean(old_group), np.mean(new_group) std_old, std_new np.std(old_group, ddof1), np.std(new_group, ddof1) n_old, n_new len(old_group), len(new_group) # 合并標(biāo)準(zhǔn)差pooled standard deviation pooled_std np.sqrt(((n_old - 1) * std_old**2 (n_new - 1) * std_new**2) / (n_old n_new - 2)) # Cohens d cohen_d (mean_new - mean_old) / pooled_std print(fCohens d {cohen_d:.4f})Cohen‘s d的參考標(biāo)準(zhǔn)大致是0.2小效應(yīng)0.5中等效應(yīng)0.8大效應(yīng)。實(shí)際業(yè)務(wù)里這個(gè)數(shù)值比p值更能幫你判斷“值不值得推廣”和“效果是否值得投入資源”。95%置信區(qū)間可以直接用scipy計(jì)算也可以用statsmodels包實(shí)現(xiàn)。簡單做法是from statsmodels.stats.weightstats import CompareMeans, DescrStatsW d1 DescrStatsW(new_group) d2 DescrStatsW(old_group) cm CompareMeans(d1, d2) ci_low, ci_high cm.tconfint_diff(alpha0.05, usevarunequal) print(f均值差95%置信區(qū)間: ({ci_low:.4f}, {ci_high:.4f}))置信區(qū)間不包含0說明差異在95%置信水平下顯著它還能告訴你差異的大致范圍比如“新版本比老版本平均高出3.5到7.2分”這個(gè)表達(dá)比“p0.003”友好得多。4. Python實(shí)操獨(dú)立雙樣本z檢驗(yàn)的完整方案4.1 什么時(shí)候你確實(shí)需要z檢驗(yàn)z檢驗(yàn)在Python里不像t檢驗(yàn)有那么方便的現(xiàn)成函數(shù)它需要稍微動(dòng)動(dòng)手。但動(dòng)手前得先說清楚場景什么情況下你會真的需要它第一種場景是項(xiàng)目本身對z分?jǐn)?shù)有需求。比如你在做質(zhì)量監(jiān)控某個(gè)指標(biāo)的歷史均值μ和標(biāo)準(zhǔn)差σ都被工程部門長期監(jiān)控過了那就是總體標(biāo)準(zhǔn)差已知的標(biāo)準(zhǔn)情形直接用z檢驗(yàn)。第二種場景是你在做“頻率學(xué)派”的AB測試平臺樣本量幾十萬甚至上百萬兩組標(biāo)準(zhǔn)差差異也很小這時(shí)候t分布和正態(tài)分布幾乎重合為了方便工程實(shí)現(xiàn)就用z檢驗(yàn)。statsmodels里提供了一個(gè)專門的函數(shù)ztest可以處理單樣本和雙樣本的z檢驗(yàn)。4.2 用statsmodels跑z檢驗(yàn)還是用上面那份成績數(shù)據(jù)。雖然這份數(shù)據(jù)的總體標(biāo)準(zhǔn)差理論上是未知的但為了演示z檢驗(yàn)的代碼流程我們假設(shè)已經(jīng)知道兩個(gè)組的總體標(biāo)準(zhǔn)差分別是8和9from statsmodels.stats.weightstats import ztest z_stat, p_value ztest(new_group, old_group, value0, alternativetwo-sided) print(fz統(tǒng)計(jì)量 {z_stat:.4f}) print(fp值 {p_value:.6f})value0表示原假設(shè)是兩組均值之差為0alternativetwo-sided是雙尾檢驗(yàn)。如果單尾檢驗(yàn)可以改成larger或smaller對應(yīng)“新組均值大于老組”或“新組均值小于老組”。跑完你會發(fā)現(xiàn)z統(tǒng)計(jì)量和t統(tǒng)計(jì)量非常接近p值也差不了多少。這正是樣本量較大時(shí)兩種檢驗(yàn)殊途同歸的體現(xiàn)。4.3 手寫z檢驗(yàn)的計(jì)算流程如果不用現(xiàn)成的包手寫也不是什么難事。z檢驗(yàn)的完整流程就是四步計(jì)算兩組均值、計(jì)算標(biāo)準(zhǔn)誤、計(jì)算z統(tǒng)計(jì)量、查正態(tài)分布求p值。from scipy.stats import norm mean_old, mean_new np.mean(old_group), np.mean(new_group) var_old, var_new np.var(old_group, ddof1), np.var(new_group, ddof1) n_old, n_new len(old_group), len(new_group) # 標(biāo)準(zhǔn)誤standard error of the difference se_diff np.sqrt(var_old / n_old var_new / n_new) # z統(tǒng)計(jì)量 z_stat_manual (mean_new - mean_old) / se_diff # 雙尾p值 p_value_manual 2 * (1 - norm.cdf(abs(z_stat_manual))) print(f標(biāo)準(zhǔn)誤 {se_diff:.4f}) print(fz統(tǒng)計(jì)量 {z_stat_manual:.4f}) print(fp值 {p_value_manual:.6f})手寫一遍的好處是你能清晰看到每個(gè)環(huán)節(jié)在做什么而不是把ztest當(dāng)成黑盒。特別是標(biāo)準(zhǔn)誤se_diff的分母里那兩個(gè)n它們反映出樣本量越大的組對結(jié)果貢獻(xiàn)越大。4.4 z檢驗(yàn)的置信區(qū)間z檢驗(yàn)的置信區(qū)間公式比t檢驗(yàn)更簡單直接用正態(tài)分布的分位數(shù)alpha 0.05 z_critical norm.ppf(1 - alpha / 2) # 雙尾95%對應(yīng)1.96 diff_mean mean_new - mean_old ci_low_z diff_mean - z_critical * se_diff ci_high_z diff_mean z_critical * se_diff print(fz檢驗(yàn)95%置信區(qū)間: ({ci_low_z:.4f}, {ci_high_z:.4f}))和t檢驗(yàn)的置信區(qū)間相比你會發(fā)現(xiàn)區(qū)間寬度差別很小。這正是大樣本條件下的常態(tài)兩種方法的結(jié)論趨于一致。5. 兩個(gè)檢驗(yàn)的真實(shí)差異與選型經(jīng)驗(yàn)5.1 數(shù)值上的直觀對比我把同一份數(shù)據(jù)分別用t檢驗(yàn)和z檢驗(yàn)跑了一遍結(jié)果整理成一張表指標(biāo)t檢驗(yàn)Welchz檢驗(yàn)統(tǒng)計(jì)量3.6263.635p值0.000430.0002895%置信區(qū)間(2.40, 8.66)(2.44, 8.62)結(jié)論顯著顯著可以看到在樣本量6065的場景下兩者的結(jié)論完全一致數(shù)值上僅有細(xì)微差異。這種差異在n30時(shí)就稍明顯一些在n10時(shí)就會拉開差距。那么問題來了既然結(jié)果這么接近為什么還要區(qū)分它們我的觀點(diǎn)是區(qū)分不是為了讓結(jié)果差別多大而是為了讓你的推斷過程符合統(tǒng)計(jì)理論的前提。錯(cuò)誤使用工具不一定每次都得出錯(cuò)誤結(jié)論但你在給業(yè)務(wù)方解釋“為什么用這個(gè)檢驗(yàn)”時(shí)邏輯上要能自洽。5.2 業(yè)務(wù)匯報(bào)時(shí)的表達(dá)技巧跟業(yè)務(wù)方匯報(bào)AB測試結(jié)果時(shí)我一般會分三層說第一層是看顯著不顯著p值多大是否小于0.05。第二層是看差異大小兩組均值差多少95%置信區(qū)間是多少。第三層是看置信度如果重新抽樣100次大概95次會看到什么范圍。p值更多地服務(wù)于“通過還是不通過”的決策而置信區(qū)間能告訴你“效果范圍有多穩(wěn)”。我一直建議大家在分析報(bào)告里同時(shí)放上p值、均值差和置信區(qū)間三個(gè)指標(biāo)而不是只丟一個(gè)孤零零的p值。5.3 為什么很多人學(xué)完還是一團(tuán)漿糊我覺得根源在于多數(shù)教材把這兩種檢驗(yàn)并列講解但沒說明白一個(gè)關(guān)鍵事實(shí)在真實(shí)的數(shù)據(jù)分析中雙樣本均值比較幾乎都是t檢驗(yàn)的天下z檢驗(yàn)更多是理論課上的內(nèi)容。像scipy.stats.ttest_ind這種函數(shù)默認(rèn)參數(shù)就是按Welch‘s t-test設(shè)計(jì)的這在二三十年前可能沒人預(yù)料到會成為主流用法。所以如果你只是想解決實(shí)際問題記住三條就夠獨(dú)立樣本比均值用ttest_ind方差未知用Welch大樣本下z檢驗(yàn)結(jié)果也差不多但沒必要硬換。如果你是為了面試或者理論功底那t分布和z分布的關(guān)系、自由度的概念還是得啃一啃。6. 常見問題與避坑技巧實(shí)錄6.1 t檢驗(yàn)功能里equal_var到底怎么選這是一個(gè)高頻問題。很多教程里寫equal_varTrue是默認(rèn)但實(shí)際上scipy.stats.ttest_ind這個(gè)函數(shù)從很早版本開始默認(rèn)值就是False即使你只寫了stats.ttest_ind(a, b)沒傳參數(shù)它跑的就是Welch檢驗(yàn)。我的建議是不要去做方差齊性檢驗(yàn)然后再決定True還是False。原因有兩個(gè)。一是Levene檢驗(yàn)本身在大樣本下很敏感輕微方差不齊就報(bào)警二是即便方差不齊Welch檢驗(yàn)也能正確處理。直接默認(rèn)equal_varFalse讓統(tǒng)計(jì)方法為你兜底就行。6.2 只看p值不看方向匯報(bào)時(shí)被問懵p值小于0.05只能說明“兩組有差異”并不能告訴你“A組是不是比B組好”。如果你做的是雙尾檢驗(yàn)原假設(shè)是兩組相等備擇假設(shè)是“不相等”這其實(shí)是一個(gè)沒有方向性的結(jié)論。有一次我給某公司客服團(tuán)隊(duì)做分析p值顯著小于0.05我直接說“新流程效果顯著”結(jié)果被業(yè)務(wù)負(fù)責(zé)人追問“是更好還是更差”我才意識到自己沒看均值的實(shí)際大小。后來我養(yǎng)成了習(xí)慣先看描述性統(tǒng)計(jì)的均值再看p值最后看置信區(qū)間方向。6.3 樣本量差異懸殊時(shí)的小心機(jī)兩組樣本量差異懸殊比如n1500、n220這時(shí)候t檢驗(yàn)的統(tǒng)計(jì)功效會大打折扣因?yàn)樾颖窘M的方差估計(jì)極不穩(wěn)定標(biāo)準(zhǔn)誤計(jì)算會受影響。如果你在現(xiàn)實(shí)中遇到這種情況別急著跑檢驗(yàn)。第一步先確認(rèn)小樣本組的數(shù)據(jù)采集過程有沒有問題第二步考慮用Bootstrap方法估計(jì)均值差的置信區(qū)間作為補(bǔ)充驗(yàn)證第三步再結(jié)合業(yè)務(wù)判斷看結(jié)論的可靠性。單純的數(shù)據(jù)分析方法解決不了樣本設(shè)計(jì)失衡的問題。6.4 Bootstrapping作為補(bǔ)充驗(yàn)證Bootstrap的核心思想是“用樣本重抽樣模擬重復(fù)實(shí)驗(yàn)”。我在關(guān)鍵項(xiàng)目里通常會跑一個(gè)Bootstrap去驗(yàn)證參數(shù)檢驗(yàn)的結(jié)論穩(wěn)不穩(wěn)。rng np.random.default_rng(42) boot_diffs [] for _ in range(5000): boot_old rng.choice(old_group, sizen_old, replaceTrue) boot_new rng.choice(new_group, sizen_new, replaceTrue) boot_diffs.append(np.mean(boot_new) - np.mean(boot_old)) boot_diffs np.array(boot_diffs) ci_low np.percentile(boot_diffs, 2.5) ci_high np.percentile(boot_diffs, 97.5) print(fBootstrap 95%置信區(qū)間: ({ci_low:.4f}, {ci_high:.4f}))如果Bootstrap置信區(qū)間和參數(shù)檢驗(yàn)的置信區(qū)間方向一致說明結(jié)論比較穩(wěn)健如果兩者矛盾就要回頭檢查正態(tài)性假設(shè)和方法選擇是否出了問題。6.5 零基礎(chǔ)必記的四個(gè)決策關(guān)鍵詞配對 vs 獨(dú)立同一批人前后對比用配對檢驗(yàn)兩組人互相獨(dú)立用雙樣本檢驗(yàn)。方差齊 vs 不齊不確定就用Welch省心。單尾 vs 雙尾懷疑A比B好用alternativegreater只想知道有沒有差異用雙尾。樣本設(shè)計(jì)結(jié)果顯著不等于數(shù)據(jù)可靠實(shí)驗(yàn)設(shè)計(jì)才是源頭。7. 數(shù)據(jù)分析之外我的幾點(diǎn)實(shí)操體會寫到最后還是想用我自己的使用感受收個(gè)尾。我剛?cè)胄袝r(shí)也迷信“n30用z檢驗(yàn)”后來在做一組約40樣本量的AB測試時(shí)發(fā)現(xiàn)用z檢驗(yàn)的結(jié)果很容易出現(xiàn)“臨界顯著”換t檢驗(yàn)后p值就從0.049變成了0.057業(yè)務(wù)方態(tài)度立刻不一樣。從那以后我再也不在常規(guī)分析里主動(dòng)用z檢驗(yàn)除非項(xiàng)目真的有明確理由。還有一次某同事跑出來一個(gè)極小的p值興奮地拿過來跟我說結(jié)論特別顯著。我讓他畫了個(gè)散點(diǎn)圖發(fā)現(xiàn)兩組數(shù)據(jù)的差異主要由三個(gè)極端值驅(qū)動(dòng)均值被人為拉高了。事后我們?yōu)V掉異常值重新分析p值立刻不再顯著。這類“p值陷阱”在真實(shí)數(shù)據(jù)里非常常見所以我現(xiàn)在要求自己在看任何檢驗(yàn)結(jié)果前一定先做數(shù)據(jù)可視化眼見為實(shí)。如果你也正在用Python做數(shù)據(jù)分析我建議你把“t檢驗(yàn) vs z檢驗(yàn)”這個(gè)選擇固化成一個(gè)習(xí)慣默認(rèn)scipy.stats.ttest_indequal_varFalse報(bào)告里同時(shí)給p值和置信區(qū)間重要結(jié)論再用Bootstrap復(fù)核一遍。這套流程雖然看起來比“一行代碼出結(jié)果”多幾步但每一步都能幫你避免一個(gè)常見的統(tǒng)計(jì)坑。數(shù)據(jù)復(fù)查越細(xì)致結(jié)論就越有說服力。