【问题标题】:Plot confidence interval of a duration series绘制持续时间序列的置信区间
【发布时间】:2021-12-30 09:27:03
【问题描述】:

我测量了 6000 个请求的持续时间。

我现在得到了一个包含 6000 个元素的数组。每个元素表示连接请求的持续时间(以毫秒为单位)。 [3,2,2,3,4,2,2,4,2,3,3,4,2,4,4,3,3,3,4,3,2,3,5,5,2,4,4,2,2,2,3,5,3,2,2,3,3,3,5,4........]

我想用 Python 以清晰的方式绘制置信区间。

你知道我应该如何绘制它们吗?

【问题讨论】:

  • 绘制置信区间是什么意思? CI 只是一个值(嗯,两个)。由于每个时间点都有一个值,因此您可以获得整个系列的一个 CI
  • 我在 y 轴上有称为 operation 的单位,在 x 轴上有时间单位 ms。我从数组中计算出平均持续时间为 2.6585 毫秒。 CI 介于 2.635 毫秒和 2.682 毫秒之间。我想绘制 CI 所在的平均值和值。如果我能以某种方式将异常值添加到情节中,那就完美了
  • @back2stackoverflow 我认为整个时间序列的 CI 没有意义。您通常做的是计算每个时间点的 CI(假设您有许多 6000 个元素的数组)。但是绘制一个由平均值 CI 包围的时间序列对我来说似乎很奇怪。我建议重新考虑你的目标。
  • 我只有一个 6000 元素的数组用于一项操作。操作就是请求本身

标签: python pandas matplotlib seaborn


【解决方案1】:

据我了解,这段代码应该可以回答您的问题

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
from statistics import NormalDist

X = np.random.sample(100)
data = ((X - min(X)) / (max(X) - min(X))) * 3 + 3
confidence_interval = 0.95

def getCI(data, ci):
    normalDist = NormalDist.from_samples(data)
    z = NormalDist().inv_cdf((1 + ci) / 2.)
    p = normalDist.stdev * z / ((len(data) - 1) ** .5)
    return normalDist.mean, normalDist.mean - p, normalDist.mean + p

avg, lower, upper = getCI(data, confidence_interval)
sns.set_style("whitegrid")
plt.figure(figsize=(8, 4))
sns.histplot(data, bins = 10)
plt.axvspan(lower, upper, facecolor='r', alpha=0.2)
plt.axvline(avg, color = 'b', label = 'Average')
plt.ylabel("Operations")
plt.xlabel("Connection Request Duration (ms)")

plt.show()

对于箱线图:

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
from statistics import NormalDist

X = np.random.sample(100)
data = ((X - min(X)) / (max(X) - min(X))) * 3 + 3
confidence_interval = 0.95

def getCI(data, ci):
    normalDist = NormalDist.from_samples(data)
    z = NormalDist().inv_cdf((1 + ci) / 2.)
    p = normalDist.stdev * z / ((len(data) - 1) ** .5)
    return normalDist.mean, normalDist.mean - p, normalDist.mean + p

avg, lower, upper = getCI(data, confidence_interval)
sns.set_style("whitegrid")
plt.figure(figsize=(8, 4))
sns.boxplot(data = data, orient = "h")
plt.axvspan(lower, upper, facecolor='r', alpha=0.4)
plt.axvline(avg, color = 'b', label = 'Average')
plt.ylabel("Operations")
plt.xlabel("Connection Request Duration (ms)")
plt.yticks([0],["Server Retry Request Delay"])

plt.savefig("fig.png")
plt.show()

对于多个图:

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
from statistics import NormalDist

X1, X2 = np.random.sample(100), np.random.sample(100)
data1, data2 = ((X1 - min(X1)) / (max(X1) - min(X1))) * 3 + 3, ((X2 - min(X2)) / (max(X2) - min(X2))) * 2 + 3
confidence_interval = 0.95

def getCI(data, ci):
    normalDist = NormalDist.from_samples(data)
    z = NormalDist().inv_cdf((1 + ci) / 2.)
    p = normalDist.stdev * z / ((len(data) - 1) ** .5)
    return normalDist.mean, normalDist.mean - p, normalDist.mean + p

sns.set_style("whitegrid")
avg1, lower1, upper1 = getCI(data1, confidence_interval)
avg2, lower2, upper2 = getCI(data2, confidence_interval)

fig = plt.figure(figsize=(12, 6))
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212, sharex = ax1, sharey = ax1)

sns.boxplot(data = data1, orient = "h", ax = ax1)
ax1.axvspan(lower1, upper1, facecolor='r', alpha=0.4)
ax1.axvline(avg1, color = 'b', label = 'Average')

sns.boxplot(data = data2, orient = "h", ax = ax2)
ax2.axvspan(lower2, upper2, facecolor='r', alpha=0.4)
ax2.axvline(avg2, color = 'b', label = 'Average')
ax2.set_xlabel("Connection Request Duration (ms)")

plt.setp(ax1.get_xticklabels(), visible=False)
plt.setp(ax1.get_yticklabels(), visible=False)
plt.setp(ax2.get_yticklabels(), visible=False)
fig.text(0.08, 0.5, "Operations", va='center', rotation='vertical')

plt.show()

【讨论】:

  • 你能像i.stack.imgur.com/h6mOH.png这样改变轴吗?
  • 您能否详细说明您想要更改的部分?因为我认为它是一个相似的轴你的意思是让情节水平吗?
  • i.stack.imgur.com/vD7xz.png。看,我试图在箱线图中绘制数据,但它的说明并不好。 y 轴仅包含一个操作,x 轴包含以 ms 为单位的时间。我只需要在 y 轴上进行一次操作
  • 箱线图中的缺口是错误的,不是显示平均值而是显示中位数
  • 箱线图将中值显示为一条线,将均值显示为一个点(它是可选的)。该框的范围从第一四分位数到第三四分位数。您是否要在箱线图上隐藏置信区间?
猜你喜欢
  • 2021-12-08
  • 1970-01-01
  • 2022-10-21
  • 2013-07-25
  • 2018-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多