如何在Python中绘制置信区间?
置信区间是一种根据观察数据的统计数据计算得出的估计值,它给出了可能包含具有特定置信水平的总体参数的值范围。
均值的置信区间是总体均值可能位于其间的值范围。如果我对明天的天气预报在 -100 度到 +100 度之间,我可以 100% 确定这将是正确的。但是,如果我预测的温度在 20.4 到 20.5 摄氏度之间,我就不那么自信了。请注意随着间隔的减小,置信度是如何降低的。这同样适用于统计置信区间,但它们也依赖于其他因素。
95% 的置信区间会告诉我,如果我们从总体中抽取无限数量的样本,每次都计算区间,那么在这些区间的 95% 中,区间将包含真实的总体平均值。因此,通过一个样本,我们可以计算样本均值,并从中得出一个区间,该区间很可能包含真实的总体均值。
置信区间作为一个概念是由 Jerzy Neyman 在 1937 年发表的一篇论文中提出的。 置信区间有多种类型,其中一些最常用的是:CI 表示均值,CI 表示中值,CI 表示两者之间的差异表示比例的 CI 和比例差异的 CI。
让我们来看看这与Python的关系。
使用 lineplot() 计算给定基础分布的 CI
Seaborn中提供的 lineplot()函数是Python的数据可视化库,最适合显示一段时间内的趋势,但它也有助于绘制置信区间。
句法:
sns.lineplot(x=None, y=None, hue=None, size=None, style=None, data=None, palette=None, hue_order=None, hue_norm=None, sizes=None, size_order=None, size_norm=None, dashes=True, markers=None, style_order=None, units=None, estimator=’mean’, ci=95, n_boot=1000, sort=True, err_style=’band’, err_kws=None, legend=’brief’, ax=None, **kwargs,)
Parameters:
- x, y: Input data variables; must be numeric. Can pass data directly or reference columns in data.
- hue: Grouping variable that will produce lines with different colors. Can be either categorical or numeric, although color mapping will behave differently in latter case.
- style: Grouping variable that will produce lines with different dashes and/or markers. Can have a numeric dtype but will always be treated as categorical.
- data: Tidy (“long-form”) dataframe where each column is a variable and each row is an observation.
- markers: Object determining how to draw the markers for different levels of the style variable.
- legend: How to draw the legend. If “brief”, numeric “hue“ and “size“ variables will be represented with a sample of evenly spaced values.
Return: The Axes object containing the plot.
默认情况下,该图在 x 的每个值处聚合多个 y 值,并显示集中趋势的估计值和该估计值的置信区间。
例子:
Python3
# import libraries
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
# generate random data
np.random.seed(0)
x = np.random.randint(0, 30, 100)
y = x+np.random.normal(0, 1, 100)
# create lineplot
ax = sns.lineplot(x, y)
Python3
# import libraries
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
# create random data
np.random.seed(0)
x = np.random.randint(0, 10, 10)
y = x+np.random.normal(0, 1, 10)
# create regression plot
ax = sns.regplot(x, y, ci=80)
Python3
# import libraries
import pandas
import numpy
from sklearn.utils import resample
from sklearn.metrics import accuracy_score
from matplotlib import pyplot as plt
# load dataset
x = numpy.array([180,162,158,172,168,150,171,183,165,176])
# configure bootstrap
n_iterations = 1000 # here k=no. of bootstrapped samples
n_size = int(len(x))
# run bootstrap
medians = list()
for i in range(n_iterations):
s = resample(x, n_samples=n_size);
m = numpy.median(s);
medians.append(m)
# plot scores
plt.hist(medians)
plt.show()
# confidence intervals
alpha = 0.95
p = ((1.0-alpha)/2.0) * 100
lower = numpy.percentile(medians, p)
p = (alpha+((1.0-alpha)/2.0)) * 100
upper = numpy.percentile(medians, p)
print(f"\n{alpha*100} confidence interval {lower} and {upper}")
在上面的代码中,变量 x 将存储从 0(包含)到 30(不包含)的 100 个随机整数,变量 y 将存储来自高斯(正态)分布的 100 个样本,该分布以 0 为中心,扩展/标准差为1。NumPy操作通常在逐个元素的基础上在成对的数组上完成。在最简单的情况下,两个数组必须具有完全相同的形状,如上例所示。最后,在seaborn库的帮助下创建了一个默认为 95% 置信区间的线图。通过更改位于 [0, 100] 范围内的参数“ci”的值,可以轻松更改置信区间,这里我没有传递此参数,因此它认为默认值 95。
浅蓝色阴影表示该点周围的置信水平,如果置信度较高,则阴影线会更粗。
使用 regplot() 计算给定基础分布的 CI
seaborn.regplot() 有助于绘制数据和线性回归模型拟合。此函数还允许绘制置信区间。
句法:
seaborn.regplot( x, y, data=None, x_estimator=None, x_bins=None, x_ci=’ci’, scatter=True, fit_reg=True, ci=95, n_boot=1000, units=None, order=1, logistic=False, lowess=False, robust=False, logx=False, x_partial=None, y_partial=None, truncate=False, dropna=True, x_jitter=None, y_jitter=None, label=None, color=None, marker=’o’, scatter_kws=None, line_kws=None, ax=None)
Parameters: The description of some main parameters are given below:
- x, y: These are Input variables. If strings, these should correspond with column names in “data”. When pandas objects are used, axes will be labeled with the series name.
- data: This is dataframe where each column is a variable and each row is an observation.
- lowess: (optional) This parameter take boolean value. If “True”, use “statsmodels” to estimate a nonparametric lowess model (locally weighted linear regression).
- color: (optional) Color to apply to all plot elements.
- marker: (optional) Marker to use for the scatterplot glyphs.
Return: The Axes object containing the plot.
基本上,它在散点图中包含一条回归线,有助于查看两个变量之间的任何线性关系。下面的示例将展示如何使用它来绘制置信区间。
例子:
蟒蛇3
# import libraries
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
# create random data
np.random.seed(0)
x = np.random.randint(0, 10, 10)
y = x+np.random.normal(0, 1, 10)
# create regression plot
ax = sns.regplot(x, y, ci=80)
regplot()函数的工作方式与lineplot()相同,默认情况下具有 95% 的置信区间。通过更改位于 [0, 100] 范围内的参数“ci”的值,可以轻松更改置信区间。在这里,我通过了 ci=80,这意味着绘制了 80% 的置信区间而不是默认的 95% 置信区间。
浅蓝色阴影的宽度表示回归线周围的置信水平。
使用 Bootstrapping 计算 CI
Bootstrapping 是一种测试/度量,它使用带有替换的随机抽样。它给出了样本估计的准确性(偏差、方差、置信区间、预测误差等)的度量。它允许使用随机抽样方法估计大多数统计数据的抽样分布。它也可用于构建假设检验。
例子:
蟒蛇3
# import libraries
import pandas
import numpy
from sklearn.utils import resample
from sklearn.metrics import accuracy_score
from matplotlib import pyplot as plt
# load dataset
x = numpy.array([180,162,158,172,168,150,171,183,165,176])
# configure bootstrap
n_iterations = 1000 # here k=no. of bootstrapped samples
n_size = int(len(x))
# run bootstrap
medians = list()
for i in range(n_iterations):
s = resample(x, n_samples=n_size);
m = numpy.median(s);
medians.append(m)
# plot scores
plt.hist(medians)
plt.show()
# confidence intervals
alpha = 0.95
p = ((1.0-alpha)/2.0) * 100
lower = numpy.percentile(medians, p)
p = (alpha+((1.0-alpha)/2.0)) * 100
upper = numpy.percentile(medians, p)
print(f"\n{alpha*100} confidence interval {lower} and {upper}")
导入所有必要的库后,创建一个大小为 n=10 的样本 S 并将其存储在变量 x 中。使用简单循环生成 1000 个人工样本 (=k),每个样本大小 m=10(因为 m<=n)。这些样本称为自举样本。它们的中位数被计算并存储在列表“中位数”中。借助matplotlib库绘制来自 1000 个自举样本的中位数直方图,并使用样本统计量的置信区间公式计算基于样本数据的指定置信水平下统计量总体值的上限和下限.