web-dev-qa-db-fra.com

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

Comment Seaborn calcule-t-il 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 sont calculés les ci_bars (ou ci_bands)?

est-il également possible de faire tsplot un tracé dans le style ci_bars où les barres ou bandes d'erreur correspondent à l'écart type des valeurs à chaque instant? (et non erreur standard de moyenne ou bootstraps)

19
lgd

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

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

Pour les versions précédentes de Seaborn , une solution de contournement pour tracer l'écart type pourrait être d'utiliser la barre d'erreur matplotlib au-dessus de tsplot seaborn:

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

Étant donné que la fonction tsplot ne fournit pas un moyen de définir directement les valeurs de la barre d'erreur ou de changer la méthode utilisée pour les calculer, la seule solution que j'ai trouvée était de patcher le module 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

Ensuite, pour tracer avec les barres d'erreur d'é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)

tracer avec une bande d'écart type.

Edit: Inspiré par cette réponse sur SO, une autre approche (probablement plus judicieuse) serait d'utiliser ce qui suit 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 ses intervalles de confiance: il utilise bootstrapping pour estimer la distribution de la valeur moyenne à chaque instant et trouve ensuite les valeurs de percentile bas et haut ( correspondant à 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 bas et haut respectifs sont de 16% et 84%. Vous pouvez modifier l'intervalle de confiance via l'argument de mot clé ci.

10
Martin Valgur