这是我的python数据可视化练手项目,数据从贝壳厦门二手房网爬取,数据已经经过清理,并且补充了经纬和地铁/BRT站信息,系列文章:
- Scrapy-Redis爬虫贝壳网所有在售厦门二手房信息
- 初步清理贝壳网爬取的厦门二手房信息
- 百度API补完厦门二手房经纬度并找到最近的地铁站
- 本文->简单分析贝壳在售厦门二手房数据(一)
- 简单分析贝壳在售厦门二手房数据(二)
- 进行中:进一步收集和处理数据/建模
一、主要数据概览
# 导包
import pandas as pd
# 主要数据概览
data_clean_with_stations= pd.read_csv("data_clean_with_stations.csv", index_col=0)
# print(data_clean_with_stations[['area', 'price', 'unit_price', 'year_build']].describe())
显示如下:

对这张表我的一些疑问和想法,将一一尝试解答:
面积(area)方面:
- 刚需的主流面积是多少?
- 是否存在普适的“一次到位”的房子?
- 房子面积有性价比区间吗?
价格(price 和 unitprice)方面:
- 能否一张图看懂厦门房价?
- 地铁房怎么个贵法?
建成年份(year_build)方面:
- 厦门房子量价齐飞?
- 厦门房子越来越小?
二、两室两厅的面积占比统计
2.1 绘图
饼图最适合统计占比,我们用pycharts来绘制:
# 导可视化工具包
import pyecharts.options as opts
from pyecharts.charts import Grid, Boxplot, Scatter, Pie, Bar, Line
# 过滤和排序
data_filterd = data_clean_with_stations[(data_clean_with_stations.rooms == "2室2厅1卫")]
data_sorted = data_filterd.sort_values(by='area')
# 添加分bin字段'area_bin'对面积分bin,
bins = [0]
for i in range(0, 10):
bins.append((i+1)*20)
area_bin = pd.cut(data_sorted.area, bins)
data_sorted['area_bin'] = area_bin
# 分组获得数据
area_grouped = data_sorted.groupby('area_bin')['area'].count()
# 字段list
intervals = ['%s~%s㎡' % (str(i.left), str(i.right)) for i in area_grouped.index]
# 值list
counts = list(area_grouped.astype('float64'))
area_group = (
Pie(opts.InitOpts(width="800px", height="600px", theme=ThemeType.LIGHT))
.add("", [list(z) for z in zip(intervals, counts)])
.set_global_opts(title_opts=opts.TitleOpts(title="在售二手2室2厅1卫房屋面积分布"),
legend_opts=opts.LegendOpts(type_="scroll", pos_right="left", orient="vertical"),
toolbox_opts=None)
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)
area_group.render()
2.2 结果
2.3 分析
- 数据中80~100m占了绝大部分,这类数字有指导意义,比如说扫地机器人的设计续航必须要满足。
4.4 其他猜想
- 数据中存在40平以下的房子超紧凑两室两厅,这些房子是随着近年房价高企才涌现的吗?
- 这些超紧凑房子的位置是怎么分布的?单价如何?投资价值相比主流面积如何?
三、存在一步到位的房子吗?
3.1 绘图
对不同面积的房子持有时间的统计应该能回答这个问题,不过我们收集到的只有(上次交易时间)和(上架时间)数据,相减得到的是大概的从入手到想出手的时间差,就叫他“伪持有时间”吧,我们用直方图来反应”伪持有时间”和房屋面积的关系。
# 排序
data_sorted = data_clean_with_lng_lat.sort_values(by='area')
# 过滤'time_last_transaction'字段
data_filterd = data_sorted[data_sorted['time_last_transaction'].notna()]
data_filterd = data_filterd[data_filterd['time_on_sold'].notna()]
# 重建索引
data_filterd = data_filterd.reset_index(drop=True)
# 增加'area_bin'分bin字段
bins = [0]
for i in range(0, 15):
bins.append((i + 1) * 20)
area_bin = pd.cut(data_filterd.area, bins)
data_filterd['area_bin'] = area_bin
# 添加房屋持有时间字段
list_days_hold = []
for i in range(0, len(data_filterd)):
date_last_tras = datetime.strptime(data_filterd.loc[i]['time_last_transaction'], '%Y年%m月%d日').date()
time_on_sold = datetime.strptime(data_filterd.loc[i]['time_on_sold'], '%Y年%m月%d日').date()
# date_now = datetime.today().date()
days_hold = time_on_sold - date_last_tras
list_days_hold.append(days_hold.days)
data_filterd['days_hold'] = list_days_hold
# 分组获得数据
area_grouped = data_filterd.groupby('area_bin')['days_hold'].mean()
# 字段list
intervals = ['%s~%s㎡' % (str(i.left), str(i.right)) for i in area_grouped.index]
# 值list
days_hold_avg_list = list(area_grouped.astype('float64'))
bar = (
Bar(init_opts=opts.InitOpts(width="800px", height="600px", theme=ThemeType.LIGHT))
.add_xaxis(intervals)
.add_yaxis("持有天数", days_hold_avg_list, category_gap=1)
.set_global_opts(title_opts=opts.TitleOpts(title="房屋面积持有时间的关系"),
legend_opts=opts.LegendOpts(type_="scroll", pos_right="middle", orient="vertical"),
datazoom_opts=[opts.DataZoomOpts(type_="slider")], toolbox_opts=opts.ToolboxOpts(),
tooltip_opts=opts.TooltipOpts(is_show=True, axis_pointer_type="line", trigger="item",
formatter='{c}'))
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
)
bar.render()
3.2 结果
3.3 分析
- 不同面积的房子的“伪持有时间”并没有形成明显规律,而是都在6~7年浮动,考虑到数据样本不够多,我们甚至可以忽略这些差异。
- 人性贪婪,当然是越大越好?
3.4 其他猜想
- 特定年龄段的人群对不同面积的房子持有时间是否有规律?
- 面积和流通性关联如何,哪些面积区间换手率最高?
四、房子面积真的有性价比区间
4.1 绘图
拟合平均单价-面积区间曲线,尝试找到规律。
# 排序并查看数据
data_sorted = data_clean_with_lng_lat.sort_values(by='area')
# print(data_sorted[0: 10])
# 增加'area_bin'分bin字段
bins = [20]
# 仅统计20~200平米的房子
for i in range(4, 40):
bins.append((i + 1) * 5)
area_bin = pd.cut(data_sorted.area, bins)
data_sorted['area_bin'] = area_bin
# 分组获得数据
area_grouped = data_sorted.groupby('area_bin')['unit_price'].mean()
# 字段list(横坐标)
interval_list = ['≈%s㎡' % str(i.right) for i in area_grouped.index]
# 值list(纵坐标坐标)
avg_price_list = list(area_grouped.astype('float64'))
print(interval_list)
line = (
Line()
.set_global_opts(
tooltip_opts=opts.TooltipOpts(is_show=False),
xaxis_opts=opts.AxisOpts(type_="category"),
yaxis_opts=opts.AxisOpts(
type_="value",
axistick_opts=opts.AxisTickOpts(is_show=True),
splitline_opts=opts.SplitLineOpts(is_show=True),
),
)
.add_xaxis(xaxis_data=interval_list)
.add_yaxis(
series_name="二手房平均单价和面积",
y_axis=avg_price_list,
symbol="emptyCircle",
is_symbol_show=True,
label_opts=opts.LabelOpts(is_show=False),
is_smooth=True
)
)
line.render()
4.2 结果
4.3 分析
- 90以下单价随面积缩小而增长,推测是受“学位房”影响
- 90平左右是最佳性价比点,90~120平时性价比区间,推测该区间开发商主要建“经济型”的“刚需房”
- 120平以上房子单价反而高,推测该区间开发商主要建各方面优越的“豪宅”,并且地段较好
4.4 其他猜想
- 岛外四区房价较低,该结果是否受岛外房子90~120平占比较多影响?
- “豪宅”分布在哪?是否对特定行业门店选址有指导意义?
爱心提示:本文仅当个人(非专业人士)练手项目(数据少且不可靠),不作任何投资建议(手动滑稽)。
分析part2:简单分析贝壳在售厦门二手房数据(二)
原创文章,作者:10bests,禁止任何形式转载:https://www.10bests.com/beike-house-info-analysis-part1/