找回密码
 立即注册
首页 业界区 业界 告别盲人摸象,数据分析的抽样方法总结 ...

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

曲愍糙 2025-11-29 09:15:01
当你踏入数据分析的大门时,可能会被海量的数据淹没,感到无从下手。
想象一下,你想了解一座巨大森林里所有树木的平均高度,难道要一棵一棵地去测量吗?这显然不现实。
这时,“抽样” 这个强大的工具就该登场了!
本文将带你全面了解各种抽样方法,并用Python代码演示实际应用。
1. 抽样是什么?

抽样 是从总体中选取部分样本进行分析的过程。
这样做的主要原因是:

  • 节省时间和资源:处理全部数据成本高昂
  • 可行性:当总体无限或无法完全获取时
  • 效率:快速获得初步分析结果
抽样的世界里,主要有两种不同的理念,形成了两大阵营:

  • 非随机抽样:抽样过程不遵循随机原则,而是根据研究人员的主观经验或方便性来选择样本。这种方法简单、快速、成本低,适用于探索性研究或对时效性要求高的场景。
  • 随机抽样:也称为概率抽样,它遵循随机原则,确保总体中的每个单位都有一定的机会被抽中。这种方法专业性强,可以客观地衡量抽样误差,是数据分析中更常用、更科学的方法。
接下来,我们将重点介绍几种主流的抽样方法。
2. 非随机抽样

非随机抽样虽然在严谨的数据分析中需要谨慎使用,但在某些场景下依然有其价值。
它的实现原理是:根据研究者的主观判断、方便程度或特定需求来选择样本,不保证每个个体都有被抽中的机会。
常见的非随机抽样包括方便抽样判断抽样滚雪球抽样等。
典型的应用场景有:

  • 产品初期快速的用户访谈:在产品开发的早期阶段,为了快速收集用户反馈,可能会在公司门口或附近的咖啡馆随机邀请用户进行简短访谈。
  • 特定人群的深度研究:研究某个罕见病群体时,可以通过医生推荐或患者社群来寻找研究对象,这类似于滚雪球抽样。
下面用Python实现一个简单的非随机抽样的示例。
  1. import pandas as pd
  2. import numpy as np
  3. # 模拟创建一个包含1000名用户的数据集
  4. np.random.seed(42)
  5. data = {
  6.     'user_id': range(1, 1001),
  7.     'age': np.random.randint(18, 60, size=1000),
  8.     'city': np.random.choice(['北京', '上海', '广州', '深圳', '杭州'], size=1000),
  9.     'activity_score': np.random.randint(1, 101, size=1000) # 活跃度评分,1-100
  10. }
  11. df = pd.DataFrame(data)
  12. # 非随机抽样:判断抽样
  13. # 我们主观判断活跃度分数高于90的用户为高活跃度代表
  14. high_activity_sample = df[df['activity_score'] > 90]
  15. print("判断抽样(活跃度>90)的样本量:", len(high_activity_sample))
  16. print(high_activity_sample.head())
复制代码
运行结果:
1.png

3. 随机抽样

随机抽样是数据分析的基石,它能确保样本的代表性,从而让我们的分析结论更具说服力
随机抽样一般有下面四种方式:
3.1. 简单随机抽样

这是最基础的随机抽样方法,确保总体中每个个体被抽中的概率完全相等。
就像从一个装满小球的箱子里随机摸球一样,每个球被摸到的机会都是一样的。
它的典型应用场景有:

  • 满意度调查:从全体用户中随机抽取一部分发送满意度调查问卷。
  • A/B测试用户分组:将参与测试的用户随机分配到A组B组,确保两组用户在初始状态下没有系统性差异。
下面是Python实现的一个简单随机抽样示例。
先创建测试数据,这些数据在后面其他随机抽样示例中也会使用。
  1. # 创建模拟数据集:某公司客户数据
  2. np.random.seed(42)  # 设置随机种子保证结果可重现
  3. customer_data = pd.DataFrame({
  4.     'customer_id': range(1, 1001),
  5.     'age': np.random.randint(18, 70, 1000),
  6.     'income': np.random.normal(50000, 15000, 1000).astype(int),
  7.     'satisfaction_score': np.random.randint(1, 11, 1000)
  8. })
  9. print("原始数据集概况:")
  10. print(f"数据量:{len(customer_data)}")
  11. print(f"平均收入:{customer_data['income'].mean():.2f}")
  12. print(f"平均满意度:{customer_data['satisfaction_score'].mean():.2f}")
  13. # 运行结果:
  14. '''
  15. 原始数据集概况:
  16. 数据量:1000
  17. 平均收入:50863.12
  18. 平均满意度:5.39
  19. '''
