def _power_and_ttest(self, control_vals, exp_vals):
control_mean = statistics.mean(control_vals)
control_std = statistics.stdev(control_vals)
exp_mean = statistics.mean(exp_vals)
exp_std = statistics.stdev(exp_vals)
pooled_stddev = self._compute_pooled_stddev(
control_std, exp_std, control_vals, exp_vals)
power = 0
percent_diff = None
if control_mean != 0 and pooled_stddev != 0:
percent_diff = (control_mean - exp_mean) / float(control_mean)
effect_size = (abs(percent_diff) * float(control_mean)) / float(pooled_stddev)
power = smp.TTestIndPower().solve_power(
effect_size,
nobs1=len(control_vals),
ratio=len(exp_vals) / float(len(control_vals)),
alpha=self.ALPHA_ERROR, alternative='two-sided')
ttest_result = stats.ttest_ind(control_vals, exp_vals, equal_var=False)
p_val = ""
if len(ttest_result) >= 2 and not math.isnan(ttest_result[1]):
p_val = ttest_result[1]
mean_diff = exp_mean - control_mean
if p_val <= self.ALPHA_ERROR and mean_diff < 0:
significance = "Negative"
elif p_val <= self.ALPHA_ERROR and mean_diff > 0:
significance = "Positive"
else:
significance = "Neutral"
return {
"power": power,
"p_val": p_val,
"control_mean": control_mean,
"mean_diff": mean_diff,
"percent_diff": 0 if percent_diff is None else percent_diff * -100,
"significance": significance,
}
评论列表
文章目录