📌 Чему равно p-value для выброса ?



💬 Спрашивают в 14% собеседований



P-value для выброса зависит от используемого статистического теста для определения, является ли данное наблюдение выбросом. Существует несколько методов для выявления выбросов, и каждый метод имеет свои особенности и способы вычисления p-value.



1️⃣ Z-оценка (Z-score)



Определяет, насколько далеко значение отклоняется от среднего в терминах стандартных отклонений. Если предположить нормальное распределение, можно вычислить p-value для выброса.



Формула:

\[ Z = \frac{X - \mu}{\sigma} \]

где \(X\) — наблюдаемое значение, \(\mu\) — среднее значение выборки, \(\sigma\) — стандартное отклонение выборки.

import numpy as np

from scipy import stats



# Пример данных

data = np.array([10, 12, 12, 13, 12, 11, 13, 14, 12, 100]) # 100 подозрительный выброс



# Вычисление Z-оценки

mean = np.mean(data)

std = np.std(data)

z_scores = (data - mean) / std



# Вычисление p-value для выброса (например, для значения 100)

p_value = stats.norm.sf(np.abs(z_scores[-1])) * 2 # двусторонний тест



print(f"Z-оценка: {z_scores[-1]}")

print(f"P-значение: {p_value}")




2️⃣ Тест Граббса (Grubbs' test)



Используется для проверки гипотезы о наличии одного выброса в выборке, предположительно нормальной.



Формула:

\[ G = \frac{|\max(X_i) - \mu|}{\sigma} \]

где \(\max(X_i)\) — наибольшее значение в выборке, \(\mu\) — среднее значение выборки, \(\sigma\) — стандартное отклонение выборки.

import numpy as np

from scipy import stats



def grubbs_test(data):

n = len(data)

mean = np.mean(data)

std = np.std(data, ddof=1)

G = np.max(np.abs(data - mean)) / std

t_critical = stats.t.ppf(1 - 0.05 / (2 * n), n - 2)

G_critical = (n - 1) / np.sqrt(n) * np.sqrt(t_critical**2 / (n - 2 + t_critical**2))

return G, G_critical



# Пример данных

data = np.array([10, 12, 12, 13, 12, 11, 13, 14, 12, 100]) # 100 подозрительный выброс



# Проведение теста Граббса

G, G_critical = grubbs_test(data)

p_value = 1 - stats.t.cdf(G, len(data) - 2)



print(f"Статистика G: {G}")

print(f"Критическое значение G: {G_critical}")

print(f"P-значение: {p_value}")




3️⃣ Метод IQR (Interquartile Range)



Не предполагает распределения данных и прост в применении. Выбросы определяются как значения, выходящие за пределы 1.5*IQR от первого и третьего квартилей.

import numpy as np



# Пример данных

data = np.array([10, 12, 12, 13, 12, 11, 13, 14, 12, 100]) # 100 подозрительный выброс



# Вычисление IQR

Q1, Q3 = np.percentile(data, [25, 75])

IQR = Q3 - Q1

lower_bound = Q1 - 1.5 * IQR

upper_bound = Q3 + 1.5 * IQR



# Определение выбросов

outliers = data[(data < lower_bound) | (data > upper_bound)]



print(f"Нижняя граница: {lower_bound}")

print(f"Верхняя граница: {upper_bound}")

print(f"Выбросы: {outliers}")




P-value для выброса зависит от используемого метода выявления выбросов:



Z-оценка: Позволяет вычислить p-value для выброса, если данные нормально распределены.



Тест Граббса: Статистический тест для выявления одного выброса в нормально распределенной выборке.



Метод IQR: Непараметрический метод, не предполагающий распределения данных, но не предоставляет p-value.



Выбор метода зависит от характеристик данных и требований к точности анализа.



🔥 ТОП ВОПРОСОВ С СОБЕСОВ



🔒 База собесов | 🔒 База тестовых