06-01 实战项目1之分析链家房源信息

_____egon新书python全套来袭请看:https://egonlin.com/book.html

获取数据

链接:https://pan.baidu.com/s/1E8akk1gX9zppCViOQLDiUQ  密码:f66q

导入模块

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib as mpl

import matplotlib.pyplot as plt
from IPython.display import display

plt.style.use('fivethirtyeight')
sns.set_style({'font.sans-serif':['simhei','Arial']})
%matplotlib inline

数据规整

lj_df = pd.read_csv('E:\\Test\\DataAnalysis\\lianjia\\lianjia.csv')
display(lj_df.head())
Direction District Elevator Floor Garden Id Layout Price Region Renovation Size Year
0 东西 灯市口 NaN 6 锡拉胡同21号院 101102647043 3室1厅 780.0 东城 精装 75.0 1988
1 南北 东单 无电梯 6 东华门大街 101102650978 2室1厅 705.0 东城 精装 60.0 1988
2 南西 崇文门 有电梯 16 新世界中心 101102672743 3室1厅 1400.0 东城 其他 210.0 1996
3 崇文门 NaN 7 兴隆都市馨园 101102577410 1室1厅 420.0 东城 精装 39.0 2004
4 陶然亭 有电梯 19 中海紫御公馆 101102574696 2室2厅 998.0 东城 精装 90.0 2010
# 获取所有数据列信息
lj_df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 23677 entries, 0 to 23676
Data columns (total 12 columns):
Direction     23677 non-null object
District      23677 non-null object
Elevator      15440 non-null object
Floor         23677 non-null int64
Garden        23677 non-null object
Id            23677 non-null int64
Layout        23677 non-null object
Price         23677 non-null float64
Region        23677 non-null object
Renovation    23677 non-null object
Size          23677 non-null float64
Year          23677 non-null int64
dtypes: float64(2), int64(3), object(7)
memory usage: 2.2+ MB
df = lj_df.copy()
df
Direction District Elevator Floor Garden Id Layout Price Region Renovation Size Year
0 东西 灯市口 NaN 6 锡拉胡同21号院 101102647043 3室1厅 780.0 东城 精装 75.0 1988
1 南北 东单 无电梯 6 东华门大街 101102650978 2室1厅 705.0 东城 精装 60.0 1988
2 南西 崇文门 有电梯 16 新世界中心 101102672743 3室1厅 1400.0 东城 其他 210.0 1996
3 崇文门 NaN 7 兴隆都市馨园 101102577410 1室1厅 420.0 东城 精装 39.0 2004
4 陶然亭 有电梯 19 中海紫御公馆 101102574696 2室2厅 998.0 东城 精装 90.0 2010
5 南北 广渠门 有电梯 18 幸福家园二期 101102407993 2室1厅 1180.0 东城 其他 111.0 2003
6 西罗园 无电梯 6 西革新里110号院 101102629841 1室1厅 319.0 东城 其他 42.0 1992
7 西罗园 有电梯 16 建予园 101102378003 2室1厅 640.0 东城 其他 105.0 1999
8 南北 东花市 有电梯 9 富贵园一区 101102345859 3室2厅 1780.0 东城 精装 161.0 2003
9 东北 东直门 有电梯 25 万国城MOMA 101102070529 2室2厅 1300.0 东城 精装 127.0 2002
10 工体 无电梯 5 十字坡东里 101102599410 1室1厅 405.0 东城 精装 37.0 1986
11 地安门 无电梯 5 帽儿胡同45号院 101102516190 2室1厅 700.0 东城 其他 50.0 1985
12 西 广渠门 有电梯 19 金桥国际 101102620368 1室1厅 462.0 东城 精装 54.0 2004
13 西 崇文门 有电梯 18 太华公寓 101102624056 1室0厅 518.0 东城 精装 64.0 2000
14 西南 菜户营 有电梯 23 信德园 101102691675 3室1厅 960.0 西城 其他 146.0 2002
15 木樨地 无电梯 4 西便门外大街 101102653830 2室0厅 457.0 西城 简装 50.0 1957
16 西北 马甸 NaN 18 双旗杆东里 101102570446 2室1厅 610.0 西城 简装 58.0 1986
17 马连道 有电梯 18 第三区 101102583180 2房间2卫 340.0 西城 精装 33.0 2011
18 西南 六铺炕 有电梯 17 六铺炕二区 101102306094 3室1厅 1120.0 西城 其他 78.0 1990
19 广安门 有电梯 26 荣丰2008 101101718499 1室0厅 320.0 西城 精装 28.0 2006
20 南北 牛街 有电梯 12 平原里小区 101102532889 2室1厅 596.0 西城 简装 59.0 1999
21 南北 木樨地 有电梯 18 真武庙六里 101102454060 2室1厅 888.0 西城 精装 78.0 1988
22 西北 右安门内 无电梯 7 右安门内大街 101102089935 1室1厅 405.0 西城 其他 45.0 1991
23 南北 西直门 无电梯 6 玉桃园二区 101102528745 2室1厅 650.0 西城 简装 60.0 1997
24 南北 马连道 无电梯 7 红莲南里 101102625441 2室1厅 470.0 西城 精装 61.0 1992
25 牛街 NaN 6 白广路6号院 101102562685 3室0厅 635.0 西城 简装 84.0 1955
26 西 亚运村小营 有电梯 7 育慧里一区 101102161792 1室0厅 343.0 朝阳 精装 52.0 2001
27 南北 望京 有电梯 10 大西洋新城A区 101102387406 2室2厅 835.0 朝阳 精装 86.0 1999
28 东西 团结湖 无电梯 6 团结湖路 101102395918 2室1厅 430.0 朝阳 精装 65.0 1980
29 南北 三元桥 有电梯 12 尚家楼48号院 101102691041 2室1厅 610.0 朝阳 精装 75.0 1998
... ... ... ... ... ... ... ... ... ... ... ... ...
23647 东南 和平里 NaN 6 和平里七区 101102564044 2室1厅 650.0 东城 精装 69.0 1995
23648 东西 工体 NaN 6 工体北里 101102547276 2室1厅 490.0 东城 毛坯 54.0 1984
23649 东南北 安贞 NaN 12 小黄庄二区 101102726945 4室1厅 1300.0 东城 简装 122.0 1996
23650 西 广渠门 NaN 29 广渠家园 101102653969 1室1厅 435.0 东城 精装 51.0 2009
23651 西南 和平里 无电梯 6 和平里七区 101102686119 2室1厅 540.0 东城 简装 56.0 1989
23652 南北 东直门 NaN 6 北官厅胡同2号院 101102669476 2室1厅 650.0 东城 精装 59.0 1985
23653 东南 朝阳门内 NaN 6 仓南胡同 101102422853 2室1厅 938.0 东城 简装 71.0 2003
23654 安定门 NaN 11 鼓楼外大街52号 101102492879 2室1厅 685.0 东城 简装 62.0 1992
23655 南北 崇文门 NaN 12 新裕家园 101102454084 3室1厅 1293.0 东城 精装 125.0 2004
23656 东西 崇文门 NaN 16 新景家园西区 101102532627 3室1厅 870.0 东城 精装 91.0 2004
23657 南西北 金宝街 NaN 5 史家胡同20号院 101102587502 2室0厅 686.0 东城 精装 46.0 1980
23658 工体 NaN 9 春秀路 101102587082 2室1厅 572.0 东城 简装 59.0 1998
23659 东西 朝阳门内 NaN 16 西水井胡同 101102328585 2室1厅 699.0 东城 简装 74.0 2003
23660 南北 东直门 NaN 14 民安小区东羊管胡同 101102328701 2室1厅 760.0 东城 精装 73.0 2002
23661 左安门 NaN 15 左安漪园 101102716957 3室1厅 950.0 东城 精装 113.0 2004
23662 南北 和平里 NaN 6 和平里九区 101102724566 3室1厅 670.0 东城 简装 67.0 1990
23663 西 和平里 NaN 20 和平里二区 101102668742 2室1厅 800.0 东城 精装 79.0 2006
23664 西南 和平里 NaN 6 和平里三区 101102647453 1室1厅 430.0 东城 简装 40.0 1996
23665 东北 永定门 NaN 6 定安里 101102729923 3室1厅 419.0 东城 精装 64.0 1984
23666 西北 陶然亭 有电梯 23 中海紫御公馆 101102184767 2室1厅 599.0 东城 简装 63.0 2010
23667 南北 永定门 NaN 6 定安里 101102724425 2室1厅 365.0 东城 精装 55.0 1984
23668 南北 东直门 NaN 6 海运仓小区 101102575113 3室1厅 950.0 东城 简装 82.0 2003
23669 西南 广渠门 NaN 22 京禧阁 101102509047 2室1厅 1050.0 东城 精装 119.0 2013
23670 南北 交道口 NaN 6 土儿胡同 101102411691 2室1厅 880.0 东城 简装 69.0 2002
23671 南北 和平里 NaN 5 甘水桥 101102292212 3室1厅 565.0 东城 简装 56.0 1983
23672 南北 广渠门 NaN 16 保利蔷薇 101102296423 2室1厅 1010.0 东城 简装 97.0 2008
23673 南北 永定门 NaN 6 郭庄北里 101102593534 2室1厅 468.0 东城 简装 66.0 1995
23674 南北 和平里 NaN 6 康鸿家园 101102549465 3室2厅 1400.0 东城 简装 155.0 2000
23675 南北 前门 NaN 6 台基厂头条10号院 101102322422 4室1厅 1100.0 东城 简装 107.0 1990
23676 南北 崇文门 NaN 15 新景家园东区 101102657079 1室1厅 790.0 东城 精装 81.0 2008

