¿Cómo crearías un gráfico qq usando Python?
Suponiendo que tiene un gran conjunto de medidas y está utilizando alguna función de trazado que toma valores XY como entrada. La función debe graficar los cuantiles de las medidas contra los cuantiles correspondientes de alguna distribución (normal, uniforme ...).
La gráfica resultante nos permite luego evaluar en nuestra medición si sigue la distribución supuesta o no.
http://en.wikipedia.org/wiki/Quantile-quantile_plot
Tanto R como Matlab proporcionan funciones listas para usar para esto, pero me pregunto cuál sería el método más limpio para implementar en Python.
python
statistics
scipy
Juan
fuente
fuente
probplot
? docs.scipy.org/doc/scipy/reference/generated/…Respuestas:
Creo que
scipy.stats.probplot
hará lo que quieras. Consulte la documentación para obtener más detalles.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()
Resultado
fuente
El uso
qqplot
destatsmodels.api
es otra opción:Ejemplo muy básico:
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()
Resultado:
La documentación y más ejemplos están aquí.
fuente
scipy
astatsmodels
statsmodels
sería una buena elección.Si necesita hacer un gráfico QQ de una muestra frente a otra, statsmodels incluye qqplot_2samples (). Al igual que Ricky Robinson en un comentario anterior, esto es lo que considero una gráfica QQ frente a una gráfica de probabilidad que es una muestra frente a una distribución teórica.
http://statsmodels.sourceforge.net/devel/generated/statsmodels.graphics.gofplots.qqplot_2samples.html
fuente
Se me ocurrió esto. Quizás puedas mejorarlo. Especialmente el método de generar los cuantiles de la distribución me parece engorroso.
Puede reemplazar
np.random.normal
con cualquier otra distribución denp.random
para comparar los datos con otras distribuciones.#!/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)
fuente
Ahora existe en el paquete statsmodels:
http://statsmodels.sourceforge.net/devel/generated/statsmodels.graphics.gofplots.qqplot.html
fuente
Para aumentar la confusión en torno a las gráficas QQ y las gráficas de probabilidad en los mundos Python y R, esto es lo que dice el manual SciPy :
Si lo prueba
scipy.stats.probplot
, verá que de hecho compara un conjunto de datos con una distribución teórica. Gráficos QQ, OTOH, comparan dos conjuntos de datos (muestras).R tiene funciones
qqnorm
,qqplot
yqqline
. De la ayuda de R (versión 3.6.3):En resumen, R's
qqnorm
ofrece la misma funcionalidad quescipy.stats.probplot
proporciona la configuración predeterminadadist=norm
. Pero el hecho de que lo hayan llamadoqqnorm
y que se supone que "produce una gráfica QQ normal" puede confundir fácilmente a los usuarios.Finalmente, una advertencia. Estos gráficos no reemplazan las pruebas estadísticas adecuadas y deben usarse solo con fines ilustrativos.
fuente
¿Qué tan grande es su muestra? Aquí hay otra opción para probar sus datos contra cualquier distribución usando la biblioteca OpenTURNS . En el siguiente ejemplo, genero una muestra x de 1.000.000 de números a partir de una distribución uniforme y la pruebo con una distribución normal. Puede reemplazar x por sus datos si lo modifica como
x= [[x1], [x2], .., [xn]]
import openturns as ot x = ot.Uniform().getSample(1000000) g = ot.VisualTest.DrawQQplot(x, ot.Normal()) g
En mi cuaderno de Jupyter, veo:
Si está escribiendo un guión, puede hacerlo de manera más adecuada
from openturns.viewer import View` import matplotlib.pyplot as plt View(g) plt.show()
fuente
Puedes usar 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)
fuente
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()
Aquí probplot dibuja las medidas del gráfico frente a la distribución normal que se especificó en dist = "norm"
fuente