数据预处理Part6——数据抽样

1. 什么是抽样?

  抽样是从整体样本中通过一定的方法选择一部分样本。抽样是数据处理的基本步骤之一,也是科学实验、质量检验、社会调查普遍采用的一种经济有效的工作和研究方法。

2.为什么要抽样?

  抽样工作在数据获取较少或处理大量数据比较困难的时期非常流行,主要是因为以下几种原因:

  • 数据计算资源不足。计算机硬件的限制是导致抽样产生的基本原因之一,尤其是在数据密集的生物、科学工程等领域,不抽样往往无法对海量数据进行计算。
  • 数据采集限制。很多时候抽样从数据采集端便已经开始,例如做社会调查必须采用抽样方法进行研究,因为根本无法对所有人群进行调查。
  • 时效性要求。抽样带来的是以局部反映全局的思路,如果方法正确,可以以极小的数据计算量来实现对整体数据的统计分析,在时效性上会大大增强。

  如果存在上述条件限制或类似强制性要求,那么抽样工作仍然必不可少。但是上述几种原因随着科技的发展已经不算问题。那么抽样工作是否就没有必要了?其实不是的,还有很多场景依然需要通过抽样方法来解决具体问题。

  • 通过抽样来实现快速的概念验证
  • 通过抽样来解决样本不均衡问题
  • 无法实现对全部样本覆盖的场景。典型场景如客户线下调研,用户满意度调查等无法对所有样本进行数据采集,分析、处理和建模。
  • 定性分析的工作需要。

3. 怎么进行抽样?

  抽样方法从整体上分为非概率抽样和概率抽样两种。非概率抽样不是按照等概率的原则进行走样,而是根据人类的主观经验和状态进行判断;概率抽样则是以数学概率论为基础,按照随机的原则进行抽样。本文主要介绍概率抽样

3.1 简单随机抽样

  该抽样方法是按照等概率原则直接从总样本中抽取n个样本。这种随机抽样方法简单、易于操作,但是它并不能保证样本能完美代替总体。这种抽样的基本前提是所有样本个体都是等概率分布的,但真实情况却是多数样本都不是或无法判断是否是等概率分布的,在简单随机抽样中,得到的结果是不重复的样本集,还可以使用有放回的简单随机抽样,这样得到的样本集中会存在重复数据。该方法适合个体分布均匀的场景。

代码实现:

引包:

import pandas as pd
import numpy as np
import random

数据加载:

data= np.loadtxt('data3.txt')
len(data)

10000

简单随机抽样:

data_sample = random.sample(range(len(data)),2000) # 在数据集中随机抽取2000个样本
len(data_sample) # 抽样后的数据样本数

2000

3.2 等距抽样

  等距抽样是先将总体中的每个个体按顺序编号,然后计算出抽样间隔,在按照固定抽样间隔抽取个体。这种操作方法易于理解、简单易行,但当总体样本的分布呈现明显的分布规律时容易产生偏差,例如增减趋势、周期性规律等等。该方法适用于个体分布均匀或呈现明显的均匀分布规律,无明显趋势或周期性规律的数据

将数据分份:

data_count = len(data) # 原始数据总个数
sample_count = 2000 # 抽取后样本个数
interval = int(data_count/sample_count) # 计算抽样间隔
interval

5

等距抽样:

i = 0
data_sample = []
while len(data_sample) <= sample_count and i*interval < data_count:
	# 当样本量小于等于指定抽样数量并且索引不超出原样本时,进行数据抽样
    data_sample.append(data[i*interval]) # 添加抽取样本
    i += 1
data_sample[:5]

在这里插入图片描述
查看抽取样本数:

len(data_sample)

2000

3.3 分层抽样

  分层抽样时先将所有个体样本按照某种特征划分为几个类别,然后从每个类别中使用随机抽样或等距抽样的方法选择个体组成样本。这种操作方法能明显降低抽样误差,并且便于针对不同类别的数据样本进行单独研究,因此是一种较好的实现方法。该方法适用于带有分类逻辑的属性、标签等特征的数据。

加载数据:

data2 = np.loadtxt('data2.txt')
data2

在这里插入图片描述

each_sample_count = 200 # 指定抽样个数
label_data_unique = np.unique(data2[:,-1]) # 查看标签类别
label_data_unique # 标签为0或1,共两类

array([0., 1.])

分层抽样:

sample_data = [] # 抽样样本集
sample_dict = {} # 统计分类个数
for label_data in label_data_unique:
    sample_list = []
    for data_tmp in data2:
        if data_tmp[-1] == label_data: # 如果源数据标签等于0或1,添加到抽样样本集中
            sample_list.append(data_tmp)
    each_sample_data = random.sample(sample_list,each_sample_count) # 随机抽取200个样本
    sample_data.append(each_sample_data)
    sample_dict[label_data] = len(each_sample_data)
sample_dict

{0.0: 200, 1.0: 200}

3.4 整群抽样

  整群抽样是先将所有样本分为几个小群体集,然后随机抽样几个小群体集来代表总体。这种操作方法与之前的3种方法的差异点在于该方法抽样的是小群体集,而不是每个数据个体本身。该方法虽然简单易行,但是样本的分布首先与小群体集的划分,抽样误差较大。这种方法适用于小群体集的特征差异较小的数据,并且对划分小群体集有更高要求。

加载数据:

data4 = np.loadtxt("data4.txt")
len(data)

10000

查看标签类别数:

label_data_unique = np.unique(data4[:,-1])
label_data_unique

array([0., 1., 2., 3.])

随机抽取2类:

sanple_label = random.sample(list(label_data_unique),2) # 因为随机选择,每次抽取是不同的
sanple_label

[3.0, 2.0]

sample_list = []
for label in sample_label:
    for data_tmp in data4:
        if data_tmp[-1] == label:
            sample_list.append(data_tmp)
sample_list[:5]

在这里插入图片描述
查看抽取样本数:

len(sample_list)

504

参考资料:《Python数据分析与数据化运营

关联文章

数据预处理Part1——数据清洗
数据预处理Part2——数据标准化
数据预处理Part3——真值转换
数据预处理Part4——数据离散化
数据预处理Part5——样本分布不均衡
数据预处理Part7——特征选择
数据预处理Part8——数据共线性
数据预处理Part9——数据降维

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值