1.6Kпросмотров
89.9%от подписчиков
5 января 2026 г.
Score: 1.7K
Анализ пропорций на Python Допустим, у нас есть гипотеза: "Клиенты, получающие зарплату на счёт в банке, в n раз чаще открывают вклады, чем остальные". И есть собранная из БД аналитическая витрина с полями: ▶️client_id - айди клиента
▶️salary_client - был ли клиент когда-либо зарплатным (да/нет)?
▶️any_deposit - открывал ли клиент хотя бы 1 вклад (да/нет)? ▶️during_salary - открыт ли хотя бы 1 вклад в то время, когда клиент был зарплатным (да/нет)? NULL - если клиент не был зарплатным. Проверяются подобные гипотезы через сравнение пропорций (z-тест). Алгоритм таков: 1️⃣Сначала надо разделить клиентов на 2 группы (зарплатные и незарплатные). То есть просто считаем кол-во да/нет в поле salary_client: import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from statsmodels.stats.proportion import proportions_ztest ######
#ИСТОЧНИК ДАННЫХ + СОЗДАНИЕ DF
###### group_counts = df['salary_client'].value_counts()
print(group_counts) 2️⃣Затем найти процент тех, кто открыл вклад в каждой группе. Для зарплатных клиентов надо найти соотношение during_salary (да) /salary_client (да) Для незарплатных: any_deposit (да) / salary_client (нет) На питоне это выглядит так: salary_group = df[df['salary_client'] == 'да']
non_salary_group = df[df['salary_client'] == 'нет']
salary_deposit_rate = (salary_group['during_salary'] == 'да').mean()
non_salary_deposit_rate = (non_salary_group['any_deposit'] == 'да').mean()
print(salary_deposit_rate)
print(non_salary_deposit_rate) 3️⃣И далее уже подключается статистика: нужно посчитать P-value, чтобы убедиться в стат значимости. salary_count = len(salary_group)
salary_deposit_count = (salary_group['during_salary'] == 'да').sum()
non_salary_count = len(non_salary_group)
non_salary_deposit_count = (non_salary_group['any_deposit'] == 'да').sum() c1 = np.array([salary_deposit_count, non_salary_deposit_count])
c2 = np.array([salary_count, non_salary_count]) stat, pval = proportions_ztest(c1, c2, alternative='larger') print(f"p-value: {pval}") 🟠Теперь что касательно интерпретации результатов. Если мы выяснили в п.2, что доля клиентов как-то заметно отличается (например, 55% против 25%), то имеет смысл считать p-value, потому что разница ощутима и надо проверить, не случайность ли это. Если p-value > 0.05, то такая разница может быть случайной и нет смысла на этом заострять внимание. Если p-value < 0.05, то, следовательно, всё наоборот.