Вопрос или проблема
Я знаю, что левый и правый скошенность означает, что у него длинный хвост либо слева (левая скошенность), либо справа (правая скошенность).
Однако приведённый ниже пример является примером правой скошенности.
data = pd.DataFrame({
"Доход": [15000, 22000, 30000, 35000, 42000, 50000, 65000, 78000, 120000, 250000]
})
sns.distplot( data['Доход'] , color="небесно-голубой", label="Длина чашечки")
Теперь моё понимание правой скошенности заключается в том, что на возрастающем значении оси x меньше точек данных. Так правильно ли моё понимание? и как я могу исправить этот график, чтобы он представлял нормальное распределение?
На сколько мне известно, используя центральную предельную теорему, я должен иметь возможность преобразовать любую форму в стандартное нормальное распределение, но для этого требуется минимальный размер выборки в 30. Так, в моём случае есть ли другой способ, или добавление большего количества точек данных — единственный вариант?
Ответ или решение
Для решения проблемы смещения (скewness) данных, таких как ваше правостороннее смещение (right skewness) в наборе данных о доходах, необходимо учитывать несколько методов. Давайте рассмотрим вашу ситуацию более подробно и предложим способы исправления:
Понимание смещения в данных
Правостороннее смещение (right skewness) характеризуется тем, что в распределении данных имеется длинный хвост вправо, что указывает на наличие значительного числа высоких значений (в вашем случае, доходов). В вашем примере, доходы выше 100,000 имеют меньшую частоту, создавая тем самым правосторонний хвост в графике распределения.
Подходы к исправлению смещения
-
Трансформация данных:
-
Логарифмическая трансформация: Одна из наиболее распространенных трансформаций, которая помогает уменьшить правостороннее смещение. Вы можете взять логарифм ваших доходов:
import numpy as np data['Log_Income'] = np.log(data['Income']) sns.distplot(data['Log_Income'], color="skyblue", label="Log Income")
-
Квадратный корень: Если данные содержат много нулевых значений, вы можете использовать квадратный корень:
data['Sqrt_Income'] = np.sqrt(data['Income']) sns.distplot(data['Sqrt_Income'], color="skyblue", label="Sqrt Income")
-
Бокс-Кокс трансформация: Более универсальный метод, который можно использовать для нормализации данных. Это требует наличия положительных значений:
from scipy import stats data['BoxCox_Income'], _ = stats.boxcox(data['Income']) sns.distplot(data['BoxCox_Income'], color="skyblue", label="BoxCox Income")
-
-
Увеличение объема выборки:
- Если у вас есть возможность, сбор дополнительных данных — это хороший способ, который может помочь создать более сбалансированное распределение. Чем больше данных, тем более вероятно, что вы получите более полноценное представление о характеристиках, включая нормальность.
-
Использование методов отбора данных:
- Вы можете рассмотреть возможность исключения выбросов. Это может помочь улучшить нормальность распределения:
data_filtered = data[data['Income'] < 100000] # Пример фильтрации sns.distplot(data_filtered['Income'], color="skyblue", label="Filtered Income")
- Вы можете рассмотреть возможность исключения выбросов. Это может помочь улучшить нормальность распределения:
-
Анализ с помощью центральной предельной теоремы (ЦПТ):
- ЦПТ гласит, что при большом количестве наблюдений средние значения выборок будут стремиться к нормальному распределению, независимо от первоначального распределения. Однако это может быть неэффективным, если целевой анализ требует нормальности на уровне отдельных наблюдений.
Заключение
Ваше понимание правостороннего смещения в данных верное, и предложенные методы трансформации или линейной фильтрации помогут улучшить распределение. Также следует учитывать, что добавление данных может значительно помочь, но это не всегда возможно. Попробуйте разные методы трансформации и оцените, какой из них даст лучший результат для вашего конкретного случая.
Если у вас есть дополнительные вопросы или вам нужна помощь с кодом, не стесняйтесь обращаться!