置信椭圆
置信椭圆(Confidence Ellipse)是一种用来表示二维数据的置信区域的统计工具。它是多元统计分析中常用的图形,通过它可以表示两个变量之间的协方差关系以及同时包含两个变量的可能取值范围。置信椭圆一般用于描述一组二维数据的散布范围,并在一定置信度下包含样本的可能区域。
置信椭圆的形状由两个关键因素决定:
均值向量( μ x , μ y ):表示二维数据的中心位置。协方差矩阵( Σ ):描述两个变量之间的关系。协方差矩阵的特征值和特征向量决定了椭圆的大小和方向。 均值向量(\mu_x, \mu_y):表示二维数据的中心位置。 协方差矩阵(\Sigma):描述两个变量之间的关系。协方差矩阵的特征值和特征向量决定了椭圆的大小和方向。 均值向量(μx,μy):表示二维数据的中心位置。协方差矩阵(Σ):描述两个变量之间的关系。协方差矩阵的特征值和特征向量决定了椭圆的大小和方向。
置信椭圆的大小和形状是根据给定的置信水平(如95%、99%)来计算的,置信水平越高,椭圆的范围越大。
置信椭圆应用场景
置信椭圆通常适用于以下情况:
1. 多元正态分布:当数据服从二维正态分布或接近正态分布时,置信椭圆能够很好地表示数据的分布区域。
2. 两变量的相关性分析:适合用于分析两个变量之间的相关性,如散点图中表示两变量之间的置信区域。
3. 数据集中性可视化:可以帮助判断数据点是否存在极端值或离群点,通过查看数据点是否落在椭圆区域内来评估。
置信椭圆的用途
1. 数据分布的概述:置信椭圆在散点图中可以帮助我们直观理解数据的分布趋势,展示数据点的集中区域。
2. 异常点检测:通过置信椭圆的边界,我们可以识别数据中的异常点,尤其是在高置信水平(如99%)下的数据点。
3. 估计参数置信区间:在双变量模型中,可以用置信椭圆来表示估计值的置信区域,从而了解参数估计的可靠性。
Python代码示例
以下是一个绘制置信椭圆的示例代码。假设我们有一组二维数据点,我们将计算这些数据的均值和协方差矩阵,并使用它们来绘制置信椭圆。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Ellipse
def confidence_ellipse(x, y, ax, n_std=2.0, facecolor='none', **kwargs):
"""
绘制一个置信椭圆,表示数据的分布范围。
x, y: 数据点的坐标。
ax: matplotlib的轴对象。
n_std: 置信范围倍数,2.0对应95%的置信度。
facecolor: 椭圆的填充颜色。
kwargs: 其他可选参数,用于定制椭圆。
"""
# 计算数据的均值和协方差矩阵
if x.size != y.size:
raise ValueError("x 和 y 必须具有相同的长度")
cov = np.cov(x, y)
mean_x = np.mean(x)
mean_y = np.mean(y)
# 特征值和特征向量
eigvals, eigvecs = np.linalg.eigh(cov)
order = eigvals.argsort()[::-1]
eigvals, eigvecs = eigvals[order], eigvecs[:, order]
# 计算椭圆的宽度和高度
width, height = 2 * n_std * np.sqrt(eigvals)
angle = np.degrees(np.arctan2(*eigvecs[:, 0][::-1]))
# 创建椭圆对象
ellipse = Ellipse(xy=(mean_x, mean_y), width=width, height=height, angle=angle, facecolor=facecolor, **kwargs)
# 添加到ax对象
ax.add_patch(ellipse)
return ellipse
# 生成随机数据
np.random.seed(0)
x = np.random.normal(0, 1, 100)
y = 2 * x + np.random.normal(0, 1, 100)
# 绘制散点图和置信椭圆
fig, ax = plt.subplots(figsize=(6, 6))
ax.scatter(x, y, s=10, label="Data points")
confidence_ellipse(x, y, ax, n_std=2, edgecolor='red', linewidth=2, label="95% Confidence Ellipse")
# 图形设置
ax.set_xlabel("X-axis")
ax.set_ylabel("Y-axis")
ax.legend()
plt.title("Scatter plot with 95% Confidence Ellipse")
plt.grid(True)
plt.show()
结果展示:
可以看到大部分点都落在置信区间为95%的置信椭圆内,两变量的相关性很好。
(注:当需要分析两个变量之间的关系时,置信椭圆可以帮助识别变量之间的相关性。如果椭圆形状接近圆形,则表明两个变量几乎不相关;如果椭圆拉得很长,则表明变量之间有较强的线性关系。)
现在我想绘制1σ、2σ和3σ的置信椭圆,可以在图中调用confidence_ellipse函数三次,分别传入不同的 n_std 值。这样可以显示出不同置信水平的椭圆,例如:
• 1σ 对应约68%的置信度。
• 2σ 对应约95%的置信度。
• 3σ 对应约99.7%的置信度。
下面是修改后的代码:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Ellipse
def confidence_ellipse(x, y, ax, n_std=1.0, facecolor='none', **kwargs):
"""
绘制一个置信椭圆,表示数据的分布范围。
x, y: 数据点的坐标。
ax: matplotlib的轴对象。
n_std: 置信范围倍数,1.0对应68%的置信度,2.0对应95%的置信度,3.0对应99.7%的置信度。
facecolor: 椭圆的填充颜色。
kwargs: 其他可选参数,用于定制椭圆。
"""
# 计算数据的均值和协方差矩阵
if x.size != y.size:
raise ValueError("x 和 y 必须具有相同的长度")
cov = np.cov(x, y)
mean_x = np.mean(x)
mean_y = np.mean(y)
# 特征值和特征向量
eigvals, eigvecs = np.linalg.eigh(cov)
order = eigvals.argsort()[::-1]
eigvals, eigvecs = eigvals[order], eigvecs[:, order]
# 计算椭圆的宽度和高度
width, height = 2 * n_std * np.sqrt(eigvals)
angle = np.degrees(np.arctan2(*eigvecs[:, 0][::-1]))
# 创建椭圆对象
ellipse = Ellipse(xy=(mean_x, mean_y), width=width, height=height, angle=angle, facecolor=facecolor, **kwargs)
# 添加到ax对象
ax.add_patch(ellipse)
return ellipse
# 生成随机数据
np.random.seed(0)
x = np.random.normal(0, 1, 100)
y = 2 * x + np.random.normal(0, 1, 100)
# 绘制散点图和置信椭圆
fig, ax = plt.subplots(figsize=(6, 6))
ax.scatter(x, y, s=10, label="Data points")
# 绘制不同置信水平的椭圆
confidence_ellipse(x, y, ax, n_std=1, edgecolor='blue', linewidth=2, label="1σ (68%) Confidence Ellipse")
confidence_ellipse(x, y, ax, n_std=2, edgecolor='red', linewidth=2, label="2σ (95%) Confidence Ellipse")
confidence_ellipse(x, y, ax, n_std=3, edgecolor='green', linewidth=2, label="3σ (99.7%) Confidence Ellipse")
# 图形设置
ax.set_xlabel("X-axis")
ax.set_ylabel("Y-axis")
ax.legend()
plt.title("Scatter plot with 1σ, 2σ, and 3σ Confidence Ellipses")
plt.grid(True)
plt.show()
结果展示: