資料分析——廣州二手房資料分析
房價一直以來都是大多數人非常關注的物件,房價一升再升,心底一提再提。影響房價的因素有很多,但現在我們分析一下房子自身因素對價格的影響。
- 目標:分析廣州二手房價格的自身影響因素
- 資料來源:上篇文章《scrapy爬蟲爬取廣州二手房資訊》爬蟲爬取房天下網站得來的廣州二手房資料
資料探索:
老規矩,先要匯入我們需要的第三方庫,要用到的有以下這些:
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名如下圖所示,字型越大表示房屋數量越多。
可見中海譽城、碧桂園天璽灣是二手房最多的小區。
結束
房價的影響因素有很多,本文的資料分析有一定的參考價值,但也不可完全相信。