我想用Python pandas显示95%的置信区间,matpolib ......
但是我坚持了,因为对于平常的.std()
我会像这样做:
import pandas as pd
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import math
data = pd.read_table('output.txt',sep=r'\,', engine='python')
Ox = data.groupby(['Ox'])['Ox'].mean()
Oy = data.groupby(['Ox'])['Oy'].mean()
std = data.groupby(['Ox'])['Oy'].std()
plt.plot(Ox, Oy , label = 'STA = '+ str(x))
plt.errorbar(Ox, Oy, std, label = 'errorbar', linewidth=2)
plt.legend(loc='best', prop={'size':9.2})
plt.savefig('plot.pdf')
plt.close()
但是我没有找到可以帮助我的熊猫方法。有人知道吗?
答案 0 :(得分:10)
在正态分布中,区间[μ-2σ,μ+2σ]覆盖率为95.5%,因此 您可以使用2 * std来估计95%的间隔:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame()
df['category'] = np.random.choice(np.arange(10), 1000, replace=True)
df['number'] = np.random.normal(df['category'], 1)
mean = df.groupby('category')['number'].mean()
std = df.groupby('category')['number'].std()
plt.errorbar(mean.index, mean, xerr=0.5, yerr=2*std, linestyle='')
plt.show()
如果您的分布偏斜,最好使用不对称的错误栏,并从百分位数获得95%的间隔。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.stats import skewnorm
df = pd.DataFrame()
df['category'] = np.random.choice(np.arange(10), 1000, replace=True)
df['number'] = skewnorm.rvs(5, df['category'], 1)
mean = df.groupby('category')['number'].mean()
p025 = df.groupby('category')['number'].quantile(0.025)
p975 = df.groupby('category')['number'].quantile(0.975)
plt.errorbar(
mean.index,
mean,
xerr=0.5,
yerr=[mean - p025, p975 - mean],
linestyle='',
)
plt.show()
答案 1 :(得分:5)
对于正态分布〜约95%的值位于围绕平均值的4个标准偏差的窗口内,或者换句话说,95%的值在与平均值的正/负2标准偏差内。见,例如, 68–95–99.7-rule
plt.errorbar
的{{1}}参数指定单边错误栏的长度。因此采取
yerr
其中plt.errorbar(x,y,yerr=2*std)
是标准偏差,显示95%置信区间的误差范围。
答案 2 :(得分:1)
要获得 95% 的置信区间,您需要定义一个函数。
调整:Compute a confidence interval from sample data
def mean_confidence_interval(data, confidence=0.95):
a = 1.0 * np.array(data)
n = len(a)
m, se = np.mean(a), scipy.stats.sem(a)
h = se * scipy.stats.t.ppf((1 + confidence) / 2., n-1)
return m
def bound_confidence_interval(data, confidence=0.95):
a = 1.0 * np.array(data)
n = len(a)
m, se = np.mean(a), scipy.stats.sem(a)
h = se * scipy.stats.t.ppf((1 + confidence) / 2., n-1)
return h
然后定义:
mean = df.groupby(by='yourquery').agg(mean_confidence_interval)
bound = df.groupby(by='yourquery').agg(bound_confidence_interval)
最后使用您选择的库进行绘图:例如情节
import plotly.graph_objects as go
fig = go.Figure(data=go.Scatter(
x=mean[yourquery],
y=mean[yourquery2],
error_y=dict(
type='data', # value of error bar given in data coordinates
array=bound[yourquery2],
visible=True)
))
fig.show()