使用場(chǎng)景
當(dāng)你有一組數(shù)據(jù),并希望確定它們的均值是否與某個(gè)特定的值(如理論值或歷史數(shù)據(jù))是否有顯著差異(案例:假設(shè)你有一個(gè)班級(jí)的考試成績數(shù)據(jù),你想知道這些成績的平均分是否和歷史平均分55分有顯著性差異)
注意事項(xiàng)
關(guān)于如何檢驗(yàn)數(shù)據(jù)是否成正態(tài)分布參考文章數(shù)據(jù)分布與變化:從理論到實(shí)踐指南
代碼實(shí)現(xiàn)
import numpy as np
import pandas as pd
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
# 忽略所有警告
warnings.filterwarnings('ignore')
# 生成示例數(shù)據(jù)
np.random.seed(42)
sample_data = np.random.normal(loc=50, scale=10, size=30)
test_value = 55 # 假設(shè)檢驗(yàn)的已知值 總體均值
# 進(jìn)行單樣本T檢驗(yàn)
t_stat, p_value = stats.ttest_1samp(sample_data, test_value)
# 打印結(jié)果
print(f"T統(tǒng)計(jì)量: {t_stat}")
print(f"p值: {p_value}")
# 將數(shù)據(jù)轉(zhuǎn)換為DataFrame,便于Seaborn進(jìn)行可視化
data = pd.DataFrame({
'Score': sample_data
})
# 使用Seaborn進(jìn)行可視化
plt.figure(figsize=(10, 6))
sns.histplot(data['Score'], kde=True, bins=10)
plt.axvline(test_value, color='red', linestyle='--', label=f'Test Value: {test_value}')
plt.title(f'One-Sample T-Test\nT-Statistic: {t_stat:.2f}, p-value: {p_value:.4f}')
plt.xlabel('Score')
plt.ylabel('Frequency')
plt.legend()
plt.show()
生成一個(gè)樣本數(shù)據(jù)集,包含30個(gè)來自正態(tài)分布的數(shù)據(jù)點(diǎn),均值為50,標(biāo)準(zhǔn)差為10,假設(shè)檢驗(yàn)的已知值設(shè)定為55,可視化一個(gè)直方圖和核密度估計(jì)圖的組合,展示樣本數(shù)據(jù)的分布情況,圖中紅色虛線表示假設(shè)檢驗(yàn)的已知值(總體均值),這里的??說明樣本數(shù)據(jù)的均值與所設(shè)定的總體均值(假設(shè)值)存在顯著性差異,如果加上上述案例背景就是認(rèn)為當(dāng)前班級(jí)的考試成績平均分與歷史平均分75分存在顯著性差異
公式
使用場(chǎng)景
比較兩個(gè)獨(dú)立樣本的均值是否有顯著差異(案例:比較男性和女性的工資水平,看看是否存在顯著差異)
注意事項(xiàng)
代碼實(shí)現(xiàn)
# 生成示例數(shù)據(jù)
np.random.seed(42)
group1 = np.random.normal(loc=50, scale=10, size=100)
group2 = np.random.normal(loc=55, scale=10, size=100)
# 進(jìn)行獨(dú)立樣本T檢驗(yàn)
t_stat, p_value = stats.ttest_ind(group1, group2)
# 打印結(jié)果
print(f"T統(tǒng)計(jì)量: {t_stat}")
print(f"p值: {p_value}")
# 將數(shù)據(jù)轉(zhuǎn)換為DataFrame,便于Seaborn進(jìn)行可視化
data = pd.DataFrame({
'Score': np.concatenate([group1, group2]),
'Group': ['Group 1'] * len(group1) + ['Group 2'] * len(group2)
})
# 使用Seaborn進(jìn)行可視化
plt.figure(figsize=(10, 6))
sns.boxplot(x='Group', y='Score', data=data)
sns.stripplot(x='Group', y='Score', data=data, jitter=True, color='black', alpha=0.5)
# 添加T檢驗(yàn)結(jié)果到圖中
plt.title(f'Independent Samples T-Test\nT-Statistic: {t_stat:.2f}, p-value: {p_value:.4f}')
plt.xlabel('Group')
plt.ylabel('Score')
plt.show()
生成兩個(gè)獨(dú)立樣本數(shù)據(jù),分別從正態(tài)分布中抽取,每個(gè)樣本有100個(gè)數(shù)據(jù)點(diǎn),可視化一個(gè)箱線圖和散點(diǎn)圖的組合,清晰地展示了兩個(gè)組的分布情況,并且在圖的標(biāo)題中顯示了T統(tǒng)計(jì)量和p值,這里的??意味著有理由拒絕假設(shè)兩組獨(dú)立樣本的均值相等,認(rèn)為它們之間存在顯著差異,如果加上上述案例背景就是男性和女性的工資水平存在顯著性差異
公式
使用場(chǎng)景
用于比較同一個(gè)樣本在兩個(gè)不同條件下的均值差異(案例:同一批學(xué)生在學(xué)期初和學(xué)期末的考試成績,比較他們的進(jìn)步情況)
注意事項(xiàng)
代碼實(shí)現(xiàn)
# 生成示例數(shù)據(jù)
np.random.seed(42)
before_treatment = np.random.normal(loc=50, scale=10, size=30)
after_treatment = before_treatment + np.random.normal(loc=5, scale=5, size=30)
# 進(jìn)行配對(duì)樣本T檢驗(yàn)
t_stat, p_value = stats.ttest_rel(before_treatment, after_treatment)
# 打印結(jié)果
print(f"T統(tǒng)計(jì)量: {t_stat}")
print(f"p值: {p_value}")
# 將數(shù)據(jù)轉(zhuǎn)換為DataFrame,便于Seaborn進(jìn)行可視化
data = pd.DataFrame({
'Before Treatment': before_treatment,
'After Treatment': after_treatment
})
# 繪制配對(duì)數(shù)據(jù)的分布和變化
plt.figure(figsize=(12, 6))
# 繪制兩個(gè)時(shí)間點(diǎn)的箱線圖
plt.subplot(1, 2, 1)
sns.boxplot(data=data)
sns.stripplot(data=data, jitter=True, color='black', alpha=0.5)
plt.title('Boxplot of Before and After Treatment')
plt.xlabel('Condition')
plt.ylabel('Score')
# 繪制配對(duì)數(shù)據(jù)的變化
plt.subplot(1, 2, 2)
for i in range(len(before_treatment)):
plt.plot([0, 1], [before_treatment[i], after_treatment[i]], color='grey', marker='o')
plt.xticks([0, 1], ['Before Treatment', 'After Treatment'])
plt.title('Paired Sample Changes')
plt.xlabel('Condition')
plt.ylabel('Score')
# 添加T檢驗(yàn)結(jié)果到圖中
plt.suptitle(f'Paired Samples T-Test\nT-Statistic: {t_stat:.2f}, p-value: {p_value:.4f}')
plt.tight_layout(rect=[0, 0, 1, 0.95])
plt.show()
生成一個(gè)示例數(shù)據(jù)集,其中包含處理前和處理后的配對(duì)樣本數(shù)據(jù),處理后的數(shù)據(jù)是處理前數(shù)據(jù)加上一個(gè)隨機(jī)擾動(dòng),可視化為箱線圖和散點(diǎn)圖:展示處理前和處理后的數(shù)據(jù)分布情況、變化線圖:展示每個(gè)配對(duì)樣本在處理前后的變化情況,每條灰線代表一個(gè)配對(duì)樣本,這里的?P<0.05說明兩樣本的均值存在顯著差異,如果加上上述案例背景就是認(rèn)為學(xué)期初和學(xué)期末的考試成績平均值存在顯著差異,表明學(xué)生在學(xué)業(yè)上有進(jìn)步或退步
文章轉(zhuǎn)自微信公眾號(hào)@Python機(jī)器學(xué)習(xí)AI
對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力
一鍵對(duì)比試用API 限時(shí)免費(fèi)