Привет, Хабр!
Когда проходит собес на позицию аналитика данных, одна из важных проверок - это знания по статистике. Компании хотят убедиться, что вы понимаете статистику и умеете применять ее на практике для принятия решений на основе данных.
В статье рассмотрим кратко три темы по статистике, которые часто задают на собеседованиях.
Критерии биномиального распределения
Биномиальное распределение - это одно из фундаментальных распределений в статистике. Оно описывает число успехов в серии независимых испытаний, каждое из которых имеет два возможных исхода: успех или неудача.
Для применения биномиального распределения должны быть выполнены эти критерии:
-
Фиксированное число испытаний n
Кол-во испытаний должно быть фиксированным и заранее определенным. Например, если монетка бросается 10 раз, то n = 10.
-
Независимость испытаний
Исход каждого испытания не должен зависеть от исходов других испытаний. Например, результаты бросков монеты не зависят друг от друга: вероятность выпадения орла не меняется от броска к броску.
-
Два возможных исхода
Каждое испытание должно иметь два взаимно исключающих исхода. В контексте статистики это называют успехом и неудачей. Например, при броске монеткиисходами могут быть "орел" успехом или "решка" неудачей.
-
Постоянная вероятность успеха p
Вероятность успеха p должна оставаться постоянной для каждого испытания. Например, вероятность выпадения орла при каждом броске монеты остаётся 0.5, если монета честная.
Выбросы и методы их выявления
Выбросы — это данные, которые значительно отклоняются от других наблюдаемых значений в наборе данных. Они могут возникать по разным причинам: ошибки измерений, необычные условия или редкие события. Выбросы могут очень повлиять на результаты статистического анализа, исказив общие статистики.
Существует несколько методов выявления выбросов, которые могут использоваться в зависимости от природы данных и специфики анализа. Рассмотрим наиболее распространенные из них: z-оценка, интерквартильный размах (IQR) и визуализация (графики-боксы).
Метод z-оценки (z-score method)
Z-оценка показывает, насколько далеко (в стандартных отклонениях) находится каждое значение от среднего значения набора данных. Формула для расчета z-оценки:
где — значение данных, — среднее значение, а — стандартное отклонение. Обычно значения, превышающие 3 или менее -3, считаются выбросами, поскольку 99.7% данных в нормальном распределении находятся в пределах трёх стандартных отклонений от среднего.
Пример на Python:
import pandas as pd
data = {'score': [56, 65, 67, 74, 75, 42, 76, 63, 67, 85, 120]}
df = pd.DataFrame(data)
# расчет z-оценки
df['z_score'] = (df['score'] - df['score'].mean()) / df['score'].std()
# фильтрация выбросов
df_filtered = df[(df['z_score'] > -3) & (df['z_score'] < 3)]
Интерквартильный размах (IQR method)
IQR — это мера разброса данных, равная разнице между третьим и первым квартилями . Формула для расчета IQR:
Выбросами считаются значения, выходящие за пределы:
(нижний предел) и (верхний предел).
Пример на Python:
import numpy as np
data = {'score': [56, 65, 67, 74, 75, 42, 76, 63, 67, 85, 120]}
df = pd.DataFrame(data)
# расчет квартилей
Q1 = df['score'].quantile(0.25)
Q3 = df['score'].quantile(0.75)
IQR = Q3 - Q1
# определение границ выбросов
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
# фильтрация выбросов
df_filtered = df[(df['score'] >= lower_bound) & (df['score'] <= upper_bound)]
Визуализация (графики-боксы)
Графики-боксы предоставляют визуальный способ обнаружения выбросов. На графике-боксе выбросы отображаются как точки за пределами "усов", которые представляют собой диапазон данных, не включающий выбросы.
Пример на Python:
import seaborn as sns
import matplotlib.pyplot as plt
# Пример данных
data = {'score': [56, 65, 67, 74, 75, 42, 76, 63, 67, 85, 120]}
df = pd.DataFrame(data)
# Построение графика-бокса
sns.boxplot(x=df['score'])
plt.title('Box Plot of Scores')
plt.show()
Центральная предельная теорема
Центральная предельная теорема утверждает, что при достаточно большом размере выборки распределение среднего значения выборки будет приближаться к нормальному распределению, независимо от формы исходного распределения данных. Формально, если — это независимые и одинаково распределенные случайные величины с конечным средним и дисперсией , то распределение стандартизированного среднего будет приближаться к стандартному нормальному распределению при увеличении размера выборки .
ЦПТ позволяет использовать нормальное распределение для различных статистических методов даже тогда, когда исходные данные не нормальны.
При большом размере выборки среднее значение выборки становится точной оценкой среднего значения генеральной совокупности.
ЦПТ позволяет строить доверительные интервалы для среднего значения генеральной совокупности на основе выборочного среднего и стандартной ошибки. Например, для достаточно большой выборки можно использовать формулу:
где — среднее значение выборки, — критическое значение для заданного уровня доверия (например, 1.96 для 95% доверительного интервала), — стандартное отклонение, и — размер выборки.
Для иллюстрации центральной предельной теоремы, напишем код, который показывает, как распределение выборочных средних приближается к нормальному распределению по мере увеличения размера выборки:
import numpy as np
import matplotlib.pyplot as plt
# параметры
population_mean = 50
population_std_dev = 10
sample_size = 30 # размер выборки для демонстрации ЦПТ
num_samples = 1000 # количество выборок
# генерация случайной выборки из нормального распределения
population = np.random.normal(loc=population_mean, scale=population_std_dev, size=100000)
# вычисление средних значений выборок
sample_means = [np.mean(np.random.choice(population, sample_size)) for _ in range(num_samples)]
# Ввзуализация гистограммы выборочных средних
plt.figure(figsize=(10, 6))
plt.hist(sample_means, bins=30, edgecolor='k', alpha=0.7)
plt.title('Гистограмма выборочных средних (n = {})'.format(sample_size))
plt.xlabel('Среднее значение выборки')
plt.ylabel('Частота')
plt.axvline(np.mean(sample_means), color='r', linestyle='dashed', linewidth=2)
plt.axvline(population_mean, color='g', linestyle='dashed', linewidth=2)
plt.legend(['Среднее значение выборок', 'Среднее значение популяции'])
plt.show()
# проверка нормальности распределения выборочных средних
from scipy.stats import normaltest
stat, p_value = normaltest(sample_means)
print('Статистика теста на нормальность: {:.3f}, p-значение: {:.3f}'.format(stat, p_value))
if p_value > 0.05:
print('Распределение выборочных средних нормально (не отвергаем H0)')
else:
print('Распределение выборочных средних не нормально (отвергаем H0)')
Статистика теста на нормальность: 0.689, p-значение: 0.708
Распределение выборочных средних нормально (не отвергаем H0)
Python один из самых популярных языков программирования, который используется во многих сферах, в том числе для анализа данных. Хочу порекомендовать вам бесплатный вебинар про основы Python.
Комментарии (6)
mrgervant
18.06.2024 11:56+4На мой взгляд, ещё критичным вопросом начинающему аналитику должен быть "Отличия корреляции от причинно-следственной связи". Чтобы он потом не только красивые цифры и графики выводил, а и действительно правильные выводы из них делал
CrazyElf
18.06.2024 11:56Ну это вообще непростой вопрос. И не всегда имеется достаточно данных, чтобы этот вопрос решить на практике.
Flokis_guy
18.06.2024 11:56В каких-то простых и бредовых гипотетических сценариях ответить на этот вопрос не составит труда, так сказать вспоминаем мем про мужей. К тому же ряд подобных вопросов покажет обобщающую способность кандидата к предметной области.
muxa_ru
18.06.2024 11:56+2На мой взгляд, ещё критичным вопросом начинающему аналитику должен быть "Отличия корреляции от причинно-следственной связи".
Вы ещё скажите, что аналитик должен задаваться вопросом о том, имеет ли полученный им результат хоть какой-либо физический смысл.
А может Вы ещё захотите, чтобы "оператор скармливания данных скрипту на Питоне" задавался вопросом о том, имеют ли обрабатываемые данные метрологическую совместимость?
Andrey_Solomatin
18.06.2024 11:56+1В статье рассмотрим кратко три темы по статистике, которые часто задают на собеседованиях.
"часто задают" хорошо смотрится в контексте разговоров о статистике.
CrazyElf
Условие
(df['z_score'] > -3) & (df['z_score'] < 3)
можно более просто и красиво записать какdf['z_score'].abs() < 3