利用Python对链家网北京二手房进行简单数据分析

#首先我用爬虫获取到了链家二手房的一万多条信息,我在爬去的时候对空置进行了处理

本文主要讲述如何通过pandas对爬虫下来的链家数据进行相应的二手房数据分析,主要分析内容包括各个区,各个小区的房源信息情况

#导入主要的模块
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#读取数据
house = pd.read_csv(r'C:\Users\cz\Desktop\fang.csv',names=['id','title','link','community','housetype','direction','floor','region','totalprice','followinfo','unitprice','acreage','frequency'])

#然后查看是否有数据

#获取总价格全五的数据
house.sort_values('totalprice',ascending=False).head(5)

#结果

  id title link community housetype direction floor region totalprice followinfo unitprice acreage frequency
3 917 桃花岛 南北全名三居室 满五年 中间楼层 得房率93.4% https://bj.lianjia.com/ershoufang/101102706320... 桃花岛 3室2厅 南 北 6 通州 600.0 23 50113 119.73平米 0
0 914 满五年唯一南北通透大2居 板楼1层2户 全天采光视野好 https://bj.lianjia.com/ershoufang/101102810716... 天通西苑三区 2室2厅 南 北 13 昌平 499.0 25 37209 134.11平米 25
2 916 南北通透大3居+低楼层+落地窗户+生活方便 https://bj.lianjia.com/ershoufang/101102750110... 华龙小区 3室1厅 南 北 6 通州 466.0 35 37930 122.86平米 1
1 915 满两年 南北通透 随时可看 诚心出售 https://bj.lianjia.com/ershoufang/101102910958... 源泉苑 2室1厅 南 北 6 通州 320.0 13 45205 70.79平米 4
4 918 距离古城地铁口282米 满五唯一 小三居室 总价低 https://bj.lianjia.com/ershoufang/101102783849... 古城南路 3室1厅 东 西 6 石景山 275.0 74 46650 58.95平米 4

#字符串的处理

# 将字符串转换成数字主要用于处理面积的数据
def data_adj(area_data, str):
    #判断‘平米’在不在这个数据里
    if str in area_data :
        #用find()函数查找字符串的索引位置,方便截取
        return float(area_data[0 : area_data.find(str)])    
    else :        
        return None
#把字符串里的平米去掉
house['acreage'] = house['acreage'].apply(data_adj,str = '平米')

处理后结果如下(我只截取前五个数据太大了)

0        134.11
1         70.79
2        122.86
3        119.73
4         58.95
5         78.54

接下来我来计算所有户型的个数,然后用图像展示出来

#计算户型的所占的个数,用到value_counts(),排序也给你做好了,你可以清楚的看到所占的个数
housetype = house['housetype'].value_counts()

#结果

2室1厅      4251
3室1厅      1766
3室2厅      1268
1室1厅      1011
2室2厅       755
4室2厅       478
1室0厅       176
4室1厅       139
5室2厅        96
1房间1卫       41
2房间1卫       32
5室3厅        32
1室2厅        30
4室3厅        27
3房间1卫       25
3房间2卫       24
6室2厅        23
3室3厅        18
3室0厅        15
5室1厅        15
2室0厅        14
4房间2卫        8
6室3厅         8
5房间2卫        7
4房间1卫        5
5房间3卫        5
4房间3卫        3
2室3厅         3
5室4厅         3
7室2厅         3
1房间0卫        2
9室3厅         1
9室1厅         1
4室4厅         1
11房间3卫       1
6房间3卫        1
7室1厅         1
6房间4卫        1
6室6厅         1
6室1厅         1
7室3厅         1
8室2厅         1
6室4厅         1
Name: housetype, dtype: int64

#我们把图像话出来,有于后面的小数据比较多我就展示了前10个的信息

有于matplotlib不显示中文我在网上查了些资料,得到的解决方案就是加两行代码

from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
#设置画布
asd,sdf = plt.subplots(1,1,dpi=200)
#获取前10条数据
housetype.head(10).plot(kind='bar',x='housetype',y='size',title='户型数量分布',ax=sdf)
plt.legend(['数量'])
plt.show()

#图像展示结果,有图像可以清楚的看到数量分布情况


#图片的下载

#下载图片
plt.savefig(r"C:\Users\cz\Desktop\housetype.jpg") 

#户型和关注人数分布

#户型和关注人数分布
type_interest_group = house['followinfo'].groupby(house['housetype']).agg([('户型', 'count'), ('关注人数', 'sum')])

