news 2026/5/8 0:56:01

告别盲人摸象,数据分析的抽样方法总结

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
告别盲人摸象,数据分析的抽样方法总结

当你踏入数据分析的大门时,可能会被海量的数据淹没,感到无从下手。

想象一下,你想了解一座巨大森林里所有树木的平均高度,难道要一棵一棵地去测量吗?这显然不现实。

这时,“抽样” 这个强大的工具就该登场了!

本文将带你全面了解各种抽样方法,并用Python代码演示实际应用。

1. 抽样是什么?

抽样 是从总体中选取部分样本进行分析的过程。

这样做的主要原因是:

节省时间和资源:处理全部数据成本高昂

可行性:当总体无限或无法完全获取时

效率:快速获得初步分析结果

在抽样的世界里,主要有两种不同的理念,形成了两大阵营:

非随机抽样:抽样过程不遵循随机原则,而是根据研究人员的主观经验或方便性来选择样本。这种方法简单、快速、成本低,适用于探索性研究或对时效性要求高的场景。

随机抽样:也称为概率抽样,它遵循随机原则,确保总体中的每个单位都有一定的机会被抽中。这种方法专业性强,可以客观地衡量抽样误差,是数据分析中更常用、更科学的方法。

接下来,我们将重点介绍几种主流的抽样方法。

2. 非随机抽样

非随机抽样虽然在严谨的数据分析中需要谨慎使用,但在某些场景下依然有其价值。

它的实现原理是:根据研究者的主观判断、方便程度或特定需求来选择样本,不保证每个个体都有被抽中的机会。

常见的非随机抽样包括方便抽样、判断抽样、滚雪球抽样等。

典型的应用场景有:

产品初期快速的用户访谈:在产品开发的早期阶段,为了快速收集用户反馈,可能会在公司门口或附近的咖啡馆随机邀请用户进行简短访谈。

特定人群的深度研究:研究某个罕见病群体时,可以通过医生推荐或患者社群来寻找研究对象,这类似于滚雪球抽样。

下面用Python实现一个简单的非随机抽样的示例。

import pandas as pd

import numpy as np

# 模拟创建一个包含1000名用户的数据集

np.random.seed(42)

data = {

'user_id': range(1, 1001),

'age': np.random.randint(18, 60, size=1000),

'city': np.random.choice(['北京', '上海', '广州', '深圳', '杭州'], size=1000),

'activity_score': np.random.randint(1, 101, size=1000) # 活跃度评分,1-100

}

df = pd.DataFrame(data)

# 非随机抽样:判断抽样

# 我们主观判断活跃度分数高于90的用户为高活跃度代表

high_activity_sample = df[df['activity_score'] > 90]

print("判断抽样(活跃度>90)的样本量:", len(high_activity_sample))

print(high_activity_sample.head())

运行结果:

3. 随机抽样

随机抽样是数据分析的基石,它能确保样本的代表性,从而让我们的分析结论更具说服力。

随机抽样一般有下面四种方式:

3.1. 简单随机抽样

这是最基础的随机抽样方法,确保总体中每个个体被抽中的概率完全相等。

就像从一个装满小球的箱子里随机摸球一样,每个球被摸到的机会都是一样的。

它的典型应用场景有:

满意度调查:从全体用户中随机抽取一部分发送满意度调查问卷。

A/B测试用户分组:将参与测试的用户随机分配到A组和B组,确保两组用户在初始状态下没有系统性差异。

下面是Python实现的一个简单随机抽样示例。

先创建测试数据,这些数据在后面其他随机抽样示例中也会使用。

# 创建模拟数据集:某公司客户数据

np.random.seed(42) # 设置随机种子保证结果可重现

customer_data = pd.DataFrame({

'customer_id': range(1, 1001),

'age': np.random.randint(18, 70, 1000),

'income': np.random.normal(50000, 15000, 1000).astype(int),

'satisfaction_score': np.random.randint(1, 11, 1000)

})

print("原始数据集概况:")

print(f"数据量:{len(customer_data)}")

print(f"平均收入:{customer_data['income'].mean():.2f}")

