描述性统计分析:均值、中位数、众数与标准差
大家好!欢迎来到我的数据科学博客。今天,我们将深入探讨描述性统计分析的核心概念:均值、中位数、众数和标准差。这些基础统计量是理解数据分布和变异性的关键,无论是进行初步数据探索还是为高级分析做准备,都离不开它们。
在这篇长篇博客中,我会结合理论解释、实际示例和Python代码实现,带你全面理解这些统计量。我们会从基本定义开始,逐步深入到实际应用,并通过一个完整的数据分析项目来展示如何计算和解释这些指标。
好了,让我们开始探索描述性统计的奇妙世界吧!
I. 描述性统计简介
描述性统计是统计学的一个分支,旨在通过汇总和可视化方法描述数据集的基本特征。它帮助我们理解数据的中心趋势、分散程度和分布形状,而无需进行复杂的推断或预测。简单来说,描述性统计是数据分析的"第一眼",让我们能快速抓住数据的关键信息。
在实际应用中,描述性统计无处不在。例如,在商业中,公司可能计算平均销售额来评估绩效;在教育中,老师可能用中位数分数来理解考试表现;在医疗中,研究人员可能用标准差来衡量治疗效果的变异性。这些统计量是决策的基础,帮助我们从数据中提取有意义的洞察。
描述性统计主要包括以下几类指标:
- 中心趋势度量:如均值、中位数、众数,描述数据的"典型"值或中心点。
- 分散程度度量:如标准差、方差、范围,描述数据的 spread 或变异性。
- 分布形状度量:如偏度和峰度,描述数据分布的不对称性和尖峰程度。
在这篇博客中,我们聚焦于前两类中的基本指标:均值、中位数、众数和标准差。这些是最常用且最容易理解的统计量,适合初学者和专业人士 alike。
为了更直观地理解描述性统计的作用,让我们用一個Mermaid图来总结这一章的核心内容。
Lexical error on line 5. Unrecognized text. ...形状度量] B --> E[均值、中位数、众数] C --> F ----------------------^这就是描述性统计的概览。接下来,我们会详细讨论每个核心统计量,从均值开始。
II. 均值(Mean)
均值,通常称为平均值,是最常见的中心趋势度量。它通过将所有数据值相加后除以数据点数量来计算。均值代表了数据的"平衡点",但受极端值(异常值)影响较大。
均值的计算公式为:
[
\text{均值} = \frac{\sum_{i=1}^{n} x_i}{n}
]
其中,( x_i ) 是每个数据点,( n ) 是数据点总数。
均值的优点包括:
- 易于理解和计算。
- 使用所有数据点,提供整体视图。
- 适合用于区间和比率数据。
然而,均值也有缺点:
- 对异常值敏感。例如,如果数据中有极大值,均值可能被拉高,不再代表典型值。
- 不适用于分类数据。
让我们通过一个实例来理解均值。假设我们有一组代表5名学生考试分数的数据:[85, 90, 78, 92, 88]
。计算均值:
[
\text{均值} = \frac{85 + 90 + 78 + 92 + 88}{5} = \frac{433}{5} = 86.6
]
所以,平均分是86.6分。这给出了整体表现的概念。
在Python中,我们可以用numpy库轻松计算均值。以下是代码示例:
import numpy as np
# 示例数据:考试分数
scores = [85, 90, 78, 92, 88]
mean_score = np.mean(scores)
print(f"均值: {mean_score}")
解释:
- 我们导入numpy库,它提供高效的数值计算函数。
np.mean()
函数计算输入列表的均值。- 输出将是
均值: 86.6
。
均值是强大的工具,但务必注意其局限性。在有异常值的情况下,中位数可能更合适。接下来,我们讨论中位数。
III. 中位数(Median)
中位数是另一个中心趋势度量,代表数据集的中间值。当数据按升序排列时,中位数是位于正中间的值。如果数据点数量为偶数,则中位数是中间两个值的平均值。
中位数的计算步骤:
- 将数据排序。
- 如果数据点数量奇数,中位数是排序后的中间值。
- 如果数据点数量偶数,中位数是中间两个值的均值。
中位数的优点:
- 对异常值不敏感,因为它只依赖于中间值(s)。
- 适合偏斜分布的数据,能更好地代表典型值。
缺点:
- 不使用所有数据点,可能忽略极端但重要的信息。
- 计算稍复杂,需要排序数据。
继续使用考试分数示例,数据排序后为 [78, 85, 88, 90, 92]
。由于数据点数量为5(奇数),中位数是第三个值:88。
如果数据有偶数个点,例如 [78, 85, 88, 90, 92, 95]
,中位数是中间两个值(88和90)的平均值:
[
\text{中位数} = \frac{88 + 90}{2} = 89
]
在Python中,我们可以用numpy计算中位数:
median_score = np.median(scores)
print(f"中位数: {median_score}")
解释:
np.median()
函数自动处理排序和计算,无论数据点数量奇偶。- 对于原始数据
[85, 90, 78, 92, 88]
,输出中位数: 88.0
。
中位数特别有用当数据有异常值时。例如,如果分数中有个极端低分 [30, 85, 88, 90, 92]
,均值会被拉低至77,但中位数仍是88,更准确反映典型表现。
现在,让我们用Mermaid图总结均值和中位数的比较。
理解了中位数后,我们来看众数。
IV. 众数(Mode)
众数是数据中出现频率最高的值。它可以用於任何类型的数据,包括分类数据(如颜色、品牌),但特别适用于离散数值数据。
众数的优点:
- 唯一适用于分类数据的中心趋势度量。
- 容易理解,代表最常出现的值。
- 不受异常值影响。
缺点:
- 可能不存在众数(所有值唯一),或多个众数(多模态),使解释复杂。
- 不使用所有数据点,可能不具代表性。
示例:考虑一组代表鞋码的数据 [7, 8, 8, 9, 10, 10, 10, 11]
。值10出现三次,是最频繁的,所以众数是10。
如果数据有两个众数,例如 [7, 8, 8, 9, 10, 10, 11]
,众数是8和10(双模态)。如果所有值唯一,则没有众数。
在Python中,我们可以用scipy库计算众数:
from scipy import stats
# 示例数据:鞋码
shoe_sizes = [7, 8, 8, 9, 10, 10, 10, 11]
mode_size = stats.mode(shoe_sizes)
print(f"众数: {mode_size.mode} (出现次数: {mode_size.count})")
解释:
- 从scipy导入stats模块,它提供统计函数。
stats.mode()
返回众数和出现次数。对于示例数据,输出众数: 10 (出现次数: 3)
。
众数在商业中常用,例如识别最畅销产品。但它可能不是最佳中心趋势度量,如果数据是连续的,众数可能 vary widely。
现在,我们转向分散程度度量——标准差。
V. 标准差(Standard Deviation)
标准差衡量数据点相对于均值的分散程度。低标准差表示数据点接近均值,high标准差表示数据点 spread out over a wider range。标准差是方差的平方根,方差是每个数据点与均值差的平方的平均值。
标准差计算公式:
[
\sigma = \sqrt{\frac{\sum_{i=1}^{n} (x_i - \mu)^2}{n}}
]
其中,( \sigma ) 是标准差,( x_i ) 是每个数据点,( \mu ) 是均值,( n ) 是数据点总数。
标准差的优点:
- 使用所有数据点,提供全面变异性视图。
- 与均值结合,帮助理解数据分布。
缺点:
- 对异常值敏感。
- 与均值相同,只适用于区间和比率数据。
示例:计算考试分数 [85, 90, 78, 92, 88]
的标准差。首先,均值是86.6。然后计算每个点与均值的差,平方后求平均,再开平方。
[
\sigma = \sqrt{\frac{(85-86.6)^2 + (90-86.6)^2 + (78-86.6)^2 + (92-86.6)^2 + (88-86.6)^2}{5}} = \sqrt{\frac{(-1.6)^2 + (3.4)^2 + (-8.6)^2 + (5.4)^2 + (1.4)^2}{5}} = \sqrt{\frac{2.56 + 11.56 + 73.96 + 29.16 + 1.96}{5}} = \sqrt{\frac{119.2}{5}} = \sqrt{23.84} \approx 4.88
]
所以,标准差约4.88,表示分数 typically vary by about 4.88 points from the average.
在Python中,用numpy计算标准差:
std_dev = np.std(scores)
print(f"标准差: {std_dev:.2f}")
解释:
np.std()
计算标准差。对于示例数据,输出标准差: 4.88
。- 参数
ddof=0
(默认)表示计算总体标准差;如果样本数据,使用ddof=1
计算样本标准差(无偏估计)。
标准差是风险评估的关键指标,例如在金融中,股票收益的高标准差表示高风险。
现在,让我们用Mermaid图总结所有四个统计量。
Lexical error on line 2. Unrecognized text. ...性统计量] --> B[中心趋势: 均值、中位数、众数] A --> C -----------------------^理解了这些统计量后,我们通过一个综合实例来应用它们。
VI. 综合实例:分析房屋价格数据
在这个实例中,我们将分析一个房屋价格数据集,计算均值、中位数、众数和标准差,并解释结果。我们会使用Python进行全程分析,包括数据加载、清洗、计算和可视化。
数据集介绍
我们使用模拟的房屋价格数据,包含1000个记录,每记录有价格(美元)和卧室数量。数据包括一些异常值,以展示统计量的行为。
代码部署过程
首先,确保安装了必要库:numpy, scipy, pandas, matplotlib。然后,我们一步步进行。
步骤1: 生成模拟数据
为了避免使用外部网址,我们生成模拟数据。
import numpy as np
import pandas as pd
from scipy import stats
import matplotlib.pyplot as plt
# 设置随机种子确保可复现
np.random.seed(42)
# 生成正太分布价格数据,均值300000,标准差50000
prices = np.random.normal(300000, 50000, 1000).astype(int)
# 添加一些异常值:10个极高价格
prices[-10:] = np.random.randint(500000, 1000000, 10)
# 生成卧室数量,众数为3
bedrooms = np.random.choice([1,2,3,4,5], size=1000, p=[0.1,0.2,0.4,0.2,0.1])
# 创建DataFrame
data = pd.DataFrame({'价格': prices, '卧室数量': bedrooms})
print(data.head())
print(data.describe())
解释:
- 我们生成1000个房屋价格,从正态分布(均值300000,标准差50000)中抽取,并转换为整数。
- 添加10个异常值(50万到100万),以模拟现实中的豪宅。
- 卧室数量从1到5,概率不同,众数为3。
- 使用pandas DataFrame存储数据,并打印前几行和统计摘要。
步骤2: 计算中心趋势和分散程度
现在,计算价格和卧室数量的均值、中位数、众数和标准差。
# 计算价格的统计量
price_mean = np.mean(data['价格'])
price_median = np.median(data['价格'])
price_mode = stats.mode(data['价格'])
price_std = np.std(data['价格'])
print(f"价格均值: {price_mean:.2f}")
print(f"价格中位数: {price_median:.2f}")
print(f"价格众数: {price_mode.mode[0]} (出现次数: {price_mode.count[0]})")
print(f"价格标准差: {price_std:.2f}")
# 计算卧室数量的统计量
bedroom_mean = np.mean(data['卧室数量'])
bedroom_median = np.median(data['卧室数量'])
bedroom_mode = stats.mode(data['卧室数量'])
bedroom_std = np.std(data['卧室数量'])
print(f"\n卧室数量均值: {bedroom_mean:.2f}")
print(f"卧室数量中位数: {bedroom_median}")
print(f"卧室数量众数: {bedroom_mode.mode[0]} (出现次数: {bedroom_mode.count[0]})")
print(f"卧室数量标准差: {bedroom_std:.2f}")
解释:
- 对于价格,由于异常值,均值可能高于中位数。
- 众数返回最常出现的价格和出现次数。
- 卧室数量是离散数据,众数更有意义。
- 标准差显示价格的变异性较大 due to outliers.
步骤3: 可视化结果
绘制直方图来可视化分布。
# 绘制价格直方图
plt.figure(figsize=(10,6))
plt.hist(data['价格'], bins=50, alpha=0.7, color='blue')
plt.axvline(price_mean, color='red', linestyle='dashed', linewidth=1, label=f'均值: {price_mean:.2f}')
plt.axvline(price_median, color='green', linestyle='dashed', linewidth=1, label=f'中位数: {price_median:.2f}')
plt.xlabel('价格')
plt.ylabel('频次')
plt.title('房屋价格分布')
plt.legend()
plt.show()
# 绘制卧室数量条形图
plt.figure(figsize=(10,6))
bedroom_counts = data['卧室数量'].value_counts().sort_index()
plt.bar(bedroom_counts.index, bedroom_counts.values, alpha=0.7, color='orange')
plt.axvline(bedroom_mean, color='red', linestyle='dashed', linewidth=1, label=f'均值: {bedroom_mean:.2f}')
plt.axvline(bedroom_median, color='green', linestyle='dashed', linewidth=1, label=f'中位数: {bedroom_median}')
plt.xlabel('卧室数量')
plt.ylabel('频次')
plt.title('卧室数量分布')
plt.legend()
plt.show()
解释:
- 价格直方图显示分布和异常值。均值和中位数的线帮助看到异常值如何拉高均值。
- 卧室数量条形图显示离散分布,众数明显。
步骤4: 解释结果
从输出中,我们可能看到:
- 价格均值高于中位数,表示正偏分布(右偏),受异常值影响。
- 价格众数可能接近中位数,表示大多数价格集中。
- 卧室数量众数为3,符合生成数据时的设置。
这个实例展示了如何计算和解释描述性统计量。在实际项目中,你可能会用这些信息来识别数据问题或做出初步决策。
用Mermaid图总结实例步骤。
Lexical error on line 7. Unrecognized text. ...ndas] C --> G[均值、中位数、众数、标准差] D - ----------------------^通过这个实例,你应该对描述性统计有了更深入的理解。最后,我们总结整个博客。
VII. 结论
描述性统计是数据分析的基石,提供了一种简单而强大的方式来 summarize 数据。均值、中位数、众数和标准差这些基本统计量, each with its own strengths and weaknesses, help us understand the central tendency and variability of data.
回顾关键点:
- 均值:平均値,适合对称分布但对异常值敏感。
- 中位数:中间値,对异常值稳健,适合偏斜分布。
- 众数:最频繁値,唯一适用于分类数据。
- 标准差:衡量变异性,高值表示数据分散。
在选择使用哪个统计量时,考虑数据类型和分布。例如,对于偏斜分布,中位数比均值更合适;对于分类数据,只能使用众数。
在实践方面,Python库如numpy、scipy和pandas使计算这些统计量变得容易。通过可视化,我们可以更好地理解数据分布和统计量的含义。
未来,随着大数据和AI的发展,描述性统计仍然是 exploratory data analysis 的关键第一步。掌握这些基础将为你学习更高级的统计和机器学习技术奠定坚实基础。
最后,用一個Mermaid图总结整个博客旅程。
- 点赞
- 收藏
- 关注作者
评论(0)