项目作者
汤尧 李斯龙(排名不分先后,共同努力成果)
项目目的
在上海,二手房市场一直是热门话题,而本文希望通过数据分析目前人们在购房时所展现出来的偏好,找出上海房产市场上比较受欢迎的二手房。具体来说,主要针对以下几个问题:
- 人们更偏向于多大面积的二手房
- 人们更喜欢住在多高的楼层里
- 大部分人能接受的房价在什么范围内
- 大部分人在房子的年代方面有没有偏好
技术和工具
本项目主要分别两个部分,第一部分是数据的爬取,采用的是八爪鱼采集器这一网络爬虫工具。第二部分是数据清洗,分析和可视化。采用ipython这一工具,通过anaconda所提供的jupyter Notebook实现代码功能。采用的库有pandas和matplotlib库,pandas用于数据整理和统计分析,matplotlib用于可视化。
数据来源
本项目中所采用的数据集均来自与房天下网,是通过八爪鱼搜集器来爬取的。八爪鱼的工作原理是设计一套规则,然后就会自动的根据这套规则进行采集数据。在这里就不对规则做详细的解释了。主要内容有:
内容 | 字段 |
---|---|
地址 | adress |
建筑面积 | area |
总价 | price |
年代 | age |
楼层 | floor |
朝向 | direction |
楼盘名 | title |
数据清洗
### 调用库
import numpy as np
import pandas as pd
import matplotlib
from matplotlib import pyplot as plt
%matplotlib inline
%config InlineBackend.figure_format = 'retina'
font = {'family' : 'SimHei'}
matplotlib.rc('font', **font)#设置中文字体
### 加载excel数据
df = pd.read_excel('C:/Users/slyq/Documents/practice_jupter_note/房天下上海二手房源信息.xlsx','Sheet1')
# 找到重复数据并删除
dIndex = df.duplicated()
df.drop_duplicates()
###处理总价数据
df_p = df['总价'].str.split('(',1,True)#将该数据中的反映价格的数字抽取出来
df_p.columns = ['zongjia','danjia']
df_p_total = df_p['zongjia'].str.split('万',1,True)
df_p_total.columns = ['total','none']
df_total = df_p_total['total']
df_total = df_total.astype(float)#转化数据类型,使其能够被计算
df['总价'] = df_total # 将单价赋值到df中的总价栏
### 处理面积
df_s = df['建筑面积'].str.split('㎡',1,True)
df_s.columns = ['area','meiyoude']
df_area = df_s['area']
df_area = df_area.astype(float)
df['建筑面积'] = df_area
### 处理年代
df_a=df['年代'].str.split(':', 1, True)
df_a.columns = ['meiyong', 'nian']
df_ag = df_a['nian'].str.split('年',1, True)
df_ag.columns =['age', 'meiyongde']
df_age = df_ag['age']
df['年代']=df_age
df['年代'] = df['年代'].convert_objects(convert_numeric = True)#强制将字符串的列转化为适当的数据类型
isNA=df.isnull()
df[isNA[['年代']].any(axis=1)]#找出NA值
###相同的作用,找到NaN
#df[df['年代'].isnull()]
nedf = df.dropna()#滤除NA值
###查看统计信息
nedf['年代'].describe()
data = nedf['年代'].astype(int)
newdata = data.replace(0,2000)
newdata1 = newdata.replace(88,1988)
###处理楼层等
df_f = df['楼层'].str.split('共',1,True)
df_f.columns = ['meiyou','gaodu']
df_f.columns = ['meiyong', 'gaodu']
df_f.columns = ['meiyou','gaodu']
df_flo = df_f['gaodu'].str.split('层',1,True)
df_flo.columns = ['floor','meiyoude']
df_floor = df_flo['floor']
df['楼层'] = df_floor
###相同的作用,显示NaN
df[df['楼层'].isnull()]
newdf = df.dropna()
newdf['楼层'] = newdf['楼层'].astype(int)
数据分析
价格分析
###百分比
length_full = len(df['总价'])
length_500w = len(df[df['总价']<=500])
length_1000w = len(df[df['总价']<=1000])
ratio_500w = length_500w / length_full
ratio_1000w = length_1000w / length_full
print("total length is %d"%(length_full))
print("length_500w is %d"%(length_500w))
print("length_1000w is %d"%(length_1000w))
print("ratio_500w is %f"%(ratio_500w))
print("ratio_1000w is %f"%(ratio_1000w))
total length is 2899
length_500w is 1886
length_1000w is 2504
ratio_500w is 0.650569
ratio_1000w is 0.863746
####画多张图
### 总价
fig = plt.figure(figsize=(5, 5)) #设置图像大小
plt.subplots_adjust(hspace=0.5) # 设置子图间距
p1 = plt.subplot(211)
p1.hist(df['总价'],bins =30,rwidth =2)
p1.set_title('价格分布图1')
p1.set_xlabel('价格')
p1.set_ylabel('数量')
fig = plt.figure(1)
p2 = plt.subplot(212)
p2.hist(df['总价'],bins =30,rwidth =2, cumulative = True)
p2.set_title('价格分布图2')
p2.set_xlabel('价格')
p2.set_ylabel('数量')
从价格分布图1、2得出:
- 一共统计了2899个房子,房价在500W之内有1886个,占全部数量的65.1%。
- 房价在1000W之内有2504个,占全部数量的86.37%。
- 0——500W价格的房子数量最多,500W——1000W价格的房子数量迅速降低,1500W价格的房子逐渐减少。
结论:二手房的价格主要集中在0-500W之内,2000W及其以上的二手房子在房产交易市场较少。
面积分析
###百分比
area_full = len(df['建筑面积'])
area_50 = len(df[df['建筑面积']<=50])
area_90 = len(df[df['建筑面积']<=90])
area_120 = len(df[df['建筑面积']<=120])
area_150 = len(df[df['建筑面积']<=150])
area_200 = len(df[df['建筑面积']<=200])
area_200_1 = len(df[df['建筑面积']> 200])
print("total area is %d"%(area_full))
print("area is less than 50 is %d"%(area_50))
print("area is less than 90 is %d"%(area_90))
print("area is less than 120 is %d"%(area_120))
print("area is less than 150 is %d"%(area_150))
print("area is less than 200 is %d"%(area_200))
print("area is larger than 200 is %d"%(area_200_1))
print("50 is %f"%(area_50/area_full))
print("90 is %f"%(area_90/area_full))
print("120 is %f"%(area_120/area_full))
print("150 is %f"%(area_150/area_full))
print("200 is %f"%(area_200/area_full))
print("200 up is %f"%(area_200_1/area_full))
total area is 2899
area is less than 50 is 413
area is less than 90 is 1632
area is less than 120 is 2135
area is less than 150 is 2437
area is less than 200 is 2557
area is larger than 200 is 342
50 is 0.142463
90 is 0.562953
120 is 0.736461
150 is 0.840635
200 is 0.882028
200 up is 0.117972
###面积
fig = plt.figure(figsize=(5, 5)) #设置图像大小
plt.subplots_adjust(hspace=0.5) # 设置子图间距
p1 = plt.subplot(211)
p1.hist(df['建筑面积'],bins =30,rwidth =2)
p1.set_title('建筑面积分布图1')
p1.set_xlabel('建筑面积')
p1.set_ylabel('数量')
fig = plt.figure(1)
p2 = plt.subplot(212)
p2.hist(df['建筑面积'],bins =30,rwidth =2, cumulative = True)
p2.set_title('建筑面积分布图2')
p2.set_xlabel('建筑面积')
p2.set_ylabel('数量')
从面积分布图1、2得出:
- 面积在50平米以内占总数的14.2%;面积在90平米以内占总数的56.3%;
- 面积在120平米以内占总数73.64%;面积在150平米以内占总数84.1%;
- 面积在200平米以内占总数88.2%;面价在200以上占总数11.8%。
结论:二手房交易中以150平米以内的房子为主,其中50-90平米的房子占150平米房子交易的60%。90-120平米的房子占据
150平米房子交易的25%,在150平米以内的二手房交易以50-90平米的房子为主。人们更加偏爱中小户型的房子。但是随着人们开始升二胎,可能90-120平米的房子会得到更多家庭的青睐。
年代分析
###百分比
year_full = len(newdata1)
year_90 = len(newdata1[newdata1 < 1990])
year_95 = len(newdata1[newdata1 < 1995])
year_00 = len(newdata1[newdata1 < 2000])
year_05 = len(newdata1[newdata1 < 2005])
year_10 = len(newdata1[newdata1 < 2010])
year_15 = len(newdata1[newdata1 < 2015])
year_20 = len(newdata1[newdata1 < 2020])
print("full is %d"%(year_full))
print("1990 is %d"%(year_90))
print("1995 is %d"%(year_95))
print("2000 is %d"%(year_00))
print("2005 is %d"%(year_05))
print("2010 is %d"%(year_10))
print("2015 is %d"%(year_15))
print("2020 is %d"%(year_20))
print("1990 is %f"%(year_90/year_full))
print("1995 is %f"%(year_95/year_full))
print("2000 is %f"%(year_00/year_full))
print("2005 is %f"%(year_05/year_full))
print("2010 is %f"%(year_10/year_full))
print("2015 is %f"%(year_15/year_full))
print("2020 is %f"%(year_20/year_full))
full is 2805
1990 is 165
1995 is 368
2000 is 821
2005 is 1373
2010 is 2033
2015 is 2513
2020 is 2805
1990 is 0.058824
1995 is 0.131194
2000 is 0.292692
2005 is 0.489483
2010 is 0.724777
2015 is 0.895900
2020 is 1.000000
### 年代
fig = plt.figure(figsize=(5, 5)) #设置图像大小
plt.subplots_adjust(hspace=0.5) # 设置子图间距
p1 = plt.subplot(211)
p1.hist(newdata1,bins =30,rwidth =2)
p1.set_title('年代分布图1')
p1.set_xlabel('年代')
p1.set_ylabel('数量')
fig = plt.figure(1)
p2 = plt.subplot(212)
p2.hist(newdata1,bins =30,rwidth =2, cumulative = True)
p2.set_title('年代分布图2')
p2.set_xlabel('年代')
p2.set_ylabel('数量')
从年代分布图1、2得出:
- 1995年之前的房子占比13.12%;
- 2000年之前的房子 占比29.27%;
- 2005年之前的房子占比48.94%;
- 2010年之前的房子占比72.48%;
- 2015年之前的房子有占比89.6%;
- 1995——2000年房子占比16.15%;
- 2000——2005年房子占比19.67%;
- 2005——2010年房子占比23.54%;
- 2010——2015年房子占比17.12%;
- 2015——2020年房子占比10.4%;
结论:2005——2010年之间的占比占据二手房市场的比重最大,达到23.54%;2000——2015年之间的房子占二手房市场60.33%,2015——2020年之间的房子占二手房市场10.4%。而即便数据量不大,但也可以大体的看出人们对于1995-2015的房屋没有什么偏好,只是在95以下和15以上购买欲望不足。
对于比较新的二手房的交易,国家有对应的政策。
国家针对房产证满5年,并且是唯一住房的即可免房子的个税和营业税。规定如下:
- 房产证满5年,并且是唯一住房的不需要交个人所得税;
- 房产证满5年,不是唯一住房的需要缴纳房产交易盈利部分的20%或者总房价的1%;
- 房产证不满5年,需要缴纳房产交易盈利部分的20%或者总房价的1%;
由此可见,2015以后的房子需求不足就是可以理解的,毕竟要多花钱么。
楼层分析
###百分比
ceil_full = len(newdf['楼层'])
ceil_6 = len(newdf[newdf['楼层'] <= 6])
ceil_10 = len(newdf[newdf['楼层'] <= 10])
ceil_15 = len(newdf[newdf['楼层'] <= 15])
ceil_20 = len(newdf[newdf['楼层'] <= 20])
ceil_30 = len(newdf[newdf['楼层'] <= 30])
ceil_40 = len(newdf[newdf['楼层'] <= 40])
print("ceil full is %d"%(ceil_full))
print("ceil_6 is %d"%(ceil_6))
print("ceil_10 is %d"%(ceil_10))
print("ceil_15 is %d"%(ceil_15))
print("ceil_20 is %d"%(ceil_20))
print("ceil_30 is %d"%(ceil_30))
print("ceil_40 is %d"%(ceil_40))
print("ceil_6 ratio is %f"%(ceil_6/ceil_full))
print("ceil_10 ratio is %f"%(ceil_10/ceil_full))
print("ceil_15 ratio is %f"%(ceil_15/ceil_full))
print("ceil_20 ratio is %f"%(ceil_20/ceil_full))
print("ceil_30 ratio is %f"%(ceil_30/ceil_full))
print("ceil_40 ratio is %f"%(ceil_40/ceil_full))
ceil full is 2536
ceil_6 is 1138
ceil_10 is 1266
ceil_15 is 1755
ceil_20 is 2148
ceil_30 is 2397
ceil_40 is 2518
ceil_6 ratio is 0.448738
ceil_10 ratio is 0.499211
ceil_15 ratio is 0.692035
ceil_20 ratio is 0.847003
ceil_30 ratio is 0.945189
ceil_40 ratio is 0.992902
### 楼层
fig = plt.figure(figsize=(5, 5)) #设置图像大小
plt.subplots_adjust(hspace=0.5) # 设置子图间距
p1 = plt.subplot(211)
p1.hist(newdf['楼层'],bins =30,rwidth =2)
p1.set_title('楼层分布图1')
p1.set_xlabel('楼层')
p1.set_ylabel('数量')
fig = plt.figure(1)
p2 = plt.subplot(212)
p2.hist(newdf['楼层'],bins =30,rwidth =2, cumulative = True)
p2.set_title('楼层分布图2')
p2.set_xlabel('楼层')
p2.set_ylabel('数量')
从楼层分布图1、2得出:
- 6层及其以下楼层占比44.87%;
- 6-10层占比5.05%;
- 10-15层占比17.28%;
- 15-20层占比15.5%;
- 20-30层占比94.52%;
- 40层及其以上楼层占比4.77%;
结论:6层及其以下楼层占二手房交易市场的44.87%,几乎占据一半的交易,10-20层楼房占二手房交易市场39.83%,几乎占据40%市场,但是6-10层占交易市场的份额仅仅只有5.05%,这一类房子的数量突然减少,而人们对于这一类房子也没有什么不好的看法,而供给明显减少,说明这一类房子可能供不应求,人们可能对6-10层的房子比较偏好,买家愿意买,卖家不愿意卖。
最后总结一下,二手房交易主要以20层楼以下的楼层为交易对象。
分析结论
在二手房交易市场上:
- 房屋面积在50-90平米的房子比较受欢迎,但在未来人们可能会更加偏爱90-120平米的房子。
- 人们愿意购买的房子房价一般在500W以内,而2000W以上的房子在二手房交易市场上很少。
- 人们对于1995-2015的房屋没有什么偏好,只是在95年以下和15年以上购买欲望不足。
- 人们更愿意购买20层楼以下的楼层,其中6层楼以下楼层在市场中最多,几乎占到一半,而6-10层供给明显太少,可能的原因是人们可能对6-10层的房子比较偏好,买家愿意买,而卖家不愿意卖。
思考与总结
- 对于数据分析报告而言,这篇报告是比较简陋的,在本次分析过程中,仅对单一变量进行了分析,所使用的技能方法也比较少。在此次分析过程中,发现数据分析师需要具备扎实的编程、数学、统计学基础,良好的数据敏感度,严谨的思维。对我而言特别是相关的统计学知识,在分析过程中发现是极度欠缺的,原本是准备分析双变量之间的关系的,但是无奈建立不了统计学模型,所以放弃了,选用了单变量分析。在以后,需要更好的掌握这些知识,从而写出出更有深度的数据分析报告。———by 汤尧
- 在五月中旬和汤尧组队之后确定了几个选题:股票分析、电影票房分析、各自的专业领域,二手房市场分析,最后从数据的获取、对各个领域的了解‘、分析的方法等几个方面考虑之后,选择了二手房市场分析。
确定题目之后,马上遇到第一个问题,怎样获取相关的数据。幸好和汤尧组队,他通过八爪鱼从房天下网站上获取了二手房交易数据。拿到他提供的数据之后,我自己也使用八爪鱼抓取了类似的数据,体验了一次爬数据。
获取二手房交易数据之后,开始进行数据的清洗。刚刚开始清洗数据就遇到了问题,不知道怎么样提取文字中的数字,这时上网查资料和翻阅《利用python进行数据分析》,从中找到使用split函数提取数字的方法。使用split一次只能提取一个数字,我想一次提取多个数据,翻阅了不少资料,没有找到适合的解决方法,最后只好放弃“偷懒”的方法。
数据处理到一半的时候,和汤尧交谈中发现他已经完成了数据的清洗和可视化呈现,于是我这边直接使用他的代码完成了数据的清洗和可视化,节省了自己的自己,也加快得了项目的进展。
在分析的时候,发现可视化的图形可以显示累加的效果,于是在原有的基础上增加了累加效果图,非累加和累加效果图同时显示更加直观的展示数据。
首先分析直接获取的数据:总价、面积、年份、楼层,然后在此基础上采用比率的方式再次对它们进行分析:将总价、年份、面积、楼层分区间,然后计算各个区间占全部的比率,也计算两个区间之间的比率。从多个角度对数据进行分析,探寻数字背后的含义。
完成分析之后,我将分析结果发给汤尧,他在我的基础上进行了补充,深层次的挖掘了数字背后的含义,完善了分析的结果。
项目思考:
团队作战能够提高项目执行、完成的效率。
每个人有自己思考的盲点,通过团队沟通能够看清楚自己的缺点和不足之处,能够碰撞出思想的火花。
团队分工能够使自己扬长避短,使项目顺利进行。
遇到困难不要放弃,没有解决不了的问题,只是解决问题的方法有好有坏。
项目开始时要明确目标是完成项目,然后在次基础上再进行优化和改善。
查阅、搜索资料是做项目必不可少的能力。
做项目时要多于团队成员沟通,明确各自的分工,保证项目的进展。
——by 李斯龙
本文为tiger解密大数据社群数据分析入门课的毕业项目。了解更多关注微信“泰阁志”
网友评论