使用場景
當(dāng)你有一組數(shù)據(jù),并希望確定它們的均值是否與某個特定的值(如理論值或歷史數(shù)據(jù))是否有顯著差異(案例:假設(shè)你有一個班級的考試成績數(shù)據(jù),你想知道這些成績的平均分是否和歷史平均分55分有顯著性差異)
注意事項
關(guān)于如何檢驗數(shù)據(jù)是否成正態(tài)分布參考文章數(shù)據(jù)分布與變化:從理論到實踐指南
代碼實現(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è)檢驗的已知值 總體均值
# 進(jìn)行單樣本T檢驗
t_stat, p_value = stats.ttest_1samp(sample_data, test_value)
# 打印結(jié)果
print(f"T統(tǒng)計量: {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()
生成一個樣本數(shù)據(jù)集,包含30個來自正態(tài)分布的數(shù)據(jù)點,均值為50,標(biāo)準(zhǔn)差為10,假設(shè)檢驗的已知值設(shè)定為55,可視化一個直方圖和核密度估計圖的組合,展示樣本數(shù)據(jù)的分布情況,圖中紅色虛線表示假設(shè)檢驗的已知值(總體均值),這里的??說明樣本數(shù)據(jù)的均值與所設(shè)定的總體均值(假設(shè)值)存在顯著性差異,如果加上上述案例背景就是認(rèn)為當(dāng)前班級的考試成績平均分與歷史平均分75分存在顯著性差異
公式
使用場景
比較兩個獨立樣本的均值是否有顯著差異(案例:比較男性和女性的工資水平,看看是否存在顯著差異)
注意事項
代碼實現(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)行獨立樣本T檢驗
t_stat, p_value = stats.ttest_ind(group1, group2)
# 打印結(jié)果
print(f"T統(tǒng)計量: {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檢驗結(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()
生成兩個獨立樣本數(shù)據(jù),分別從正態(tài)分布中抽取,每個樣本有100個數(shù)據(jù)點,可視化一個箱線圖和散點圖的組合,清晰地展示了兩個組的分布情況,并且在圖的標(biāo)題中顯示了T統(tǒng)計量和p值,這里的??意味著有理由拒絕假設(shè)兩組獨立樣本的均值相等,認(rèn)為它們之間存在顯著差異,如果加上上述案例背景就是男性和女性的工資水平存在顯著性差異
公式
使用場景
用于比較同一個樣本在兩個不同條件下的均值差異(案例:同一批學(xué)生在學(xué)期初和學(xué)期末的考試成績,比較他們的進(jìn)步情況)
注意事項
代碼實現(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)行配對樣本T檢驗
t_stat, p_value = stats.ttest_rel(before_treatment, after_treatment)
# 打印結(jié)果
print(f"T統(tǒng)計量: {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
})
# 繪制配對數(shù)據(jù)的分布和變化
plt.figure(figsize=(12, 6))
# 繪制兩個時間點的箱線圖
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')
# 繪制配對數(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檢驗結(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()
生成一個示例數(shù)據(jù)集,其中包含處理前和處理后的配對樣本數(shù)據(jù),處理后的數(shù)據(jù)是處理前數(shù)據(jù)加上一個隨機(jī)擾動,可視化為箱線圖和散點圖:展示處理前和處理后的數(shù)據(jù)分布情況、變化線圖:展示每個配對樣本在處理前后的變化情況,每條灰線代表一個配對樣本,這里的?P<0.05說明兩樣本的均值存在顯著差異,如果加上上述案例背景就是認(rèn)為學(xué)期初和學(xué)期末的考試成績平均值存在顯著差異,表明學(xué)生在學(xué)業(yè)上有進(jìn)步或退步
文章轉(zhuǎn)自微信公眾號@Python機(jī)器學(xué)習(xí)AI