No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

No se trata de lo que quieres comprar, sino de quién quieres ser. Invierte en tu educación con el precio especial

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

11 Días
18 Hrs
57 Min
50 Seg

Distribuciones continuas

9/17
Recursos

Aportes 88

Preguntas 12

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Sin palabras, Una clase perfecta!!!

En la distribución Normal (Gaussiana) a partir de los datos del Excel debería ser

arr = df['Normally Distributed Housefly Wing Lengths'].values[3:]

En vez de

arr = df['Normally Distributed Housefly Wing Lengths'].values[4:]

Ya que Python inicia el conteo desde 0 y no desde 1, por lo que se está perdiendo el primer dato.

Este curso me está exigiendo bastante, pero a la vez estoy muy feliz con ello, porque en esa escalada de exigencia ̷y̷ ̷s̷u̷f̷r̷i̷m̷i̷e̷n̷t̷o̷ el profesor explica muy bien, y dándole ̷u̷n̷o̷s̷ ̷c̷a̷b̷e̷z̷a̷z̷o̷s̷ ̷a̷l̷ ̷t̷e̷c̷l̷a̷d̷o̷ una vuelta, se logra entender.

Muy bien hasta aquí (~ ̄▽ ̄)~

Y pensar que esto es solo el inicio de todo el mundo de distribuciones existentes:

Vengo superfrustrado del curso de Análisis de datos con python porque se manejan muchos términos que se dan por hecho que se conocen, pero hasta el momento no había curso en la plataforma que diera esas bases. El anterior curso de probabilidad y estadística tenía cosas muy básicas y nada aplicado en código. Espero que con este curso cambie un poco eso. Hasta el momento va excelente!

Pueden cargar el archivo con los datos a Google Colab sin la necesidad de descargar algún archivo de manera local. Se usa la url donde estan los datos. y el método pd.read_csv() Quedaria de la siguiente forma

url = 'https://seattlecentral.edu/qelp/sets/057/s057.txt'
df = pd.read_csv(url)
arr = df
values, dist = np.unique(arr, return_counts=True)
print(values)
plt.bar(values, dist)

A continuación adjunto un resumen de la clase:

En la distribución Normal (Gaussiana) a partir de los datos del Excel debería ser
arr = df['Normally Distributed Housefly Wing Lengths'].values[3:]

En vez de
arr = df['Normally Distributed Housefly Wing Lengths'].values[4:]

Ya que Python inicia el conteo desde 0 y no desde 1, por lo que se está perdiendo el primer dato.

Minuto 12:13, es a partir del elemento 3!
Los datos numéricos empiezan con 36, entonces la instrucción sería

df['Normally Distributed Housefly Wing Lengths'].values[3:]
#EXERCISE TO PRACTICE CONTINUOUS DISTRIBUTION

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

#Transforming continuous distribution formula, into code (density dist)

def gaussian(x,mu,sigma):
    return 1/(sigma*np.sqrt(2*np.pi))*np.exp(-0.5*pow((x-mu)/sigma,2))

#Using scipy Acumulated distribution 

dist= norm(0,1)
x_1=np.arange(-4,4,0.1)
y_1=[dist.cdf(value) for value in x_1]



if __name__ == "__main__":
    x= np.arange(-4,4,0.1)
    y= gaussian(x,0.0,1.0)
    plt.plot(x,y)
    plt.savefig('barras_cont.png')
    plt.show

    plt.plot(x_1,y_1)
    plt.savefig('barras_cont_2.png')
    plt.show

#EXERCISE TO PRACTICE CONTINUOUS DISTRIBUTION - WINGS SIZE OF FLIES 
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

df= pd.read_excel('s057.xls')
arr= df['Normally Distributed Housefly Wing Lengths'].values[3:]
values,dist= np.unique(arr,return_counts=True)


if __name__ == "__main__":
    plt.bar(values,dist)
    plt.savefig('flies.png')
    plt.show

El término 1/σ√2Pi sirve para normalizar la distribución. Esto quiere decir que las probabilidad de que el valor esté entre menos infinito y más infinito tiene que ser igual a 1 (al 100%).
Esto se traduce en que la integral de P(X), es decir el área bajo la curva, es igual a 1. De ahí que el valor máximo de la probabilidad acumulada también sea 1.