23677 rows × 12 columns

df['PerPrice'] = lj_df['Price']/lj_df['Size']
df
Direction District Elevator Floor Garden Id Layout Price Region Renovation Size Year PerPrice
0 东西 灯市口 NaN 6 锡拉胡同21号院 101102647043 3室1厅 780.0 东城 精装 75.0 1988 10.400000
1 南北 东单 无电梯 6 东华门大街 101102650978 2室1厅 705.0 东城 精装 60.0 1988 11.750000
2 南西 崇文门 有电梯 16 新世界中心 101102672743 3室1厅 1400.0 东城 其他 210.0 1996 6.666667
3 崇文门 NaN 7 兴隆都市馨园 101102577410 1室1厅 420.0 东城 精装 39.0 2004 10.769231
4 陶然亭 有电梯 19 中海紫御公馆 101102574696 2室2厅 998.0 东城 精装 90.0 2010 11.088889
5 南北 广渠门 有电梯 18 幸福家园二期 101102407993 2室1厅 1180.0 东城 其他 111.0 2003 10.630631
6 西罗园 无电梯 6 西革新里110号院 101102629841 1室1厅 319.0 东城 其他 42.0 1992 7.595238
7 西罗园 有电梯 16 建予园 101102378003 2室1厅 640.0 东城 其他 105.0 1999 6.095238
8 南北 东花市 有电梯 9 富贵园一区 101102345859 3室2厅 1780.0 东城 精装 161.0 2003 11.055901
9 东北 东直门 有电梯 25 万国城MOMA 101102070529 2室2厅 1300.0 东城 精装 127.0 2002 10.236220
10 工体 无电梯 5 十字坡东里 101102599410 1室1厅 405.0 东城 精装 37.0 1986 10.945946
11 地安门 无电梯 5 帽儿胡同45号院 101102516190 2室1厅 700.0 东城 其他 50.0 1985 14.000000
12 西 广渠门 有电梯 19 金桥国际 101102620368 1室1厅 462.0 东城 精装 54.0 2004 8.555556
13 西 崇文门 有电梯 18 太华公寓 101102624056 1室0厅 518.0 东城 精装 64.0 2000 8.093750
14 西南 菜户营 有电梯 23 信德园 101102691675 3室1厅 960.0 西城 其他 146.0 2002 6.575342
15 木樨地 无电梯 4 西便门外大街 101102653830 2室0厅 457.0 西城 简装 50.0 1957 9.140000
16 西北 马甸 NaN 18 双旗杆东里 101102570446 2室1厅 610.0 西城 简装 58.0 1986 10.517241
17 马连道 有电梯 18 第三区 101102583180 2房间2卫 340.0 西城 精装 33.0 2011 10.303030
18 西南 六铺炕 有电梯 17 六铺炕二区 101102306094 3室1厅 1120.0 西城 其他 78.0 1990 14.358974
19 广安门 有电梯 26 荣丰2008 101101718499 1室0厅 320.0 西城 精装 28.0 2006 11.428571
20 南北 牛街 有电梯 12 平原里小区 101102532889 2室1厅 596.0 西城 简装 59.0 1999 10.101695
21 南北 木樨地 有电梯 18 真武庙六里 101102454060 2室1厅 888.0 西城 精装 78.0 1988 11.384615
22 西北 右安门内 无电梯 7 右安门内大街 101102089935 1室1厅 405.0 西城 其他 45.0 1991 9.000000
23 南北 西直门 无电梯 6 玉桃园二区 101102528745 2室1厅 650.0 西城 简装 60.0 1997 10.833333
24 南北 马连道 无电梯 7 红莲南里 101102625441 2室1厅 470.0 西城 精装 61.0 1992 7.704918
25 牛街 NaN 6 白广路6号院 101102562685 3室0厅 635.0 西城 简装 84.0 1955 7.559524
26 西 亚运村小营 有电梯 7 育慧里一区 101102161792 1室0厅 343.0 朝阳 精装 52.0 2001 6.596154
27 南北 望京 有电梯 10 大西洋新城A区 101102387406 2室2厅 835.0 朝阳 精装 86.0 1999 9.709302
28 东西 团结湖 无电梯 6 团结湖路 101102395918 2室1厅 430.0 朝阳 精装 65.0 1980 6.615385
29 南北 三元桥 有电梯 12 尚家楼48号院 101102691041 2室1厅 610.0 朝阳 精装 75.0 1998 8.133333
... ... ... ... ... ... ... ... ... ... ... ... ... ...
23647 东南 和平里 NaN 6 和平里七区 101102564044 2室1厅 650.0 东城 精装 69.0 1995 9.420290
23648 东西 工体 NaN 6 工体北里 101102547276 2室1厅 490.0 东城 毛坯 54.0 1984 9.074074
23649 东南北 安贞 NaN 12 小黄庄二区 101102726945 4室1厅 1300.0 东城 简装 122.0 1996 10.655738
23650 西 广渠门 NaN 29 广渠家园 101102653969 1室1厅 435.0 东城 精装 51.0 2009 8.529412
23651 西南 和平里 无电梯 6 和平里七区 101102686119 2室1厅 540.0 东城 简装 56.0 1989 9.642857
23652 南北 东直门 NaN 6 北官厅胡同2号院 101102669476 2室1厅 650.0 东城 精装 59.0 1985 11.016949
23653 东南 朝阳门内 NaN 6 仓南胡同 101102422853 2室1厅 938.0 东城 简装 71.0 2003 13.211268
23654 安定门 NaN 11 鼓楼外大街52号 101102492879 2室1厅 685.0 东城 简装 62.0 1992 11.048387
23655 南北 崇文门 NaN 12 新裕家园 101102454084 3室1厅 1293.0 东城 精装 125.0 2004 10.344000
23656 东西 崇文门 NaN 16 新景家园西区 101102532627 3室1厅 870.0 东城 精装 91.0 2004 9.560440
23657 南西北 金宝街 NaN 5 史家胡同20号院 101102587502 2室0厅 686.0 东城 精装 46.0 1980 14.913043
23658 工体 NaN 9 春秀路 101102587082 2室1厅 572.0 东城 简装 59.0 1998 9.694915
23659 东西 朝阳门内 NaN 16 西水井胡同 101102328585 2室1厅 699.0 东城 简装 74.0 2003 9.445946
23660 南北 东直门 NaN 14 民安小区东羊管胡同 101102328701 2室1厅 760.0 东城 精装 73.0 2002 10.410959
23661 左安门 NaN 15 左安漪园 101102716957 3室1厅 950.0 东城 精装 113.0 2004 8.407080
23662 南北 和平里 NaN 6 和平里九区 101102724566 3室1厅 670.0 东城 简装 67.0 1990 10.000000
23663 西 和平里 NaN 20 和平里二区 101102668742 2室1厅 800.0 东城 精装 79.0 2006 10.126582
23664 西南 和平里 NaN 6 和平里三区 101102647453 1室1厅 430.0 东城 简装 40.0 1996 10.750000
23665 东北 永定门 NaN 6 定安里 101102729923 3室1厅 419.0 东城 精装 64.0 1984 6.546875
23666 西北 陶然亭 有电梯 23 中海紫御公馆 101102184767 2室1厅 599.0 东城 简装 63.0 2010 9.507937
23667 南北 永定门 NaN 6 定安里 101102724425 2室1厅 365.0 东城 精装 55.0 1984 6.636364
23668 南北 东直门 NaN 6 海运仓小区 101102575113 3室1厅 950.0 东城 简装 82.0 2003 11.585366
23669 西南 广渠门 NaN 22 京禧阁 101102509047 2室1厅 1050.0 东城 精装 119.0 2013 8.823529
23670 南北 交道口 NaN 6 土儿胡同 101102411691 2室1厅 880.0 东城 简装 69.0 2002 12.753623
23671 南北 和平里 NaN 5 甘水桥 101102292212 3室1厅 565.0 东城 简装 56.0 1983 10.089286
23672 南北 广渠门 NaN 16 保利蔷薇 101102296423 2室1厅 1010.0 东城 简装 97.0 2008 10.412371
23673 南北 永定门 NaN 6 郭庄北里 101102593534 2室1厅 468.0 东城 简装 66.0 1995 7.090909
23674 南北 和平里 NaN 6 康鸿家园 101102549465 3室2厅 1400.0 东城 简装 155.0 2000 9.032258
23675 南北 前门 NaN 6 台基厂头条10号院 101102322422 4室1厅 1100.0 东城 简装 107.0 1990 10.280374
23676 南北 崇文门 NaN 15 新景家园东区 101102657079 1室1厅 790.0 东城 精装 81.0 2008 9.753086

