calcular cuartiles en python
Parcela cuantil-cuantil usando SciPy (6)
¿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 tenga valores XY como entrada. La función debe graficar los cuantiles de las mediciones contra los cuantiles correspondientes de alguna distribución (normal, uniforme ...).
El gráfico resultante nos permite evaluar en nuestra medición sigue la distribución supuesta o no.
http://en.wikipedia.org/wiki/Quantile-quantile_plot
Tanto R como Matlab proporcionan funciones listas para esto, pero me pregunto cuál sería el método más limpio para implementarlo en Python.
Creo que scipy.stats.probplot
hará lo que quieras. Vea la documentación para 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
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 de np.random
para comparar 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)
Usar qqplot
de statsmodels.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í
Existe ahora en el paquete statsmodels:
http://statsmodels.sourceforge.net/devel/generated/statsmodels.graphics.gofplots.qqplot.html
Si necesita hacer una gráfica 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 trama de QQ frente a una gráfica de probabilidad que es una muestra contra una distribución teórica.
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)