web-dev-qa-db-fra.com

Parcelle Quantile-Quantile avec SciPy

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.

64
John

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

enter image description here

83
Geoff

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:

enter image description here

La documentation et d'autres exemples sont ici

31
Akavall

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.

http://statsmodels.sourceforge.net/devel/generated/statsmodels.graphics.gofplots.qqplot_2samples.html

15
ccap
3
grasshopper

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)
2
John

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)
1
sushmit
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"

0
Ravi G