23677 rows × 13 columns

# 重新摆放列位置
columns = ['Region', 'District', 'Garden', 'Layout', 'Floor', 'Year', 'Size', 'Elevator', 'Direction', 'Renovation', 'PerPrice', 'Price']
df = pd.DataFrame(df, columns = columns)

# 重新审视数据集
display(df.head(n=2))
Region District Garden Layout Floor Year Size Elevator Direction Renovation PerPrice Price
0 东城 灯市口 锡拉胡同21号院 3室1厅 6 1988 75.0 NaN 东西 精装 10.40 780.0
1 东城 东单 东华门大街 2室1厅 6 1988 60.0 无电梯 南北 精装 11.75 705.0

数据分析

地区特征分析

# 对二手房区域分组对比二手房数量和每平米房价
df_house_count = df.groupby('Region')['Price'].count().sort_values(ascending=False).to_frame().reset_index()
df_house_mean = df.groupby('Region')['PerPrice'].mean().sort_values(ascending=False).to_frame().reset_index()
Region Price
0 海淀 2983
1 朝阳 2973
2 丰台 2952
3 昌平 2811
4 西城 2130
5 大兴 2115
6 通州 1602
7 东城 1533
8 房山 1442
9 顺义 1221
10 石景山 882
11 门头沟 496
12 亦庄开发区 469
13 平谷 41
14 怀柔 15
15 密云 12
Region PerPrice
0 西城 10.688348
1 东城 9.864243
2 海淀 8.847025
3 朝阳 7.317792
4 丰台 6.098628
5 石景山 5.535677
6 大兴 5.414790
7 通州 5.240839
8 顺义 4.974990
9 亦庄开发区 4.696853
10 昌平 4.402832
11 门头沟 4.017825
12 房山 3.948686
13 怀柔 3.934458
14 平谷 2.749869
15 密云 2.392645
f, [ax1,ax2,ax3] = plt.subplots(3,1,figsize=(20,15))
#
sns.barplot(x='Region', y='PerPrice', palette='Blues_d', data=df_house_mean, ax=ax1)
ax1.set_title('北京各大区二手房每平米单价对比',fontsize=15)
ax1.set_xlabel("区域")
ax1.set_ylabel('每平米单价')

