barres d'écart-type et d'erreurs dans la fonction tsplot de seaborn en Python

Comment Seaborn calculer ses barres d'erreur? exemple:

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

comment les ci_bars (ou ci_bands) sont-ils calculés?

aussi, est-il possible de faire tsplot tracer dans le style ci_bars où les barres d'erreur ou les bandes correspondent à l'écart-type des valeurs à chaque point temporel? (et pas de l'erreur standard de la moyenne, ou amorce)

18
demandé sur lgd 2015-12-15 18:56:24

2 réponses

Seaborn v0.8.0 (juillet 2017) a été ajouté la possibilité d'utiliser des barres d'erreur pour afficher les écarts-types plutôt que des intervalles de confiance bootstrap dans la plupart des fonctions statistiques en mettant ci="sd". Donc, cela fonctionne maintenant

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

pour les versions précédentes de Seaborn une solution de rechange pour tracer l'écart-type pourrait être d'utiliser matplotlib errorbar sur le dessus de Seaborn tsplot:

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

15
répondu luca 2018-02-17 10:16:47

Depuis le tsplot la fonction ne fournit pas un moyen de définir les valeurs de la barre d'erreur directement ou de changer la méthode utilisée pour les calculer, la seule solution que j'ai trouvé était de corriger le timeseries module:

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

ensuite, pour tracer avec les barres d'erreur de l'écart-type utilisez

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

ou

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

pour tracer avec une bande d'écart type.

Edit: Inspiré par cette réponse sur SO, un autre (probablement plus sensible) serait d'utiliser la suivante au lieu de 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: puisque vous avez demandé comment tsplot calcule les intervalles de confiance: il utilise bootstrap pour estimer la distribution de la valeur moyenne à chaque point temporel et trouve ensuite les valeurs faibles et élevées des percentiles (qui correspondent à l'intervalle de confiance utilisé) à partir de ces distributions. L'intervalle de confiance par défaut est de 68% - équivalent à ± un écart-type de la moyenne, en supposant une distribution normale. Les percentiles inférieurs et supérieurs respectifs sont de 16% et 84%. Vous pouvez modifier l'intervalle de confiance via l' ci mot-clé argument.

10
répondu Martin Valgur 2017-05-23 12:34:17