Untitled
unknown
plain_text
3 years ago
2.4 kB
13
Indexable
def z_test(group1, group2, alpha=0.05):
event_list = event_funnel_by_group['event_name'].unique()
for event in event_list:
successes = np.array([event_funnel_by_group.loc[event_funnel_by_group['event_name'] == event, group1].values[0],
event_funnel_by_group.loc[event_funnel_by_group['event_name'] == event, group2].values[0]])
trials = np.array([event_funnel_by_group.loc[event_funnel_by_group['event_name'] == event, group1]\
.values[0] + event_funnel_by_group.loc[event_funnel_by_group['event_name'] == event, group2]\
.values[0],
event_funnel_by_group.loc[event_funnel_by_group['event_name'] == event, group1]\
.values[0] + event_funnel_by_group.loc[event_funnel_by_group['event_name'] == event, group2]\
.values[0]])
# пропорция успехов в первой группе:
p1 = successes[0] / trials[0]
# пропорция успехов во второй группе:
p2 = successes[1] / trials[1]
# пропорция успехов в комбинированном датасете:
p_combined = (successes[0] + successes[1]) / (trials[0] + trials[1])
# разница пропорций в датасетах
difference = p1 - p2
# считаем статистику в ст.отклонениях стандартного нормального распределения
z_value = difference / mth.sqrt(p_combined * (1 - p_combined) * (1/trials[0] + 1/trials[1]))
# задаем стандартное нормальное распределение (среднее 0, ст.отклонение 1)
distr = st.norm(0, 1)
p_value = (1 - distr.cdf(abs(z_value))) * 2
print(f"Событие {event}: p-value {p_value:.3f}")
if p_value < alpha:
print('Отвергаем нулевую гипотезу: между долями есть значимая разница')
else:
print('Не получилось отвергнуть нулевую гипотезу, нет оснований считать доли разными')
print()
Editor is loading...