核密度图和直方图均为数据可视化工具,能够呈现数据分布状况,不过它们在原理与表现形式上存在差异。下面将对它们的原理、差异进行详细介绍,并给出代码示例。
1. 原理剖析
- 直方图:
- 它把数据范围划分成若干个连续的小区间,也就是“箱子”。
- 统计每个箱子内的数据点数量,以此来确定相应的频率或计数。
- 最终用矩形条来展示这些统计结果,矩形条的高度代表频率或密度。
- 核密度估计(KDE):
- 这是一种非参数方法,用于对随机变量的概率密度函数进行估计。
- 以每个数据点为中心放置一个核函数(像高斯核就是常用的一种),然后将所有核函数累加起来。
- 累加后得到的平滑曲线就是概率密度函数的估计结果,曲线下方的总面积为 1。
2. 主要差异
对比项 | 直方图 | 核密度图 |
---|---|---|
表现形式 | 由离散的矩形条组成,矩形条之间可能存在间隙。 | 是一条连续的平滑曲线。 |
数据平滑 | 没有进行平滑处理,展示的是原始数据的分布情况。 | 经过了平滑处理,能减少数据中的噪声影响。 |
参数影响 | 对箱子的数量和宽度非常敏感,不同的设置可能会导致图形差异较大。 | 对核函数的类型以及带宽参数比较敏感。 |
细节展示 | 能够清晰地展示数据的具体分布区间。 | 更侧重于展示数据分布的整体趋势。 |
适用场景 | 适用于展示原始数据的分布,当数据量较小时也能较好地发挥作用。 | 适合对分布形状进行比较,更便于观察数据的整体趋势。 |
3. 代码示例
下面为你提供 Python 语言绘制核密度图与直方图的代码示例:
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 设置图片清晰度
plt.rcParams['figure.dpi'] = 300
# 生成示例数据(正态分布)
np.random.seed(42)
data = np.random.normal(loc=0, scale=1, size=1000)
# 创建画布
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
# 绘制直方图
axes[0].hist(data, bins=30, density=True, alpha=0.7, color='skyblue')
axes[0].set_title('直方图')
axes[0].set_xlabel('值')
axes[0].set_ylabel('密度')
# 绘制核密度图
sns.kdeplot(data, ax=axes[1], color='orange', linewidth=2)
axes[1].set_title('核密度图')
axes[1].set_xlabel('值')
axes[1].set_ylabel('密度')
plt.tight_layout()
plt.show()
# 组合图:直方图 + 核密度图
plt.figure(figsize=(8, 6))
sns.histplot(data, bins=30, kde=True, stat='density', alpha=0.7, color='skyblue')
plt.title('直方图与核密度图组合')
plt.xlabel('值')
plt.ylabel('密度')
plt.show()
结果解读
- 直方图:从直方图中可以看到,它通过矩形条直观地展示了数据在各个区间内的分布频率。矩形条越高,说明该区间内的数据点越多。
- 核密度图:核密度图呈现出一条平滑的曲线,能够让我们更清晰地观察到数据分布的整体形状,比如是否呈现单峰、双峰等特征,以及数据的集中趋势和离散程度。
- 组合图:组合图将直方图和核密度图结合在一起,既能展示数据的原始分布情况,又能体现出数据分布的平滑趋势,有助于我们从多个角度分析数据。
通过这些可视化工具,我们可以更好地理解数据的分布特征,为后续的数据分析和建模工作提供有力支持。