Добавить Автора
Публичный аккаунт WeChat:PythonНаука о данных
Знаю почти:аналитик данных Python
Цель: эта статья знакомит вас с основным проектом анализа данных, цель — понять, как использовать Python для простого анализа данных в рамках проекта.
Источник данных: бывшие в употреблении данные о жилье всей сети Lianjia в Пекине, собранные блогером через краулер (ответ на фоне официального аккаунта)Данные о вторичном жильедоступный).
Предварительное изучение данных
Сначала импортируйте пакет научных вычислений, который вы хотите использовать.numpy
,pandas
, визуализироватьmatplotlib
,seaborn
и пакет машинного обученияsklearn
.
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt
from IPython.display import display
plt.style.use("fivethirtyeight")
sns.set_style({'font.sans-serif':['simhei','Arial']})
%matplotlib inline
# 检查Python版本
from sys import version_info
if version_info.major != 3:
raise Exception('请使用Python 3 来完成此项目')
Затем импортируйте данные и сделайте предварительные наблюдения, которые включают понимание характеристик данных.пропущенное значение,Выбросы, и примерноописательная статистика.
# 导入链家二手房数据
lianjia_df = pd.read_csv('lianjia.csv')
display(lianjia_df.head(n=2))
Первоначально было замечено, что всего11
характеристическая переменная,Price
Вот наша целевая переменная, а затем мы перейдем к более подробному рассмотрению.
# 检查缺失值情况
lianjia_df.info()
Было обнаружено, что набор данных имеет в общей сложности23677
фрагменты данных, гдеElevator
Функции имеют значительные пропущенные значения.
lianjia_df.describe()
Приведенные выше результаты дают некоторую статистику, где собственные значения являются числовыми, в том числесредний,среднеквадратичное отклонение,медиана,минимум,максимальное значение,25% квантиль,75-й процентиль. Эти статистические результаты просты и понятны и очень полезны для первоначального понимания того, насколько хороша функция, как мы наблюдали.Size 特征
Максимальное значение 1019 квадратных метров, а минимальное значение 2 квадратных метра.Тогда мы должны подумать о том, существует ли это на практике.Если его нет, это бессмысленно, то эти данные являются аномальной величиной, которая будет серьезно влияют на производительность модели.
Конечно, это лишь предварительное наблюдение, и мы воспользуемся визуализацией данных, чтобы показать это наглядно и подтвердить наши догадки.
# 添加新特征房屋均价
df = lianjia_df.copy()
df['PerPrice'] = lianjia_df['Price']/lianjia_df['Size']
# 重新摆放列位置
columns = ['Region', 'District', 'Garden', 'Layout', 'Floor', 'Year', 'Size', 'Elevator', 'Direction', 'Renovation', 'PerPrice', 'Price']
df = pd.DataFrame(df, columns = columns)
# 重新审视数据集
display(df.head(n=2))
мы обнаруживаемId
Эта функция на самом деле ничего не значит, поэтому она удалена. Поскольку цену за единицу дома анализировать удобнее, ее можно получить, просто используя общую цену/площадь, поэтому добавлена новая функция.PerPrice
(Только для анализа, а не прогностических функций). Кроме того, порядок функций также был скорректирован, чтобы сделать его более удобным.
Анализ визуализации данных
Анализ особенностей региона
Для региональных характеристик мы можем проанализировать сравнение цен на жилье и количества в разных регионах.
# 对二手房区域分组对比二手房数量和每平米房价
df_house_count = df.groupby('Region')['Price'].count().sort_values(ascending=False).to_frame().reset_index()
df_house_mean = df.groupby('Region')['PerPrice'].mean().sort_values(ascending=False).to_frame().reset_index()
f, [ax1,ax2,ax3] = plt.subplots(3,1,figsize=(20,15))
sns.barplot(x='Region', y='PerPrice', palette="Blues_d", data=df_house_mean, ax=ax1)
ax1.set_title('北京各大区二手房每平米单价对比',fontsize=15)
ax1.set_xlabel('区域')
ax1.set_ylabel('每平米单价')
sns.barplot(x='Region', y='Price', palette="Greens_d", data=df_house_count, ax=ax2)
ax2.set_title('北京各大区二手房数量对比',fontsize=15)
ax2.set_xlabel('区域')
ax2.set_ylabel('数量')
sns.boxplot(x='Region', y='Price', data=df, ax=ax3)
ax3.set_title('北京各大区二手房房屋总价',fontsize=15)
ax3.set_xlabel('区域')
ax3.set_ylabel('房屋总价')
plt.show()
использовалpandas
Веб-перспективаgroupby
Сортировать по группам. Визуализация особенностей региона напрямую адаптированаseaborn
Готово, раскрасьте с помощью палитрыpalette
Параметр, цветовой градиент, чем светлее описание, тем меньше, и наоборот.
Можно наблюдать:
- Средняя цена вторичного жилья: Самая дорогая цена на жилье в районе Сичэн составляет около 110 000 юаней за квадратный метр, потому что Сичэн расположен в пределах Второго транспортного кольца и является местом сбора жилья в популярных школьных округах. Далее следует Dongcheng с ценой около 100 000/кв.м, затем Haidian с ценой около 85 000/кв.м, а все остальные ниже 80 000/кв.м.
- Количество вторичного жилья: С количественной точки зрения текущий рынок вторичного жилья является горячей областью. Район Хайдянь и район Чаоян имеют наибольшее количество подержанных домов, почти все они приближаются к 3000. В конце концов, спрос на большие площади также велик. Затем есть район Фэнтай, который в последние годы перестраивается и строится, и имеет тенденцию наверстывать упущенное.
- Общая стоимость вторичного жилья: На диаграмме мы видим, что медиана общей стоимости дома во всех основных регионах ниже 10 миллионов, а дискретное значение общей стоимости дома высокое.Самая высокая цена в Сичэн достигает 60 миллионов, что указывает на то, что характеристики цен на жилье не являются идеальным положительным распределением.
Анализ характеристик размера
f, [ax1,ax2] = plt.subplots(1, 2, figsize=(15, 5))
# 建房时间的分布情况
sns.distplot(df['Size'], bins=20, ax=ax1, color='r')
sns.kdeplot(df['Size'], shade=True, ax=ax1)
# 建房时间和出售价格的关系
sns.regplot(x='Size', y='Price', data=df, ax=ax2)
plt.show()
-
Распределение размеров:
пройти через
distplot
иkdeplot
Нарисуйте гистограмму, чтобы наблюдать за распределением признака размера, который относится к распределению с длинным хвостом, которое показывает, что существует много подержанных домов с большими площадями и выходящими за пределы нормы. -
Соотношение между размером и ценой:
пройти через
regplot
Нарисована диаграмма разброса между Размером и Ценой, и обнаружено, что характеристика Размера в основном имеет линейную связь с Ценой, что соответствует основному здравому смыслу Чем больше площадь, тем выше цена. Но есть две явные ненормальные точки: 1. Площадь меньше 10 квадратных метров, а цена превышает 100 миллионов 2. Площадь точки превышает 1000 квадратных метров, а цена очень низкая, нужно проверить, какова ситуация.
df.loc[df['Size']< 10]
После проверки выясняется, что этот набор данных является виллой.Причина аномалии в том, что структура виллы особенная (без лифта, без направления), а определение поля не такое, как у второго ручной коммерческий дом, который заставляет краулера сканировать дислокацию данных. Кроме того, поскольку подержанный дом типа виллы не находится в нашем рассмотрении, мы удаляем его и снова наблюдаем соотношение между распределением размера и ценой.
df.loc[df['Size']>1000]
После наблюдения эта аномальная точка не является обычным б/у гражданским домом, но, скорее всего, это коммерческий дом, поэтому только 1 комната и 0 зал имеют такую большую площадь, более 1000 квадратных метров, и мы выбираем чтобы удалить его здесь.
df = df[(df['Layout']!='叠拼别墅')&(df['Size']<1000)]
Повторная визуализация показала, что явных выбросов не было.
Анализ особенностей макета
f, ax1= plt.subplots(figsize=(20,20))
sns.countplot(y='Layout', data=df, ax=ax1)
ax1.set_title('房屋户型',fontsize=15)
ax1.set_xlabel('数量')
ax1.set_ylabel('户型')
plt.show()
Я действительно не знаю эту особенность.Сочетание различных залов и комнат даже имеет странные структуры, такие как 9 комнат, 3 зала, 4 комнаты и 0 залов. Среди них преобладают 2 комнаты и один зал, за ними следуют 3 комнаты и один зал, 2 комнаты и 2 зала, 3 комнаты и два зала. Тем не менее, в классификации объектов есть много неправильных названий, таких как 2 комнаты и 1 гостиная, 2 комнаты и 1 ванная комната, а также виллы.Единого названия нет. Такие функции не должны использоваться в качестве входных данных для моделей машинного обучения, и для соответствующей обработки необходимо использовать разработку функций.
Анализ особенностей реконструкции
df['Renovation'].value_counts()
Твердый переплет 11345
Лайт 8497
Другое 3239
Грубый 576
南北
20
Name: Renovation, dtype: int64
Обнаружено, что в декоративных элементах реконструкции есть север и юг. Это относится к типу ориентации. Это может быть связано с тем, что некоторые информационные позиции в процессе сканирования пусты, что приводит к появлению здесь элемента ориентации «Направление», поэтому необходимо清除
или вместо этого换掉
.
# 去掉错误数据“南北”,因为爬虫过程中一些信息位置为空,导致“Direction”的特征出现在这里,需要清除或替换
df['Renovation'] = df.loc[(df['Renovation'] != '南北'), 'Renovation']
# 画幅设置
f, [ax1,ax2,ax3] = plt.subplots(1, 3, figsize=(20, 5))
sns.countplot(df['Renovation'], ax=ax1)
sns.barplot(x='Renovation', y='Price', data=df, ax=ax2)
sns.boxplot(x='Renovation', y='Price', data=df, ax=ax3)
plt.show()
Было замечено, что больше всего подержанных домов с изысканной отделкой, за ними следует простая отделка, которая также распространена у нас в будние дни. Что касается цены, то грубый тип является самым высоким, за ним следует изысканное украшение.
Анализ характеристик лифта
Когда мы впервые исследовали данные, мы обнаружили, чтоElevatorХарактеристики имеют большое количество пропущенных значений, что очень неблагоприятно для нас.Для начала посмотрим, сколько пропущенных значений:
misn = len(df.loc[(df['Elevator'].isnull()), 'Elevator'])
print('Elevator缺失值数量为:'+ str(misn))
Количество пропущенных значений в Elevator составляет:8237
Что делать с таким количеством пропущенных значений? Это необходимо учитывать в соответствии с реальной ситуацией, и обычно используются следующие методы:Вменение среднего/медианы, прямое удаление или прогнозы моделирования на основе других признаков и т. д.
Здесь мы рассматриваем способ заполнения, а есть ли элеватор не числовое значение, и нет среднего и медианы.Как его заполнить? Вот вам идея:Это нужно для того, чтобы судить о наличии лифта в зависимости от этажа.Как правило, на этажах выше 6 есть лифты, а на этажах меньше или равных 6, как правило, нет лифтов.. С этим стандартом все остальное просто.
# 由于存在个别类型错误,如简装和精装,特征值错位,故需要移除
df['Elevator'] = df.loc[(df['Elevator'] == '有电梯')|(df['Elevator'] == '无电梯'), 'Elevator']
# 填补Elevator缺失值
df.loc[(df['Floor']>6)&(df['Elevator'].isnull()), 'Elevator'] = '有电梯'
df.loc[(df['Floor']<=6)&(df['Elevator'].isnull()), 'Elevator'] = '无电梯'
f, [ax1,ax2] = plt.subplots(1, 2, figsize=(20, 10))
sns.countplot(df['Elevator'], ax=ax1)
ax1.set_title('有无电梯数量对比',fontsize=15)
ax1.set_xlabel('是否有电梯')
ax1.set_ylabel('数量')
sns.barplot(x='Elevator', y='Price', data=df, ax=ax2)
ax2.set_title('有无电梯房价对比',fontsize=15)
ax2.set_xlabel('是否有电梯')
ax2.set_ylabel('总价')
plt.show()
В результате было замечено, что количество подержанных домов с лифтами в основном выше, ведь коэффициент использования высотной земли относительно высок, что подходит для нужд огромного населения Пекина, и высокая В многоэтажных домах нужны лифты. Соответственно, цена б/у домов с лифтами выше, т.к. включена плата за отделку и после-техническое обслуживание лифта (но это сравнение цен является лишь усредненным понятием, например, цена 6- этаж элитный посёлок без лифтов конечно выше).
Анализ особенностей года
grid = sns.FacetGrid(df, row='Elevator', col='Renovation', palette='seismic',size=4)
grid.map(plt.scatter, 'Year', 'Price')
grid.add_legend()
В условиях классификации «Ремонт» и «Лифт» используйтеFaceGrid
Анализируя функцию года, можно сделать следующие выводы:
- Общая тенденция цен на подержанное жилье со временем растет;
- По сравнению с тем, что было до 2000 г., стоимость вторичного жилья, построенного после 2000 г., значительно выросла;
- До 1980 г. данных о бывших в употреблении домах с лифтами почти не было, что свидетельствовало об отсутствии масштабной установки лифтов до 1980 г.;
- Среди подержанных домов без лифтов до 1980 года подержанные дома в простой отделке составляли подавляющее большинство, но подержанных домов в твердом переплете было очень мало;
Анализ характеристик пола
f, ax1= plt.subplots(figsize=(20,5))
sns.countplot(x='Floor', data=df, ax=ax1)
ax1.set_title('房屋户型',fontsize=15)
ax1.set_xlabel('数量')
ax1.set_ylabel('户型')
plt.show()
Видно, что количество б/у домов на 6 этаже самое большое, но отдельные этажные характеристики бессмысленны, т.к. общая этажность каждого жилого массива разная, нам необходимо знать относительную значимость этажей. Кроме того, очень важны этажи и культура.Например,китайская культура бывает вверх и вниз.Седьмой этаж может быть популярен и цена на жилье дорогая,но 4 или 18 этажей вообще не бывает. Конечно, в нормальных условиях средний этаж более популярен и цена выше, а нижний и верхний этажи менее популярны и цена относительно низкая. Таким образом, этаж является очень сложной характеристикой, и он также оказывает относительно большое влияние на цены на жилье.
Суммировать
Цель этого обмена — дать всем знать, как использовать Python для простого анализа данных.Это, несомненно, хорошее упражнение для друзей, которые только начинают заниматься анализом данных. Однако в этом анализе еще предстоит решить много проблем, таких как:
- Решить проблему точности источника данных, полученных краулером;
- Нужно просканировать или найти больше хороших функций для продажи;
- Необходимо выполнить больше инженерных работ по функциям, таких как очистка данных, выбор функций и проверка;
- Используйте статистические модели для построения регрессионных моделей для прогнозирования цен;
Больше контента будет представлено и распространено медленно, так что следите за обновлениями.
Обратите внимание на публичный аккаунт WeChatPythonНаука о данных,Получать120G
Учебные материалы по искусственному интеллекту.