Исчезни асимметрию: преобразующие приемы для специалистов по обработке и анализу данных
Преобразования данных позволяют специалистам по данным уточнять, нормализовать и стандартизировать необработанные данные в формате, пригодном для анализа. Эти преобразования — не просто процедурные шаги; они необходимы для смягчения систематических ошибок, устранения искаженных распределений и повышения надежности статистических моделей. В этой главе основное внимание будет уделено тому, как устранить искажения данных. Сосредоточив внимание на атрибутах «SalePrice» и «YearBuilt» из набора жилищных данных Эймса, вы увидите примеры положительных и отрицательных искаженных данных и способы нормализации их распределений с помощью преобразований.
Давайте начнем.
Обзор
Этот пост разделен на пять частей; они есть:
- Понимание асимметрии и необходимости трансформации
- Стратегии устранения положительной асимметрии
- Стратегии устранения негативной асимметрии
- Статистическая оценка преобразований
- Выбор правильного преобразования
Понимание асимметрии и необходимости трансформации
Асимметрия — это статистическая мера, которая описывает асимметрию распределения данных относительно среднего значения. Проще говоря, это указывает на то, скапливается ли основная часть данных на одной стороне шкалы, оставляя длинный хвост, простирающийся в противоположном направлении. При анализе данных вы можете столкнуться с двумя типами асимметрии:
- Положительная асимметрия: это происходит, когда хвост распределения расширяется в сторону более высоких значений, на правой стороне пика. Большинство точек данных сгруппированы в нижней части шкалы, что указывает на то, что, хотя большинство значений относительно низкие, есть несколько исключительно высоких значений. Атрибут SalePrice в наборе данных Эймса иллюстрирует положительную асимметрию, поскольку большинство домов продаются по более низким ценам, но небольшое количество продается по значительно более высоким ценам.
- Отрицательная асимметрия. И наоборот, отрицательная асимметрия возникает, когда хвост распределения растягивается в сторону меньших значений, на левой стороне пика. В этом сценарии данные концентрируются в верхней части шкалы, при этом меньшее количество значений переходит в более низкие числа. Функция YearBuilt в наборе данных Эймса является прекрасной иллюстрацией отрицательной асимметрии, предполагая, что, хотя большинство домов было построено в более поздние годы, меньшая часть датируется более ранними временами.
Чтобы лучше понять эти концепции, давайте визуализируем асимметрию.
# Import the necessary libraries
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
from scipy.stats import boxcox, yeojohnson
from sklearn.preprocessing import QuantileTransformer
# Load the dataset
Ames = pd.read_csv('Ames.csv')
# Calculate skewness
sale_price_skew = Ames['SalePrice'].skew()
year_built_skew = Ames['YearBuilt'].skew()
# Set the style of seaborn
sns.set(style='whitegrid')
# Create a figure for 2 subplots (1 row, 2 columns)
fig, ax = plt.subplots(1, 2, figsize=(14, 6))
# Plot for SalePrice (positively skewed)
sns.histplot(Ames['SalePrice'], kde=True, ax=ax[0], color='skyblue')
ax[0].set_title('Distribution of SalePrice (Positive Skew)', fontsize=16)
ax[0].set_xlabel('SalePrice')
ax[0].set_ylabel('Frequency')
# Annotate Skewness
ax[0].text(0.5, 0.5, f'Skew: {sale_price_skew:.2f}', transform=ax[0].transAxes,
horizontalalignment='right', color='black', weight='bold',
fontsize=14)
# Plot for YearBuilt (negatively skewed)
sns.histplot(Ames['YearBuilt'], kde=True, ax=ax[1], color='salmon')
ax[1].set_title('Distribution of YearBuilt (Negative Skew)', fontsize=16)
ax[1].set_xlabel('YearBuilt')
ax[1].set_ylabel('Frequency')
# Annotate Skewness
ax[1].text(0.5, 0.5, f'Skew: {year_built_skew:.2f}', transform=ax[1].transAxes,
horizontalalignment='right', color='black', weight='bold',
fontsize=14)
plt.tight_layout()
plt.show()
Для «SalePrice» график демонстрирует выраженное правостороннее распределение, что подчеркивает проблему асимметрии при анализе данных. Такие распределения могут усложнить прогнозное моделирование и затруднить понимание, что затрудняет получение точных выводов. Напротив, «YearBuilt» демонстрирует отрицательную асимметрию, где распределение показывает, что преобладают новые дома, а старые дома образуют длинный хвост слева.
Устранение асимметрии посредством преобразования данных — это не просто статистическая корректировка; это решающий шаг на пути к получению точных и действенных идей. Применяя преобразования, вы стремитесь смягчить последствия асимметрии, способствуя более надежному и интерпретируемому анализу. Этот процесс нормализации расширяет ваши возможности проводить значимые исследования данных, выходящие за рамки простого соблюдения статистических предварительных условий. Она подчеркивает вашу приверженность повышению ясности и полезности ваших данных, создавая основу для глубоких и эффективных результатов в ваших последующих исследованиях преобразования данных.
Начните свой проект с моей книги Руководство для начинающих по науке о данных. Он предоставляет учебники для самообучения с рабочим кодом.
Стратегии устранения положительной асимметрии
Чтобы бороться с положительным перекосом, вы можете использовать пять ключевых преобразований: логарифмическое преобразование, квадратный корень, преобразование Бокса-Кокса, преобразование Йео-Джонсона и квантильное преобразование. Каждый метод направлен на уменьшение асимметрии, повышая пригодность данных для дальнейшего анализа.
Преобразование журнала
Этот метод особенно подходит для данных, искаженных вправо, эффективно минимизируя крупномасштабные различия за счет естественного логарифма всех точек данных. Такое сжатие диапазона данных делает его более пригодным для дальнейшего статистического анализа.
# Applying Log Transformation
Ames['Log_SalePrice'] = np.log(Ames['SalePrice'])
print(f"Skewness after Log Transformation: {Ames['Log_SalePrice'].skew():.5f}")
Вы можете видеть, что асимметрия уменьшилась:
Skewness after Log Transformation: 0.04172
Преобразование квадратного корня
Более мягкий подход, чем преобразование журнала, идеально подходит для умеренно искаженных данных. Применяя квадратный корень к каждой точке данных, это уменьшает асимметрию и уменьшает влияние выбросов, делая распределение более симметричным.
# Applying Square Root Transformation
Ames['Sqrt_SalePrice'] = np.sqrt(Ames['SalePrice'])
print(f"Skewness after Square Root Transformation: {Ames['Sqrt_SalePrice'].skew():.5f}")
Это печатает:
Skewness after Square Root Transformation: 0.90148
Трансформация Бокса-Кокса
Обеспечивает гибкость за счет оптимизации параметра преобразования лямбда (λ), применимого только к положительным данным. Метод Бокса-Кокса систематически находит наилучшее степенное преобразование для уменьшения асимметрии и стабилизации дисперсии, повышая нормальность данных.
# Applying Box-Cox Transformation after checking all values are positive
if (Ames['SalePrice'] > 0).all():
Ames['BoxCox_SalePrice'], _ = boxcox(Ames['SalePrice'])
else:
# Consider alternative transformations or handling strategies
print("Not all SalePrice values are positive. Consider using Yeo-Johnson or handling negative values.")
print(f"Skewness after Box-Cox Transformation: {Ames['BoxCox_SalePrice'].skew():.5f}")
На данный момент это лучшее преобразование, поскольку асимметрия очень близка к нулю:
Skewness after Box-Cox Transformation: -0.00436
Трансформация Йо-Джонсона
Вышеупомянутые преобразования работают только с положительными данными. Йео-Джонсон похож на Бокс-Кокс, но его можно адаптировать как к положительным, так и к неположительным данным. Он изменяет данные с помощью оптимального параметра преобразования. Эта адаптивность позволяет ему управлять асимметрией в более широком диапазоне значений данных, улучшая его пригодность для статистических моделей.
# Applying Yeo-Johnson Transformation
Ames['YeoJohnson_SalePrice'], _ = yeojohnson(Ames['SalePrice'])
print(f"Skewness after Yeo-Johnson Transformation: {Ames['YeoJohnson_SalePrice'].skew():.5f}")
Как и в случае с Боксом-Коксом, асимметрия после преобразования очень близка к нулю:
Skewness after Yeo-Johnson Transformation: -0.00437
Квантильное преобразование
Квантильное преобразование сопоставляет данные с указанным распределением, например нормальным, эффективно устраняет асимметрию, равномерно распределяя точки данных по выбранному распределению. Это преобразование нормализует форму данных, фокусируясь на том, чтобы сделать распределение более равномерным или гауссовым, не предполагая, что оно принесет прямую пользу линейным моделям из-за его нелинейного характера и сложности возврата данных в исходную форму.
# Applying Quantile Transformation to follow a normal distribution
quantile_transformer = QuantileTransformer(output_distribution='normal', random_state=0)
Ames['Quantile_SalePrice'] = quantile_transformer.fit_transform(Ames['SalePrice'].values.reshape(-1, 1)).flatten()
print(f"Skewness after Quantile Transformation: {Ames['Quantile_SalePrice'].skew():.5f}")
Поскольку это преобразование грубо подгоняет данные к распределению Гаусса, асимметрия близка к нулю:
Skewness after Quantile Transformation: 0.00286
Чтобы проиллюстрировать эффект этих преобразований, давайте посмотрим на визуальное представление распределения SalePrice до и после применения каждого метода.
# Plotting the distributions
fig, axes = plt.subplots(2, 3, figsize=(18, 15)) # Adjusted for an additional plot
# Flatten the axes array for easier indexing
axes = axes.flatten()
# Hide unused subplot axes
for ax in axes[6:]:
ax.axis('off')
# Original SalePrice Distribution
sns.histplot(Ames['SalePrice'], kde=True, bins=30, color='skyblue', ax=axes[0])
axes[0].set_title('Original SalePrice Distribution (Skew: 1.76)')
axes[0].set_xlabel('SalePrice')
axes[0].set_ylabel('Frequency')
# Log Transformed SalePrice
sns.histplot(Ames['Log_SalePrice'], kde=True, bins=30, color='blue', ax=axes[1])
axes[1].set_title('Log Transformed SalePrice (Skew: 0.04172)')
axes[1].set_xlabel('Log of SalePrice')
axes[1].set_ylabel('Frequency')
# Square Root Transformed SalePrice
sns.histplot(Ames['Sqrt_SalePrice'], kde=True, bins=30, color='orange', ax=axes[2])
axes[2].set_title('Square Root Transformed SalePrice (Skew: 0.90148)')
axes[2].set_xlabel('Square Root of SalePrice')
axes[2].set_ylabel('Frequency')
# Box-Cox Transformed SalePrice
sns.histplot(Ames['BoxCox_SalePrice'], kde=True, bins=30, color='red', ax=axes[3])
axes[3].set_title('Box-Cox Transformed SalePrice (Skew: -0.00436)')
axes[3].set_xlabel('Box-Cox of SalePrice')
axes[3].set_ylabel('Frequency')
# Yeo-Johnson Transformed SalePrice
sns.histplot(Ames['YeoJohnson_SalePrice'], kde=True, bins=30, color='purple', ax=axes[4])
axes[4].set_title('Yeo-Johnson Transformed SalePrice (Skew: -0.00437)')
axes[4].set_xlabel('Yeo-Johnson of SalePrice')
axes[4].set_ylabel('Frequency')
# Quantile Transformed SalePrice (Normal Distribution)
sns.histplot(Ames['Quantile_SalePrice'], kde=True, bins=30, color='green', ax=axes[5])
axes[5].set_title('Quantile Transformed SalePrice (Normal Distn, Skew: 0.00286)')
axes[5].set_xlabel('Quantile Transformed SalePrice')
axes[5].set_ylabel('Frequency')
plt.tight_layout(pad=4.0)
plt.show()
На следующем рисунке представлено параллельное сравнение, которое поможет вам лучше понять влияние каждого преобразования на распределение цен на жилье.
Этот визуальный элемент служит четким примером того, как каждый метод преобразования изменяет распределение SalePrice, демонстрируя полученный эффект в направлении достижения более нормального распределения.
Стратегии устранения негативной асимметрии
Чтобы бороться с отрицательным перекосом, вы можете использовать пять ключевых преобразований: квадратное, кубическое, Бокс-Кокса, Йео-Джонсона и квантильное преобразование. Каждый метод направлен на уменьшение асимметрии, повышая пригодность данных для дальнейшего анализа.
Квадратная трансформация
Это включает в себя взятие каждой точки данных в наборе данных и возведение ее в квадрат (т. е. возведение в степень 2). Квадратное преобразование полезно для уменьшения отрицательной асимметрии, поскольку оно имеет тенденцию распространять более низкие значения больше, чем более высокие. Однако более эффективно, когда все точки данных положительны и степень отрицательной асимметрии не является чрезмерной.
# Applying Squared Transformation
Ames['Squared_YearBuilt'] = Ames['YearBuilt'] ** 2
print(f"Skewness after Squared Transformation: {Ames['Squared_YearBuilt'].skew():.5f}")
Он печатает:
Skewness after Squared Transformation: -0.57207
Кубическая трансформация
Аналогично квадратичному преобразованию, но включает возведение каждой точки данных в степень 3. Кубическое преобразование может еще больше уменьшить отрицательную асимметрию, особенно в тех случаях, когда квадратичное преобразование недостаточно. Он более агрессивен в распределении значений, что может принести пользу распределениям с более отрицательным перекосом.
# Applying Cubed Transformation
Ames['Cubed_YearBuilt'] = Ames['YearBuilt'] ** 3
print(f"Skewness after Cubed Transformation: {Ames['Cubed_YearBuilt'].skew():.5f}")
Он печатает:
Skewness after Cubed Transformation: -0.54539
Трансформация Бокса-Кокса
Более сложный метод, который находит лучший параметр лямбда (λ) для преобразования данных в нормальную форму. Преобразование определено только для положительных данных. Преобразование Бокса-Кокса очень эффективно для широкого спектра распределений, в том числе с отрицательной асимметрией, поскольку делает данные более симметричными. Для отрицательно искаженных данных часто находится положительная лямбда, применяя преобразование, которое эффективно уменьшает асимметрию.
# Applying Box-Cox Transformation after checking all values are positive
if (Ames['YearBuilt'] > 0).all():
Ames['BoxCox_YearBuilt'], _ = boxcox(Ames['YearBuilt'])
else:
# Consider alternative transformations or handling strategies
print("Not all YearBuilt values are positive. Consider using Yeo-Johnson or handling negative values.")
print(f"Skewness after Box-Cox Transformation: {Ames['BoxCox_YearBuilt'].skew():.5f}")
Вы можете видеть, что асимметрия стала ближе к нулю, чем раньше:
Skewness after Box-Cox Transformation: -0.12435
Трансформация Йо-Джонсона
Подобно преобразованию Бокса-Кокса, но преобразование Йео-Джонсона предназначено для обработки как положительных, так и отрицательных данных. Для отрицательно искаженных данных преобразование Йео-Джонсона может нормализовать распределения, даже если присутствуют отрицательные значения. Он корректирует данные таким образом, чтобы уменьшить асимметрию, что делает его особенно универсальным для наборов данных с сочетанием положительных и отрицательных значений.
# Applying Yeo-Johnson Transformation
Ames['YeoJohnson_YearBuilt'], _ = yeojohnson(Ames['YearBuilt'])
print(f"Skewness after Yeo-Johnson Transformation: {Ames['YeoJohnson_YearBuilt'].skew():.5f}")
Как и в случае с Box-Cox, асимметрия приближается к нулю:
Skewness after Yeo-Johnson Transformation: -0.12435
Квантильное преобразование
Этот метод преобразует объекты, чтобы они соответствовали заданному распределению, например нормальному распределению, на основе их квантилей. Он не предполагает какой-либо конкретной формы распределения входных данных. При применении к отрицательно искаженным данным квантильное преобразование может эффективно нормализовать распределение. Это особенно полезно для работы с выбросами и обеспечения равномерного или нормального распределения данных, независимо от исходной асимметрии.
# Applying Quantile Transformation to follow a normal distribution
quantile_transformer = QuantileTransformer(output_distribution='normal', random_state=0)
Ames['Quantile_YearBuilt'] = quantile_transformer.fit_transform(Ames['YearBuilt'].values.reshape(-1, 1)).flatten()
print(f"Skewness after Quantile Transformation: {Ames['Quantile_YearBuilt'].skew():.5f}")
Как вы видели ранее в случае положительной асимметрии, квантильное преобразование дает лучший результат в том смысле, что результирующая асимметрия близка к нулю:
Skewness after Quantile Transformation: 0.02713
Чтобы проиллюстрировать эффект этих преобразований, давайте посмотрим на визуальное представление распределения YearBuilt до и после применения каждого метода.
# Plotting the distributions
fig, axes = plt.subplots(2, 3, figsize=(18, 15))
# Flatten the axes array for easier indexing
axes = axes.flatten()
# Original YearBuilt Distribution
sns.histplot(Ames['YearBuilt'], kde=True, bins=30, color='skyblue', ax=axes[0])
axes[0].set_title(f'Original YearBuilt Distribution (Skew: {Ames["YearBuilt"].skew():.5f})')
axes[0].set_xlabel('YearBuilt')
axes[0].set_ylabel('Frequency')
# Squared YearBuilt
sns.histplot(Ames['Squared_YearBuilt'], kde=True, bins=30, color='blue', ax=axes[1])
axes[1].set_title(f'Squared YearBuilt (Skew: {Ames["Squared_YearBuilt"].skew():.5f})')
axes[1].set_xlabel('Squared YearBuilt')
axes[1].set_ylabel('Frequency')
# Cubed YearBuilt
sns.histplot(Ames['Cubed_YearBuilt'], kde=True, bins=30, color='orange', ax=axes[2])
axes[2].set_title(f'Cubed YearBuilt (Skew: {Ames["Cubed_YearBuilt"].skew():.5f})')
axes[2].set_xlabel('Cubed YearBuilt')
axes[2].set_ylabel('Frequency')
# Box-Cox Transformed YearBuilt
sns.histplot(Ames['BoxCox_YearBuilt'], kde=True, bins=30, color='red', ax=axes[3])
axes[3].set_title(f'Box-Cox Transformed YearBuilt (Skew: {Ames["BoxCox_YearBuilt"].skew():.5f})')
axes[3].set_xlabel('Box-Cox YearBuilt')
axes[3].set_ylabel('Frequency')
# Yeo-Johnson Transformed YearBuilt
sns.histplot(Ames['YeoJohnson_YearBuilt'], kde=True, bins=30, color='purple', ax=axes[4])
axes[4].set_title(f'Yeo-Johnson Transformed YearBuilt (Skew: {Ames["YeoJohnson_YearBuilt"].skew():.5f})')
axes[4].set_xlabel('Yeo-Johnson YearBuilt')
axes[4].set_ylabel('Frequency')
# Quantile Transformed YearBuilt (Normal Distribution)
sns.histplot(Ames['Quantile_YearBuilt'], kde=True, bins=30, color='green', ax=axes[5])
axes[5].set_title(f'Quantile Transformed YearBuilt (Normal Distn, Skew: {Ames["Quantile_YearBuilt"].skew():.5f})')
axes[5].set_xlabel('Quantile Transformed YearBuilt')
axes[5].set_ylabel('Frequency')
plt.tight_layout(pad=4.0)
plt.show()
На следующем рисунке представлено параллельное сравнение, которое помогает нам лучше понять влияние каждого преобразования на эту функцию.
Этот визуальный элемент дает четкое представление о том, как каждый метод преобразования изменяет распределение «YearBuilt», демонстрируя полученный эффект в направлении достижения более нормального распределения.
Статистическая оценка преобразований
Как узнать, что преобразованные данные соответствуют нормальному распределению?
Критерий Колмогорова-Смирнова (КС) — это непараметрический критерий, используемый для определения того, принадлежит ли выборка к совокупности с определенным распределением. В отличие от параметрических тестов, которые предполагают определенную форму распределения данных (обычно нормальное распределение), непараметрические тесты не делают таких предположений. Это качество делает их очень полезными в контексте преобразований данных, поскольку помогает оценить, насколько близко преобразованный набор данных приближается к нормальному распределению. Тест KS сравнивает кумулятивную функцию распределения (CDF) выборочных данных с CDF известного распределения (в данном случае нормального распределения), предоставляя тестовую статистику, которая количественно определяет расстояние между ними.
Нулевая и альтернативная гипотеза:
- Нулевая гипотеза ($H_0$): Данные соответствуют указанному распределению (в данном случае нормальному распределению).
- Альтернативная гипотеза ($H_1$): Данные не соответствуют указанному распределению.
В этом контексте тест KS используется для оценки согласия между эмпирическим распределением преобразованных данных и нормальным распределением. Статистика теста является мерой наибольшего расхождения между эмпирическими (преобразованными данными) и теоретическими CDF (нормальное распределение). Небольшая тестовая статистика показывает, что распределения схожи.
# Import the Kolmogorov-Smirnov Test from scipy.stats
from scipy.stats import kstest
# Run the KS tests for the 10 cases
transformations = ["Log_SalePrice", "Sqrt_SalePrice", "BoxCox_SalePrice",
"YeoJohnson_SalePrice", "Quantile_SalePrice",
"Squared_YearBuilt", "Cubed_YearBuilt", "BoxCox_YearBuilt",
"YeoJohnson_YearBuilt", "Quantile_YearBuilt"]
# Standardizing the transformations before performing KS test
ks_test_results = {}
for transformation in transformations:
standardized_data = (Ames[transformation] - Ames[transformation].mean()) / Ames[transformation].std()
ks_stat, ks_p_value = kstest(standardized_data, 'norm')
ks_test_results[transformation] = (ks_stat, ks_p_value)
# Convert results to DataFrame for easier comparison
ks_test_results_df = pd.DataFrame.from_dict(ks_test_results, orient='index', columns=['KS Statistic', 'P-Value'])
print(ks_test_results_df.round(5))
Код выше печатает таблицу следующим образом:
KS Statistic P-Value
Log_SalePrice 0.04261 0.00017
Sqrt_SalePrice 0.07689 0.00000
BoxCox_SalePrice 0.04294 0.00014
YeoJohnson_SalePrice 0.04294 0.00014
Quantile_SalePrice 0.00719 0.99924
Squared_YearBuilt 0.11661 0.00000
Cubed_YearBuilt 0.11666 0.00000
BoxCox_YearBuilt 0.11144 0.00000
YeoJohnson_YearBuilt 0.11144 0.00000
Quantile_YearBuilt 0.02243 0.14717
Вы можете видеть, что чем выше статистика KS, тем ниже значение p. Соответственно,
- Статистика KS: представляет собой максимальную разницу между эмпирической функцией распределения выборки и кумулятивной функцией распределения эталонного распределения. Меньшие значения указывают на более близкое соответствие нормальному распределению.
- P-значение. Предоставляет вероятность наблюдения результатов теста при нулевой гипотезе. Низкое значение p (обычно <0,05) отвергает нулевую гипотезу, указывая на то, что распределение выборки значительно отличается от нормального распределения.
Квантильное преобразование SalePrice дало наиболее многообещающие результаты: статистика KS 0,00719 и значение p 0,99924, что указывает на то, что после этого преобразования распределение близко соответствует нормальному распределению. Это неудивительно, поскольку Квантильное преобразование предназначено для обеспечения хорошего соответствия. Значение p является значимым, поскольку более высокое значение p (близкое к 1) предполагает, что нулевую гипотезу (о том, что выборка происходит из указанного распределения) нельзя отвергнуть, что подразумевает хорошую нормальность.
Другие преобразования, такие как Log, Box-Cox и Yeo-Johnson, также улучшили распределение SalePrice, но в меньшей степени, о чем свидетельствуют их более низкие значения p (в диапазоне от 0,00014 до 0,00017), что указывает на меньшее соответствие нормальному распределению. по сравнению с квантильным преобразованием. Преобразования, примененные к «YearBuilt», в целом показали меньшую эффективность в достижении нормальности по сравнению с «SalePrice». Преобразования Бокса-Кокса и ЙеоДжонсона имели небольшие улучшения по сравнению с возведением в квадрат и кубированием, о чем свидетельствуют их несколько более низкие статистические данные KS и значения p, но все же указывали на значительные отклонения от нормальности. Квантильное преобразование для «YearBuilt» показало более благоприятный результат со статистикой KS 0,02243 и значением p 0,14717, что предполагает умеренное улучшение в сторону нормального состояния, хотя и не такое выраженное, как эффект, наблюдаемый с «SalePrice».
Выбор правильного преобразования
Выбор правильного преобразования для устранения асимметрии данных не является универсальным решением; это требует тщательного рассмотрения контекста и характеристик имеющихся данных. Важность контекста при выборе подходящего метода преобразования невозможно переоценить. Вот ключевые факторы, которые следует учитывать:
- Характеристики данных. Характер данных (например, наличие нулей или отрицательных значений) может ограничивать применимость определенных преобразований. Например, преобразования журнала не могут быть напрямую применены к нулевым или отрицательным значениям без корректировок.
- Степень асимметрии. Степень асимметрии данных влияет на выбор преобразования. Более серьезная асимметрия может потребовать более мощных преобразований (например, Бокса-Кокса или Йео-Джонсона) по сравнению с более легкой асимметрией, которую можно адекватно устранить с помощью логарифмических преобразований или преобразований квадратного корня.
- Статистические свойства. Выбранное преобразование в идеале должно улучшить статистические свойства набора данных, такие как нормализация распределения и стабилизация дисперсии, которые необходимы для многих статистических тестов и моделей.
- Интерпретируемость. Простота интерпретации результатов после преобразования имеет решающее значение. Некоторые преобразования, такие как логарифмическое преобразование или преобразование квадратного корня, допускают относительно простую интерпретацию, тогда как другие, например преобразование квантиля, могут усложнить интерпретацию исходной шкалы.
- Цель анализа. Конечная цель анализа — будь то прогнозное моделирование, проверка гипотез или исследовательский анализ — играет решающую роль в выборе метода преобразования. Преобразование должно соответствовать аналитическим методам и моделям, которые будут использоваться позже.
Таким образом, выбор правильного преобразования зависит от множества факторов, включая, помимо прочего, четкое понимание набора данных, конкретные цели анализа и практические последствия для интерпретируемости и производительности модели. Ни один метод не является универсальным; у каждого есть свои компромиссы и применимость в зависимости от рассматриваемого сценария. Важно подчеркнуть предостережение относительно квантильного преобразования, которое ваши визуальные и статистические тесты показали как высокоэффективное для достижения нормального распределения. Несмотря на свою эффективность, Квантильная трансформация не является линейной трансформацией, как другие. Это означает, что он может существенно изменить структуру данных способами, которые нелегко обратить, что потенциально усложняет интерпретацию результатов и применение обратных преобразований для обратного преобразования в исходный масштаб. Поэтому, несмотря на эффективность нормализации, к его использованию следует подходить осторожно, особенно в тех случаях, когда важно поддерживать связь с исходным масштабом данных или когда интерпретируемость модели является приоритетом. В большинстве сценариев предпочтение может отдаваться преобразованиям, которые уравновешивают эффективность нормализации с простотой и обратимостью, гарантируя, что данные остаются максимально интерпретируемыми и управляемыми.
Дополнительная литература
API
- API scipy.stats.boxcox
- scipy.stats.yeojohnson API
- sklearn.preprocessing.Quantile Transformer API
- scipy.stats.kstest API
Ресурсы
- Набор данных Эймса
- Словарь данных Эймса
Сводка
В этом посте вы приступили к подробному исследованию преобразований данных, сосредоточив внимание на их решающей роли в устранении искаженных данных в области науки о данных. На практических примерах с использованием функций SalePrice и YearBuilt из набора жилищных данных Эймса вы продемонстрировали различные методы преобразования — логарифмическое, квадратичное корневое, преобразования Бокса-Кокса, Йео-Джонсона и квантильное преобразование — и их влияние на нормализацию распределения данных. Ваш анализ подчеркивает необходимость выбора соответствующих преобразований на основе характеристик данных, степени асимметрии, статистических целей, интерпретируемости и конкретных целей анализа.
В частности, вы узнали:
- Значение преобразований данных и то, как они могут обрабатывать асимметричные распределения.
- Как сравнить эффективность разных преобразований посредством визуальной и статистической оценки.
- Важность оценки характеристик данных, степени асимметрии и аналитических целей для выбора наиболее подходящего метода преобразования.
У вас есть вопросы? Пожалуйста, задавайте свои вопросы в комментариях ниже, и я постараюсь ответить.