鏈家二手房數(shù)據(jù)鏈接:https://pan.baidu.com/s/1ZLT30nyCPTbx1_ISW5fMCg 提取碼:8a2y
這是我第二篇數(shù)據(jù)分析項目實戰(zhàn),當凌晨一點分析結(jié)束后深刻體會到學(xué)以致用的重要性留特、接觸實戰(zhàn)項目的重要性咙咽。
因為按照我的學(xué)習(xí)計劃只練習(xí)一篇實戰(zhàn)項目即"cd用戶消費行為分析",不過……慶幸的是在朋友的影響下練習(xí)了本項目媒峡,并進一步了解python第三方庫瘟栖。
在開篇之前附上數(shù)據(jù)分析思路
1、數(shù)據(jù)的清洗
導(dǎo)入常用的包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei']#顯示中文
導(dǎo)入數(shù)據(jù)并讀取前五行
df = pd.read_csv("鏈家二手房.csv",engine='python')
df.head()
因為中文字符的列名在處理的時候比較麻煩谅阿,將其轉(zhuǎn)化為英文字符的列名半哟,并查看數(shù)據(jù)顯示前五行
df.rename(columns = {'小區(qū)名稱':'village','戶型':'house_type',
'面積':'area','區(qū)域':'district','朝向':'orientations','價格(W)':'total_price',
'單價(平方米)':'unit_price','建筑時間':'construction_time','樓層':'floor'},inplace = True)
df.head()
查看數(shù)據(jù)類型及缺失情況
df.dtypes #查看數(shù)據(jù)類型
df.isnull().sum() #查看數(shù)據(jù)缺失情況
- orientations字段缺失行數(shù)為1355,construction_time字段缺失行數(shù)為6216签餐,floor字段缺失行數(shù)為755寓涨,這些缺失值在下面對其進行分析時再加以處理
由上面數(shù)據(jù)預(yù)覽可知,應(yīng)將floor列分成兩列以便后續(xù)分析使用氯檐,故在此將其分成兩列并查看前五行數(shù)據(jù)
df1 = pd.concat([df,df['floor'].str.split('/',expand = True)],axis = 1)
df1.head()
- split是分隔符戒良;concat兩表的聯(lián)結(jié),axis = 1按列維度合并
刪除floor列冠摄,重命名新得到的列
del df1['floor']
df1.rename(columns = {0:'floor_level',1:'floor'},inplace = True)
df1.tail()
數(shù)據(jù)清洗:提取construction_time和floor字段中的數(shù)字糯崎、刪除文字部分,查看前5行數(shù)據(jù)
df1['construction_time']=df1['construction_time'].str.extract('(\d+)年建')
df1['floor']=df1['floor'].str.extract('(\d+)層')
df1.head()
查看數(shù)據(jù)類型
df1.info()
- construction_time和floor是字符串的格式耗拓,轉(zhuǎn)化為浮點數(shù)的格式
df1['construction_time'] = df1['construction_time'].astype(float)
df1['floor'] = df1['floor'].astype(float)
df1.dtypes
查看描述性統(tǒng)計
df1.describe() #查看描述性統(tǒng)計
- 由以上描述性統(tǒng)計結(jié)果可以得到如下信息:
- 1.面積平均值為96㎡拇颅,面積中位數(shù)為85㎡,說明少數(shù)大面積的房源拉高了的總體平均水平
- 2.總價平均值為580萬乔询,總價中位數(shù)為430萬樟插,情況與上面一樣,少數(shù)總價高的房源拉高了總體的平均水平
- 3.單價平均數(shù)為59725元,單價中位數(shù)為58068元黄锤,平均值與中位數(shù)基本相等搪缨,說明房價升高趨勢比較線性
2、數(shù)據(jù)分析:各城區(qū)房源數(shù)量分布
【找一張上海地區(qū)結(jié)構(gòu)圖】
上海市區(qū)共分為三個等級:
1鸵熟、黃浦區(qū)副编、長寧區(qū);
2流强、靜安區(qū)痹届、徐匯區(qū);
3打月、楊浦區(qū)队腐、虹口區(qū)党窜、普陀區(qū)拴袭。
上海郊區(qū)共分為三個等級:
1雀监、寶山區(qū)甫匹、閔行區(qū);
2也物、松江區(qū)逛漫、嘉定區(qū)垛膝、青浦區(qū)肺稀;
3第股、奉賢區(qū)、崇明區(qū)盹靴、金山區(qū)炸茧。
district_number=df1.district.value_counts().reset_index().sort_values(by='district',ascending=False)
district_number
可視化
plt.figure(figsize=(9,4))
district_number.plot(x = 'index',y = 'district',kind = 'line')
plt.title('各城區(qū)房源數(shù)量')
- 由以上柱狀圖分析可知,除了靜安區(qū)稿静、金山區(qū)和崇明區(qū)房源數(shù)量不到50以外辕狰,其他14個城區(qū)二手房數(shù)量均在1300套以上改备,數(shù)量最多的為浦東區(qū)蔓倍,共有2599套
3母剥、各城區(qū)總面積和平均面積的分布
3.1各城區(qū)總面積分布
因為靜安环疼、金山习霹、崇明區(qū)的房源較少無法代表整體,所以在這里刪除這三個區(qū)的數(shù)據(jù)
dis_list=list(df1.district.drop_duplicates())#drop_duplicates()去除確定列下的重復(fù)列
#drop_duplicates()去除確定列下的重復(fù)列
dis_list.remove('崇明')
dis_list.remove('金山')
dis_list.remove('靜安')
dis_list
刪除上述的三個區(qū)炫隶,并查看刪除后的所有數(shù)據(jù)前五行
df2 = df1[df1.district.isin(dis_list)]
df2.head()
計算各城區(qū)二手房源總面積:
grouped_total_area = df2.groupby('district').sum().sort_values('area',ascending = False).reset_index()
grouped_total_area
可視化:作出各城區(qū)總面積折線圖
plt.figure(figsize=(12,5))
grouped_total_area.plot(x = 'district',y = 'area',kind = 'line')
plt.title('各城區(qū)總面積分布')
- 由上圖可知淋叶,總面積排名前三位的分別是:青浦、松江和浦東伪阶,這得益于它們較大的面積
3.2各城區(qū)平均面積分布
grouped_area = df2.groupby('district').area.mean().reset_index().sort_values('area',ascending = False)
grouped_area
可視化:作出各城區(qū)平均面積折線圖
plt.figure(figsize = (9,5))
plt.plot(grouped_area.district,grouped_area.area)
plt.title('各城區(qū)平均面積分布')
- 以上折線圖顯示煞檩,青浦區(qū)總面積和平均面積遠遠大于其他城區(qū)平均面積,青浦區(qū)共有房源1769套栅贴,數(shù)量較大形娇,不太可能出現(xiàn)異常,故分析可能原因為:不在中心位置筹误,建設(shè)成本較低桐早,房屋設(shè)計面積較大。
- 各城區(qū)總面積和平均面積趨勢大致一樣厨剪,各城區(qū)平均面積在[77,116]之間哄酝,其中,面積在[100,116]之間的為松江祷膳、黃埔和金山陶衅,面積在[90,100)之間的為奉賢、長寧直晨、閔行和靜安搀军,面積在[80,90)之間的為嘉定、虹口勇皇、崇明罩句、浦東、閘北敛摘、寶山门烂、普陀和徐匯,楊浦區(qū)平均面積為77.8㎡兄淫。
3.3全市平均面積分布
以區(qū)間[0,50)屯远、[50,100)、[100,150)捕虽、[150,200)慨丐、[200,+∞)為劃分標準,將面積劃分為tinysmall泄私、small房揭、medium备闲、big、huge五個等級崩溪,分別對應(yīng)極小戶型浅役、小戶型、中等戶型伶唯、大戶型和巨大戶型觉既。
df2.loc[(df2['area'] >= 0) & (df2['area'] < 50),'area_level'] = 'tinysmall'
df2.loc[(df2['area'] >= 50) & (df2['area'] < 100),'area_level'] = 'small'
df2.loc[(df2['area'] >= 100) & (df2['area'] < 150),'area_level'] = 'medium'
df2.loc[(df2['area'] >= 150) & (df2['area'] < 200),'area_level'] = 'big'
df2.loc[(df2['area'] >= 200),'area_level'] = 'huge'
df2.head()
求出各戶型的數(shù)量:
grouped_area_level=df2.groupby('area_level').total_price.count().reset_index()
grouped_area_level
可視化:作出各戶型數(shù)量柱狀圖
plt.bar(grouped_area_level.area_level,grouped_area_level.total_price)
plt.title('各戶型數(shù)量分布')
- 由上圖可知:
- 1.平均面積為small的房源數(shù)量占總數(shù)的50%,即一半房源的面積在區(qū)間[50,100]㎡乳幸,
- 2.平均面積為medium的房源數(shù)量占總數(shù)的25%瞪讼,即四分之一的房源面積在區(qū)間[100,150]㎡,
- 3.平均面積為tinysmall的房源數(shù)量占總數(shù)的17%粹断,即17%的房源面積在區(qū)間[0,50]㎡
4符欠、數(shù)據(jù)分析:各城區(qū)總價和單價分布
4.1總價分布
# 把分區(qū)后的總價組成一個字典,以便下面將它轉(zhuǎn)化為dataframe
good=dict(list(df2.groupby('district')['total_price']))
# 轉(zhuǎn)化為dataframe
gooddf=pd.DataFrame(good)
# 作出總價箱線圖
plt.figure(figsize=(12,5))
gooddf.boxplot()
plt.ylim(0,3000)
plt.title('各城區(qū)總價箱線圖')
各城區(qū)總價平均值排名:
total_price_mean = df2.groupby('district')['total_price'].mean().reset_index().sort_values('total_price')
total_price_mean
- 由以上結(jié)果可知
- 總價No.1的為黃浦區(qū)瓶埋,平均值為1059.3萬希柿,總價區(qū)間跨越大,總體價格價格區(qū)間為[500,1300]萬养筒,中位數(shù)小于平均值曾撤,故少數(shù)價格高的拉高總體平均值的現(xiàn)象比較嚴重
- 總價No.2的為長寧區(qū),平均值為760.8萬晕粪,總體價格區(qū)間為[400挤悉,1000]萬,中位數(shù)接近平均值巫湘,總價上升比較線性
- 總價No.3的為徐匯區(qū)装悲,平均值為671.8萬,總體價格區(qū)間為[400尚氛,800]萬诀诊,中位數(shù)小于平均值,故少數(shù)價格高的拉高了總體平均值
- 總價No.4的為青浦區(qū)怠褐,平均值為676.0萬畏梆,總價價格區(qū)間為[300,750]萬奈懒,中位數(shù)遠小于平均值,故少數(shù)價格高的拉高總體平均值的現(xiàn)象比較嚴重
4.2宪巨、平均總價分布
df2.total_price.hist(bins = 20)
plt.title('平均總價分布圖')
- 房屋總價是一個左凸的直方圖磷杏,90%的數(shù)據(jù)集中在[500,1000]的區(qū)間,即90%的房源總價在500萬到1000萬之間捏卓,只有大概10%的房源屬于極高的價格极祸,這個結(jié)果符合現(xiàn)實的房價分布
4.3慈格、各城區(qū)單價分布
good1=dict(list(df2.groupby('district')['unit_price']))
good1df=pd.DataFrame(good1)
plt.figure(figsize=(12,5))
good1df.boxplot()
plt.ylim(0,150000)
plt.title('各城區(qū)單價分布箱線圖')
各城區(qū)單價排名:
unit_price_mean = df2.groupby('district')['district','unit_price'].mean().reset_index().sort_values('unit_price',ascending = False)
unit_price_mean
- 由以上結(jié)果可知,
- 單價No.1的是黃浦遥金,平均值為90666元浴捆,大體價格區(qū)間為[78000,100000]元
- 單價No.2的是徐匯稿械,平均值為79157元选泻,大體價格區(qū)間為[69111,90000]元
- 單價No.3的是長寧,平均值為75081元美莫,大體價格區(qū)間為[66000页眯,84000]元
全市單價分布:
df2.unit_price.hist(bins = 20)
plt.title('全市單價分布直方圖')
- 單價直方圖接近正態(tài)分布,該圖顯示70%的單價集中在區(qū)間[30000,90000]元厢呵,符合房價的現(xiàn)實分布規(guī)律
4.4窝撵、總價和單價排名前十小區(qū)
對小區(qū)進行分組,計算出各小區(qū)房源數(shù)量襟铭,并按照房源數(shù)量降序的順序排序
df3 = df2.groupby('village').total_price.count().reset_index().sort_values('total_price',ascending = False)
df3.head()
- 因為很多小區(qū)房源數(shù)量太少碌奉,其統(tǒng)計值不具有代表性,故在此過濾掉房源數(shù)量小于20的小區(qū)
df4 = df3[df3.total_price > 20]
df4.head()
提取房源數(shù)大于20的全部數(shù)據(jù)
df5 = df2[df2.village.isin(df4.village)]
df5.head()
4.5寒砖、計算各小區(qū)總價排名前15的小區(qū):
對小區(qū)進行分組赐劣,計算出各小區(qū)房源數(shù)量,并按照房源數(shù)量降序的順序排序
df3 = df2.groupby('village').total_price.count().reset_index().sort_values('total_price',ascending = False)
df3.head(20)
因為很多小區(qū)房源數(shù)量太少入撒,其統(tǒng)計值不具有代表性隆豹,故在此過濾掉房源數(shù)量小于20的小區(qū)
# 過濾掉房源小于20的小區(qū)
df4 = df3[df3.total_price > 20]
df4.head(10)
提取房源數(shù)量大于20的小區(qū)的全部數(shù)據(jù)
df5 = df2[df2.village.isin(df4.village)]
df5.head()
計算各小區(qū)總價排名前15的小區(qū):
totalp_village = df5.groupby('village').total_price.mean().sort_values(ascending = False).reset_index().head(15)
totalp_village
可視化:作出平均總價排名前十小區(qū)的平均總價柱狀圖
plt.figure(figsize=(20,4))
plt.bar(totalp_village.village,totalp_village.total_price)
plt.title('平均總價排名前15的小區(qū)')
- 總價排名前15的小區(qū)如上圖所示,第一名為翠湖天地御苑茅逮,平均總價超過4000萬璃赡,是第二名尚海灣豪庭的兩倍,查詢了解到献雅,該小區(qū)位于上海市的心臟地帶碉考,真可謂寸土寸金
4.6、計算單價排名前十五的小區(qū)
totalp_village1=df5.groupby('village').unit_price.mean().sort_values(ascending=False).head(15).reset_index()
totalp_village1
可視化:作出平均單價排名前十小區(qū)的單價柱狀圖
plt.figure(figsize = (20,5))
plt.bar(totalp_village1.village,totalp_village1.unit_price)
plt.title('平均單價排名前15小區(qū)')
- 由上圖可知挺身,排名前三位的小區(qū)分別是翠湖天地御苑侯谁、東方曼哈頓和融創(chuàng)濱江壹號院,翠湖天地御苑的平均單價最高章钾,超過了150000元墙贱,高于排名第二的東方曼哈頓近40000元
5、房價與戶型贱傀、樓層惨撇、朝向、建筑年代的關(guān)系
5.1府寒、房價與戶型的關(guān)系
按戶型進行分組魁衙,計算出每個戶型的房源數(shù)量报腔,過濾掉房源數(shù)量小于100的戶型
grouped_house_type = df2.groupby('house_type').total_price.count().sort_values(ascending = False).reset_index()
grouped_house_type2 = grouped_house_type.loc[grouped_house_type.total_price> 100]
grouped_house_type2
可視化:作出各戶型的數(shù)量柱狀圖
plt.figure(figsize = (10,5))
plt.bar(grouped_house_type2.house_type,grouped_house_type2.total_price)
plt.title('各戶型數(shù)量柱狀圖')
戶型與房屋均價的柱狀圖
grouped_house_type3 = df6.groupby('house_type').unit_price.mean().sort_values(ascending = False).reset_index()
grouped_house_type3
plt.figure(figsize=(15,5))
plt.bar(grouped_house_type3.house_type,grouped_house_type3.unit_price)
plt.title('戶型-房屋均價圖')
- 由上圖可知,單價排名前三的戶型分別為1室2廳剖淀、2室0廳纯蛾、1室0廳∽莞簦可以看出翻诉,小戶型的房屋比較受歡迎,因為其總價一般較低巨朦,經(jīng)濟壓力較小米丘,故而成為熱門戶型,這也導(dǎo)致了這些戶型價格的上漲糊啡,使得小戶型的房屋單價高于大戶型的房屋拄查。
5.2、房價與樓層的關(guān)系
計算各個樓層等級的房源數(shù)量棚蓄,注意這里是按照地區(qū)高中中區(qū)劃分的堕扶,并不是按照floor劃分的
a_list=['高區(qū)','中區(qū)','低區(qū)']
df7 = df2[df2.floor_level.isin(a_list)]
grouped_floor_level = df7.groupby('floor_level').unit_price.count().reset_index()
grouped_floor_level.head()
可視化:并作出其柱狀圖
plt.title('樓層等級-數(shù)量')
plt.bar(grouped_floor_level.floor_level,grouped_floor_level.unit_price)
- 由上圖可知,低梭依、中稍算、高區(qū)的房源數(shù)量基本相等,都在8000套以上役拴,其中高區(qū)最多糊探,數(shù)量超過10000套
計算各樓層等級的平均單價平均總價
平均單價
grouped_floor_level1 = df7.groupby('floor_level').unit_price.mean().reset_index()
grouped_floor_level1
可視化:作出其柱狀圖
plt.title('樓層等級—平均單價')
plt.bar(grouped_floor_level1.floor_level,grouped_floor_level1.unit_price)
由上圖可知,低河闰、中科平、高區(qū)樓層平均單價在6萬元附近
平均總價
grouped_floor_level2 = df7.groupby('floor_level').total_price.mean().reset_index()
grouped_floor_level2
可視化:柱狀圖
plt.title('樓層等級—平均總價')
plt.bar(grouped_floor_level2.floor_level,grouped_floor_level2.total_price)
由上圖可知,低姜性、中瞪慧、高區(qū)樓層平均總價均超過500萬,其中低區(qū)總價最高部念,為590萬
查看缺失值
df2.isnull().sum()
缺失值的處理
# 填充floor列中的空值為999
df2.floor=df2.floor.fillna('999')
# 找出floor列中值為999的行號
c_list=df2[df2.floor=='999'].index.tolist()
# 刪除上面查找到的行
df8=df2.drop(c_list)
df8.isnull().sum()
- 由上可知弃酌,floor字段中空值所在的行已被全部刪除
計算樓層平均單價排名前15位
df2.groupby('floor').unit_price.mean().sort_values(ascending = False).reset_index().head(15)
計算各樓層單價平均值,并作出其折線圖:
plt.figure(figsize=(15,5))
df2.groupby('floor').unit_price.mean().plot()
plt.title('樓層數(shù)-單價')
- 由上圖分析可知儡炼,隨著樓層輸?shù)脑黾蛹讼妫績r也隨之升高。在37層之前乌询,房價隨樓層數(shù)增加而增加的趨勢比較線性多柑,但是在這之后房價隨樓層數(shù)增加而增加的趨勢波動很大,可能的原因是樓層數(shù)超過40的住宅數(shù)量較小楣责,超過40層的數(shù)據(jù)量比較小竣灌,容易產(chǎn)生誤差
5.3、房價與朝向的關(guān)系
查看房屋的朝向
df2.orientations.drop_duplicates().values.tolist()
朝向重新構(gòu)成一個列表
b_list=list(['朝東','朝東北','朝東南','朝東西','朝北','朝南','朝南北','朝西','朝西北','朝西南'])
df8 = df2[df2.orientations.isin(b_list)]
grouped_orientations = df8.groupby('orientations').unit_price.mean().sort_values(ascending = False).reset_index()
grouped_orientations
可視化:作出其柱狀圖
plt.figure(figsize=(12,5))
plt.bar(grouped_orientations.orientations,grouped_orientations.unit_price)
plt.title('朝向—單價')
- 由上圖可知秆麸,朝向?qū)Ψ績r有一定的影響初嘹,朝向南面(南、東南沮趣、西南)的房子總體價格會高一點屯烦。這一現(xiàn)象也符合生活情景,朝向南面的房屋采光會比較好房铭,這些南北通透的房子單價相對于其他朝向會高一些驻龟。
5.4、房價與建筑年代的關(guān)系
缺失值的處理
# 填充construction_time字段中的空值為000
df2.construction_time=df2.construction_time.fillna('000')
# 找出construction_time字段中值為123的行號
d_list=df2[df2.construction_time=='000'].index.tolist()
# 刪除construction_time列中的空值
df9=df2.drop(d_list)
計算各個年份建造房屋的數(shù)量 缸匪,作出其折線圖:
plt.figure(figsize=(15,5))
df9.groupby('construction_time').unit_price.count().plot()
plt.title('建筑時間-數(shù)量')
- 以上折線圖呈右側(cè)雙峰形態(tài)翁狐,即分別在1995年和2005年左右出現(xiàn)了兩個房屋修建的高峰期,這期間房屋數(shù)量陡增
計算各個年份平均總價凌蔬,作出其折線圖
plt.figure(figsize=(15,5))
df9.groupby('construction_time').total_price.mean().plot()
plt.title('建筑時間-平均總價圖')
計算各個年份平均單價露懒,作出其折線圖
plt.figure(figsize=(15,5))
df9.groupby('construction_time').unit_price.mean().plot()
plt.title('建筑時間-平均單價圖')
- 由以上分析可知,
- 以上平均總價與建筑時間的趨勢和平均單價與建筑時間的趨勢大致一致砂心,都呈現(xiàn)左側(cè)單峰形態(tài)懈词。在1920年到1950年間建造的房屋,其總價和單價均高于之后建造的房屋辩诞,分析其原因為:在1920年到1950年間建造的房屋坎弯,因為建造時間早,其建造的位置處于現(xiàn)在上海的核心地帶译暂,因為其土地的稀有性抠忘,故而導(dǎo)致了現(xiàn)在的高房價。
- 從2015年以來修建的房屋呈現(xiàn)陡然上升的趨勢秧秉,這也和目前房價不斷升高的趨勢契合褐桌,這表明房價在短時間內(nèi)不會出現(xiàn)大的下跌,是否會出現(xiàn)下一個房價高峰象迎,我們拭目以待荧嵌。
資料
1、第一篇數(shù)據(jù)分析項目實戰(zhàn):用戶消費行為分析
2砾淌、鏈家二手房數(shù)據(jù)