sns.barplot(x='Region', y='Price', palette='Greens_d', data=df_house_count, ax=ax2)
ax2.set_title('北京各大区二手房数量对比',fontsize=15)
ax2.set_xlabel('区域')
ax2.set_ylabel('数量')
# 箱型图表
sns.boxplot(x='Region', y='Price', data=df, ax=ax3)
ax3.set_title('北京各大区二手房房屋总价',fontsize=15)
ax3.set_xlabel('区域')
ax3.set_ylabel('房屋总价')

plt.show()

png

房屋面积特征分析

f,[ax1,ax2] = plt.subplots(1,2,figsize = (15,5))
# 建房时的分布情况
sns.distplot(df['Size'],bins=20,ax=ax1,color='r')
sns.kdeplot(df['Size'],shade=True,ax=ax1)

# 建房时间和出售价格的关系
sns.regplot(x='Size',y='Price',data=df,ax=ax2)
plt.show()

png

Size分布

通过 distplot 和 kdeplot 绘制柱状图观察 Size 特征的分布情况,属于长尾类型的分布,这说明了有很多面积很大且超出正常范围的二手房。

Size和Price的关系

通过 regplot 绘制了 Size 和 Price 之间的散点图,发现 Size 特征基本与Price呈现线性关系,符合基本常识,面积越大,价格越高。
但是有两组明显的异常点:

  1. 面积不到10平米,但是价格超出10000万;
  2. 一个点面积超过了1000平米,价格很低
