P-value для выброса зависит от используемого статистического теста для определения, является ли данное наблюдение выбросом. Существует несколько методов для выявления выбросов, и каждый метод имеет свои особенности и способы вычисления p-value.
Определяет, насколько далеко значение отклоняется от среднего в терминах стандартных отклонений. Если предположить нормальное распределение, можно вычислить 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}")
Используется для проверки гипотезы о наличии одного выброса в выборке, предположительно нормальной.
Формула:
\[ 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}")
Не предполагает распределения данных и прост в применении. Выбросы определяются как значения, выходящие за пределы 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 для выброса зависит от используемого метода выявления выбросов:
Выбор метода зависит от характеристик данных и требований к точности анализа.