生活随笔
收集整理的這篇文章主要介紹了
python数据分析项目实战—————链家北京租房数据统计分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
鏈家北京租房數據分析
1、讀取數據
import pandas
as pd
import matplotlib
.pyplot
as plt
import numpy
as npdata_dframe
= pd
.read_csv
('鏈家北京租房數據.csv',header
=0,encoding
='gbk')
data_dframe
區域小區名稱戶型面積(㎡)價格(元/月)
| 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
2、數據預處理
2.1 刪除數據中的重復值和缺失值
data_dframe
= data_dframe
.dropna
()
data_dframe
= data_dframe
.drop_duplicates
()
data_dframe
區域小區名稱戶型面積(㎡)價格(元/月)
| 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 |
5773 rows × 5 columns
我們可以看到,現在的數據中,戶型那一列不太規范,有4房間2衛、3室1廳這種,我們統一改成“x室x廳”格式
2.2 將“戶型”一列統一調整為“x室x廳”格式
housetype
=data_dframe
['戶型']
htlist
=[]
for i
in housetype
:new_info
=i
.replace
('房間','室')htlist
.append
(new_info
)
data_dframe
.loc
[:,'戶型']=htlist
htlist
=[]
for i
in housetype
:new_info
=i
.replace
('衛','廳')htlist
.append
(new_info
)
data_dframe
.loc
[:,'戶型']=htlist
data_dframe
data_dframe
['戶型'] = data_dframe
['戶型'].str.replace
('房間','室')
data_dframe
['戶型'] = data_dframe
['戶型'].str.replace
('衛','廳')
data_dframe
區域小區名稱戶型面積(㎡)價格(元/月)
| 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 |
5773 rows × 5 columns
2.3 將“面積”一列調整為數值格式
data_dframe
['面積(㎡)'] = data_dframe
['面積(㎡)'].str.replace
('平米',' ')
data_dframe
['面積(㎡)'] = data_dframe
['面積(㎡)'].astype
(dtype
='float64')
data_dframe
hsarr
= np
.array
([])
housesize
= data_dframe
['面積(㎡)'].values
for i
in housesize
:hsarr
= np
.append
(hsarr
,np
.array
(i
[:-2]))
housesize
= hsarr
.astype
(np
.float64
)
data_dframe
.loc
[:,'面積(㎡)'] = housesize
data_dframe
區域小區名稱戶型面積(㎡)價格(元/月)
| 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 |
5773 rows × 5 columns
2.4 使用箱形圖檢查“面積”和“價格”列中是否存在異常數據
plt
.rcParams
['font.sans-serif']=['SimHei']
plt
.figure
().canvas
.set_window_title
('面積、價格箱形圖')
plt
.tick_params
()
da
.boxplot
(column
= ['面積(㎡)', '價格(元/月)'])
plt
.show
()
3、統計分析
3.1 使用“區域”和“小區名稱”新增“位置”一列,形如“北京市xx區xx”
data_dframe
['位置'] = '北京市' + data_dframe
['區域'] + '區' +data_dframe
['小區名稱']
3.2 對“戶型”、“面積”和“價格”以及每平米價格等信息進行簡要的統計分析,如每平米價格的最大值、最小值、平均值,“面積”的分箱區間統計,“戶型”的種類統計等
data_dframe
['價格(元/㎡)'] = data_dframe
['價格(元/月)']/data_dframe
['面積(㎡)']
print(round(data_dframe
.loc
[:,'價格(元/㎡)'].mean
(),2))
print(round(data_dframe
.loc
[:,'價格(元/㎡)'].max(),2))
print(round(data_dframe
.loc
[:,'價格(元/㎡)'].min(),2))
area_divide
= [0,50,100,150,200,250,9999]
area_cut_data
= pd
.cut
(list(data_dframe
['面積(㎡)']), area_divide
).describe
()
area_cut_data
categories(類別)counts(數量)freqs(頻率)
| (0, 50] | 751 | 0.130088 |
| (50, 100] | 3218 | 0.557422 |
| (100, 150] | 1070 | 0.185346 |
| (150, 200] | 408 | 0.070674 |
| (200, 250] | 176 | 0.030487 |
| (250, 9999] | 150 | 0.025983 |
df_grouped_HuXing
= data_dframe
.groupby
('戶型')
for i
,j
in df_grouped_HuXing
:print(i
,end
=' ')
4、分組分析
4.1 按照具體戶型(如3室2廳)或戶型中的室(如3室)進行分組,統計每種戶型的數量、最高/最低/平均租價等信息
new_df
= dframe2
new_df
['戶型'] = new_df
['戶型'].str.replace
('室[0-9]廳','')
df_grouped_Hx
= new_df
.groupby
('戶型')
new_list
= []
for i
,j
in df_grouped_Hx
:new_list
.append
(i
+ '室')
new_info_list
= [0]*len(new_list
)
new_df_Hx
= pd
.DataFrame
({'戶型':new_list
,'戶型數量':new_info_list
,'最高租價':new_info_list
,'最低租價':new_info_list
,'平均租價':new_info_list
})
new_df_Hx
['戶型數量'] = df_grouped_Hx
.count
().values
new_df_Hx
['最高租價'] = df_grouped_Hx
['價格(元/月)'].max().values
new_df_Hx
['最低租價'] = df_grouped_Hx
['價格(元/月)'].min().values
new_df_Hx
['平均租價'] = df_grouped_Hx
['價格(元/月)'].mean
().values
new_df_Hx
['平均租價'] = round(new_df_Hx
['平均租價'],2)
new_df_Hx
戶型戶型數量最高租價最低租價平均租價
| 0 | 0室 | 1 | 566 | 566 | 566.00 |
| 1 | 1室 | 1237 | 81000 | 900 | 6536.99 |
| 2 | 2室 | 2681 | 60000 | 2100 | 7138.85 |
| 3 | 3室 | 1421 | 85000 | 2400 | 12047.22 |
| 4 | 4室 | 304 | 120000 | 3300 | 22511.84 |
| 5 | 5室 | 97 | 150000 | 5000 | 30685.57 |
| 6 | 6室 | 18 | 90000 | 13000 | 36472.22 |
| 7 | 7室 | 7 | 108000 | 15000 | 45328.57 |
| 8 | 8室 | 2 | 126000 | 30000 | 78000.00 |
| 9 | 9室 | 5 | 60000 | 22000 | 44400.00 |
4.2 按照區域(如海淀)進行分組,統計房源數量、最高/最低/平均租價等信息
df_grouped_area
= dframe
.groupby
('區域')
area_list
=[]
for i
,j
in df_grouped_area
:area_list
.append
(i
)
area_info_list
= [0] * len(area_list
)
new_df_area
= pd
.DataFrame
({'區域':area_list
,'房源數量':area_info_list
,'最高租價':area_info_list
,'最低租價':area_info_list
,'平均租價':area_info_list
})
new_df_area
['房源數量'] = df_grouped_area
.count
().values
new_df_area
['最高租價'] = df_grouped_area
['價格(元/月)'].max().values
new_df_area
['最低租價'] = df_grouped_area
['價格(元/月)'].min().values
new_df_area
['平均租價'] = df_grouped_area
['價格(元/月)'].mean
().values
new_df_area
['平均租價'] = round(new_df_area
['平均租價'],2)
new_df_area
區域房源數量最高租價最低租價平均租價
| 0 | 東城 | 412 | 60000 | 3000 | 13825.36 |
| 1 | 豐臺 | 855 | 95000 | 2000 | 7394.03 |
| 2 | 亦莊開發區 | 213 | 45000 | 3000 | 8773.24 |
| 3 | 大興 | 246 | 30000 | 2100 | 4038.42 |
| 4 | 房山 | 246 | 30000 | 2100 | 4038.42 |
| 5 | 昌平 | 503 | 48000 | 566 | 7060.60 |
| 6 | 朝陽 | 2360 | 150000 | 2500 | 12515.33 |
| 7 | 海淀 | 780 | 126000 | 2500 | 11514.81 |
| 8 | 石景山 | 245 | 20000 | 2500 | 6570.41 |
| 9 | 西城 | 604 | 104000 | 3000 | 13229.26 |
| 10 | 通州 | 676 | 30000 | 2300 | 5776.78 |
| 11 | 門頭溝 | 392 | 10000 | 1750 | 3657.53 |
| 12 | 順義 | 419 | 60000 | 2200 | 7287.83 |
5、數據可視化
5.1 將“戶型”按x室繪制為餅圖
plt
.rcParams
['font.sans-serif'] = ['SimHei']
plt
.rcParams
['axes.unicode_minus'] = False
plt
.pie
(new_df_Hx
['戶型數量'],labels
=new_df_Hx
['戶型'],autopct
='%1.1f%%',shadow
=False,startangle
=90)
plt
.legend
()
plt
.show
()
5.2 將“面積”按不同的區間繪制為餅圖
area_percentage
= (area_cut_data
['freqs'].values
) * 100
area_labels
= ['50平方米以下','50-100平方米','100-150平方米','150-200平方米','200-250平方米','250平方米以上']
plt
.figure
(figsize
= fig_size
).canvas
.set_window_title
('面積')
plt
.axes
(aspect
= 1)
plt
.pie
(x
= area_percentage
, labels
= area_labels
, autopct
= '%1.1f %%',labeldistance
= 1.1, startangle
= 90, pctdistance
= 0.7)
plt
.legend
()
plt
.show
()
5.3 將“價格”按不同的區間繪制為餅圖
price_divide
= [2000,3000,4000,5000,6000,7000,8000,9000,10000,13000,150000]
price_cut_data
= pd
.cut
(list(dframe2
['價格(元/月)']), price_divide
).describe
()
price_percentage
= (price_cut_data
['freqs'].values
) * 100
price_labels
= ['2000元/月以下','2000-3000元/月', '3000-4000元/月', '4000-5000元/月','5000-6000元/月', '6000-7000元/月', '7000-8000元/月','8000-9000元/月', '9000-10000元/月', '10,000-13,0000元/月','13,000-15,0000元/月']
plt
.figure
(figsize
=fig_size
).canvas
.set_window_title
('價格')
plt
.axes
(aspect
= 1)
plt
.pie
(x
=price_percentage
, labels
=price_labels
, autopct
='%1.1f %%',labeldistance
=1.1, startangle
=90, pctdistance
=0.7)
plt
.legend
()
plt
.show
()
5.4 使用條形圖、折線圖等形式繪制“戶型”(按室,如3室)和區域(如海淀)分組的房源數量和平均租金信息
x_Hx
= new_df_Hx
['戶型']
y1_Hx
= new_df_Hx
['戶型數量']
y2_Hx
= new_df_Hx
['平均租價']
fig_Hx
,ax1_Hx
= plt
.subplots
()
ax2_Hx
= ax1_Hx
.twinx
()
ax1_Hx
.plot
(x_Hx
,y1_Hx
,color
='blue')
ax2_Hx
.plot
(x_Hx
,y2_Hx
,color
='red')
ax1_Hx
.set_xlabel
('戶型種類')
ax1_Hx
.set_ylabel
('戶型數量',color
='blue')
ax2_Hx
.set_ylabel
('平均租價',color
='red')
plt
.show
()
x_area
= new_df_area
['區域']
y1_area
= new_df_area
['房源數量']
y2_area
= new_df_area
['平均租價']
fig_area
,ax1_area
= plt
.subplots
()
ax2_area
= ax1_area
.twinx
()
ax1_area
.plot
(x_area
,y1_area
,color
='blue')
ax2_area
.plot
(x_area
,y2_area
,color
='red')
ax1_area
.set_xlabel
('區域')
ax1_area
.set_ylabel
('房源數量',color
='blue')
ax2_area
.set_ylabel
('平均租價',color
='red')
plt
.show
()
總結
以上是生活随笔為你收集整理的python数据分析项目实战—————链家北京租房数据统计分析的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。