Python核密度估计
简介
核密度估计是统计学中的一种非参数估计方法,用于估计随机变量的概率密度函数(PDF)。核密度估计提供了一种平滑的近似密度函数,适用于各种统计分析和数据可视化任务。Python中有多种库可以进行核密度估计,本文将介绍两种常用的库:scipy
和seaborn
。
密度估计方法
假设我们有一组未知概率分布的样本数据$x_1, x_2, ..., x_n$。核密度估计的目标是估计这些样本数据的概率密度函数$f(x)$。核密度估计的步骤如下:
- 选择核函数:核函数是用来平滑样本数据的函数。常用的核函数有高斯核函数(也称为正态核函数)和矩形核函数等。
- 选择带宽参数:带宽参数决定了核函数的宽度,从而影响了平滑程度。带宽参数过大会导致平滑过度,过小会导致过拟合。
- 计算密度估计值:根据所选的核函数和带宽参数,计算样本数据点的概率密度估计值。
scipy库的使用
scipy
是一个功能强大的科学计算库,其中包含了stats
模块,提供了核密度估计的函数gaussian_kde
。
import numpy as np
from scipy import stats
# 生成随机样本数据
np.random.seed(0)
data = np.random.randn(100)
# 使用高斯核函数进行核密度估计
kde = stats.gaussian_kde(data)
# 在指定范围内生成一组点
x = np.linspace(-5, 5, 100)
# 计算概率密度估计值
y = kde(x)
上述代码中,我们首先使用numpy
库生成了100个服从标准正态分布的随机样本数据。然后,我们使用gaussian_kde
函数创建了一个核密度估计对象kde
。接下来,我们在指定范围内生成了一组点x
,并通过调用kde
对象的方法来计算概率密度估计值y
。
seaborn库的使用
seaborn
是一个基于matplotlib
的数据可视化库,提供了简化的API来进行核密度估计和可视化。
import numpy as np
import seaborn as sns
# 生成随机样本数据
np.random.seed(0)
data = np.random.randn(100)
# 使用seaborn绘制核密度估计图
sns.kdeplot(data)
上述代码中,我们首先使用numpy
库生成了100个服从标准正态分布的随机样本数据。然后,我们使用seaborn
库的kdeplot
函数绘制了核密度估计图。
示例分析
接下来,我们将使用一个真实的数据集来进行核密度估计并进行分析。我们将使用seaborn
库提供的tips
数据集,该数据集包含了餐厅顾客的账单金额和小费金额等信息。
首先,我们加载并查看一下数据集的前几行:
import seaborn as sns
tips = sns.load_dataset('tips')
print(tips.head())
total_bill | tip | sex | smoker | day | time | size |
---|---|---|---|---|---|---|
16.99 | 1.01 | Female | No | Sun | Dinner | 2 |
10.34 | 1.66 | Male | No | Sun | Dinner | 3 |
21.01 | 3.50 | Male | No | Sun | Dinner | 3 |
23.68 | 3.31 | Male | No | Sun | Dinner | 2 |
24.59 | 3.61 | Female | No | Sun | Dinner |