PartⅠ:数据获取和数据清洗
写在前面
很早就有写博客的想法,一直对自己不自信所以没敢尝试,每次看其他大神的博客都很羡慕和崇拜,希望自己在未来的某一天也能给其他人给予一些力所能及的帮助。目前的我还是个小小小小白,很多东西都只懂些皮毛,这是我的第一篇博客,分享一下我在学校的一篇期末论文(轻点喷呜呜呜...
如果有疑问或者分享,欢迎私信我或者留言啊!一起进步吧!请各位大神多多指教啦~
研究背景
随着近年来经济的飞速发展,北上广深这四大都市全方位均有突出的表现,工作机会多,生活质量高,发展前景可观。但是要在这些城市定居不是一件容易的事,所以二手房便成为了大部分来大城市打拼人们的选择。通过Python爬取房天下网站中深圳十个区的的房源相关信息,对爬取的数据集进行清洗,并对各维度的数据进行可视化,探索深圳二手房的整体情况,分析房价的影响因素,最终得出深圳购买二手房的策略和方向。
数据获取
本研究选择了房天下网站(http://sz.esf.fang,com/)作为爬取对象,爬取步骤大概分成了四步,分别是:首先是指定网站的url,然后发起get请求,其次是通过利用xpath语句进行相关信息点的定位并获取数据,最后把数据保存到本地。
深圳一共十个地区,每个区每页房源为100 个,每个房源爬取三个数据,即每页大约为300个数据。每个地区爬取10页,且开5个线程同时爬取以提高爬取效率。(另外一篇博客再来讲讲线程哈哈哈)由于该网页是通过异步加载的,所以在爬取时选用selenium模拟浏览器登陆网站。【友情提示:房天下网站在爬取一定的数据量后会需要输入验证码,所以可能爬取过程会有点麻烦,建议换个网站或者爬取数据量不要太多(俺的能力还不能解决验证码/(ㄒoㄒ)/~~)】
数据清洗
爬取后总共获得了11416条房源数据。首先对其进行重复值检查:
#导入数据
data = pd.read_csv(r"C:\\Users\\Administrator\\OneDrive\\桌面\\数据清洗\\深圳二手房数据.csv")
#data.head()
#取前5列有效数据进行分析
data = pd.DataFrame(data.loc[:,['区名','地址','基本信息','总价','单价']])
#重复值检查
data = data.drop_duplicates()#清除重复值
通过Python代码删除重复值,删除掉了394行重复值,得到一个11021行5列的新数据。
然后进行缺失值检查:
#缺失值检查
data.isnull().any()#有4列存在缺失值
#清除上述4列含缺失值的行
newdata = data.dropna(subset=['基本信息','地址','总价','单价'])
newdata.shape
#再次进行缺失值检查
newdata.isnull().any()#无缺失值
通过删除缺失值,删除掉了10列含有缺失值的行,得到一个11011行5列的新数据。
通过上述重复值和缺失值处理,新数据需要更新一下索引,否则后面进一步处理数据时会因为上述对部分数据进行删除后索引缺失而报错,对新数据进行更新索引。其中,在基本信息列中,因为原网站保存数据的缘故,存在多条信息整合在一起的情况,并且用号分开,所以需要对其进行分列操作。
#对新数据进行更新索引(否则后面处理会因为上面对部分数据删除后索引缺失而报错)
newdata.reset_index(inplace=True)
#把基本信息列分成下面5列
for i in range(len(newdata['基本信息'])):
s=newdata['基本信息'][i]
lis_s=s.split("|")
fenlie("楼层",0)
fenlie("建楼时间",1)
fenlie("布局",2)
fenlie("面积",3)
fenlie("朝向",4)
#查看分列后存在空值的数据
newdata[newdata.T.isnull().any()]
#把原始基本信息数据列剔除
newdata = newdata.drop(columns=['基本信息'])
#把新数据中存在缺失值的行进行删除
newdata1 = newdata.dropna(subset=['面积','朝向'])
#查看数据类型
newdata1.dtypes
通过Python的split函数把基本信息分成五列。然而,经过分列后的数据会存在有空值的情况,同样利用Python代码去除掉含有空值的行,删除掉了318行,得到一个10693行10列的新数据。
通过查看数据类型,得知二手房的面积、单价、布局、建楼时间均为object,可以通过replace函数对其进行清洗工作,让其成为数字float,方便下面的可视化分析。
同时,对二手房的楼层进行简化处理,分为低楼层、中楼层和高楼层三个等级。对于二手房的朝向会存在多个朝向的情况,在分析时会引起歧义,所以本文只选取了每个房源朝向的第一个值来作为研究对象,其余进行删除。
#对部分数据列进行清洗工作(去除掉多余字符并将其转成float方便下面对其进行分析)
newdata1['面积'] = newdata1['面积'].map(lambda x: x.replace('平米\n','')).astype('float')
newdata1['单价'] = newdata1['单价'].map(lambda x: x.replace('元/平米',''))
newdata1['单价'] = newdata1['单价'].map(lambda x: x.replace('单价','')).astype('float')
newdata1['布局'] = newdata1['布局'].map(lambda x: x.replace('\n',''))
newdata1['建楼时间'] = newdata1['建楼时间'].map(lambda x: x.replace('年建','')).astype('float')
#对楼层进行简化处理(分低、中、高三个等级)
def floor(f):
if f is not None:
f = str(f)[:3]
return f
#floor = {'低楼层': '低','中楼层': '中','高楼层': '高'}
newdata1['楼层'] = newdata1['楼层'].map(floor)
#对朝向列每行进行只取第一个值操作,大部分数据有多个朝向分析时会引起歧义
def fangxiang(fx):
if fx is not None:
fx = str(fx)[:3]
return fx
newdata1['朝向'] = newdata1['朝向'].map(fangxiang)
通过上述清洗处理后的数据集大致如下:
最后对数据集进行异常值检查,通过Python软件中的describe函数对数据集进行描述性分析,发现存在最高的二手房单价为每平方米20 多万,证明存在异常值。
利用箱线图进一步分析,二手房最小面积为14平米,最大面积为754.05平米,最便宜的25万,最贵的8000 万;面积大概集中在63-113平米,价格大概集中在319-730万,本文将总价和面积高于上限的当作异常值进行删除处理,考虑大多数人可购买的情况,并把单价与建楼时间过久远等不符合客观事实的删除。
(代码和数据集我就不放了~有兴趣的小伙伴可以私信我哈哈哈)