CDA人工智能学院致力于以优质的人工智能在线教育资源助力学员的DT职业梦想!课程内容涵盖数据分析、机器学习、深度学习、人工智能、TensorFlow、PyTorch、知识图谱等众多核心技术及行业案例,让每一个学员都可以在线灵活学习,快速掌握AI时代的前沿技术。PS:私信我即可获取《银牌会员》1个月免费试听机会
CDA数据分析师 出品
作者:Mika
数据:真达
后期:泽龙
【导读】
今天让我们来聊一聊北京的二手房市场现状。
代码链接:https://edu.cda.cn/group/19/thread/241
Show me data,用数据说话
今天我们聊一聊 北京二手房数据
点击下方视频,先睹为快:
对于许多在一线城市打拼的人群而言,能够在大城市安家,扎根下来都是为止奋斗的梦想。但一线城市的突破天际房价也让很多人望而却步。
转眼间2020年已经过半,大家买房子、买房子的愿望实现了吗?你关注的房子降价了吗?
之前DT财经的《我只有300万预算,能在上海买到什么样的房子?》分析了上海二手房的房价,引起了很多人的反响。
那么帝都的二手房市场又是怎样的呢?这次我们用Python来分析下北京的二手房数据。
我们使用Python获取了链家网上北京市16个区的二手房数据。首先导入要使用的数据处理包pandas,可视化工具pyecharts和plotly。
- # 导入所需包
- import numpy as np
- import pandas as pd
- import matplotlib.pyplot as plt
- import os
- from pyecharts.charts import Pie, Map, Bar, Line, Grid, Page
- from pyecharts import options as opts
- import plotly as py
- import plotly.graph_objs as go
- import plotly.express as px
01数据读入
使用循环读入数据集,然后进行去重处理,查看一下数据集大小,可以看到去重之后一共有4403条数据。
- # 读入数据
- file_list = os.listdir('../data/')
- df_all = pd.DataFrame()
- for file in file_list:
- file_name = file.split('.')[0]
- df = pd.read_csv(f'../data/{file}')
- df['region_name'] = file_name
- df_all = df_all.append(df, ignore_index=True)
- # 去重
- df_all = df_all.drop_duplicates()
- print(df_all.shape)
- (33509, 9)
- df_all.head(2)
预览以下数据:
df_all.head(2)02数据预处理
我们对数据集的各个特征进行提取和处理,以便后续的数据分析工作,主要处理工作包含:
title:无需分析,删除
detail_url:无需分析,删除
position:维度过细、删除
houseInfo:提取室、厅、面积、方位、装修、楼层(高中低)、建筑年份、板塔
followInfo:无需分析,删除
tag_info:提取是否靠近地铁
total_price:提取房屋总价
unitPrice:房屋单价
region_name:无需处理
- # 删除列
- df_all = df_all.drop(['title', 'detail_url', 'position', 'followInfo'], axis=1)
- # 提取室厅
- df_all['halls'] = df_all['houseInfo'].str.split('|').str[0].str.extract(r'(\d+)室')
- df_all['bedrooms'] = df_all['houseInfo'].str.split('|').str[0].str.extract(r'\d室(\d+)厅')
- # 提取面积
- df_all['area'] = df_all['houseInfo'].str.split('|').str[1].str.extract(r'(\d+.*\d+)平米')
- # 提取朝向
- df_all['orient'] = df_all['houseInfo'].str.split('|').str[2]
- # 提取装修类型
- df_all['decorate_type'] = df_all['houseInfo'].str.split('|').str[3]
- # 提取楼层
- df_all['floor'] = df_all['houseInfo'].str.split('|').str[4]
- # 提取建筑年份
- df_all['built_year'] = df_all['houseInfo'].str.split('|').str[5].str.extract(r'(\d+)')
- # 提取板塔
- df_all['banta'] = df_all['houseInfo'].str.split('|').str[6]
- # 删除houseInfo
- df_all = df_all.drop('houseInfo', axis=1)
- # 提取地铁
- df_all['subway'] = [1 if '地铁' in i else 0 for i in df_all['tag_info']]
- # 删除tag_info
- df_all = df_all.drop('tag_info', axis=1)
- # 提取总价
- df_all['total_price'] = df_all['total_price'].str.extract(r'(\d+)')
- df_all['unitPrice'] = df_all['unitPrice'].str.extract(r'(\d+)')
- # 空值-直接删除
- df_all = df_all.dropna()
- # 转换数据类型
- df_all['total_price'] = df_all['total_price'].astype('int')
- df_all['unitPrice'] = df_all['unitPrice'].astype('int')
- df_all['halls'] = df_all['halls'].astype('int')
- df_all['bedrooms'] = df_all['bedrooms'].astype('int')
- df_all['area'] = df_all['area'].astype('float')
- df_all['built_year'] = df_all['built_year'].astype('int')
- df_all['subway'] = df_all['subway'].astype('int')
- df_all.head()
进一步处理楼层、建筑年份和房屋朝向字段。
- def transform_floor(x):
- if x == '高楼层' or x == '顶层' or x == '上叠':
- return '高层'
- elif x == '低楼层' or x == '底层' or x == '下叠' or x == '1层' or x == '2层' or x == '3层':
- return '低层'
- elif x == '中楼层' or x == '4层' or x == '5层' or x == '6层':
- return '中层'
- elif x == '地下室':
- return '地下室'
- else: # 其他归为高层
- return '高层'
- # floor一般化
- df_all['floor_type'] = df_all['floor'].str.replace(r'\(.*?\)', '').str.strip()
- df_all['floor_type'] = df_all.floor_type.apply(transform_floor)
- df_all = df_all.drop('floor', axis=1)
- # orient-一般化
- df_all['orient'] = df_all['orient'].str.extract(r'([\u4e00-\u9fa5])')
- # bulit_year
- df_all['built_year'] = 2020 - df_all['built_year']
- # banta-一般化
- df_all['banta'] = df_all.banta.str.strip()
- df_all.head()
03数据探索和可视化
以下仅列出关键部分数据可视化分析代码:
近一年北京二手房房价走势图
首先我们看到近一年来,北京二手房房价的走势图,可以看到有回调的趋势,目前的均价在每平方米57589的样子。
北京不同区域的二手房房源数量
那么北京各个区域的二手房源分布如何呢?
经过统计可以看到,朝阳区的二手房数量遥遥领先,达到25648.其次是丰台,共11094。之后海淀、昌平、大兴紧随其后。
北京不同区域的二手房均
不同区域的二手房价又是怎样的呢?西城区一马当先,以114980元每平米的价格领跑北京的二手房市场。其次,东城区以97295每平米排在第二位。海淀区以85954每平米的价格排在第三位。
代码如下:
- # 产生数据
- s_region = df_all.groupby('region_name')['unitPrice'].mean().sort_values(ascending=False)
- x_data = [i+'区' for i in s_region.index.tolist()]
- y_data = [round(i) for i in s_region.values.tolist()]
- data_pair = [list(z) for z in zip(x_data, y_data)]
- # 地图
- map1 = Map(init_opts=opts.InitOpts(width='1350px', height='750px'))
- map1.add('', data_pair, maptype='北京')
- map1.set_global_opts(title_opts=opts.TitleOpts(title='北京不同区域的二手房均价(元/平米)'),
- visualmap_opts=opts.VisualMapOpts(max_=114979))
- map1.render()
- # 条形图
- bar2 = Bar(init_opts=opts.InitOpts(width='1350px', height='750px'))
- bar2.add_xaxis(x_data)
- bar2.add_yaxis('', y_data)
- bar2.set_global_opts(title_opts=opts.TitleOpts(title='北京不同区域的二手房均价(元/平米)'),
- visualmap_opts=opts.VisualMapOpts(max_=114979))
- bar2.render()
北京二手房都处在什么价位
那么在北京买一套二手房到底要花多少钱?接着我们分析了二手房的价位,从图中可以看到总价在300-500万内的最多,占比达到35.9%。500-800万的占比26.54%。300万以下的占比19.54%。
代码如下:
- bins = [74, 300, 500, 800, 1000, 8299]
- bins_label = ['300万及以下', '300-500万', '500-800万', '800-1000万', '1000万以上']
- # 新增字段
- df_all['price_cut'] = pd.cut(df_all['total_price'], bins=bins, labels=bins_label)
- price_num = df_all.price_cut.value_counts()
- # 数据对
- data_pair = [list(z) for z in zip(price_num.index.tolist(), price_num.values.tolist())]
- # 绘制饼图
- pie1 = Pie(init_opts=opts.InitOpts(width='1350px', height='750px'))
- pie1.add('', data_pair=data_pair, radius=['30%', '60%'], rosetype='radius')
- pie1.set_global_opts(title_opts=opts.TitleOpts(title='北京二手房都处在哪些价位?'),
- legend_opts=opts.LegendOpts(orient='vertical', pos_top='15%', pos_left='2%'))
- pie1.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{d}%"))
- pie1.set_colors(['#FF7F0E', '#1F77B4', '#2CA02C', '#D62728', '#946C8B'])
- pie1.render()
北京二手房房龄分布
那么这些二手房的房龄都有多久了呢?可以看到房龄在20年以上的最多,有10946套占比33.73%,其次房龄在15-20年的有7835套,占比24.15%。5年以内的仅有1441套,占比4.44%。
是否靠近地铁和房屋单价的关系
一般来说,靠近地铁越近的房子房价越高,从分布的箱线图可以看出,以中位数来看,靠近地铁的房子单价比不不靠近地铁的房子每平米高12317元。
不同朝向的房屋数量分布
房屋朝向方面,朝南的自然是最多的,占比达到68.97%。其次是朝东的,占比18.25%。
不同房屋结构的数量分布
房屋结构方面,板楼是最多的占比64.39%。其次是塔楼,占比16.85%。板楼塔楼结合的占比16.45%。
房屋面积和房屋价格的关系
从散点图可以看出,房屋的面积和房屋价格呈现正相关,计算皮尔逊相关系数的值为0.67,为强相关。
代码如下:
- # 添加轨迹
- fig = px.scatter(df_all, x='area', y='total_price')
- fig.update_layout(title='房屋面积和房屋价格的关系(万元)')
- py.offline.plot(fig, filename='房屋面积和房屋价格的关系.html')
卧室数量和房屋价格的关系
从分布的箱线图可以看出,卧室数量越多,面积越大,则房屋总价越高。房价呈现右偏分布,且离群值较多。
客厅数量和房屋价格的关系
客厅和卧室一样反映在房屋的面积上,客厅 数越多,则房屋总价越高。
代码如下:
- # 合并
- df_all['halls'] = [i if i<=4 else '5及以上' for i in df_all['halls']]
- df_all['halls'] = df_all.halls.astype('str')
- # 添加数据
- y1 = df_all[df_all['halls']=='1']['total_price'].values
- y2 = df_all[df_all['halls']=='2']['total_price'].values
- y3 = df_all[df_all['halls']=='3']['total_price'].values
- y4 = df_all[df_all['halls']=='4']['total_price'].values
- y5 = df_all[df_all['halls']=='5及以上']['total_price'].values
- # 实例Figure
- fig = go.Figure()
- # 添加轨迹
- fig.add_trace(trace=go.Box(y=y1, name='1厅'))
- fig.add_trace(trace=go.Box(y=y2, name='2厅'))
- fig.add_trace(trace=go.Box(y=y3, name='3厅'))
- fig.add_trace(trace=go.Box(y=y4, name='4厅'))
- fig.add_trace(trace=go.Box(y=y5, name='5厅及以上'))
- # 配置项
- fig.update_layout(title='客厅数量和房屋价格的关系(万元)')
- py.offline.plot(fig, filename='客厅数量和房屋价格的关系.html')
装修类型和房屋单价的关系
不同装修类型花费的成本不同,从装修类型看,精装的房子单价最高,然后是简装、毛坯。
点击链接即可获取代码:https://edu.cda.cn/group/19/thread/241
关注“CDA人工智能学院”,回复“录播”获取更多人工智能精选直播视频!