Buena clase, hasta esa explicación fue muy adecuada “pandas es la version de excel para python”… jajaj 💚

Para poder ejecutar correctamente el apartado “Distribución normal (gausiana) a partir de los datos” he necesitado añadir la siguiente linea al comienzo del notebook.

!pip install xlrd==1.2.0

Será que algún día lograré saber tanto como el profe (?)
Who knows…

Tambien pueden usar el excel directamente desde la url.

df = pd.read_excel('https://seattlecentral.edu/qelp/sets/057/s057.xls')

μ : media de la distribución(también conocida como promedio) indica en que punto va a estar la punta de la campana(respecto al eje X)
σ: desviación estándar de la distribución: Indica que tan alejados o dispersos están otros datos respecto a μ, por lo cual entre mayor sea σ, va a ser mas ancha la campana y entre menor será, la campana será mas delgada

También se puede utilizar para dividir la campanas en segmentos(como si fueran percentiles) para analizar segmentos especiales de la campana
Una imagen aclara mucho más

como que pdf no es formato de documento portátil XD

Si corren en Colab y la celda para leer el archivo de excel muestra el error:

Pandas requires version ‘1.2.0’ or newer of ‘xlrd’ (version ‘1.1.0’ currently installed)

Corran el commando:

!pip install xlrd==1.2.0 --upgrade

Reinicien el runtime y corran la celda 1 donde importan las librerías.

Para cargar un archivo , les recomiendo hacer el drive.mount y con %cd dan la ubicación del archivo, en este caso yo tengo el archivo guardado en mi drive en la ruta : ‘/content/drive/MyDrive/Colab Notebooks/Curso Platzi estadística probabilidad/’.

Una vez estén en la ubicación correcta los pasos para leer el dataframe son los mismos de siempre:

df = pd.read_excel(‘s057.xls’)

Es indispensable actualizar pandas y xlrd:

!pip install --upgrade pandas
!pip install --upgrade xlrd

De esta manera solo tiene que guardar el archivo y ya siempre lo van a poder leer desde pandas; lo que se debe hacer siempre es el mount, pero realmente es muy sencillo y no toma casi tiempo.

Espero les sirva.

Por si alguien quiere tener la fórmula mejor escrita en el colab:

$$P(X) = \frac{1}{\sigma \sqrt{2 \pi}} \space e ^{-\frac{1}{2}\left(\frac{X-\mu}{\sigma} \right)^2 }$$

Para automatizar la subida del archivo de excel al disco de colab sin tener q hacerlo manualmente cada vez se puede utilizar el siguiente comando :
!curl -O -J “https://seattlecentral.edu/qelp/sets/057/s057.xls

Pensaba que este curso, me serviria de apoyo para el curso de estadistica computacional en python, pero creo que es al reves

Los enlaces del Colab se están bloqueando, ¿es posible hacer un github para evitarlo?

