查看全课大纲(第 7 / 35 节)
- 1.特征工程简介
- 2.特征工程的处理流程
- 3.数据与特征概述
- 4.数据统计、相似度与数据探索
- 5.数据探索工具 Pandas_profiling
- 6.工具应用:《泰坦尼克》分析报告
- 7.构造一个微型链家租房数据集用于演示
- 8.数据预处理综述
- 9.缺失值处理实操
- 10.异常值处理实操
- 11.连续值特征构建
- 12.类别型数据特征构建
- 13.特征幅度缩放
- 14.特征离散化
- 15.特征编码:让类别数据参与建模
- 16.特征变换
- 17.时间特征
- 18.特征衍生
- 19.自动化特征工具
- 20.特征选择综述
- 21.特征选择方法
- 22.过滤式特征选择方法实操
- 23.包裹式特征选择方法
- 24.嵌入式特征选择
- 25.混序法与混合法特征选择
- 26.特征降维综述
- 27.案例实操:特征降维
- 28.特征监控概述与指标
- 29.Iris 数据集特征漂移检测案例
- 30.特征监控实战:用分布对比检测数据漂移
- 31.实时特征监控
- 32.电商销量预测项目背景介绍
- 33.数据预处理和特征工程(一)
- 34.数据预处理和特征工程(二)
- 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 工具的核心价值在于,它能以标准化、自动化的方式,快速生成一份全面、直观的数据探索报告。这为特征工程和机器学习建模提供了至关重要的前期输入:
- 建立数据直觉:在编写任何模型代码之前,先对数据的全貌、每个特征的分布、异常情况有一个清晰的了解。
- 发现问题:快速识别缺失值、极端值、数据分布偏斜等问题,为后续的数据清洗和预处理指明方向。
- 启发特征工程:
- 看到类别型特征的分布,可以考虑是否进行类别合并或编码。
- 看到数值型特征的分布和极端值,可以考虑是否进行缩放、离散化(分箱)或异常值处理。
- 观察到面积和价格可能存在的相关性,提示我们这些可能是强特征。
- 了解到“朝阳区”样本最多,在后续建模中可能需要关注样本不均衡问题。
- 固化分析流程:对于任何新拿到手的数据集,都可以首先套用
DataFrame->ProfileReport->.to_file()这个模板,快速启动分析工作。
讲师在视频中反复强调:拿到任何新数据,都可以套用「把数据读成 DataFrame,交给 ProfileReport 生成报告,输出 HTML」这个模板,先拿到数据报告、建立对数据的整体了解,再进入后续的挖掘与建模。这正是我们希望你在本节掌握的核心技能——将高效的数据探索工具融入你的标准工作流。
📝 动手练一练
- 概念辨析:
pandas_profiling生成的数据报告中,对于数值型变量(如“面积”)和类别型变量(如“所在区”),分别会提供哪些不同类型的统计信息和可视化图表?请列举至少三项区别。
👉 点击查看参考答案
数值型变量(如“面积”):
- 提供集中趋势和离散程度的统计量:均值、中位数、标准差、最小值、最大值、四分位数、指定百分位数(如95分位)等。
- 提供分布可视化:直方图(Histogram),展示数据的频率分布。
- 提供极端值(Outliers)列表,展示数值最大和最小的具体样本。
- 会计算该变量与其他数值型变量的相关性系数。
类别型变量(如“所在区”):
- 提供计数统计:每个类别的出现次数(Count)和占比(Percentage)。
- 提供分布可视化:条形图(Bar chart),按频次高低展示各类别。
- 列出所有唯一值及其频次,不提供均值、标准差等数值统计。
- 会检查类别数量是否过多(High cardinality)。
- 动手实践:假设你有一份微型电商商品数据,包含“商品价格”、“销量”和“商品类别”三列。请模仿本节示例,编写一个独立的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个关于数据分布或潜在问题的关键洞察,并记录下来。
- 思考这些洞察将如何影响你后续的数据清洗和特征构建策略(例如,对偏态分布的特征是否考虑变换,对类别众多的特征如何编码等)。
—— 小象教研组