Python 中 T 检验的细分
有没有想过您的 A/B 测试结果是否真的有意义?或者,数据集中的这两个组是否真的不同?T 检验有助于回答这些问题,而 Python 使运行它们变得简单明了。让我们深入了解 t 检验的工作原理以及如何在数据分析中使用它们。
什么是 T 检验(何时应使用 T 检验)?
t 检验告诉您数据中各组之间的差异是偶然发生的,还是具有统计意义上的显著性。这就像有一个数学裁判来帮助确定您的发现是否有意义。
在以下情况下,您需要使用 t 检验:
- 比较两组数字(如各类之间的考试成绩)
- 检查更改是否产生差异(测量前/后)
- 验证样本是否与已知值不同
在 Python 中运行您的第一个 t 检验
让我们从一个真实的例子开始。假设您正在分析咖啡饮用者和非咖啡饮用者之间的反应时间:
import numpy as np
from scipy import stats
# Sample reaction times (in milliseconds)
coffee_drinkers = np.array([245, 238, 242, 234, 236, 235, 239, 242, 240, 241])
non_coffee = np.array([251, 249, 247, 248, 245, 250, 252, 248, 247, 246])
# Run the t-test
t_stat, p_value = stats.ttest_ind(coffee_drinkers, non_coffee)
print(f"T-statistic: {t_stat:.4f}")
print(f"P-value: {p_value:.4f}")
让我们分解一下这里发生的事情:
1. 我们创建两个反应时间数组
2. 'stats.ttest_ind()' 运行独立的 t 检验
3. 它返回两个值:
— t_stat:各组之间的距离
— p_value:这种差异偶然发生的概率
了解您的结果
当您运行此代码时,您可能会看到如下内容:
T-statistic: -9.8124
P-value: 0.0001
以下是这些数字的含义:
- 负 t 统计量告诉我们,不喝咖啡的人速度较慢
- 微小的 p 值 (< 0.05) 表示此差异具有统计显著性
- 我们可以 95% 的信心说咖啡会影响反应时间
不同类型的 T 检验(含代码示例)
独立 T 检验(两个不同的组)
在比较两个单独的组时使用此选项:
# Example: Test scores from two different classes
class_a = np.array([85, 88, 92, 78, 90, 87, 86, 89, 91, 84])
class_b = np.array([79, 82, 85, 75, 83, 80, 81, 84, 82, 78])
# Run the test
t_stat, p_value = stats.ttest_ind(class_a, class_b)
# Add equal_var=False if you suspect unequal variances
# t_stat, p_value = stats.ttest_ind(class_a, class_b, equal_var=False)
2. 配对 T 检验(测量前/测量后)
非常适合在不同时间比较同一组:
# Weight measurements before and after a diet program
before = np.array([180, 172, 168, 190, 175, 185, 171, 168, 183, 177])
after = np.array([175, 168, 163, 183, 170, 179, 166, 164, 177, 173])
# Run paired t-test
t_stat, p_value = stats.ttest_rel(before, after)
print(f"Weight loss t-statistic: {t_stat:.4f}")
print(f"Weight loss p-value: {p_value:.4f}")
3. 单样本 t 检验(与已知值比较)
使用此函数将您的样本与已知总体值进行比较:
# Test if your class's test scores differ from the national average
national_avg = 72
your_class = np.array([75, 78, 71, 82, 74, 76, 73, 77, 79, 75])
# Run one-sample t-test
t_stat, p_value = stats.ttest_1samp(your_class, national_avg)
print(f"Difference from national average:")
print(f"T-statistic: {t_stat:.4f}")
print(f"P-value: {p_value:.4f}")
真实示例:A/B 测试分析
以下是分析网站重新设计的 A/B 测试的完整示例:
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
# Time spent on site (seconds) for old and new designs
old_design = np.array([45, 42, 39, 47, 41, 43, 40, 44, 38, 46,
41, 43, 39, 45, 42])
new_design = np.array([52, 48, 51, 47, 49, 50, 53, 47, 51, 48,
49, 53, 50, 48, 51])
# Run t-test
t_stat, p_value = stats.ttest_ind(old_design, new_design)
# Calculate means for reporting
old_mean = np.mean(old_design)
new_mean = np.mean(new_design)
difference = new_mean - old_mean
# Create visualization
plt.figure(figsize=(10, 6))
plt.boxplot([old_design, new_design], labels=['Old Design', 'New Design'])
plt.ylabel('Time on Site (seconds)')
plt.title('Website Design Comparison')
plt.show()
print(f"Old design average: {old_mean:.2f} seconds")
print(f"New design average: {new_mean:.2f} seconds")
print(f"Difference: {difference:.2f} seconds")
print(f"T-statistic: {t_stat:.4f}")
print(f"P-value: {p_value:.4f}")
此代码:
1. 分析用户参与度数据
2. 测试新设计是否有所作为
3. 创建视觉比较
4. 报告关键指标
常见的陷阱以及如何避免它们
样本量很重要
# Check if you have enough data
def check_sample_size(group1, group2):
if len(group1) < 30 or len(group2) < 30:
print("Warning: Small sample size may affect reliability")
print(f"Group 1 size: {len(group1)}")
print(f"Group 2 size: {len(group2)}")
2. 检查您的假设
# Test for normal distribution
from scipy import stats
def check_normality(data):
stat, p = stats.normaltest(data)
print(f"Normality test p-value: {p:.4f}")
if p < 0.05:
print("Data may not be normally distributed")
print("Consider using non-parametric tests")
将它们放在一起:完整的测试功能
这是一个结合了我们学到的所有内容的函数:
def run_complete_ttest(group1, group2, test_type='ind', group_names=None):
"""
Comprehensive t-test analysis
Parameters:
group1, group2: numpy arrays of data
test_type: 'ind' for independent, 'rel' for paired
group_names: tuple of strings for group labels
"""
if group_names is None:
group_names = ('Group 1', 'Group 2')
# Check sample sizes
print("\nSample Size Check:")
check_sample_size(group1, group2)
# Check normality
print(f"\nNormality Check for {group_names[0]}:")
check_normality(group1)
print(f"\nNormality Check for {group_names[1]}:")
check_normality(group2)
# Run appropriate t-test
if test_type == 'ind':
t_stat, p_value = stats.ttest_ind(group1, group2)
else:
t_stat, p_value = stats.ttest_rel(group1, group2)
# Calculate effect size (Cohen's d)
effect_size = (np.mean(group1) - np.mean(group2)) / np.sqrt(
(np.std(group1) ** 2 + np.std(group2) ** 2) / 2)
# Print results
print("\nResults:")
print(f"T-statistic: {t_stat:.4f}")
print(f"P-value: {p_value:.4f}")
print(f"Effect size: {effect_size:.4f}")
# Create visualization
plt.figure(figsize=(10, 6))
plt.boxplot([group1, group2], labels=group_names)
plt.ylabel('Values')
plt.title('Group Comparison')
plt.show()
return t_stat, p_value, effect_size
# Example usage:
data1 = np.array([85, 88, 92, 78, 90, 87, 86, 89, 91, 84])
data2 = np.array([79, 82, 85, 75, 83, 80, 81, 84, 82, 78])
t_stat, p_value, effect = run_complete_ttest(
data1, data2,
group_names=('Treatment', 'Control')
)
结束语
T 检验是数据分析的基础。本指南介绍了基础知识,并提供了您可以立即开始使用的代码。记得:
- 为您的数据选择正确的 t 检验类型
- 检查您的假设
- 考虑样本量
- 查看效应大小,而不仅仅是 p 值
本文暂时没有评论,来添加一个吧(●'◡'●)