print(f"平均满意度:{customer_data['satisfaction_score'].mean():.2f}")

# 运行结果:

'''

原始数据集概况:

数据量:1000

平均收入:50863.12

平均满意度:5.39

'''

然后进行简单随机抽样:

# 简单随机抽样

simple_random_sample = customer_data.sample(n=50, random_state=42)

print("简单随机抽样结果:")

print(f"样本量:{len(simple_random_sample)}")

print(f"样本平均收入:{simple_random_sample['income'].mean():.2f}")

print(f"样本平均满意度:{simple_random_sample['satisfaction_score'].mean():.2f}")

# 运行结果:

'''

简单随机抽样结果:

样本量:50

样本平均收入:48647.12

样本平均满意度:4.76

'''

抽样数据与总体数据相比,收入分布和满意度分布情况如下:

3.2. 分层随机抽样

分层随机抽样是先将总体按照某种特征分成若干个互不重叠的“层”,然后在每个层内部分别进行简单随机抽样。

这种方法可以保证样本的结构与总体的结构相似,特别适用于总体内部差异较大的情况。

它的典型应用场景有:

不同城市用户的消费习惯分析:为了解全国用户的消费习惯,可以先将用户按城市(如一线、新一线、二线城市)分层,再从每一层中按比例抽取用户进行研究,确保样本中各城市的用户比例与总体一致。

不同年级学生的学习情况调查:将学生按年级分层,再从各年级中抽取一定比例的学生进行调查。

下面是Python实现的一个分层随机抽样示例。

# 创建分层:按年龄分组

customer_data["age_group"] = pd.cut(

customer_data["age"],

bins=[0, 30, 45, 60, 100],

labels=["青年", "中青年", "中年", "中老年"],

)

print("各年龄组人数:")

print(customer_data["age_group"].value_counts())

# 分层随机抽样:每层按比例抽取

stratified_sample = (

customer_data.groupby("age_group", observed=False)

.apply(

lambda x: x.sample(frac=0.05, random_state=42),

include_groups=False,

)

.reset_index()

)

print("\n分层随机抽样结果:")

print(f"样本量:{len(stratified_sample)}")

print("样本中各年龄组分布:")

print(stratified_sample["age_group"].value_counts())

# 运行结果:

'''

各年龄组人数:

age_group

中青年 297

中年 282

青年 238

中老年 183

Name: count, dtype: int64

分层随机抽样结果:

样本量:50

样本中各年龄组分布:

age_group

中青年 15

中年 14

青年 12

中老年 9

Name: count, dtype: int64

'''

分层随机抽样和简单随机抽样,以及总体数据对于平均收入的估计如下:

从图中可以看出,分层随机抽样更接近于总体的值。

3.3. 系统随机抽样

系统随机抽样是将总体中的所有单位按一定顺序排列,然后按照固定的间隔(步长)来抽取样本。

比如,从1000人中抽取100人,可以每隔10人抽取1人。

它的典型应用场景有:

生产线产品质量检测:每隔100件产品,抽取1件进行质量检测。

电话调查:从电话号码簿中,每隔50个号码抽取一个进行访问。

下面是Python实现的一个系统随机抽样示例。

# 系统随机抽样

def systematic_sampling(data, step):

start = np.random.randint(0, step)

indices = range(start, len(data), step)

return data.iloc[indices]

systematic_sample = systematic_sampling(customer_data, 20) # 每20个抽1个

print("系统随机抽样结果:")

print(f"样本量:{len(systematic_sample)}")

print(f"样本平均收入:{systematic_sample['income'].mean():.2f}")

# 运行结果:

'''

系统随机抽样结果:

样本量:50

样本平均收入:50763.34

'''

系统随机抽样的示意图如下:

3.4. 整群随机抽样

整群随机抽样是将总体划分为若干个互不重叠的“群”,然后随机抽取其中的若干个群,对抽中的群里的所有单位进行调查。

它的典型应用场景是:

城市居民健康调查:将城市划分为若干个社区(群),随机抽取几个社区,然后对这几个社区的所有居民进行健康调查。

