如何用Python添加AB实验显著性标注

数据管道

共 567字,需浏览 2分钟

 ·

2021-11-15 17:19

你们好,我是宝器!

在常规的实验统计分析过程中,我们经常需要在组间数据间添加显著性标注,而在统计学中,数据间的差异显著性检验则是统计假设检验的一种,是一种对组间数据或组内不同数据之间是否有差异以及差异是否明显判断方法。在R语言中,我们可以使用ggpupr包中stat_pvalue_manual()函数或者ggsignif包进行绘制。

今天,小编给大家带来的是如何使用Python-Seaborn进行显著性统计图表绘制,详细内容如下:

  • Python-Seaborn自定义函数绘制
  • Python-statannotations库添加显著性标注

Python-Seaborn 自定义函数绘制

我们可以通过自定义绘图函数的方式在统计图表中添加显著性标注,这里我们直接使用Seaborn自带的iris数据集进行绘制,具体内容如下:

自定义P值和星号对应关系

由于是完全的自定义,这里需要定义一个函数将P值结果和对应星号进行转化,代码如下:

def convert_pvalue_to_asterisks(pvalue):
    if pvalue <= 0.0001:
        return "****"
    elif pvalue <= 0.001:
        return "***"
    elif pvalue <= 0.01:
        return "**"
    elif pvalue <= 0.05:
        return "*"
    return "ns"

scipy.stats 计算显著性指标

由于scipy.stats部分中提供多种显著性检验方法,如T-testANOVA等,由于篇幅有限,这里只介绍scipy.stats.ttest_ind() t检验方法,详细结算过程如下:

iris = sns.load_dataset("iris")
data_p = iris[["sepal_length","species"]]
stat,p_value = scipy.stats.ttest_ind(data_p[data_p["species"]=="setosa"]["sepal_length"],
                                     data_p[data_p["species"]=="versicolor"]["sepal_length"],
                                     equal_var=False)

上述结果就将P值计算,然后再通过之前定义的convert_pvalue_to_asterisks函数进行转换,得到星号表示形式。

可视化绘制

这一步主要使用自定义的绘图方法进行显著性标注绘制,详细绘制代码如下:

plt.rcParams['font.family'] = ['Times New Roman']
plt.rcParams["axes.labelsize"] = 18
palette=['#0073C2FF','#EFC000FF','#868686FF']

fig,ax = plt.subplots(figsize=(5,4),dpi=100,facecolor="w")
ax = sns.barplot(x="species",y="sepal_length",data=iris,palette=palette,
                 estimator=np.mean,ci="sd", capsize=.1,errwidth=1,errcolor="k",
                 ax=ax,
                 **{"edgecolor":"k","linewidth":1})
# 添加P值
x1, x2 = 0, 1
y,h = data_p["sepal_length"].mean()+1,.2
#绘制横线位置
ax.plot([x1, x1, x2, x2], [y, y+h, y+h, y], lw=1, c="k"
#添加P值
ax.text((x1+x2)*.5, y+h, "T-test: "+ p_value_cov, ha='center', va='bottom', color="k")

ax.tick_params(which='major',direction='in',length=3,width=1.,labelsize=14,bottom=False)
for spine in ["top","left","right"]:
    ax.spines[spine].set_visible(False)
ax.spines['bottom'].set_linewidth(2)
ax.grid(axis='y',ls='--',c='gray')
ax.set_axisbelow(True)
Python-Seaborn 自定义显著性标注绘制

「注意」:这里由于是自定义绘制,在添加其他组间数据的显著性编著时也采用相同方法。

在涉及较多组之间绘制P值是有没有较为方便便捷的方法呢?下面小编介绍一个优秀的第三方拓展库进行绘制。

Python-statannotations库添加显著性标注

Python-statannotations库则是针对Seaborn绘图对象进行显著性标注的专用库,其可以提供柱形图箱线图小提琴图等统计图表的显著性标注绘制,计算P值方法基于scipy.stats方法,这里我们简单列举几个示例演示即可,更多详细内容可参看:Python-statannotations官网[1]

「样例一」

import seaborn as sns

from statannotations.Annotator import Annotator

df = sns.load_dataset("tips")
x = "day"
y = "total_bill"
order = ['Sun''Thur''Fri''Sat']
fig,ax = plt.subplots(figsize=(5,4),dpi=100,facecolor="w")
ax = sns.boxplot(data=df, x=x, y=y, order=order,ax=ax)

pairs=[("Thur""Fri"), ("Thur""Sat"), ("Fri""Sun")]
annotator = Annotator(ax, pairs, data=df, x=x, y=y, order=order)
annotator.configure(test='Mann-Whitney', text_format='star',line_height=0.03,line_width=1)
annotator.apply_and_annotate()

ax.tick_params(which='major',direction='in',length=3,width=1.,labelsize=14,bottom=False)
for spine in ["top","left","right"]:
    ax.spines[spine].set_visible(False)
ax.spines['bottom'].set_linewidth(2)
ax.grid(axis='y',ls='--',c='gray')
ax.set_axisbelow(True)
Example01 Of Python-statannotations plot make

「样例二」

import seaborn as sns
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = ['Times New Roman']
plt.rcParams["axes.labelsize"] = 18
#palette=['#0073C2FF','#EFC000FF']
palette=['#E59F01','#56B4E8']
#palette = ["white","black"]


fig,ax = plt.subplots(figsize=(5,4),dpi=100,facecolor="w")
ax = sns.barplot(x="order",y="value",hue="class",data=group_data_p,palette=palette,ci="sd",
                 capsize=.1,errwidth=1,errcolor="k",ax=ax,
                 **{"edgecolor":"k","linewidth":1})

# 添加P值
box_pairs = [(("one","type01"),("two","type01")),
             (("one","type02"),("two","type02")),
             (("one","type01"),("three","type01")),
             (("one","type02"),("three","type02")),
             (("two","type01"),("three","type01")),
             (("two","type02"),("three","type02"))]


annotator =  Annotator(ax, data=group_data_p, x="order",y="value",hue="class",
                      pairs=box_pairs)
annotator.configure(test='t-test_ind', text_format='star',line_height=0.03,line_width=1)
annotator.apply_and_annotate()
Example02 Of Python-statannotations plot make

当然,还可以设置灰色系颜色,如下:

Example02-2 Of Python-statannotations plot make

「样例三」如果针对组间数据进行统计分析,可以设置pairs参数据如下:

box_pairs = [(("one","type01"),("one","type02")),
             (("two","type01"),("two","type02")),
             (("three","type01"),("three","type02"))]
Example03 Of Python-statannotations plot make

其他比如抖动图、横向分组柱形图等,可视化结果如下:

抖动图显著性标注
横向分组柱形图显著性图外添加

更多使用方法和样例可参考文末参考资料~~

总结

本期的这篇推文,小编简单的介绍了如何使用Python绘制显著性标注统计图表,有自定义方法和优秀的第三方包方法,希望对使用Python绘制统计图表的小伙伴一些灵感~~

·················END·················

推荐阅读

  1. 我在字节做了哪些事

  2. 写给所有数据人。

  3. 从留存率业务案例谈0-1的数据指标体系

  4. 数据分析师的一周

  5. 超级菜鸟如何入门数据分析?


欢迎长按扫码关注「数据管道」

浏览 181
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报