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