Table of Contents
前言
原始数据请点击
原始数据
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.size
result[k] = v
return result
house_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
| counts | freqs |
---|
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)*100
labels = ['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.shape
file_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.values
house_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.size
result[k] = v
return result
house_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_houses
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()
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)*100
labels = ['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()