Función de distribución de probabilidad Python

Tengo un conjunto de datos sin procesar y tengo que identificar la distribución de esos datos. ¿Cuál es la forma más fácil de trazar una función de distribución de probabilidad? He intentado encajarlo en distribución normal.

Pero tengo más curiosidad por saber qué distribución llevan los datos dentro de sí mismos.

No tengo ningún código para mostrar mi progreso porque no he podido encontrar ninguna función en Python que me permita probar la distribución del conjunto de datos. No quiero dividir los datos y forzarlos para que encajen pueden ser normales o sesgar la distribución.

¿Hay alguna forma de determinar la distribución del conjunto de datos? Cualquier sugerencia apreciada.

¿Es este un enfoque correcto? Ejemplo
Esto es algo cercano a lo que estoy buscando pero, de nuevo, se ajusta a los datos en la distribución normal. Ejemplo

EDITAR:

La entrada tiene millones de filas y la muestra corta se da a continuación.

Hashtag,Frequency #Car,45 #photo,4 #movie,6 #life,1 

Los rangos de frecuencia de 1 a 20,000 cuentan y estoy tratando de identificar la distribución de la frecuencia de las palabras clave. Intenté trazar un histogtwig simple pero obtengo la salida como una sola barra.

Código:

 import pandas import matplotlib.pyplot as plt df = pandas.read_csv('Paris_random_hash.csv', sep=',') plt.hist(df['Frequency']) plt.show() 

Salida Salida de conteo de frecuencia

Este es un ejemplo de trabajo mínimo para mostrar un histogtwig. Solo resuelve parte de su pregunta, pero puede ser un paso hacia su meta. Tenga en cuenta que la función de histogram le proporciona los valores en las dos esquinas de la bandeja y tiene que interpolar para obtener el valor central.

 import numpy as np import matplotlib.pyplot as pl x = np.random.randn(10000) nbins = 20 n, bins = np.histogram(x, nbins, density=1) pdfx = np.zeros(n.size) pdfy = np.zeros(n.size) for k in range(n.size): pdfx[k] = 0.5*(bins[k]+bins[k+1]) pdfy[k] = n[k] pl.plot(pdfx, pdfy) 

Puede ajustar sus datos usando el ejemplo que se muestra en:

¿Ajustando la distribución empírica a las teóricas con Scipy (Python)?

¿Intentaste usar la biblioteca marítima? Tienen una buena función de estimación de la densidad del núcleo. Tratar:

 import seaborn as sns sns.kdeplot(df['frequency']) 

Encontrará las instrucciones de instalación aquí.

Definitivamente una pregunta de estadísticas: suena como si estuvieras tratando de hacer una prueba de probabilidad de si la distribución es significativamente similar a las distribuciones normal, lognormal, binomial, etc. Lo más fácil es realizar una prueba de normal o lognormal como se explica a continuación.

Establezca el valor de corte de Pvalue, generalmente si su valor de P <= 0.05 entonces NO se distribuye normalmente.

En Python, use SciPy, solo necesita que se devuelva su valor de P para la prueba, por lo que 2 valores de retorno de esta función (estoy ignorando las entradas opcionales (no necesarias) aquí para mayor claridad):

import scipy.stats

[W, Pvalue] = scipy.stats.morestats.shapiro(x)

Realizar la prueba de normalidad de Shapiro-Wilk. La prueba de Shapiro-Wilk prueba la hipótesis nula de que los datos se extrajeron de una distribución normal.

Si desea ver si se distribuye lognormalmente (siempre que no pase la prueba P anterior), puede probar:

import numpy

[W, Pvalue] = scipy.stats.morestats.shapiro(numpy.log(x))

Interprete de la misma manera: acabo de probar en una simulación lognormalmente distribuida conocida y obtuve un valor de 0.17 P en la prueba np.log (x) y un número cercano a 0 para la prueba estándar shapiro (x). Eso me dice que lognormalmente distribuido es la mejor opción, normalmente distribuido falla miserablemente.

Lo hice simple, que es lo que encontré que buscabas. Para otras distribuciones, es posible que tenga que trabajar más en las líneas de los gráficos QQ https://en.wikipedia.org/wiki/Q%E2%80%93Q_plot y no simplemente siguiendo algunas pruebas que propuse. Eso significa que tiene un gráfico de la distribución que está tratando de ajustar a sus datos trazados. Aquí hay un ejemplo rápido que puede llevarlo por ese camino si así lo desea:

 import numpy as np import pylab import scipy.stats as stats mydata = whatever data you are looking to fit to a distribution stats.probplot(mydata, dist='norm', plot=pylab) pylab.show() 

