Python數據分析實戰項目-北京二手房數據分析

本篇文章主要是介紹一個北京二手房數據分析的項目,目的是熟悉python數據分析的及可視化的一些常用方法。

數據獲取

通過編寫python腳本(爬蟲)從二手房交易數據網站上獲取北京二手房數據集

數據解釋

Direction:方向
District:區域
Elevator:電梯
Floor:樓層
Garden;花園
Id:編號
Layout:佈局
Price:價格
Region:地區
Renovation:翻修,革新
Size:大小
Year:年限
## python源代碼
# 1.數據初探
# 1.1首先導入要使用的科學計算包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 來完成此項目')

# 1.2然後導入數據,並進行初步的觀察,這些觀察包括瞭解數據特徵的缺失值,異常值,以及大概的描述性統計。
# 導入鏈家二手房數據
lianjia_df = pd.read_csv('lianjia.csv')
display(lianjia_df.head(n=2))

# 檢查缺失值情況
lianjia_df.info()

# 1.3初步觀察到一共有11個特徵變量,Price 在這裏是我們的目標變量,然後我們繼續深入觀察一下。
# 檢查缺失值情況
lianjia_df.info()
lianjia_df.describe()

# 添加新特徵房屋均價
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))

# 2 數據可視化分析
# 2.1 Region特徵分析

# 對於區域特徵,我們可以分析不同區域房價和數量的對比。
# 對二手房區域分組對比二手房數量和每平米房價
# 使用了pandas的網絡透視功能 groupby 分組排序。
# 區域特徵可視化直接採用 seaborn 完成,顏色使用調色板 palette 參數,顏色漸變,越淺說明越少,反之越多
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=12)
ax1.set_xlabel('區域', fontsize=12)
ax1.set_ylabel('每平米單價', fontsize=12)

sns.barplot(x='Region', y='Price', palette="Greens_d", data=df_house_count, ax=ax2)
ax2.set_title('北京各大區二手房數量對比', fontsize=12)
ax2.set_xlabel('區域', fontsize=12)
ax2.set_ylabel('數量', fontsize=12)

sns.boxplot(x='Region', y='Price', data=df, ax=ax3)
ax3.set_title('北京各大區二手房房屋總價', fontsize=12)
ax3.set_xlabel('區域', fontsize=12)
ax3.set_ylabel('房屋總價', fontsize=12)

# plt.show()
plt.savefig("Region.png")

# 2.2 Size特徵分析
f, [ax1, ax2] = plt.subplots(1, 2, figsize=(15, 10))

# 二手房面積的分佈情況
sns.distplot(df['Size'], bins=20, ax=ax1, color='r')
sns.kdeplot(df['Size'], shade=True, ax=ax1)
ax1.set_title('二手房面積的分佈情況', fontsize=12)
ax1.set_xlabel('面積/平米', fontsize=12)
ax1.set_ylabel('所佔比例', fontsize=12)

# 建房時間和出售價格的關係
sns.regplot(x='Size', y='Price', data=df, ax=ax2)
ax2.set_title('建房時間和出售價格的關係', fontsize=12)
ax2.set_xlabel('面積/平米', fontsize=12)
ax2.set_ylabel('價格', fontsize=12)
# plt.show()
plt.savefig('Size.png')

print("房屋面積小於10平米:")
print(df.loc[df['Size'] < 10])

print("房屋面積大於1000平米:")
print(df.loc[df['Size'] > 1000])

# 2.3 Layout特徵分析
f, ax1 = plt.subplots(figsize=(20, 20))
sns.countplot(y='Layout', data=df, ax=ax1)
ax1.set_title('房屋戶型與數量關係', fontsize=12)
ax1.set_xlabel('數量', fontsize=12)
ax1.set_ylabel('戶型', fontsize=12)
# plt.show()
plt.savefig('Layout.png')

# 2.4Renovation特徵分析
print(df['Renovation'].value_counts())
# 去掉數據中裝修特徵“南北”
df['Renovation'] = df.loc[(df['Renovation'] != '南北'), 'Renovation']
# 畫幅設置
f, [ax1, ax2, ax3] = plt.subplots(1, 3, figsize=(20, 10))
sns.countplot(df['Renovation'], ax=ax1)
ax1.set_title('裝修特徵與數量關係', fontsize=12)
ax1.set_xlabel('裝修特徵', fontsize=12)
ax1.set_ylabel('數量', fontsize=12)

sns.barplot(x='Renovation', y='Price', data=df, ax=ax2)
ax2.set_title('裝修特徵與價格關係', fontsize=12)
ax2.set_xlabel('裝修特徵', fontsize=12)
ax2.set_ylabel('價格', fontsize=12)

sns.boxplot(x='Renovation', y='Price', data=df, ax=ax3)
ax3.set_title('裝修特徵與數量關係箱型圖', fontsize=12)
ax3.set_xlabel('裝修特徵', fontsize=12)
ax3.set_ylabel('數量', fontsize=12)
# plt.show()
plt.savefig('Renovation.png')

# 2.5Elevator特徵分析
# 初探數據時,Elevator有大量的缺失值
misn = len(df.loc[(df['Elevator'].isnull()), 'Elevator'])
print("電梯的缺失值數量:", misn)

# 由於存在個別類型錯誤,如簡裝和精裝,特徵值錯位,故需要移除
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()
plt.savefig("Elevator.png")

#2.6 Year特徵分析
grid = sns.FacetGrid(df, row='Elevator', col='Renovation', palette='seismic',size=4)
grid.map(plt.scatter, 'Year', 'Price')
grid.add_legend()
grid.savefig("Year.png")

分析結果

二手房均價:西城區的房價最貴均價大約11萬/平,因爲西城在二環以裏,且是熱門學區房的聚集地。其次是東城大約10萬/平,然後是海淀大約8.5萬/平,其它均低於8萬/平。

二手房房數量:從數量統計上來看,目前二手房市場上比較火熱的區域。海淀區和朝陽區二手房數量最多,差不多都接近3000套,畢竟大區,需求量也大。然後是豐臺區,近幾年正在改造建設,有趕超之勢。

二手房總價:通過箱型圖看到,各大區域房屋總價中位數都都在1000萬以下,且房屋總價離散值較高,西城最高達到了6000萬,說明房屋價格特徵不是理想的正太分佈。

1.Region特徵分析在這裏插入圖片描述

2.Size特徵分析

在這裏插入圖片描述

3.Layout特徵分析

在這裏插入圖片描述

4.Renovation特徵分析

在這裏插入圖片描述

5.Elevator特徵分析

在這裏插入圖片描述

6.Year特徵分析

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章