df.loc[df['Size']<10]
Region District Garden Layout Floor Year Size Elevator Direction Renovation PerPrice Price
1168 房山 长阳 世茂维拉 叠拼别墅 5 2015 5.0 毛坯 240.97平米 南北 216.000000 1080.0
1458 房山 长阳 世茂维拉 叠拼别墅 5 2015 5.0 毛坯 242.78平米 南北 220.000000 1100.0
1797 房山 长阳 世茂维拉 叠拼别墅 5 2015 5.0 精装 242.96平米 南北 196.000000 980.0
2268 顺义 顺义其它 龙湖好望山 叠拼别墅 4 2014 4.0 精装 295.88平米 南北 250.000000 1000.0
2274 顺义 顺义其它 鹭峯国际 叠拼别墅 4 2014 5.0 精装 295.01平米 南北 290.000000 1450.0
2276 顺义 顺义其它 龙湖好望山 叠拼别墅 3 2014 4.0 毛坯 292.31平米 南北 215.000000 860.0
2432 顺义 顺义其它 龙湖好望山 叠拼别墅 5 2013 6.0 精装 294.42平米 南北 163.333333 980.0
4078 大兴 西红门 鸿坤林语墅 叠拼别墅 3 2015 4.0 精装 427.5平米 南北 787.500000 3150.0
4079 大兴 西红门 鸿坤林语墅 叠拼别墅 4 2015 4.0 精装 361.8平米 南北 595.000000 2380.0
4761 大兴 西红门 鸿坤林语墅 叠拼别墅 3 2015 5.0 精装 386.83平米 南北 540.000000 2700.0
7533 昌平 回龙观 龙城花园N区 叠拼别墅 4 1997 2.0 简装 107.93平米 南北 310.000000 620.0
8765 通州 通州其它 旭辉御锦 叠拼别墅 6 2014 5.0 毛坯 195.32平米 南北 156.000000 780.0
9020 通州 通州其它 旭辉御锦 叠拼别墅 6 2014 4.0 精装 259.87平米 南北 280.000000 1120.0
9080 通州 通州其它 旭辉御锦 叠拼别墅 6 2014 4.0 毛坯 259.76平米 南北 262.500000 1050.0
9203 通州 通州其它 旭辉御锦 叠拼别墅 6 2014 4.0 精装 260.07平米 南北 262.500000 1050.0
9254 通州 通州其它 旭辉御锦 叠拼别墅 6 2014 4.0 毛坯 264.6平米 南北 275.000000 1100.0
11531 丰台 丽泽 西宸原著 叠拼别墅 6 2016 4.0 毛坯 335.51平米 南北 1000.000000 4000.0
14298 海淀 西山 中间建筑一区 叠拼别墅 3 2007 8.0 精装 266.61平米 南北 168.750000 1350.0
15334 海淀 西山 西山美墅馆F区 叠拼别墅 4 2004 4.0 简装 203.73平米 南北 550.000000 2200.0
17311 朝阳 大望路 首府官邸 叠拼别墅 5 2007 5.0 精装 523.4平米 南北 900.000000 4500.0

