📊 第11章 二手房房价分析与预测系统
📄 一句话概括

装修五档(含「未知」):豪华 17492 元最高,毛坯 13125 元最低。 毛坯到精装差 2005 元,精装贵 15.3%;造数时写的是差两成。 户型里两室三室合起来占 82.77%;面积段总价涨 4.48 倍,均价却几乎不动。

📝 本章和前面几章的关系

上一篇按区域分,这一篇按装修和户型分——两个都是分类变量,统计方法完全一样。 分类变量的三件套:频数、占比、分组均值。这一篇反复用这三样。

一、装修五档,先看结构

豪华 97 套、精装 378 套、简装 475 套、未知 18 套、毛坯 216 套。 简装最多,占 40.12%;「未知」那一行是填出来的,不是原来就有的,只有 18 套。 「未知」的均价 13328 元,排在毛坯和简装之间——因为它本来就混着这两种。

填出来的类别要单独标出来。混在真类别里,会让人以为「未知」也是一种装修。 报告里最好写一句「未知为原始缺失,已填为单独一类」,一句话省掉一堆追问。

二、毛坯和精装差多少

毛坯 13125 元,精装 15131 元,差 2005 元,精装贵 15.3%。 造数据时写的是毛坯 0.90、精装 1.08,差两成;跑出来 15.3%。 差的这部分被两层东西摊掉了:一是各区的构成不同,二是同一档里装修质量本来就有高有低。

这个差价和「装修花了多少钱」不是一回事。 花 20 万装 90 平米,摊下来每平米两千多,和 2005 这个数字碰巧接近。 但别拿它当因果:装修好的房子本来就可能是好地段、新房龄,15.3% 里混着这些因素。

三、户型:市场的主力是哪几档

户型 套数 占比
2室2厅 318 26.86%
2室1厅 283 23.90%
3室2厅 248 20.95%
3室1厅 131 11.06%
4室2厅 100 8.45%
1室1厅 84 7.09%
5室及以上 20 1.69%

两室和三室四档合起来占 82.77%,这是二手房市场的主力。 户型要按房间数排序看,不要按套数排序。按套数排看不出「从小到大」的结构。 七档的均价差得不远,最高 2室2厅 14861 元、最低 5室及以上 12837 元,只差 15.8%。

原因很简单:造数时单价只由区域、装修、房龄、楼层决定,和户型没关系,各档理应持平。 5 室及以上只有 20 套,样本太少,它那个 12837 不能当结论。

四、面积段:一个往上,一个几乎不动

面积段 套数 均价(元) 平均总价(万)
50 以下 56 14248 62.35
50-90 578 14603 106.74
90-130 393 14333 150.97
130-180 138 14625 214.61
180 以上 19 12982 279.53

总价一路往上:从 62.35 万涨到 279.53 万,涨了 4.48 倍。这一段完全符合直觉。 均价却没怎么动:中间三段挤在 14333 到 14625 之间,只有最大一段掉到 12982。 11.2 节那张手写折线图画的是「面积越大单价越低」,一条明显的下坡。

这次真数据只有最后一段对上,中间三段几乎持平。教材的说法在通用市场上成立,在这份数据里不成立。 原因还是那句:造数时没给面积加折扣系数,单价只由区域、装修、房龄、楼层决定。 中间那点起伏来自「区域构成」——大房子更多落在便宜的区域,不是面积本身在起作用。

数据里没有的机制,算不出来。想验证「面积大单价低」,得拿真数据跑,不能拿常识当结论。

五、动手 Demo:装修程度与热门户型分析

装修、户型、面积段,三个分类维度各统计一遍:套数、占比、分组均价。 第五节会拿真数据和 11.2 那张手写折线图对一遍,看对不对得上。

import pandas as pd

df = pd.read_csv("二手房数据_clean.csv")
z = df.groupby("装修").agg(套数=("编号", "count"), 均价=("单价", "mean"))
z["占比"] = z["套数"] / len(df) * 100
print(z.sort_values("均价", ascending=False).round(2).to_string())

h = df.groupby("户型").agg(套数=("编号", "count"),
                          均价=("单价", "mean"),
                          平均面积=("面积", "mean"))
h["占比"] = h["套数"] / len(df) * 100
print(h.sort_values("套数", ascending=False).round(2).to_string())

df["面积段"] = pd.cut(df["面积"], bins=[0, 50, 90, 130, 180, 400],
                       labels=["50 以下", "50-90", "90-130",
                               "130-180", "180 以上"])
b = df.groupby("面积段", observed=True).agg(套数=("编号", "count"),
                                          均价=("单价", "mean"),
                                          平均总价=("总价", "mean"))
print(b.round(2).to_string())

实跑输出:

--------------------------------------------------------------------
装修程度与热门户型分析
--------------------------------------------------------------------

  ① 装修四档,各占多少
  --------------------------------------------------------------------

