Sergio Alejandro Martínez
Sin palabras, Una clase perfecta!!!
Daniel Andrés Giraldo Benites
el profesor explica los conceptos de forma muy clara
Juan R. Vergara M.
SI, excelente.
Comprender la distribución normal o gaussiana es fundamental para cualquier persona que trabaje con datos. A diferencia de las distribuciones discretas como la binomial, las distribuciones continuas describen variables aleatorias que pueden tomar cualquier valor, no solo números enteros. Aquí se muestra cómo construir, graficar y verificar una gaussiana usando Python, partiendo de un conjunto de datos reales sobre la longitud de alas de moscas domésticas.
¿Qué es la distribución gaussiana y cómo se escribe en Python?
La distribución normal, también conocida como la campana de Gauss, es una de las distribuciones continuas más importantes en probabilidad y estadística [1:06]. Su forma matemática es una exponencial cuyo argumento está elevado al cuadrado, y depende de dos parámetros clave:
En Python, la función se implementa usando NumPy para las operaciones matemáticas. Se calcula el coeficiente 1 / (sigma * np.sqrt(2 * np.pi)) y se multiplica por np.exp(-0.5 * pow((x - mu) / sigma, 2)) [2:53]. Al generar valores de x entre -4 y 4 con incrementos de 0.1, y aplicar la función con µ = 0 y σ = 1, se obtiene la clásica forma de campana.
¿Cómo afectan los parámetros µ y σ a la forma de la curva?
Cambiar el valor de µ desplaza la campana horizontalmente. Por ejemplo, si µ pasa de 0 a 1, la curva se mueve hacia la derecha sin cambiar su forma [4:37]. Por otro lado, reducir σ hace que la campana sea más delgada, concentrando los datos más cerca de la media. Esta intuición es esencial: µ posiciona y σ controla la dispersión.
¿Cómo se usa SciPy para construir distribuciones normales?
La librería SciPy ofrece el objeto norm, importado desde scipy.stats, que simplifica la creación de distribuciones normales [5:22]. Se define la distribución con norm(loc=0, scale=1) y luego se evalúa la función de densidad de probabilidad (PDF) con el método .pdf(x). El resultado es idéntico al obtenido con la función manual.
También es posible calcular la distribución acumulada de probabilidad (CDF) usando .cdf(x) [6:27]. Esta función representa la integral de la gaussiana y, dado que no tiene solución analítica sencilla, SciPy la resuelve de forma numérica mediante aproximaciones. La CDF tiene forma de S y muestra la probabilidad acumulada hasta cada valor de x.
¿Cómo verificar que datos reales siguen una distribución gaussiana?
Para conectar la teoría con la práctica, se utiliza un archivo Excel con datos sobre la longitud de alas de moscas domésticas (housefly wing lengths), que contiene una muestra de aproximadamente cien individuos [8:03].
El flujo de trabajo en Google Colab es directo:
pd.read_excel(), que convierte el archivo en un data frame [9:21]..values.arr[4:]) [10:29].Para calcular frecuencias, se emplea np.unique() con el argumento return_counts=True, que devuelve los valores únicos y cuántas veces se repite cada uno [11:15]. Al graficar estas frecuencias con un diagrama de barras en Matplotlib, la forma resultante se asemeja visualmente a una campana.
¿Qué es la estimación paramétrica y por qué importa?
Para confirmar que los datos siguen una gaussiana, se calcula el promedio con arr.mean() y la desviación estándar con arr.std() directamente desde NumPy [13:02]. Estos valores se usan como parámetros de una distribución normal teórica construida con SciPy.
Al superponer la curva teórica sobre el histograma normalizado (dividiendo los conteos entre la longitud del arreglo), ambas coinciden con precisión [14:42]. Este procedimiento se denomina estimación paramétrica: ajustar los parámetros de un modelo teórico usando estadísticos calculados directamente de los datos.
El resultado demuestra que la distribución normal no es solo una abstracción matemática, sino que emerge de forma natural en datos del mundo real. Existen además otras distribuciones continuas como la exponencial, Pareto, gamma y beta, cada una con aplicaciones en contextos específicos [16:00].
¿Has trabajado con datos que sigan una distribución diferente a la normal? Comparte tu experiencia.
Sergio Alejandro Martínez
Sin palabras, Una clase perfecta!!!
Daniel Andrés Giraldo Benites
el profesor explica los conceptos de forma muy clara
Juan R. Vergara M.
SI, excelente.
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.
Bryan Duarte
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í (~ ̄▽ ̄)~
Christian Sanclemente
Si jajaja, a veces estos temas se ponen complejos, pero el todo es practicar mucho.
Daniel Andrés Giraldo Benites
créeme que es de los cursos que mas me han gustado a pesar de haberme complicado algunos conceptos me gusta el echo de aprender cosas nuevas
Y pensar que esto es solo el inicio de todo el mundo de distribuciones existentes:
Sebastián Andrade
Hola, hice una estimacion parametrica de la velocidad a la que viajan los asteroides que estuvieron mas cerca de nuestro planeta en los primeros 7 dias de febrero usando una de las API de la NASA para recolectar los datos
Sebastián Andrade
Probablemente con un dataset mas grande lo hubiese hecho pero el limite la la API son 7 dias nada mas, sin embargo me gusto hacer el experimento
Sebastián Andrade
He cambiado el plot de barras por un hist y creo que se ve mejor el ajuste
Joel Eduardo Gaspar
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!
Francisco Camacho
Profesorme alegro que te este gustando y que sea claro e iluminador, cuentame mas de los conceptos y vacios que haga falta profundizar.
Daniel Andrés Giraldo Benites
Este curso complementa muy bien el de análisis de datos con Python.. es muy bueno para obtener la base teórica requerida
Juan Sebastian Villalba Torres
Rafael Rivera
sebastián Giraldo Vargas
muchas gracias!
Diego Camilo Araque Barrera
A continuación adjunto un resumen de la clase:
Camilo Gomez Osorio
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.
Tomas Dale
Buen punto
Daniel Noreña
Hola, algo que no me quedo muy claro es la diferencia entre pdf y pmf? Entendí que se refieren a lo mismo pero no estoy seguro de ello.
Jacobo G. Cerdán
Si se compara, indica que los formatos de archivo PDF son más comunes en uso en comparación con los formatos de archivo PMF. Pero en los aspectos de seguridad, los formatos de archivo PMF son más seguros que los formatos de archivo PDF, ya que tienen la capacidad de proteger el contenido y, por lo tanto, proporcionar la confidencialidad adecuada a los datos. Ambos también se asemejan a la funcionalidad que los usuarios sin licencia solo pueden leer en el formato correspondiente.
Si quieres saber más, entra a esta página: https://sooluciona.com/diferencias-entre-pdf-y-pmf/
Sebastián Andrade
te refieres a pdf y cdf?
SI te refieres a esto, la cdf es la probabilidad acumulada, es decir la integral de la funcion debido a que es una funcion continua, si fuera discreta seria la sumatoria.
Miguel Angel Reyes Moreno
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:]
Daniel Andrés Giraldo Benites
umm he visto que otros compañeros han puesto lo mismo peor no entiendo porque?
Maria Alejandra Diaz Rojas
Daniel, si abres el excel puedes ver que el primer valor es 36. Si te fijas en detalle el primer array que nos da python sobre los datos, quitando las posiciones donde hay strings, se empieza con 36. Como python, con los arreglos toma la primera posición como [0], por eso se empieza desde el 3.
Diego Fernando Torres Coy
Daniel Andrés Giraldo Benites
uff genial muchas gracias por compartir tu código
CRISTIAN BARBERO PÉREZ
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.
Alfonso Morán
Pero de donde sale el raíz de 2*pi?
CRISTIAN BARBERO PÉREZ
Es el resultado de la integral, aquí puedes ver como lo demuestran
Edwin Barbosa Rodriguez
El link del archivo en excel no esta disponible. Seria importante poderlo dejar en los recursos de las clase. Saludos.
Carlos Mazzaroli
Joseph Lázaro Ricardo
Pandas requires version "1.2.0" or higher, imprimo la version de Pandas en Colab y dice 1.3.5 entonces si cumple, no se como arreglarlo.
¿Alguien me puede ayudar?
Tom Enrique Calderón Ramos
Me pasó lo mismo, usa:
!pip install xlrd==2.0.1
Gabriela Obregón Ortiz
Excelente ¡muchas gracias! estaba con el mismo problema.
Diego Alejandro Lesmes
Buena clase, hasta esa explicación fue muy adecuada "pandas es la version de excel para python"... jajaj :green_heart:
Daniel Andrés Giraldo Benites
jajaja mori con esa definición
Fernando Rodriguez-izquierdo Serrano
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
David Castillo
A mi tambien me pidió atualizar la versión de panda. Lo bueno es con los mensajes de error uno puede investigar mucho jejeje.
Rodrigo Garza
Gracias a este ayuda logré continuar la clase, indispensable para los que toman el curso ahora (en mi caso junio de 2022)
Adrian Duran
Será que algún día lograré saber tanto como el profe (?) Who knows....
Aaron Contreras Garibay
Tambien pueden usar el excel directamente desde la url.
df = pd.read_excel('https://seattlecentral.edu/qelp/sets/057/s057.xls')
Leandro Tenjo
Buen truco. Así no hay que importar el archivo cada vez
Gracias ✌🏼
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)
Gran aporte Juan, gracias por compartir,
Me estaba sacando el siguiente error:
ImportError Traceback (most recent call last) <ipython-input-7-b5bcfca36080> in <module>() ----> 1 df = pd.read_excel('s057.xls') 2 arr = df['Normally Distributed Housefly Wing Lengths'].values[4:] 3 values, dist = np.unique(arr, return_counts=True) 4 print(values) 5 plt.bar(values, dist) 4 frames /usr/local/lib/python3.7/dist-packages/pandas/compat/_optional.py in import_optional_dependency(name, extra, errors, min_version) 139 return None 140 elif errors == "raise": --> 141 raise ImportError(msg) 142 143 return module ImportError: Pandas requires version '1.2.0' or newer of 'xlrd' (version '1.1.0' currently installed).
Actualicé pandas pero nada, tu opción fue lo correcto.
#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