Добавить Автора
Публичный аккаунт 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]
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()
Анализ особенностей реконструкции
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()
Анализ особенностей года
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()
Суммировать
Цель этого обмена — дать всем знать, как использовать Python для простого анализа данных.Это, несомненно, хорошее упражнение для друзей, которые только начинают заниматься анализом данных. Однако в этом анализе еще предстоит решить много проблем, таких как:
- Решить проблему точности источника данных, полученных краулером;
- Нужно просканировать или найти больше хороших функций для продажи;
- Необходимо выполнить больше инженерных работ по функциям, таких как очистка данных, выбор функций и проверка;
- Используйте статистические модели для построения регрессионных моделей для прогнозирования цен;
Больше контента будет представлено и распространено медленно, так что следите за обновлениями.
Обратите внимание на публичный аккаунт WeChatPythonНаука о данных,Получать120G
Учебные материалы по искусственному интеллекту.