复制代码
然后进行简单随机抽样:
  1. # 简单随机抽样
  2. simple_random_sample = customer_data.sample(n=50, random_state=42)
  3. print("简单随机抽样结果:")
  4. print(f"样本量:{len(simple_random_sample)}")
  5. print(f"样本平均收入:{simple_random_sample['income'].mean():.2f}")
  6. print(f"样本平均满意度:{simple_random_sample['satisfaction_score'].mean():.2f}")
  7. # 运行结果:
  8. '''
  9. 简单随机抽样结果:
  10. 样本量:50
  11. 样本平均收入:48647.12
  12. 样本平均满意度:4.76
  13. '''
复制代码
抽样数据总体数据相比,收入分布满意度分布情况如下:
2.png

3.2. 分层随机抽样

分层随机抽样是先将总体按照某种特征分成若干个互不重叠的“层”,然后在每个层内部分别进行简单随机抽样。
这种方法可以保证样本的结构与总体的结构相似,特别适用于总体内部差异较大的情况。
它的典型应用场景有:

  • 不同城市用户的消费习惯分析:为了解全国用户的消费习惯,可以先将用户按城市(如一线、新一线、二线城市)分层,再从每一层中按比例抽取用户进行研究,确保样本中各城市的用户比例与总体一致。
  • 不同年级学生的学习情况调查:将学生按年级分层,再从各年级中抽取一定比例的学生进行调查。
下面是Python实现的一个分层随机抽样示例。
  1. # 创建分层:按年龄分组
  2. customer_data["age_group"] = pd.cut(
  3.     customer_data["age"],
  4.     bins=[0, 30, 45, 60, 100],
  5.     labels=["青年", "中青年", "中年", "中老年"],
  6. )
  7. print("各年龄组人数:")
  8. print(customer_data["age_group"].value_counts())
  9. # 分层随机抽样:每层按比例抽取
  10. stratified_sample = (
  11.     customer_data.groupby("age_group", observed=False)
  12.     .apply(
  13.         lambda x: x.sample(frac=0.05, random_state=42),
  14.         include_groups=False,
  15.     )
  16.     .reset_index()
  17. )
  18. print("\n分层随机抽样结果:")
  19. print(f"样本量:{len(stratified_sample)}")
  20. print("样本中各年龄组分布:")
  21. print(stratified_sample["age_group"].value_counts())
  22. # 运行结果:
  23. '''
  24. 各年龄组人数:
  25. age_group
  26. 中青年    297
  27. 中年     282
  28. 青年     238
  29. 中老年    183
  30. Name: count, dtype: int64
  31. 分层随机抽样结果:
  32. 样本量:50
  33. 样本中各年龄组分布:
  34. age_group
  35. 中青年    15
  36. 中年     14
  37. 青年     12
  38. 中老年     9
  39. Name: count, dtype: int64
  40. '''
复制代码
分层随机抽样简单随机抽样,以及总体数据对于平均收入的估计如下:
3.png

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

系统随机抽样是将总体中的所有单位按一定顺序排列,然后按照固定的间隔(步长)来抽取样本。
比如,从1000人中抽取100人,可以每隔10人抽取1人。
它的典型应用场景有:

  • 生产线产品质量检测:每隔100件产品,抽取1件进行质量检测。
  • 电话调查:从电话号码簿中,每隔50个号码抽取一个进行访问。
下面是Python实现的一个系统随机抽样示例。
  1. # 系统随机抽样
  2. def systematic_sampling(data, step):
  3.     start = np.random.randint(0, step)
  4.     indices = range(start, len(data), step)
  5.     return data.iloc[indices]
  6. systematic_sample = systematic_sampling(customer_data, 20)  # 每20个抽1个
  7. print("系统随机抽样结果:")
  8. print(f"样本量:{len(systematic_sample)}")
  9. print(f"样本平均收入:{systematic_sample['income'].mean():.2f}")
  10. # 运行结果:
  11. '''
  12. 系统随机抽样结果:
  13. 样本量:50
  14. 样本平均收入:50763.34
  15. '''
复制代码
系统随机抽样的示意图如下:
4.png

3.4. 整群随机抽样

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

  • 城市居民健康调查:将城市划分为若干个社区(群),随机抽取几个社区,然后对这几个社区的所有居民进行健康调查。
  • 全国多所学校的学生视力普查:将全国的学校作为“群”,随机抽取几十所学校,然后对这些学校的所有学生进行视力检查。
