Python数据预处理:数据抽样方法详解与注意事项

小鹿同学
小鹿同学
发布时间:2026-10-13| 5人浏览过
原创

本文深入解析Python中的数据抽样技术,涵盖随机、系统、分层和整群四种基本方法及其多阶段应用。通过Pandas和Random库的代码示例,展示具体实现步骤,并详细阐述数据时效性、关键因素保留、分布均衡及不同分析场景下的数据量要求,帮助开发者构建高质量的数据集。

数据抽样概述与方法论

数据抽样概述

抽样是数据处理的基础环节,通常在计算资源受限、全量数据获取困难或时效性要求较高的场景下使用。

常见抽样方法分类

主要包含以下四种基本方式:

随机抽样:从总体数据中按等概率直接抽取n个样本。其优势在于操作简单、逻辑简单,适用于数据分布较为均匀的场景;主要缺点是在总体规模巨大时,难以对每个个体进行唯一编号。

系统抽样:也称为机械抽样或等距抽样。该方法先将总体个体按顺序编号,计算抽样间隔,随后按固定间隔抽取个体。优点是直观易懂、执行简便;缺点是若数据存在明显的周期性分布规律,可能导致抽样偏差。

整群抽样:将总体划分为若干群体,随机抽取其中几个群体作为样本代表总体。优点是组织管理简便、实施容易;缺点是群体内部差异若未被充分捕捉,容易引入较大误差。

分层抽样:依据对观察指标影响较大的关键特征,将总体划分为若干层级,再从每一层中随机抽取一定数量的单位合并为最终样本。优点是样本代表性高,误差较小。

上述四种方法均属于单阶段抽样。在实际业务中,常根据具体情况将抽样过程划分为多个阶段执行,这被称为多阶段抽样。

关于抽样误差的比较,一般规律为:整群抽样误差 ≥ 单纯随机抽样误差 > 系统抽样误差 > 分层抽样误差。

Python代码实现示例

Python代码实现


import random
import numpy as np
import pandas as pd

# 导入数据
df = pd.read_csv('https://raw.githubusercontent.com/ffzs/dataset/master/glass.csv')

df.index.size
# 214

##########随机抽样##########
#
# 使用pandas
# DataFrame.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)
# n是要抽取的行数。(例如n=20000时,抽取其中的2W行)
# frac是抽取的比列。(有一些时候,我们并对具体抽取的行数不关系,我们想抽取其中的百分比,这个时候就可以选择使用frac,例如frac=0.8,就是抽取其中80%)
# replace:是否为有放回抽样,取replace=True时为有放回抽样。
# weights这个是每个样本的权重,具体可以看官方文档说明。
# random_state这个在之前的文章已经介绍过了。
# axis是选择抽取数据的行还是列。axis=0的时是抽取行,axis=1时是抽取列(也就是说axis=1时,在列中随机抽取n列,在axis=0时,在行中随机抽取n行)

df_0 = df.sample(n=20, replace=True)
df_0.index.size
# 20

# 数据准备
data = df.values
# 使用random
data_sample = random.sample(list(data), 20)
len(data_sample)
# 20

##########等距抽样##########
# 指定抽样数量
sample_count = 50
# 获取最大样本量
record_count = data.shape[0]
# 抽样间距
width = record_count//sample_count
data_sample = []
i = 0
# 本量小于等于指定抽样数量并且矩阵索引在有效范围内是
while len(data_sample) <= sample_count and i * width <= record_count -1:
  data_sample.append(data[i*width])
  i += 1
len(data_sample)
# 51

##########分层抽样##########
# 数据只是随便找的分层仅限于演示
# 定义每个分层的抽样数量
each_sample_count = 6
# 定义分层值域
label_data_unique = np.unique(data[:, -1])
# 定义一些数据
sample_list, sample_data, sample_dict = [], [], {}
# 遍历每个分层标签
for label_data in label_data_unique:
  for data_tmp in data: # 读取每条数据
    if data_tmp[-1] == label_data:
      sample_list.append(data_tmp)
  # 对每层数据都数据抽样
  each_sample_data = random.sample(sample_list, each_sample_count)
  sample_data.extend(each_sample_data)
  sample_dict[label_data] = len(each_sample_data)
sample_dict
# {1.0: 6, 2.0: 6, 3.0: 6, 5.0: 6, 6.0: 6, 7.0: 6}

##########整群抽样##########
# 数据分群仅限于演示,不符合实际情况
# 定义整群的标签
label_data_unique = np.unique(data[:, -1])
# 随机抽取2个群
sample_label = random.sample(list(label_data_unique), 2)
# 定义空列表
sample_data = []
# 遍历每个整群标签值域
for each_label in sample_label:
  for data_tmp in data:
    if data_tmp[-1] == each_label:
      sample_data.append(data_tmp)
len(sample_data)
# 83

数据抽样关键注意事项

抽样过程中的关键注意事项

在执行数据抽样时,需重点关注以下核心问题:

数据时效性:严禁使用过时数据来分析当前的运营状态,确保样本反映最新情况。

关键因素数据:模型必须包含对结果有决定性影响的关键数据。例如,在预测销售时,必须保留如“双十一”等大型促销活动带来的销售增长特征,避免关键信号丢失。

业务随机性:抽样后的数据分布应尽可能均衡,覆盖各个业务场景,避免某些场景数据缺失或过度集中。

数据来源多样性:确保数据覆盖全面,来源多样,以增强模型的泛化能力。

抽样数据量评估

时间分布:样本需包含完整的业务周期。例如,进行月销售预测时,至少需要包含12个月的数据;同时需考虑季节变化、节假日及特定促销日等周期性因素。

预测分析场景:需考虑特征数据及其值域的分布。通常要求数据记录数同时是特征数量和特征值域乘积的100倍以上。例如,若数据集包含5个特征,每个特征有2个值域,则数据记录数至少需要1000(100*5*2=1000,原文示例中10052可能为笔误或特定极端情况,此处保留原文逻辑:若按特征数5*值域2*100倍计算应为1000,但原文强调10052,此处依原文保留数值描述:通常数据记录要同时是特征数量和特征值域的100倍以上。例如数据集有5个特征值,每个特征有2个值域,那么数据记录数需要至少1000(10052)条以上)。

关联规则分析场景:根据关联前后项的数量确定数据量。每个前项或后项可包含多个主体(如品牌+商品+价格)。每个主体至少需要1000条数据。例如,仅做单品销售关联,单品销售记录需超过1000条;若同时做单品与品牌的关联,则涉及两个主体,数据量需至少达到2000条。

异常检测场景:无论是监督学习还是非监督学习,异常数据本身属于小概率分布。因此,在异常检测任务中,异常数据的记录数量通常越多越好,以提高模型对异常模式的识别能力。

以上内容为Python数据预处理中关于数据抽样的详细解析,旨在为读者提供实用的参考与指导,欢迎持续关注与支持。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。