1. 程式人生 > >資料分析——廣州二手房資料分析

資料分析——廣州二手房資料分析

房價一直以來都是大多數人非常關注的物件,房價一升再升,心底一提再提。影響房價的因素有很多,但現在我們分析一下房子自身因素對價格的影響。

資料探索:

老規矩,先要匯入我們需要的第三方庫,要用到的有以下這些:

import pandas as pd
import numpy as np
import  re
import seaborn as sns
import matplotlib.pyplot as plt
import PIL.Image as Image

 然後匯入資料進行初步觀察和清洗,包括處理缺失值、異常值,以及一些描述性統計。

#匯入資料
input_file = '..\\廣州二手房\\二手房資料.xlsx'
output_file = '..\\廣州二手房\\清洗後的二手房資料.xlsx'
f = open(input_file,'rb')
data = pd.read_excel(f)
f.close()
print(data.info())  #檢視缺失值情況

可以看到,初始資料有73829條,特徵year有明顯的缺失值。

上面結果給出了特徵值是數值的一些統計值,包括平均數,標準差,中位數,最小值,最大值,25%分位數,75%分位數。這些統計結果簡單直接,對於初始瞭解一個特徵好壞非常有用,比如我們觀察到 totalprice 特徵 的最大值為88888萬,最小值為14萬,那麼我們就要思考這個在實際中是不是存在的,如果不存在沒有意義,那麼這個資料就是一個異常值,會嚴重影響模型的效能。 

使用Pandas做資料清洗,去除重複及錯誤部分。

data = data[['district','region','layout','size','direction','floor','year','address','totalprice','unitprice']]
data = data.dropna() #刪除缺失值
#處理朝向資訊
data = data[data['direction'].str.len()<=3]
data['direction'] = data['direction'].str.replace("向","")
data = data[data['direction'].str.len()<=2]
處理建樓年份資訊,去掉不合理的所有房屋
data = data[data['year'].str.len()>3]
data['year'] = data['year'].str.replace("年建","")
data = data[data['year'].str.isdigit()]
data['year'] = data['year'].astype('int')
data = data[data['year'] < 2019]
#處理樓層資訊
floor = data['floor'].values
for i in range(len(floor)):
    floor[i] = re.sub("\D","",floor[i])
data['floor'] = floor
data['floor'] = data['floor'].astype('int')
#處理房屋佈局資訊
data['layout'] = data['layout'].str[:4]
data = data[data['layout'] != '暫無']
#處理房屋面積資訊,去掉不合理的所有房屋
data['size'] = data['size'].str.replace('平米','')
data['size'] = data['size'].str.replace('�O','')
data['size'] = data['size'].astype('float')
data['size'] = data['size'].astype('float')
data = data[data['size'] < 1000]
#處理單價資訊,去掉價格不合理的所有房屋
data['unitprice'] = data['unitprice'].str.replace('元/平米','')
data['unitprice'] = data['unitprice'].str.replace('元/�O','')
data['unitprice'] = data['unitprice'].astype('int')
data = data[data['unitprice'] < 800000]
#處理總價資訊,去掉價格不合理的所有房屋
data = data[data['totalprice']<15000]

再看看清洗之後的資料資訊,只剩下70200條資料,不存在缺失值。

資料分析:

1.各區二手房數量對比

plt.rcParams['font.sans-serif'] = ['SimHei']  #用來顯示中文
plt.rcParams['axes.unicode_minus'] = False  #用來正常顯示負號

district = data['district']
#分析廣州各區的二手房數量
district_count = district.value_counts() #統計各個地區出現的次數
district_count.plot.bar(title='廣州各區二手房數量對比')
plt.axhline(0,color='k')  #”axhline”的主要作用是在縱軸x=0的位置加入一條黑色的直線,來分隔y>0的軸和y<0的軸。
plt.show()

分析得到,天河區的二手房數量最多為8607,海珠區次之為7682,其中番禺、增城、白雲和黃埔區4區二手房數量差不多,在6900左右,從化區的數量最少,僅為3753。

2.廣州各區二手房每平米單價對比

data = data[['district','unitprice']]
house_mean = data.groupby('district')['unitprice'].mean().sort_values(ascending=False).to_frame().reset_index()
ax = sns.barplot(x='district',y='unitprice',palette='Blues_d',data=house_mean)
ax.set_title("廣州各區二手房每平米單價對比",fontsize=15)
ax.set_xlabel("廣州各區")
ax.set_ylabel("每平米單價")
plt.show()
"""
使用groupby分組排序功能;
to_frame表示為建立DataFrame
reset_index 表示重設行引索,從0開始
"""

雖然越秀區的二手房數量相對較少,但其均價比經濟強區天河區更高一些,達到大約5.4萬/平米,而天河區的均價大約為5.2萬/平米僅排在第二位 ,海珠區以大約4.4萬/平米位於第三。其餘的都低於4萬/平米,但最低的從化區都達到了大約1.3萬/平米。看來一線城市的房價真不是虛的,小編我直言買不起啊(T.T)

