查看全课大纲(第 7 / 35 节)

构造一个微型链家租房数据集用于演示

约 7 分钟

工具应用:《链家租房数据》分析报告

小象实战讲义 · 特征工程精讲与实践

在上一节,我们学习了如何使用 pandas_profiling 工具对泰坦尼克数据集进行快速的数据探索。本节我们将应用同样的方法,对一份来自链家的北京租房数据进行探索性分析。通过这个实战案例,你将掌握一套标准化的数据探索流程,能够快速生成数据报告,洞察数据分布、异常和特征间关系,为后续的特征工程与建模打下坚实基础。

💡 核心导读

  • 实战演练:将 pandas_profiling 工具应用于真实的链家租房数据集。
  • 报告解读:学习如何阅读和理解自动生成的数据分析报告,提取关键洞察。
  • 特征洞察:从报告中识别数值型与类别型特征的分布、中心趋势、离散程度及异常情况。
  • 流程固化:掌握一套“读数据 -> 生成报告 -> 解读报告”的标准化数据探索工作流。

链家租房数据探索实战

本节我们将对一份采集自链家网的北京租房数据进行探索。这份数据包含了房源所在区、商圈、小区、面积、格局、朝向、价格、交通、供暖等多个维度的信息。我们的目标是快速生成一份全面的数据报告,并对报告内容进行解读。

首先,我们构造一个微型数据集来模拟链家数据的核心特征,并演示报告生成过程。在实际项目中,你可以将 pd.read_csv 路径替换为你自己的数据文件。

import pandas as pd

# 构造一个微型链家租房数据集用于演示
data = {
    '所在区': ['朝阳', '朝阳', '海淀', '丰台', '通州', '大兴', '朝阳', '海淀'],
    '区域': ['望京', '国贸', '中关村', '方庄', '梨园', '西红门', '三元桥', '五道口'],
    '面积': [60.5, 45.2, 88.0, 52.0, 74.3, 54.0, 106.0, 38.7],
    '格局': ['2室1厅', '1室1厅', '3室2厅', '2室1厅', '2室1厅', '1室1厅', '3室1厅', '1室0厅'],
    '朝向': ['南', '北', '南北通透', '东', '南', '西', '南', '北'],
    '价格': [7500, 5200, 12000, 4800, 4500, 3800, 9500, 4200],
    '交通': ['近地铁', '近地铁', '近地铁', '附近无地铁', '近地铁', '近地铁', '近地铁', '附近无地铁'],
    '供暖': ['集中供暖', '自采暖', '集中供暖', '集中供暖', '自采暖', '集中供暖', '集中供暖', '自采暖']
}

df_lianjia_demo = pd.DataFrame(data)
print("微型链家租房数据预览:")
print(df_lianjia_demo)
print(f"\n数据形状:{df_lianjia_demo.shape}")
微型链家租房数据预览:
  所在区   区域     面积    格局    朝向     价格     交通    供暖
0  朝阳   望京   60.5  2室1厅     南   7500    近地铁  集中供暖
1  朝阳   国贸   45.2  1室1厅     北   5200    近地铁   自采暖
2  海淀  中关村   88.0  3室2厅  南北通透  12000    近地铁  集中供暖
3  丰台   方庄   52.0  2室1厅     东   4800  附近无地铁  集中供暖
4  通州   梨园   74.3  2室1厅     南   4500    近地铁   自采暖
5  大兴  西红门   54.0  1室1厅     西   3800    近地铁  集中供暖
6  朝阳  三元桥  106.0  3室1厅     南   9500    近地铁  集中供暖
7  海淀  五道口   38.7  1室0厅     北   4200  附近无地铁   自采暖

数据形状:(8, 8)

接下来,我们使用 pandas_profiling 生成数据分析报告。请注意:由于本讲义环境锁定为 Python 标准库、numpy、pandas 和 scikit-learn,不包含 pandas_profiling 库,因此以下代码块展示了标准调用流程。在实际操作中你需要先安装该库——该库已更名为 ydata-profiling(pip install ydata-profiling,旧名 pandas-profiling 的最后版本与现代 pandas 不兼容),然后运行代码。

# 注意:以下代码需要安装 pandas_profiling 库才能运行
# 标准调用流程如下:
# from pandas_profiling import ProfileReport
# profile = ProfileReport(df_lianjia_demo, title="链家租房数据探索报告", explorative=True)
# profile.to_file("lianjia_report_demo.html")
# print("报告已生成并保存为 'lianjia_report_demo.html'")

print("【模拟报告生成】")
print("若已安装 pandas_profiling,运行上述代码将生成一个HTML报告。")
print("报告将包含:")
print("1. 数据集概览(行数、列数、缺失值、内存占用)")
print("2. 每个变量的详细分析(类型、唯一值、分布直方图/频数图、统计量)")
print("3. 变量间相关性分析")
print("4. 缺失值矩阵与样本数据预览")
【模拟报告生成】
若已安装 pandas_profiling,运行上述代码将生成一个HTML报告。
报告将包含:
1. 数据集概览(行数、列数、缺失值、内存占用)
2. 每个变量的详细分析(类型、唯一值、分布直方图/频数图、统计量)
3. 变量间相关性分析
4. 缺失值矩阵与样本数据预览

