Table of Contents
- 1??獲取數據
- 2??數據基本處理
- 2.1??重復值和空值處理
- 2.2??數據轉換類型
- 2.2.1??面積數據類型轉換
- 2.2.2??戶型表達方式轉換
- 3??圖標分析
- 3.1??房源數量、 位置分布分析
- 3.2??戶型數量分析
- 3.3??平均租金分析
前言
原始數據請點擊
原始數據
import numpy
as np
import pandas
as pd
import matplotlib
.pyplot
as plt
import seaborn
as sns
from pylab
import mpl
mpl
.rcParams
["font.sans-serif"] = ["SimHei"]
獲取數據
file_data
= pd
.read_csv
("./data/鏈家北京租房數據.csv")
file_data
區域小區名稱戶型面積(㎡)價格(元/月)
0| 東城 | 萬國城MOMA | 1室0廳 | 59.11平米 | 10000 |
1| 東城 | 北官廳胡同2號院 | 3室0廳 | 56.92平米 | 6000 |
2| 東城 | 和平里三區 | 1室1廳 | 40.57平米 | 6900 |
3| 東城 | 菊兒胡同 | 2室1廳 | 57.09平米 | 8000 |
4| 東城 | 交道口北二條35號院 | 1室1廳 | 42.67平米 | 5500 |
...| ... | ... | ... | ... | ... |
8218| 順義 | 怡馨家園 | 3室1廳 | 114.03平米 | 5500 |
8219| 順義 | 旭輝26街區 | 4房間2衛 | 59平米 | 5000 |
8220| 順義 | 前進花園玉蘭苑 | 3室1廳 | 92.41平米 | 5800 |
8221| 順義 | 雙裕小區 | 2室1廳 | 71.81平米 | 4200 |
8222| 順義 | 櫻花園二區 | 1室1廳 | 35.43平米 | 2700 |
8223 rows × 5 columns
file_data
.describe
()
價格(元/月)
count| 8223.000000 |
mean| 9512.297823 |
std| 9186.752612 |
min| 566.000000 |
25%| 4800.000000 |
50%| 6800.000000 |
75%| 10000.000000 |
max| 150000.000000 |
數據基本處理
重復值和空值處理
file_data
= file_data
.drop_duplicates
()
file_data
.shape
(5773, 5)
file_data
= file_data
.dropna
()
file_data
.shape
(5773, 5)
數據轉換類型
面積數據類型轉換
file_data
.head
()
區域小區名稱戶型面積(㎡)價格(元/月)
0| 東城 | 萬國城MOMA | 1室0廳 | 59.11平米 | 10000 |
1| 東城 | 北官廳胡同2號院 | 3室0廳 | 56.92平米 | 6000 |
2| 東城 | 和平里三區 | 1室1廳 | 40.57平米 | 6900 |
3| 東城 | 菊兒胡同 | 2室1廳 | 57.09平米 | 8000 |
4| 東城 | 交道口北二條35號院 | 1室1廳 | 42.67平米 | 5500 |
file_data
["面積(㎡)"].values
[0][:-2]
'59.11'
data_new
= np
.array
([])data_area
= file_data
["面積(㎡)"].values
for i
in data_area
:data_new
= np
.append
(data_new
, np
.array
(i
[:-2]))
data_new
= data_new
.astype
(np
.float64
)
file_data
.loc
[:, "面積(㎡)"] = data_new
file_data
.head
()
區域小區名稱戶型面積(㎡)價格(元/月)
0| 東城 | 萬國城MOMA | 1室0廳 | 59.11 | 10000 |
1| 東城 | 北官廳胡同2號院 | 3室0廳 | 56.92 | 6000 |
2| 東城 | 和平里三區 | 1室1廳 | 40.57 | 6900 |
3| 東城 | 菊兒胡同 | 2室1廳 | 57.09 | 8000 |
4| 東城 | 交道口北二條35號院 | 1室1廳 | 42.67 | 5500 |
戶型表達方式轉換
house_data
= file_data
["戶型"]
temp_list
= []
for i
in house_data
:new_info
= i
.replace
("房間", "室")temp_list
.append
(new_info
)
file_data
.loc
[:, "戶型"] = temp_list
file_data
區域小區名稱戶型面積(㎡)價格(元/月)
0| 東城 | 萬國城MOMA | 1室0廳 | 59.11 | 10000 |
1| 東城 | 北官廳胡同2號院 | 3室0廳 | 56.92 | 6000 |
2| 東城 | 和平里三區 | 1室1廳 | 40.57 | 6900 |
3| 東城 | 菊兒胡同 | 2室1廳 | 57.09 | 8000 |
4| 東城 | 交道口北二條35號院 | 1室1廳 | 42.67 | 5500 |
...| ... | ... | ... | ... | ... |
8218| 順義 | 怡馨家園 | 3室1廳 | 114.03 | 5500 |
8219| 順義 | 旭輝26街區 | 4室2衛 | 59.00 | 5000 |
8220| 順義 | 前進花園玉蘭苑 | 3室1廳 | 92.41 | 5800 |
8221| 順義 | 雙裕小區 | 2室1廳 | 71.81 | 4200 |
8222| 順義 | 櫻花園二區 | 1室1廳 | 35.43 | 2700 |
5773 rows × 5 columns
圖標分析
房源數量、 位置分布分析
file_data
["區域"].unique
()
array(['東城', '豐臺', '亦莊開發區', '大興', '房山', '昌平', '朝陽', '海淀', '石景山', '西城','通州', '門頭溝', '順義'], dtype=object)
new_df
= pd
.DataFrame
({"區域":file_data
["區域"].unique
(),"數量":[0]*13})
new_df
區域數量
0| 東城 | 0 |
1| 豐臺 | 0 |
2| 亦莊開發區 | 0 |
3| 大興 | 0 |
4| 房山 | 0 |
5| 昌平 | 0 |
6| 朝陽 | 0 |
7| 海淀 | 0 |
8| 石景山 | 0 |
9| 西城 | 0 |
10| 通州 | 0 |
11| 門頭溝 | 0 |
12| 順義 | 0 |
area_count
= file_data
.groupby
(by
="區域").count
()
new_df
["數量"] = area_count
.values
戶型數量分析
house_data
= file_data
["戶型"]
house_data
.head
()
0 1室0廳
1 3室0廳
2 1室1廳
3 2室1廳
4 1室1廳
Name: 戶型, dtype: object
def all_house(arr
):"""統計戶型的數量"""key
= np
.unique
(arr
)result
= {}for k
in key
:mask
= (arr
== k
)arr_new
= arr
[mask
]v
= arr_new
.sizeresult
[k
] = v
return resulthouse_info
= all_house
(house_data
)
house_info
{'0室0廳': 1,'1室0衛': 10,'1室0廳': 244,'1室1衛': 126,'1室1廳': 844,'1室2廳': 13,'2室0衛': 1,'2室0廳': 23,'2室1衛': 120,'2室1廳': 2249,'2室2衛': 22,'2室2廳': 265,'2室3廳': 1,'3室0衛': 3,'3室0廳': 12,'3室1衛': 92,'3室1廳': 766,'3室2衛': 48,'3室2廳': 489,'3室3衛': 1,'3室3廳': 10,'4室1衛': 15,'4室1廳': 58,'4室2衛': 24,'4室2廳': 191,'4室3衛': 5,'4室3廳': 9,'4室5廳': 2,'5室0衛': 1,'5室0廳': 1,'5室1衛': 3,'5室1廳': 7,'5室2衛': 7,'5室2廳': 49,'5室3衛': 3,'5室3廳': 24,'5室4廳': 1,'5室5廳': 1,'6室0廳': 1,'6室1衛': 1,'6室1廳': 1,'6室2廳': 5,'6室3衛': 2,'6室3廳': 6,'6室4衛': 2,'7室1廳': 1,'7室2廳': 2,'7室3廳': 3,'7室4廳': 1,'8室4廳': 2,'9室1廳': 2,'9室2廳': 1,'9室5廳': 2}
house_data
= dict((key
, value
) for key
, value
in house_info
.items
() if value
> 50)
show_houses
= pd
.DataFrame
({"戶型": [x
for x
in house_data
.keys
()],"數量": [x
for x
in house_data
.values
()]})
show_houses
戶型數量
0| 1室0廳 | 244 |
1| 1室1衛 | 126 |
2| 1室1廳 | 844 |
3| 2室1衛 | 120 |
4| 2室1廳 | 2249 |
5| 2室2廳 | 265 |
6| 3室1衛 | 92 |
7| 3室1廳 | 766 |
8| 3室2廳 | 489 |
9| 4室1廳 | 58 |
10| 4室2廳 | 191 |
house_type
= show_houses
["戶型"]
house_type_num
= show_houses
["數量"]plt
.barh
(range(11), house_type_num
)plt
.yticks
(range(11), house_type
)
plt
.xlim
(0, 2500)plt
.title
("北京市各區域租房數量統計")
plt
.xlabel
("數量")
plt
.ylabel
("房屋類型")
for x
, y
in enumerate(house_type_num
):plt
.text
(y
+0.5, x
-0.2, "%s" %y
)plt
.show
()
平均租金分析
df_all
= pd
.DataFrame
({"區域": file_data
["區域"].unique
(),"房租總金額": [0]*13,"總面積": [0]*13})
df_all
.head
()
區域房租總金額總面積
0| 東城 | 0 | 0 |
1| 豐臺 | 0 | 0 |
2| 亦莊開發區 | 0 | 0 |
3| 大興 | 0 | 0 |
4| 房山 | 0 | 0 |
sum_price
= file_data
["價格(元/月)"].groupby
(file_data
["區域"]).sum()
sum_area
= file_data
["面積(㎡)"].groupby
(file_data
["區域"]).sum()
df_all
["房租總金額"] = sum_price
.values
df_all
["總面積"] = sum_area
.values
df_all
區域房租總金額總面積
0| 東城 | 3945550 | 27353.99 |
1| 豐臺 | 4404893 | 50922.79 |
2| 亦莊開發區 | 1318400 | 15995.53 |
3| 大興 | 2286950 | 35884.15 |
4| 房山 | 726750 | 15275.41 |
5| 昌平 | 2521515 | 35972.92 |
6| 朝陽 | 20281396 | 166921.72 |
7| 海淀 | 7279350 | 57210.39 |
8| 石景山 | 1156500 | 13956.67 |
9| 西城 | 5636975 | 37141.64 |
10| 通州 | 2719600 | 46625.23 |
11| 門頭溝 | 1048300 | 20258.20 |
12| 順義 | 2190900 | 33668.97 |
df_all
["每平米租金(元)"] = round(df_all
["房租總金額"] / df_all
["總面積"], 2)
df_all
區域房租總金額總面積每平米租金(元)
0| 東城 | 3945550 | 27353.99 | 144.24 |
1| 豐臺 | 4404893 | 50922.79 | 86.50 |
2| 亦莊開發區 | 1318400 | 15995.53 | 82.42 |
3| 大興 | 2286950 | 35884.15 | 63.73 |
4| 房山 | 726750 | 15275.41 | 47.58 |
5| 昌平 | 2521515 | 35972.92 | 70.09 |
6| 朝陽 | 20281396 | 166921.72 | 121.50 |
7| 海淀 | 7279350 | 57210.39 | 127.24 |
8| 石景山 | 1156500 | 13956.67 | 82.86 |
9| 西城 | 5636975 | 37141.64 | 151.77 |
10| 通州 | 2719600 | 46625.23 | 58.33 |
11| 門頭溝 | 1048300 | 20258.20 | 51.75 |
12| 順義 | 2190900 | 33668.97 | 65.07 |
df_merge
= pd
.merge
(new_df
, df_all
)
df_merge
.sort_values
(by
="每平米租金(元)", ascending
=False)
區域數量房租總金額總面積每平米租金(元)
9| 西城 | 442 | 5636975 | 37141.64 | 151.77 |
0| 東城 | 282 | 3945550 | 27353.99 | 144.24 |
7| 海淀 | 605 | 7279350 | 57210.39 | 127.24 |
6| 朝陽 | 1597 | 20281396 | 166921.72 | 121.50 |
1| 豐臺 | 577 | 4404893 | 50922.79 | 86.50 |
8| 石景山 | 175 | 1156500 | 13956.67 | 82.86 |
2| 亦莊開發區 | 147 | 1318400 | 15995.53 | 82.42 |
5| 昌平 | 347 | 2521515 | 35972.92 | 70.09 |
12| 順義 | 297 | 2190900 | 33668.97 | 65.07 |
3| 大興 | 362 | 2286950 | 35884.15 | 63.73 |
10| 通州 | 477 | 2719600 | 46625.23 | 58.33 |
11| 門頭溝 | 285 | 1048300 | 20258.20 | 51.75 |
4| 房山 | 180 | 726750 | 15275.41 | 47.58 |
num
= df_merge
["數量"]
price
= df_merge
["每平米租金(元)"]
lx
= df_merge
["區域"]
l
= [i
for i
in range(13)]
fig
= plt
.figure
(figsize
=(10, 8), 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.2, _y
, price
[i
]) ax1
.set_ylim
([0, 160])
ax1
.set_ylabel
("價格")
plt
.legend
(loc
="upper right")
ax2
= ax1
.twinx
()
plt
.bar
(l
, num
, label
="數量", alpha
=0.2, color
="green")
ax2
.set_ylabel
("數量")
plt
.legend
(loc
="upper left")
plt
.xticks
(l
, lx
)plt
.show
()
print('房屋最大面積是%d平米'%(file_data
['面積(㎡)'].max()))
print('房屋最小面積是%d平米'%(file_data
['面積(㎡)'].min()))
print('房租最高價格為每月%d元'%(file_data
['價格(元/月)'].max()))
print('房屋最低價格為每月%d元'%(file_data
['價格(元/月)'].min()))
房屋最大面積是1133平米
房屋最小面積是11平米
房租最高價格為每月150000元
房屋最低價格為每月566元
area_divide
= [1, 30, 50, 70, 90, 120, 140, 160, 1200]
area_cut
= pd
.cut
(list(file_data
["面積(㎡)"]), area_divide
)
area_cut_num
= area_cut
.describe
()
area_cut_num
countsfreqs
categories
(1, 30]| 41 | 0.007102 |
(30, 50]| 710 | 0.122986 |
(50, 70]| 1566 | 0.271263 |
(70, 90]| 1094 | 0.189503 |
(90, 120]| 1082 | 0.187424 |
(120, 140]| 381 | 0.065997 |
(140, 160]| 274 | 0.047462 |
(160, 1200]| 625 | 0.108263 |
area_per
= (area_cut_num
["freqs"].values
)*100labels
= ['30平米以下', '30-50平米', '50-70平米', '70-90平米',
'90-120平米','120-140平米','140-160平米','160平米以上']plt
.figure
(figsize
=(15, 8), dpi
=100)plt
.pie
(x
=area_per
, labels
=labels
, autopct
="%.2f %%")plt
.legend
()
plt
.show
()
import numpy
as np
import pandas
as pd
import matplotlib
.pyplot
as plt
import seaborn
as sns
from pylab
import mpl
mpl
.rcParams
["font.sans-serif"] = ["SimHei"]file_data
= pd
.read_csv
("")
file_data
file_data
.describe
()
file_data
= file_data
.drop_duplicates
()
file_data
.shape
file_data
= file_data
.dropna
()
file_data
.shapefile_data
.head
()
file_data
["面積(㎡)"].values
[0][:-2]
data_new
= np
.array
([])data_area
= file_data
["面積(㎡)"].values
for i
in data_area
:data_new
= np
.append
(data_new
, np
.array
(i
[:-2]))
data_new
= data_new
.astype
(np
.float64
)
file_data
.loc
[:, "面積(㎡)"] = data_new
file_data
.head
()
house_data
= file_data
["戶型"]
temp_list
= []
for i
in house_data
:new_info
= i
.replace
("房間", "室")temp_list
.append
(new_info
)
file_data
.loc
[:, "戶型"] = temp_list
file_data
file_data
["區域"].unique
()new_df
= pd
.DataFrame
({"區域":file_data
["區域"].unique
(),"數量":[0]*13})
new_df
area_count
= file_data
.groupby
(by
="區域").count
()
new_df
["數量"] = area_count
.valueshouse_data
= file_data
["戶型"]
house_data
.head
()def all_house(arr
):"""統計戶型的數量"""key
= np
.unique
(arr
)result
= {}for k
in key
:mask
= (arr
== k
)arr_new
= arr
[mask
]v
= arr_new
.sizeresult
[k
] = v
return resulthouse_info
= all_house
(house_data
)
house_info
house_data
= dict((key
, value
) for key
, value
in house_info
.items
() if value
> 50)show_houses
= pd
.DataFrame
({"戶型": [x
for x
in house_data
.keys
()],"數量": [x
for x
in house_data
.values
()]})
show_houseshouse_type
= show_houses
["戶型"]
house_type_num
= show_houses
["數量"]plt
.barh
(range(11), house_type_num
)plt
.yticks
(range(11), house_type
)
plt
.xlim
(0, 2500)plt
.title
("北京市各區域租房數量統計")
plt
.xlabel
("數量")
plt
.ylabel
("房屋類型")
for x
, y
in enumerate(house_type_num
):plt
.text
(y
+0.5, x
-0.2, "%s" %y
)plt
.show
()df_all
= pd
.DataFrame
({"區域": file_data
["區域"].unique
(),"房租總金額": [0]*13,"總面積": [0]*13})
df_all
.head
()
sum_price
= file_data
["價格(元/月)"].groupby
(file_data
["區域"]).sum()
sum_area
= file_data
["面積(㎡)"].groupby
(file_data
["區域"]).sum()
df_all
["房租總金額"] = sum_price
.values
df_all
["總面積"] = sum_area
.values
df_all
df_all
["每平米租金(元)"] = round(df_all
["房租總金額"] / df_all
["總面積"], 2)
df_all
df_merge
= pd
.merge
(new_df
, df_all
)
df_merge
.sort_values
(by
="每平米租金(元)", ascending
=False)num
= df_merge
["數量"]
price
= df_merge
["每平米租金(元)"]
lx
= df_merge
["區域"]
l
= [i
for i
in range(13)]
fig
= plt
.figure
(figsize
=(10, 8), 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.2, _y
, price
[i
]) ax1
.set_ylim
([0, 160])
ax1
.set_ylabel
("價格")
plt
.legend
(loc
="upper right")
ax2
= ax1
.twinx
()
plt
.bar
(l
, num
, label
="數量", alpha
=0.2, color
="green")
ax2
.set_ylabel
("數量")
plt
.legend
(loc
="upper left")
plt
.xticks
(l
, lx
)plt
.show
()
print('房屋最大面積是%d平米'%(file_data
['面積(㎡)'].max()))
print('房屋最小面積是%d平米'%(file_data
['面積(㎡)'].min()))
print('房租最高價格為每月%d元'%(file_data
['價格(元/月)'].max()))
print('房屋最低價格為每月%d元'%(file_data
['價格(元/月)'].min()))
area_divide
= [1, 30, 50, 70, 90, 120, 140, 160, 1200]
area_cut
= pd
.cut
(list(file_data
["面積(㎡)"]), area_divide
)
area_cut_num
= area_cut
.describe
()
area_cut_num
area_per
= (area_cut_num
["freqs"].values
)*100labels
= ['30平米以下', '30-50平米', '50-70平米', '70-90平米',
'90-120平米','120-140平米','140-160平米','160平米以上']plt
.figure
(figsize
=(15, 8), dpi
=100)plt
.pie
(x
=area_per
, labels
=labels
, autopct
="%.2f %%")plt
.legend
()
plt
.show
()
總結
以上是生活随笔為你收集整理的综合案例 -- 北京租房数据统计分析的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。