当我们面对海量的数据时,如何从混乱中找到秩序?这正是统计学要解决的问题。而在统计学的入门阶段,最基础也最重要的概念之一就是“频率”。简单来说,频率告诉我们某个特定数值或事件在数据集中出现的次数。无论是在分析用户行为、处理实验数据,还是进行市场调研,掌握如何计算和解读频率都是数据分析师的必备技能。
在今天的这篇文章中,我们将深入探讨统计学中频率的核心概念。我们将不仅仅满足于知道它的定义,而是要通过实际的操作,掌握绝对频率、相对频率以及累积频率的计算方法。我们还会通过 Python 代码演示如何自动化这些繁琐的计算过程,帮助你在实际工作中高效地处理数据。让我们一起开始这段探索之旅。
什么是统计学中的频率?
在统计学中,频率指的是某个特定数值或事件在数据集中出现的次数。想象一下,你正在处理一份关于顾客满意度的调查数据。如果发现有 50 人选择了“满意”,那么数字 50 就是“满意”这一选项的频率。它是我们理解数据分布、发现数据规律的第一把钥匙。
为了更全面地分析数据,我们通常将频率细分为以下三种主要类型:
- 绝对频率:最直观的计数。
- 相对频率:标准化的比例,便于比较。
- 累积频率:展示数据的累计分布情况。
绝对频率:数据的基石
概念解析
绝对频率,通常简称为“频率”,指的是数据集中某个特定数值或事件出现的确切次数。这是一个纯粹的计数概念,没有任何修饰。例如,如果在一次班级统计中,有 10 个学生喜欢吃苹果,那么“苹果”的绝对频率就是 10。虽然它简单,但它是我们构建复杂统计图表(如直方图)的基础。
如何计算绝对频率?
计算绝对频率的过程本质上就是一个“归类计数”的过程。让我们通过一个简单的例子来手动模拟这个过程。
案例背景:假设我们调查了 10 个家庭拥有的汽车数量,得到的数据集如下:
0, 1, 2, 1, 0, 2, 3, 1, 1, 0
为了计算绝对频率,我们需要遍历这个数据集,统计每个不同数值(0, 1, 2, 3)出现的次数。
- 0 辆车:出现在第 1, 5, 10 位 -> 总共 3 次。
- 1 辆车:出现在第 2, 4, 8, 9 位 -> 总共 4 次。
- 2 辆车:出现在第 3, 6 位 -> 总共 2 次。
- 3 辆车:出现在第 7 位 -> 总共 1 次。
整理成表格,我们就得到了绝对频率分布表:
绝对频率
:—
3
4
2
1### 实战:用 Python 计算绝对频率
在实际的数据科学工作中,我们很少手动计数,而是使用 Python 的 Pandas 库来高效处理。让我们看看如何用代码实现上述逻辑。
import pandas as pd
# 1. 定义我们的数据集
# 这里我们创建一个列表,模拟调查结果
data = [0, 1, 2, 1, 0, 2, 3, 1, 1, 0]
# 2. 将其转换为 Pandas Series 对象,以便使用其强大的统计功能
df = pd.Series(data)
# 3. 使用 value_counts() 方法计算绝对频率
# Pandas 会自动去重并计数,默认按频率降序排列
absolute_freq = df.value_counts().sort_index() # 我们按数值大小排序,更符合阅读习惯
print("--- 绝对频率计算结果 ---")
print(absolute_freq)
# 输出解析:
# 0 3 <- 表示数值 0 出现了 3 次
# 1 4 <- 表示数值 1 出现了 4 次
# 2 2 <- 表示数值 2 出现了 2 次
# 3 1 <- 表示数值 3 出现了 1 次
# dtype: int64
代码原理解析:
-
pd.Series(data)将原始列表转换为一个序列对象,这是 Pandas 处理数据的基本单位。 - INLINECODE7909e9d5 是核心函数,它自动统计每个唯一值的出现次数。如果不使用 INLINECODE66188f27,结果通常会按出现次数从多到少排序,但在统计表中,我们通常希望按照数值本身的大小(如 0, 1, 2…)排列,因此我们加上了
.sort_index()。
相对频率:看清占比
概念解析
绝对频率告诉了我们“有多少”,但它很难让我们直观地感受到“比例如何”。这时候就需要引入相对频率。
相对频率是指特定数值或事件的出现次数与总观测次数的比值(通常以小数或百分比形式表示)。它回答了一个核心问题:“某一类数据占总体的多少?”
相对频率公式
计算相对频率的数学公式非常直观:
$$Relative Frequency = \frac{Absolute Frequency}{Total Number of Observations}$$
如何计算相对频率?
让我们继续使用上面的汽车数量例子。总观测次数(家庭总数)是 10。
- 0 辆车:绝对频率是 3。相对频率 = $3 / 10 = 0.3$ (即 30%)
- 1 辆车:绝对频率是 4。相对频率 = $4 / 10 = 0.4$ (即 40%)
- 2 辆车:绝对频率是 2。相对频率 = $2 / 10 = 0.2$ (即 20%)
- 3 辆车:绝对频率是 1。相对频率 = $1 / 10 = 0.1$ (即 10%)
注意,所有相对频率的总和必须等于 1 (或 100%)。
绝对频率
百分比
:—
:—
3
30%
4
40%
2
20%
1
10%
10
100%### 实战:用 Python 计算相对频率
在 Python 中,我们可以基于计算出的绝对频率轻松转换得到相对频率。这体现了代码的复用性。
# 接续上面的代码
# 我们已经得到了 absolute_freq (Series 类型)
total_observations = len(data) # 获取总观测数
# 计算相对频率:只需将绝对频率除以总数
relative_freq = absolute_freq / total_observations
print("
--- 相对频率计算结果 ---")
# 使用 map 格式化输出,保留两位小数,看起来更像百分比
print(f"总观测数: {total_observations}")
print("相对频率:")
print(relative_freq.map("{:.2%}".format))
# 输出解析:
# 0 30.00%
# 1 40.00%
# 2 20.00%
# 3 10.00%
代码原理解析:
- Pandas 的 Series 和 DataFrame 支持向量化运算。
absolute_freq / total_observations这一行代码会将 Series 中的每一个元素都除以总数,而不需要编写循环,这极大地提高了代码的可读性和运行效率。 -
.map("{:.2%}".format)是一个格式化技巧,它将小数(如 0.3)转换为百分比字符串(如 "30.00%"),非常适合生成报告。
累积频率:洞察数据的分布范围
概念解析
有时候,我们不仅想知道单个类别的频率,还想知道“低于某个值”或“至多某个值”的数据一共有多少。这就是累积频率的作用。
累积频率是将频率逐个累加得到的。对于有序数据,它告诉我们有多少数值小于或等于当前数值。这在分析百分位数、制定评分标准(如“前 10% 的学生”)时非常有用。
如何计算累积频率?
计算步骤如下:
- 将数据按数值大小排序(从小到大)。
- 从最小的数值开始,累加其绝对频率。
- 将当前的累加值加上下一个数值的绝对频率,得到新的累加值。
- 重复此过程直到最后一个数据点。
让我们再次回到汽车的例子,并计算累积绝对频率:
- 对于 0 辆车:累积频率 = 3(就是 0 辆车本身的数量)
- 对于 1 辆车:累积频率 = 3(0 辆车的累积) + 4(1 辆车的数量) = 7
- 对于 2 辆车:累积频率 = 7(0 和 1 辆车的累积) + 2(2 辆车的数量) = 9
- 对于 3 辆车:累积频率 = 9(0, 1, 2 辆车的累积) + 1(3 辆车的数量) = 10
绝对频率
解读
:—
:—
3
有 3 个家庭拥有 0 辆或更少的车。
4
有 7 个家庭拥有 1 辆或更少的车。
2
有 9 个家庭拥有 2 辆或更少的车。
1
有 10 个家庭拥有 3 辆或更少的车(即全部家庭)。### 实战:用 Python 计算累积频率
Python 的 Pandas 提供了极其便捷的 cumsum() 函数(累积求和),可以一键完成计算。
# 接续上面的代码
# 使用 cumsum() 方法计算累积和
cumulative_freq = absolute_freq.cumsum()
print("
--- 累积频率计算结果 ---")
print("累积绝对频率:")
print(cumulative_freq)
# 实用技巧:我们也可以计算累积相对频率
# 这能直接告诉我们“有多少比例的数据在当前值之下”
cumulative_relative_freq = relative_freq.cumsum()
print("
累积相对频率:")
print(cumulative_relative_freq.map("{:.2%}".format))
# 输出解析:
# 累积绝对频率:
# 0 3
# 1 7
# 2 9
# 3 10
#
# 累积相对频率:
# 0 30.00%
# 1 70.00%
# 2 90.00%
# 3 100.00%
代码原理解析:
-
cumsum()是 cumulative sum(累积求和)的缩写。它会遍历 Series,并在每一步将当前值与之前所有步骤的值相加。 - 计算累积相对频率往往比累积绝对频率更有意义,因为它消除了样本总量的影响。例如,70% 的含义是“70% 的家庭汽车拥有量不超过 1 辆”,这比“7 个家庭”更具通用性。
综合案例:处理真实数据集
现在我们已经掌握了基本原理,让我们用一个更接近真实场景的例子来巩固知识。假设我们有一组学生考试成绩的数据,我们需要快速分析成绩的分布情况。
import pandas as pd
import numpy as np
# 设置随机种子,保证每次运行结果一致,方便你复现
np.random.seed(42)
# 模拟生成 100 名学生的考试成绩(0 到 100 分)
scores = np.random.randint(0, 101, size=100)
# 将数据转换为 Series
score_series = pd.Series(scores)
# 1. 计算绝对频率(成绩分布)
print("--- 成绩分布分析 ---")
print("1. 各分数的绝对频率(前10个展示):")
print(score_series.value_counts().head(10))
# 2. 将成绩分组(这是实际分析中更常见的做法)
# 比如我们不看具体的 59 分或 61 分,而是看 "60-69 分" 这个区间
bins = [0, 59, 69, 79, 89, 100] # 定义区间边界: <60, 60-69, 70-79, 80-89, 90-100
labels = ['不及格', '及格', '中等', '良好', '优秀'] # 定义区间标签
# 使用 pd.cut 将连续数值转换为分类数据
categorized_scores = pd.cut(score_series, bins=bins, labels=labels, include_lowest=True)
# 3. 基于分组计算频率表
freq_table = pd.DataFrame()
freq_table['绝对频率'] = categorized_scores.value_counts().sort_index()
freq_table['相对频率'] = freq_table['绝对频率'] / len(scores)
freq_table['累积频率'] = freq_table['相对频率'].cumsum()
# 格式化输出
freq_table['相对频率'] = freq_table['相对频率'].map("{:.2%}".format)
freq_table['累积频率'] = freq_table['累积频率'].map("{:.2%}".format) # 这里纠正一下列名
print("
2. 分组统计频率表:")
print(freq_table)
# 3. 实用见解:解读累积频率
# 假设我们要知道有多少学生成绩是“良好”及以下(即 <= 89)
good_or_less_cumsum = freq_table.loc['良好', '累积频率']
print(f"
3. 实用解读: {good_or_less_cumsum} 的学生成绩处于 '良好' (<=89分) 或以下等级。")
在这个综合案例中,我们学会了:
- 分组:直接统计每个分数的绝对频率往往太分散(比如 100 个学生可能有 80 个不同的分数),使用
pd.cut将数据分组(如按分数段)是更专业的做法。 - 多维度展示:我们将绝对频率、相对频率和累积频率整合在一张表中,这可以一次性回答多个业务问题:“有多少人不及格?”、“优秀率是多少?”、“至少有多少人及格了?”。
- 解读数据:累积频率在这里帮助我们快速定位。例如,如果我们想知道“前 20% 的学生分数线是多少”,累积频率表就是关键。
总结与最佳实践
在这篇文章中,我们系统性地学习了如何从零开始寻找和计算统计学中的频率。我们从简单的计数开始,逐步深入到了能够描述数据分布全貌的累积频率,并掌握了使用 Python 进行自动化分析的技能。
作为数据分析师,以下是一些值得记住的最佳实践:
- 始终保持数据整洁:在计算频率之前,确保数据没有缺失值或异常格式(如将字符串 "10" 和数字 10 混在一起),否则
value_counts()会将它们视为不同的类别。 - 善用分组:对于连续型数据(如身高、体重、销售额),不要直接计算绝对频率,一定要先进行分箱操作,这样才能得到有意义的统计图表。
- 注意总和:做完相对频率计算后,快速检查一下总和是否为 1(或 100%),这是验证计算是否正确的最快方法。
- 累积频率的威力:在寻找中位数、百分位数或设定 KPI 考核线时,累积频率比绝对频率更有价值。
掌握频率分析,是你迈向专业数据分析的第一步。现在,你可以尝试打开你自己的数据集,应用这些方法,看看数据会向你讲述怎样的故事。