所有面积小于10的数据全部都是别墅,数据出现异常的原因是由于别墅的结构比较特殊(无朝向无电梯),字段定义与二手商品房不太一样导致爬虫爬取数据错位。也因别墅类型二手房不在我们的考虑范围之内,故将其移除再次观察Size分布和Price关系。

df.loc[df['Size']>1000]
Region District Garden Layout Floor Year Size Elevator Direction Renovation PerPrice Price
8754 通州 通州其它 新华联科技大厦 1房间0卫 8 2009 1019.0 有电梯 简装 1.668302 1700.0

运行发现房屋面积大于1000的不是普通的民用住房,而是商业用房,所以才会出现1室0厅有1000多平米,所以也需要移除

df = df[(df['Layout']!='叠拼别墅')&(df['Size']<1000)]

重新可视化就没有异常数据了

f,[ax1,ax2] = plt.subplots(1,2,figsize = (15,5))
# 建房时的分布情况
sns.distplot(df['Size'],bins=20,ax=ax1,color='r')
sns.kdeplot(df['Size'],shade=True,ax=ax1)

# 建房时间和出售价格的关系
sns.regplot(x='Size',y='Price',data=df,ax=ax2)
plt.show()

png

户型特征分析

f,ax1=plt.subplots(figsize=(20,20))
sns.countplot(y='Layout',data=df,ax=ax1)
ax1.set_title("房屋户型",fontsize=15)
ax1.set_xlabel("数量")
ax1.set_ylabel("户型")
plt.show()

