# funnel_log - лог с данными воронок
# diffs - набор воронок, которые сравниваются с эталонной. Например, если diff = [0.7], то c эталонной воронкой будет сравниваться воронка, имеющая 30% отличие от эталонной
# sample_size - размер выборок, формируемых в каждом из экспериментов
# number_of_experiments - число экспериментов для каждой из воронок
# alpha - уровень значимости
# test_func - функция, описывающая набор статистических тестов, которые проводятся в каждом из экспериментов
# result_column_names - словарь человеко-читаемых названий колонок с результатами экспериментов
# compare_func - функция, служащая для сравнения p-value в каждом из экспериментов с уровнем значимости
# levels - линии уровня на карте ошибок
# color_map - цвета для отображения уровней ошибок
# filename_template - шаблон имени файлов, в которые будут записаны результаты экспериментов
def run_error_experiments(funnel_log, diffs, sample_size, number_of_experiments, alpha, test_func, result_column_names, compare_func, levels, color_map, suptitle, filename_template):
# проверяем наличие более ранних рассчетов
existing_result_files = [f for f in os.listdir('.') if re.match(filename_template, f)]
if len(existing_result_files) > 0:
# если результаты более ранниз рассчетов найдены, то просто читаем их
result = pd.read_csv(filename_template + '_result.csv')
errors = pd.read_csv(filename_template + '_errors.csv')
else:
# если нет - считаем все заново
result = []
errors = []
for funnel_num in funnel_log['funnel_num'].unique():
# A-воронка
current_funnel_log = funnel_log.query('funnel_num == @funnel_num and diff == 1')
current_funnel_log['group'] = 0
# последовательно формируем B-воронки с разной степенью отличия от исходной
for i, diff in enumerate(diffs):
current_funnel_log_another = funnel_log.query('funnel_num == @funnel_num and diff == @diff')
current_funnel_log_another['group'] = i + 1
current_funnel_log = current_funnel_log.append(current_funnel_log_another)
# для каждой пары проводим эксперимент
current_exp_results, current_exp_errors = run_experiment(current_funnel_log,
sample_size = sample_size,
number_of_experiments = number_of_experiments,
alpha = alpha,
test_func = test_func,
compare_func = compare_func
)
# собираем разультаты в единый массив
result += [[funnel_num, current_funnel_log['first_step_prob'].max(), current_funnel_log['second_step_prob'].max()] + current_exp_results]
errors += [[funnel_num, current_funnel_log['first_step_prob'].max(), current_funnel_log['second_step_prob'].max(), current_exp_errors]]
result = pd.DataFrame(result, columns = ['funnel_num', 'first_step_prob', 'second_step_prob'] + list(result_column_names.keys()))
errors = pd.DataFrame(errors, columns = ['funnel_num', 'first_step_prob', 'second_step_prob', 'errors'])
# сохраняем результаты рассчетов в файлы
result.to_csv(filename_template + '_result.csv', index = False)
errors.to_csv(filename_template + '_errors.csv', index = False)
# визуализация
plt.figure(figsize = (30, 7))
for i, col in enumerate(result_column_names.keys()):
show_contour(result, 'first_step_prob', 'second_step_prob', col, levels, ax = plt.subplot(1, len(result_column_names), i + 1), title = result_column_names[col])
plt.suptitle(suptitle)
plt.show()
return result, errors
Кто-то это смог прочитать целиком?
В какой-то момент решил, что мне оно не нужно даже, чтобы вникать, и на всякий случай посмотрел на дтфе я или хабре.
В какой-то момент решил, что мне оно не нужно даже, чтобы вникать, и на всякий случай посмотрел на дтфе я или хабре.
Тест χ² — очень полезный аналитический инструмент, который тем не менее часто вызывает у аналитиков недопонимание и путаницу. Если ты ничего не понял - значит ты Аналитик
пиздец.... Но утешаю себя тем, что все в чём-то неучи.
Как хоть это "χ²" произносится?
хи-квадрат
глупость какая-то и ошибки.
Во первых, test of homogeneity, он же goodness of fit как утверждает, автор - это два разных теста.
Во- вторых это все делается двумя строчками кода, а не тем полотном, что здесь расписано.
В третьих, пост - пример, как НЕ Надо делать тестирования и писать код.
Походу рофл какой-то.
Не могут же этот ужас на самом деле юзать.