Comment voulez-vous créer un qq-plot en utilisant Python?
En supposant que vous avez un grand ensemble de mesures et que vous utilisez une fonction de traçage qui prend des valeurs XY en entrée. La fonction doit tracer les quantiles des mesures par rapport aux quantiles correspondants d'une distribution (normale, uniforme ...).
Le graphique obtenu nous permet ensuite d’évaluer dans notre mesure la distribution supposée ou non.
http://en.wikipedia.org/wiki/Quantile-quantile_plot
R et Matlab fournissent tous deux des fonctions prêtes à l'emploi pour cela, mais je me demande quelle serait la méthode la plus propre pour l'implémentation en Python.
Je pense que scipy.stats.probplot
fera ce que vous voulez. Voir le documentation pour plus de détails.
import numpy as np
import pylab
import scipy.stats as stats
measurements = np.random.normal(loc = 20, scale = 5, size=100)
stats.probplot(measurements, dist="norm", plot=pylab)
pylab.show()
Résultat
Utiliser qqplot
of statsmodels.api
est une autre option:
Exemple très basique:
import numpy as np
import statsmodels.api as sm
import pylab
test = np.random.normal(0,1, 1000)
sm.qqplot(test, line='45')
pylab.show()
Résultat:
La documentation et d'autres exemples sont ici
Si vous devez effectuer un graphe QQ d’un échantillon par rapport à un autre, statsmodels inclut qqplot_2samples (). Comme Ricky Robinson dans un commentaire ci-dessus, c'est ce que je considère comme un graphique QQ par rapport à un graphique de probabilité qui est un échantillon comparé à une distribution théorique.
Il existe maintenant dans le paquet statsmodels:
http://statsmodels.sourceforge.net/devel/generated/statsmodels.graphics.gofplots.qqplot.html
Je suis venu avec ça. Peut-être que vous pouvez l'améliorer. En particulier, la méthode de génération des quantiles de la distribution me semble lourde.
Vous pouvez remplacer np.random.normal
par une autre distribution de np.random
pour comparer les données avec d'autres distributions.
#!/bin/python
import numpy as np
measurements = np.random.normal(loc = 20, scale = 5, size=100000)
def qq_plot(data, sample_size):
qq = np.ones([sample_size, 2])
np.random.shuffle(data)
qq[:, 0] = np.sort(data[0:sample_size])
qq[:, 1] = np.sort(np.random.normal(size = sample_size))
return qq
print qq_plot(measurements, 1000)
Vous pouvez utiliser le bokeh
from bokeh.plotting import figure, show
from scipy.stats import probplot
# pd_series is the series you want to plot
series1 = probplot(pd_series, dist="norm")
p1 = figure(title="Normal QQ-Plot", background_fill_color="#E8DDCB")
p1.scatter(series1[0][0],series1[0][1], fill_color="red")
show(p1)
import numpy as np
import pylab
import scipy.stats as stats
measurements = np.random.normal(loc = 20, scale = 5, size=100)
stats.probplot(measurements, dist="norm", plot=pylab)
pylab.show()
Ici, probplot dessine les mesures du graphe par rapport à la distribution normale qui sont spécifiées dans dist = "norm"