png

户型特征的厅室搭配花样太多了,各种奇怪的结构,像这种类型的特征是肯定不能作为机器学习模型的数据输入的,需要使用特征工程进行相应的处理

Renovation特征分析

df['Renovation'].value_counts()
精装    11345
简装     8496
其他     3239
毛坯      576
Name: Renovation, dtype: int64
# 画幅设置
f, [ax1,ax2,ax3] = plt.subplots(1, 3, figsize=(20, 5))
sns.countplot(df['Renovation'], ax=ax1)
sns.barplot(x='Renovation', y='Price', data=df, ax=ax2)
sns.boxplot(x='Renovation', y='Price', data=df, ax=ax3)
plt.show()

png

电梯特征分析

其实在最开始的时候我们也能发现,Elevator 特征是存在大量的缺失值的,所以需要进行一些处理

# 查看缺失值数量
misn = len(df.loc[(df['Elevator'].isnull()), 'Elevator'])
print('Elevator缺失值数量为:'+ str(misn))
Elevator缺失值数量为:8237

常见的处理缺失值的方法有:平均数、中位数填补/删除缺失值/根据其他特征建模预测等。

但是有无电梯并不是具体的数据,根本不存在平均数、中位数这么一说。这就需要换一种思路了,国家规定楼层超过6层就必须要有电梯,小于6层的就没有。就可以以这个标准来进行判断

df['Elevator'] = df.loc[(df['Elevator'] == '有电梯')|(df['Elevator'] == '无电梯'),'Elevator']
# 填补Elevator缺失值
df.loc[(df['Floor'] > 6)&(df['Elevator'].isnull()),'Elevator'] = '有电梯'
df.loc[(df['Floor'] <= 6)&(df['Elevator'].isnull()),'Elevator'] = '无电梯'

f, [ax1,ax2] = plt.subplots(1, 2, figsize=(20, 10))
sns.countplot(df['Elevator'], ax=ax1)
ax1.set_title('有无电梯数量对比',fontsize=15)
ax1.set_xlabel('是否有电梯')
ax1.set_ylabel('数量')
sns.barplot(x='Elevator', y='Price', data=df, ax=ax2)
ax2.set_title('有无电梯房价对比',fontsize=15)
ax2.set_xlabel('是否有电梯')
ax2.set_ylabel('总价')
Text(0, 0.5, '总价')