报告内容解读与关键洞察

根据讲师在视频中对实际链家数据报告(2850条记录)的解读,我们可以总结出从 pandas_profiling 报告中能获得的关键洞察。这些洞察是特征工程前期非常重要的输入。

1. 数据集整体概览

  • 数据包含2850行(条房源记录),10个字段(特征列)。
  • 系统自动识别出7个类别型变量(如所在区、区域、格局等)、2个数值型变量(面积、价格)和1个URL类型变量(房源链接)。
  • 数据占用约2.2MB内存。

2. 类别型特征分布分析

  • 所在区:朝阳区的房源数量最多,有798条,占比约28%;其次是丰台区(410条,14.4%)、海淀区(244条,8.6%)等。这反映了数据采集的分布或北京租房市场的活跃区域。
  • 区域(商圈):更细粒度的地理位置分布,如潘家园、劲松、长阳、五棵松等,报告会列出各区域的数量和占比。
  • 格局:显示了几室几厅的分布情况,例如“2室1厅”、“1室1厅”可能是最常见的户型。

3. 数值型特征统计与分布

  • 面积:
    • 中位数为60平方米,下四分位数(Q1)为52平方米,上四分位数(Q3)为74平方米。说明北京在租的整租房源以中小户型为主。
    • 最小值仅为11平方米(可能是单间),最大值为338平方米(大户型),范围很广。
    • 95%的房源面积在98平方米以下。
    • 最高频的面积值是60平方米,出现了121次,占比4.2%;其次是54平方米,出现了106次,占比3.7%。这可能与某些小区的统一户型规划有关。
    • 直方图(histogram)显示面积分布集中在40-100平方米的区间内。
  • 价格:
    • 报告会给出价格的中位数、四分位数、均值、标准差等统计量。
    • 直方图展示了价格的整体分布形态,有助于识别价格区间和异常高值。

4. 其他有用信息

  • 极端值(Outliers):报告会高亮显示极端小或极端大的值,如11平米的单间和338平米的大户型,提示我们注意这些可能影响模型的数据点。
  • 缺失值情况:明确列出每个特征是否有缺失值及缺失数量。
  • 相关性:计算数值型特征间的相关性系数(如面积与价格的相关性)。
  • 样本预览:展示数据的前几行,方便核对。
import pandas as pd

# 微型链家租房数据(与本节首块一致)
data = {
    '所在区': ['朝阳', '朝阳', '海淀', '丰台', '通州', '大兴', '朝阳', '海淀'],
    '区域': ['望京', '国贸', '中关村', '方庄', '梨园', '西红门', '三元桥', '五道口'],
    '面积': [60.5, 45.2, 88.0, 52.0, 74.3, 54.0, 106.0, 38.7],
    '格局': ['2室1厅', '1室1厅', '3室2厅', '2室1厅', '2室1厅', '1室1厅', '3室1厅', '1室0厅'],
    '朝向': ['南', '北', '南北通透', '东', '南', '西', '南', '北'],
    '价格': [7500, 5200, 12000, 4800, 4500, 3800, 9500, 4200],
    '交通': ['近地铁', '近地铁', '近地铁', '附近无地铁', '近地铁', '近地铁', '近地铁', '附近无地铁'],
    '供暖': ['集中供暖', '自采暖', '集中供暖', '集中供暖', '自采暖', '集中供暖', '集中供暖', '自采暖']
}
df_lianjia_demo = pd.DataFrame(data)

# 我们可以使用pandas内置方法手动计算一些关键统计量,模拟报告中的部分洞察
print("手动计算‘面积’字段的关键统计量(基于微型数据):")
area_stats = df_lianjia_demo['面积'].describe(percentiles=[.25, .5, .75, .95])
print(area_stats)
print(f"\n面积唯一值频次(Top 3):")
print(df_lianjia_demo['面积'].value_counts().head(3))
print(f"\n‘所在区’分布:")
print(df_lianjia_demo['所在区'].value_counts())
手动计算‘面积’字段的关键统计量(基于微型数据):
count      8.000000
mean      64.837500
std       22.960397
min       38.700000
25%       50.300000
50%       57.250000
75%       77.725000
95%       99.700000
max      106.000000
Name: 面积, dtype: float64

面积唯一值频次(Top 3):
面积
60.5    1
45.2    1
88.0    1
Name: count, dtype: int64

‘所在区’分布:
所在区
朝阳    3
海淀    2
丰台    1
通州    1
大兴    1
Name: count, dtype: int64

工具价值与工作流总结