(
(

Estaba usando Opera para este curso, les recomiendo usar Chrome ya que en Opera no podía subir el archivo de Excel a google colab. Para que lo tengan en cuenta.

Buenas! Comparto mi versión del código del profe con algunas modificaciones para poder escribirlo en VS Code y hacerlo correr de manera local

import pandas as pd
import numpy as np 
import matplotlib.pyplot as plt
from scipy.stats import norm

def main():
    #In order to import pandas you must install the dependencies via pip.
    #You may also need to install xlrd to use the read_excel fuction from pandas

    df = pd.read_excel('/aqui va la ruta a tu archivo local/s057.xls')
    arr = df['Normally Distributed Housefly Wing Lengths'].values[3:]
    #Getting the unique values and the count of each unique value
    values, dfDist = np.unique(arr, return_counts=True)
    dfDist = dfDist/len(arr) #Getting the percentage of each unique possible values

    mu = arr.mean()
    sigma = arr.std()
    theoDist = norm(mu, sigma)
    x = np.arange(30,60,0.1) #Building an arrange that englobes all the possible values in the df
    y = [theoDist.pdf(value) for value in x] #Applying the normal distribution to all x values in order to get y values
                                             #that complies the Gaussian function
    
    fig, ax = plt.subplots()
    ax.bar(values, dfDist)
    ax.plot(x, y)

    plt.show()



if __name__=='__main__':
    main()

Antes en 3 o 4 horas de estudio alcanzaba a ver varias lecciones, pero en este curso solo alcanzo una por día de estudio. Hay que repasar y estudiar mucho todos los conceptos y aplicaciones. Esta clase me gusto mucho.

En vez de

arr = df[‘Normally Distributed Housefly Wing Lengths’].values[4:]

Es
df.iloc[3:,0].values

Elimina primeras 3, toma primera columna, no tiene que escribir mucho, es un error [4] porque no toma valor 36

Les comparto esta herramienta online que permite entender las distribuciones de probabilidad continuas y discretas, con sus definiciones y permite jugar con ella. También te permite encontrar la mejor distribución de probabilidad para un conjunto de datos phitter.io

Si no pueden cargar el archivo excel por la version de pandas xlrd incompatible:

ImportError: Pandas requires version '1.2.0' or newer of 'xlrd' (version '1.1.0' currently installed).

Corran esto:

!pip install xlrd==2.0.1

por si google colab le da el siguiente error como a mi: pandas requires version ‘1.2.0’ or newer of ‘xlrd’ (version ‘1.1.0’ currently installed). Se soluciona agregando la siguiente instrucción en un bloque de código aparte, para realizar la actualización:

pip install --upgrade xlrd

Distribuciones continuas
La distribución continua má usual es la distribución normal o Gaussiana, que es la distribución más usual en la realidad, o en todo caso podemos acomodar dicha distribución a una normal (Teorema del Límite central) tal como vimos con la distribución binomial.
Etá definida por:

Nota:
El cálculo con esta función (integrales) no es sencillo por lo que por lo general se usan tablas o programas (como este caso) para calcularlas

Otra forma de la función de distribución acumulada de probabilidad (Cumulative distribution function)

mu = 0.0 # promedio o media
sigma =  1.0  #desviación estándar

x = np.arange(-4,4,0.1)
y = norm.cdf(x,mu, sigma)
plt.plot(x, y);

Una manera bastante sencilla de adecuar el data frame en este caso, es:

a veces cuando hay demasiada información en una clase puede resultar chocante, pero en esta la verdad está todo preciso.

Cada vez se pone más interesante la clase. La carrera de Data Science se pone muy interesante.

Desde ahora quiero ver todo lo que Francisco Camacho enseña. Qué increíble clase.

He generado una distribución gaussiana pseudo-continua usando 100 tiradas de moneda repitiendo el proceso 10.000.000 de veces

Los invito a usar el código variando p(se tarda un rato en cargar en google collab)

p = 0.5
n = 100
k = pow(10,7)
arr = []

for i in range(k):
arr.append(binomial(n,p))

s = np.unique(arr,return_counts=True)

x = s[0]
y = s[1]/k

plt.plot(x,y)
plt.show()

Comunidad Platzi
Como diferencia cuando debo utilizar .pdf y .cdf
Saludos

Muy buena clase

Eres un excelente profesor, todo muy claro y bien explicado!!

Buena clase, muchas gracias profe!

La distribución normal, también conocida como distribución gaussiana, es una función de probabilidad que describe cómo se distribuyen los valores de una variable aleatoria. Tiene forma de campana, donde la media, mediana y moda son iguales y se encuentran en el centro. Es fundamental en estadísticas y se utiliza en muchas aplicaciones de Data Science y Machine Learning. Su importancia radica en el teorema del límite central, que establece que, bajo ciertas condiciones, la suma de muchas variables aleatorias independientes tiende a seguir una distribución normal.
Excelente clase, muy buena explicación por parte de profesor.
El 68% de los datos en una distribución normal se encuentran dentro de una desviación estándar de la media, lo que significa que la mayoría de los valores están bastante cerca del promedio. 📊✨
Acabo de analizar la probabilidad de que el valor de Bancolombia desde el año 2008 hasta 2024 pueda estar en el rango de 2.500 y 35.000 mil pesos colombianos. aqui les dejo el codigo y la aplicacion de sus usos: `bancolombia = np.array(data_new["BIC(COL)"],dtype='float64') ``# values, dist = np.unique(bancolombia,return_counts=True) #min -> 10_000, max -> 50_000, sep = 5_000#Funcion PDF en este casi, ya que los tipos de datos son float.``mu = bancolombia.mean()sigma = bancolombia.std()dist = norm(0,1)``#Rnago de valores para la PDF``x = np.linspace(min(bancolombia),max(bancolombia),100)``#Calcular la PDF``y = norm.pdf(x,mu,sigma)` `#Integracion de la funcion PDF con CDF.``a = 25_000b = 35_000probalidad = norm.cdf(b,mu,sigma) - norm.cdf(a,mu,sigma) ``# en este caso se considera b,a, por el numero mayor y buscamos diferencia.` `#Sombrear el area entre a y b``x_fill = np.linspace(a,b,100)y_fill = norm.pdf(x_fill,mu,sigma)plt.fill_between(x_fill, y_fill, color='y', alpha=0.5, label=``f``'Probabilidad: {0.5475``:.2%``}')plt.plot(x, y, label='PDF')plt.title('PDF para los valores de la acción de Bancolombia')plt.xlabel('Valor de la acción')plt.ylabel('Densidad de probabilidad')plt.grid(True)plt.legend()print(``f``"Probabilidad de que el valor de la accion esté entre {a} y {b} COP es: {probalidad``:.4f``}")plt.show()`
No entiendo por qué al graficar los valores funciona bien : plt.bar(values, dist) pero, al momento de calcular la estimación de la distribución de probabilidad se debe de cambiar por : plt.bar(values, dist/len(arr)) Tal vez falta de bases matemáticas pero agradezco que me saquen de la duda.
Que buena clase

Me sorprendio el desarrollo y la forma de las distribuciones continuas. A tenerlas en cuenta al momento de resolverlas.

Si alguien está utilizando vs code para seguir el curso. Debe instalar también xlrd para poder utilizar el comando que lee el archivo de excel
Decidí hacer una estimación de distribución para el ejercicio de simuladores de secuencias de la anterior clase![](https://static.platzi.com/media/user_upload/image-48fa5f7a-f029-4c71-a95f-b38f73545d01.jpg) este fue el resultado ![](https://static.platzi.com/media/user_upload/image-2ab390ea-d9ab-4c8d-bf13-9db89cb63e40.jpg) y este es el codigo que usé:```js def plot_hist(num_trials): num_values=[0,1,2,3] new_arr=[] for _ in range(num_trials): new_arr.append(binomial(n,p)) sim=np.unique(new_arr,return_counts=True)[1]/len(new_arr) teorica=[binom(3,0.5).pmf(k) for k in num_values] x2=np.arange(0,4, 0.1) mu2=(np.array(new_arr)).mean() sigma2=(np.array(new_arr)).std() dist=norm(mu2,sigma2) y2=[dist.pdf(values) for values in x2] plt.plot(x2,y2) plt.bar(num_values,sim,color='red') plt.bar(num_values,teorica,alpha=0.5,color='blue') plt.title('{} experimentos'.format(num_trials)) plt.show() print(teorica) plot_hist(50) ```La verdad no estoy seguro si el procedimiento que usé es el correcto, si alguien podría comentarlo se lo agradecería

Encontré un video en inglés que explica muy bien porque la distribución normal es una función de ese tipo y es muy buena, dura 24 minutos:

oigan recuerdo que en mis clases de probabilidad de una variable continua P(X=a) = 0 con a elemento de R, osea : no se pueden calcular las probabilidades de puntos en concreto, seria igual a cero.

por alguna razón si usamos math y no numpy para algunos cálculos de la función, ya no es compatible con mathpltolib y no hace el gráfico, genera un error

la parte matemática es lo fácil, el código es lo dificil y no lo explica paso a paso

Realmente arr arranca desde 3 con el valor 36

arr = df['Normally Distributed Housefly Wing Lengths'].values[3:]

No hay nada mas anormal que ver una distribución normal

![](import numpy as np
import matplotlib.pyplot as plt

def gaussian(x, mu, sigma):
if sigma == 0:
return np.nan
else:
return 1 / (sigma * np.sqrt(2 * np.pi)) * np.exp(-0.5 * pow((x - mu) / sigma, 2))

x = np.arange(-4, 4.1, 0.1)
y = gaussian(x, 1.0, 1.0)

plt.plot(x, y)
plt.show())

La distribución exponencial

  • Es una distribución continuas de probabilidad utilizada para describir variables aleatorias que representan tiempos entre eventos en un proceso de Poisson. La función de densidad de probabilidad de una distribución exponencial esta dada por:
f(x) = λ * e^(-λx)
  • donde λ es un parámetro positivo conocido como tasa de fallo o tasa de ocurrencia, y x es la variable aleatoria que representa el tiempo entre eventos.

  • La distribución exponencial tiene una forma de campana de cola hacia la derecha, lo cual significa que tiene una alta probabilidad de ocurrencia en valores pequeños de x y una probabilidad cada vez menor a medida que x se vuelve más grande. Su media es 1/λ y su varianza es también 1/λ^2.

  • La distribución exponencial se utiliza en una variedad de aplicaciones, como en la modelización de tiempos entre fallos en sistemas mecánicos, el tiempo entre llamadas telefónicas en una central telefónica, el tiempo entre llegadas de clientes a una tienda, entre otros. También se utiliza en

para los que tengan error al leer el excel desde pandas


!pip install xlrd==2.0.1

me encanta que deje el berraco colab, ome esos profesores que no lo dejan si que hacen que uno este pendiente si escribio el codigo como es en vez de estar pendiente de entender el tema.

Distribuciones Continuas

Distribucion Normal (Gaussiana)

Esta constituida por una exponencial donde el exponente esta elevado al cuadrado

Su forma grafica es una campana llamada Campana de Gauss

Otras Distribuciones

  • D. Exponencial
  • D. Pareto
  • D. Gamma
  • D. Beta

para aquelllos q en el ultimo les sale el error

  • ufunc ‘divide’ not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ‘‘safe’’*
    tansfromando el arr a int64 se solucion
arr =  np.int64(arr)

en wsl o linux requiere instalar dependencias de excel
conda or pip install xlrd

Estimando una distribución Normal

Estas clases cada vez se ponen más interesantes 😎

Lo único es que debió poner un 3 en vez de un 4, se comió el 36. Del resto todo bien.

Habiamos usado cdf y pmf, pero el pdf no entendi a que se refiere.

adicional, segun entiendo en norm(0,1), el 0 se refiere a que el centro de la campana esta en cero, y el 1 es el ancho de esta, pero de donde sacamos esos valores?

Un dato curioso, quise colocar mas líneas y una leyendo y revisando por internet encontré esta página.

Quizas le sea de ayuda.

En la fórmula de la distribución normal exp representa al número irracional e que tiene un valor aproximado de 2.71828

Clase para detenerse. Tomarse una pausa, y volver a repasarlo hasta poder interiorizar la aplicación. Magistral explicación.

Hola.
Les comparto el código de la práctica de Gauss con el archivo de excel realizado desde mi entorno local.
Las librerias que tiene mi entorno son las siguientes:

asttokens==2.0.5
colorama==0.4.4
cycler==0.10.0
executing==0.6.0
icecream==2.1.0
kiwisolver==1.3.1
matplotlib==3.4.2
numpy==1.20.3
pandas==1.2.4
Pillow==8.2.0
Pygments==2.9.0
pyparsing==2.4.7
python-dateutil==2.8.1
pytz==2021.1
scipy==1.6.3
six==1.16.0
xlrd==2.0.1

Y el código, aca en mi GitHub.

https://tuit.es/N3nc3

Sigo recomendando mucho el uso de icecream para ir revisando el valor que toman nuestras variables, como lo hemos trabajado en collab.
Saludos!

Como python empieza a contar de cero “0” las listas, filas o columnas, las filas a leer en el archivo de excel s057.xls empiezan en 3

arr = df['Normally Distributed Housefly Wing Lengths'].values[3:]

Investigué algunas de las otras distribuciones mencionadas, acá les dejo la información si tienen curiosidad también:

  • Exponencial: se utiliza comúnmente para modelar situaciones en las que se quiere estudiar el_ tiempo de espera entre eventos sucesivos_.

  • Pareto: se utiliza para modelar fenómenos con una distribución de cola larga, donde_ una pequeña proporción de eventos extremos tiene un impacto significativo_. Es útil para analizar y comprender la concentración de riqueza, ingresos, tamaños de ciudades y otros fenómenos que exhiben un comportamiento de desigualdad extrema.

  • Gamma: se utiliza comúnmente para modelar eventos que exhiben comportamiento de espera o duración.

  • Beta: se utiliza para modelar variables aleatorias que representan proporciones o probabilidades. Es particularmente útil cuando se trabaja con datos acotados entre 0 y 1 y se necesita capturar la incertidumbre en la estimación de proporciones o tasas de éxito.

  • Laplace: utilizada para modelar variables aleatorias con colas pesadas en los extremos y una concentración de probabilidades alrededor de su media. Se aplica en diversas áreas, como el modelado de ruido, el análisis financiero y la detección de outliers.

Distribución gaussiana con SciPy

Es fantástico ver los conceptos de probabilidad en código, pero también sientes que llegaste un poco tarde XD

Buena clase. Voy a aprender un poco de Numpy para comprender mejor las funciones y sus estructuras de datos 😃

tuve problemas para descargar el archivo desde chrome asi que abri la pag desde FIreFox y si me dejo descargar sin problemas… por si les pasa lo mismo

alguien mas tuvo problemas para descargar el arcivo de excel? es que el enlace parece estar roto

import pandas as pd
import numpy as np 
import matplotlib.pyplot as plt
from scipy.stats import norm 

def gaussian(x, mu, sigma):
    return 1/(sigma*np.sqrt(2*np.pi))*np.exp(-0.5*pow((x-mu)/sigma,2))

if __name__=='__main__':

    x = np.arange(-4, 4, 0.1)
    y = gaussian(x, 0.0, 1.0)
    #plt.plot(x,y)
    #plt.show()

    #distribucion normal gaussiana con la libreria scipy
    dist=norm(0, 1)
    x = np.arange(-4, 4, 0.1)
    y = [dist.pdf(value) for value in x]    # pdf funcion de densidad de probabilidad
    #plt.plot(x,y)
    #plt.show()

    #distribucion normal gaussiana con la libreria scipy
    dist=norm(0, 1)
    x = np.arange(-4, 4, 0.1)
    y = [dist.cdf(value) for value in x]       # cdf densidad de probabilidad acumulada
    #plt.plot(x,y)
    #plt.show()
    
    #distribucion de datos
    df = pd.read_excel("s057.xls", sheet_name="s057")
    datos = df['Normally Distributed Housefly Wing Lengths'].values[4:104]
    values, dist = np.unique(datos, return_counts=True)
    plt.bar(values,dist)
    plt.show()

    #estimacion de distribucion
    mu = datos.mean()
    sigma = datos.std()
    x = np.arange(30, 60, 0.1)
    dist = norm(mu, sigma)
    y = [dist.pdf(value) for value in x ]
    plt.plot(x,y)
    values,dist = np.unique(datos, return_counts=True)
    plt.bar(values, dist/len(datos))
    plt.show()

Me parece que colab brinda varias concesiones con respecto a la sintaxis del código, usando el mismo código de la clase salen algunos errores, bueno este código esta corregido.
Cada ve mas interesante todo el procesamiento de datos.

import pandas as pd
import numpy as np 
import matplotlib.pyplot as plt
from scipy.stats import norm 

def gaussian(x, mu, sigma):
    return 1/(sigma*np.sqrt(2*np.pi))*np.exp(-0.5*pow((x-mu)/sigma,2))

if __name__=='__main__':

    x = np.arange(-4, 4, 0.1)
    y = gaussian(x, 0.0, 1.0)

    plt.plot(x,y)
    plt.show()
import numpy as np
from numpy.random import binomial
from scipy.stats import binom
from math import factorial
import matplotlib.pyplot as plt

# simulación con 100 lanzamientos de moneda equilibrada
# (ejecuta esta celda varias veces para observar la variación en los resultados)
p=0.5
n=3
binomial(n, p)

# Vamos a hacer un experimento generando una muestra de conjuntos de lanzamientos de a 3 monedas
arr = []
for _ in range(100):
  arr.append(binomial(n, p))

def plot_hist(num_trials):
    values = [0,1,2,3]
    arr = []
    for _ in range(num_trials):
        arr.append(binomial(3, 0.5))
    distribucion_simulada = np.unique(arr, return_counts=True)[1]/len(arr)
    distribucion_teorica = [binom(3, 0.5).pmf(k) for k in values]
    plt.bar(values, distribucion_teorica, label = 'teoría', color = 'red')
    plt.bar(values, distribucion_simulada, label = 'simulación', alpha = 0.5, color = 'blue')
    plt.title('simulación con {} experimentos'.format(num_trials))
    plt.show()

plot_hist(20)
plot_hist(200)
plot_hist(20000)