-
二手房数据分析报告
2019-03-10 08:30:39二手房数据分析报告用的R语言写的一篇完整地关于房屋价格水平的报告 -
武汉链家二手房数据
2018-06-20 15:30:47武汉市二手房数据(含经纬度、地址、户型、价格、朝向等) -
长沙二手房数据,包括户型,面积等数据
2021-01-12 11:35:13长沙二手房数据,包括户型,面积等数据 -
python二手房数据分析_使用python抓取分析链家网二手房数据
2020-12-21 19:19:25python抓取链家网北京二手房数据,使用requests+BeautifulSoup的方法对页面进行抓取和数据提取。通过使用requests库对链家网二手房列表页进行抓取,通过BeautifulSoup对页面进行解析,并从中获取房源价格,面积,...python抓取链家网北京二手房数据,使用requests+BeautifulSoup的方法对页面进行抓取和数据提取。通过使用requests库对链家网二手房列表页进行抓取,通过BeautifulSoup对页面进行解析,并从中获取房源价格,面积,户型和关注度的数据。
整体共两个py文件,第一个是获取数据,第二个是处理分析数据
一、获取数据并保存为csv文件
#!/usr/bin/python
# -*- coding:UTF-8 -*-
#引用爬取数据的包
import requests
import time
from bs4 import BeautifulSoup
#设置列表页URL的固定部分
url = 'https://bj.lianjia.com/ershoufang/'
#设置页面页的可变部分
page=('gp')
#设置访问网站的请求头部信息
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
'Accept':'text/html;q=0.9,*/*;q=0.8',
'Accept-Charset':'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
'Accept-Encoding':'gzip',
'Connection':'close',
'Referer':'http://www.baidu.com/link?url=_andhfsjjjKRgEWkj7i9cFmYYGsisrnm2A-TN3XZDQXxvGsM9k9ZZSnikW2Yds4s&wd=&eqid=c3435a7d00006bd600000003582bfd1f'
}
使用for循环生成1-100的数字,转化格式后与前面的URL固定部分拼成要抓取的URL。
设置每两个页面间隔1秒。抓取到的页面保存在html中
for i in range(1,100):
if i == 1:
i = str(i)
a = (url + page + i + '/')
r =requests.get(url=a,headers=headers)
html = r.content
else:
i = str(i)
a = (url + page + i + '/')
r = requests.get(url=a,headers=headers)
html2 = r.content
html = html + html2
time.sleep(1)
#解析页面并提取信息
#解析抓取的页面内容
lj = BeautifulSoup(html,'html.parser')
#提取房源总价
price = lj.find_all('div',attrs={'class':'priceInfo'})
tp = []
for a in price:
totalPrice =a.span.string
tp.append(totalPrice)
#提取房源信息
houseInfo=lj.find_all('div',attrs={'class':'houseInfo'})
hi=[]
for b in houseInfo:
house=b.get_text()
hi.append(house)
#提取房源关注度
followInfo=lj.find_all('div',attrs={'class':'followInfo'})
fi=[]
for c in followInfo:
follow=c.get_text()
fi.append(follow)
#将数据保存到csv文件中,别总是来回爬取链家数据不太好吧。
import pandas as pd
house = pd.DataFrame({'totalprice':tp,'houseinfo':hi,'followinfo':fi})
house.to_csv('/root/PycharmProjects/test/lianjia/data_beijing.csv',encoding='utf-8',index=False)
house.head()
二、创建数据表、清洗数据、分析数据
#!/usr/bin/python
# -*- coding:UTF-8 -*-
import pandas as pd
#读取csv文件
df = pd.read_csv('/root/PycharmProjects/test/lianjia/data_beijing.csv')
house = pd.DataFrame(df)
#对房源信息进行分列
houseinfo_split = pd.DataFrame((x.split('|') for x in house.houseinfo),index=house.index,columns=['xiaoqu','huxing','mianji','chaoxiang','zhuangxiu','dianti'])
print houseinfo_split.head()
#将分列结果拼接回原数据表
house=pd.merge(house,houseinfo_split,right_index=True, left_index=True)
#对房源关注度进行分列
followinfo_split = pd.DataFrame((x.split('/') for x in house.followinfo),index=house.index,columns=['guanzhu','daikan','fabu'])
#将分列后的关注度信息拼接回原数据表
house=pd.merge(house,followinfo_split,right_index=True, left_index=True)
#按房源户型类别进行汇总
huxing=house.groupby('huxing')['huxing'].agg(len)
#查看户型汇总结果
print huxing
#导入图表库
import matplotlib.pyplot as plt
#导入数值计算库
import numpy as np
#画图了一下内容中有多个画图,运行时请注释其他的画图代码,避免互相影响
#绘制房源户型分布条形图
plt.rc('font', family='STXihei', size=11)
a=np.array([1,2,3,4,5,6,7,8,9])
plt.barh([1,2,3,4,5,6,7,8,9],huxing,color='#052B6C',alpha=0.8,align='center',edgecolor='white')
plt.ylabel('house type')
plt.xlabel('number')
plt.xlim(0,1300)
plt.ylim(0,10)
plt.title('Housing family distribution')
plt.legend(['Number'], loc='upper right')
plt.grid(color='#95a5a6',linestyle='--', linewidth=2,axis='y',alpha=0.4)
plt.yticks(a,('1shi0ting','1shi1ting','2shi1ting','2shi2ting','3shi1ting','3shi2ting','4shi1ting','4shi2ting','5shi2ting'))
plt.show()
#需要注意的是根据huxing输出的内容,设置a=np.array([1,2,3,4,5,6,7,8,9])的数量,我这里是9段分布,所以使用1-9,plt.yticks部分也是一样的
# 1shi0ting为 1室0厅,1shi1ting为1室1厅,以此类推
#对房源面积进行二次分列
mianji_num_split = pd.DataFrame((x.split('平') for x in house.mianji),index=house.index,columns=['mianji_num','mi'])
#将分列后的房源面积拼接回原数据表
house = pd.merge(house,mianji_num_split,right_index=True,left_index=True)
#去除mianji_num字段两端的空格
house['mianji_num'] = house['mianji_num'].map(str.strip)
#更改mianji_num字段格式为float
house['mianji_num'] = house['mianji_num'].astype(float)
#查看所有房源面积的范围值
print house['mianji_num'].min(),house['mianji_num'].max()
#对房源面积进行分组
bins = [0, 50, 100, 150, 200, 250, 300, 350]
group_mianji = ['less than 50', '50-100', '100-150', '150-200','200-250','250-300','300-350']
house['group_mianji'] = pd.cut(house['mianji_num'], bins, labels=group_mianji)
#按房源面积分组对房源数量进行汇总
group_mianji=house.groupby('group_mianji')['group_mianji'].agg(len)
#绘制房源面积分布图 需要去掉注释
# plt.rc('font', family='STXihei', size=15)
# a=np.array([1,2,3,4,5,6,7])
# plt.barh([1,2,3,4,5,6,7],group_mianji,color='#052B6C',alpha=0.8,align='center',edgecolor='white')
# plt.ylabel('mianji group')
# plt.xlabel('number')
# plt.title('Housing area of distribution')
# plt.legend(['number'], loc='upper right')
# plt.grid(color='#95a5a6',linestyle='--', linewidth=1,axis='y',alpha=0.4)
# plt.yticks(a,('less 50', '50-100', '100-150', '150-200','200-250','250-300','300-350'))
# plt.show()
#对房源关注度进行二次分列
guanzhu_num_split = pd.DataFrame((x.split('?') for x in house.guanzhu),index=house.index,columns=['guanzhu_num','ren'])
#将分列后的关注度数据拼接回原数据表
house=pd.merge(house,guanzhu_num_split,right_index=True, left_index=True)
#去除房源关注度字段两端的空格
house['guanzhu_num']=house['guanzhu_num'].map(str.strip)
#更改房源关注度及总价字段的格式
house[['guanzhu_num','totalprice']]=house[['guanzhu_num','totalprice']].astype(float)
#查看房源关注度的区间
print house['guanzhu_num'].min(),house['guanzhu_num'].max()
#对房源关注度进行分组,这里的bins也需要根据上边的min()和max()输出值进行设置
bins = [0, 100, 200, 300, 400, 500]
group_guanzhu = ['小于100', '100-200', '200-300', '300-400','400-500']
house['group_guanzhu'] = pd.cut(house['guanzhu_num'], bins, labels=group_guanzhu)
group_guanzhu=house.groupby('group_guanzhu')['group_guanzhu'].agg(len)
#绘制房源关注度分布图,去除注释
# plt.rc('font', family='STXihei', size=15)
# a=np.array([1,2,3,4,5])
# plt.barh([1,2,3,4,5],group_guanzhu,color='#052B6C',alpha=0.8,align='center',edgecolor='white')
# plt.ylabel('Interest groups')
# plt.xlabel('Number')
# plt.xlim(0,2200)
# plt.title('Housing attention distribution')
# plt.legend(['Number'], loc='upper right')
# plt.grid(color='#95a5a6',linestyle='--', linewidth=1,axis='y',alpha=0.4)
# plt.yticks(a,('less 100', '100-200', '200-300', '300-400','400-500'))
# plt.show()
#房源聚类分析
#导入sklearn中的KMeans进行聚类分析
from sklearn.cluster import KMeans
#使用房源总价,面积和关注度三个字段进行聚类
house_type = np.array(house[['totalprice','mianji_num','guanzhu_num']])
#设置质心数量为3
clf=KMeans(n_clusters=3)
#计算聚类结果
clf=clf.fit(house_type)
#查看分类结果的中心坐标
print clf.cluster_centers_
#在原数据表中标注所属类别
house['label'] = clf.labels_
#显示所有数据内容
print house
#三类分类参考
#总价 面积 关注度
#低 低 高
#中 中 中
#高 高 高
根据三个类别在总价,面积和关注度三个点的中心坐标,我们将在售房源分为三个类别,第一个类别是总价低,面积低,关注度高的房源。第二个类别是总价居中,面积居中,关注度居中的类别。第三个类别是总价高,面积高,关注度低的类别。
总结分析:
从营销和用户体验的角度来看,在广告和列表页的默认排序中应该给予总价400万,面积80属性的房源更高的权重。这个类别的房源可以吸引最多的用户关注,提高成交率。
原文中的解释更为详细,可参考。
原文:http://bluewhale.cc/2016-12-04/use-python-crawl-and-analysis-data-lianjia-requests-and-beautifulsoup.html
-
北京二手房数据分析
2020-06-07 15:20:53项目数据来源于链家北京二手房数据。 数据预处理 首先导入分析过程中可能运用到的函数包,并读取显示前10行数据。 import pandas as pd import numpy as np import matplotlib.pyplot as plt import matplotlib as ...目的
本案例得目标主要对数据集中的特征进行量化分析,并且通过图形可视化进行展示出来。项目数据来源于链家北京二手房数据。
数据预处理
首先导入分析过程中可能运用到的函数包,并读取显示前10行数据。
import pandas as pd import numpy as np import matplotlib.pyplot as plt import matplotlib as mpl import seaborn as sns from IPython.display import display %matplotlib inline lianjia_df=pd.read_csv('lianjia.csv') lianjia_df.head(10)
前10行数据结果显示如下所示
然后对数据的基本信息进行查看lianjia_df.index lianjia_df.columns lianjia_df.info()
以上三条代码分别显示如下
再对数据进行描述性统计lianjia_df.describe()
新建特征PerPrice,其值等于房价除以面积,并显示前10行数据df=lianjia_df.copy() df['PerPrice']=lianjia_df['Price']/lianjia_df['Size'] df[:10]
对数据的属性重新排列,并将一些无用的属性删除,最后显示前5行数据,代码及结果显示如下columns=['Region','District','Garden','Layout','Floor','Year','Elevator','Direction','Renovation','PerPrice','Price'] df=pd.DataFrame(df,columns=columns) df.head()
对各个地区的价格进行分析
首先按照地区对价格进行分组,其次按照地区对PerPrice进行分组,然后利用柱形图与箱型图进行可视化
df_house_count=df.groupby('Region')['Price'].count().sort_values(ascending=False) df_house_count=df_house_count.to_frame().reset_index() df_house_mean=df.groupby('Region')['PerPrice'].mean().sort_values(ascending=False) df_house_mean=df_house_mean.to_frame().reset_index() f,[ax1,ax2,ax3]=plt.subplots(3,1,figsize=(20,20)) sns.set(font='SimHei') m=sns.barplot(x='Region',y='PerPrice',palette='Blues_d',data=df_house_mean,ax=ax1) """在柱形图上添加数字""" for index,row in df_house_mean.iterrows(): m.text(row.name,row.PerPrice,round(row.PerPrice,2),ha='center',color='red',fontsize=20) ax1.set_title('北京各大区二手房每平米单价') ax1.set_xlabel('区域') ax1.set_ylabel('每平米单价') b=sns.barplot(x='Region',y='Price',palette='Greens_d',data=df_house_count,ax=ax2) for index,row in df_house_count.iterrows(): b.text(row.name,row.Price,round(row.Price,2),ha='center',color='red',fontsize=20) ax2.set_title('北京各大区二手房数量对比') ax2.set_xlabel('区域') ax2.set_ylabel('数量') sns.boxplot(x='Region',y='Price',palette='Blues_d',data=df,ax=ax3) ax3.set_title('北京各大区二手房总价') ax3.set_xlabel('区域') ax3.set_ylabel('房屋总价') plt.show()
Size特征分析
f,[ax1,ax2]=plt.subplots(1,2,figsize=(15,5)) sns.distplot(df["Size"],bins=20,ax=ax1,color='g') sns.kdeplot(df.Size,shade=1,ax=ax1) #kdeplot()核密度估计图:估计未知的密度函数,属于非参数检验方法之一 sns.regplot(x='Size',y='Price',data=df,ax=ax2) plt.show()
在右图中,出现一些离散值,需要将其去除df=df.loc[(df.Size>10)&(df.Size<1000)] f,[ax1,ax2]=plt.subplots(1,2,figsize=(15,5)) sns.distplot(df["Size"],bins=20,ax=ax1,color='g') sns.kdeplot(df.Size,shade=1,ax=ax1) #kdeplot()核密度估计图:估计未知的密度函数,属于非参数检验方法之一 sns.regplot(x='Size',y='Price',data=df,ax=ax2) plt.show()
处理后的可视化如上图所示户型分析
f,ax1=plt.subplots(figsize=(20,20)) sns.countplot(y='Layout',data=df,ax=ax1) ax1.set_title('房屋户型',fontsize=20) ax1.set_xlabel('数量',fontsize=30) ax1.set_ylabel('户型') plt.show()
Renovation特征分析
df["Renovation"]=df.loc[(df.Renovation!='南北'),'Renovation'] f,[ax1,ax2,ax3]=plt.subplots(1,3,figsize=(20,5)) sns.countplot(df.Renovation,ax=ax1) sns.barplot(x='Renovation',y='Price',data=df,ax=ax2) sns.boxplot(x='Renovation',y='Price',data=df,ax=ax3) plt.show()
对第二个图进行改进后如下代码和结果显示df4=df.groupby('Renovation')['Price'].mean().to_frame().reset_index() f,ax2=plt.subplots(figsize=(10,10)) n=sns.barplot(x='Renovation',y='Price',data=df4,ax=ax2) for ind,row in df4.iterrows(): n.text(row.name,row.Price,round(row.Price,2),ha='center',color='red',fontsize=20) plt.show()
Elevator特征分析
df.loc[(df.Floor<=6)&(df.Elevator.isnull()),'Elevator']='无电梯' df.loc[(df.Floor>6)&(df.Elevator.isnull()),'Elevator']='有电梯' df5=df.Elevator.value_counts().to_frame().reset_index() df6=df.groupby('Elevator')['Price'].mean().to_frame().reset_index() f,[ax1,ax2]=plt.subplots(2,1,figsize=(20,20)) h=sns.barplot(x='index',y='Elevator',data=df5,ax=ax1) for inde,row in df5.iterrows(): h.text(row.name,row.Elevator,round(row.Elevator,2),ha='center',color='red',fontsize=20) i=sns.barplot(x='Elevator',y='Price',data=df6,ax=ax2) for inde,row in df6.iterrows(): i.text(row.name,row.Price,round(row.Price,2),ha='center',color='red',fontsize=20) plt.show()
Year特征分析
y=sns.FacetGrid(df,row='Elevator',col='Renovation') y.map(plt.scatter,'Year','Price')
Floor特征分析
f,ax1=plt.subplots(figsize=(20,5)) r=sns.countplot(x='Floor',data=df,ax=ax1) plt.show()
-
爬取北京链家二手房数据
2020-01-08 17:57:07利用python爬取了北京链家主页的二手房数据,爬取时间为2020年1月8日。由于链家只显示了100页、每页30条,因此只能爬取3000条数据。 后续将爬取各区的小区名,对每个小区的在售二手房数据进行收集,这样能获得更多...利用python爬取了北京链家主页的二手房数据,爬取时间为2020年1月8日。由于链家只显示了100页、每页30条,因此只能爬取3000条数据。
后续将爬取各区的小区名,对每个小区的在售二手房数据进行收集,这样能获得更多数据。
以下为程序代码,其最终生成houseinfo.csv文件,包含3000条在售二手房的各类数据。
# -*- coding: utf-8 -*- # 爬取链家二手房数据 from bs4 import BeautifulSoup import requests import pandas as pd import re def get_urls(n): urllist=[] for i in range(n): url='https://bj.lianjia.com/ershoufang/pg'+str(i+1) urllist.append(url) return urllist def get_info(url): headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/63.0.3239.132 Safari/537.36'} response = requests.get(url=url, headers=headers) #获取网页编码数据 content = response.content.decode() #将数据解码 soup = BeautifulSoup(content, features='lxml') #用lxml方式解析 infos = soup.find_all('div', {'class': 'info clear'}) #找到div标签的,class值为info clear的元素 result = {} # 设置DataFrame的列名,为后续添加字典数据做准备,不设置列名,字典无法直接添加 df=pd.DataFrame(columns=('total_price','unit_price','roomtype','height','direction','decorate','area','age' ,'garden','district','id')) for info in infos: url=info.find('a').get('href') #用get()方法获取<a>标签中的href属性,get方法可实现对标签中特定属性的获取 doc=requests.get(url=url,headers=headers) decontent=doc.content.decode() soups=BeautifulSoup(decontent,features='lxml') #获取房屋名、总价和单价 #用select方法找出括号中对应的类型名,括号中用.+单词来表示class类型名 result['total_price']=soups.select('.total')[0].text+'万' result['unit_price']=soups.select('.unitPriceValue')[0].text #获取房屋信息,如房型、层高、朝向、装修情况、面积、楼龄 result['roomtype']=soups.select('.mainInfo')[0].text result['height']=soups.select('.subInfo')[0].text result['direction']=soups.select('.mainInfo')[1].text result['decorate']=soups.select('.subInfo')[1].text result['area']=soups.select('.mainInfo')[2].text result['age']=re.sub("\D","",soups.select('.subInfo')[2].text) #获取房源所在小区、地区、环线等信息 result['garden']=soups.select('.info')[0].text result['district']=soups.select('.info a')[0].text #获取房源编号 result['id']=re.sub("\D","",soups.select('.houseRecord')[0].text) #通过正则方式把字符串中的数字提取出来 # 用append方法向DataFrame中添加字典数据,注意在未设置DataFrame列名的情况下不能直接添加字典数据,会报错 df=df.append(result,ignore_index=True) return df def write_data(urls): dflist=[] for url in urls: dflist.append(get_info(url)) #生成由DataFrame组成的列表 result=pd.concat(dflist) #用concat方法将列表中的DataFrame元素组合起来成为一个大DataFrame result=result.reset_index(drop=True) result.to_csv('houseinfo.csv') #将DataFrame数据写入CSV文件中 urllist=get_urls(100) write_data(urllist) print('success')
-
东莞二手房数据分析
2018-04-21 19:59:40操作时间:2017年9月之前在公众号号看到一篇某地二手房数据爬取分析的帖子,有感而发,正好项目地在东莞,也做了一个东莞二手房数据爬取及分析的帖子。(后附代码)数据获取通过百度‘东莞二手房’,直接查看前面的...版本信息:R3.4; 操作时间:2017年9月
之前在公众号号看到一篇某地二手房数据爬取分析的帖子,有感而发,正好项目地在东莞,也做了一个东莞二手房数据爬取及分析的帖子。(后附代码)
数据获取
通过百度‘东莞二手房’,直接查看前面的‘安居客’的东莞二手房售卖网站。
通过查看网也结构,‘安居客’网页为静态网页,且其翻页地址变动具有稳健规律。故可以简单的获取到网页数据。
我主要抓取了一级页面的这些信息,我觉得用来练手这些数据足够了,还有一个原因就是业务上没啥深度的理解创造需求:
但是在爬取中也发现几个问题:
- 安居客网页售房信息只有50页,但其内容有较高的更新率,所以我采取隔天爬取爬取了好几天的数据,最后合并去重得到最终数据。这样做的好处是可以获取尽量多的数据,坏处是爬取频率过高,激活网页反扒终糟IP拉黑(悲伤ing)
- 网页内容标签结构不完整,结构不是绝对整齐的,所以需要直接爬取大标签内容,然后二次清洗
最终我们获得了16995条有效数据,如此大量的数据得益于我们不怕封IP的多次抓取(其实我的IP真的被封了【哭】)。
文本分析
在描述数据之前,突发奇想的想看看各位‘地主房东’都是怎么描述自己房屋的,也就是售卖信息的标题(我认为售卖信息的标题必然要包含房屋的卖点,同样也可以反映出市场的需求点)。所以先一步给‘房屋描述’做个文本分析。
单独拿出房屋描述列,因为每一条比较短,切关键词重复出现的情况比较少,所以并没有通过分词创造矩阵,直接杂糅出了分词结果:
然后把结果整理一下,顺便去掉了单字的分词:(去掉单个字的词,提炼词频,共有8518个词,最多出现4662次,最少出现1次。)
(以为写个精装我就会相信!)
做个词云展示一下房东售卖信息的关键词,包括报告开始的那个词云也是成果之一:
从词云和词频表中,我们可以简单的总结出:
- 房东售卖房屋的关键词汇总一下(或者说市场需求的潮流):房屋精装、家电齐全、花园洋房、南北通透采光要好、视野开阔、阳台宽大,地铁口、交通便利等等硬条件。还得带上,价格合理,诚心急售!
- 词频在200左右的范围里提到了:品质、时尚、高端、生态、经典等关键词,说明随着房屋档次的上升,房屋售卖的关键词也越来越注重档次。又如词频在70左右的范围里谈到 :设计、山湖、优雅、幸福、 健怡、养生等关键词。说明土豪还是比较注重精神层面的享受。
数据描述
简单将数据集清洗一下,得到若干字段,接下来我们依托这几个字段看看它们相互关系和自身分布表达什么信息
1.各地区的房源
总体看,还是中心城区的房源数量最多,但是东南组团也是比较多房源,是新经济杠点吗?尤其是凤岗、塘厦、樟木头。至于项目的相关地:东城区,更是数量位居第二,仅次于南城区,势头迅猛!
2.各户型
- 三室两厅’的房型数9738,超过一半,东莞人民对三室两厅的房型热情是偏执的,狂热的!
- 3室2厅平均单价为15646.09元/m2;3室2厅平均面积为102.90799m2;
- 东莞人民不光在住房认知上看法是惊人一致的,而且东莞人民还很有钱(东莞人民有钱这件事,这才是开始,嘘!)
3.热门区域
我从数据里取了前30个热门的二手房源地,大家有兴趣买房,可以考虑先去这些地方看看。比如西平、官井头地区的房源最多,可以结合情况优先参考。
4.面积和楼层
- 低层别墅的数量多于小户,大部分人喜欢中层中户,东莞人民很有钱2.0!(这里的底、高层之分是依据原本数据里标注的提取,故存在30层的中层和15层的高层这样的局限性。So,这里无法做深入说明。)
- 表中看出,大中小户占比差别其实不大,但是之前我们得出三室两厅占比超一半,所以,东莞人民对 三室两厅的感情,夸张到什么程度了!!!(95m2以下标记为小户;95m2至120m2的标记为中户;120m2以上的标识为大户;(仅凭经验人为分组,却乏业务理解))
5.房龄关于地区
- 后来的才是正常发展速度,中间有几年东莞就像做梦一样跳跃式发展,结果后续又跳跃下降,其实结合新闻,我们知道那几年东莞繁华过后正逢某事件整顿,经济一片萧条,虽然有了复苏的势头,但是相比之前倒是有所差距。
- 各区的新建房数量都同比下降,没有出现特别明显的新增长点。(其实我更想知道这拉了数据的1900年代的房子是什么样子)
6.房龄关于户型
- 新建的房子在减少,但是,东莞人民对 三室两厅 的狂热追求并没有停止!相比于三室两厅、一厅、三厅的房子,东莞人民对其他房型的追求可比称之为冷淡。
7.房价
- 这单价,进2万的大众水平,和北京昌平区有的一拼了,这得多有钱,富有的东莞人民3.0!
- 单价那么高,总价也就不说什么了,但是在数据里出现了高达5000万的房子,等会要瞄一眼数据5000万的豪宅什么样。
8.地区房价
顺便瞄一眼各地区的总价和单价,这里对y轴上限做了限制,为了更好观察大众水平。
- 在房屋总价上面,大众数值除了南城、松山湖地区明显偏高以为,其他地区都较为稳定。
- 在单价分布上各地区波动较为明显,尤其是松山湖(又是松山湖)地区,毋庸置疑,松山湖地区就是东莞的土豪云集地,高端层次人士居住地。
9.豪宅
最后,我们瞄一眼原始数据里,那些房价超过3000万的房子,为什么是三千万,因为3000万相当于清朝中期20万两白银,当时买个地方官员最高到道台,相当于现在的副省长,而价格四品道台要16400两,知府也就是市长要13300两,县长要9600两。房子卖了就是一方诸侯。
数量不多,但是很惊艳,首先不出所料,不少是松山湖地区的。其次,和想象中一样,该大的大,该贵的贵,看不下去了!
马上结束了
简单总结一下:
- 东莞人民对三室两厅的户型有一种狂热的需求,尤其是中层的三室两厅。
- 松山湖地区是东莞的土豪区。
- 尽管经济发展受挫了,恢复才刚开始,但是不能掩盖东莞人民很有钱的事实。非常有钱!
- 房东售卖房屋的关键词汇总一下(或者说市场需求的潮流):房屋精装、家电齐全、花园洋房、南北通透采光要好、视野开阔、阳台宽大,地铁口、交通便利等等硬条件。还得带上,价格合理,诚心急售!
写在最后
本篇报告完全有感而发,起严谨性上,包括有些结论都完全依托数据,有一定局限性。
代码
library(rvest) library(xml2) library(stringr) library(dplyr) house <- data.frame() for(i in 1:50){ gurl<- str_c("https://dg.anjuke.com/sale/p",i,"/?pi=baidu-cpc-dg-tyongdg2-all&kwid=4279453665&utm_term=%E4%B8%9C%E8%8E%9E%E6%88%BF%E4%BB%B7%E8%B5%B0%E5%8A%BF%E5%9B%BE#filtersort") tmp <- gurl%>%read_html(encoding = "UTF-8")%>%html_nodes(".list-item")#固定父级标签部分 house_name <- tmp%>%html_nodes(".houseListTitle")%>%html_attr("title")#名称,不知道什么用,先爬下来 house_address <- tmp%>%html_nodes(".comm-address")%>%html_attr("title")#房子地址 house_price <- tmp%>%html_nodes(".price-det")%>%html_nodes("strong")%>%html_text()#价格 house_price2 <- tmp%>%html_nodes(".pro-price")%>%html_nodes(".unit-price")%>%html_text() house_point <- tmp%>%html_nodes(".house-title+ .details-item")%>%html_text() house_label <- tmp%>%html_nodes(".tags-bottom")%>%html_text() houseall <- data.frame(house_name,house_address,house_price,house_price2,house_point,house_label) house <- rbind(house, houseall) } write.csv(house, file="house8.csv", row.names = T, fileEncoding = "UTF-8") #前后共爬了8次,导致ip被拉黑了 ################################洗矿######################## house2 <- read.csv(file = "house2.csv",fileEncoding = "UTF-8", stringsAsFactors=F) house3 <- read.csv(file = "house3.csv",fileEncoding = "UTF-8", stringsAsFactors=F) house4 <- read.csv(file = "house4.csv",fileEncoding = "UTF-8", stringsAsFactors=F) house5 <- read.csv(file = "house5.csv",fileEncoding = "UTF-8", stringsAsFactors=F) house6 <- read.csv(file = "house6.csv",fileEncoding = "UTF-8", stringsAsFactors=F) house7 <- read.csv(file = "house7.csv",fileEncoding = "UTF-8", stringsAsFactors=F) house8 <- read.csv(file = "house8.csv",fileEncoding = "UTF-8", stringsAsFactors=F) housex <- rbind(house2,house3,house4,house5,house6,house7,house8)#合并一下 write.csv(housex, file="housex.csv", row.names = T, fileEncoding = "UTF-8")#以防意外,还是写出一下 names(housex) housex2 <- housex[,-1]#去掉唯一标识列 housex2 <- unique.data.frame(housex2)#神级函数,一键到位 rm(house1,house2,house3,house4,house5,house6,house7,house8,houseall,house)#释放内存 rm(zzz, housex)#再释放一下 library(stringr) library(splitstackshape) #head(housex2$house_name) housex3 <- concat.split.multiple(housex2, "house_address", "<U+00A0><U+00A0>") housex3 <- concat.split.multiple(housex3, "house_address_2", "-") housex3 <- concat.split.multiple(housex3, "house_point", "|") housex3 <- concat.split.multiple(housex3, "house_point_4", " ") housex3$house_price2<- as.numeric(sub(pattern = "元/m2", "", housex3$house_price2, perl= TRUE)) housex3$`area(m2)` <- as.numeric(sub(pattern = "m2", "", housex3$`area(m2)`, perl= TRUE))#这里学到一个叼的 #head(housex3$area(m2)) housex3$house_label <- gsub(pattern = "\\s", "", housex3$house_label, perl= TRUE)#去掉label字段多余符号 colnames(housex3)[c(10,11,12,13)] <- c("type","area(m2)", "high", "year")#重命名 colnames(housex3)[3] <- "price(y/m2)" ##########################################粗炼################################ housex3$year <- substr(housex3$year,1,4)#提取年份 housex3$area_fz <- ifelse(housex3$`area(m2)` < 95, "小户", ifelse(housex3$`area(m2)` >= 120, "大户", "中户")) housex3$high_fz <- ifelse(substr(housex3$high,1,2) == "高层", "高层",ifelse(substr(housex3$high,1,2) == "中层", "中层", "低层")) ##################因子转换 varname <- c("house_address_1","house_address_2_1","house_address_2_2","house_address_2_3","house_address_2_4","type","area_fz","high_fz") for(i in varname){ housex3[,i] <- as.factor(housex3[,i]) } housex3$city <- ifelse(housex3$house_address_2_1 =="莞城"|housex3$house_address_2_1 =="南城"|housex3$house_address_2_1 =="东城"|housex3$house_address_2_1 =="茶山"|housex3$house_address_2_1 =="寮步"|housex3$house_address_2_1 =="大岭山"|housex3$house_address_2_1 =="大朗"|housex3$house_address_2_1 =="松山湖","中心组团", ifelse(housex3$house_address_2_1 =="常平"|housex3$house_address_2_1 =="横沥"|housex3$house_address_2_1 =="东坑"|housex3$house_address_2_1 =="石排"|housex3$house_address_2_1 =="企石"|housex3$house_address_2_1 =="桥头"|housex3$house_address_2_1 =="谢岗", "东北组团", ifelse(housex3$house_address_2_1 =="塘厦"|housex3$house_address_2_1 =="樟木头"|housex3$house_address_2_1 =="清溪"|housex3$house_address_2_1 =="黄江"|housex3$house_address_2_1 =="凤岗", "东南组团", ifelse(housex3$house_address_2_1 =="万江"|housex3$house_address_2_1 =="高埗"|housex3$house_address_2_1 =="石碣"|housex3$house_address_2_1 =="石龙"|housex3$house_address_2_1 =="麻涌"|housex3$house_address_2_1 =="中堂"|housex3$house_address_2_1 =="望牛墩"|housex3$house_address_2_1 =="洪梅"|housex3$house_address_2_1 =="道滘", "西北组团","西南组团")))) ################################ #housex <- read.csv(file = "housex.csv",fileEncoding = "UTF-8", stringsAsFactors=F) #洗不动了,先这样吧 write.csv(housex3, file="housex3.csv", row.names = F, fileEncoding = "UTF-8")#写出这个数据集 ##################################################################### ##################################################################### #####################################词云来一波################################ library(jiebaR) library(wordcloud2) house_name <- housex3$house_name house_name <- unlist(house_name) class(house_name) #head(house_name) wk <- worker()#其實這一步,哎,都是l泪 #dir() segname <- segment(house_name, wk)#出現分詞結果 segnamem <- segname[nchar(segname)>1]##停词字典不能用,直接粗暴的删掉一个字的 keyname <- data.frame(sort(table(segnamem), decreasing = T))#给出词频表 keynamepro <- keyname[keyname$Freq >1,]#词太多了,取一半 keynamepro2 <- keynamepro[1:1000,]#还是太多,取8分之一 write.csv(keynamepro2, file="keynamepro2.csv", row.names = F, fileEncoding = "UTF-8")#写出文件是个好习惯 wordcloud2(keyname, size = 1, figPath = "house2.png", color = "random-dark")#找一张酷炫的图 #这里写个小节 #东莞,或者大部分地区售房,先要吹嘘自己的房屋精装修,家电齐全,,其实都那样,买房嘛,花园洋房,南北通透采光要好, #视野开阔,阳台宽大,地铁口,交通便利等等硬条件,还得带上,价格合理,诚心急售 #200多个说到 品质,时尚,高端,生态,经典, #70多谈到 设计,山湖, 优雅,幸福, 健怡, 养生 ####################################################################### ##################################ggplot2######################################### housex3 <- read.csv(file = "housex3.csv",fileEncoding = "UTF-8", stringsAsFactors=F)#这种活还是要一气呵成,辛苦把数据集写出了,好习惯 str(housex3)#这里看看变量属性,重新定义一下。真是5000行报错炼神,醉了 library(ggplot2) ###################先来看看东莞各区域的房源 paddress <- ggplot(data = housex3, aes(house_address_2_1)) paddress + geom_bar(aes(fill= city))+ labs(x=NULL, y="待售房", title="东莞各区二手房库存") + theme(axis.text.x = element_text(angle = 60, vjust = 0.5, size=15))+ theme_bw() #table(housex3$house_address_2_1,housex3$city) #theme(axis.text.y= element_text(size=15, family="myFont", color="black", face= "bold", vjust=0.5, hjust=0.5)) ##可以明显的看到,南城、东城、凤岗地区的房源明显居多,而在组团区分上, ##明显是中心组团地区和东南组团地区的房源较多,东南组团地区地处郊区,城区面积大,人少可以理解。 ##但是,这中心组团为市中心,这么多二手房源,可以细思一下 #################再看看各房型 toptype <- sort(table(housex3$type),decreasing=T)[1:15] ttype <- data.frame(toptype) ttype$type <- rownames(ttype) ptype <- ggplot(data = ttype ,aes(x=reorder(Var1,sort(Freq)), y=Freq))#这里一点要吐槽一下赵同学,智商低的一批 ptype + geom_col(aes(fill="red"))+ theme_bw() + geom_text(label=ttype$Freq)+ labs(x=NULL, y="待售房", title="各房型受众热度") + theme(axis.text.x = element_text(angle = 60, vjust = 0.5, size=10)) #三室两厅的房型数9738,超过一半,东莞人民对三室两厅的房型热爱是偏执的,狂热的, typeprice <- aggregate(housex3$price.y.m2.,by=list(housex3$type),mean) #而 3室2厅 平均单价为 15646.09元/m2, typearea <- aggregate(housex3$area.m2.,by=list(housex3$type),mean) #而 3室2厅 平均面积为 102.90799m2 #so, 东莞人在住房认知上看法还是惊人的一致另外,东莞还是有钱人多,好吧,地球还是有钱人多 #########################看看各面积分布 ggplot(housex3, aes(x=factor(1),fill= area_fz))+geom_bar(width=1)+coord_polar(theta = "y") #各种户型占比差不多,应该跟我的阈值设置有关系,但是结合之前的结论, #type3_2 <- housex3[which(housex3$type=="3室2厅"),] ##############################二手房地点分布 addresstop15 <- sort(table(housex3$house_address_2_2),decreasing=T)[1:30] addresstop15 <- data.frame(addresstop15) addresstop15$addr<- rownames(addresstop15) ptype <- ggplot(data = addresstop15 ,aes(x=reorder(Var1,sort(Freq)), y=Freq))#这里一点要吐槽一下赵同学,智商低的一批 ptype + geom_col(aes(fill= "red"))+ labs(x=NULL, y="待售房", title="各地区房屋数量") + theme_bw() + geom_text(aes(label=addresstop15$Freq), position = position_dodge(0.9), vjust = 0) + theme(axis.text.x = element_text(angle = 60, vjust = 0.5, size=10)) ###############################################各楼层分布 paddress <- ggplot(data = housex3, aes(high_fz)) paddress + geom_bar(aes( fill= area_fz))+ labs(x=NULL, y="待售房", title="楼层分布") #theme(axis.text.x = element_text(angle = 60, vjust = 0.5, size=15)) #############################################房龄分布 ggplot(housex3,aes(year))+geom_bar(aes(fill=type))+ theme_bw() + xlim(1990, 2017) + labs(x=NULL, y="待售房", title="房龄分布")#房龄和放型的关系 ggplot(housex3,aes(year))+geom_bar(aes(fill=city))+ theme_bw() + xlim(1990, 2017) + labs(x=NULL, y="待售房", title="房龄分布")#房龄关于地区的关系 ########################################二手房总价和单价分布: ggplot(housex3,aes(price.y.m2.))+geom_histogram(aes(fill="red")) + theme_bw() + labs(x="房屋单价", y="待售房", title="房屋单价分布") #单价分布 ggplot(housex3,aes(house_price))+geom_histogram(aes(fill="red")) + theme_bw() + labs(x="房屋总价", y="待售房", title="房屋总价分布") #总价分布 YQ <- housex3[which(housex3$house_price > 3000),] names(YQ) YQ1 <- YQ[,-c(7,8,9)] #豪宅 ############################################## ##############################各区细况############### #################各区的均价####################### avgprice <- aggregate(housex3$price.y.m2.,by=list(housex3$house_address_2_1),mean) colnames(avgprice)[2] <- "value" #############箱线图 tb<-ggplot(housex3,aes(house_address_2_1,house_price)) tb+geom_boxplot(outlier.colour="darkgreen",fill="grey80")+ ylim(0,2000) + theme_bw() +labs(x=NULL, y=NULL, title="房屋总价分布") #总价 tb<-ggplot(housex3,aes(house_address_2_1,price.y.m2.)) tb+geom_boxplot(outlier.colour="darkgreen",fill="grey80")+ylim(5000,100000)+ theme_bw() + labs(x=NULL, y=NULL, title="房屋单价分布") #单价 tb<-ggplot(housex3,aes(city,price.y.m2.)) tb+geom_boxplot(outlier.colour="darkgreen",fill="grey80")+ylim(5000,100000)#单价
-
python二手房数据分析_Python 爬取北京二手房数据,分析北漂族买得起房吗? | 附完整源码...
2020-12-21 19:19:20作者徐麟本文经授权转自公众号数据森麟(ID: shujusenlin)房价高是北漂们一直关心的话题,本文就对北京的二手房数据进行了分析。本文主要分为两部分:Python爬取赶集网北京二手房数据,R对爬取的二手房房价做线性回归... -
Python数据分析实战项目-北京二手房数据分析
2020-01-06 14:50:21本篇文章主要是介绍一个北京二手房数据分析的项目,目的是熟悉python数据分析的及可视化的一些常用方法。 数据获取 通过编写python脚本(爬虫)从二手房交易数据网站上获取北京二手房数据集 数据解释 Direction:... -
第7章 Python数据分析案例实战-二手房数据分析预测系统.pptx
2020-10-22 18:24:57二手房数据分析预测系统;某城市各区二手房均价分析;系统设计;功能结构图;业务流程图;系统预览;系统开发必备;开发工具准备;文件夹组织结构;技术准备;scikit-learn模块概述;scikit-learn库概述;加载datasets子模块中的... -
ML之FE:对爬取的某平台二手房数据进行数据分析以及特征工程处理
2020-07-13 14:41:23ML之FE:对爬取的某平台二手房数据进行数据分析以及特征工程处理 目录 对爬取的某平台二手房数据进行数据分析以及特征工程处理 1、定义数据集 2、特征工程(数据分析+数据处理) 对爬取的某平台二手房... -
二手房数据分析项目流程
2020-06-22 18:45:43二手房数据分析项目流程 1.首先导入数据集,查看数据集是否有缺失值 2.显示每一项的总数,查看是否有缺失值(发现Elevator列有大量数据缺失) 3.将数据用百分比形式进行展示 发现疑惑点:Ⅰ:有2平方的房子吗?Ⅱ:... -
学习python抓取数据——链家北京二手房数据
2018-12-22 22:44:40day1:学习python抓取数据–链家北京二手房数据 最近在学习用Python进行数据分析、机器学习,使用数据集效果不错,想用一些实际数据看一下效果,于是想到用Python尝试抓取一些数据。 实验目的:学习Python爬取数据... -
广州链家二手房数据(2017.11.29)
2017-11-29 17:54:31用Python爬取的广州链家二手房数据,时间是2017年11月29日。 -
python 数据分析_python杭州二手房数据分析之python入门
2020-12-07 02:50:57上一篇python杭州二手房数据分析之数据简易分析注重对房价的数据分析及相应的思路ff lin:python杭州二手房数据分析之数据简易分析zhuanlan.zhihu.com此篇打算将如何利用python进行数据分析以及遇到的问题进行归纳... -
利用Excel分析链家二手房数据
2019-04-22 20:54:33Excel分析链家二手房数据 首先导入数据: 可以从工具点击“数据”选项卡–>获取外部数据–>选择“自文本”选项 然后根据文本的特征选择相应的格式就行了 观察一下数据集,数据大体详情如下: 由于特征名看... -
python链家网二手房数据爬取
2017-08-13 13:04:19python链家网二手房数据爬取由于想练习一下Python的数据清洗,并将之前学习的机器学习内容付诸以实践,发现二手房市场的数据分析报告的内容十分匮乏。故此,通过Python爬取“链家网”杭州市二手房房源信息,辅助以... -
【Python】爬取贝壳网深圳二手房数据
2019-10-30 22:45:09【Python】爬取贝壳网深圳二手房数据 一,爬取数据 1,爬取目标内容 先打开页面https://sz.ke.com/ershoufang/ ,看下页面的结构,分页的列表页,点击就可以跳转到对应的详细页面,有详细的二手房信息。 主要爬取... -
爬取链家广州所有二手房数据(包括贷款计算数据和百度地图数据)
2020-09-02 10:35:46爬取链家广州所有二手房数据(包括贷款计算数据和百度地图数据) 如下图:爬取这两部分数据遇到问题。 本次项目爬取链家广州所有二手房数据,共147个字段。其他字段没有难度,分享一下我爬取过程中遇到的问题。 ... -
链家网东莞二手房数据分析
2020-04-22 13:13:54链家网东莞二手房数据分析1、数据来源2、分析思路3、数据预处理4、用户消费特征分析4-1-1、用户订单数、订单金额的描述性统计4-1-2、用户整体消费分析4-1-3、用户月人均消费分析4-2、用户个人消费分析4-3、用户生命... -
广州链家二手房数据Excel(2017.11.29)
2017-12-19 17:58:44用Python爬取的广州链家二手房数据,时间是2017年11月29日。 -
对广州链家网二手房数据进行分析
2019-06-12 18:06:50上一篇我们利用了python抓取了链家网广州地区的历史二手房数据,上一篇爬虫文章。这次将如何对数据进行分析。 问题定义 对于数据分析,第一步是定义问题,由于数据的获已经固定,所以问题固定住了是在广州地区二手房... -
二手房数据分析报告.pdf
2020-12-03 13:09:20北京市房地产市场是我国房地产市场中最为发达,也是最具有代表性的房地产市场之一。 什么样的因素影响着北京市商品房的销售...本案例收集了北京城内六区16210套在售二手房相关数据,试图揭开影响房价因素的神秘面纱! -
python爬取链家_Python爬取链家北京二手房数据
2020-12-08 02:38:25今天分享一下前段时间抓取链家上北京二手房数据的项目。本次分享分为两部分,第一部分介绍如何使用scrapy抓取二手房数据,第二部分我将抓下来的数据进行了一些简单的分析和可视化。最后我会贴上数据,感兴趣的朋友... -
二手房数据的分析与挖掘(八) -- 总结篇
2019-05-28 17:14:42二手房数据的分析与挖掘系列文章 二手房数据的分析与挖掘(一) – 数据采集 二手房数据的分析与挖掘(二)-- 数据处理 二手房数据的分析与挖掘(三)-- 描述性分析2D 二手房数据的分析与挖掘(四)-- 描述性分析3D ... -
基于python的数据分析-基于Python的南京二手房数据可视化分析
2020-10-30 23:22:05最后,采用一个聚类算法对所有二手房数据进行聚类分析,并根据聚类分析的结果,将这些房源大致分类,以对所有数据的概括总结。通过上述分析,我们可以了解到目前市面上二手房各项基本特征及房源分布情况,帮助我们... -
基于Python的南京二手房数据可视化分析
2019-06-09 15:14:20最后,采用一个聚类算法对所有二手房数据进行聚类分析,并根据聚类分析的结果,将这些房源大致分类,以对所有数据的概括总结。通过上述分析,我们可以了解到目前市面上二手房各项基本特征及房源分布情况,帮助我们... -
武汉二手房市场现在怎样了?涨了还是跌了?分析下武汉二手房数据
2020-08-11 15:02:34一、背景与挖掘目标 ...我们用Python来分析下武汉的二手房数据。 PS:如有需要Python学习资料的小伙伴可以加下方的群去找免费管理员领取 可以免费领取源码、项目实战视频、PDF文件等 二、采.. -
链家2020年9月二手房数据
2020-12-10 10:50:07全国的房产价格地址经纬度等信息,2020年9月份链家的二手房数据包。下载后是一个excel表,将这个excel表另存为csv数据文件,可以用pandas读取。 -
用python的requests模块爬取上海地区链家二手房数据
2020-06-29 11:53:38代码链接 一、要爬取什么数据?...二、获取每条二手房数据对应的url链接 1、二手房板块每页的url 上文有提到,链家二手房板块有100页,我们需要获取每个页面对应的url。 以第二页url为例:https://sh.lian
-
python json.dumps中文乱码问题解决
-
2021.1.17寒假打卡Day13
-
【数据分析-随到随学】互联网行业业务指标及行业数
-
Kotlin协程极简入门与解密
-
Latex学习笔记(四)字体加粗与加点
-
【数据分析-随到随学】数据分析建模和预测
-
微电子电路实验仿真代码
-
2021全网最详细【WEB前端】从零入门实战教程,全课程119节
-
Discourse 如何设置 API 的 key
-
【Jeecg】【代码生成】【VUE】-新增和编辑记录后-刷新列表的方法
-
prototype.js使用教程.zip
-
实验1认识Packer Tracer软件.pkt
-
彻底学会正则表达式
-
leetcode刷题day6
-
【数据分析-随到随学】Python语法强化与数据处理
-
思路
-
(新)备战2021软考系统集成学习套餐
-
一个很不错的visual c++ vc内存池的源码,本人在项目中使用.很有价值.zip
-
第1章 Java入门基础及环境搭建【java编程进阶】
-
紫鲸互联前端实习面经(2021.1.6)