首页 > 解决方案 > Python中的动态功率计算

问题描述

我设法在 R 中翻译了以下函数:

p=pwr.2p2n.test(
h=ES.h(conversion_rate_test, conversion_rate_control), 
n1=total_group_size*(1-holdout), 
n2=total_group_size*holdout, 
sig.level=0.1, 
alternative="two.sided")

进入 Python:

import statsmodels.stats.api as sms     
es = sms.proportion_effectsize(conversion_rate_test, conversion_rate_control)
sms.NormalIndPower().solve_power(es, nobs1=n1, alpha=alpha, ratio=n2/n1, alternative='two-sided')

但是,Python 中用于计算的所有输入现在都是硬编码的:

lift = 0.01
conversion_rate_control = 0.151169
conversion_rate_test = conversion_rate_control*(1+lift)
holdout = 0.01
n1 = 38820.0*(1-holdout)
n2 = 38820.0*holdout
cl = 0.9
alpha = 1-cl

计算有效,但需要根据以下数组而不是编码值动态完成:

# providing arrays of values for future heatmap
holdout=np.array([0.01, 0.02, 0.03, 0.04, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5])
lift=np.array([0.01, 0.02, 0.025, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1, 0.125, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4])

因此,我的目标是构建以下热图:

在此处输入图像描述

Python 中的当前计算在热图左下角的单元格中生成输出。

请帮我把它取下来,提前谢谢你!

标签: pythonstatistics

解决方案


它与 R 非常相似,首先我们制作一个 data.frame 来捕获holdout / lift 的组合,以及一个用于测试的函数:

import pandas as pd
import itertools
import numpy as np
import statsmodels.stats.api as sms
import seaborn as sns

def expand_grid(data_dict):
    rows = itertools.product(*data_dict.values())
    return pd.DataFrame.from_records(rows, columns=data_dict.keys())

def test(holdout,lift):
    conversion_rate_control = 0.151169
    conversion_rate_test = conversion_rate_control*(1+lift)
    es = sms.proportion_effectsize(conversion_rate_test, conversion_rate_control)
    n1 = 38820.0*(1-holdout)
    n2 = 38820.0*holdout
    cl = 0.9
    alpha = 1-cl
    return sms.NormalIndPower().solve_power(es, nobs1=n1, alpha=alpha, ratio=n2/n1, alternative='two-sided')

holdout=np.array([0.01, 0.02, 0.03, 0.04, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5])
lift=np.array([0.01, 0.02, 0.025, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1, 0.125, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4])

df = expand_grid({'holdout':holdout,'lift':lift})

力量,基本上是按行应用函数:

df['power'] = df.apply(lambda x:test(x[0],x[1]),axis=1)

然后我们通过传入一个 pivot_wide data.frame 进行绘图:

fig, ax = plt.subplots(figsize = (13,6))
ax = sns.heatmap(data=df.pivot(index='lift',columns='holdout',values='power'),
            annot=True,cmap="inferno")
fig.axes[0].invert_yaxis()
plt

在此处输入图像描述


推荐阅读