千家信息网

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

发表于:2024-11-22 作者:千家信息网编辑
千家信息网最后更新 2024年11月22日,这篇文章主要介绍"怎么用Python分析北京的二手房数据",在日常操作中,相信很多人在怎么用Python分析北京的二手房数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答
千家信息网最后更新 2024年11月22日怎么用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, Pagefrom 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)

数据预处理

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

  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]# 删除houseInfodf_all = df_all.drop('houseInfo', axis=1) # 提取地铁df_all['subway'] = [1 if '地铁' in i else 0 for i in df_all['tag_info']]# 删除tag_infodf_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_yeardf_all['built_year'] = 2020 - df_all['built_year']# banta-一般化df_all['banta'] = df_all.banta.str.strip()df_all.head()

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

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

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

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

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

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

不同房屋结构的数量分布

从散点图可以看出,房屋的面积和房屋价格呈现正相关,计算皮尔逊相关系数的值为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'].valuesy2 = df_all[df_all['halls']=='2']['total_price'].valuesy3 = df_all[df_all['halls']=='3']['total_price'].valuesy4 = df_all[df_all['halls']=='4']['total_price'].valuesy5 = df_all[df_all['halls']=='5及以上']['total_price'].values# 实例Figurefig = 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分析北京的二手房数据"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

0