Общественный номер: You Er Hut
Автор: Питер
Редактор: Питер
Всем привет, меня зовут Питер~
Это вторая часть колонки Kaggle, Название конкурса:House Prices - Advanced Regression Techniques. В этой статье вы узнаете:
- Одномерный и многомерный анализ
- Корреляционный анализ
- Обработка отсутствующих и нестандартных значений
- преобразование фиктивной переменной
Оригинальный адрес блокнота:Woohoo.Карта реформирована.com/Afraid of Marcelino/…
Таблица лидеров
Давайте посмотрим на рейтинговый список, первое место действительно сокрушает других игроков ~ Итак, давайте посмотрим, насколько хорош этот план на первое место сегодня?
Введение данных
Этот набор данных о ценах на жилье в Бостоне состоит из 4 частей данных: поезд обучающего набора + тестовый набор тестов + описание набора данных + образец шаблона отправки.
Среди них обучающий набор содержит 81 признак и 1460 элементов данных, тестовый набор содержит 81 признак и 1459 элементов данных. посмотриЧастичные свойствавводить:
Данные ЭДА
Импортируйте модули и данные и выполняйте исследование данных:
библиотека импорта
import pandas as pd
import numpy as np
# 绘图相关
import plotly.express as px
import matplotlib.pyplot as plt
import seaborn as sns
plt.style.use("fivethirtyeight")
# 数据建模
from scipy.stats import norm
from scipy import stats
from sklearn.preprocessing import StandardScaler
# 警告
import warnings
warnings.filterwarnings('ignore')
%matplotlib inline
Импорт данных
Информация о данных
Общий обучающий набор составляет 1460*81, и во многих существующих полях отсутствуют значения.
Описательная статистика:
Анализ продажной цены
В прежнем оригинальном документе записной книжки автор проанализировал множество собственных взглядов на эту тему и область и не стал вдаваться в подробности. Вот основные моменты:
Статистика
Просто посмотрите на статистику по этому полю:
Гистограмма распределения выглядит следующим образом, мы отчетливо чувствуем:
- Распределение цен отклоняется от нормального распределения
- Налицо очевидная положительная асимметрия
- Есть четкий пик
асимметрия и эксцесс
АЗС знаний: асимметрия и эксцесс
Подробное объяснение смотрите в статье:zhuanlan.zhihu.com/p/53184516
- Асимметрия: измеряет асимметрию распределения вероятности случайного изменения лица.Это мера степени асимметрии относительно среднего значения.Измеряя коэффициент асимметрии, мы можем определить степень асимметрии и направление распределения данных.
- Эксцесс: это статистика, изучающая крутизну или гладкость распределения данных.Измеряя коэффициент эксцесса, мы можем определить, являются ли данные более крутыми или плоскими, чем нормальное распределение. Если эксцесс близок к 0, данные имеют нормальное распределение; если эксцесс >0, распределение очень резкое; если эксцесс меньше 0, распределение короткое и жирное.
Существует два распределения асимметрии:
- Если он остается асимметричным, асимметрия меньше 0
- Если он смещен вправо, асимметрия больше 0
Есть два распределения эксцесса:
- Если он высокий и худой, эксцесс больше 0.
- Если он коренастый, эксцесс меньше 0.
# 打印销售价格的偏度和峰度
print("Skewness(偏度): %f" % train['SalePrice'].skew())
print("Kurtosis(峰度): %f" % train['SalePrice'].kurt())
Skewness(偏度): 1.882876
Kurtosis(峰度): 6.536282
Значения как асимметрии, так и эксцесса положительны, что указывает на то, что данные смещены вправо и сильно изогнуты.
Связь между SalePrice и числовыми полями
Сначала разберем взаимосвязь с жилой площадью:
plt.figure(1,figsize=(12,6))
sns.scatterplot(x="GrLivArea",y="SalePrice",data=data)
plt.show()
# plotly版本
px.scatter(data,x="GrLivArea",y="SalePrice",trendline="ols")
TotalBsmtSF VS SalePrice
# 2、TotalBsmtSF
data = train[["SalePrice","TotalBsmtSF"]]
plt.figure(1,figsize=(12,6))
sns.scatterplot(x="TotalBsmtSF",y="SalePrice",data=data)
plt.show()
Резюме: Мы можем наблюдать, что существует определенная линейная зависимость между этими двумя характеристиками и продажной ценой.
Связь между ценой и полем типа
1. Общее качество VS Цена продажи
# 1、OverallQual:整体房屋质量
# 总共10个类别
train["OverallQual"].value_counts()
5 397
6 374
7 319
8 168
4 116
9 43
3 20
10 18
2 3
1 2
Name: OverallQual, dtype: int64
data = train[["SalePrice","OverallQual"]]
# 房屋整体质量和房价的关系
# 绘制子图:1号位
f,ax = plt.subplots(1,figsize=(12,6))
fig = sns.boxplot(x="OverallQual",y="SalePrice",data=data)
# y轴的刻度范围
fig.axis(ymin=0,ymax=800000)
plt.show()
2. Год постройки VS Цена продажи
Жизнь в соотношении между годом постройки и продажной ценой
data = train[["SalePrice","YearBuilt"]]
# 建造年份和房价的关系
f,ax = plt.subplots(1,figsize=(16,8))
fig = sns.boxplot(x="YearBuilt",y="SalePrice",data=data)
# y轴的刻度范围
fig.axis(ymin=0,ymax=800000)
plt.show()
Вывод: цена продажи тесно связана с общим качеством дома, но не столько с годом постройки. Но в процессе покупки дома нас все равно волнует год.
резюме
Небольшое резюме приведенного выше анализа:
- Жилая площадь земли (GrLivArea), площадь подвала (GrLivArea) и цена продажи SalePrice показывают положительную линейную корреляцию.
- Общее качество дома (OverallQual) и год постройки (YearBuild) также линейно связаны с продажной ценой. Здравый смысл, чем лучше общее качество, тем дороже цена
Корреляционный анализ
Чтобы исследовать взаимосвязь между многими атрибутами, выполняется следующий анализ:
- Корреляция между двумя атрибутами (тепловая карта)
- Связь между продажной ценой и другими атрибутами (тепловая карта)
- Взаимосвязь между наиболее релевантными атрибутами (диаграмма рассеивания)
Общая релевантность
Проанализируйте взаимосвязь каждых двух атрибутов и нарисуйте тепловую карту.
На картинке выше есть два момента, на которые стоит обратить внимание:
- TotalBsmtSF and 1stFlrSF
- GarageCar and GarageArea
Эти два набора переменных сильно коррелированы, и наш последующий анализ берет только один из них.
масштабированная корреляционная матрица (цена продажи)
отТепловая карта вышеВыберите 10 лучших функций с наибольшей корреляцией с SalePrice, чтобы нарисовать тепловую карту.
sns.set(font_scale=1.25)
hm = sns.heatmap(
cm, # 绘图数据
cbar=True, # 是否将颜色条作为图例,默认True
annot=True, # 是否显示数值
square=True, # 是否使热力图每个单元为正方形,默认为False
fmt='.2f', # 保留两位小数
annot_kws={'size':10},
xticklabels=cols.values, # xy轴设置
yticklabels=cols.values)
plt.show()
Резюме 1
Из приведенной выше масштабированной тепловой карты мы можем сделать следующие выводы:
- «OverallQual», «GrLivArea» и «TotalBsmtSF» верны и сильно коррелируют с «SalePrice».
- «GarageCars» и «GarageArea» также являются двумя функциями с сильной корреляцией; они оба появляются одновременно, а GarageCars выбирается для анализа позже.
- Условно говоря, YearBuilt имеет относительно низкую корреляцию
Переменный дискретный график
Соедините цену продажи SalePrice и несколько сильно коррелированных функций, чтобы нарисовать переменный дискретный график.
sns.set()
# 待分析的变量
cols = ['SalePrice', 'OverallQual', 'GrLivArea', 'GarageCars', 'TotalBsmtSF', 'FullBath', 'YearBuilt']
sns.pairplot(train[cols],size=2.5)
plt.show()
Резюме 2
Положительное диагональное направление — это гистограмма переменных, объясняющей переменной и объясняемой переменной SalePrice, а остальные — графики рассеяния.
Если на рисунке есть точки разброса прямых или горизонтальных линий, это означает, что переменная является дискретной.Например, переменная в строке 1 и столбце 4, ось y — это SalePrice, ось x — YearBuild, а прямая линия указывает на дискретность YearBuilt.
Обработка пропущенных значений
В случае пропущенных значений необходимо обсудить два основных момента:
- Каково распределение пропущенных значений?
- Пропущенные значения случайны? есть какое-то правило
процент пропущенных значений
1. Просмотрите отсутствующее значение каждого поля
# 每个字段的缺失值数量:降序
total = train.isnull().sum().sort_values(ascending=False)
total.head()
PoolQC 1453
MiscFeature 1406
Alley 1369
Fence 1179
FireplaceQu 690
dtype: int64
2. Преобразовать в проценты
# 每个字段的缺失值 / 总数
percent = (train.isnull().sum() / train.isnull().count()).sort_values(ascending=False)
percent.head()
PoolQC 0.995205
MiscFeature 0.963014
Alley 0.937671
Fence 0.807534
FireplaceQu 0.472603
dtype: float64
3. Объединение данных, общая ситуация с недостающими значениями:
удалить пропущенные значения
В исходном тексте много анализа, и окончательный вывод:
In summary, to handle missing data,
1. Удалим все переменные с отсутствующими данными, кроме переменной «Электроснабжение».
2. В «Электрике» мы просто удалим наблюдение с отсутствующими данными.
# 步骤1:需要删除的字段
missing_data[missing_data["Total"] > 1].index
Index(['PoolQC', 'MiscFeature', 'Alley', 'Fence', 'FireplaceQu', 'LotFrontage',
'GarageYrBlt', 'GarageCond', 'GarageType', 'GarageFinish', 'GarageQual',
'BsmtFinType2', 'BsmtExposure', 'BsmtQual', 'BsmtCond', 'BsmtFinType1',
'MasVnrArea', 'MasVnrType'],
dtype='object')
# 第一步
train = train.drop(missing_data[missing_data["Total"] > 1].index,1)
# 第二步
train = train.drop(train.loc[train["Electrical"].isnull()].index)
выбросы
Найти выбросы
## 数据标准化standardizing data
# np.newaxis 增加数据维度,一维变成二维
saleprice_scaled = StandardScaler().fit_transform(train["SalePrice"][:,np.newaxis])
saleprice_scaled[:5]
array([[ 0.34704187],
[ 0.0071701 ],
[ 0.53585953],
[-0.5152254 ],
[ 0.86943738]])
# 查看前10和最后10位的数据
# argsort:返回的是索引值;默认是升序排列,最小的在最前面,最大的在最后
low_range = saleprice_scaled[saleprice_scaled[:,0].argsort()][:10]
high_range = saleprice_scaled[saleprice_scaled[:,0].argsort()][-10:]
print(low_range)
print('----------')
print(high_range)
Резюме 3
- low_range близок к 0
- high_range далеко от 0, и данные 7+ должны быть выбросами
Одномерный анализ 1
data = train[["SalePrice","GrLivArea"]]
data.plot.scatter(x="GrLivArea",y="SalePrice",ylim=(0,800000))
plt.show()
Очевидно, что существует линейная зависимость между двумя переменными (атрибутами)
удалить выбросы
Укажите метод удаления поля как определенного значения:
Одномерный анализ 2
data = train[["SalePrice","TotalBsmtSF"]] # 待分析的两个变量
data.plot.scatter(x="TotalBsmtSF",y="SalePrice",ylim=(0,800000))
plt.show()
Глубокое понимание SalePrice
В основном из следующих аспектов для углубленного изучения продажной цены:
- Нормальность: нормализация
- Гомоскедастичность: гомоскедастичность
- Линейность: Линейность
- Отсутствие коррелированных ошибок: коррелированные ошибки
Нормализация нормальности (SalePrice)
sns.distplot(train["SalePrice"],fit=norm)
fig = plt.figure()
res = stats.probplot(train["SalePrice"], plot=plt)
мы обнаруживаем:Продажные цены не имеют нормального распределения, имеет место правая асимметрия, но не подчиняется закону логарифмического изменения.
Для решения этой проблемы:Реализуйте логарифмическое преобразование
## 对数变换
train["SalePrice"] = np.log(train["SalePrice"])
sns.distplot(train["SalePrice"],fit=norm)
fig = plt.figure()
res = stats.probplot(train["SalePrice"], plot=plt)
После реализации логарифмического преобразования эффект намного лучше
Нормальность - Нормализация (GrLivArea)
sns.distplot(train["GrLivArea"],fit=norm)
fig = plt.figure()
res = stats.probplot(train["GrLivArea"], plot=plt)
Эффект до логарифмического преобразования:
Выполните логарифмическое преобразование и эффекты:
# 执行相同的对数操作
train["GrLivArea"] = np.log(train["GrLivArea"])
sns.distplot(train["GrLivArea"],fit=norm)
fig = plt.figure()
res = stats.probplot(train["GrLivArea"], plot=plt)
Нормальность — нормализация (TotalBsmtSF)
sns.distplot(train["TotalBsmtSF"],fit=norm)
fig = plt.figure()
res = stats.probplot(train["TotalBsmtSF"], plot=plt)
Эффекты до обработки:
Как обращаться со специальной частью выше?
# 增加一列数据
train['HasBsmt'] = 0
# 当TotalBsmtSF>0 则赋值1
train.loc[train['TotalBsmtSF']>0,'HasBsmt'] = 1
# 对数转换:等于1的部分
train.loc[train['HasBsmt']==1,'TotalBsmtSF'] = np.log(train['TotalBsmtSF'])
# 绘图
data = train[train['TotalBsmtSF']>0]['TotalBsmtSF']
sns.distplot(data,fit=norm)
fig = plt.figure()
res = stats.probplot(data, plot=plt)
гомоскедастичность
Лучший способ проверить гомоскедастичность между двумя переменными — нанести их на график.
The best approach to test homoscedasticity for two metric variables is graphically
1. Обсуждение: взаимосвязь между «SalePrice» и «GrLivArea».
2. Обсудите SalePrice и TotalBsmtSF.
We can say that, in general, 'SalePrice' exhibit equal levels of variance across the range of 'TotalBsmtSF'. Cool!
Из двух рисунков выше мы видим:Между ценой продажи и двумя другими переменными существует положительная связь.
Создание фиктивных переменных
Пустышкиные переменные, также известные как фиктивные переменные, номинальные переменные или фиктивные переменные, являются искусственной переменной, используемой для отражения качественных свойств. Они представляют собой количественные независимые переменные и обычно принимают значение 0 или 1.
Функцию GET_DUMMIES в Pandas можно реализовать:
train = pd.get_dummies(train) # 生成哑变量
train
Суммировать
На данный момент мы выполнили следующее:
- Корреляционный анализ между общими переменными
- Сосредоточены на переменной "SalePrice"
- Обработка пропущенных и выбросов (выбросов)
- Провел статистический анализ и превратил категориальные переменные в фиктивные переменные.
Пункты для дальнейшего углубленного изучения, на которые вам необходимо обратить внимание:
- Многомерный статистический анализ
- Асимметрия и эксцесс
- Углубленные фиктивные переменные
- нормализовать и нормализовать
Что касается сбора набора данных, официальный ответ учетной записи:цена дома. Как вы относитесь к процессу анализа всей статьи?