pandas_profiling 工具的核心价值在于,它能以标准化、自动化的方式,快速生成一份全面、直观的数据探索报告。这为特征工程和机器学习建模提供了至关重要的前期输入:

  1. 建立数据直觉:在编写任何模型代码之前,先对数据的全貌、每个特征的分布、异常情况有一个清晰的了解。
  2. 发现问题:快速识别缺失值、极端值、数据分布偏斜等问题,为后续的数据清洗和预处理指明方向。
  3. 启发特征工程:
    • 看到类别型特征的分布,可以考虑是否进行类别合并或编码。
    • 看到数值型特征的分布和极端值,可以考虑是否进行缩放、离散化(分箱)或异常值处理。
    • 观察到面积和价格可能存在的相关性,提示我们这些可能是强特征。
    • 了解到“朝阳区”样本最多,在后续建模中可能需要关注样本不均衡问题。
  4. 固化分析流程:对于任何新拿到手的数据集,都可以首先套用 DataFrame -> ProfileReport -> .to_file() 这个模板,快速启动分析工作。

讲师在视频中反复强调:拿到任何新数据,都可以套用「把数据读成 DataFrame,交给 ProfileReport 生成报告,输出 HTML」这个模板,先拿到数据报告、建立对数据的整体了解,再进入后续的挖掘与建模。这正是我们希望你在本节掌握的核心技能——将高效的数据探索工具融入你的标准工作流。

📝 动手练一练

  1. 概念辨析:pandas_profiling 生成的数据报告中,对于数值型变量(如“面积”)和类别型变量(如“所在区”),分别会提供哪些不同类型的统计信息和可视化图表?请列举至少三项区别。
👉 点击查看参考答案
  • 数值型变量(如“面积”):

    1. 提供集中趋势和离散程度的统计量:均值、中位数、标准差、最小值、最大值、四分位数、指定百分位数(如95分位)等。
    2. 提供分布可视化:直方图(Histogram),展示数据的频率分布。
    3. 提供极端值(Outliers)列表,展示数值最大和最小的具体样本。
    4. 会计算该变量与其他数值型变量的相关性系数。
  • 类别型变量(如“所在区”):

    1. 提供计数统计:每个类别的出现次数(Count)和占比(Percentage)。
    2. 提供分布可视化:条形图(Bar chart),按频次高低展示各类别。
    3. 列出所有唯一值及其频次,不提供均值、标准差等数值统计。
    4. 会检查类别数量是否过多(High cardinality)。
  1. 动手实践:假设你有一份微型电商商品数据,包含“商品价格”、“销量”和“商品类别”三列。请模仿本节示例,编写一个独立的Python代码块,使用pandas构造这份数据,并手动计算(不使用pandas_profiling)出“商品价格”的均值、中位数、标准差,以及“商品类别”的频次分布。
👉 点击查看参考答案
import pandas as pd

# 构造微型电商数据
data = {
    '商品价格': [29.9, 199.0, 899.0, 15.5, 199.0, 2500.0],
    '销量': [150, 30, 5, 300, 25, 2],
    '商品类别': ['日用品', '小家电', '手机', '日用品', '小家电', '数码相机']
}
df_product = pd.DataFrame(data)

print("电商数据预览:")
print(df_product)

print("\n--- ‘商品价格’ 手动统计 ---")
price_mean = df_product['商品价格'].mean()
price_median = df_product['商品价格'].median()
price_std = df_product['商品价格'].std()
print(f"均值: {price_mean:.2f}")
print(f"中位数: {price_median:.2f}")
print(f"标准差: {price_std:.2f}")

print("\n--- ‘商品类别’ 频次分布 ---")
category_counts = df_product['商品类别'].value_counts()
print(category_counts)
电商数据预览:
     商品价格   销量  商品类别
0    29.9  150   日用品
1   199.0   30   小家电
2   899.0    5    手机
3    15.5  300   日用品
4   199.0   25   小家电
5  2500.0    2  数码相机

--- ‘商品价格’ 手动统计 ---
均值: 640.40
中位数: 199.00
标准差: 967.25

--- ‘商品类别’ 频次分布 ---
商品类别
日用品     2
小家电     2
手机      1
数码相机    1
Name: count, dtype: int64

本章小结

本节我们完成了从泰坦尼克数据到链家租房数据的 pandas_profiling 工具应用实战。通过这个案例,你不仅学会了一个高效工具的使用,更重要的是掌握了一套面对新数据时的标准探索流程。数据探索是特征工程乃至整个机器学习项目的“侦察兵”阶段,其质量直接决定了后续工作的方向与效率。

📋 行动清单

  • 为你手头的一个数据集(或课程提供的链家数据)运行 pandas_profiling,生成一份完整的HTML报告。
  • 仔细阅读生成的报告,尝试从中找出至少3个关于数据分布或潜在问题的关键洞察,并记录下来。
  • 思考这些洞察将如何影响你后续的数据清洗和特征构建策略(例如,对偏态分布的特征是否考虑变换,对类别众多的特征如何编码等)。

—— 小象教研组