#获取户型数量大于50 的数据
ti_sort = type_interest_group[type_interest_group['户型'] > 50 ].sort_values(by='户型')

#结果

5室2厅 96 5753
4室1厅 139 9445
1室0厅 176 11409
4室2厅 478 30824
2室2厅 755 38173
1室1厅 1011 65393
3室2厅 1268 71446
3室1厅 1766 107967
2室1厅 4251 273616

#图像展示

#画图
asd,sdf = plt.subplots(1,1,dpi=150)
ti_sort.plot(kind='barh',alpha=0.7,grid=True,ax=sdf)
plt.title('二手房户型和关注人数分布')    
plt.ylabel('户型') 
plt.show()

#户型与看房次数

#户型和看房次数数分布
type_interest_num = house['frequency'].groupby(house['housetype']).agg([('户型', 'count'), ('看房次数', 'sum')])
ti_sort = type_interest_num[type_interest_num['户型'] > 50 ].sort_values(by='户型')
#画图
asd,sdf = plt.subplots(1,1,dpi=150)
ti_sort.plot(kind='barh',alpha=0.7,grid=True,ax=sdf)
plt.title('二手房户型和看房次数')
plt.ylabel('户型') 
plt.show()


在售面积分布

area_level = [0, 50, 100, 150, 200, 250, 300, 500] 
label_level = ['小于50', '50-100', '100-150', '150-200', '200-250', '250-300', '300-350']
#算出所面积在哪个区间
are_cut = pd.cut(house['acreage'],area_level,label_level)
#计算面积在所设置的区间的数量
acreage = are_cut.value_counts()
acreage

#画图

asd,sdf = plt.subplots(1,1,dpi=150)
acreage.plot(kind='bar',rot=30,alpha=0.4,grid=True,ax=sdf)
plt.title('二手房面积分布')    
plt.xlabel('面积')    
plt.legend(['数量'])    
plt.show()

#算出个个区域的平均房价

#各个区房源均价
region =house.groupby('region').mean()['unitprice']

#画图

asd,sdf = plt.subplots(1,1,dpi=150)
region.plot(kind='bar',x='region',y='unitprice', title='各个区域房源均价',ax=sdf)
plt.show()

#区域房源分布量

#各个区域房源数量排序
region_num = house.groupby('region').size().sort_values(ascending=False)

#画图

region_num = house.groupby('region').size().sort_values(ascending=False)
asd,sdf = plt.subplots(1,1,dpi=150)
region_num.plot(kind='bar',x='region',y='size',title='各个区域房源数量分布',ax=sdf)
plt.legend(['数量'])
plt.show()

#北京在售面积最小二手房
house.sort_values('acreage').iloc[0,:]

#结果

id                                                         9933
title                                 西城区 荣丰2008小区 一起开间 满五年 总价低
link          https://bj.lianjia.com/ershoufang/101102783824...
community                                                荣丰2008
housetype                                                  1室0厅
direction                                                     东
floor                                                        26
region                                                       西城
totalprice                                                  290
followinfo                                                   61
unitprice                                                151357
acreage                                                   19.16
frequency                                                    41
Name: 9019, dtype: object

#小区房源数量

# 各个区域小区房源数量
community_num =house.groupby('community').size().sort_values(ascending=False)
#画图
asd,sdf = plt.subplots(1,1,dpi=150)
#取前十五个
community_num.head(15).plot(kind='bar',x='community',y='size',title='各个小区数量',ax=sdf)
plt.legend(['数量'])
plt.show()

各个小区房源均价

#各个小区的房源均价
community_mean = house.groupby('community').mean()['unitprice'].sort_values(ascending=False)
#画图
asd,sdf = plt.subplots(1,1,dpi=150)
#前10 条
community_mean.head(10).plot(kind='bar',x='community',y='mean',title='各个小区房源均价',ax=sdf)
plt.legend(['均价'])
plt.show()

#各个小区的关注人数

#个个小区看房人数
community_fsum = house['frequency'].groupby(house['community']).agg([('小区', 'count'), ('看房次数', 'sum')])
commnuity_count = community_fsum[community_fsum['小区'] >30].sort_values(by='小区')
#画图
asd,sdf = plt.subplots(1,1,dpi=150)
commnuity_count.plot(kind='barh',ax=sdf)
plt.title('各个小区看房人数')
plt.show()


#如有错误请指出,谢谢!

猜你喜欢

转载自blog.csdn.net/yang_bingo/article/details/80715943