png

年份特征分析

grid = sns.FacetGrid(df,row='Elevator',col='Renovation',palette='seismic')
grid.map(plt.scatter,'Year','Price')
grid.add_legend()
<seaborn.axisgrid.FacetGrid at 0x1f133f01e48>

png

整个二手房房价趋势是随着时间增长而增长的;

2000年以后建造的二手房房价相较于2000年以前有很明显的价格上涨;

1980年之前几乎不存在有电梯二手房数据,说明1980年之前还没有大面积安装电梯;

1980年之前无电梯二手房中,简装二手房占绝大多数,精装反而很少;

楼层特征分析

f, ax1= plt.subplots(figsize=(20,5))
sns.countplot(x='Floor', data=df, ax=ax1)
ax1.set_title('房屋户型',fontsize=15)
ax1.set_xlabel('数量')
ax1.set_ylabel('户型')
plt.show()

png

可以看到,6层二手房数量最多,但是单独的楼层特征没有什么意义,因为每个小区住房的总楼层数都不一样,我们需要知道楼层的相对意义。另外,楼层与文化也有很重要联系,比如中国文化七上八下,七层可能受欢迎,房价也贵,而一般也不会有4层或18层。当然,正常情况下中间楼层是比较受欢迎的,价格也高,底层和顶层受欢迎度较低,价格也相对较低。所以楼层是一个非常复杂的特征,对房价影响也比较大。

特征工程

特征工程包括的内容很多,有特征清洗,预处理,监控等,而预处理根据单一特征或多特征又分很多种方法,如归一化,降维,特征选择,特征筛选等等。这么多的方法,为的是什么呢?其目的是让这些特征更友好的作为模型的输入,处理数据的好坏会严重的影响模型性能,而好的特征工程有的时候甚至比建模调参更重要。

"""
特征工程
"""
# 移除结构类型异常值和房屋大小异常值
df = df[(df['Layout']!='叠拼别墅')&(df['Size']<1000)]

# 去掉错误数据“南北”,因为爬虫过程中一些信息位置为空,导致“Direction”的特征出现在这里,需要清除或替换
df['Renovation'] = df.loc[(df['Renovation'] != '南北'), 'Renovation']

# 由于存在个别类型错误,如简装和精装,特征值错位,故需要移除
df['Elevator'] = df.loc[(df['Elevator'] == '有电梯')|(df['Elevator'] == '无电梯'), 'Elevator']

# 填补Elevator缺失值
df.loc[(df['Floor']>6)&(df['Elevator'].isnull()), 'Elevator'] = '有电梯'
df.loc[(df['Floor']<=6)&(df['Elevator'].isnull()), 'Elevator'] = '无电梯'

# 只考虑“室”和“厅”,将其它少数“房间”和“卫”移除
df = df.loc[df['Layout'].str.extract('^\d(.*?)\d.*?') == '室']

# 提取“室”和“厅”创建新特征
df['Layout_room_num'] = df['Layout'].str.extract('(^\d).*', expand=False).astype('int64')
df['Layout_hall_num'] = df['Layout'].str.extract('^\d.*?(\d).*', expand=False).astype('int64')

# 按中位数对“Year”特征进行分箱
df['Year'] = pd.qcut(df['Year'],8).astype('object')

# 对“Direction”特征
d_list_one = ['东','西','南','北']
d_list_two = ['东西','东南','东北','西南','西北','南北']
d_list_three = ['东西南','东西北','东南北','西南北']
d_list_four = ['东西南北']    
df['Direction'] = df['Direction'].apply(direct_func)
df = df.loc[(df['Direction']!='no')&(df['Direction']!='nan')]

# 根据已有特征创建新特征
df['Layout_total_num'] = df['Layout_room_num'] + df['Layout_hall_num']
df['Size_room_ratio'] = df['Size']/df['Layout_total_num']

# 删除无用特征
df = df.drop(['Layout','PerPrice','Garden'],axis=1)

# 对于object特征进行onehot编码
df,df_cat = one_hot_encoder(df)
posted @ 2019-10-12 14:29  小猿取经-林海峰老师  阅读(689)  评论(0编辑  收藏  举报