3.廣州各區二手房總價對比

price = data[['district','totalprice']]
ax = sns.boxplot(x='district',y='totalprice',data=price)
plt.show()

通過箱型圖看到,各大區域房屋總價中位數都都在400萬以下,且房屋總價離散值較高,幾個區都出現高於6000萬的,這些往往都是巨型豪宅,也說明了房屋價格特徵不是理想的正太分佈。

4.建樓年份與總價的聯絡

data = data[['year','totalprice']]
data.plot(x='year',y='totalprice',kind = 'scatter',title = '建樓年份與總價的聯絡',grid = True,fontsize = 15)
plt.show()

 

通過上圖的觀察,可以發現

  • 隨著年份的增加,整個二手房房價有增長的趨勢
  • 隨著年份的增加,二手房數量也有增長的趨勢
  • 在2000年之前,房價超過2000萬的二手房非常少,2000年後,房價超過2000萬的二手房處於一個井噴期

5.房屋朝向分析

data = data['direction']
data = data.str.replace("南北","南")
data = data.str.replace("東西","西")
data = data.value_counts()
fig = plt.figure()
data.plot.pie(autopct='%.2f%%', fontsize=12,figsize = (10,10))
plt.show()

很明顯,廣州絕大部分的房子都是坐北朝南的,東南朝向的房子也佔到了15.55%。這也很符合消費者的心理需求,人們總說“南北朝向的房子是最好”。因為坐北朝南,南北通透的房子,光線好,能透風,光線好,人的心情就會很好;南北通透的房子,冬暖夏涼,不論南方北方夏天太陽毒辣,它不會照射進來,朝南的房子夏天更涼快,冬天太陽照射時間長,冬天暖和。

6.房屋面積對比

f, [ax1,ax2] = plt.subplots(1, 2, figsize=(15, 5))
sns.distplot(data['size'], bins=20, color='k',ax = ax1)
sns.kdeplot(data['size'], shade=True,ax=ax1)
sns.regplot(x='size', y='totalprice', data=data, ax=ax2)
plt.show()

 

  • size 分佈:

通過 distplot  和 kdeplot 繪製柱狀圖觀察 size 特徵的分佈情況,屬於長尾型別的分佈,這說明了有很多面積很大且超出正常範圍的二手房。

  • size 與 totalprice 的關係:

通過 regplot 繪製了 size 和 totalprice 之間的散點圖,發現 size 特徵基本與totalprice呈現線性關係,符合基本常識,面積越大,價格越高。但是有兩種很明顯的異常點:1.面積很小,但價格非常高。2.面積超大,價格卻很低。這需要根據實際情況去考察。

7.房屋戶型分析

print(data['layout'].value_counts())
f, ax1= plt.subplots(figsize=(20,20))
sns.countplot(y='layout', data=data, ax=ax1)
ax1.set_title('房屋戶型',fontsize=15)
ax1.set_xlabel('數量')
ax1.set_ylabel('戶型')
plt.show()

 

在layout這個特徵中可以看出有各種各樣的戶型,竟然還出現了0室0廳……真是各種搭配都有。其中3室2廳、2室2廳、2室1廳是最多的 ,數量分別達到29786、14683和7728。4室2廳、1室1廳、3室1廳也分別達到了6647、3715和3224。

8.小區分佈

from wordcloud import WordCloud
import pandas as pd
import numpy
import matplotlib.pyplot as plt
import PIL.Image as Image


region_text = data['region']
region_text = "/".join(region_text.values)
#print(region_text)


mask_pic=numpy.array(Image.open("house.jpg")) #讀取背景圖片,
cloud = WordCloud(
    #設定字型,不指定就會出現亂碼,檔名不支援中文
    font_path="luobo.ttf",
    #設定背景色,預設為黑,可根據需要自定義為顏色
    background_color='white',
    #詞雲形狀,
    mask=mask_pic,
    #允許最大詞彙
    max_words=1000,
    #最大號字型,如果不指定則為影象高度
    max_font_size=100,
    #畫布寬度和高度,如果設定了msak則不會生效
    width=1000,
    height = 1000,
    #詞語水平擺放的頻率,預設為0.9.即豎直襬放的頻率為0.1
    prefer_horizontal = 0.8
)
wc = cloud.generate(region_text) #產生詞雲

wc.to_file("小區詞雲圖.jpg") #儲存圖片
#顯示詞雲圖片
plt.imshow(wc)

相對於行政區,小區的劃分更加精細,能夠反映除房屋自身屬性以外的其它屬性,如位置、交通、生活的便利程度等,因此根據統計資料分析自如各個小區的房屋分佈情況,取前1000名如下圖所示,字型越大表示房屋數量越多。

 可見中海譽城、碧桂園天璽灣是二手房最多的小區。

結束

房價的影響因素有很多,本文的資料分析有一定的參考價值,但也不可完全相信。