怎么用Python分析北京的二手房数据

这篇文章主要介绍“怎么用Python分析北京的二手房数据”,在日常操作中,相信很多人在怎么用Python分析北京的二手房数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用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

数据读入

使用循环读入数据集,然后进行去重处理,查看一下数据集大小,可以看到去重之后一共有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)

怎么用Python分析北京的二手房数据

数据预处理

我们对数据集的各个特征进行提取和处理,以便后续的数据分析工作,主要处理工作包含:

  1. title:无需分析,删除

  2. detail_url:无需分析,删除

  3. position:维度过细、删除

  4. houseInfo:提取室、厅、面积、方位、装修、楼层(高中低)、建筑年份、板塔

  5. followInfo:无需分析,删除

  6. tag_info:提取是否靠近地铁

  7. total_price:提取房屋总价

  8. unitPrice:房屋单价

  9. 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()

怎么用Python分析北京的二手房数据

进一步处理楼层、建筑年份和房屋朝向字段。

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()

怎么用Python分析北京的二手房数据

首先我们看到近一年来,北京二手房房价的走势图,可以看到有回调的趋势,目前的均价在每平方米57589的样子。

北京不同区域的二手房房源数量

那么北京各个区域的二手房源分布如何呢?

怎么用Python分析北京的二手房数据

不同区域的二手房价又是怎样的呢?西城区一马当先,以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()

北京二手房都处在什么价位

怎么用Python分析北京的二手房数据

那么在北京买一套二手房到底要花多少钱?接着我们分析了二手房的价位,从图中可以看到总价在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()

北京二手房房龄分布

怎么用Python分析北京的二手房数据

那么这些二手房的房龄都有多久了呢?可以看到房龄在20年以上的最多,有10946套占比33.73%,其次房龄在15-20年的有7835套,占比24.15%。5年以内的仅有1441套,占比4.44%。

是否靠近地铁和房屋单价的关系

怎么用Python分析北京的二手房数据

房屋朝向方面,朝南的自然是最多的,占比达到68.97%。其次是朝东的,占比18.25%。

不同房屋结构的数量分布

怎么用Python分析北京的二手房数据

从散点图可以看出,房屋的面积和房屋价格呈现正相关,计算皮尔逊相关系数的值为0.67,为强相关。

代码如下:

# 添加轨迹
fig = px.scatter(df_all, x='area', y='total_price')

fig.update_layout(title='房屋面积和房屋价格的关系(万元)') 
py.offline.plot(fig, filename='房屋面积和房屋价格的关系.html')

卧室数量和房屋价格的关系

怎么用Python分析北京的二手房数据

客厅和卧室一样反映在房屋的面积上,客厅 数越多,则房屋总价越高。

代码如下:

# 合并
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')

到此,关于“怎么用Python分析北京的二手房数据”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!