Lab 4: 房产数据可视化与统计分析实战

课程:数据库技术与应用:AI时代的基石数据技能
授课教师:王健楠 (计算机科学与技术系)
学期:2026年(春季)

实验目的与学习目标

完成本实验后,你应能够:

  1. 掌握探索性数据分析 (EDA) 的基本方法: 能够对真实数据集进行加载、检查、描述性统计和缺失值分析。
  2. 熟练运用可视化手段分析数据: 能够使用折线图、柱状图、直方图、散点图和六边形图等多种图表,从不同角度观察数据特征。
  3. 理解并实现相关性分析方法: 能够从算法层面实现 Pearson 相关系数和 Spearman 等级相关系数,并理解二者的区别与适用场景。
  4. 掌握自助法 (Bootstrapping) 的原理与实现: 能够基于样本数据,使用 Bootstraping 估计总体参数并构建置信区间,量化估计值的不确定性。

实验背景

你正在一家房地产数据分析公司实习。公司获取了温哥华市 2021 年的房产税务评估数据,希望从中挖掘有价值的洞察,为投资决策提供数据支撑。

你的分析工作将分为四个阶段:


评分规则: 共 100 分(4 个任务)。

任务 内容 分值
任务 1 数据探索与预处理 10 分
任务 2 数据可视化分析 25 分
任务 3 相关性分析 35 分
任务 4 自助法统计推断 30 分

作答要求:

第 0 步:数据加载与环境准备

本实验使用温哥华市 2021 年房产税务评估数据集(Vancouver Open Data Portal)。数据集包含 BC Assessment (BCA) 和市政来源的房产信息,涵盖了土地价值、房屋改建价值、建造年份、邮编等字段。

实验提供两份数据文件(位于 Lab-data/ 目录下):

下面的代码将完成数据解压、加载和环境准备。


任务 1:数据探索与预处理(10 分)

任务背景

在进行任何深入分析之前,数据科学家的第一步总是对数据进行探索性分析:了解数据的结构、检查数据质量、处理缺失值,并为后续分析做好准备。

你需要完成

1.1 查看数据基本信息(3 分)

请完成以下操作:

  1. 输出数据集的前 5 行;
  2. 使用 describe() 获取所有数值列的描述性统计信息,并使用 Pandas 的 DataFrame Styler 将数字格式化为不含科学计数法的形式(即不显示浮点指数)。

1.2 缺失值分析(4 分)

我们选择 YEAR_BUILT 列进行分析,该列表示房产的建造年份。

请完成以下操作:

  1. 计算 YEAR_BUILT 列的缺失值比例,并将结果存储在变量 year_built_missing_pct 中(取值范围 0~1);
  2. 输出该比例(保留 4 位小数)。

提示:缺失值在实际数据集中非常常见。在后续分析中,你需要注意缺失值对分析结果的潜在影响。

1.3 数据预处理(3 分)

为后续分析做准备,请添加以下三列并存回 df


任务 2:数据可视化分析(25 分)

任务背景

可视化是探索性数据分析的核心工具。通过不同类型的图表,我们可以从多个角度观察数据中隐藏的规律和异常。

在本任务中,你将使用多种可视化手段分析温哥华房产数据的时间趋势和空间分布特征。

2.1 折线图:各年建造的房产数量(5 分)

绘制一张折线图,展示 1990 年至 2018 年之间,每年建造的房产数量。

要求:

请写下你从上图中观察到的 两个 最有趣的发现。

发现

  1. [请填写]
  2. [请填写]

2.2 柱状图:建造房产最多的前 20 年(5 分)

在 1900 年至 2020 年之间,哪些年份建造的房产最多?请绘制柱状图展示建造房产数量最多的前 20 个年份。

要求:

请写下你从上图中观察到的 两个 最有趣的发现。

发现

  1. [请填写]
  2. [请填写]

2.3 直方图:房产建造数量的分布(5 分)

1990 年至 2020 年间,各年建造的房产数量呈怎样的分布?请绘制直方图回答这一问题。

要求:

请写下你从上图中观察到的 两个 最有趣的发现。

发现

  1. [请填写]
  2. [请填写]

2.4 散点图:建造数量与年份的关系(5 分)

对于建造房产数量超过 2000 的年份,年份和建造数量之间是否存在某种关系?请绘制散点图进行探索。

要求:

请写下你从上图中观察到的 两个 最有趣的发现。

发现

  1. [请填写]
  2. [请填写]

2.5 邮编区域房价分析(5 分)

温哥华的房产价格因地段不同而差异很大。请利用邮编的前三个字符(如 V6AV5K)对房产进行分区,分析不同区域的房价中位数。

请完成以下操作:

  1. PROPERTY_POSTAL_CODE 列提取邮编前三个字符,存入新列 POSTAL_PREFIX(注意:邮编中可能包含空格,需先去除空格再提取;邮编列可能包含缺失值,需妥善处理);
  2. POSTAL_PREFIX 分组,计算每个区域的 HOUSE_PRICE 中位数;
  3. 绘制水平柱状图展示房价中位数最高的前 15 个区域,按中位数降序排列。

请写下你从上图中观察到的 两个 最有趣的发现。

发现

  1. [请填写]
  2. [请填写]

任务 3:相关性分析(35 分)

任务背景

在数据分析中,一个常见的问题是:"A 和 B 之间有关联吗?"例如:

