web-dev-qa-db-ja.com

Pythonのseaborn tsplot関数の標準偏差とエラーバー

Seabornはどのようにエラーバーを計算しますか?例:

import numpy as np; np.random.seed(22)
import seaborn as sns; sns.set(color_codes=True)
x = np.linspace(0, 15, 31)
data = np.sin(x) + np.random.Rand(10, 31) + np.random.randn(10, 1)
ax = sns.tsplot(data=data, err_style="ci_bars")
plt.show()

ci_bars(またはci_bands)はどのように計算されますか?

また、エラーバーまたはバンドが各時点での値の標準偏差に対応するci_barsスタイルでtsplotプロットを作成することは可能ですか? (および標準誤差、またはブートストラップではありません)

19
lgd

Seaborn v0.8.0(2017年7月)に、bootstrapではなくエラーバーを使用して標準偏差を表示する機能が追加されました= ci = "sd"を配置することにより、ほとんどの統計関数の信頼区間。

sns.tsplot(data=data, ci="sd") 

以前のSeabornバージョンの場合、標準偏差をプロットするための回避策は、seaborn tsplotの上にmatplotlibエラーバーを使用することです:

import numpy as np;
import seaborn as sns;
import pandas as pd
import matplotlib.pyplot as plt

# create a group of time series
num_samples = 90
group_size = 10
x = np.linspace(0, 10, num_samples)
group = np.sin(x) + np.linspace(0, 2, num_samples) + np.random.Rand(group_size, num_samples) + np.random.randn(group_size, 1)
df = pd.DataFrame(group.T, index=range(0,num_samples))

# plot time series with seaborn
ax = sns.tsplot(data=df.T.values) #, err_style="unit_traces")

# Add std deviation bars to the previous plot
mean = df.mean(axis=1)
std  = df.std(axis=1)
ax.errorbar(df.index, mean, yerr=std, fmt='-o') #fmt=None to plot bars only

plt.show()

enter image description here

17
luca

tsplot関数はエラーバーの値を直接設定したり、それらの計算に使用する方法を変更したりする方法を提供しないため、私が見つけた唯一の解決策はtimeseriesモジュールにパッチを当てることでした:

import seaborn.timeseries

def _plot_std_bars(*args, central_data=None, ci=None, data=None, **kwargs):
    std = data.std(axis=0)
    ci = np.asarray((central_data - std, central_data + std))
    kwargs.update({"central_data": central_data, "ci": ci, "data": data})
    seaborn.timeseries._plot_ci_bars(*args, **kwargs)

def _plot_std_band(*args, central_data=None, ci=None, data=None, **kwargs):
    std = data.std(axis=0)
    ci = np.asarray((central_data - std, central_data + std))
    kwargs.update({"central_data": central_data, "ci": ci, "data": data})
    seaborn.timeseries._plot_ci_band(*args, **kwargs)

seaborn.timeseries._plot_std_bars = _plot_std_bars
seaborn.timeseries._plot_std_band = _plot_std_band

次に、標準偏差誤差範囲でプロットするには

ax = sns.tsplot(data, err_style="std_bars", n_boot=0)

または

ax = sns.tsplot(data, err_style="std_band", n_boot=0)

標準偏差バンドでプロットします。

編集: この答え SOに触発され、別の(おそらくより賢明な)アプローチは、tsplotの代わりに以下を使用することです。

import pandas as pd
import seaborn as sns

df = pd.DataFrame.from_dict({
    "mean": data.mean(axis=0),
    "std": data.std(axis=0)
}).reset_index()

g = sns.FacetGrid(df, size=6)
ax = g.map(plt.errorbar, "index", "mean", "std")
ax.set(xlabel="", ylabel="")

Edit2:tsplotがその信頼区間を計算する方法について尋ねたので、各時点で ブートストラップを使用して平均値の分布を推定 を使用し、次に低いパーセンタイル値と高いパーセンタイル値を見つけます(これらの分布から使用されている信頼区間に対応しています)。デフォルトの信頼区間は68%です–正規分布を仮定した場合、平均の±1標準偏差に相当します。それぞれの低パーセンタイルと高パーセンタイルは16%と84%です。 ciキーワード引数を使用して、信頼区間を変更できます。

10
Martin Valgur