def clean_year_dynamic(df, columns, factor=1.5):
q25 = df[columns].quantile(0.25)
q75 = df[columns].quantile(0.75)
iqr = q75 - q25
low = q25 - factor * iqr
high = q75 + factor * iqr
df[columns] = df[columns].clip(lower=low, upper=high)
return df
1️⃣Определение квартилей (25-й и 75-й)
q25 = df[columns].quantile(0.25)
q75 = df[columns].quantile(0.75)
➖Здесь quantile(0.25) находит первый квартиль (Q1), то есть значение, ниже которого находится 25% всех данных.
➖quantile(0.75) находит третий квартиль (Q3), то есть значение, ниже которого находится 75% всех данных.
➖Эти два квартиля помогают определить межквартильный размах (IQR), который является мерой разброса данных.
2️⃣Расчет интерквартильного размаха (IQR)
iqr = q75 - q25
➖IQR (interquartile range) — это разница между третьим квартилем (Q3) и первым квартилем (Q1). Это показывает диапазон значений, в котором находится 50% всех данных (между 25%-й и 75%-й процентилями).
➖IQR используется для выявления выбросов: данные, которые находятся далеко от этого диапазона, считаются выбросами.
3️⃣Определение границ для выбросов
low = q25 - 1.5 * iqr
high = q75 + 1.5 * iqr
Теперь мы вычисляем границы для выбросов:
➖Нижняя граница (low): все значения ниже этой границы считаются выбросами.
➖Верхняя граница (high): все значения выше этой границы считаются выбросами.
Границы определяются как
➖Q1−1.5×IQR (для нижней границы)
➖Q3+1.5×IQR (для верхней границы)
Величина 1.5 является стандартным множителем для IQR, который обычно используется для определения выбросов.
4️⃣Обрезка данных (Clip)
df[columns] = df[columns].clip(lower=low, upper=high)
➖Метод clip используется для ограничения значений в пределах заданных границ. Все значения ниже low заменяются на low, а все значения выше high заменяются на high.
➖Это означает, что значения, которые ранее считались выбросами (как меньше нижней границы или больше верхней), будут заменены на допустимые значения (на минимальное или максимальное значение из допустимого диапазона).
5️⃣Возврат очищенного DataFrame
return df
➖Функция возвращает DataFrame, где выбросы были заменены на допустимые значения (или обрезаны).
Пример
Предположим, что у нас есть следующий набор данных:
df = pd.DataFrame({'year': [2000, 2001, 2005, 2025, 3000]})
После применения этой функции, если для столбца year квартильные значения будут такими:
Q1=2001
Q3=2025
IQR=2025−2001=24
Нижняя граница = 2001−1.5×24=1953
Верхняя граница = 2025+1.5×24=2073
Значение 3000 будет заменено на 2073, так как оно выходит за пределы верхней границы.