項目說明
通過對深圳自如網(wǎng)站上的房源情況進行探索分析,進而了解深圳自如房租的相關情況。
探索的問題
- 房租的分布情況
- 哪種戶型的房源最多
- 哪條地鐵線附近的房租比較貴
- 哪個區(qū)的房租更貴
- 房源的面積分布情況
數(shù)據(jù)說明
- 數(shù)據(jù)來源深圳自如網(wǎng)站(僅包含可出租狀態(tài)的合租房源)
- 采用集搜客工具爬取
- house_area: 表示房間的面積
- house_toom: 表示出租房屋的戶型
- house_price: 表示每月的房租
- house_name: 表示房源所處的小區(qū)
- house_located: 表示房源所處的區(qū)
- subway_info: 表示房源附近是否有地鐵站
數(shù)據(jù)清洗
數(shù)據(jù)預覽
# coding: utf-8
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['Microsoft YaHei'] # 使圖形能夠正常顯示中文
%pylab inline
df_sz_ziroom = pd.read_csv('ziroom_sz.csv') # 加載數(shù)據(jù)
df_sz_ziroom.head(2) # 預覽數(shù)據(jù)

df_sz_ziroom = df_sz_ziroom.drop('Unnamed: 0', axis=1) # 刪掉無用的列
df_sz_ziroom.head(5) # 預覽前五條數(shù)據(jù)

df_sz_ziroom.tail(5) # 預覽后5條數(shù)據(jù)

需要清洗的字段
除了 house_room 字段外,剩下的字段都需要清洗,為了便于分析還需要新增字段。
1. house_area 字段有 "15.2 " 和 "約9.5
" 兩種格式,需要轉換成純數(shù)字格式。
def remove_m2(area):
'''提取 house_area 字段中的數(shù)字'''
if str(area).split()[0].decode('utf-8')[0].isdigit(): # 若字段中無“約”直接取 split 后的列表中的第一個子元素
area = area.split()[0]
else:
area = str(area).split()[0].decode('utf-8')[1:] # 若字段中有“約”則從 split 后列表中的第一個子元素的第二個位置開始取
return float(area)
df_sz_ziroom['house_area'] = df_sz_ziroom['house_area'].apply(remove_m2)
df_sz_ziroom['house_area'].head(5) # 預覽后15條數(shù)據(jù)
0 15.5
1 24.0
2 15.0
3 6.3
4 7.8
Name: house_area, dtype: float64
2. house_price 字段目前格式為 "¥1490 (每月)",要把其修改為純數(shù)字格式
def remove_rmb(price):
'''提取 house_price 字段中的數(shù)字'''
return int(price.split()[1])
df_sz_ziroom['house_price'] = df_sz_ziroom['house_price'].apply(remove_rmb)
df_sz_ziroom['house_price'].head()
0 1660
1 2230
2 1830
3 1860
4 1930
Name: house_price, dtype: int64
3. house_name 字段目前的格式類似為 "樺潤馨居4居室-南臥",需要把小區(qū)名字提取出來,如 "樺潤馨居"
def get_house_name(name):
'''提取 house_name 字段中的小區(qū)名字'''
return name.decode('utf-8').split('-')[0][:-3].encode('utf-8')
df_sz_ziroom['house_name'] = df_sz_ziroom['house_name'].apply(get_house_name)
df_sz_ziroom['house_name'].head()
0 龍園山莊
1 塘朗城廣場東區(qū)
2 龍園山莊
3 塘朗城廣場東區(qū)
4 桃源村一期
Name: house_name, dtype: object
4. house_located 字段格式為 "[龍華區(qū)龍華中心] 4號線(龍華線)龍華" 包含所在的區(qū)和地鐵兩項信息,現(xiàn)需要把這兩項信息提取并設置為兩個字段
4.1 提取地鐵信息
def get_subway(house_located):
'''從 house_located 中提取地鐵信息'''
info = house_located.decode('utf-8').replace('[', ' ').replace(']', ' ').split()
if len(info) > 1: # 判斷 house_located 字段中是否包含地鐵信息
if info[1][:2].isdigit(): # 判斷地鐵號是否為兩位數(shù) 如 11號線
subway_info = info[1][:4].encode('utf-8') # 若地鐵號為兩位數(shù),則取 split 后的列表中的第二個元素的前四位
else:
subway_info = info[1][:3].encode('utf-8') # 若地鐵號為1位數(shù),則取 split 后的列表中的第二個元素的前三位
else:
subway_info = None # 若無地鐵信息則返回 None
return subway_info
df_sz_ziroom['subway_info'] = df_sz_ziroom['house_located'].apply(get_subway) # 新建 subway 字段
df_sz_ziroom['subway_info'].head()
0 3號線
1 5號線
2 3號線
3 5號線
4 7號線
Name: subway_info, dtype: object
4.2 提取所在的區(qū)的信息
def house_located(house_located):
'''從 house_located 中提取區(qū)信息'''
info = house_located.decode('utf-8').replace('[', ' ').replace(']', ' ').split()
return info[0][:3].encode('utf-8')
df_sz_ziroom['house_located'] = df_sz_ziroom['house_located'].apply(house_located)
df_sz_ziroom['house_located'].head()
0 羅湖區(qū)
1 南山區(qū)
2 羅湖區(qū)
3 南山區(qū)
4 南山區(qū)
Name: house_located, dtype: object
df_sz_ziroom.sort_values(by='house_area').head(5) # house_area 列有異常值

