Matplotlib: ¿Cómo convertir un histogtwig a una función de masa de probabilidad discreta?

Tengo una pregunta con respecto a la función hist () con matplotlib.

Estoy escribiendo un código para trazar un histogtwig de datos cuyo valor varía de 0 a 1. Por ejemplo:

values = [0.21, 0.51, 0.41, 0.21, 0.81, 0.99] bins = np.arange(0, 1.1, 0.1) a, b, c = plt.hist(values, bins=bins, normed=0) plt.show() 

El código anterior genera un histogtwig correcto (no pude publicar una imagen porque no tengo suficiente reputación). En términos de frecuencias, se ve así:

 [0 0 2 0 1 1 0 0 1 1] 

Me gustaría convertir esta salida en una función de masa de probabilidad discreta, es decir, para el ejemplo anterior, me gustaría obtener los siguientes valores de frecuencia:

 [ 0. 0. 0.333333333 0. 0.166666667 0.166666667 0. 0. 0.166666667 0.166666667 ] # each item in the previous array divided by 6) 

Pensé que simplemente necesitaba cambiar el parámetro en la función hist () a ‘normado = 1’. Sin embargo, obtengo las siguientes frecuencias de histogtwig:

 [ 0. 0. 3.33333333 0. 1.66666667 1.66666667 0. 0. 1.66666667 1.66666667 ] 

Esto no es lo que espero y no sé cómo obtener la función de masa de probabilidad discreta, cuya sum debería ser 1.0. Se hizo una pregunta similar en el siguiente enlace ( enlace a la pregunta ), pero no creo que la pregunta se resolviera.

Aprecio tu ayuda por adelantado.

La razón es norm=True da la función de densidad de probabilidad . En la teoría de la probabilidad, una función de densidad de probabilidad o densidad de una variable aleatoria continua , describe la probabilidad relativa de que esta variable aleatoria tome un valor dado.

Consideremos un ejemplo muy simple.

 x=np.arange(0.1,1.1,0.1) array([ 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ]) # Bin size bins = np.arange(0.05, 1.15, 0.1) np.histogram(x,bins=bins,normed=1)[0] [ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.] np.histogram(x,bins=bins,normed=0)[0]/float(len(x)) [ 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] # Change the bin size bins = np.arange(0.05, 1.15, 0.2) np.histogram(x,bins=bins,normed=1)[0] [ 1., 1., 1., 1., 1.] np.histogram(x,bins=bins,normed=0)[0]/float(len(x)) [ 0.2, 0.2, 0.2, 0.2, 0.2] 

Como puede ver en lo anterior, la probabilidad de que x se encuentre entre [0.05-0.15] o [0.15-0.25] es 1/10 mientras que si cambia el tamaño de bin a 0.2 entonces la probabilidad de que se encuentre entre [0.05-0.25] o [0.25-0.45] es 1/5 . Ahora estos valores de probabilidad reales dependen del tamaño del contenedor, sin embargo, la densidad de probabilidad es independiente del tamaño del contenedor. Por lo tanto, esta es la única forma correcta de hacer lo anterior, de lo contrario, uno tendría que indicar el ancho de la bandeja en cada uno de los gráficos.

Entonces, en su caso, si realmente desea trazar el valor de probabilidad en cada intervalo (y no la densidad de probabilidad), simplemente puede dividir la frecuencia de cada histogtwig por el número de elementos totales. Sin embargo, le sugiero que no haga esto a menos que esté trabajando con variables discretas y cada una de sus bandejas represente un único valor posible de esta variable.

Cómo trazar una función de probabilidad continua (PDF) a partir de un histogtwig – Resuelto en Python. Consulte este blog para una explicación detallada. ( http://howdoudoittheeasiestway.blogspot.com/2017/09/plotting-continuous-probability.html ) De lo contrario, puede usar el siguiente código.

 n, bins, patches = plt.hist(A, 40, histtype='bar') plt.show() n = n/len(A) n = np.append(n, 0) mu = np.mean(n) sigma = np.std(n) plt.bar(bins,n, width=(bins[len(bins)-1]-bins[0])/40) y1= (1/(sigma*np.sqrt(2*np.pi))*np.exp(-(bins - mu)**2 /(2*sigma**2)))*0.03 plt.plot(bins, y1, 'r--', linewidth=2) plt.show()