Python核密度估计

简介

核密度估计是统计学中的一种非参数估计方法,用于估计随机变量的概率密度函数(PDF)。核密度估计提供了一种平滑的近似密度函数,适用于各种统计分析和数据可视化任务。Python中有多种库可以进行核密度估计,本文将介绍两种常用的库:scipyseaborn

密度估计方法

假设我们有一组未知概率分布的样本数据$x_1, x_2, ..., x_n$。核密度估计的目标是估计这些样本数据的概率密度函数$f(x)$。核密度估计的步骤如下:

  1. 选择核函数:核函数是用来平滑样本数据的函数。常用的核函数有高斯核函数(也称为正态核函数)和矩形核函数等。
  2. 选择带宽参数:带宽参数决定了核函数的宽度,从而影响了平滑程度。带宽参数过大会导致平滑过度,过小会导致过拟合。
  3. 计算密度估计值:根据所选的核函数和带宽参数,计算样本数据点的概率密度估计值。

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