df_sz_ziroom = df_sz_ziroom.drop(df_sz_ziroom[df_sz_ziroom['house_area']==0.1].index)
df_sz_ziroom.sort_values(by='house_area').head(5)

df_sz_ziroom.to_csv('cleaned_sz_ziroom.csv') # 清洗后的數(shù)據(jù)保存為新的 csv 文件
數(shù)據(jù)探索
1 單維度分析
1.1 房租分布情況
df_sz_ziroom['house_price'].describe()
count 899.000000
mean 2068.787542
std 465.815828
min 1130.000000
25% 1760.000000
50% 1930.000000
75% 2290.000000
max 4360.000000
Name: house_price, dtype: float64
- 最低的房租為 1130 元每月,最貴的房租為 4360 元每月,土豪專屬。
- 平均房租為 2068 元每月,75% 的房租超過 1760 元每月。
接下來看看最高房租和最低房租的是什么房子
df_sz_ziroom[df_sz_ziroom['house_price'] == 1130]

df_sz_ziroom[df_sz_ziroom['house_price'] == 4360]

- 房租最低的房子位于龍崗區(qū),龍崗區(qū)比較偏僻,且該套房源為6室1廳,房租最低也正常。
- 房租最貴的房子位于南山區(qū)在二號線旁邊,2號線經過的基本都是深圳最繁華的地帶,房租這么高也正常。
def delete_spines():
ax = plt.gca()
ax.spines['top'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.spines['right'].set_visible(False)
plt.style.use('seaborn-talk')
x = df_sz_ziroom['house_price']
plt.hist(x, bins=26, edgecolor='black')
new_xticks = np.linspace(1000, 4500, 15)
plt.xticks(new_xticks)
plt.xlabel("house_price rmb/month")
plt.ylabel("count")
plt.title(u"深圳自如房租直方圖")
ax = plt.gca()
ax.spines['top'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.yaxis.grid(True)
plt.show()

大部分的房價集中在 1625 到 2250 元每月,其中 1750 到 2000 元每月的房源最多。超過 3500 元每月的房源很少。因為本次分析的都是合租房源,看來深圳自如的房租還是比較貴。
1.2 面積分布情況
df_sz_ziroom['house_area'].describe()
count 899.000000
mean 11.462803
std 3.322627
min 5.360000
25% 9.200000
50% 11.100000
75% 13.300000
max 30.900000
Name: house_area, dtype: float64
最小面積為 5.36 ,最大面積為 30.9
,平均面積為 11.46
??磥泶蠖鄶?shù)房間的面積都不是很大,真是面積又小,價格又貴。
x = df_sz_ziroom['house_area']
plt.hist(x, bins=16, edgecolor='black')
plt.xlabel('house_area $m^2$')
plt.ylabel('count')
plt.title(u'深圳自如房間面積直方圖')
ax = plt.gca()
ax.spines['top'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.yaxis.grid(True)
plt.show()

絕大多數(shù)房間的面積集中在 6.3 到 12.7 之間,其中 10 到 12.7
之間的房源最多。超過 20
的房源很少,租房形式真嚴峻。
1.3 戶型分布情況
def add_text(x, y):
for a, b in zip(x, y):
plt.text(a, b+0.05, '%.0f' % b, ha='center', va='bottom', fontsize=15)
x = np.arange(len(df_sz_ziroom['house_room'].unique()))
y = df_sz_ziroom['house_room'].value_counts()
x_ticks = [room.decode('utf-8') for room in df_sz_ziroom['house_room'].unique()]
plt.bar(x, y)
plt.xticks(x, x_ticks)
plt.xlabel('house_room')
plt.ylabel('count')
plt.title(u'深圳自如戶型分布圖')
delete_spines()
add_text(x, y)

戶型最多的為4室1廳,其次為3室1廳,最少的為2室1廳。
戶型太大,住的人太多,租客不愿意租,戶型太小,自如估計賺不了多少錢,大量推出4室1廳的房源可以兼顧兩方面。
1.4 區(qū)域房源分布情況
x = np.arange(len(df_sz_ziroom['house_located'].unique()))
y = df_sz_ziroom['house_located'].value_counts()
plt.bar(x, y)
x_ticks = [located.decode('utf-8') for located in df_sz_ziroom['house_located'].unique()]
plt.xticks(x, x_ticks)
plt.xlabel('house_located')
plt.ylabel('count')
plt.title(u'深圳自如房源區(qū)域分布圖')
delete_spines()
add_text(x, y)

羅湖區(qū)的房源最多,其次是南山區(qū),最少的是福田區(qū)。在福田上班的話不妨去羅湖租房,房源比較多。
1.5 地鐵附近房源分布圖
x = np.arange(len(df_sz_ziroom['subway_info'].dropna().unique()))
y = df_sz_ziroom['subway_info'].value_counts()
plt.bar(x, y)
x_ticks = [subway.decode('utf-8') for subway in df_sz_ziroom['subway_info'].dropna().unique()]
plt.xticks(x, x_ticks)
plt.xlabel('subway_info')
plt.ylabel('count')
plt.title(u'深圳地鐵附近自如房源分布圖')
delete_spines()
add_text(x, y)

3號線附近的房源最多,由于3號線終點和起點分別在羅湖和龍崗,在羅湖上班的話,沿著3號線租房最好,不僅房源多,而且龍崗的房租普遍比較便宜,上班地鐵直達。
5號線附近房源數(shù)量排在第二位,由于5號線橫跨羅湖區(qū)、南山區(qū)、寶安區(qū),中途換乘站非常多,不論在羅湖還是南山還是寶安區(qū),沿著5號線附近租房也是不錯的選擇。
1.6 小區(qū)數(shù)量分布圖
x = np.arange(len(df_sz_ziroom['house_name'].value_counts().head(5).index))
y = df_sz_ziroom['house_name'].value_counts().head(5)
plt.bar(x, y)
x_ticks = [name.decode('utf-8') for name in df_sz_ziroom['house_name'].value_counts().head(5).index]
plt.xticks(x, x_ticks)
plt.xlabel('house_name')
plt.ylabel('count')
plt.title(u'深圳自如房源小區(qū)分布圖')
delete_spines()
add_text(x, y)

房源最多的小區(qū)為佳兆業(yè)城市廣場三期,數(shù)量高達102套,其次為港鐵天頌。
佳兆業(yè)城市廣場三期位于華為基地附近,在華為上班去該小區(qū)租房是個不錯的選擇。
港鐵天頌位于深圳北高鐵站附近,需要經常坐高鐵出差去該小區(qū)租房是個不錯的選擇。
2 雙維度分析
2.1 面積和房租
x = df_sz_ziroom['house_price']
y = df_sz_ziroom['house_area']
fig = plt.figure()
ax1 = fig.add_subplot(1, 2, 1)
ax2 = fig.add_subplot(1, 2, 2)
ax1.scatter(x, y)
ax1.set_xlabel('house_price')
ax1.set_ylabel('house_area')
ax1.set_title(u'房租面積散點圖')
ax2.scatter(sqrt(x), log10(y))
ax2.set_xlabel('sqrt_house_price')
ax2.set_ylabel('log10_house_area')
ax2.set_title(u'房租面積散點圖')
plt.show()

- 圖1為房子的面積和房租的關系圖
- 圖2為對面積和房租分別取平方根和對數(shù)的關系圖
從圖2中發(fā)現(xiàn)面積和房租并沒有呈現(xiàn)出明顯的線性關系,并不是房間面積越大,房租越貴。
2.2 區(qū)域和房租
df_located_price = df_sz_ziroom.loc[:,['house_located', 'house_price']]
df_located_price = df_located_price.groupby('house_located')['house_price']\
.apply(pd.Series.reset_index, drop=True).unstack()
df_located_price.head()

xs = [x[~np.isnan(x)] for x in df_located_price.values]
plt.boxplot(xs)
x_ticks = [tick.decode('utf-8') for tick in df_located_price.index]
plt.xticks(arange(1, len(xs)+1), x_ticks)
y_ticks = np.linspace(1000, 4500, 8)
plt.yticks(y_ticks)
plt.xlabel('house_located')
plt.ylabel('price')
plt.title(u'房源所在區(qū)域和房租箱線圖')
plt.gca().yaxis.grid(True)
delete_spines()
plt.show()

南山區(qū)的房租貴,75%的房租高于2000元每月,其箱體也最長。南山區(qū)積聚了大量互聯(lián)網(wǎng)企業(yè),薪資水平在深圳相對來說也非常高。
福田區(qū)的房租緊隨南山區(qū)之后,龍崗區(qū)和羅湖區(qū)的房租最低。
如果在南山區(qū)工作,去寶安租房是個不錯的選擇,地鐵方便,房租也比南山便宜。
在福田區(qū)工作,去羅湖和龍華租房是個不錯的選擇,地鐵方便,房租也比福田便宜很多。
2.2 地鐵沿線房租情況
df_subway_price = df_sz_ziroom.loc[:,['subway_info', 'house_price']]
df_subway_price.head()
df_subway_price = df_subway_price.groupby('subway_info')['house_price']\
.apply(pd.Series.reset_index, drop=True).unstack()
df_subway_price.head()

xs = [x[~np.isnan(x)] for x in df_subway_price.values]
plt.boxplot(xs)
x_ticks = [tick.decode('utf-8') for tick in df_subway_price.index]
plt.xticks(arange(1, len(xs)+1), x_ticks)
plt.gca().yaxis.grid(True)
plt.xlabel('subway_info')
plt.ylabel('price')
plt.title(u'地鐵沿線房租箱線圖')
delete_spines()
plt.show()

2號線沿線的房租最貴,絕大部分都超過2000元每月,2號線沿線都是比較繁華的地方,房租自然比較高。1號線和11號線沿線的房租緊隨2號線其后。
3號線和5號線沿線的房租比較低。
3 多維度分析
3.1 面積,房租,區(qū)域,地鐵沿線
import sys
default_stdout = sys.stdout
default_stderr = sys.stderr
reload(sys)
sys.stdout = default_stdout
sys.stderr= default_stderr
sys.setdefaultencoding('utf8')
import seaborn as sns
sns.set_style("darkgrid",{"font.sans-serif":['Microsoft YaHei']})
sns.FacetGrid(df_sz_ziroom, col='house_located', col_wrap= 3,
hue='subway_info',size=3, aspect=1)\
.map(plt.scatter, "house_area", "house_price")\
.add_legend()
plt.show()

2號線沿線的房子最貴,主要分布在南山區(qū)和福田區(qū),絕大多數(shù)房租均超過2000元每月。
5號線和3號線沿線的房子主要分布在羅湖區(qū)和龍崗區(qū),且絕大多數(shù)房價低于2000元每月。5號線沿線少量的大面積房源分布子在龍華區(qū)。
7號線和9號線沿線的房子主要分布在福田區(qū)和羅湖區(qū),且價格大多數(shù)超過2000元每月。
4號線沿線的房子絕大部分分布在龍華區(qū),絕大部分價格比較高的分布在福田區(qū)。
1號線和11號線沿線的房子主要分布南山區(qū)和寶安區(qū),分布在寶安區(qū)的房租相對來說比較低。
結論
- 深圳自如絕大多數(shù)房租超過1700元,且面積都不大,不過結合深圳的實際租房情況和自如的服務,這個價位還是可以考慮。
- 南山區(qū)的房租最貴,房源數(shù)量也是第二多的,南山區(qū)也聚集了大量互聯(lián)網(wǎng)企業(yè),對于經常加班的互聯(lián)網(wǎng)從業(yè)者來說在公司附近租房是個不錯的選擇。
- 龍崗區(qū)和羅湖區(qū)的房租最低,且羅湖區(qū)房源數(shù)量最多,在羅湖上班想租的近一點可以選擇羅湖,考慮便宜一點的可以去龍崗區(qū)租房。