Untitled

mail@pastecode.io avatar
unknown
plain_text
2 years ago
2.3 kB
1
Indexable
# сделаем короткий датасет для функции trials
data_group = logs_new.groupby('group')['device_id'].nunique().reset_index(name='total')
data_group.loc[3] = ['246+247', 4997]

def z_test(group1, group2, alpha):
    event_list = event_funnel_by_group['event_name'].unique()
    
    for event in event_list:
        successes1 = event_funnel_by_group.loc[event_funnel_by_group['event_name'] == event, group1].values[0]
        successes2 = event_funnel_by_group.loc[event_funnel_by_group['event_name'] == event, group2].values[0]
        
        trials1 = data_group.loc[data_group['group'] == group1, 'total'].values[0]
        trials2 = data_group.loc[data_group['group'] == group2, 'total'].values[0]

        print(event, "successes1: ", successes1, "successes2: ", successes2, "trials1: ", trials1, "trials2: ", trials2)
        
        # пропорция успехов в первой группе:
        p1 = successes1 / trials1

        # пропорция успехов во второй группе:
        p2 = successes2 / trials2

        # пропорция успехов в комбинированном датасете:
        p_combined = (successes1 + successes2) / (trials1 + trials2)

        # разница пропорций в датасетах
        difference = p1 - p2

        # считаем статистику в ст.отклонениях стандартного нормального распределения
        z_value = difference / mth.sqrt(p_combined * (1 - p_combined) * (1/trials1 + 1/trials2))

        # задаем стандартное нормальное распределение (среднее 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()