深圳租房分析(2/2)数据分析
- 1、数据处理分析准备
- 1.1、导入数据
- 1.2、处理重复值
- 1.3、数据类型转换
- 2、房源数量,位置分布分析
- 2.1、各城区房源数量对比(横柱状图)
- 2.2、各户型数量分析(横柱状图)
- 2.3、各个城区平均租金(柱状图和折线图)
- 2.4、面积区间分析(饼状图)
- 2.5、朝向对于价格影响(柱状图和折线图)
- 3、结语
数据来源链家租房网站。随机爬虫了5000多数据。删除了信息相同的一部分信息。余下的会从五个维度进行分析!
- 01各个城区房源数量对比(横柱状图)
- 02各种户型之间数量对比(横柱状图)(删除了部分数量太少的户型)
- 03各个城区租金对比(柱状图和折线统计图)
- 04面积区间分布图(饼状图)
- 05房屋朝向不同的房屋价格对比(柱状图和折线统计图)
# 导包
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
处理中文字符无法正常显示
from pylab import mpl
# 设置显示中文字体
mpl.rcParams["font.sans-serif"] = ["SimHei"]
# 设置正常显示符号
mpl.rcParams["axes.unicode_minus"] = False
1、数据处理分析准备
1.1、导入数据
data = pd.read_csv("./shenzhenlianjia.csv", encoding='gbk')
data
|
城区
|
小区
|
面积
|
房间格局
|
方向
|
价格
|
0
|
大鹏新区
|
承翰半山海
|
36㎡
|
1室1厅1卫
|
东南
|
1500
|
1
|
大鹏新区
|
承翰半山海
|
36㎡
|
1室1厅1卫
|
西北
|
1800
|
2
|
大鹏新区
|
承翰半山海
|
36㎡
|
1室1厅1卫
|
南
|
1800
|
3
|
大鹏新区
|
承翰半山海
|
36㎡
|
1室1厅1卫
|
东南
|
1800
|
4
|
大鹏新区
|
承翰半山海
|
36㎡
|
1室1厅1卫
|
东南
|
1800
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
4320
|
福田区
|
特区报社宿舍楼
|
14㎡
|
5室1厅2卫
|
西
|
2390
|
4321
|
南山区
|
佳兆业前海广场一期
|
88㎡
|
4室2厅1卫
|
东南
|
9500
|
4322
|
福田区
|
锦林新居
|
17㎡
|
3室1厅1卫
|
南
|
2560
|
4323
|
福田区
|
众孚大厦
|
7㎡
|
4室1厅2卫
|
东南
|
1790
|
4324
|
龙岗区
|
东方半岛花园A区
|
13㎡
|
4室1厅2卫
|
西北
|
1660
|
4325 rows × 6 columns
1.2、处理重复值
# 检测重复数据,
data.duplicated()
data.shape
(4325, 6)
data = data.drop_duplicates()
data = data[data['城区'] != '城区']
data
|
城区
|
小区
|
面积
|
房间格局
|
方向
|
价格
|
0
|
大鹏新区
|
承翰半山海
|
36㎡
|
1室1厅1卫
|
东南
|
1500
|
1
|
大鹏新区
|
承翰半山海
|
36㎡
|
1室1厅1卫
|
西北
|
1800
|
2
|
大鹏新区
|
承翰半山海
|
36㎡
|
1室1厅1卫
|
南
|
1800
|
3
|
大鹏新区
|
承翰半山海
|
36㎡
|
1室1厅1卫
|
东南
|
1800
|
6
|
大鹏新区
|
承翰半山海
|
36㎡
|
1室1厅1卫
|
南
|
2000
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
4320
|
福田区
|
特区报社宿舍楼
|
14㎡
|
5室1厅2卫
|
西
|
2390
|
4321
|
南山区
|
佳兆业前海广场一期
|
88㎡
|
4室2厅1卫
|
东南
|
9500
|
4322
|
福田区
|
锦林新居
|
17㎡
|
3室1厅1卫
|
南
|
2560
|
4323
|
福田区
|
众孚大厦
|
7㎡
|
4室1厅2卫
|
东南
|
1790
|
4324
|
龙岗区
|
东方半岛花园A区
|
13㎡
|
4室1厅2卫
|
西北
|
1660
|
2762 rows × 6 columns
data.shape
(2762, 6)
1.3、数据类型转换
# 把面积转化为数组int
data_area_new = np.array([])
data_area = data['面积'].values
data_area
data
|
城区
|
小区
|
面积
|
房间格局
|
方向
|
价格
|
0
|
大鹏新区
|
承翰半山海
|
36㎡
|
1室1厅1卫
|
东南
|
1500
|
1
|
大鹏新区
|
承翰半山海
|
36㎡
|
1室1厅1卫
|
西北
|
1800
|
2
|
大鹏新区
|
承翰半山海
|
36㎡
|
1室1厅1卫
|
南
|
1800
|
3
|
大鹏新区
|
承翰半山海
|
36㎡
|
1室1厅1卫
|
东南
|
1800
|
6
|
大鹏新区
|
承翰半山海
|
36㎡
|
1室1厅1卫
|
南
|
2000
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
4320
|
福田区
|
特区报社宿舍楼
|
14㎡
|
5室1厅2卫
|
西
|
2390
|
4321
|
南山区
|
佳兆业前海广场一期
|
88㎡
|
4室2厅1卫
|
东南
|
9500
|
4322
|
福田区
|
锦林新居
|
17㎡
|
3室1厅1卫
|
南
|
2560
|
4323
|
福田区
|
众孚大厦
|
7㎡
|
4室1厅2卫
|
东南
|
1790
|
4324
|
龙岗区
|
东方半岛花园A区
|
13㎡
|
4室1厅2卫
|
西北
|
1660
|
2762 rows × 6 columns
for i in data_area:data_area_new = np.append(data_area_new, np.array(i[:-1]))
data_area_new = data_area_new.astype(np.float64)
data.loc[:, '面积'] = data_area_new
dataprice = data['价格'].astype(np.float64)
data.loc[:, '价格'] = dataprice
data
|
城区
|
小区
|
面积
|
房间格局
|
方向
|
价格
|
0
|
大鹏新区
|
承翰半山海
|
36.0
|
1室1厅1卫
|
东南
|
1500.0
|
1
|
大鹏新区
|
承翰半山海
|
36.0
|
1室1厅1卫
|
西北
|
1800.0
|
2
|
大鹏新区
|
承翰半山海
|
36.0
|
1室1厅1卫
|
南
|
1800.0
|
3
|
大鹏新区
|
承翰半山海
|
36.0
|
1室1厅1卫
|
东南
|
1800.0
|
6
|
大鹏新区
|
承翰半山海
|
36.0
|
1室1厅1卫
|
南
|
2000.0
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
4320
|
福田区
|
特区报社宿舍楼
|
14.0
|
5室1厅2卫
|
西
|
2390.0
|
4321
|
南山区
|
佳兆业前海广场一期
|
88.0
|
4室2厅1卫
|
东南
|
9500.0
|
4322
|
福田区
|
锦林新居
|
17.0
|
3室1厅1卫
|
南
|
2560.0
|
4323
|
福田区
|
众孚大厦
|
7.0
|
4室1厅2卫
|
东南
|
1790.0
|
4324
|
龙岗区
|
东方半岛花园A区
|
13.0
|
4室1厅2卫
|
西北
|
1660.0
|
2762 rows × 6 columns
2、房源数量,位置分布分析
2.1、各城区房源数量对比(横柱状图)
# 一共有10个城区
num = data['城区'].nunique()
num
10
# 城区列表
area_df = pd.DataFrame({'城区': data['城区'].unique(), '数量': [0]*num})
area_df
|
城区
|
数量
|
0
|
大鹏新区
|
0
|
1
|
龙岗区
|
0
|
2
|
盐田区
|
0
|
3
|
南山区
|
0
|
4
|
坪山区
|
0
|
5
|
龙华区
|
0
|
6
|
宝安区
|
0
|
7
|
罗湖区
|
0
|
8
|
光明区
|
0
|
9
|
福田区
|
0
|
grouparea = data.groupby(by='城区').count()
grouparea
|
小区
|
面积
|
房间格局
|
方向
|
价格
|
城区
|
|
|
|
|
|
光明区
|
22
|
22
|
22
|
22
|
22
|
南山区
|
458
|
458
|
458
|
458
|
458
|
坪山区
|
50
|
50
|
50
|
50
|
50
|
大鹏新区
|
71
|
71
|
71
|
71
|
71
|
宝安区
|
288
|
288
|
288
|
288
|
288
|
盐田区
|
66
|
66
|
66
|
66
|
66
|
福田区
|
570
|
570
|
570
|
570
|
570
|
罗湖区
|
428
|
428
|
428
|
428
|
428
|
龙华区
|
245
|
245
|
245
|
245
|
245
|
龙岗区
|
564
|
564
|
564
|
564
|
564
|
area_df['数量'] = grouparea.values
area_df
|
城区
|
数量
|
0
|
大鹏新区
|
22
|
1
|
龙岗区
|
458
|
2
|
盐田区
|
50
|
3
|
南山区
|
71
|
4
|
坪山区
|
288
|
5
|
龙华区
|
66
|
6
|
宝安区
|
570
|
7
|
罗湖区
|
428
|
8
|
光明区
|
245
|
9
|
福田区
|
564
|
area_df.sort_values(by='数量', ascending=False)
|
城区
|
数量
|
6
|
宝安区
|
570
|
9
|
福田区
|
564
|
1
|
龙岗区
|
458
|
7
|
罗湖区
|
428
|
4
|
坪山区
|
288
|
8
|
光明区
|
245
|
3
|
南山区
|
71
|
5
|
龙华区
|
66
|
2
|
盐田区
|
50
|
0
|
大鹏新区
|
22
|
# 可视化展示
distance_type = area_df['城区']
num_type = area_df['数量']plt.figure(figsize=(20, 13), dpi=100)
plt.barh(range(10), num_type, height=0.7)
# 替换标签
plt.yticks(range(10), distance_type)# x坐标延长
plt.xlim(0, 600)
plt.xlabel('数量')
plt.ylabel('城区')
plt.title('深圳市各城区租房数量')# 显示数量
for x, y in enumerate(num_type):plt.text(y+0.5, x, '%s' % y)
plt.show()
2.2、各户型数量分析(横柱状图)
这里的户型太多了,有些户型太少,所以进行了取舍,舍弃户型数量小于的50的,只需要分析户型大于50的!
num = data['房间格局'].nunique()
num
52
room_df = pd.DataFrame({'房间格局': data['房间格局'].unique(), '数量': [0]*num})
room_df
|
房间格局
|
数量
|
0
|
1室1厅1卫
|
0
|
1
|
1室0厅1卫
|
0
|
2
|
2室2厅1卫
|
0
|
3
|
2室1厅1卫
|
0
|
4
|
3室2厅1卫
|
0
|
5
|
3室2厅2卫
|
0
|
6
|
4室2厅2卫
|
0
|
7
|
3室1厅3卫
|
0
|
8
|
3室1厅2卫
|
0
|
9
|
8室2厅5卫
|
0
|
10
|
5室2厅5卫
|
0
|
11
|
5室3厅5卫
|
0
|
12
|
3室1厅1卫
|
0
|
13
|
6室2厅4卫
|
0
|
14
|
6室2厅3卫
|
0
|
15
|
2室2厅2卫
|
0
|
16
|
3室2厅3卫
|
0
|
17
|
1室1厅2卫
|
0
|
18
|
4室2厅4卫
|
0
|
19
|
4室1厅1卫
|
0
|
20
|
4室1厅2卫
|
0
|
21
|
4室3厅4卫
|
0
|
22
|
5室1厅2卫
|
0
|
23
|
1室0厅0卫
|
0
|
24
|
3室0厅4卫
|
0
|
25
|
5室0厅1卫
|
0
|
26
|
5室1厅1卫
|
0
|
27
|
1室0厅2卫
|
0
|
28
|
5室0厅5卫
|
0
|
29
|
5室0厅4卫
|
0
|
30
|
1室1厅0卫
|
0
|
31
|
5室1厅3卫
|
0
|
32
|
2室1厅2卫
|
0
|
33
|
5室2厅4卫
|
0
|
34
|
1室2厅1卫
|
0
|
35
|
5室1厅4卫
|
0
|
36
|
5室0厅2卫
|
0
|
37
|
2室0厅1卫
|
0
|
38
|
4室0厅1卫
|
0
|
39
|
2室1厅0卫
|
0
|
40
|
4室1厅3卫
|
0
|
41
|
4室2厅1卫
|
0
|
42
|
5室1厅5卫
|
0
|
43
|
5室0厅3卫
|
0
|
44
|
未知室1厅1卫
|
0
|
45
|
未知室0厅0卫
|
0
|
46
|
5室2厅2卫
|
0
|
47
|
2室0厅2卫
|
0
|
48
|
6室1厅3卫
|
0
|
49
|
4室0厅4卫
|
0
|
50
|
2室2厅3卫
|
0
|
51
|
6室2厅2卫
|
0
|
grouproom = data.groupby(by='房间格局').count()
grouproom
|
城区
|
小区
|
面积
|
方向
|
价格
|
房间格局
|
|
|
|
|
|
1室0厅0卫
|
21
|
21
|
21
|
21
|
21
|
1室0厅1卫
|
453
|
453
|
453
|
453
|
453
|
1室0厅2卫
|
1
|
1
|
1
|
1
|
1
|
1室1厅0卫
|
6
|
6
|
6
|
6
|
6
|
1室1厅1卫
|
521
|
521
|
521
|
521
|
521
|
1室1厅2卫
|
2
|
2
|
2
|
2
|
2
|
1室2厅1卫
|
5
|
5
|
5
|
5
|
5
|
2室0厅1卫
|
6
|
6
|
6
|
6
|
6
|
2室0厅2卫
|
1
|
1
|
1
|
1
|
1
|
2室1厅0卫
|
1
|
1
|
1
|
1
|
1
|
2室1厅1卫
|
366
|
366
|
366
|
366
|
366
|
2室1厅2卫
|
5
|
5
|
5
|
5
|
5
|
2室2厅1卫
|
106
|
106
|
106
|
106
|
106
|
2室2厅2卫
|
13
|
13
|
13
|
13
|
13
|
2室2厅3卫
|
1
|
1
|
1
|
1
|
1
|
3室0厅4卫
|
1
|
1
|
1
|
1
|
1
|
3室1厅1卫
|
213
|
213
|
213
|
213
|
213
|
3室1厅2卫
|
58
|
58
|
58
|
58
|
58
|
3室1厅3卫
|
3
|
3
|
3
|
3
|
3
|
3室2厅1卫
|
109
|
109
|
109
|
109
|
109
|
3室2厅2卫
|
76
|
76
|
76
|
76
|
76
|
3室2厅3卫
|
1
|
1
|
1
|
1
|
1
|
4室0厅1卫
|
6
|
6
|
6
|
6
|
6
|
4室0厅4卫
|
1
|
1
|
1
|
1
|
1
|
4室1厅1卫
|
278
|
278
|
278
|
278
|
278
|
4室1厅2卫
|
196
|
196
|
196
|
196
|
196
|
4室1厅3卫
|
3
|
3
|
3
|
3
|
3
|
4室2厅1卫
|
5
|
5
|
5
|
5
|
5
|
4室2厅2卫
|
31
|
31
|
31
|
31
|
31
|
4室2厅4卫
|
3
|
3
|
3
|
3
|
3
|
4室3厅4卫
|
1
|
1
|
1
|
1
|
1
|
5室0厅1卫
|
8
|
8
|
8
|
8
|
8
|
5室0厅2卫
|
2
|
2
|
2
|
2
|
2
|
5室0厅3卫
|
3
|
3
|
3
|
3
|
3
|
5室0厅4卫
|
4
|
4
|
4
|
4
|
4
|
5室0厅5卫
|
18
|
18
|
18
|
18
|
18
|
5室1厅1卫
|
47
|
47
|
47
|
47
|
47
|
5室1厅2卫
|
156
|
156
|
156
|
156
|
156
|
5室1厅3卫
|
13
|
13
|
13
|
13
|
13
|
5室1厅4卫
|
2
|
2
|
2
|
2
|
2
|
5室1厅5卫
|
3
|
3
|
3
|
3
|
3
|
5室2厅2卫
|
2
|
2
|
2
|
2
|
2
|
5室2厅4卫
|
1
|
1
|
1
|
1
|
1
|
5室2厅5卫
|
2
|
2
|
2
|
2
|
2
|
5室3厅5卫
|
1
|
1
|
1
|
1
|
1
|
6室1厅3卫
|
1
|
1
|
1
|
1
|
1
|
6室2厅2卫
|
1
|
1
|
1
|
1
|
1
|
6室2厅3卫
|
1
|
1
|
1
|
1
|
1
|
6室2厅4卫
|
1
|
1
|
1
|
1
|
1
|
8室2厅5卫
|
1
|
1
|
1
|
1
|
1
|
未知室0厅0卫
|
1
|
1
|
1
|
1
|
1
|
未知室1厅1卫
|
1
|
1
|
1
|
1
|
1
|
room_df['数量'] = grouproom.values
room_df
|
房间格局
|
数量
|
0
|
1室1厅1卫
|
21
|
1
|
1室0厅1卫
|
453
|
2
|
2室2厅1卫
|
1
|
3
|
2室1厅1卫
|
6
|
4
|
3室2厅1卫
|
521
|
5
|
3室2厅2卫
|
2
|
6
|
4室2厅2卫
|
5
|
7
|
3室1厅3卫
|
6
|
8
|
3室1厅2卫
|
1
|
9
|
8室2厅5卫
|
1
|
10
|
5室2厅5卫
|
366
|
11
|
5室3厅5卫
|
5
|
12
|
3室1厅1卫
|
106
|
13
|
6室2厅4卫
|
13
|
14
|
6室2厅3卫
|
1
|
15
|
2室2厅2卫
|
1
|
16
|
3室2厅3卫
|
213
|
17
|
1室1厅2卫
|
58
|
18
|
4室2厅4卫
|
3
|
19
|
4室1厅1卫
|
109
|
20
|
4室1厅2卫
|
76
|
21
|
4室3厅4卫
|
1
|
22
|
5室1厅2卫
|
6
|
23
|
1室0厅0卫
|
1
|
24
|
3室0厅4卫
|
278
|
25
|
5室0厅1卫
|
196
|
26
|
5室1厅1卫
|
3
|
27
|
1室0厅2卫
|
5
|
28
|
5室0厅5卫
|
31
|
29
|
5室0厅4卫
|
3
|
30
|
1室1厅0卫
|
1
|
31
|
5室1厅3卫
|
8
|
32
|
2室1厅2卫
|
2
|
33
|
5室2厅4卫
|
3
|
34
|
1室2厅1卫
|
4
|
35
|
5室1厅4卫
|
18
|
36
|
5室0厅2卫
|
47
|
37
|
2室0厅1卫
|
156
|
38
|
4室0厅1卫
|
13
|
39
|
2室1厅0卫
|
2
|
40
|
4室1厅3卫
|
3
|
41
|
4室2厅1卫
|
2
|
42
|
5室1厅5卫
|
1
|
43
|
5室0厅3卫
|
2
|
44
|
未知室1厅1卫
|
1
|
45
|
未知室0厅0卫
|
1
|
46
|
5室2厅2卫
|
1
|
47
|
2室0厅2卫
|
1
|
48
|
6室1厅3卫
|
1
|
49
|
4室0厅4卫
|
1
|
50
|
2室2厅3卫
|
1
|
51
|
6室2厅2卫
|
1
|
room_df = room_df[room_df['数量'] > 50]
room_df
|
房间格局
|
数量
|
1
|
1室0厅1卫
|
453
|
4
|
3室2厅1卫
|
521
|
10
|
5室2厅5卫
|
366
|
12
|
3室1厅1卫
|
106
|
16
|
3室2厅3卫
|
213
|
17
|
1室1厅2卫
|
58
|
19
|
4室1厅1卫
|
109
|
20
|
4室1厅2卫
|
76
|
24
|
3室0厅4卫
|
278
|
25
|
5室0厅1卫
|
196
|
37
|
2室0厅1卫
|
156
|
num = room_df.shape[0]
num
11
house_type = room_df['房间格局']
num_type = room_df['数量']# 绘图
plt.figure(figsize=(20, 13), dpi=100)
plt.barh(range(num), num_type, height=0.7)
# 替换标签
plt.yticks(range(num), house_type)# 延长x轴
plt.xlim(0, 550)plt.xlabel('数量')
plt.ylabel('房间类型')
plt.title('深圳市租房主要户型')
for x, y in enumerate(num_type):plt.text(y, x, '%s' % y)plt.show()
2.3、各个城区平均租金(柱状图和折线图)
mean_df = pd.DataFrame({'城区': data['城区'].unique(), '房租总金额': [0]*10, '总面积': [0]*10})
mean_df
|
城区
|
房租总金额
|
总面积
|
0
|
大鹏新区
|
0
|
0
|
1
|
龙岗区
|
0
|
0
|
2
|
盐田区
|
0
|
0
|
3
|
南山区
|
0
|
0
|
4
|
坪山区
|
0
|
0
|
5
|
龙华区
|
0
|
0
|
6
|
宝安区
|
0
|
0
|
7
|
罗湖区
|
0
|
0
|
8
|
光明区
|
0
|
0
|
9
|
福田区
|
0
|
0
|
# 总价格
sum_price = data['价格'].groupby(data['城区']).sum()
sum_price
城区
光明区 87100.0
南山区 1786082.0
坪山区 135056.0
大鹏新区 318690.0
宝安区 992655.0
盐田区 222521.0
福田区 1812617.0
罗湖区 1320652.0
龙华区 731725.0
龙岗区 1510020.0
Name: 价格, dtype: float64
# 总面积
sum_area = data['面积'].groupby(data['城区']).sum()
sum_area
城区
光明区 1821.0
南山区 13555.0
坪山区 3422.0
大鹏新区 5664.0
宝安区 14348.0
盐田区 4017.0
福田区 15982.0
罗湖区 14374.0
龙华区 11286.0
龙岗区 28506.0
Name: 面积, dtype: float64
mean_df['总面积'] = sum_area.values
mean_df['房租总金额'] = sum_price.values
mean_df
|
城区
|
房租总金额
|
总面积
|
0
|
大鹏新区
|
87100.0
|
1821.0
|
1
|
龙岗区
|
1786082.0
|
13555.0
|
2
|
盐田区
|
135056.0
|
3422.0
|
3
|
南山区
|
318690.0
|
5664.0
|
4
|
坪山区
|
992655.0
|
14348.0
|
5
|
龙华区
|
222521.0
|
4017.0
|
6
|
宝安区
|
1812617.0
|
15982.0
|
7
|
罗湖区
|
1320652.0
|
14374.0
|
8
|
光明区
|
731725.0
|
11286.0
|
9
|
福田区
|
1510020.0
|
28506.0
|
mean_df['每平米租金(元)'] = round(mean_df['房租总金额']/mean_df['总面积'], 2)
mean_df
|
城区
|
房租总金额
|
总面积
|
每平米租金(元)
|
0
|
大鹏新区
|
87100.0
|
1821.0
|
47.83
|
1
|
龙岗区
|
1786082.0
|
13555.0
|
131.77
|
2
|
盐田区
|
135056.0
|
3422.0
|
39.47
|
3
|
南山区
|
318690.0
|
5664.0
|
56.27
|
4
|
坪山区
|
992655.0
|
14348.0
|
69.18
|
5
|
龙华区
|
222521.0
|
4017.0
|
55.39
|
6
|
宝安区
|
1812617.0
|
15982.0
|
113.42
|
7
|
罗湖区
|
1320652.0
|
14374.0
|
91.88
|
8
|
光明区
|
731725.0
|
11286.0
|
64.83
|
9
|
福田区
|
1510020.0
|
28506.0
|
52.97
|
# 合并城区数量表
df_merge = pd.merge(area_df, mean_df)
df_merge
|
城区
|
数量
|
房租总金额
|
总面积
|
每平米租金(元)
|
0
|
大鹏新区
|
22
|
87100.0
|
1821.0
|
47.83
|
1
|
龙岗区
|
458
|
1786082.0
|
13555.0
|
131.77
|
2
|
盐田区
|
50
|
135056.0
|
3422.0
|
39.47
|
3
|
南山区
|
71
|
318690.0
|
5664.0
|
56.27
|
4
|
坪山区
|
288
|
992655.0
|
14348.0
|
69.18
|
5
|
龙华区
|
66
|
222521.0
|
4017.0
|
55.39
|
6
|
宝安区
|
570
|
1812617.0
|
15982.0
|
113.42
|
7
|
罗湖区
|
428
|
1320652.0
|
14374.0
|
91.88
|
8
|
光明区
|
245
|
731725.0
|
11286.0
|
64.83
|
9
|
福田区
|
564
|
1510020.0
|
28506.0
|
52.97
|
# 可视化
num = df_merge['数量']
price = df_merge['每平米租金(元)']
l = [i for i in range(10)]
lx = df_merge['城区']fig = plt.figure(figsize=(15, 10), dpi=100)# 显示折线图
ax1 = fig.add_subplot(111)
ax1.plot(l, price, 'or-', label='价格')
for i, (_x, _y) in enumerate(zip(l, price)):plt.text(_x+0.1, _y, price[i])
ax1.set_ylim([0, 160])
ax1.set_ylabel('价格/平米')
plt.legend(loc='upper left')# 绘制条形图
ax2 = ax1.twinx()
plt.bar(l, num, alpha=0.3, color='green', label='数量')
ax2.set_ylabel('数量')
plt.legend(loc='upper right')
plt.xticks(l, lx)
# for x,y in enumerate(num):
# plt.text(y,x,'%2f'%y)plt.title('深圳市各区租房数量与价格')
plt.show()
2.4、面积区间分析(饼状图)
# 查看房屋最贵,最便宜
print('房屋最贵是{}元每月'.format(data['价格'].max()))
print('房屋最便宜是{}元每月'.format(data['价格'].min()))
房屋最贵是180000.0元每月
房屋最便宜是950.0元每月
# 查看房屋的最大面积和最小面积
print('房屋最大面积是{}平方米'.format(data['面积'].max()))
print('房屋最小面积是{}平方米'.format(data['面积'].min()))
房屋最大面积是830.0平方米
房屋最小面积是5.0平方米
# 面积区间划分
area_divide = [0, 8, 15, 25, 40, 55, 70, 90, 120, 850]
area_cut = pd.cut(list(data['面积']), area_divide)
area_cut_data = area_cut.describe()
area_cut_data
|
counts
|
freqs
|
categories
|
|
|
(0, 8]
|
312
|
0.112962
|
(8, 15]
|
505
|
0.182839
|
(15, 25]
|
207
|
0.074946
|
(25, 40]
|
583
|
0.211079
|
(40, 55]
|
418
|
0.151340
|
(55, 70]
|
227
|
0.082187
|
(70, 90]
|
382
|
0.138306
|
(90, 120]
|
95
|
0.034395
|
(120, 850]
|
33
|
0.011948
|
# 数据可视化,使用饼状图
area_percentage = (area_cut_data['freqs'].values)*100
area_percentage
array([11.2961622 , 18.28385228, 7.49456915, 21.10789283, 15.1339609 ,8.21868211, 13.83055757, 3.43953657, 1.19478639])
labels = ['8平米以下', '8-15平米', '15-25平米', '25-40平米', '40-55平米', '55-70平米', '70-90平米','90-120平米', '120平米以上']
plt.figure(figsize=(20, 10), dpi=100)
# 显示的是圆形,如果不加,是椭圆形
plt.axes(aspect=1)
plt.pie(x=area_percentage, labels=labels, autopct='%.2f %%', shadow=True)
plt.legend(loc='best')
plt.title('深圳市租房面积区间统计图')
plt.show
<function matplotlib.pyplot.show(*args, **kw)>
2.5、朝向对于价格影响(柱状图和折线图)
face_df_value = data['方向'].unique()
face_df_value
array(['东南', '西北', '南', '西', '西南', '东', '北', '东北'], dtype=object)
face_df = pd.DataFrame({'方向': data['方向'].unique(), '数量': [0]*face_df_value.shape[0], '总价格': [0]*face_df_value.shape[0], '总面积': [0]*face_df_value.shape[0]})
face_df
|
方向
|
数量
|
总价格
|
总面积
|
0
|
东南
|
0
|
0
|
0
|
1
|
西北
|
0
|
0
|
0
|
2
|
南
|
0
|
0
|
0
|
3
|
西
|
0
|
0
|
0
|
4
|
西南
|
0
|
0
|
0
|
5
|
东
|
0
|
0
|
0
|
6
|
北
|
0
|
0
|
0
|
7
|
东北
|
0
|
0
|
0
|
num_sum = data.groupby(by=data['方向']).count()
num_sum
|
城区
|
小区
|
面积
|
房间格局
|
价格
|
方向
|
|
|
|
|
|
东
|
266
|
266
|
266
|
266
|
266
|
东北
|
83
|
83
|
83
|
83
|
83
|
东南
|
590
|
590
|
590
|
590
|
590
|
北
|
406
|
406
|
406
|
406
|
406
|
南
|
1010
|
1010
|
1010
|
1010
|
1010
|
西
|
139
|
139
|
139
|
139
|
139
|
西北
|
108
|
108
|
108
|
108
|
108
|
西南
|
160
|
160
|
160
|
160
|
160
|
# 总价格
price_sum = data['价格'].groupby(by=data['方向']).sum()
price_sum
方向
东 846353.0
东北 259858.0
东南 2281168.0
北 1149286.0
南 3158155.0
西 388531.0
西北 332181.0
西南 501586.0
Name: 价格, dtype: float64
# 总面积
area_sum = data['面积'].groupby(by=data['方向']).sum()
area_sum
方向
东 9311.0
东北 3275.0
东南 32360.0
北 10820.0
南 42690.0
西 3198.0
西北 3706.0
西南 7615.0
Name: 面积, dtype: float64
# 赋值写入
face_df['数量'] = num_sum.values
face_df['总价格'] = price_sum.values
face_df['总面积'] = area_sum.values
face_df
|
方向
|
数量
|
总价格
|
总面积
|
0
|
东南
|
266
|
846353.0
|
9311.0
|
1
|
西北
|
83
|
259858.0
|
3275.0
|
2
|
南
|
590
|
2281168.0
|
32360.0
|
3
|
西
|
406
|
1149286.0
|
10820.0
|
4
|
西南
|
1010
|
3158155.0
|
42690.0
|
5
|
东
|
139
|
388531.0
|
3198.0
|
6
|
北
|
108
|
332181.0
|
3706.0
|
7
|
东北
|
160
|
501586.0
|
7615.0
|
# 平均价格
face_df['平均价格'] = round(face_df['总价格']/face_df['总面积'], 2)
face_df
|
方向
|
数量
|
总价格
|
总面积
|
平均价格
|
0
|
东南
|
266
|
846353.0
|
9311.0
|
90.90
|
1
|
西北
|
83
|
259858.0
|
3275.0
|
79.35
|
2
|
南
|
590
|
2281168.0
|
32360.0
|
70.49
|
3
|
西
|
406
|
1149286.0
|
10820.0
|
106.22
|
4
|
西南
|
1010
|
3158155.0
|
42690.0
|
73.98
|
5
|
东
|
139
|
388531.0
|
3198.0
|
121.49
|
6
|
北
|
108
|
332181.0
|
3706.0
|
89.63
|
7
|
东北
|
160
|
501586.0
|
7615.0
|
65.87
|
# 准备数据
l = [i for i in range(8)]
_num = face_df['数量']
# _sumprice = face_df['总价格']
# _sumarea = face_df['总面积']
_meanprice = face_df['平均价格']fig = plt.figure(figsize=(20, 8), dpi=100)# 绘制数量柱状图
ax3 = fig.add_subplot(111)
ax3.bar(l, _num, label='数量', alpha=0.5, color='green')
ax3.set_ylabel('数量')
ax3.set_ylim(0, 1200)
plt.legend(loc='upper left')
for x, y in enumerate(_num):plt.text(x-0.1, y+18, '%s' % y)
# 替换x标签
plt.xticks(l, face_df['方向'])# 绘制折线图
ax4 = ax3.twinx()
plt.plot(l, _meanprice, 'or-', label='价格')
ax4.legend(loc='upper right')
ax4.set_ylim(0, 150)
ax4.set_ylabel('价格')
for i, (_x, _y) in enumerate(zip(l, _meanprice)):plt.text(_x+0.1, _y-0.1, _meanprice[i])plt.title('深圳租房朝向对价格影响')
plt.show()
3、结语
主要来深圳一段时间,租房的问题是一个大问题,就自己爬取了一些信息,然后就进行了一部分分析。采取的样本并不是特别多。以上只是个人的数据分析与其他无关!
关注技术,学习进步!
链家租房-深圳租房分析(2/2)数据分析相关推荐
- 链家网北京市租房数据分析(二)——基于python的数据可视化
本次分析的数据为爬取链家网租房首页的3000余条整租房源数据.数据量较小,分析结果难免存在偏差,本分析报告仅作为实战项目展示.本报告中所描述的平均租金指单套房源租金的中位数. 数据源可至百度网盘提取, ...
- ER图连接线上加个圆圈什么意思_如何拿链家网的租房数据做些有意思的事情?...
周末周六两天,做了链家网的爬虫,可能有很多朋友做过,当然很多人只是练爬虫,但没有对爬取数据进行一些可视化去发现一些比较有意思的东西,今天想要通过抓取的数据进行一些比较有趣的统计分析. 如果你想要这份数 ...
- python 爬取链家网北京租房信息
刚学习了python,中途遇到很多问题,查了很多资料,最关键的就是要善于调试,div信息一定不要找错,下面就是我爬取租房信息的代码和运行结果: 链家的房租网站 两个导入的包 1.requests 用来 ...
- 链家网北京市租房数据分析(一)——基于python的数据清洗
作为北漂中的一员,我们都明白,租房是不能回避的问题.租房被坑,也是难以避免的.多数人都有那么一段不堪回首的与黑中介面对面的往事.其实,就是贪图便宜. 便宜可以占,但是我们要理性地占便宜.要有全局观.大 ...
- 链家网杭州租房信息数据爬取+数据分析
参考https://mp.weixin.qq.com/s/vvZ2yBb2eMKP800LUPoAWg 需求分析¶ 过去一个月,全国热点城市的房租如脱缰野马.一线的房租同比涨了近20%.一夜醒来,无产 ...
- 利用神经网络预测链家网上海租房价格(Python)
代码详见:Predict-house-rent-with-neutral-network 简介 本项目利用Python的scrapy框架爬取链家网的上海市租房信息,利用pandas.numpy.mat ...
- 爬取链家-滨江的租房数据
最近学以致用,使用python3的requests package 爬取 链家-滨江 在爬取过程中基本没有遇到什么坑,可能链家的反爬机制就没有吧 主要流程分成 两步: 第一步是 获取当前页面的内容 第 ...
- python建筑案例_Python数据分析实战-链家北京二手房价分析
前言 最近在自学Python,通过学习大家的分享案例,看到使用Python进行较多的主要4个方面:爬虫,数据处理,数据可视化以及机器学习建模.对我来说目标就是: 熟练使用numpy pandas 进行 ...
- python爬虫requests源码链家_python数据分析实例:python抓取链家二手房源数据和分析...
python语言,在数据分析方面,涵盖了"数据获取→数据处理→数据分析→数据可视化"这个流程中每个环节,不可不谓之为利器. 本篇文章我们就利用python语言在数据分析方面的应用, ...
- python爬取链家网实例——scrapy框架爬取-链家网的租房信息
说明: 本文适合scrapy框架的入门学习. 一.认识scrapy框架 开发python爬虫有很多种方式,从程序的复杂程度的角度来说,可以分为:爬虫项目和爬虫文件. scrapy更适合做爬虫项目,ur ...
最新文章
- Python元组字典
- 2017计算机基础教学大纲,2017级大学计算机基础教学大纲设计.doc
- .NET Core加解密实战系列之——消息摘要与数字签名算法
- 7-218 修理牧场 (25 分)
- Asp.Net数据控件遍历
- C++ 头文件包含顺序
- 电脑功耗监测_VOCS在线监测系统
- 百度网站诚信认证现在是个什么情况呢?
- idea 导出项目到eclipse
- python pandas按照行数切分文件
- 文件夹加密狗的加密原理与解密
- 某网站提供的免费香港虚拟主机测试
- 专访金榕:四年蜕变,阿里iDST是如何登上浪潮之巅的?
- Dolphinscheduler发邮件
- Java es should_@Es问题--should和must同时使用
- 史玉柱论民营企业的“13种死法”
- 关于飞机材料阻燃测试标准ABD 0031
- Python大作业之就诊卡管理信息系统[原创]
- 每日三个笑话-20151003
- [附源码]计算机毕业设计springboot驾校预约管理系统
热门文章
- solr使用 备忘录 草稿
- TypeScript 使用 infer 实现类型推断
- 二级域名指向同一ip的不同端口
- 创建动态的XML数据
- swift 函数类型+高阶函数
- C++ printf打印二进制,三进制,八进制,十六进制等
- ERP软件高效排产计划:如何解决企业排产难题
- 【Web】HTML中选择器的基本用法
- Golang 企业级web后端框架
- VUE发送POST请求自动附带本地地址