檢驗(yàn)實(shí)戰(zhàn):從A/B測(cè)試到工業(yè)數(shù)據(jù)分析的完整指南)
1. 項(xiàng)目概述假設(shè)檢驗(yàn)在數(shù)模實(shí)戰(zhàn)中的核心地位假設(shè)檢驗(yàn)聽起來是個(gè)挺學(xué)術(shù)的詞但在數(shù)學(xué)建模和數(shù)據(jù)分析的實(shí)戰(zhàn)里它就是你手里那把最鋒利的“手術(shù)刀”。無論是驗(yàn)證一個(gè)新藥是否有效還是判斷一個(gè)營(yíng)銷策略有沒有提升銷量或者像我之前處理的一個(gè)工業(yè)傳感器數(shù)據(jù)異常檢測(cè)項(xiàng)目本質(zhì)上都是在回答一個(gè)問題我觀察到的這個(gè)現(xiàn)象是偶然發(fā)生的還是真的有規(guī)律可循MATLAB作為工程和科研領(lǐng)域的“瑞士軍刀”它提供的假設(shè)檢驗(yàn)工具箱就是把復(fù)雜的統(tǒng)計(jì)理論封裝成了一個(gè)個(gè)直觀易用的函數(shù)讓我們能把精力集中在問題本身而不是繁瑣的公式推導(dǎo)和臨界值查表上。很多剛接觸數(shù)模的朋友容易陷入一個(gè)誤區(qū)拿到數(shù)據(jù)就急著跑回歸、做預(yù)測(cè)卻忽略了最基礎(chǔ)的“數(shù)據(jù)診斷”步驟。這就好比醫(yī)生沒做檢查就直接開藥風(fēng)險(xiǎn)很大。假設(shè)檢驗(yàn)就是這個(gè)“診斷”過程的核心。它幫你判斷樣本是否能代表總體、兩個(gè)方案是否有顯著差異、數(shù)據(jù)是否符合某種分布。這些結(jié)論直接決定了你后續(xù)選擇什么樣的模型以及你對(duì)模型結(jié)果的信心有多大。這次我們就拋開教科書式的理論堆砌直接切入MATLAB的實(shí)戰(zhàn)環(huán)境看看如何把ttest、ttest2、vartest、chi2gof這些函數(shù)用活、用透解決真實(shí)問題。2. 假設(shè)檢驗(yàn)的核心思想與MATLAB實(shí)現(xiàn)邏輯2.1 從“無罪推定”理解假設(shè)檢驗(yàn)的基本框架假設(shè)檢驗(yàn)的邏輯其實(shí)和司法上的“無罪推定”非常像。我們首先建立一個(gè)“原假設(shè)”H0通常代表一種保守的、傳統(tǒng)的、或沒有發(fā)生改變的狀態(tài)比如“新藥無效”、“兩組數(shù)據(jù)均值無差異”。這個(gè)原假設(shè)就像被告一開始我們假定它是“無罪”的。而“備擇假設(shè)”H1則是我們想要證明的、可能的新發(fā)現(xiàn)比如“新藥有效”、“兩組數(shù)據(jù)均值不同”。我們的角色就是“檢察官”通過手中的證據(jù)樣本數(shù)據(jù)來判斷是否要拒絕“無罪”的原假設(shè)。這里的關(guān)鍵是我們永遠(yuǎn)無法“證明”原假設(shè)為真只能判斷是否有足夠強(qiáng)的證據(jù)去“拒絕”它。這個(gè)判斷標(biāo)準(zhǔn)就是顯著性水平α通常設(shè)為0.05或0.01。你可以把它理解為誤判“無罪”為“有罪”的最大容忍概率即第一類錯(cuò)誤。在MATLAB里幾乎所有假設(shè)檢驗(yàn)函數(shù)的輸出都會(huì)包含一個(gè)核心指標(biāo)p值。p值的含義是在原假設(shè)成立的前提下出現(xiàn)當(dāng)前樣本情況或更極端情況的概率。如果這個(gè)概率p值非常小小于我們?cè)O(shè)定的α小到我們認(rèn)為“在原假設(shè)下發(fā)生這種事情幾乎不可能”那么我們就拒絕原假設(shè)接受備擇假設(shè)。MATLAB幫我們自動(dòng)完成了計(jì)算p值并與α比較的過程我們直接看結(jié)果就行。2.2 MATLAB假設(shè)檢驗(yàn)函數(shù)族概覽與選型指南MATLAB的統(tǒng)計(jì)與機(jī)器學(xué)習(xí)工具箱提供了豐富的假設(shè)檢驗(yàn)函數(shù)根據(jù)檢驗(yàn)?zāi)繕?biāo)可以分成幾大類單樣本檢驗(yàn)判斷單個(gè)樣本的統(tǒng)計(jì)量如均值是否等于某個(gè)特定值。ttest單樣本t檢驗(yàn)用于檢驗(yàn)樣本均值。當(dāng)你想知道一批零件的平均尺寸是否達(dá)標(biāo)等于某個(gè)標(biāo)準(zhǔn)值時(shí)就用它。vartest單樣本方差檢驗(yàn)卡方檢驗(yàn)用于檢驗(yàn)樣本方差。chi2gof卡方擬合優(yōu)度檢驗(yàn)用于檢驗(yàn)樣本是否來自某個(gè)特定分布。雙樣本檢驗(yàn)比較兩個(gè)獨(dú)立樣本或配對(duì)樣本的統(tǒng)計(jì)量。ttest2雙樣本t檢驗(yàn)獨(dú)立樣本用于檢驗(yàn)兩個(gè)獨(dú)立樣本的均值是否相等。比如比較A/B測(cè)試中兩個(gè)用戶組的平均停留時(shí)間。vartest2雙樣本方差檢驗(yàn)F檢驗(yàn)用于檢驗(yàn)兩個(gè)獨(dú)立樣本的方差是否相等。這是進(jìn)行ttest2前常做的步驟因?yàn)榉讲钍欠颀R性會(huì)影響t檢驗(yàn)的具體計(jì)算方法。ttest配對(duì)樣本t檢驗(yàn)。注意MATLAB中用同一個(gè)ttest函數(shù)做單樣本和配對(duì)樣本檢驗(yàn)區(qū)別在于輸入。配對(duì)檢驗(yàn)輸入的是兩組數(shù)據(jù)的差值。分布檢驗(yàn)檢驗(yàn)數(shù)據(jù)是否服從某種分布。kstestKolmogorov-Smirnov檢驗(yàn)檢驗(yàn)樣本是否服從指定連續(xù)分布。lillietestLilliefors檢驗(yàn)專門用于檢驗(yàn)正態(tài)性。jbtestJarque-Bera檢驗(yàn)也是檢驗(yàn)正態(tài)性基于樣本的偏度和峰度。非參數(shù)檢驗(yàn)當(dāng)數(shù)據(jù)不滿足參數(shù)檢驗(yàn)如t檢驗(yàn)要求正態(tài)性的前提假設(shè)時(shí)使用。ranksumWilcoxon秩和檢驗(yàn)Mann-Whitney U檢驗(yàn)用于比較兩個(gè)獨(dú)立樣本的中位數(shù)。signrankWilcoxon符號(hào)秩檢驗(yàn)用于配對(duì)樣本的中位數(shù)比較。kruskalwallisKruskal-Wallis檢驗(yàn)用于比較三個(gè)及以上獨(dú)立樣本的中位數(shù)單因素非參數(shù)方差分析。選型核心心法拿到數(shù)據(jù)后別急著跑檢驗(yàn)。先畫圖histogram,boxplot直觀感受數(shù)據(jù)分布和異常值然后根據(jù)你的科學(xué)問題是比均值還是比分布是單樣本還是雙樣本和數(shù)據(jù)的實(shí)際情況是否正態(tài)是否獨(dú)立來選擇最合適的檢驗(yàn)方法。選錯(cuò)了檢驗(yàn)結(jié)論可能南轅北轍。3. 核心實(shí)戰(zhàn)案例精講從數(shù)據(jù)到結(jié)論的完整流程3.1 案例一A/B測(cè)試效果評(píng)估——獨(dú)立雙樣本t檢驗(yàn) (ttest2)場(chǎng)景你負(fù)責(zé)一個(gè)電商網(wǎng)站的首頁改版。舊版頁面A組有1000名用戶的點(diǎn)擊率數(shù)據(jù)新版頁面B組也有1000名用戶的點(diǎn)擊率數(shù)據(jù)。老板問新版頁面真的比舊版更能吸引用戶點(diǎn)擊嗎步驟拆解與MATLAB實(shí)操數(shù)據(jù)準(zhǔn)備與可視化% 假設(shè)數(shù)據(jù)已加載到變量 click_rate_A 和 click_rate_B 中 % 首先進(jìn)行描述性統(tǒng)計(jì)和可視化建立直觀認(rèn)識(shí) figure; subplot(1,2,1); histogram(click_rate_A, Normalization, pdf); hold on; histogram(click_rate_B, Normalization, pdf); legend(A組舊版, B組新版); xlabel(點(diǎn)擊率); ylabel(概率密度); title(數(shù)據(jù)分布直方圖); subplot(1,2,2); boxplot([click_rate_A, click_rate_B], Labels, {A組, B組}); ylabel(點(diǎn)擊率); title(數(shù)據(jù)箱線圖查看異常值和中位數(shù));這個(gè)步驟至關(guān)重要。直方圖幫你初步判斷數(shù)據(jù)是否近似正態(tài)t檢驗(yàn)的前提之一箱線圖幫你發(fā)現(xiàn)異常值。如果數(shù)據(jù)嚴(yán)重偏態(tài)或存在極端異常值可能需要考慮數(shù)據(jù)轉(zhuǎn)換或使用非參數(shù)檢驗(yàn)。前提條件檢驗(yàn)方差齊性檢驗(yàn) (vartest2) t檢驗(yàn)有兩種形式假設(shè)兩總體方差相等的“合并方差t檢驗(yàn)”和方差不等的“Welchs t檢驗(yàn)”。我們先檢驗(yàn)方差是否齊性。[h_var, p_var] vartest2(click_rate_A, click_rate_B); fprintf(方差齊性檢驗(yàn)結(jié)果h %d, p %.4f\n, h_var, p_var); if h_var 0 fprintf(在0.05顯著性水平下無法拒絕“方差相等”的原假設(shè)。\n); var_type equal; % 后續(xù)ttest2使用合并方差 else fprintf(在0.05顯著性水平下拒絕“方差相等”的原假設(shè)認(rèn)為方差不齊。\n); var_type unequal; % 后續(xù)ttest2使用Welch校正 endh1表示拒絕原假設(shè)方差不齊h0表示不拒絕方差齊性。這里我們根據(jù)p_var是否小于0.05來做判斷。執(zhí)行獨(dú)立雙樣本t檢驗(yàn) (ttest2)alpha 0.05; % 設(shè)定顯著性水平 [h, p, ci, stats] ttest2(click_rate_B, click_rate_A, ... % 注意順序B-A因?yàn)槲覀兿霗z驗(yàn)B是否大于A Alpha, alpha, ... Vartype, var_type, ... % 使用上一步判斷的方差類型 Tail, right); % ‘right’表示備擇假設(shè)是B組的均值大于A組 fprintf(\n--- 雙樣本t檢驗(yàn)結(jié)果 ---\n); fprintf(假設(shè)新版(B)均值 舊版(A)均值\n); fprintf(檢驗(yàn)結(jié)果 h %d (1表示拒絕原假設(shè)即新版更好)\n, h); fprintf(p值 %.6f\n, p); fprintf(均值差的95%%置信區(qū)間: [%.4f, %.4f]\n, ci(1), ci(2)); fprintf(t統(tǒng)計(jì)量 %.4f, 自由度 %.2f\n, stats.tstat, stats.df);參數(shù)詳解Tail, right指定了單側(cè)檢驗(yàn)。因?yàn)槲覀冎魂P(guān)心新版是否“優(yōu)于”舊版而不是“是否不同”。如果只是想知道有無差異則用both默認(rèn)值。ci輸出的是均值差B-A的置信區(qū)間。如果整個(gè)區(qū)間都大于0也支持BA的結(jié)論。stats結(jié)構(gòu)體包含了計(jì)算細(xì)節(jié)如t統(tǒng)計(jì)量和自由度可用于更深入的分析或報(bào)告。結(jié)果解讀與報(bào)告如果h 1且p 0.05我們可以得出結(jié)論“在0.05的顯著性水平下有充分的統(tǒng)計(jì)證據(jù)表明新版頁面B組的平均點(diǎn)擊率顯著高于舊版頁面A組。”同時(shí)報(bào)告效應(yīng)量如Cohen‘s d會(huì)讓結(jié)論更有力。MATLAB沒有內(nèi)置函數(shù)但可以輕松計(jì)算% 計(jì)算Cohen‘s d (效應(yīng)量) mean_diff mean(click_rate_B) - mean(click_rate_A); if strcmp(var_type, equal) pooled_std sqrt(((numel(click_rate_A)-1)*var(click_rate_A) (numel(click_rate_B)-1)*var(click_rate_B)) / (numel(click_rate_A)numel(click_rate_B)-2)); else % 對(duì)于方差不齊的情況使用Glass‘s Δ或其它方法更合適這里簡(jiǎn)化處理 pooled_std sqrt((var(click_rate_A) var(click_rate_B))/2); end cohens_d mean_diff / pooled_std; fprintf(效應(yīng)量 (Cohen‘s d) %.3f\n, cohens_d);效應(yīng)量可以量化差異的大小避免僅依賴p值它受樣本量影響很大。實(shí)操心得在實(shí)際的A/B測(cè)試中樣本量通常很大很容易得到顯著的p值即使差異非常小。因此一定要結(jié)合置信區(qū)間和效應(yīng)量來解讀。一個(gè)統(tǒng)計(jì)顯著但效應(yīng)量極小如d0.2的差異可能不具備商業(yè)上的實(shí)際意義。另外確保兩組用戶是隨機(jī)分配的這是獨(dú)立t檢驗(yàn)有效的前提。3.2 案例二生產(chǎn)工藝改進(jìn)驗(yàn)證——配對(duì)樣本t檢驗(yàn) (ttest)場(chǎng)景工廠對(duì)某條生產(chǎn)線進(jìn)行了工藝優(yōu)化。為了驗(yàn)證優(yōu)化效果記錄了同一批10臺(tái)設(shè)備在優(yōu)化前和優(yōu)化后的日產(chǎn)量。數(shù)據(jù)是配對(duì)的同一臺(tái)設(shè)備前后對(duì)比此時(shí)應(yīng)使用配對(duì)t檢驗(yàn)。步驟拆解與MATLAB實(shí)操計(jì)算差值配對(duì)檢驗(yàn)的核心是檢驗(yàn)差值的均值是否為0。% 數(shù)據(jù)production_before, production_after difference production_after - production_before; % 計(jì)算每臺(tái)設(shè)備的產(chǎn)量提升值 % 可視化差值 figure; subplot(1,2,1); plot([zeros(10,1), ones(10,1)], [production_before, production_after], -o); xlabel(階段 (0:優(yōu)化前, 1:優(yōu)化后)); ylabel(日產(chǎn)量); title(各設(shè)備優(yōu)化前后產(chǎn)量連線圖); xticks([0 1]); xticklabels({優(yōu)化前,優(yōu)化后}); subplot(1,2,2); histogram(difference); xlabel(產(chǎn)量差值 (優(yōu)化后 - 優(yōu)化前)); ylabel(頻數(shù)); title(產(chǎn)量差值的分布); % 在圖上添加差值均值的參考線 hold on; yl ylim; line([mean(difference), mean(difference)], yl, Color, r, LineStyle, --); text(mean(difference), yl(2)*0.9, sprintf(均值%.2f, mean(difference)), Color, r);連線圖可以清晰看到每臺(tái)設(shè)備的變化趨勢(shì)直方圖看差值分布。執(zhí)行配對(duì)樣本t檢驗(yàn)在MATLAB中配對(duì)t檢驗(yàn)通過ttest函數(shù)對(duì)差值進(jìn)行單樣本t檢驗(yàn)來實(shí)現(xiàn)原假設(shè)是“差值的均值為0”。[h, p, ci, stats] ttest(difference, 0, Alpha, 0.05, Tail, right); % 檢驗(yàn)差值是否顯著大于0 fprintf(\n--- 配對(duì)樣本t檢驗(yàn)結(jié)果 ---\n); fprintf(假設(shè)優(yōu)化后產(chǎn)量 優(yōu)化前產(chǎn)量 (即差值0)\n); fprintf(h %d, p %.5f\n, h, p); fprintf(差值均值的95%%置信區(qū)間: [%.3f, %.3f]\n, ci(1), ci(2)); fprintf(平均提升量: %.2f ± %.2f (置信區(qū)間半寬)\n, mean(difference), (ci(2)-ci(1))/2);這里ttest的第二個(gè)參數(shù)是0表示檢驗(yàn)差值均值是否與0有顯著差異?!甌ail’, ‘right’表示我們只關(guān)心產(chǎn)量是否提升。注意事項(xiàng)配對(duì)t檢驗(yàn)的前提是差值近似服從正態(tài)分布。對(duì)于小樣本如n30這個(gè)前提很重要??梢杂胠illietest(difference)來檢驗(yàn)差值的正態(tài)性。如果不滿足應(yīng)考慮使用非參數(shù)檢驗(yàn)signrank(production_before, production_after)。3.3 案例三數(shù)據(jù)正態(tài)性檢驗(yàn)——模型選擇的基石 (lillietest/jbtest)場(chǎng)景你拿到了一組關(guān)于城市日用電量的數(shù)據(jù)打算建立預(yù)測(cè)模型。許多經(jīng)典模型如線性回歸、ARIMA要求殘差服從正態(tài)分布。在建模前你需要先檢驗(yàn)原始數(shù)據(jù)或模型殘差是否正態(tài)。步驟拆解與MATLAB實(shí)操可視化判斷QQ圖QQ圖是最直觀的正態(tài)性檢查工具。% 假設(shè)數(shù)據(jù)為 electricity_load figure; subplot(1,2,1); histogram(electricity_load, Normalization, pdf); hold on; x_values linspace(min(electricity_load), max(electricity_load), 100); plot(x_values, normpdf(x_values, mean(electricity_load), std(electricity_load)), r-, LineWidth, 2); legend(數(shù)據(jù)分布, 擬合的正態(tài)分布); title(直方圖與正態(tài)分布擬合); subplot(1,2,2); qqplot(electricity_load); % 繪制QQ圖 title(正態(tài)QQ圖);如果數(shù)據(jù)點(diǎn)大致分布在QQ圖的紅色參考線附近則表明服從正態(tài)分布。直方圖與正態(tài)曲線的對(duì)比也能提供參考。統(tǒng)計(jì)檢驗(yàn)QQ圖有一定主觀性需要用統(tǒng)計(jì)檢驗(yàn)定量判斷。對(duì)于中小樣本Lilliefors檢驗(yàn)改進(jìn)的K-S檢驗(yàn)是常用選擇。[h_lillie, p_lillie] lillietest(electricity_load); fprintf(Lilliefors正態(tài)性檢驗(yàn): h %d, p %.4f\n, h_lillie, p_lillie); % 也可以使用Jarque-Bera檢驗(yàn)基于偏度和峰度尤其適用于大樣本 [h_jb, p_jb] jbtest(electricity_load); fprintf(Jarque-Bera正態(tài)性檢驗(yàn): h %d, p %.4f\n, h_jb, p_jb);h 1表示拒絕“數(shù)據(jù)來自正態(tài)分布”的原假設(shè)。通常如果p 0.05我們沒有足夠證據(jù)拒絕正態(tài)性假設(shè)但不等于證明它就是正態(tài)的。如果p 0.05則數(shù)據(jù)顯著偏離正態(tài)。后續(xù)決策如果檢驗(yàn)拒絕正態(tài)性可以考慮對(duì)數(shù)據(jù)進(jìn)行變換如對(duì)數(shù)變換log(x)、Box-Cox變換。% 嘗試對(duì)數(shù)變換 if h_lillie 1 elec_log log(electricity_load - min(electricity_load) 1); % 避免非正值 [h_log, p_log] lillietest(elec_log); fprintf(對(duì)數(shù)變換后Lilliefors檢驗(yàn): h %d, p %.4f\n, h_log, p_log); end或者直接選擇對(duì)分布沒有嚴(yán)格要求的模型如決策樹、支持向量機(jī)使用特定核函數(shù)后或非參數(shù)方法。核心心法正態(tài)性檢驗(yàn)的原假設(shè)是“數(shù)據(jù)服從正態(tài)分布”。因此p 0.05意味著“數(shù)據(jù)與正態(tài)分布沒有顯著差異”我們可以暫時(shí)接受正態(tài)性假設(shè)用于后續(xù)參數(shù)檢驗(yàn)。但這并非“證明”尤其是在樣本量很大時(shí)微小的偏離也會(huì)導(dǎo)致p值很小而被拒絕。此時(shí)應(yīng)結(jié)合QQ圖和實(shí)際問題的容忍度來綜合判斷。4. 進(jìn)階應(yīng)用與常見陷阱深度剖析4.1 多重比較問題與校正方法陷阱場(chǎng)景你測(cè)試了10種不同的廣告文案分別與對(duì)照組進(jìn)行t檢驗(yàn)。在α0.05水平下即使所有文案都無效你仍有約40%的概率1 - (1-0.05)^10至少得到一個(gè)“顯著”的假陽性結(jié)果。這就是多重比較問題。MATLAB解決方案multcompare函數(shù)。它通常與方差分析ANOVA的結(jié)果一起使用但思想適用于需要多次兩兩比較的場(chǎng)景。% 假設(shè)有5種工藝group每種工藝有若干產(chǎn)量數(shù)據(jù)data % 首先進(jìn)行單因素方差分析 [p, tbl, stats] anova1(data, group, off); % ‘off’不顯示圖形 if p 0.05 fprintf(ANOVA結(jié)果顯示組間存在顯著差異(p%.4f)。\n, p); % 進(jìn)行事后多重比較如Tukey‘s HSD方法 figure; [c, m, h, nms] multcompare(stats, Alpha, 0.05, CType, tukey-kramer); title(多重比較結(jié)果Tukey-Kramer法); endmultcompare輸出的交互圖會(huì)顯示哪些組之間的差異是顯著的置信區(qū)間不包含0。它自動(dòng)對(duì)p值或置信區(qū)間進(jìn)行了校正控制了整體第一類錯(cuò)誤率。簡(jiǎn)易手動(dòng)校正Bonferroni法如果只是進(jìn)行k次獨(dú)立的檢驗(yàn)可以將顯著性水平調(diào)整為 α/k。例如做10次兩兩t檢驗(yàn)每次的α應(yīng)設(shè)為0.005。alpha_family 0.05; % 整體錯(cuò)誤率 k 10; % 比較次數(shù) alpha_corrected alpha_family / k; % Bonferroni校正后的閾值 % 然后使用 alpha_corrected 作為你每次 ttest2 的 ‘Alpha’ 參數(shù)Bonferroni法非常保守可能會(huì)增加第二類錯(cuò)誤漏報(bào)。在探索性數(shù)據(jù)分析中可酌情使用但在嚴(yán)謹(jǐn)?shù)淖C實(shí)性分析中應(yīng)使用更優(yōu)的校正方法如Holm-Bonferroni, FDR。4.2 效應(yīng)量超越“是否顯著”關(guān)注“差異多大”p值只能告訴你差異是否不太可能由偶然產(chǎn)生但無法告訴你差異有多大。一個(gè)在超大樣本下統(tǒng)計(jì)顯著但效應(yīng)量極小的差異可能沒有實(shí)際意義。常用效應(yīng)量計(jì)算Cohen‘s d針對(duì)t檢驗(yàn)如上文案例所示d (均值差) / 合并標(biāo)準(zhǔn)差。通常|d|≈0.2為小效應(yīng)0.5為中等效應(yīng)0.8為大效應(yīng)。η2 或 ω2針對(duì)方差分析ANOVA表示自變量解釋的因變量方差比例。MATLAB的anova1輸出表格中就包含平方和SS可以計(jì)算。% 從 anova1 的輸出表 tbl 中獲取信息 SS_group tbl{2,2}; % 組間平方和 SS_total tbl{4,2}; % 總平方和 eta_squared SS_group / SS_total; % η2 fprintf(效應(yīng)量 η2 %.3f (%.1f%%的方差可由組別解釋)\n, eta_squared, eta_squared*100);報(bào)告建議在報(bào)告假設(shè)檢驗(yàn)結(jié)果時(shí)應(yīng)同時(shí)給出p值、置信區(qū)間和效應(yīng)量。例如“新版頁面點(diǎn)擊率顯著高于舊版 (t(1998) 3.45, p .001, 95% CI [0.01, 0.03], Cohen‘s d 0.15)?!?盡管d0.15是小效應(yīng)但結(jié)合業(yè)務(wù)背景點(diǎn)擊率提升絕對(duì)值才能判斷其價(jià)值。4.3 統(tǒng)計(jì)功效與樣本量規(guī)劃陷阱如果樣本量太小即使存在真實(shí)的差異檢驗(yàn)也可能沒有足夠的“功力”功效檢測(cè)出來導(dǎo)致第二類錯(cuò)誤漏報(bào)。統(tǒng)計(jì)功效當(dāng)備擇假設(shè)為真時(shí)正確拒絕原假設(shè)的概率。通常希望功效達(dá)到80%以上。MATLAB實(shí)現(xiàn)需要統(tǒng)計(jì)與機(jī)器學(xué)習(xí)工具箱% 示例規(guī)劃一個(gè)雙樣本t檢驗(yàn)的樣本量 % 已知預(yù)期效應(yīng)量 d 0.5 (中等效應(yīng))顯著性水平 alpha 0.05期望功效 power 0.8 d 0.5; alpha 0.05; power 0.8; n sampsizepwr(t2, [0 1], d, power, [], Alpha, alpha); % ‘t2’表示雙樣本t檢驗(yàn) fprintf(要達(dá)到功效80%% (效應(yīng)量d0.5, alpha0.05)每組至少需要 %.0f 個(gè)樣本。\n, ceil(n));sampsizepwr函數(shù)也可以在已知樣本量時(shí)反推功效幫助你在實(shí)驗(yàn)前評(píng)估設(shè)計(jì)是否合理或在實(shí)驗(yàn)后解釋不顯著的結(jié)果是否可能因樣本不足導(dǎo)致。5. 常見問題排查與MATLAB調(diào)試技巧實(shí)錄5.1 錯(cuò)誤提示與解決方案速查表錯(cuò)誤提示/現(xiàn)象可能原因解決方案Error using ttest2. X and Y must have the same number of columns.輸入的數(shù)據(jù)維度不匹配。ttest2要求X和Y是向量或列數(shù)相同的矩陣按列比較。檢查size(X)和size(Y)。確保都是列向量如X(:)或具有相同列數(shù)的矩陣。p值返回為NaN數(shù)據(jù)可能全為相同的值導(dǎo)致標(biāo)準(zhǔn)差為0。檢查數(shù)據(jù)std(X)和std(Y)。如果標(biāo)準(zhǔn)差為0則t值計(jì)算時(shí)分母為0檢驗(yàn)無意義。需要檢查數(shù)據(jù)采集或預(yù)處理過程。檢驗(yàn)結(jié)果(h)與直觀感受相反1. 搞錯(cuò)了檢驗(yàn)方向‘Tail’參數(shù)。2. 輸入數(shù)據(jù)的順序錯(cuò)了。例如ttest2(A,B,‘Tail’,‘right’)檢驗(yàn)的是A均值B均值。1. 明確你的科學(xué)假設(shè)選擇正確的‘Tail’‘both‘, ‘right‘, ‘left‘。2. 仔細(xì)核對(duì)函數(shù)輸入?yún)?shù)的順序。方差齊性檢驗(yàn)(vartest2)不通過但ttest2用‘equal’和‘unequal’結(jié)果差異巨大方差不齊對(duì)t檢驗(yàn)結(jié)果影響很大尤其是樣本量不等時(shí)。堅(jiān)持使用vartest2的結(jié)果指導(dǎo)ttest2中‘Vartype’的選擇。當(dāng)方差不齊且樣本量較小時(shí)Welch‘s t檢驗(yàn)‘unequal’更穩(wěn)健。報(bào)告結(jié)果時(shí)應(yīng)注明使用了校正。正態(tài)性檢驗(yàn)(lillietest)總是拒絕即使QQ圖看起來還行樣本量很大時(shí)檢驗(yàn)對(duì)偏離正態(tài)非常敏感微小的偏離也會(huì)導(dǎo)致p值很小。不要完全依賴檢驗(yàn)。結(jié)合QQ圖、直方圖綜合判斷。對(duì)于大樣本中心極限定理保證了均值近似正態(tài)t檢驗(yàn)仍有較好的穩(wěn)健性??梢钥紤]使用非參數(shù)檢驗(yàn)作為穩(wěn)健性檢查。multcompare函數(shù)報(bào)錯(cuò)或圖形不顯示沒有正確輸入來自方差分析函數(shù)如anova1,anovan的stats結(jié)構(gòu)體。確保multcompare(stats)中的stats變量是由anova1等函數(shù)輸出的第四個(gè)返回值。并且先運(yùn)行anova1得到顯著的p值后再進(jìn)行事后比較。5.2 數(shù)據(jù)預(yù)處理與檢驗(yàn)前提核查清單在運(yùn)行任何假設(shè)檢驗(yàn)前請(qǐng)按此清單核查獨(dú)立性數(shù)據(jù)點(diǎn)是否相互獨(dú)立這是大多數(shù)檢驗(yàn)的隱含前提。時(shí)間序列數(shù)據(jù)、重復(fù)測(cè)量數(shù)據(jù)通常不獨(dú)立。隨機(jī)性樣本是否是隨機(jī)抽取或隨機(jī)分配的這關(guān)系到結(jié)論能否推廣到總體。離群值處理使用boxplot或isoutlier函數(shù)檢查離群值。離群值可能對(duì)方差和均值產(chǎn)生巨大影響。需要根據(jù)領(lǐng)域知識(shí)決定是剔除、修正還是保留。正態(tài)性針對(duì)參數(shù)檢驗(yàn)對(duì)于小樣本的t檢驗(yàn)檢查數(shù)據(jù)或差值的正態(tài)性QQ圖、lillietest。對(duì)于大樣本每組30t檢驗(yàn)對(duì)正態(tài)性偏離相對(duì)穩(wěn)健。方差齊性針對(duì)獨(dú)立雙樣本t檢驗(yàn)使用vartest2或vartestn多組進(jìn)行檢驗(yàn)。樣本量平衡對(duì)于ttest2盡量保證兩組樣本量相近以最大化檢驗(yàn)功效。5.3 一個(gè)完整的調(diào)試實(shí)例工業(yè)質(zhì)檢數(shù)據(jù)差異分析假設(shè)你有兩組來自不同供應(yīng)商的零件尺寸數(shù)據(jù)supplier_A和supplier_B需要檢驗(yàn)其均值是否有差異。%% 步驟1加載并初步觀察數(shù)據(jù) load(supplier_data.mat); % 假設(shè)數(shù)據(jù)已保存 fprintf(A供應(yīng)商樣本數(shù)%d B供應(yīng)商樣本數(shù)%d\n, length(supplier_A), length(supplier_B)); figure; subplot(2,2,1); boxplot([supplier_A, supplier_B], Labels, {A, B}); ylabel(零件尺寸 (mm)); title(箱線圖 - 查看分布與異常值); subplot(2,2,2); histogram(supplier_A, Normalization, pdf, FaceAlpha, 0.5); hold on; histogram(supplier_B, Normalization, pdf, FaceAlpha, 0.5); legend(A, B); title(分布直方圖); %% 步驟2處理離群值基于業(yè)務(wù)知識(shí)這里假設(shè)使用3σ原則 mean_A mean(supplier_A); std_A std(supplier_A); mean_B mean(supplier_B); std_B std(supplier_B); outlier_idx_A abs(supplier_A - mean_A) 3 * std_A; outlier_idx_B abs(supplier_B - mean_B) 3 * std_B; supplier_A_clean supplier_A(~outlier_idx_A); supplier_B_clean supplier_B(~outlier_idx_B); fprintf(移除離群值后A組 %d - %d, B組 %d - %d\n, ... length(supplier_A), length(supplier_A_clean), ... length(supplier_B), length(supplier_B_clean)); %% 步驟3正態(tài)性檢驗(yàn)對(duì)清理后的數(shù)據(jù) [h_A, p_A] lillietest(supplier_A_clean); [h_B, p_B] lillietest(supplier_B_clean); fprintf(A組正態(tài)性檢驗(yàn): h%d, p%.3f\n, h_A, p_A); fprintf(B組正態(tài)性檢驗(yàn): h%d, p%.3f\n, h_B, p_B); % 如果p值較小繪制QQ圖輔助判斷 if h_A 1 || h_B 1 subplot(2,2,3); qqplot(supplier_A_clean); title(A組數(shù)據(jù)QQ圖); subplot(2,2,4); qqplot(supplier_B_clean); title(B組數(shù)據(jù)QQ圖); end %% 步驟4方差齊性檢驗(yàn) [h_var, p_var] vartest2(supplier_A_clean, supplier_B_clean); fprintf(\n方差齊性檢驗(yàn): h%d, p%.3f\n, h_var, p_var); if h_var 0 var_type equal; fprintf(采用合并方差t檢驗(yàn)。\n); else var_type unequal; fprintf(采用Welch‘s t檢驗(yàn)方差不齊。\n); end %% 步驟5執(zhí)行雙樣本t檢驗(yàn) alpha 0.05; [h, p, ci, stats] ttest2(supplier_A_clean, supplier_B_clean, ... Alpha, alpha, ... Vartype, var_type, ... Tail, both); % 檢驗(yàn)是否有差異不分方向 fprintf(\n 最終檢驗(yàn)結(jié)果 \n); if h 1 fprintf(在α%.2f水平下拒絕原假設(shè)。認(rèn)為兩家供應(yīng)商的零件尺寸存在顯著差異。\n, alpha); else fprintf(在α%.2f水平下沒有足夠證據(jù)拒絕原假設(shè)。無法認(rèn)為兩家供應(yīng)商的零件尺寸有顯著差異。\n, alpha); end fprintf(p值 %.4f\n, p); fprintf(均值差 (A-B) 的%d%%置信區(qū)間: [%.4f, %.4f]\n, (1-alpha)*100, ci(1), ci(2)); fprintf(A組均值: %.3f, B組均值: %.3f\n, mean(supplier_A_clean), mean(supplier_B_clean)); %% 步驟6計(jì)算效應(yīng)量 pooled_std sqrt(((length(supplier_A_clean)-1)*var(supplier_A_clean) ... (length(supplier_B_clean)-1)*var(supplier_B_clean)) / ... (length(supplier_A_clean)length(supplier_B_clean)-2)); cohens_d (mean(supplier_A_clean) - mean(supplier_B_clean)) / pooled_std; fprintf(效應(yīng)量 (Cohen‘s d) %.3f\n, cohens_d);這個(gè)腳本展示了一個(gè)從數(shù)據(jù)加載、可視化、預(yù)處理、前提檢驗(yàn)到最終推斷和效應(yīng)量計(jì)算的完整、穩(wěn)健的分析流程。在實(shí)際項(xiàng)目中將這個(gè)過程模塊化、函數(shù)化能極大提升分析效率和可靠性。