全国多所学校的学生视力普查:将全国的学校作为“群”,随机抽取几十所学校,然后对这些学校的所有学生进行视力检查。

下面是Python实现的一个整群随机抽样示例。

# 创建模拟的群组数据:假设客户按地区分组

regions = ['北京', '上海', '广州', '深圳', '杭州', '成都', '武汉', '西安']

customer_data['region'] = np.random.choice(regions, len(customer_data))

print("各地区客户数量:")

print(customer_data['region'].value_counts())

# 整群随机抽样:随机选择3个地区,调查这些地区的所有客户

selected_regions = np.random.choice(regions, size=3, replace=False)

cluster_sample = customer_data[customer_data['region'].isin(selected_regions)]

print(f"\n抽中的地区:{selected_regions}")

print("整群随机抽样结果:")

print(f"样本量:{len(cluster_sample)}")

print(f"样本平均收入:{cluster_sample['income'].mean():.2f}")

print(f"总体平均收入:{customer_data['income'].mean():.2f}")

# 运行结果:

'''

各地区客户数量:

region

武汉 141

广州 133

成都 132

杭州 124

北京 120

上海 118

深圳 116

西安 116

Name: count, dtype: int64

抽中的地区:['杭州' '深圳' '武汉']

整群随机抽样结果:

样本量:381

样本平均收入:50319.75

总体平均收入:50863.12

'''

整群随机抽样得到的平均收入与总体数据的比较如下图:它们的值非常接近。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 0:49:14

PCB设计文件终极指南:用Python轻松解析Gerber和Excellon文件

PCB设计文件终极指南:用Python轻松解析Gerber和Excellon文件 【免费下载链接】pcb-tools Tools to work with PCB data (Gerber, Excellon, NC files) using Python. 项目地址: https://gitcode.com/gh_mirrors/pc/pcb-tools 在PCB设计和制造过程中&#xff…

作者头像 李华
网站建设 2026/4/26 11:56:01

跨平台翻译神器pot-desktop:打破语言障碍的智能助手

跨平台翻译神器pot-desktop:打破语言障碍的智能助手 【免费下载链接】pot-desktop 🌈一个跨平台的划词翻译和OCR软件 | A cross-platform software for text translation and recognize. 项目地址: https://gitcode.com/pot-app/pot-desktop 在全…

作者头像 李华
网站建设 2026/4/27 11:12:55

快速自定义Home Assistant图表:Mini Graph Card终极指南

快速自定义Home Assistant图表:Mini Graph Card终极指南 【免费下载链接】mini-graph-card Minimalistic graph card for Home Assistant Lovelace UI 项目地址: https://gitcode.com/gh_mirrors/mi/mini-graph-card 想要为你的Home Assistant仪表板添加专业…

作者头像 李华
网站建设 2026/5/7 15:49:48

10分钟搞定CVAT:构建高效计算机视觉标注工作流全指南

10分钟搞定CVAT:构建高效计算机视觉标注工作流全指南 【免费下载链接】cvat Annotate better with CVAT, the industry-leading data engine for machine learning. Used and trusted by teams at any scale, for data of any scale. 项目地址: https://gitcode.c…

作者头像 李华
网站建设 2026/5/8 4:08:22

DeepSeek-V3 KV缓存优化终极指南:实现多轮对话性能飙升

DeepSeek-V3 KV缓存优化终极指南:实现多轮对话性能飙升 【免费下载链接】DeepSeek-V3 项目地址: https://gitcode.com/GitHub_Trending/de/DeepSeek-V3 在当今的AI对话系统中,用户期望获得与人类对话相似的流畅体验。然而,传统的Tran…

作者头像 李华
网站建设 2026/4/23 5:51:17

SSE推送技术深度解析:构建企业级实时消息系统

SSE推送技术深度解析:构建企业级实时消息系统 【免费下载链接】RuoYi-Cloud-Plus 微服务管理系统 重写RuoYi-Cloud所有功能 整合 SpringCloudAlibaba、Dubbo3.0、Sa-Token、Mybatis-Plus、MQ、Warm-Flow工作流、ES、Docker 全方位升级 定期同步 项目地址: https:/…

作者头像 李华