Arriba puede sustituir cualquier cosa por dist='norm' de la biblioteca scipy http://docs.scipy.org/doc/scipy/reference/tutorial/stats/continuous.html#continuous-distributions-in-scipy-stats y luego encontrar su nombre de scipy (debe agregar parámetros de forma de acuerdo con la documentación como stats.probplot(mydata, dist='loggamma', sparams=(1,1), plot=pylab) o para el estudiante T stats.probplot(mydata, dist='t', sparams=(1), plot=pylab) ), luego mire la gráfica y vea qué tan cerca están sus datos de esa distribución. Si los puntos de datos están cerca, ha encontrado su distribución. Te dará un valor R ^ 2 también en la gráfica; más cerca de 1 mejor será el ajuste en general.

Y si desea continuar intentando hacer lo que está haciendo con el dataframe, intente cambiar a: plt.hist(df['Frequency'].values)

Por favor, vote por esta respuesta si responde a su pregunta 🙂 Necesito alguna recompensa para obtener respuestas sobre mis propios dilemas de progtwigción.

La única distribución que llevan los datos dentro de sí misma es la probabilidad empírica . Si tiene datos como datos de matriz numpy 1d, puede calcular el valor de la función de distribución empírica en x como la frecuencia relativa acumulativa de los valores menores o iguales a x:

 d[d <= x].size / d.size 

Esta es una función escalonada, por lo que no tiene una función de densidad de probabilidad asociada, sino una función de masa de probabilidad donde la masa de cada valor observado es su frecuencia relativa. Para calcular las frecuencias relativas:

 values, freqs = np.unique(data, return_counts=True) rfreqs = freqs / data.size 

Esto no significa que los datos sean una muestra aleatoria de su distribución empírica. Si desea saber de qué distribución son una muestra sus datos (si los hay) con solo mirar los datos, la respuesta es que no puede. Pero eso es más sobre estadísticas que sobre progtwigción.

El histogtwig no hace lo que crees, intenta mostrar un gráfico de barras. El histogtwig necesita cada punto de datos por separado en una lista, no la frecuencia en sí. Tienes [3,2,0,4, …] el combate debe tener [1,1,1,2,2,4,4,4,4]. No se puede determinar una distribución de probabilidad automáticamente.

Creo que estás haciendo una pregunta ligeramente diferente:

¿Cuál es la correlación entre mis datos en bruto y la curva a la que los he mapeado?

Este es un problema conceptual, y usted está tratando de entender los significados de los valores R y R al cuadrado. Comience trabajando a través de esta publicación del blog de MiniTab . Es posible que desee hojear esta Guía de gráficos de Kaledia que no es de Python para comprender las clases de curvas que deben ajustarse y el uso de los mínimos cuadrados medios para ajustar las curvas.

Probablemente te hayan votado porque es una pregunta de matemáticas más que una pregunta de progtwigción.

Puede que me falte algo, pero parece que se está pasando por alto un punto importante: el conjunto de datos que está describiendo es un conjunto de datos categóricos. Es decir, los valores de x no son numéricos, son solo palabras (#Car, #photo, etc.). El concepto de la forma de una distribución de probabilidad no tiene sentido para un conjunto de datos categóricos, ya que no hay un orden lógico para las categorías. ¿Cómo sería un histogtwig? ¿Sería #Car la primera bandeja? ¿O estaría todo el camino a la derecha de tu gráfica? A menos que tenga algún criterio para cuantificar sus categorías, entonces tratar de hacer juicios basados ​​en la forma de la distribución no tiene sentido.

Aquí hay un pequeño ejemplo basado en texto para aclarar lo que estoy diciendo. Supongamos que encuesta a un grupo de personas y les pregunto cuál es su color favorito. Trazo los resultados:

  Red | ## Green | ##### Blue | ####### Yellow | ##### Orange | ## 

Eh, parece que las preferencias de color están normalmente distribuidas Espera, ¿y si hubiera puesto los colores al azar en un orden diferente en mi gráfico:

  Blue | ####### Yellow | ##### Green | ##### Orange | ## Red | ## 

Supongo que los datos están realmente sesgados positivamente? No es así, por supuesto, para un conjunto de datos categóricos la forma de la distribución no tiene sentido. Solo si tuviera que decidir cómo cuantificar cada hashtag en su conjunto de datos tendría significado el problema. ¿Quieres comparar la longitud de un hashtag con su frecuencia? ¿O el orden alfabético de un hashtag para su frecuencia? Etc.