学术圈疯传:Python也能导出显著性差异到Excel ,多简单?

文摘   2024-11-03 09:00   英国  
平均值、方差和显著性分析是科研论文中最常用的统计分析方法,用于描述数据的集中趋势、数据分布的离散程度,以及不同分组间是否存在显著差异。这些方法帮助研究者量化数据特性,是科学研究中重要的统计工具。Python虽然在基础统计方面不如R语言简洁,但在机器学习、数据可视化等领域潜力巨大。因此,熟练掌握Python进行这些基础统计分析,为进一步的研究打下坚实基础。

一、什么是平均值?

平均值(Mean)用于表示一组数据的集中趋势,即数据的“中心”。常见的计算方法是将数据加总再除以数据个数,计算公式为:
Mean=𝑥𝑛
这里,x𝑥为数据值,n𝑛为数据点总数。
应用条件:适用于数值型数据,尤其是正态分布数据,但对于极端值较多的偏态分布数据,均值可能会偏离数据的真实中心。

二、什么是方差?

方差(Variance)用来表示数据的离散程度,描述每个数据点与平均值的偏离情况。它通过计算每个数据点与均值差值的平方和,再除以数据点个数来衡量,公式为:
方差越大,说明数据越分散;方差越小,数据越集中。
应用条件:一般要求数据正态分布,且对于多组比较分析,方差分析的前提是各组数据的方差相等(方差齐次性)。

三、什么是显著性分析?

显著性分析(Significance Testing)用来判断不同分组之间是否存在显著差异。常见方法包括t检验、单因素方差分析(ANOVA)和事后检验。单因素方差分析用于比较多个组别的均值差异,但无法说明具体哪些组之间存在差异,因此需要进行事后检验(Post hoc test)。
常见的事后检验方法: 
Tukey HSD检验:用于样本量相等且满足方差齐次性。 
Dunnett检验:用来比较多个组别与一个对照组的均值。 
Student’s t检验:用于成对比较(两组之间),适合小样本量。

四、Python代码实现

接下来,我们将使用Python代码完成这三项分析,并使用iris数据集进行示例。

1. 导入数据和必要库

import pandas as pd
import numpy as np
from sklearn import datasets
from scipy.stats import f_oneway, levene
from statsmodels.stats.multicomp import pairwise_tukeyhsd
import matplotlib.pyplot as plt
import seaborn as sns

# 加载 iris 数据集
iris = datasets.load_iris()
df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
df['species'] = iris.target
df['species'] = df['species'].map({0: 'setosa', 1: 'versicolor', 2: 'virginica'})

2. 计算平均值和方差

按鸢尾花品种分组,计算花萼长度的均值和方差:
# 计算平均值和方差
mean_var_df = df.groupby('species')['sepal length (cm)'].agg(['mean', 'var'])
print("平均值和方差:\n", mean_var_df)
## 平均值和方差:
## mean var
## species
## setosa 5.006 0.124249
## versicolor 5.936 0.266433
## virginica 6.588 0.404343
# 提取每种花的花萼长度
setosa_sepal_length = df[df['species'] == 'setosa']['sepal length (cm)']
versicolor_sepal_length = df[df['species'] == 'versicolor']['sepal length (cm)']
virginica_sepal_length = df[df['species'] == 'virginica']['sepal length (cm)']

3. 单因素方差分析(ANOVA)

# 进行方差分析(ANOVA)
f_stat, p_value = f_oneway(setosa_sepal_length, versicolor_sepal_length, virginica_sepal_length)
print(f"F值:{f_stat}, P值:{p_value}")
## F值:119.26450218450468, P值:1.669669190769382e-31
# 判断显著性
if p_value < 0.05:
print("不同品种间花萼长度差异显著")
else:
print("不同品种间花萼长度差异不显著")
## 不同品种间花萼长度差异显著

4. 事后检验(Tukey HSD)

为了进一步确定具体哪些组之间存在显著差异,我们使用Tukey HSD检验进行多重比较。
# 进行 Tukey HSD 检验
tukey_result = pairwise_tukeyhsd(df['sepal length (cm)'], df['species'], alpha=0.05)
print(tukey_result)
## Multiple Comparison of Means - Tukey HSD, FWER=0.05
## =========================================================
## group1 group2 meandiff p-adj lower upper reject
## ---------------------------------------------------------
## setosa versicolor 0.93 0.0 0.6862 1.1738 True
## setosa virginica 1.582 0.0 1.3382 1.8258 True
## versicolor virginica 0.652 0.0 0.4082 0.8958 True
## ---------------------------------------------------------

5. 导出数据到Excel

将平均值和方差结果导出为Excel,以方便分享和记录。
# 导出平均值和方差结果到Excel
mean_var_df.to_excel("iris_mean_variance.xlsx", sheet_name="Mean_Variance")
print("数据成功导出到 'iris_mean_variance.xlsx'")
## 数据成功导出到 'iris_mean_variance.xlsx'

6. 可视化组间显著性差异

我们使用柱状图展示不同品种的花萼长度均值,并在柱状图上标注均值±标准差的上下区间范围,添加显著性差异结果。
# 设置绘图风格
plt.figure(figsize=(8, 6))
sns.barplot(data=df, x='species', y='sepal length (cm)', capsize=0.2, ci="sd")
plt.title("Mean Sepal Length of Iris Species")
plt.ylabel("length (cm)")

# 添加均值和标准差范围标注
for i, species in enumerate(df['species'].unique()):
mean = df[df['species'] == species]['sepal length (cm)'].mean()
std = df[df['species'] == species]['sepal length (cm)'].std()
plt.text(i, mean + std + 0.1, f"{mean:.2f}±{std:.2f}", ha='center', color='black')

# 添加显著性标记
# 使用事后检验结果决定标记显著性
pairs = [('setosa', 'versicolor'), ('setosa', 'virginica'), ('versicolor', 'virginica')]
p_vals = tukey_result.pvalues
significance_levels = ['*' if p < 0.05 else '' for p in p_vals]

# 标注显著性
for (i, pair), signif in zip(enumerate(pairs), significance_levels):
if signif:
plt.plot([i, i + 1], [df['sepal length (cm)'].max() + 0.3] * 2, lw=1.5, color='black')
plt.text(i + 0.5, df['sepal length (cm)'].max() + 0.35, signif, ha='center', color='black')

plt.show()

五、总结

今天的更新详细介绍了平均值、方差和显著性分析的定义、计算方法和应用条件,使用Python进行平均值、方差计算,检查齐次性并进行显著性分析和事后检验,最终将结果可视化为柱状图并标注显著性差异。这些基础统计方法在科学研究中必不可少,是理解数据的关键。
感谢关注,你的支持是我不懈的动力!

科研代码
专注R和Python的数据分析。
 最新文章