3.4. Demostración con datos simulados#
Tenemos ahora todos los bloques necesarios para comenzar a analizar datos y verás que tienes en tus manos una calculadora ultrapoderosa.
Antes de comenzar
Para que esta libreta funcione debes tener instaladas las librería scipy
.
En el tema 1, durante la preparación del espacio local estaba contemplado, pero si no lo has hecho, revisa el tema 1. El comando específico con uv
es: uv add scipy
.
Nota
Si ejecutas la libreta en la nube de colab
, no es necesario instalar estas librerías porque el entorno de ejecución ya las tiene disponibles.
Los datos
Simularemos una serie de datos.
pacientes = {
'ids': [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30],
'peso': [69.6, 62.7, 74.2, 66.7, 62.6, 67.4, 69.2, 71.2, 66.8, 69.7, 68.9,
69.5, 72.5, 77.7, 64.6, 76.4, 64.1, 68.3, 68.4, 65.3, 69.4, 61.6,
75.4, 63.6, 82.1, 73.3, 70.8, 69.5, 83.9, 73.9],
'talla': [1.78, 1.62, 1.68, 1.62, 1.73, 1.65, 1.53, 1.61, 1.62, 1.61, 1.73,
1.51, 1.7 , 1.68, 1.7 , 1.65, 1.64, 1.59, 1.68, 1.71, 1.64, 1.67,
1.67, 1.67, 1.72, 1.61, 1.69, 1.57, 1.67, 1.68]
}
print(pacientes)
{'ids': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30], 'peso': [69.6, 62.7, 74.2, 66.7, 62.6, 67.4, 69.2, 71.2, 66.8, 69.7, 68.9, 69.5, 72.5, 77.7, 64.6, 76.4, 64.1, 68.3, 68.4, 65.3, 69.4, 61.6, 75.4, 63.6, 82.1, 73.3, 70.8, 69.5, 83.9, 73.9], 'talla': [1.78, 1.62, 1.68, 1.62, 1.73, 1.65, 1.53, 1.61, 1.62, 1.61, 1.73, 1.51, 1.7, 1.68, 1.7, 1.65, 1.64, 1.59, 1.68, 1.71, 1.64, 1.67, 1.67, 1.67, 1.72, 1.61, 1.69, 1.57, 1.67, 1.68]}
Esta estructura de datos está diseñada así, un dict
que contiene tres claves y para cada clave una lista de valores numéricos. La primera clave 'id'
identifica a cada paciente, la segunda y tercera son sus respectivos pesos y tallas.
En esta estructura, la posición de cada dato, define a qué paciente pertenece, por ejemplo, el paciente con id
1, tiene un peso de 69.6kg y una talla de 1.78m.
En esta libreta integraremos los conocimientos que ya tenemos para describir estos datos.
Utilizaremos la librería de fábrica de python para calcular la media y la desviación estándar de python para calcular la media y la desviación estándar de cada dato, de la siguiente manera.
import statistics as st
for llave in ['peso', 'talla']:
datos = pacientes[llave]
media = st.mean(datos)# aritmética
std = st.stdev(datos) # de la muestra
print(f'Para {llave} - la media es {media:.2f} +/- {std:.2f}')
Para peso - la media es 69.98 +/- 5.46
Para talla - la media es 1.65 +/- 0.06
Veamos cómo podríamos calcular la media y el rango intercuartilar, utilizando statistics
for llave in ['peso', 'talla']:
datos = pacientes[llave]
q1, mediana, q3 = st.quantiles(datos) # observa que no hay que importar cada vez.
print(f'{llave}: mediana= {mediana} ({q1:.2f} - {q3:.2f})')
peso: mediana= 69.45 (66.35 - 73.45)
talla: mediana= 1.67 (1.62 - 1.69)
Utilizando ahora un librería externa podemos calcular datos más poderosos, por ejemplo, podemos utilizar la prueba de Shapiro-Wilk para ver si los datos son o no normales.
La prueba está integrada dentro de la librería scipy
y su documentación se puede consultar aquí.
Respecto a la expresión ternaria, recuerda revisar el tema aquí
from scipy.stats import shapiro
def es_normal(datos):
res = shapiro(datos)
normal = 'Normal' if res.pvalue > 0.05 else 'No Normal'
# la expresión arriba se llama "ternaria"
# en una línea tenemos un if else.
reporte = f'Resultado de shapiro wilk: {normal} con p={res.pvalue}'
print(reporte)
es_normal(pacientes['peso'])
es_normal(pacientes['talla'])
Resultado de shapiro wilk: Normal con p=0.16922468929736062
Resultado de shapiro wilk: Normal con p=0.608918875551153
Ambas variables son normales, segun la prueba.
Esta libreta es un breve ejemplo de cómo podemos utilizar python, en forma lineal para resolver problemas estadísticos con una muestra de pacientes. En la siguiente unidad veremos aspectos específicos y dirigidos del análisis estadístico.