Taller Semana 2: Utilización de Datos de un Data Set¶
Información del Curso¶
| Campo | Información |
|---|---|
| Asignatura | Fundamentos para IA |
| Semana | 2 |
| Actividad | Script. Utilización de Datos de un Data Set |
| Docente | Ing. Breyner Alexander Parra Rojas |
| Fecha | 25 Enero 2026 |
Integrantes - Equipo de Trabajo 10¶
- Alexander Oviedo Fadul
- Josmar Peña Buitrago
- Maria Fernanda Ruiz Paipilla
- Neheman Samir Jaller Cerchiaro
- William David Obando Lopez
INTRODUCCIÓN¶
En este taller practicamos cómo cargar y revisar un dataset antes de usarlo en ML.
También aplicamos una limpieza básica y dejamos los datos listos para entrenar modelos como clasificación o regresión.
Objetivos:¶
- Cargar un dataset desde una URL
- Explorar la estructura de los datos
- Calcular medidas de tendencia central (media, mediana, moda)
- Calcular medidas de dispersión (máximo, mínimo, desviación estándar)
- Realizar análisis por grupos
Dataset utilizado:¶
Diabetes Dataset - Datos de pacientes con diabetes para análisis estadístico.
Fuente: https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html
1: IMPORTACIÓN DE LIBRERÍAS¶
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import ssl
print(" Librerías importadas correctamente")
print(f" • Pandas versión: {pd.__version__}")
print(f" • NumPy versión: {np.__version__}")
Librerías importadas correctamente • Pandas versión: 2.2.2 • NumPy versión: 2.0.2
import pandas as pd: Importa Pandas y le asigna el aliaspdpara escribir menos códigoimport numpy as np: Importa NumPy para operaciones numéricas avanzadas
2: CARGA DEL DATASET¶
Cargamos el dataset de diabetes directamente desde la URL proporcionada.
# URL del dataset de diabetes (datos tabulados con separador de tabulación)
url = "https://www4.stat.ncsu.edu/~boos/var.select/diabetes.tab.txt"
# Cargamos el dataset.
datos = pd.read_csv(url, sep='\t')
# Confirmamos la carga exitosa
print("Dataset cargado exitosamente")
print(f" - Total de filas: {len(datos)}")
print(f" - Total de columnas: {len(datos.columns)}")
Dataset cargado exitosamente - Total de filas: 442 - Total de columnas: 11
3: EXPLORACIÓN INICIAL DE LOS DATOS¶
Visualizamos las primeras filas para entender la estructura del dataset.
print("Primeras 10 filas del dataset:")
print("="*60)
datos.head(10)
Primeras 10 filas del dataset: ============================================================
| AGE | SEX | BMI | BP | S1 | S2 | S3 | S4 | S5 | S6 | Y | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 59 | 2 | 32.1 | 101.0 | 157 | 93.2 | 38.0 | 4.00 | 4.8598 | 87 | 151 |
| 1 | 48 | 1 | 21.6 | 87.0 | 183 | 103.2 | 70.0 | 3.00 | 3.8918 | 69 | 75 |
| 2 | 72 | 2 | 30.5 | 93.0 | 156 | 93.6 | 41.0 | 4.00 | 4.6728 | 85 | 141 |
| 3 | 24 | 1 | 25.3 | 84.0 | 198 | 131.4 | 40.0 | 5.00 | 4.8903 | 89 | 206 |
| 4 | 50 | 1 | 23.0 | 101.0 | 192 | 125.4 | 52.0 | 4.00 | 4.2905 | 80 | 135 |
| 5 | 23 | 1 | 22.6 | 89.0 | 139 | 64.8 | 61.0 | 2.00 | 4.1897 | 68 | 97 |
| 6 | 36 | 2 | 22.0 | 90.0 | 160 | 99.6 | 50.0 | 3.00 | 3.9512 | 82 | 138 |
| 7 | 66 | 2 | 26.2 | 114.0 | 255 | 185.0 | 56.0 | 4.55 | 4.2485 | 92 | 63 |
| 8 | 60 | 2 | 32.1 | 83.0 | 179 | 119.4 | 42.0 | 4.00 | 4.4773 | 94 | 110 |
| 9 | 29 | 1 | 30.0 | 85.0 | 180 | 93.4 | 43.0 | 4.00 | 5.3845 | 88 | 310 |
4: VISUALIZACIÓN EN BARRAS¶
Visualización de la distribución de los datos del conjunto de variables numéricas.
datos.hist(figsize=(14,10), bins=25, color= '#23BACA')
plt.show()
Descripción de las variables del dataset:¶
| Variable | Descripción |
|---|---|
| AGE | Edad del paciente (años) |
| SEX | Sexo (1 = Masculino, 2 = Femenino) |
| BMI | Índice de Masa Corporal |
| BP | Presión arterial promedio |
| S1-S6 | Mediciones de suero sanguíneo |
| Y | Variable objetivo (progresión de diabetes) |
4: INFORMACIÓN GENERAL DEL DATASET¶
Obtenemos información detallada sobre el tipo de datos y valores nulos.
print("Información del Dataset:")
print("="*60)
datos.info()
Información del Dataset: ============================================================ <class 'pandas.core.frame.DataFrame'> RangeIndex: 442 entries, 0 to 441 Data columns (total 11 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 AGE 442 non-null int64 1 SEX 442 non-null int64 2 BMI 442 non-null float64 3 BP 442 non-null float64 4 S1 442 non-null int64 5 S2 442 non-null float64 6 S3 442 non-null float64 7 S4 442 non-null float64 8 S5 442 non-null float64 9 S6 442 non-null int64 10 Y 442 non-null int64 dtypes: float64(6), int64(5) memory usage: 38.1 KB
print("\nInformación del dataset:")
datos.info()
print("\nEstadísticas descriptivas:") # se muestran las características estadisiticas (cantidad numeros nulos,media,desviación estandar,valor mínimo)
datos.describe().T
Información del dataset: <class 'pandas.core.frame.DataFrame'> RangeIndex: 442 entries, 0 to 441 Data columns (total 11 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 AGE 442 non-null int64 1 SEX 442 non-null int64 2 BMI 442 non-null float64 3 BP 442 non-null float64 4 S1 442 non-null int64 5 S2 442 non-null float64 6 S3 442 non-null float64 7 S4 442 non-null float64 8 S5 442 non-null float64 9 S6 442 non-null int64 10 Y 442 non-null int64 dtypes: float64(6), int64(5) memory usage: 38.1 KB Estadísticas descriptivas:
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| AGE | 442.0 | 48.518100 | 13.109028 | 19.0000 | 38.2500 | 50.00000 | 59.0000 | 79.000 |
| SEX | 442.0 | 1.468326 | 0.499561 | 1.0000 | 1.0000 | 1.00000 | 2.0000 | 2.000 |
| BMI | 442.0 | 26.375792 | 4.418122 | 18.0000 | 23.2000 | 25.70000 | 29.2750 | 42.200 |
| BP | 442.0 | 94.647014 | 13.831283 | 62.0000 | 84.0000 | 93.00000 | 105.0000 | 133.000 |
| S1 | 442.0 | 189.140271 | 34.608052 | 97.0000 | 164.2500 | 186.00000 | 209.7500 | 301.000 |
| S2 | 442.0 | 115.439140 | 30.413081 | 41.6000 | 96.0500 | 113.00000 | 134.5000 | 242.400 |
| S3 | 442.0 | 49.788462 | 12.934202 | 22.0000 | 40.2500 | 48.00000 | 57.7500 | 99.000 |
| S4 | 442.0 | 4.070249 | 1.290450 | 2.0000 | 3.0000 | 4.00000 | 5.0000 | 9.090 |
| S5 | 442.0 | 4.641411 | 0.522391 | 3.2581 | 4.2767 | 4.62005 | 4.9972 | 6.107 |
| S6 | 442.0 | 91.260181 | 11.496335 | 58.0000 | 83.2500 | 91.00000 | 98.0000 | 124.000 |
| Y | 442.0 | 152.133484 | 77.093005 | 25.0000 | 87.0000 | 140.50000 | 211.5000 | 346.000 |
Explicación de describe():¶
- count: Número de valores no nulos
- mean: Media (promedio)
- std: Desviación estándar
- min: Valor mínimo
- 25%, 50%, 75%: Cuartiles (percentiles)
- max: Valor máximo
CELDA 5: MEDIDAS DE TENDENCIA CENTRAL¶
Calculamos media, mediana y moda para variables específicas.
print("MEDIDAS DE TENDENCIA CENTRAL - Variable AGE (Edad)")
print("="*60)
# Calculamos la MEDIA de la edad
# mean() calcula el promedio de todos los valores
media_edad = datos['AGE'].mean()
print(f"Media (Promedio): {media_edad:.2f} años")
# Calculamos la MEDIANA de la edad
# median() encuentra el valor central de los datos ordenados
mediana_edad = datos['AGE'].median()
print(f"Mediana: {mediana_edad:.2f} años")
# Calculamos la MODA de la edad
# mode() encuentra el valor que más se repite
moda_edad = datos['AGE'].mode()[0] # [0] porque mode() devuelve una Serie
print(f"Moda: {moda_edad} años")
# Interpretación
print("\nInterpretación:")
print(f" La edad promedio de los pacientes es de {media_edad:.1f} años.")
print(f" El 50% de los pacientes tiene {mediana_edad:.0f} años o menos.")
print(f" La edad más frecuente en el dataset es {moda_edad} años.")
MEDIDAS DE TENDENCIA CENTRAL - Variable AGE (Edad) ============================================================ Media (Promedio): 48.52 años Mediana: 50.00 años Moda: 53 años Interpretación: La edad promedio de los pacientes es de 48.5 años. El 50% de los pacientes tiene 50 años o menos. La edad más frecuente en el dataset es 53 años.
print("MEDIDAS DE TENDENCIA CENTRAL - Variable BMI")
print("="*60)
# Calculamos la MEDIA del BMI
media_bmi = datos['BMI'].mean()
print(f"Media (Promedio): {media_bmi:.2f}")
# Calculamos la MEDIANA del BMI
mediana_bmi = datos['BMI'].median()
print(f"Mediana: {mediana_bmi:.2f}")
# Calculamos la MODA del BMI
moda_bmi = datos['BMI'].mode()[0]
print(f"Moda: {moda_bmi}")
# Interpretación
print("\nInterpretación:")
print(f" El BMI promedio de los pacientes es {media_bmi:.2f}.")
print(f" Según la OMS, un BMI > 25 indica sobrepeso.")
print(f" Este valor sugiere que la mayoría de pacientes tienen sobrepeso.")
MEDIDAS DE TENDENCIA CENTRAL - Variable BMI ============================================================ Media (Promedio): 26.38 Mediana: 25.70 Moda: 23.5 Interpretación: El BMI promedio de los pacientes es 26.38. Según la OMS, un BMI > 25 indica sobrepeso. Este valor sugiere que la mayoría de pacientes tienen sobrepeso.
CELDA 6: MEDIDAS DE DISPERSIÓN¶
Calculamos máximo, mínimo, desviación estándar y varianza.
Las medidas de dispersión nos indican qué tan "dispersos"o "agrupados" están los datos:
- Máximo y Mínimo: Rango de valores
- Desviación estándar: Qué tanto varían los datos de la media
- Varianza: Cuadrado de la desviación estándar
print("MEDIDAS DE DISPERSIÓN - Variable AGE (Edad)")
print("="*60)
# Valor MÁXIMO de la edad
maximo_edad = datos['AGE'].max()
print(f"Valor Máximo: {maximo_edad} años")
# Valor MÍNIMO de la edad
minimo_edad = datos['AGE'].min()
print(f"Valor Mínimo: {minimo_edad} años")
# RANGO (diferencia entre máximo y mínimo)
rango_edad = maximo_edad - minimo_edad
print(f"Rango: {rango_edad} años")
# DESVIACIÓN ESTÁNDAR
desv_std_edad = datos['AGE'].std()
print(f"Desviación Estándar: {desv_std_edad:.2f} años")
# VARIANZA
varianza_edad = datos['AGE'].var()
print(f"Varianza: {varianza_edad:.2f}")
# Interpretación
print("\nInterpretación:")
print(f" Los pacientes tienen edades entre {minimo_edad} y {maximo_edad} años.")
print(f" La desviación estándar de {desv_std_edad:.1f} indica variabilidad moderada.")
MEDIDAS DE DISPERSIÓN - Variable AGE (Edad) ============================================================ Valor Máximo: 79 años Valor Mínimo: 19 años Rango: 60 años Desviación Estándar: 13.11 años Varianza: 171.85 Interpretación: Los pacientes tienen edades entre 19 y 79 años. La desviación estándar de 13.1 indica variabilidad moderada.
print("📏 MEDIDAS DE DISPERSIÓN - Variable BMI")
print("="*60)
# Valor MÁXIMO del BMI
maximo_bmi = datos['BMI'].max()
print(f"Valor Máximo: {maximo_bmi}")
# Valor MÍNIMO del BMI
minimo_bmi = datos['BMI'].min()
print(f"Valor Mínimo: {minimo_bmi}")
# RANGO
rango_bmi = maximo_bmi - minimo_bmi
print(f"Rango: {rango_bmi:.2f}")
# DESVIACIÓN ESTÁNDAR
desv_std_bmi = datos['BMI'].std()
print(f"Desviación Estándar: {desv_std_bmi:.2f}")
# VARIANZA
varianza_bmi = datos['BMI'].var()
print(f"Varianza: {varianza_bmi:.2f}")
# Interpretación
print("\nInterpretación:")
print(f" El BMI varía entre {minimo_bmi} y {maximo_bmi}.")
print(f" Un BMI de {maximo_bmi} indica obesidad severa.")
📏 MEDIDAS DE DISPERSIÓN - Variable BMI ============================================================ Valor Máximo: 42.2 Valor Mínimo: 18.0 Rango: 24.20 Desviación Estándar: 4.42 Varianza: 19.52 Interpretación: El BMI varía entre 18.0 y 42.2. Un BMI de 42.2 indica obesidad severa.
CELDA 7: ANÁLISIS POR GRUPOS (SEXO)¶
Realizamos análisis diferenciado por sexo para identificar patrones.
Usamos groupby() para agrupar los datos por sexo y calcular estadísticas para cada grupo. SEX: 1 = Masculino, 2 = Femenino
print("ANÁLISIS POR SEXO")
print("="*60)
# Contamos cuántos pacientes hay de cada sexo
conteo_sexo = datos['SEX'].value_counts()
print("Distribución por sexo:")
print(f" - Masculino (1): {conteo_sexo[1]} pacientes")
print(f" - Femenino (2): {conteo_sexo[2]} pacientes")
# Calculamos la media de edad por sexo
print("\nEdad promedio por sexo:")
media_edad_por_sexo = datos.groupby('SEX')['AGE'].mean()
print(f" - Masculino: {media_edad_por_sexo[1]:.2f} años")
print(f" - Femenino: {media_edad_por_sexo[2]:.2f} años")
# Calculamos la media de BMI por sexo
print("\nBMI promedio por sexo:")
media_bmi_por_sexo = datos.groupby('SEX')['BMI'].mean()
print(f" - Masculino: {media_bmi_por_sexo[1]:.2f}")
print(f" - Femenino: {media_bmi_por_sexo[2]:.2f}")
ANÁLISIS POR SEXO ============================================================ Distribución por sexo: - Masculino (1): 235 pacientes - Femenino (2): 207 pacientes Edad promedio por sexo: - Masculino: 46.38 años - Femenino: 50.94 años BMI promedio por sexo: - Masculino: 26.01 - Femenino: 26.79
Explicación de groupby():¶
datos.groupby('SEX'): Agrupa los datos según los valores de la columna SEX['AGE'].mean(): Calcula la media de la columna AGE para cada grupo- Esto permite comparar estadísticas entre diferentes categorías
CELDA 8: RESUMEN CONSOLIDADO¶
Creamos una tabla resumen con todas las estadísticas calculadas.
- Creamos un DataFrame con todas las estadísticas calculadas para las variables AGE y BMI.
print("TABLA RESUMEN DE ESTADÍSTICAS")
print("="*60)
# Creamos un diccionario con las estadísticas
resumen = {
'Estadística': ['Media', 'Mediana', 'Moda', 'Máximo', 'Mínimo', 'Desv. Estándar', 'Varianza'],
'AGE (Edad)': [
f"{media_edad:.2f}",
f"{mediana_edad:.2f}",
f"{moda_edad}",
f"{maximo_edad}",
f"{minimo_edad}",
f"{desv_std_edad:.2f}",
f"{varianza_edad:.2f}"
],
'BMI': [
f"{media_bmi:.2f}",
f"{mediana_bmi:.2f}",
f"{moda_bmi}",
f"{maximo_bmi}",
f"{minimo_bmi}",
f"{desv_std_bmi:.2f}",
f"{varianza_bmi:.2f}"
]
}
# Convertimos a DataFrame para mejor visualización
df_resumen = pd.DataFrame(resumen)
df_resumen
TABLA RESUMEN DE ESTADÍSTICAS ============================================================
| Estadística | AGE (Edad) | BMI | |
|---|---|---|---|
| 0 | Media | 48.52 | 26.38 |
| 1 | Mediana | 50.00 | 25.70 |
| 2 | Moda | 53 | 23.5 |
| 3 | Máximo | 79 | 42.2 |
| 4 | Mínimo | 19 | 18.0 |
| 5 | Desv. Estándar | 13.11 | 4.42 |
| 6 | Varianza | 171.85 | 19.52 |
Hallazgos principales:¶
Sobre la edad de los pacientes:
- La edad promedio es de aproximadamente 48-49 años
- El rango de edades va desde adultos jóvenes hasta adultos mayores
- La diabetes en este dataset afecta principalmente a la población de mediana edad
Sobre el Índice de Masa Corporal (BMI):
- El BMI promedio supera el valor de 25 (umbral de sobrepeso según la OMS)
- Existe una correlación entre sobrepeso/obesidad y diabetes
- Los valores extremos de BMI indican casos de obesidad severa
Sobre la distribución por sexo:
- El dataset tiene representación de ambos sexos
- Las estadísticas pueden variar ligeramente entre grupos
Importancia de Python para Ciencia de Datos:¶
- Facilidad de uso: La sintaxis de Python es clara y legible
- Librerías potentes: Pandas permite análisis complejos con pocas líneas de código
- Reproducibilidad: Los scripts pueden ejecutarse múltiples veces con resultados consistentes
- Escalabilidad: Los mismos métodos funcionan para datasets pequeños o grandes
Reflexión:¶
Este ejercicio demuestra cómo Python y sus librerías permiten transformar datos crudos en información útil para la toma de decisiones. En el contexto de la salud, estos análisis pueden ayudar a:
- Identificar grupos de riesgo
- Diseñar programas de prevención
- Personalizar tratamientos según características demográficas
REFERENCIAS¶
Boschetti, A. y Massaron, L. (2018). Python Data Science Essentials: A Practitioner's Guide Covering Essential Data Science Principles, Tools, and Techniques (pp. 64-135). Packt Publishing, Limited.
So, A., Joseph, T. V., John, R. T., Worsley, A. y Asare, S. (2020). The data science workshop: A new, interactive approach to learning data science (pp. 16-36). Packt Publishing, Limited.
Mert, U., y Cuhadaroglu, M. (2018). Mastering numerical computing with NumPy: Master scientific computing and perform complex operations with ease (pp. 55-87). Packt Publishing, Limited.
Dataset de Diabetes. Recuperado de: https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html
Documentación oficial de Pandas. https://pandas.pydata.org/docs/
© 2026 - Equipo de Trabajo 10 - UNIMINUTO