Cálculo de propiedades estadísticas de una función de distribución normal simulada

TareaR3_U1

Cómo construí en Python seis funciones para calcular promedio, mediana, cuartiles, deciles, percentiles y percentiles extremos sobre un arreglo generado con NumPy que sigue una distribución normal.

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)
Histograma de 1,000 valores generados por una distribución normal simulada Distribución con forma de campana centrada cerca de 120, generada con np.random.normal(loc=120, scale=10, size=1000). 0 50 100 89.5 – 91.8: 2 valores 91.8 – 94.0: 4 valores 94.0 – 96.2: 3 valores 96.2 – 98.5: 9 valores 98.5 – 100.7: 11 valores 100.7 – 102.9: 12 valores 102.9 – 105.2: 30 valores 105.2 – 107.4: 36 valores 107.4 – 109.6: 45 valores 109.6 – 111.9: 63 valores 111.9 – 114.1: 77 valores 114.1 – 116.3: 87 valores 116.3 – 118.6: 83 valores 118.6 – 120.8: 98 valores 120.8 – 123.0: 80 valores 123.0 – 125.3: 93 valores 125.3 – 127.5: 53 valores 127.5 – 129.7: 69 valores 129.7 – 132.0: 40 valores 132.0 – 134.2: 32 valores 134.2 – 136.4: 20 valores 136.4 – 138.7: 19 valores 138.7 – 140.9: 15 valores 140.9 – 143.1: 10 valores 143.1 – 145.4: 6 valores 145.4 – 147.6: 3 valores 90 media ≈ 120 148
Histograma de los 1,000 valores generados por listaNumeros

Como 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