使用場景

當你有一組數據,并希望確定它們的均值是否與某個特定的值(如理論值或歷史數據)是否有顯著差異(案例:假設你有一個班級的考試成績數據,你想知道這些成績的平均分是否和歷史平均分55分有顯著性差異

注意事項

關于如何檢驗數據是否成正態分布參考文章數據分布與變化:從理論到實踐指南

代碼實現

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')

# 生成示例數據
np.random.seed(42)
sample_data = np.random.normal(loc=50, scale=10, size=30)
test_value = 55 # 假設檢驗的已知值 總體均值

# 進行單樣本T檢驗
t_stat, p_value = stats.ttest_1samp(sample_data, test_value)

# 打印結果
print(f"T統計量: {t_stat}")
print(f"p值: {p_value}")

# 將數據轉換為DataFrame,便于Seaborn進行可視化
data = pd.DataFrame({
'Score': sample_data
})

# 使用Seaborn進行可視化
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()

生成一個樣本數據集,包含30個來自正態分布的數據點,均值為50,標準差為10,假設檢驗的已知值設定為55,可視化一個直方圖和核密度估計圖的組合,展示樣本數據的分布情況,圖中紅色虛線表示假設檢驗的已知值(總體均值),這里的??說明樣本數據的均值與所設定的總體均值(假設值)存在顯著性差異,如果加上上述案例背景就是認為當前班級的考試成績平均分與歷史平均分75分存在顯著性差異

獨立樣本T檢驗

公式

使用場景

比較兩個獨立樣本的均值是否有顯著差異(案例:比較男性和女性的工資水平,看看是否存在顯著差異)

注意事項

代碼實現

# 生成示例數據
np.random.seed(42)
group1 = np.random.normal(loc=50, scale=10, size=100)
group2 = np.random.normal(loc=55, scale=10, size=100)

# 進行獨立樣本T檢驗
t_stat, p_value = stats.ttest_ind(group1, group2)

# 打印結果
print(f"T統計量: {t_stat}")
print(f"p值: {p_value}")

# 將數據轉換為DataFrame,便于Seaborn進行可視化
data = pd.DataFrame({
'Score': np.concatenate([group1, group2]),
'Group': ['Group 1'] * len(group1) + ['Group 2'] * len(group2)
})

# 使用Seaborn進行可視化
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檢驗結果到圖中
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()

生成兩個獨立樣本數據,分別從正態分布中抽取,每個樣本有100個數據點,可視化一個箱線圖和散點圖的組合,清晰地展示了兩個組的分布情況,并且在圖的標題中顯示了T統計量和p值,這里的??意味著有理由拒絕假設兩組獨立樣本的均值相等,認為它們之間存在顯著差異,如果加上上述案例背景就是男性和女性的工資水平存在顯著性差異

配對樣本T檢驗

公式

使用場景

用于比較同一個樣本在兩個不同條件下的均值差異(案例:同一批學生在學期初和學期末的考試成績,比較他們的進步情況)
注意事項

代碼實現

# 生成示例數據
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)

# 進行配對樣本T檢驗
t_stat, p_value = stats.ttest_rel(before_treatment, after_treatment)

# 打印結果
print(f"T統計量: {t_stat}")
print(f"p值: {p_value}")

# 將數據轉換為DataFrame,便于Seaborn進行可視化
data = pd.DataFrame({
'Before Treatment': before_treatment,
'After Treatment': after_treatment
})

# 繪制配對數據的分布和變化
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')

# 繪制配對數據的變化
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檢驗結果到圖中
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()

生成一個示例數據集,其中包含處理前和處理后的配對樣本數據,處理后的數據是處理前數據加上一個隨機擾動,可視化為箱線圖和散點圖:展示處理前和處理后的數據分布情況、變化線圖:展示每個配對樣本在處理前后的變化情況,每條灰線代表一個配對樣本,這里的?P<0.05說明兩樣本的均值存在顯著差異,如果加上上述案例背景就是認為學期初和學期末的考試成績平均值存在顯著差異,表明學生在學業上有進步或退步

文章轉自微信公眾號@Python機器學習AI

上一篇:

統計檢驗——卡方檢驗分析分類變量間的顯著性差異

下一篇:

綜合多種梯度提升模型:LightGBM、XGBoost、CatBoost與NGBoost的集成預測

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費