| 装修 | 套数 | 占比 | 均价(元) |
|---|---:|---:|---:|
| 豪华 | 97 | 8.19% | 17492 |
| 精装 | 378 | 31.93% | 15131 |
| 简装 | 475 | 40.12% | 13989 |
| 未知 | 18 | 1.52% | 13328 |
| 毛坯 | 216 | 18.24% | 13125 |

  四档加一个「未知」,一共五行。「未知」那行是填出来的,不是原来就有的。
  它在均价上排在最后,因为它混着毛坯和简装,谁都不知道。

  ② 毛坯和精装差多少
  --------------------------------------------------------------------
  毛坯 13125 元,精装 15131 元,差 2005 元,精装贵 15.3%。
  这个差价和「装修花多少钱」不是一回事。
  装修花 20 万,摊到 90 平米上是每平米两千多,但市场上认的不止这些。
  造数据时写的是毛坯 0.90、精装 1.08,差两成;跑出来是上面那个数,噪声动了一点。

  ③ 户型分布
  --------------------------------------------------------------------

| 户型 | 套数 | 占比 | 平均面积 | 均价(元) |
|---|---:|---:|---:|---:|
| 2室2厅 | 318 | 26.86% | 85.3 | 14861 |
| 2室1厅 | 283 | 23.90% | 66.4 | 14346 |
| 3室2厅 | 248 | 20.95% | 116.6 | 14273 |
| 3室1厅 | 131 | 11.06% | 93.0 | 14342 |
| 4室2厅 | 100 | 8.45% | 151.6 | 14622 |
| 1室1厅 | 84 | 7.09% | 46.6 | 14438 |
| 5室及以上 | 20 | 1.69% | 212.6 | 12837 |

  套数最多的是 2室2厅,318 套,占 26.86%。
  户型按房间数排好序看,比按套数排更能看出结构。
  两室和三室合起来占 82.77%,这是二手房市场的主力。
  分类变量的统计三件套:频数、占比、分组均值。缺一个都容易被问住。

  ④ 热门户型贵不贵
  --------------------------------------------------------------------
  均价最高的是 2室2厅,14861 元;最低的是 5室及以上,12837 元,差 15.8%。
  七档之间的均价差得不远,最多的一档和最少的一档只差 15.8%。
  造数时单价只由区域、装修、房龄、楼层决定,和户型没关系,所以各户型均价理应差不多。
  5 室及以上只有 20 套,样本太少,它的均价不能当结论。

  ⑤ 把面积切开看总价
  --------------------------------------------------------------------

| 面积段 | 套数 | 占比 | 均价(元) | 平均总价(万) |
|---|---:|---:|---:|---:|
| 50 以下 | 56 | 4.73% | 14248 | 62.35 |
| 50-90 | 578 | 48.82% | 14603 | 106.74 |
| 90-130 | 393 | 33.19% | 14333 | 150.97 |
| 130-180 | 138 | 11.66% | 14625 | 214.61 |
| 180 以上 | 19 | 1.60% | 12982 | 279.53 |

  总价一路往上:从 62.35 万涨到 279.53 万,涨了 4.48 倍。这一段和直觉完全一致。
  均价却没怎么动:14248、14603、14333、14625、12982。最大那一段才明显低下去。
  教材说面积越大单价越低,这次只有最大一段对上,中间三段几乎持平。
  原因是造数据时没给面积加折扣:单价只由区域、装修、房龄、楼层决定。
  中间那点高低起伏来自「区域构成」——大房子更多落在便宜的区域,不是面积本身在起作用。
  ! 数据里没有的机制,算不出来。想验证「面积大单价低」,得拿真数据跑,不能拿常识当结论。

groupby("装修") 会把「未知」也当成一档,这是我们要的——但要记住它是填出来的。 pd.cut 的 bins 是左开右闭:90 落在「90-130」那一档,不落在「50-90」。 observed=True 不能省,尤其换了新版本 pandas,不加会多出一堆空档,均值是 NaN。

30 秒实验

  1. 把「未知」那 18 条删掉,看装修五档的均价各变多少。
  2. 按户型均价排序打印一次,和按套数排序比,看结论有什么不同。
  3. 想一想:如果给造数函数加一条「面积每大 10 平米单价降 1%」,面积段那张表会变成什么样?

常见误区

  1. 把填出来的「未知」当真类别:它混着毛坯和简装,单独解释会得出错的结论。
  2. 户型按套数排序看结构:按房间数排才看得出「小户型多少、大户型多少」。
  3. 拿分组差价当因果:装修好的房子往往地段也好,15.3% 里混着这些因素。
  4. 用常识替代数据:常识说面积大单价低,这份数据里只有最大一段对上。
自测三问(点开对答案) 1. 「未知」那一行该怎么处理才不算误导? —— 单独标出来,说明它是原始缺失填成的,不是一种真实装修档位。 2. 造数写差两成,实测 15.3%,怎么解释? —— 区域构成、档内差异把差距摊薄了。理论值和实测值有差是常态,差得少说明机制对。 3. 为什么面积段的总价一路涨,均价却几乎不动? —— 造数时单价只由区域、装修、房龄、楼层决定,没有面积折扣,所以各段单价理应持平。

三个维度都看完了。最后一篇上模型:把面积、房龄、装修、区域一起喂进去,估一套房。

相关笔记