下面是Python实现的一个整群随机抽样示例。
  1. # 创建模拟的群组数据:假设客户按地区分组
  2. regions = ['北京', '上海', '广州', '深圳', '杭州', '成都', '武汉', '西安']
  3. customer_data['region'] = np.random.choice(regions, len(customer_data))
  4. print("各地区客户数量:")
  5. print(customer_data['region'].value_counts())
  6. # 整群随机抽样:随机选择3个地区,调查这些地区的所有客户
  7. selected_regions = np.random.choice(regions, size=3, replace=False)
  8. cluster_sample = customer_data[customer_data['region'].isin(selected_regions)]
  9. print(f"\n抽中的地区:{selected_regions}")
  10. print("整群随机抽样结果:")
  11. print(f"样本量:{len(cluster_sample)}")
  12. print(f"样本平均收入:{cluster_sample['income'].mean():.2f}")
  13. print(f"总体平均收入:{customer_data['income'].mean():.2f}")
  14. # 运行结果:
  15. '''
  16. 各地区客户数量:
  17. region
  18. 武汉    141
  19. 广州    133
  20. 成都    132
  21. 杭州    124
  22. 北京    120
  23. 上海    118
  24. 深圳    116
  25. 西安    116
  26. Name: count, dtype: int64
  27. 抽中的地区:['杭州' '深圳' '武汉']
  28. 整群随机抽样结果:
  29. 样本量:381
  30. 样本平均收入:50319.75
  31. 总体平均收入:50863.12
  32. '''
复制代码
整群随机抽样得到的平均收入与总体数据的比较如下图:它们的值非常接近。
5.png

4. 随机抽样综合比较

为了更直观地感受不同抽样方法带来的差异,我们从同一个数据集中,使用不同的方法抽取大约相同规模的样本,来比较各种抽样方法。
  1. # 创建更复杂的数据集来演示各种抽样方法
  2. np.random.seed(42)
  3. company_data = pd.DataFrame(
  4.     {
  5.         "employee_id": range(1, 1001),
  6.         "department": np.random.choice(
  7.             ["技术", "销售", "市场", "人事", "财务"],
  8.             1000,
  9.             p=[0.3, 0.25, 0.2, 0.15, 0.1],
  10.         ),
  11.         "salary": np.random.normal(80000, 20000, 1000).astype(int),
  12.         "experience": np.random.exponential(5, 1000).astype(int) + 1,
  13.     }
  14. )
  15. # 修正可能的负工资
  16. company_data["salary"] = company_data["salary"].clip(lower=30000)
  17. print("公司员工数据概况:")
  18. print(f"总员工数:{len(company_data)}")
  19. print(f"平均工资:{company_data['salary'].mean():.2f}")
  20. print("\n各部门人数:")
  21. print(company_data["department"].value_counts())
  22. # 应用不同抽样方法
  23. samples = {
  24.     "简单随机抽样": company_data.sample(n=100, random_state=42),
  25.     "分层随机抽样": company_data.groupby("department")
  26.     .apply(lambda x: x.sample(frac=0.1, random_state=42), include_groups=False)
  27.     .reset_index(),
  28.     "系统随机抽样": systematic_sampling(company_data, 10),
  29.     "整群随机抽样": company_data[
  30.         company_data["department"].isin(
  31.             np.random.choice(company_data["department"].unique(), 2, replace=False)
  32.         )
  33.     ],
  34. }
  35. # 比较结果
  36. comparison = pd.DataFrame(
  37.     {
  38.         "方法": ["总体"] + list(samples.keys()),
  39.         "样本量": [len(company_data)] + [len(sample) for sample in samples.values()],
  40.         "平均工资": [company_data["salary"].mean()]
  41.         + [sample["salary"].mean() for sample in samples.values()],
  42.         "工资误差": [0]
  43.         + [
  44.             abs(sample["salary"].mean() - company_data["salary"].mean())
  45.             for sample in samples.values()
  46.         ],
  47.     }
  48. )
  49. print("\n各种抽样方法比较:")
  50. print(comparison)
  51. # 运行结果:
  52. '''
  53. 公司员工数据概况:
  54. 总员工数:1000
  55. 平均工资:82015.16
  56. 各部门人数:
  57. department
  58. 技术    319
  59. 销售    240
  60. 市场    198
  61. 人事    143
  62. 财务    100
  63. Name: count, dtype: int64
  64. '''
复制代码
6.png

7.png

5. 总结

本文介绍了常用的抽样方法,并给出了各种抽样方法的典型应用场景以及Python代码实现方式。
重点是四种随机抽样的方法,选择抽样方法时需要考虑:

  • 研究目的:探索性分析可用非随机抽样,正式研究需用随机抽样
  • 总体特征:如果总体有明显分层,考虑分层抽样
  • 资源限制:整群抽样通常成本较低
  • 精度要求:分层抽样通常精度较高
记住,没有 "最好" 的抽样方法,只有 "最合适" 的。
在实际工作中,要根据具体情况灵活选择和组合使用不同的抽样方法。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册