为了回答这类问题,我们需要进行相关性分析。本任务将聚焦于温哥华邮编 V6A 区域(如下图所示),分析该区域内房产建造年份(YEAR_BUILT)与房价(HOUSE_PRICE)之间的关系。

数据筛选

由于房价受地段影响很大,我们只分析邮编以 V6A 开头的房产,并排除 1900 年之前建造的房产。

3.1 散点图与六边形图(7 分)

基于上面筛选得到的 df_v6a,请绘制一行两列的子图:

提示:当数据点很多时,散点图可能出现过度绘制(overplotting),六边形图可以更好地展示数据的密度分布。

请写下你从上图中观察到的 两个 最有趣的发现。

发现

  1. [请填写]
  2. [请填写]

3.2 分位数趋势图(8 分)

为了更精细地观察建造年份与房价的关系,请基于 df_v6a,以 YEAR_BUILT 作为分组依据,计算每年 HOUSE_PRICE 的第 25、50、75 百分位数。

请绘制一行三列的子图,每个子图是一个散点图:

请将计算结果存入 DataFrame dfcor,包含列 YEAR_BUILT25TH_HOUSE_PRICE50TH_HOUSE_PRICE75TH_HOUSE_PRICE

请写下你从上图中观察到的 两个 最有趣的发现。

发现

  1. [请填写]
  2. [请填写]

3.3 实现 Pearson 相关系数(10 分)

Pearson 相关系数衡量两个变量之间的线性相关程度,取值范围为 [-1, 1]。

请实现函数 calc_pearson(df, x, y),计算 DataFrame df 中列 x 和列 y 之间的 Pearson 相关系数。

注意: 不允许使用 pandas.DataFrame.corr()scipy.stats.pearsonr() 等现成函数,请从公式出发自行实现算法。

3.4 实现 Spearman 等级相关系数(10 分)

Spearman 等级相关系数衡量两个变量之间的单调关系(不要求线性),它是对两个变量的排名值计算 Pearson 相关系数。

请实现函数 calc_spearman(df, x, y),计算 DataFrame df 中列 x 和列 y 之间的 Spearman 等级相关系数。

实现步骤:

  1. xy 列的值分别转换为排名(rank);
  2. 对排名值计算 Pearson 相关系数。

注意: 不允许使用 pandas.DataFrame.corr()scipy.stats.spearmanr() 等现成函数。可以使用 pandas.Series.rank() 来获取排名。

计算并分析相关系数

使用你实现的两个函数,分别对 dfcor 中的三对变量计算 Pearson 和 Spearman 相关系数:

请写下你从上述结果中观察到的 两个 最有趣的发现。

发现

  1. [请填写]
  2. [请填写]

任务 4:自助法统计推断(30 分)

任务背景

在实际场景中,我们通常只能获取到数据的一个样本。当你基于样本得出一个结论(例如"温哥华的房价中位数比去年下降了 5%")时,你应当始终追问自己:“这个结论可信吗?

换言之,如果在全量数据上做同样的分析,是否还能得出相同的结论?自助法(Bootstrap) 正是回答这类问题的有力工具:通过对样本进行有放回的重采样,我们可以估计统计量的不确定性,并构建置信区间。

加载样本数据

下面的代码加载抽样数据集,并筛选出 LEGAL_TYPESTRATA(分层产权,通常对应公寓)的记录。

4.1 样本中位数对比可视化(10 分)

请分别计算 PREVIOUS_PRICECURRENT_PRICE 的中位数,并通过柱状图进行对比展示。

要求:

  1. 将两个中位数存储在变量 median_previousmedian_current 中(原始数值,无需换算单位);
  2. 绘制柱状图,X 轴为价格类型(往年 / 当前),Y 轴为中位数;
  3. 添加合适的坐标轴标签和标题。

4.2 自助法实现与置信区间估计(20 分)

从上图中我们观察到样本中两年价格的中位数存在差异。但由于这些数字来自样本,"我们能信任这些数字吗?"

接下来,请实现自助法(Bootstrap),计算每个中位数的 95% 置信区间,并将置信区间以误差线(error bar)的形式添加到柱状图上。

参考资料:MIT 18.05 Bootstrap 教程 第 7 节给出了 Bootstrap 算法的详细描述。

Bootstrap 算法概要:

  1. 设原始样本大小为 $n$,重复以下过程 $B$ 次(建议 $B = 5000$):
    • 从原始样本中有放回地抽取 $n$ 个观测值,组成一个 Bootstrap 样本;
    • 计算该 Bootstrap 样本的中位数。
  2. 得到 $B$ 个中位数后,取第 2.5 百分位和第 97.5 百分位作为 95% 置信区间。

请实现函数 bootstrap_ci(data, num_bootstrap=5000, ci=95)

计算置信区间并可视化

使用你实现的 bootstrap_ci 函数,分别计算 PREVIOUS_PRICECURRENT_PRICE 中位数的 95% 置信区间,并绘制带误差线的柱状图。

请写下你从 Bootstrap 结果中观察到的 两个 最有趣的发现。

发现

  1. [请填写]
  2. [请填写]

实验圆满结束!

恭喜你完成了房产数据可视化与统计分析的全部实战任务!你已经从一份真实数据集出发,完整地走过了数据探索、可视化分析、相关性计算和统计推断的全过程。这些技能将在你后续的数据分析和科研工作中反复用到。

提交前最终检查: