告别盲人摸象,数据分析的抽样方法总结
<p>当你踏入数据分析的大门时,可能会被海量的数据淹没,感到无从下手。</p><p>想象一下,你想了解一座巨大森林里所有树木的平均高度,难道要一棵一棵地去测量吗?这显然不现实。</p>
<p>这时,<strong>“抽样”</strong> 这个强大的工具就该登场了!</p>
<p>本文将带你全面了解各种<strong>抽样方法</strong>,并用<code>Python</code>代码演示实际应用。</p>
<h1 id="1-抽样是什么">1. 抽样是什么?</h1>
<p><strong>抽样</strong> 是从总体中选取部分样本进行分析的过程。</p>
<p>这样做的主要原因是:</p>
<ul>
<li><strong>节省时间和资源</strong>:处理全部数据成本高昂</li>
<li><strong>可行性</strong>:当总体无限或无法完全获取时</li>
<li><strong>效率</strong>:快速获得初步分析结果</li>
</ul>
<p>在<strong>抽样</strong>的世界里,主要有<strong>两种</strong>不同的理念,形成了两大阵营:</p>
<ul>
<li><strong>非随机抽样</strong>:抽样过程不遵循随机原则,而是根据研究人员的主观经验或方便性来选择样本。这种方法简单、快速、成本低,适用于探索性研究或对时效性要求高的场景。</li>
<li><strong>随机抽样</strong>:也称为概率抽样,它遵循随机原则,确保总体中的每个单位都有一定的机会被抽中。这种方法专业性强,可以客观地衡量抽样误差,是数据分析中更常用、更科学的方法。</li>
</ul>
<p>接下来,我们将重点介绍几种主流的抽样方法。</p>
<h1 id="2-非随机抽样">2. 非随机抽样</h1>
<p><strong>非随机抽样</strong>虽然在严谨的数据分析中需要谨慎使用,但在某些场景下依然有其价值。</p>
<p>它的实现原理是:根据研究者的主观判断、方便程度或特定需求来选择样本,不保证每个个体都有被抽中的机会。</p>
<p>常见的非随机抽样包括<strong>方便抽样</strong>、<strong>判断抽样</strong>、<strong>滚雪球抽样</strong>等。</p>
<p>典型的<strong>应用场景</strong>有:</p>
<ul>
<li><strong>产品初期快速的用户访谈</strong>:在产品开发的早期阶段,为了快速收集用户反馈,可能会在公司门口或附近的咖啡馆随机邀请用户进行简短访谈。</li>
<li><strong>特定人群的深度研究</strong>:研究某个罕见病群体时,可以通过医生推荐或患者社群来寻找研究对象,这类似于滚雪球抽样。</li>
</ul>
<p>下面用<code>Python</code>实现一个简单的<strong>非随机抽样</strong>的示例。</p>
<pre><code class="language-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 > 90]
print("判断抽样(活跃度>90)的样本量:", len(high_activity_sample))
print(high_activity_sample.head())
</code></pre>
<p>运行结果:</p>
<p><img src="https://img2024.cnblogs.com/blog/83005/202511/83005-20251129090504201-1654084517.png" alt="" loading="lazy"></p>
<h1 id="3-随机抽样">3. 随机抽样</h1>
<p><strong>随机抽样</strong>是数据分析的基石,它能确保样本的代表性,从而让我们的分析结论<strong>更具说服力</strong>。</p>
<p><strong>随机抽样</strong>一般有下面四种方式:</p>
<h2 id="31-简单随机抽样">3.1. 简单随机抽样</h2>
<p>这是最基础的<strong>随机抽样</strong>方法,确保总体中每个个体被抽中的概率完全相等。</p>
<p>就像从一个装满小球的箱子里随机摸球一样,每个球被摸到的机会都是一样的。</p>
<p>它的典型应用场景有:</p>
<ul>
<li><strong>满意度调查</strong>:从全体用户中随机抽取一部分发送满意度调查问卷。</li>
<li><strong>A/B测试用户分组</strong>:将参与测试的用户随机分配到<strong>A组</strong>和<strong>B组</strong>,确保两组用户在初始状态下没有系统性差异。</li>
</ul>
<p>下面是<code>Python</code>实现的一个<strong>简单随机抽样</strong>示例。</p>
<p>先创建测试数据,这些数据在后面其他随机抽样示例中也会使用。</p>
<pre><code class="language-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
'''
</code></pre>
<p>然后进行简单随机抽样:</p>
<pre><code class="language-python"># 简单随机抽样
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
'''
</code></pre>
<p><strong>抽样数据</strong>与<strong>总体数据</strong>相比,<strong>收入分布</strong>和<strong>满意度分布</strong>情况如下:</p>
<p><img src="https://img2024.cnblogs.com/blog/83005/202511/83005-20251129090503709-1200082289.png" alt="" loading="lazy"></p>
<h2 id="32-分层随机抽样">3.2. 分层随机抽样</h2>
<p><strong>分层随机抽样</strong>是先将总体按照某种特征分成若干个互不重叠的<strong>“层”</strong>,然后在每个层内部分别进行简单随机抽样。</p>
<p>这种方法可以保证样本的结构与总体的结构相似,特别适用于总体内部差异较大的情况。</p>
<p>它的典型应用场景有:</p>
<ul>
<li><strong>不同城市用户的消费习惯分析</strong>:为了解全国用户的消费习惯,可以先将用户按城市(如一线、新一线、二线城市)分层,再从每一层中按比例抽取用户进行研究,确保样本中各城市的用户比例与总体一致。</li>
<li><strong>不同年级学生的学习情况调查</strong>:将学生按年级分层,再从各年级中抽取一定比例的学生进行调查。</li>
</ul>
<p>下面是<code>Python</code>实现的一个<strong>分层随机抽样</strong>示例。</p>
<pre><code class="language-python"># 创建分层:按年龄分组
customer_data["age_group"] = pd.cut(
customer_data["age"],
bins=,
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
'''
</code></pre>
<p><strong>分层随机抽样</strong>和<strong>简单随机抽样</strong>,以及<strong>总体数据</strong>对于平均收入的估计如下:</p>
<p><img src="https://img2024.cnblogs.com/blog/83005/202511/83005-20251129090504200-163029126.png" alt="" loading="lazy"></p>
<p>从图中可以看出,<strong>分层随机抽样</strong>更接近于<strong>总体</strong>的值。</p>
<h2 id="33-系统随机抽样">3.3. 系统随机抽样</h2>
<p><strong>系统随机抽样</strong>是将总体中的所有单位按一定顺序排列,然后按照固定的间隔(步长)来抽取样本。</p>
<p>比如,从1000人中抽取100人,可以每隔10人抽取1人。</p>
<p>它的典型应用场景有:</p>
<ul>
<li><strong>生产线产品质量检测</strong>:每隔100件产品,抽取1件进行质量检测。</li>
<li><strong>电话调查</strong>:从电话号码簿中,每隔50个号码抽取一个进行访问。</li>
</ul>
<p>下面是<code>Python</code>实现的一个<strong>系统随机抽样</strong>示例。</p>
<pre><code class="language-python"># 系统随机抽样
def systematic_sampling(data, step):
start = np.random.randint(0, step)
indices = range(start, len(data), step)
return data.iloc
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
'''
</code></pre>
<p><strong>系统随机抽样</strong>的示意图如下:</p>
<p><img src="https://img2024.cnblogs.com/blog/83005/202511/83005-20251129090504209-534378317.png" alt="" loading="lazy"></p>
<h2 id="34-整群随机抽样">3.4. 整群随机抽样</h2>
<p><strong>整群随机抽样</strong>是将总体划分为若干个互不重叠的<strong>“群”</strong>,然后随机抽取其中的若干个群,对抽中的群里的所有单位进行调查。</p>
<p>它的典型应用场景是:</p>
<ul>
<li><strong>城市居民健康调查</strong>:将城市划分为若干个社区(群),随机抽取几个社区,然后对这几个社区的所有居民进行健康调查。</li>
<li><strong>全国多所学校的学生视力普查</strong>:将全国的学校作为“群”,随机抽取几十所学校,然后对这些学校的所有学生进行视力检查。</li>
</ul>
<p>下面是<code>Python</code>实现的一个<strong>整群随机抽样</strong>示例。</p>
<pre><code class="language-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.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
'''
</code></pre>
<p><strong>整群随机抽样</strong>得到的平均收入与总体数据的比较如下图:它们的值非常接近。</p>
<p><img src="https://img2024.cnblogs.com/blog/83005/202511/83005-20251129090504209-907999098.png" alt="" loading="lazy"></p>
<h1 id="4-随机抽样综合比较">4. 随机抽样综合比较</h1>
<p>为了更直观地感受不同抽样方法带来的差异,我们从同一个数据集中,使用不同的方法抽取大约相同规模的样本,来比较各种抽样方法。</p>
<pre><code class="language-python"># 创建更复杂的数据集来演示各种抽样方法
np.random.seed(42)
company_data = pd.DataFrame(
{
"employee_id": range(1, 1001),
"department": np.random.choice(
["技术", "销售", "市场", "人事", "财务"],
1000,
p=,
),
"salary": np.random.normal(80000, 20000, 1000).astype(int),
"experience": np.random.exponential(5, 1000).astype(int) + 1,
}
)
# 修正可能的负工资
company_data["salary"] = company_data["salary"].clip(lower=30000)
print("公司员工数据概况:")
print(f"总员工数:{len(company_data)}")
print(f"平均工资:{company_data['salary'].mean():.2f}")
print("\n各部门人数:")
print(company_data["department"].value_counts())
# 应用不同抽样方法
samples = {
"简单随机抽样": company_data.sample(n=100, random_state=42),
"分层随机抽样": company_data.groupby("department")
.apply(lambda x: x.sample(frac=0.1, random_state=42), include_groups=False)
.reset_index(),
"系统随机抽样": systematic_sampling(company_data, 10),
"整群随机抽样": company_data[
company_data["department"].isin(
np.random.choice(company_data["department"].unique(), 2, replace=False)
)
],
}
# 比较结果
comparison = pd.DataFrame(
{
"方法": ["总体"] + list(samples.keys()),
"样本量": + ,
"平均工资": .mean()]
+ .mean() for sample in samples.values()],
"工资误差":
+ [
abs(sample["salary"].mean() - company_data["salary"].mean())
for sample in samples.values()
],
}
)
print("\n各种抽样方法比较:")
print(comparison)
# 运行结果:
'''
公司员工数据概况:
总员工数:1000
平均工资:82015.16
各部门人数:
department
技术 319
销售 240
市场 198
人事 143
财务 100
Name: count, dtype: int64
'''
</code></pre>
<p><img src="https://img2024.cnblogs.com/blog/83005/202511/83005-20251129090503704-190720074.png" alt="" loading="lazy"></p>
<p><img src="https://img2024.cnblogs.com/blog/83005/202511/83005-20251129090503693-319964871.png" alt="" loading="lazy"></p>
<h1 id="5-总结">5. 总结</h1>
<p>本文介绍了常用的抽样方法,并给出了各种抽样方法的典型应用场景以及<code>Python</code>代码实现方式。</p>
<p>重点是四种<strong>随机抽样</strong>的方法,选择抽样方法时需要考虑:</p>
<ul>
<li><strong>研究目的</strong>:探索性分析可用非随机抽样,正式研究需用随机抽样</li>
<li><strong>总体特征</strong>:如果总体有明显分层,考虑分层抽样</li>
<li><strong>资源限制</strong>:整群抽样通常成本较低</li>
<li><strong>精度要求</strong>:分层抽样通常精度较高</li>
</ul>
<p><strong>记住</strong>,没有 <strong>"最好"</strong> 的抽样方法,只有 <strong>"最合适"</strong> 的。</p>
<p>在实际工作中,要根据具体情况灵活选择和组合使用不同的抽样方法。</p><br><br>
来源:https://www.cnblogs.com/wang_yb/p/19285070
頁:
[1]