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

Что такое imputation и какие методы импутации вы знаете?

2.0 Middle🔥 151 комментариев
#Pandas и обработка данных

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

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

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

Imputation: Методы Обработки Пропущенных Данных

Imputation (импутация) — это процесс заполнения пропущенных значений в датасете. Пропущенные данные — серьёзная проблема, которая может привести к смещению анализа, неправильным выводам и потере ценной информации. Выбор метода импутации зависит от механизма пропусков и характера данных.

Причины Пропущенных Данных

  • MCAR (Missing Completely At Random) — пропуски никак не связаны с другими переменными
  • MAR (Missing At Random) — пропуски зависят от известных переменных, но не от самой переменной
  • MNAR (Missing Not At Random) — пропуски связаны с самой переменной (самая сложная)

1. Удаление Пропущенных Данных (Deletion)

Listwise Deletion (удаление строк с пропусками):

import pandas as pd

# Удалить все строки с хотя бы одним пропуском
df_clean = df.dropna()

# Удалить строки с пропусками в конкретной колонке
df_clean = df.dropna(subset=[age, income])

Плюсы:

  • Просто реализовать
  • Сохраняет целостность данных

Минусы:

  • Может потерять 50%+ данных
  • Смещение, если пропуски неслучайны (MNAR)
  • Не рекомендуется, если пропусков > 5-10%

SQL-альтернатива:

SELECT * FROM users
WHERE age IS NOT NULL
  AND income IS NOT NULL
  AND country IS NOT NULL;

2. Статистическая Импутация (Mean/Median/Mode)

Mean Imputation (заполнение средним значением):

df[age].fillna(df[age].mean(), inplace=True)

Median Imputation (заполнение медианой) — лучше для выбросов:

df[income].fillna(df[income].median(), inplace=True)

Mode Imputation (для категориальных данных):

df[country].fillna(df[country].mode()[0], inplace=True)

Плюсы:

  • Быстро и просто
  • Сохраняет размер датасета

Минусы:

  • Снижает дисперсию и корреляции
  • Не учитывает зависимости между переменными
  • Неестественные значения (например, 0.5 ребёнка в семье)

3. Forward Fill / Backward Fill (для временных рядов)

Forward Fill — берёшь последнее известное значение:

df[stock_price].fillna(method=ffill, inplace=True)

Backward Fill — берёшь следующее известное значение:

df[stock_price].fillna(method=bfill, inplace=True)

Применение: Временные ряды, данные о ценах, логи активности

4. Group-Based Imputation (по группам)

Заполняй средним значением группы, а не всего датасета:

df[income] = df.groupby(city)[income].transform(
    lambda x: x.fillna(x.mean())
)

Это лучше, чем глобальное среднее, потому что учитывает контекст.

5. KNN Imputation (ближайшие соседи)

Находишь K ближайших соседей по другим параметрам и берёшь среднее их значений:

from sklearn.impute import KNNImputer

imputer = KNNImputer(n_neighbors=5)
df_imputed = pd.DataFrame(
    imputer.fit_transform(df),
    columns=df.columns
)

Плюсы:

  • Учитывает сходство между записями
  • Сохраняет структуру данных

Минусы:

  • Медленнее (O(n²))
  • Требует выбора K

6. Multiple Imputation (множественная импутация)

Создаёшь несколько заполненных версий датасета и усредняешь результаты:

from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer

imputer = IterativeImputer(max_iter=10, random_state=42)
df_imputed = pd.DataFrame(
    imputer.fit_transform(df),
    columns=df.columns
)

Плюсы:

  • Учитывает неуверенность в импутации
  • Статистически более корректно

Минусы:

  • Вычислительно затратно
  • Требует больше памяти

7. Model-Based Imputation (машинное обучение)

Тренируешь модель предсказать пропущенные значения:

from sklearn.ensemble import RandomForestRegressor

# Выбираем строки, где есть значение в целевой колонке
df_train = df[df[age].notna()]

# Тренируем модель на известных значениях
X = df_train[[income, education, city]]
y = df_train[age]

model = RandomForestRegressor()
model.fit(X, y)

# Предсказываем пропущенные значения
df_missing = df[df[age].isna()]
df.loc[df[age].isna(), age] = model.predict(
    df_missing[[income, education, city]]
)

Плюсы:

  • Самый точный метод
  • Учитывает сложные зависимости

Минусы:

  • Требует качественного датасета для обучения
  • Риск переобучения
  • Медленнее

8. SQL-подход: COALESCE и Window Functions

Простое заполнение:

SELECT
    user_id,
    COALESCE(age, AVG(age) OVER ()) as age,
    COALESCE(income, MEDIAN(income) OVER ()) as income
FROM users;

По группам:

SELECT
    user_id,
    city,
    COALESCE(
        age,
        AVG(age) OVER (PARTITION BY city)
    ) as age
FROM users;

Как Выбрать Метод?

СитуацияМетодПричина
Пропусков < 5%УдалениеБезопасно
Случайные пропуски (MCAR)Mean/MedianБыстро и просто
Временной рядForward FillЛогично для временных данных
Есть похожие записиKNNУчитывает соседей
Нужна точностьModel-BasedСамый точный
Важна неуверенностьMultiple ImputationСтатистически корректно

Практические Рекомендации

  1. Всегда анализируй паттерны пропусков — используй визуализацию
  2. Документируй выбор метода — объясни почему ты выбрал именно это
  3. Проверяй результаты — сравни распределения до и после
  4. Будь осторожен с MNAR — может потребоваться экспертное мнение
  5. Не импутируй целевую переменную — работай только с фичами

Выбор метода импутации критически влияет на качество анализа и модели. Всегда думай о природе пропусков и выбирай метод с этим в виду.