← Назад к вопросам

Как считал корреляцию с константой на проекте?

1.3 Junior🔥 131 комментариев
#Pandas и обработка данных#Опыт работы и проекты#Статистика и теория вероятностей

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как считать корреляцию с константой

Этот вопрос касается интересного статистического свойства корреляции. Рассказу о том, почему корреляция с константой специфична и как это влияет на практическую аналитику.

Формальное объяснение

Корреляция Пирсона между переменной X и константой C всегда неопределена или равна NaN (Not a Number). Вот почему:

import numpy as np
from scipy.stats import pearsonr

# Переменная с вариацией
x = np.array([1, 2, 3, 4, 5])
# Константа (никакой вариации)
c = np.array([10, 10, 10, 10, 10])

# Попытка считать корреляцию
corr, p_value = pearsonr(x, c)
print(f"Корреляция: {corr}")  # nan
print(f"P-value: {p_value}")   # nan

Математическая причина

Формула корреляции Пирсона:

r = Cov(X, Y) / (σ_X × σ_Y)

Где:

  • Cov(X, Y) — ковариация
  • σ — стандартное отклонение

Для константы C:

  • Стандартное отклонение σ_C = 0
  • Ковариация Cov(X, C) = 0 (нет совместной вариации)

Итог: 0 / 0 = undefined (неопределённость)

Практический код

import pandas as pd
import numpy as np

def safe_correlation(x, y):
    """Корреляция с проверкой на константу"""
    if np.std(x) == 0 or np.std(y) == 0:
        return None  # Или возвращаем 0
    return np.corrcoef(x, y)[0, 1]

# Пример
data = pd.DataFrame({
    'metric': [100, 150, 200, 250],
    'const_status': ['active', 'active', 'active', 'active'],  # All one value
    'real_var': [1, 2, 3, 4]
})

# Проверка
print(f"Корреляция с const_status: {safe_correlation(data['metric'], data['const_status'].map(hash))}")
# None — потому что переменная не имеет вариации

Как я это считал на проектах

1. Проверка перед вычислением

Всегда проверяю дисперсию обеих переменных:

def check_correlation_validity(x, y, min_std=0.0001):
    """Проверяет, имеет ли смысл считать корреляцию"""
    if np.std(x) < min_std:
        print(f"X имеет очень низкую вариацию: σ={np.std(x)}")
        return False
    if np.std(y) < min_std:
        print(f"Y имеет очень низкую вариацию: σ={np.std(y)}")
        return False
    return True

2. Фильтрация признаков в EDA

При анализе корреляционной матрицы удаляю постоянные признаки:

# Статистика по признакам
for col in df.columns:
    unique_count = df[col].nunique()
    if unique_count == 1:
        print(f"'{col}' — константа, удаляю из анализа")
        df = df.drop(col, axis=1)

# Теперь корреляция имеет смысл
corr_matrix = df.corr()

3. При работе с категориями

Если категория имеет только одно значение, преобразование в числа не спасает:

import pandas as pd

df = pd.DataFrame({
    'revenue': [1000, 1500, 2000],
    'category': ['A', 'A', 'A']  # Только одна категория
})

# Преобразуем в числа
df['category_encoded'] = pd.factorize(df['category'])[0]

# Корреляция всё равно не определена
corr = df['revenue'].corr(df['category_encoded'])
print(f"Корреляция: {corr}")  # nan

Реальные примеры из практики

Ситуация 1: Данные с ошибкой ETL

  • Весь трафик из одного источника
  • Все пользователи одного пола
  • Дата всегда одна

Это константы в данных — исключаю их из анализа.

Ситуация 2: Пересегментированные группы

Если в подвыборке (например, для одного региона) значение постоянно:

# Корреляция в Москве
moscow_data = df[df['city'] == 'Москва']

for col in moscow_data.columns:
    if moscow_data[col].nunique() == 1:
        print(f"В Москве '{col}' не варьируется - исключаю")

Обработка в исследованиях

Подход 1: Исключить константу

# Если столбец постоянный, удалить
variance = df.var()
df = df.loc[:, variance > 0]

Подход 2: Обработать NaN

# Если функция вернёт nan, заменить на 0
corr_matrix = df.corr().fillna(0)

Подход 3: Логировать и пропустить

try:
    corr = x.corr(y)
    if np.isnan(corr):
        print(f"Константа найдена")
except:
    print(f"Ошибка корреляции")

Ключевые выводы

  • ✅ Корреляция с константой всегда NaN/undefined
  • ✅ Проверяй дисперсию перед анализом
  • ✅ Удаляй постоянные признаки из EDA
  • ✅ В production коде обработай эту ситуацию
  • ✅ При фильтрации данных проверяй, не стала ли подвыборка константой

Это базовое, но важное свойство статистики, которое спасает от ошибок в анализе.