Introducción
En el presente reto se aborda el análisis estadístico para la distribución normal, el cual sale de una función con ciertos parámetros especificados.
La distribución normal es la que comúnmente se le conoce como forma de campana.
Esto quiere decir que los datos están distribuidos tendiendo al centro y que los datos más lejanos al centro, se hacen menos probables de que aparezcan (Minitab, 2024).
La gráfica de probabilidades normal, se utiliza para el análisis de datos donde su variable es continua (Universidad Nacional Autónoma de México, 2024).
Que la variable sea continua, quiere decir que no hay una interrupción, donde ningún valor de x carece de y y viceversa.
Su densidad de distribución, se caracteriza por la media y su desviación estándar. Radica su importancia en que se utiliza para conocer la tendencia de muchas medidas, como altura, peso, resultados de mediciones científicas, precipitación pluvial, por mencionar algunos casos.
Desarrollo
Se utiliza la librería “Numpy”, para crear los datos y para analizarlos.
¿Qué es Numpy?
Es un paquete fundamental para la computación científica en python (NumPy Developers, 2024).
Proporcionó un objeto matriz multidimensional, sus derivados y operaciones matemáticas, entre más cosas para elegir, según las operaciones que se estén realizando.
Características
- Sus array tienen un tamaño fijo, es decir, si hay que modificarlo, numpy crea otro y elimina el anterior.
- Todos los elementos son del mismo tipo de dato.
- Facilita operaciones sobre grandes cantidades de datos.
Simulación de la distribución normal
Para simular la distribución normal, se utilizará la siguiente formula:
import numpy as np
np.random.seed(0)
listaNumeros = np.random.normal(loc=120, scale=10, size=1000)
listaNumerosComo se puede observar, la función genera datos que son propios de una distribución normal, al tener su forma de campana.
Teniendo estos datos se analiza con la librería “numpy”, para conocer el valor de sus propiedades. Se compone de “loc”, “scale” y “size”.
La palabra “loc”, es la media, o sea el centro de la distribución, que se explica más adelante. En cuanto a “scale”, se refiere a que tan separados van a estar los valores y “size”, la cantidad de datos que se van a generar.
El objetivo de funciones como esta, es que los datos se comporten de una forma “natural”.
Análisis a los datos obtenidos
Promedio
El promedio se calcula sumando un grupo de números pertenecientes al mismo muestreo o conjunto, posteriormente se divide entre el recuento de este mismo grupo de números.
En numpy la palabra reservada “mean”, calcula el promedio, recibiendo los datos (Microsoft Support, 2024).
def promedio(datos):
return float(np.mean(datos))
Promedio: 119.54743292509804
Mediana
La mediana es el medio de un grupo de números.
En numpy existe la palabra reservada “median”, que calcula la misma.
def mediana(datos):
return float(np.median(datos))
Mediana: 119.41971965200372
Cuartiles
Son tres elementos de un conjunto de datos ordenados que dividen el conjunto en partes iguales (Universo Fórmulas, 2024).
En numpy hay una palabra reservada llamada “percentil” para calcular esto. Para que sea un cuartil, hay que dividir los datos en 4 partes iguales, deben ser los parámetros ingresados de 25, 50 y 75, para llamar a la función en la librería.
def cuartiles(datos):
return list(np.percentile(datos, [25, 50, 75]))
Cuartiles (25,50,75): [113.0157994064013, 119.41971965200372, 126.06950601888398]
Deciles
Son similar a los cuartiles, pero estos dividen la distribución en 10 partes.
En la misma función de “percentil”, hay que pasarle otra llamada “arange”, de la misma librería, como hay que dividir en 10 partes, a este se le pasa el 10, que es el primer número de la secuencia y esta incluido, 100, que es el objetivo de la secuencia, pero esta excluido y 10 que es la magnitud del paso (Universidad de Valencia, 2024).
def deciles(datos):
return list(np.percentile(datos, np.arange(10, 100, 10)))
Deciles (10..90): [107.00857674641988, 111.38210453735763, 114.56283374582962, 116.88278037557092, 119.41971965200372, 121.97121356415258, 124.29764695316696, 127.88396791360115, 132.31593551100462]
Percentil
Es lo mismo, pero divide para cualquier percentil, en este ejemplo, se eligió el 41.
def percentil(datos, p):
return float(np.percentile(datos, p))
Percentil 41 (ejemplo): 117.05721695424052
Percentiles extremos
Se calcula el valor de los extremos y se devuelve el valor percentil, en el caso del ejemplo son el 2 y el 98.
Una característica de los percentiles extremos, es que se toma el menor a 3 o 5 % y el mayor a 95 %, por eso la elección de los valores antes mencionados.
def percentiles_extremos(datos):
return (float(np.percentile(datos, 2)), float(np.percentile(datos, 98)))
Percentil 2 (extremo inferior): 99.52223158702927 Percentil 98 (extremo superior): 140.21912547482287
Conclusión
La definición de la función de distribución normal, fue fascinante, el saber que existe tantas cosas donde aplicar su función, también se descubrió que existe la posibilidad de que aparente ser una función normal, pero no serlo.
El uso de funciones normales para analizar un comportamiento, muchas veces puede prever aspectos de suma importancia como podría haber sido en la pandemia del covid, para poder medir los picos de contagios o enfermos en los hospitales, esto para tomar medidas necesarias y deberían de cambiar las tendencias, moviéndose la media en si para poder saber hacía que acciones ayudan a reducir de estar en un pico de infectados, ahora a un pico de personas sanas, donde los infectados, sean los que más se alejan de la media.
Con este ejemplo se quiere decir, que no solo se sabe, sino que da posibilidad a tomar acción.
Este ejemplo fue drástico, pero puede ser utilizada también en cosas cotidianas, como compras, ventas, tendencias en precios, incluso actividades sin fines más que meramente de desarrollo personal, como el correr. Tal vez el tiempo en que se corre y que cantidad de kilómetros se recorren. Esto y un sin número de cosas posibles.
Como se hizo explicación en el cuerpo del documento, la función “normal”, de la librería, genera un grupo de datos con las características que se le especifiquen en “loc”, “scale” y “size” respectivamente.
Donde “loc”, es para la media, “scale” para que tan alejados de la media va a ser común estar y “size” cuantos números se esperan. En si estos parámetros son la esencia del análisis, sin ellos, no habría que analizar, a su vez, pueden obtenerse de forma empírica con encuestas o analizando data acumulada de conjuntos específicos en la vida real.
La palabra “mean”, es para calcular el promedio y es muy específica, solo calcula el promedio.
A su vez “median”, calcula la mediana.
Otra palabra reservada bastante interesante es “percentil”, que en el documento se explica que hace, pero es para el cálculo de los percentiles especificados.
Aquí ya no se profundizó más en su explicación, porque está en el cuerpo del documento donde se utiliza las funciones, ahí enriquece más la explicación y demostración.
Agradezco el reto.
Anexo. Código fuente completo (main.py)
A continuación se presenta el código completo del script main.py, del cual se extrajeron las funciones y resultados mostrados a lo largo de este documento.
## Función para generar el arreglo y calcular medidas estadísticas
import numpy as np
# Genera un arreglo de 1,000 números con distribución normal (media 120, desviación estándar 10)
np.random.seed(0)
listaNumeros = np.random.normal(loc=120, scale=10, size=1000)
print(listaNumeros)
# Calcula el promedio (media aritmética) del arreglo
def promedio(datos):
return float(np.mean(datos))
# Calcula la mediana (valor central) del arreglo
def mediana(datos):
return float(np.median(datos))
# Calcula los cuartiles (percentiles 25, 50 y 75), que dividen los datos en 4 partes iguales
def cuartiles(datos):
return list(np.percentile(datos, [25, 50, 75]))
# Calcula los deciles (percentiles 10 al 90), que dividen los datos en 10 partes iguales
def deciles(datos):
return list(np.percentile(datos, np.arange(10, 100, 10)))
# Calcula cualquier percentil p indicado por el usuario
def percentil(datos, p):
return float(np.percentile(datos, p))
# Calcula los percentiles extremos (2 y 98), útiles para identificar valores atípicos
def percentiles_extremos(datos):
return (float(np.percentile(datos, 2)), float(np.percentile(datos, 98)))
if __name__ == '__main__':
print('Promedio:', promedio(listaNumeros))
print('Mediana:', mediana(listaNumeros))
print('Cuartiles (25,50,75):', cuartiles(listaNumeros))
print('Deciles (10..90):', deciles(listaNumeros))
print('Percentil 41 (ejemplo):', percentil(listaNumeros, 41))
extremos = percentiles_extremos(listaNumeros)
print('Percentil 2 (extremo inferior):', extremos[0])
print('Percentil 98 (extremo superior):', extremos[1])
Referencias
- NumPy Developers. (2024). What is NumPy?. https://numpy.org/doc/stable/user/whatisnumpy.html
- Minitab. (2024). ¿Qué es la distribución normal?. https://support.minitab.com/es-mx/minitab/help-and-how-to/statistics/basic-statistics/supporting-topics/normality/what-is-the-normal-distribution/
- Universo Fórmulas. (2024). Cuartiles. https://www.universoformulas.com/estadistica/descriptiva/cuartiles/
- Universidad de Valencia. (2024). Deciles y cuartiles. https://www.uv.es/webgid/Descriptiva/23_deciles_y_cuartiles.html