绘制95%置信区间errorbar python pandas数据帧

时间:2017-06-17 10:40:47

标签: python pandas matplotlib

我想用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()

但是我没有找到可以帮助我的熊猫方法。有人知道吗?

3 个答案:

答案 0 :(得分:10)

使用2 * std估计95%的间隔

在正态分布中,区间[μ-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()

结果:

result

使用百分位数

如果您的分布偏斜,最好使用不对称的错误栏,并从百分位数获得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()

结果:

enter image description here

答案 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()