Estatus de la Salud Mental en adultos del municipio más acaudalado de América Látina.¶

Reporte técnico del análisis de la salud mental en adultos dentro de la población en edad de trabajar el municipio de San Pedro Garza García.

Hecho por: Estefania Nájera de la Rosa - estefania.najera@udem.edu a 19 de febrero del 2026.

In [405]:
# Importar las librerías.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import statsmodels.formula.api as smf
import statsmodels.api as sm
from statsmodels.stats.outliers_influence import variance_inflation_factor
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
from IPython.display import Image
from sklearn.ensemble import RandomForestRegressor

1.1 Introducción.¶

Para este presente análisis sobre la salud mental de individuos dentro de su adultez que se encuentren en edad de trabajar y que residan en San Pedro Garza García, se estará implementando tanto un modelo lineal como la Regresión Lineal Múltiple, así como un modelo no lineal siendo otra regresión bajo el algoritmo de Random Forest, su uso se justificará en su respectiva sección.

Los datos con los que se estarán trabajando provienen del portal de datos abiertos del Gobierno del Estado de Nuevo León, estos recaen bajo la categoría de Salud - que nos da a entender que para el estado, la salud mental es un factor importante a considerar de la población de una región que constantemente se encuentra en crecimiento y mejora.

1.2 Objetivo.¶

Con base en este contexto, el objetivo va más allá de cumplir con lo establecido en la clase de Inteligencia Artificial que es desarrollar modelos de regresión que permitan comprender y caracterizar una problemática real de interés, ya que con los resultados explicados más adelante, se busca profundizar en qué medida se encuentra la salud mental del grupo de individuos que se encuentran bajo el contexto del municipio más seguro, adinerado y en constante mejora, ya que hay muchos otros municipios o ciudades que quisieran replicar este modus operandi para una mejor calidad de vida.

Entonces, viene la pregunta detonante por investigar: ¿Qué relación existe entre la salud mental y la edad de los adultos que sostienen el desarrollo del municipio de San Pedro Garza García?

2.1 Planteamiento.¶

Como se comentó anteriormente, el principal foco de este el análisis es la salud mental, la cuál, según la OPS/OMS (2026), se define como un estado del bienestar que permite al individuo afrontar momentos díficiles, desarrollar sus habilidades, aprender, enseñar y trabajar de forma adecuada para contribuir a la mejora de su comunidad. Este bienestar es fundamental, ya que sustenta las capacidades individuales como colectivas que permiten dar forma al mundo.

En el estado de Nuevo León, actualmente se cuenta con un hospital de especialidades en salud mental, lo que evidencia que las autoridades reconocen la importancia de este bienestar en su población.

In [407]:
Image(filename='/Users/estefaniadelarosa/Downloads/hospital_salud_mental.jpg')
Out[407]:
No description has been provided for this image

Hospital de Especialidades en Salud Mental.

Por otro lado, el municipio de San Pedro Garza García se encuentra en México, exactamente en el estado de Nuevo León y es parte del área metropolitana de Monterrey, este es conocido como el mejor de América Latina por diversas razones. Según Pardo (2025)m su PIB per cápita es de $107,000 dólares anuales, cinco veces el promedio nacional; además, el 70% de los adultos poseé de un título universitario, el tripe que el promedio del resto de México.

Es justo aquí donde unimos A con B, es decir, tenemos el aspecto de la salud mental justificado y planteado como el problema principal, directamente relacionado con el municipio de San Pedro Garza García, donde esa riqueza y altos niveles educativos generan expectativas y responsabilidades en los individuos que podría influir en su bienestar psicológico, dado que estos sostienen la imagen y el progreso del municipio mediante su esfuerzo constante.

Por ello, este análisis se centrará en los adultos de 18 a 65 años (la población económicamente activa) del municipio, quienes son los pilares que impulsan, organizan y mejoran la economía, la plusvalía y la calidad de vida del San Pedro Garza García. La invsetigación parte de la premisa de que a pesar e vivir en una "burbuja de privilegios", estas personas no están exentas de presentar problemas, inquietudes o incertidumbres que afecten su salud mental, sea por razones académicas, laborales o personales.

In [529]:
Image(filename='/Users/estefaniadelarosa/Downloads/spgg.jpg')
Out[529]:
No description has been provided for this image

Es importante mencionar que dentro de la adultez, según Arrimada (2022), existen tres grupos de clasificación:

  • Adultez temprana (18-40 años).

  • Adultez media (40-60 años).

  • Adultez tardía (60 años en adelante).

2.2 Contexto de los datos.¶

Brevemente se mencionó la procedencia de los datos que vienen por parte del Gobierno del Estado de Nuevo León, pero vale la pena indagar en la fuente original de la cuál se extrayeron los datos a lo largo del periodo de tiempo de octubre 2024 a agosto 2025.

In [408]:
# Cargar los datos.
url = 'https://raw.githubusercontent.com/estefaniadelarosa/IA-I/refs/heads/main/P1.%20Regresi%C3%B3n%20Lineal/2024_2025_salud_mental.csv'
df = pd.read_csv(url)
print(df.shape)
df.head()
(48224, 14)
Out[408]:
fecha id_consulta edad edad_meses edad_dias sexo peso altura municipio_unidad_medica institucion_unidad_medica clave_grupo_ enfermedad descripcion_grupo_enfermedad clave_enfermedad descripcion_enfermedad
0 02/10/2024 SM_2024_38869 21 0 0 Masculino 82 174 LINARES HOSPITAL GENERAL DE LINARES V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F412 TRASTORNO MIXTO DE ANSIEDAD Y DEPRESION
1 08/10/2024 SM_2024_38870 21 0 0 Masculino 82 174 LINARES HOSPITAL GENERAL DE LINARES V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F412 TRASTORNO MIXTO DE ANSIEDAD Y DEPRESION
2 08/10/2024 SM_2024_38871 5 0 0 Masculino 21 111 LINARES HOSPITAL GENERAL DE LINARES V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F919 TRASTORNO DE LA CONDUCTA NO ESPECIFICADO
3 09/10/2024 SM_2024_38872 69 0 0 Masculino sin valor sin valor LINARES HOSPITAL GENERAL DE LINARES V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F321 EPISODIO DEPRESIVO MODERADO
4 09/10/2024 SM_2024_38873 78 0 0 Masculino sin valor sin valor LINARES HOSPITAL GENERAL DE LINARES V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F321 EPISODIO DEPRESIVO MODERADO
In [409]:
df['municipio_unidad_medica'].unique()
Out[409]:
array(['LINARES', 'MONTEMORELOS', 'MONTERREY', 'SABINAS HIDALGO',
       'SAN NICOLAS DE LOS GARZA', 'SANTA CATARINA', 'GENERAL ESCOBEDO',
       'PESQUERIA', 'CADEREYTA JIMENEZ', 'SAN PEDRO GARZA GARCIA',
       'GARCIA', 'GALEANA', 'CERRALVO', 'CHINA'], dtype=object)

El dataset seleccionado contiene datos de varios municipios del estado de Nuevo León, por mencionar algunos que pertenecen al área metropólitana como:

  • Monterrey.

  • San Nicolás de los Garza.

  • Santa Catarina.

  • General Escobedo.

entre otros.

Sin dejar de lado que también hay datos de municipios aledaños a la metrópoli como lo son:

  • Montemorelos.

  • Linares.

  • Cadereyta Jiménez

entre otros.

Por cada municipio, es que se tiene registrado por individuo lo siguiente:

  • Fecha de la consulta.

  • Número de identificación de la consulta.

  • Básicos de la persona como edad, sexo, peso y altura.

  • Municipio.

  • Institución médica dentro del municipio.

  • Número de identificación y descripción de su grupo de enfermedad.

  • Número de identificación y descripción de la enfermedad como tal.

3.1 Exploración y comprensión del conjunto de datos.¶

Como se tiene el interés de trabajar con los datos que provengan de San Pedro Garza García, el dataset se filtrará para que mediante el municipio, recopilemos aquellos específicos que se necesitan.

In [410]:
df1 = df[df['municipio_unidad_medica'] == 'SAN PEDRO GARZA GARCIA']
print(df1.shape)
df1.head()
(1060, 14)
Out[410]:
fecha id_consulta edad edad_meses edad_dias sexo peso altura municipio_unidad_medica institucion_unidad_medica clave_grupo_ enfermedad descripcion_grupo_enfermedad clave_enfermedad descripcion_enfermedad
2625 02/10/2024 SM_2024_41494 33 0 0 Masculino 60 160 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F122 TRASTORNOS MENTALES Y DEL COMPORTAMIENTO DEBID...
2626 02/10/2024 SM_2024_41495 53 0 0 Femenino 60 160 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F412 TRASTORNO MIXTO DE ANSIEDAD Y DEPRESION
2627 02/10/2024 SM_2024_41496 60 0 0 Femenino 60 160 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F630 JUEGO PATOLOGICO
2628 04/10/2024 SM_2024_41497 46 0 0 Femenino 70 165 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F412 TRASTORNO MIXTO DE ANSIEDAD Y DEPRESION
2629 04/10/2024 SM_2024_41498 47 0 0 Femenino 60 160 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F412 TRASTORNO MIXTO DE ANSIEDAD Y DEPRESION

Seguido de aplicar otro filtro que ahora nos recopile todos los datos donde la edad se encuentre dentro del rango de los 18 a los 65 años como se había establecido anteriormente.

In [411]:
# Aplicar el filtro de personas dentro del rango de edad de 18 a 65 años.
df2 = df1[(df1['edad'] >= 18) & (df1['edad'] <= 65)]
print(df2.shape)
df2.head()
(720, 14)
Out[411]:
fecha id_consulta edad edad_meses edad_dias sexo peso altura municipio_unidad_medica institucion_unidad_medica clave_grupo_ enfermedad descripcion_grupo_enfermedad clave_enfermedad descripcion_enfermedad
2625 02/10/2024 SM_2024_41494 33 0 0 Masculino 60 160 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F122 TRASTORNOS MENTALES Y DEL COMPORTAMIENTO DEBID...
2626 02/10/2024 SM_2024_41495 53 0 0 Femenino 60 160 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F412 TRASTORNO MIXTO DE ANSIEDAD Y DEPRESION
2627 02/10/2024 SM_2024_41496 60 0 0 Femenino 60 160 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F630 JUEGO PATOLOGICO
2628 04/10/2024 SM_2024_41497 46 0 0 Femenino 70 165 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F412 TRASTORNO MIXTO DE ANSIEDAD Y DEPRESION
2629 04/10/2024 SM_2024_41498 47 0 0 Femenino 60 160 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F412 TRASTORNO MIXTO DE ANSIEDAD Y DEPRESION

Una vez hecho estos dos pasos, es que finalmente tenemos nuestro dataset final llamado d2 que cumple con lo establecido de contar con los datos de personas dentro del rango de edad de 18 a 65 años que son del municipio de San Pedro Garza García - teniendo a nuestra disposición 720 datos en los años recientes de 2024 y 2025.

De este hay que explorar su contenido, por ejemplo:

  • Conocer las diferentes instituciones médicas.

  • Las descripciones de los grupos de enfermedad que hay.

  • Las descripciones como tal de las enfermedades.

In [412]:
# Cuántas veces se repite algo (frecuencia).
tabla_frec1 = df2['sexo'].value_counts()
tabla_frec1
Out[412]:
sexo
Femenino     464
Masculino    256
Name: count, dtype: int64
In [413]:
# Proporción.
tabla_frec_rel1 = (df2['sexo'].value_counts() / df2['sexo'].value_counts().sum())*100
tabla_frec_rel1
Out[413]:
sexo
Femenino     64.444444
Masculino    35.555556
Name: count, dtype: float64
In [414]:
tabla_frec1.plot(kind = 'bar', title = 'Sexo.')
Out[414]:
<Axes: title={'center': 'Sexo.'}, xlabel='sexo'>
No description has been provided for this image

Como un extra, es interesante notar que el sexo que predomina en el dataset es el femenino, es decir que en su mayoría vamos a trabajar con datos de mujeres, dentro de una proporción del 64% de todo del dataset.

  • 0 = Femenino.

  • 1 = Masculino.

4.1 Preparación y tratamiento de los datos.¶

Huecos.

Para preparar nuestro datatset antes de ser desarrollado el modelo lineal de regresión, comenzamos checando si existe la presencia de datos vacíos/huecos, para ver si vale la pena imputar datos o eliminar variables.

In [415]:
# Verificar si hay datos vacíos.
df2.isna().sum().sort_values(ascending = False)
Out[415]:
fecha                           0
id_consulta                     0
edad                            0
edad_meses                      0
edad_dias                       0
sexo                            0
peso                            0
altura                          0
municipio_unidad_medica         0
institucion_unidad_medica       0
clave_grupo_ enfermedad         0
descripcion_grupo_enfermedad    0
clave_enfermedad                0
descripcion_enfermedad          0
dtype: int64

Afortunadamente, el dataset no presenta datos vacíos, sin embargo, mientras se investigaba el mismo de forma cruda, se pudo notar que en vez de manejar NaNs, se empleaba la cadena de: "sin valor" dentro de las variables de peso y altura, como en este ejemplo en la base de datos original:

In [416]:
df[df['peso'] == 'sin valor']
Out[416]:
fecha id_consulta edad edad_meses edad_dias sexo peso altura municipio_unidad_medica institucion_unidad_medica clave_grupo_ enfermedad descripcion_grupo_enfermedad clave_enfermedad descripcion_enfermedad
3 09/10/2024 SM_2024_38872 69 0 0 Masculino sin valor sin valor LINARES HOSPITAL GENERAL DE LINARES V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F321 EPISODIO DEPRESIVO MODERADO
4 09/10/2024 SM_2024_38873 78 0 0 Masculino sin valor sin valor LINARES HOSPITAL GENERAL DE LINARES V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F321 EPISODIO DEPRESIVO MODERADO
7 15/10/2024 SM_2024_38876 18 0 0 Femenino sin valor sin valor LINARES HOSPITAL GENERAL DE LINARES V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F411 TRASTORNO DE ANSIEDAD GENERALIZADA
11 18/10/2024 SM_2024_38880 79 0 0 Femenino sin valor sin valor LINARES HOSPITAL GENERAL DE LINARES V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F321 EPISODIO DEPRESIVO MODERADO
12 18/10/2024 SM_2024_38881 68 0 0 Masculino sin valor sin valor LINARES HOSPITAL GENERAL DE LINARES V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F320 EPISODIO DEPRESIVO LEVE
... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
47486 18/08/2025 SM_2025_34622 38 0 0 Masculino sin valor sin valor GENERAL ESCOBEDO HOSPITAL DE ESPECIALIDADES EN SALUD MENTAL V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F200 ESQUIZOFRENIA PARANOIDE
47498 18/08/2025 SM_2025_34634 61 0 0 Femenino sin valor sin valor GENERAL ESCOBEDO HOSPITAL DE ESPECIALIDADES EN SALUD MENTAL V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F200 ESQUIZOFRENIA PARANOIDE
47528 18/08/2025 SM_2025_34664 61 0 0 Femenino sin valor sin valor GENERAL ESCOBEDO HOSPITAL DE ESPECIALIDADES EN SALUD MENTAL VI ENFERMEDADES DEL SISTEMA NERVIOSO G20X ENFERMEDAD DE PARKINSON
48126 29/08/2025 SM_2025_35262 31 0 0 Masculino sin valor sin valor GENERAL ESCOBEDO HOSPITAL DE ESPECIALIDADES EN SALUD MENTAL V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F197 TRASTORNOS MENTALES Y DEL COMPORTAMIENTO DEBID...
48170 29/08/2025 SM_2025_35306 9 0 0 Masculino sin valor sin valor GENERAL ESCOBEDO HOSPITAL DE ESPECIALIDADES EN SALUD MENTAL V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F900 PERTURBACION DE LA ACTIVIDAD Y DE LA ATENCION

418 rows × 14 columns

In [417]:
df[df['altura'] == 'sin valor']
Out[417]:
fecha id_consulta edad edad_meses edad_dias sexo peso altura municipio_unidad_medica institucion_unidad_medica clave_grupo_ enfermedad descripcion_grupo_enfermedad clave_enfermedad descripcion_enfermedad
3 09/10/2024 SM_2024_38872 69 0 0 Masculino sin valor sin valor LINARES HOSPITAL GENERAL DE LINARES V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F321 EPISODIO DEPRESIVO MODERADO
4 09/10/2024 SM_2024_38873 78 0 0 Masculino sin valor sin valor LINARES HOSPITAL GENERAL DE LINARES V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F321 EPISODIO DEPRESIVO MODERADO
7 15/10/2024 SM_2024_38876 18 0 0 Femenino sin valor sin valor LINARES HOSPITAL GENERAL DE LINARES V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F411 TRASTORNO DE ANSIEDAD GENERALIZADA
11 18/10/2024 SM_2024_38880 79 0 0 Femenino sin valor sin valor LINARES HOSPITAL GENERAL DE LINARES V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F321 EPISODIO DEPRESIVO MODERADO
12 18/10/2024 SM_2024_38881 68 0 0 Masculino sin valor sin valor LINARES HOSPITAL GENERAL DE LINARES V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F320 EPISODIO DEPRESIVO LEVE
... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
47486 18/08/2025 SM_2025_34622 38 0 0 Masculino sin valor sin valor GENERAL ESCOBEDO HOSPITAL DE ESPECIALIDADES EN SALUD MENTAL V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F200 ESQUIZOFRENIA PARANOIDE
47498 18/08/2025 SM_2025_34634 61 0 0 Femenino sin valor sin valor GENERAL ESCOBEDO HOSPITAL DE ESPECIALIDADES EN SALUD MENTAL V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F200 ESQUIZOFRENIA PARANOIDE
47528 18/08/2025 SM_2025_34664 61 0 0 Femenino sin valor sin valor GENERAL ESCOBEDO HOSPITAL DE ESPECIALIDADES EN SALUD MENTAL VI ENFERMEDADES DEL SISTEMA NERVIOSO G20X ENFERMEDAD DE PARKINSON
48126 29/08/2025 SM_2025_35262 31 0 0 Masculino sin valor sin valor GENERAL ESCOBEDO HOSPITAL DE ESPECIALIDADES EN SALUD MENTAL V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F197 TRASTORNOS MENTALES Y DEL COMPORTAMIENTO DEBID...
48170 29/08/2025 SM_2025_35306 9 0 0 Masculino sin valor sin valor GENERAL ESCOBEDO HOSPITAL DE ESPECIALIDADES EN SALUD MENTAL V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F900 PERTURBACION DE LA ACTIVIDAD Y DE LA ATENCION

419 rows × 14 columns

De igual forma, para las variables de edad_meses y edad_dias, se tienen como valores puros 0, por lo que también se borrarán del dataset ya que no hay ningún otro valor aparte de este, es decir, que no se está empleando para dar con más exactitud la edad.

In [419]:
df2 = df2.drop(columns=['edad_meses', 'edad_dias'])

Se puede asumir que esto sucede ya que en los centros respectivos, no se cuenta con los instrumentos necesarios para calcular estas medidas.

Procedemos a revisar nuesro dataset con estas dos varables empleadas anteriormente:

In [420]:
df2[df2['peso'] == 'sin valor']
Out[420]:
fecha id_consulta edad sexo peso altura municipio_unidad_medica institucion_unidad_medica clave_grupo_ enfermedad descripcion_grupo_enfermedad clave_enfermedad descripcion_enfermedad
In [421]:
df2[df2['altura'] == 'sin valor']
Out[421]:
fecha id_consulta edad sexo peso altura municipio_unidad_medica institucion_unidad_medica clave_grupo_ enfermedad descripcion_grupo_enfermedad clave_enfermedad descripcion_enfermedad

No se presenta tampoco la existencia de estos nulos, por lo que proseguimos con la transformación de las variables categóricas a numéricas.

Variables categóricas.

In [422]:
df2.dtypes
Out[422]:
fecha                           object
id_consulta                     object
edad                             int64
sexo                            object
peso                            object
altura                          object
municipio_unidad_medica         object
institucion_unidad_medica       object
clave_grupo_ enfermedad         object
descripcion_grupo_enfermedad    object
clave_enfermedad                object
descripcion_enfermedad          object
dtype: object

Los datos y su tipo que disponemos son los siguientes:

  • id_consulta → object

  • edad → int64

  • sexo → object

  • peso → object

  • altura → object

  • municipio_unidad_medica → object

  • institucion_unidad_medica → object

  • clave_grupo_ enfermedad → object

  • descripcion_grupo_enfermedad → object

  • clave_enfermedad → object

  • descripcion_enfermedad → object

Es importante consultar este punto de nuestro dataset para ver cuáles variables deben convertirse a numéricas para la implementación de una regresión, tomando en cuenta aquellas las variables que sí valen la pena de convertir ya que su número dummy es fácil de identificar y simplifica el proceso de detección del mismo (es decir, donde no tengamos 2000 variables nuevas, son muchas y toma tiempo identificar a qué corresponde cada una).

Por ende, las que se transformarán mediante LabelEncoder son las siguientes:

  • sexo

  • institucion_unidad_medica

  • descripcion_grupo_enfermedad_num

  • clave_enfermedad_num

In [423]:
# Convertimos las variables categóricas a categóricas numéricas.
from sklearn.preprocessing import LabelEncoder 

# Aplicamos la transformación.
df2['sexo_num'] = LabelEncoder().fit_transform(df2['sexo'])
df2['institucion_unidad_medica_num'] = LabelEncoder().fit_transform(df2['institucion_unidad_medica'])
df2['descripcion_grupo_enfermedad_num'] = LabelEncoder().fit_transform(df2['descripcion_grupo_enfermedad'])
df2['clave_enfermedad_num'] = LabelEncoder().fit_transform(df2['clave_enfermedad'])

df2.sample(5)
Out[423]:
fecha id_consulta edad sexo peso altura municipio_unidad_medica institucion_unidad_medica clave_grupo_ enfermedad descripcion_grupo_enfermedad clave_enfermedad descripcion_enfermedad sexo_num institucion_unidad_medica_num descripcion_grupo_enfermedad_num clave_enfermedad_num
32246 02/05/2025 SM_2025_19382 55 Femenino 79 155 SAN PEDRO GARZA GARCIA CENTRO DE SALUD CON SERVICIOS AMPLIADOS SAN PE... XXI FACTORES QUE INFLUYEN EN EL ESTADO DE SALUD Y ... Z631 PROBLEMAS EN LA RELACION CON LOS PADRES Y LOS ... 0 1 0 47
7239 01/11/2024 SM_2024_46108 47 Femenino 68 165 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F412 TRASTORNO MIXTO DE ANSIEDAD Y DEPRESION 0 0 1 32
46618 26/08/2025 SM_2025_33754 52 Masculino 108.1 158 SAN PEDRO GARZA GARCIA CENTRO DE SALUD CON SERVICIOS AMPLIADOS SAN PE... XXI FACTORES QUE INFLUYEN EN EL ESTADO DE SALUD Y ... Z631 PROBLEMAS EN LA RELACION CON LOS PADRES Y LOS ... 1 1 0 47
18489 17/02/2025 SM_2025_5625 18 Masculino 60 160 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F412 TRASTORNO MIXTO DE ANSIEDAD Y DEPRESION 1 0 1 32
37262 17/06/2025 SM_2025_24398 33 Femenino 68 158 SAN PEDRO GARZA GARCIA CENTRO DE SALUD CON SERVICIOS AMPLIADOS SAN PE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F330 TRASTORNO DEPRESIVO RECURRENTE EPISODIO LEVE P... 0 1 1 25

También, como las variables de peso y altura se encuentran como categóricas, se cambiarán a numéricas para poderlas manipular más adelante ya que las mismas son de mucha importancia par darle más información a la variable dependiente.

In [424]:
# Convertir peso y altura a enteros.
df2['peso'] = df2['peso'].astype(float)
df2['altura'] = df2['altura'].astype(float)

# Verificar.
print(df2.dtypes[['peso','altura']])
peso      float64
altura    float64
dtype: object
In [425]:
df2.dtypes
Out[425]:
fecha                                object
id_consulta                          object
edad                                  int64
sexo                                 object
peso                                float64
altura                              float64
municipio_unidad_medica              object
institucion_unidad_medica            object
clave_grupo_ enfermedad              object
descripcion_grupo_enfermedad         object
clave_enfermedad                     object
descripcion_enfermedad               object
sexo_num                              int64
institucion_unidad_medica_num         int64
descripcion_grupo_enfermedad_num      int64
clave_enfermedad_num                  int64
dtype: object

Outliers.

Proseguimos con la exploración de outliers en diferentes variables de nuestro dataset.

In [426]:
plt.boxplot(df2['edad'].dropna())
plt.title('Boxplot de edades.')
plt.xlabel('Edades.')
plt.show()
No description has been provided for this image

En el caso de la variable de edades, no se presentarán outliers ya que estamos condicionando las edades que queremos manejar.

Sin embargo, si tratamos la base de datos original, existe la presencia de estos datos lejanos siendo de apróximadamente 85 hasta los 100 años, haciendo que estos valores sean extraordinarios y que valgan la pena de estudiar por la alta edad que dichos individuos presentan.

In [427]:
plt.boxplot(df['edad'].dropna())
plt.title('Boxplot de edades.')
plt.xlabel('Edades.')
plt.show()
No description has been provided for this image

Aunque también se puede observar un outlier muy lejano que está alrededor de la edad de 120 años, esto podría tratarse de un error o de un dato de prueba probablemente para ver cómo funcionaba el registro en la base de datos (o algún otro caso), pero es sumamente atípico.

In [428]:
plt.boxplot(df2['clave_enfermedad_num'].dropna())
plt.title('Boxplot de edades.')
plt.xlabel('Edades.')
plt.show()
No description has been provided for this image

Las claves de las enfermedades nos demuestran cuáles son las más típicas de este rango de edad dentro del municipio, siendo en su mayoria una alrededor de 30-32.

In [429]:
df2.value_counts('clave_enfermedad_num')
Out[429]:
clave_enfermedad_num
32    177
46     76
6      72
47     43
26     34
22     29
31     24
2      22
36     21
10     20
29     17
25     17
50     16
30     14
13     11
14     11
57     10
5       9
23      7
40      7
53      6
41      6
37      5
56      4
52      4
51      4
44      4
42      4
27      4
33      3
18      3
7       3
17      3
20      3
35      2
1       2
34      2
8       1
4       1
19      1
55      1
54      1
21      1
16      1
3       1
49      1
48      1
45      1
24      1
15      1
43      1
12      1
28      1
39      1
38      1
11      1
9       1
0       1
Name: count, dtype: int64
In [430]:
df2[df2['clave_enfermedad_num'] == 32]
Out[430]:
fecha id_consulta edad sexo peso altura municipio_unidad_medica institucion_unidad_medica clave_grupo_ enfermedad descripcion_grupo_enfermedad clave_enfermedad descripcion_enfermedad sexo_num institucion_unidad_medica_num descripcion_grupo_enfermedad_num clave_enfermedad_num
2626 02/10/2024 SM_2024_41495 53 Femenino 60.00 160.0 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F412 TRASTORNO MIXTO DE ANSIEDAD Y DEPRESION 0 0 1 32
2628 04/10/2024 SM_2024_41497 46 Femenino 70.00 165.0 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F412 TRASTORNO MIXTO DE ANSIEDAD Y DEPRESION 0 0 1 32
2629 04/10/2024 SM_2024_41498 47 Femenino 60.00 160.0 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F412 TRASTORNO MIXTO DE ANSIEDAD Y DEPRESION 0 0 1 32
2633 07/10/2024 SM_2024_41502 49 Masculino 90.00 165.0 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F412 TRASTORNO MIXTO DE ANSIEDAD Y DEPRESION 1 0 1 32
2634 07/10/2024 SM_2024_41503 54 Femenino 60.00 160.0 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F412 TRASTORNO MIXTO DE ANSIEDAD Y DEPRESION 0 0 1 32
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
46607 21/08/2025 SM_2025_33743 35 Masculino 100.01 174.0 SAN PEDRO GARZA GARCIA CENTRO DE SALUD CON SERVICIOS AMPLIADOS SAN PE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F412 TRASTORNO MIXTO DE ANSIEDAD Y DEPRESION 1 1 1 32
46608 21/08/2025 SM_2025_33744 22 Femenino 66.50 158.0 SAN PEDRO GARZA GARCIA CENTRO DE SALUD CON SERVICIOS AMPLIADOS SAN PE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F412 TRASTORNO MIXTO DE ANSIEDAD Y DEPRESION 0 1 1 32
46616 26/08/2025 SM_2025_33752 46 Femenino 72.00 157.0 SAN PEDRO GARZA GARCIA CENTRO DE SALUD CON SERVICIOS AMPLIADOS SAN PE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F412 TRASTORNO MIXTO DE ANSIEDAD Y DEPRESION 0 1 1 32
46624 27/08/2025 SM_2025_33760 35 Femenino 77.50 135.0 SAN PEDRO GARZA GARCIA CENTRO DE SALUD CON SERVICIOS AMPLIADOS SAN PE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F412 TRASTORNO MIXTO DE ANSIEDAD Y DEPRESION 0 1 1 32
46630 28/08/2025 SM_2025_33766 20 Femenino 51.00 158.0 SAN PEDRO GARZA GARCIA CENTRO DE SALUD CON SERVICIOS AMPLIADOS SAN PE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F412 TRASTORNO MIXTO DE ANSIEDAD Y DEPRESION 0 1 1 32

177 rows × 16 columns

De aquí podemos notar que la moda de estas personas es padecer de un trastorno mixto de ansiedad y depresión, los mismos entran dentro del grupo de aquellos con trastornos mentales y del comportamiento - vamos ya adentrandonos en resultados poco a poco.

Este boxplot siguiente es muy interesante de analizar ya que estamos tratando a la variable numérica de la descripción del grupo de enfermedad, donde se observa que predomina el número 1, siendo de personas que padecen de trastornos mentales y del comportamiento.

Pero también, se nos presentan outliers de con un valor de 0, explorando el dataset nos podemos percatar que se tienen registros de individuos que como tal no están diagnosticados de algún padecimiento de salud mental, sino que presentan algunos factores en su entorno que dan paso a presentar problemas de varios ámbitos en su vida diaria, como por ejemplo:

  • Problemas en pareja.

  • Problemas familiares.

Es interesante conocer esto ya que a medida de que estos conflictos aumenten su intensidad o su cantidad, pueden destapar en problemas de salud que los lleven a un diagnóstico.

In [431]:
plt.boxplot(df2['descripcion_grupo_enfermedad_num'].dropna())
plt.title('Boxplot de descripción del grupo de enfermedad.')
plt.xlabel('Descripción del grupo de enfermedad.')
plt.show()
No description has been provided for this image
In [432]:
df2[df2['descripcion_grupo_enfermedad_num'] == 1]
Out[432]:
fecha id_consulta edad sexo peso altura municipio_unidad_medica institucion_unidad_medica clave_grupo_ enfermedad descripcion_grupo_enfermedad clave_enfermedad descripcion_enfermedad sexo_num institucion_unidad_medica_num descripcion_grupo_enfermedad_num clave_enfermedad_num
2625 02/10/2024 SM_2024_41494 33 Masculino 60.0 160.0 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F122 TRASTORNOS MENTALES Y DEL COMPORTAMIENTO DEBID... 1 0 1 6
2626 02/10/2024 SM_2024_41495 53 Femenino 60.0 160.0 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F412 TRASTORNO MIXTO DE ANSIEDAD Y DEPRESION 0 0 1 32
2627 02/10/2024 SM_2024_41496 60 Femenino 60.0 160.0 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F630 JUEGO PATOLOGICO 0 0 1 40
2628 04/10/2024 SM_2024_41497 46 Femenino 70.0 165.0 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F412 TRASTORNO MIXTO DE ANSIEDAD Y DEPRESION 0 0 1 32
2629 04/10/2024 SM_2024_41498 47 Femenino 60.0 160.0 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F412 TRASTORNO MIXTO DE ANSIEDAD Y DEPRESION 0 0 1 32
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
46619 26/08/2025 SM_2025_33755 44 Femenino 58.0 148.0 SAN PEDRO GARZA GARCIA CENTRO DE SALUD CON SERVICIOS AMPLIADOS SAN PE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F332 TRASTORNO DEPRESIVO RECURRENTE EPISODIO DEPRES... 0 1 1 27
46623 27/08/2025 SM_2025_33759 25 Femenino 77.0 150.0 SAN PEDRO GARZA GARCIA CENTRO DE SALUD CON SERVICIOS AMPLIADOS SAN PE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F321 EPISODIO DEPRESIVO MODERADO 0 1 1 23
46624 27/08/2025 SM_2025_33760 35 Femenino 77.5 135.0 SAN PEDRO GARZA GARCIA CENTRO DE SALUD CON SERVICIOS AMPLIADOS SAN PE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F412 TRASTORNO MIXTO DE ANSIEDAD Y DEPRESION 0 1 1 32
46630 28/08/2025 SM_2025_33766 20 Femenino 51.0 158.0 SAN PEDRO GARZA GARCIA CENTRO DE SALUD CON SERVICIOS AMPLIADOS SAN PE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F412 TRASTORNO MIXTO DE ANSIEDAD Y DEPRESION 0 1 1 32
46631 28/08/2025 SM_2025_33767 36 Masculino 53.0 175.0 SAN PEDRO GARZA GARCIA CENTRO DE SALUD CON SERVICIOS AMPLIADOS SAN PE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F152 TRASTORNOS MENTALES Y DEL COMPORTAMIENTO DEBID... 1 1 1 13

547 rows × 16 columns

In [433]:
df2[df2['descripcion_grupo_enfermedad_num'] == 0]
Out[433]:
fecha id_consulta edad sexo peso altura municipio_unidad_medica institucion_unidad_medica clave_grupo_ enfermedad descripcion_grupo_enfermedad clave_enfermedad descripcion_enfermedad sexo_num institucion_unidad_medica_num descripcion_grupo_enfermedad_num clave_enfermedad_num
7395 04/11/2024 SM_2024_46264 65 Femenino 58.1 148.0 SAN PEDRO GARZA GARCIA CENTRO DE SALUD CON SERVICIOS AMPLIADOS SAN PE... XXI FACTORES QUE INFLUYEN EN EL ESTADO DE SALUD Y ... Z630 PROBLEMAS EN LA RELACION ENTRE ESPOSOS O PAREJA 0 1 0 46
7396 04/11/2024 SM_2024_46265 56 Femenino 82.8 160.0 SAN PEDRO GARZA GARCIA CENTRO DE SALUD CON SERVICIOS AMPLIADOS SAN PE... XXI FACTORES QUE INFLUYEN EN EL ESTADO DE SALUD Y ... Z631 PROBLEMAS EN LA RELACION CON LOS PADRES Y LOS ... 0 1 0 47
7397 04/11/2024 SM_2024_46266 40 Femenino 74.4 162.0 SAN PEDRO GARZA GARCIA CENTRO DE SALUD CON SERVICIOS AMPLIADOS SAN PE... XXI FACTORES QUE INFLUYEN EN EL ESTADO DE SALUD Y ... Z566 OTROS PROBLEMAS DE TENSION FISICA O MENTAL REL... 0 1 0 44
7413 08/11/2024 SM_2024_46282 43 Masculino 66.0 159.0 SAN PEDRO GARZA GARCIA CENTRO DE SALUD CON SERVICIOS AMPLIADOS SAN PE... XXI FACTORES QUE INFLUYEN EN EL ESTADO DE SALUD Y ... Z630 PROBLEMAS EN LA RELACION ENTRE ESPOSOS O PAREJA 1 1 0 46
7415 08/11/2024 SM_2024_46284 55 Femenino 81.7 155.0 SAN PEDRO GARZA GARCIA CENTRO DE SALUD CON SERVICIOS AMPLIADOS SAN PE... XXI FACTORES QUE INFLUYEN EN EL ESTADO DE SALUD Y ... Z631 PROBLEMAS EN LA RELACION CON LOS PADRES Y LOS ... 0 1 0 47
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
46615 25/08/2025 SM_2025_33751 33 Femenino 68.0 158.0 SAN PEDRO GARZA GARCIA CENTRO DE SALUD CON SERVICIOS AMPLIADOS SAN PE... XXI FACTORES QUE INFLUYEN EN EL ESTADO DE SALUD Y ... Z631 PROBLEMAS EN LA RELACION CON LOS PADRES Y LOS ... 0 1 0 47
46618 26/08/2025 SM_2025_33754 52 Masculino 108.1 158.0 SAN PEDRO GARZA GARCIA CENTRO DE SALUD CON SERVICIOS AMPLIADOS SAN PE... XXI FACTORES QUE INFLUYEN EN EL ESTADO DE SALUD Y ... Z631 PROBLEMAS EN LA RELACION CON LOS PADRES Y LOS ... 1 1 0 47
46621 26/08/2025 SM_2025_33757 32 Femenino 71.8 167.0 SAN PEDRO GARZA GARCIA CENTRO DE SALUD CON SERVICIOS AMPLIADOS SAN PE... XXI FACTORES QUE INFLUYEN EN EL ESTADO DE SALUD Y ... Z631 PROBLEMAS EN LA RELACION CON LOS PADRES Y LOS ... 0 1 0 47
46626 27/08/2025 SM_2025_33762 54 Femenino 69.5 152.0 SAN PEDRO GARZA GARCIA CENTRO DE SALUD CON SERVICIOS AMPLIADOS SAN PE... XXI FACTORES QUE INFLUYEN EN EL ESTADO DE SALUD Y ... Z630 PROBLEMAS EN LA RELACION ENTRE ESPOSOS O PAREJA 0 1 0 46
46627 27/08/2025 SM_2025_33763 56 Femenino 80.0 155.0 SAN PEDRO GARZA GARCIA CENTRO DE SALUD CON SERVICIOS AMPLIADOS SAN PE... XXI FACTORES QUE INFLUYEN EN EL ESTADO DE SALUD Y ... Z631 PROBLEMAS EN LA RELACION CON LOS PADRES Y LOS ... 0 1 0 47

173 rows × 16 columns

5.1 Selección de características.¶

Colinealidad (seguimiento de la sección de preparación).

Pasamos a conocer si nuestras variables presentan colinealidad entre ellas por diversos métodos como:

  • Correlación.

  • Mapa de calor.

  • ANOVA.

  • VIF.

Justo antes de involucrarnos en construir el modelo de regresión.

In [434]:
# Determinar la correlación de variables.
df2.corr(numeric_only = True).sort_values(by = 'edad', ascending = False)
Out[434]:
edad peso altura sexo_num institucion_unidad_medica_num descripcion_grupo_enfermedad_num clave_enfermedad_num
edad 1.000000 0.060268 -0.265350 -0.233939 0.095001 -0.204830 0.260548
clave_enfermedad_num 0.260548 0.000085 -0.336370 -0.481351 0.517646 -0.719808 1.000000
institucion_unidad_medica_num 0.095001 -0.082971 -0.579304 -0.433666 1.000000 -0.397614 0.517646
peso 0.060268 1.000000 0.378960 0.206448 -0.082971 -0.000502 0.000085
descripcion_grupo_enfermedad_num -0.204830 -0.000502 0.268198 0.241158 -0.397614 1.000000 -0.719808
sexo_num -0.233939 0.206448 0.616032 1.000000 -0.433666 0.241158 -0.481351
altura -0.265350 0.378960 1.000000 0.616032 -0.579304 0.268198 -0.336370
In [435]:
# Mapa de calor.
plt.figure(figsize = (10, 6))
sns.heatmap(df2.corr(numeric_only = True), annot = True)
plt.show()
No description has been provided for this image
In [436]:
# Definimos el modelo de Feature Selection - ANOVA.
modelFS = smf.ols(formula='edad ~ sexo_num + peso + altura + institucion_unidad_medica_num + descripcion_grupo_enfermedad_num + clave_enfermedad_num', data = df2).fit()
modelFS.summary()
Out[436]:
OLS Regression Results
Dep. Variable: edad R-squared: 0.161
Model: OLS Adj. R-squared: 0.154
Method: Least Squares F-statistic: 22.78
Date: Wed, 18 Feb 2026 Prob (F-statistic): 1.20e-24
Time: 14:21:28 Log-Likelihood: -2819.0
No. Observations: 720 AIC: 5652.
Df Residuals: 713 BIC: 5684.
Df Model: 6
Covariance Type: nonrobust
coef std err t P>|t| [0.025 0.975]
Intercept 115.3039 11.962 9.639 0.000 91.819 138.789
sexo_num -0.9476 1.335 -0.710 0.478 -3.569 1.674
peso 0.1636 0.033 5.014 0.000 0.100 0.228
altura -0.5600 0.078 -7.147 0.000 -0.714 -0.406
institucion_unidad_medica_num -6.6848 1.243 -5.380 0.000 -9.124 -4.245
descripcion_grupo_enfermedad_num -1.1104 1.578 -0.704 0.482 -4.208 1.988
clave_enfermedad_num 0.2017 0.053 3.801 0.000 0.098 0.306
Omnibus: 85.585 Durbin-Watson: 1.964
Prob(Omnibus): 0.000 Jarque-Bera (JB): 26.419
Skew: 0.167 Prob(JB): 1.83e-06
Kurtosis: 2.123 Cond. No. 4.76e+03


Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 4.76e+03. This might indicate that there are
strong multicollinearity or other numerical problems.

En el análisis ANOVA, explícitamente se nos menciona que existe una colinealidad, de forma visual se puede observar que existe ahí algo de ruido entre peso y altura, pero se mencionó anteriormente que las mismas son importantes para alimentar a la variable dependiente, por lo que se realizará la creación de IMC que combine tanto el peso como altura, teniendo la fortuna de que ambas pueden ser manipuladas para generar este cálculo:

In [437]:
# Convertir altura a metros.
df2['altura_m'] = df2['altura'] / 100
# IMC.
df2['IMC'] = df2['peso'] / (df2['altura_m']**2)

Ahora, veremos como se comporta la colinealidad con esta nueva variable que combina las dos mencionadas:

In [438]:
# Definimos el modelo de Feature Selection - ANOVA.
modelFS = smf.ols(formula='edad ~ sexo_num + IMC + institucion_unidad_medica_num + descripcion_grupo_enfermedad_num + clave_enfermedad_num', data = df2).fit()
modelFS.summary()
Out[438]:
OLS Regression Results
Dep. Variable: edad R-squared: 0.123
Model: OLS Adj. R-squared: 0.117
Method: Least Squares F-statistic: 19.98
Date: Wed, 18 Feb 2026 Prob (F-statistic): 1.13e-18
Time: 14:21:50 Log-Likelihood: -2835.0
No. Observations: 720 AIC: 5682.
Df Residuals: 714 BIC: 5710.
Df Model: 5
Covariance Type: nonrobust
coef std err t P>|t| [0.025 0.975]
Intercept 27.1302 3.557 7.626 0.000 20.146 34.114
sexo_num -4.8552 1.163 -4.174 0.000 -7.139 -2.572
IMC 0.4229 0.085 4.961 0.000 0.256 0.590
institucion_unidad_medica_num -3.5995 1.140 -3.157 0.002 -5.838 -1.361
descripcion_grupo_enfermedad_num -2.3249 1.597 -1.456 0.146 -5.460 0.810
clave_enfermedad_num 0.1467 0.053 2.761 0.006 0.042 0.251
Omnibus: 97.489 Durbin-Watson: 1.973
Prob(Omnibus): 0.000 Jarque-Bera (JB): 30.159
Skew: 0.221 Prob(JB): 2.83e-07
Kurtosis: 2.100 Cond. No. 342.


Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

Con estas variables nos quedaremos para realizar el modelo y estas declararlas como las variables independientes.

6.1 Definición de variables.¶

Variable dependiente.

Como se mencionó desde un principio, es que vamos a estar analizando las edades de las personas que participan activamente al desarrollo del municipio de San Pedro Garza García, esto con el propósito de ver como las diferentes etapas de la adultez se desarrollan y evolucionan en esta sociedad que no detiene su ritmo de crecimiento, es por eso que la variable dependiente es aquella de edad.

Variable independiente.

Una vez revisado la colinealidad entre variables, se puede concretar que aquellas variables independientes serán las siguientes:

  • sexo_num

  • IMC

  • institucion_unidad_medica_num

  • descripcion_grupo_enfermedad_num

  • clave_enfermedad_num

7.1 Construcción.¶

7.2 Modelo lineal: Regresión Lineal Múltiple.¶

Se empleará el uso de una Regresión Lineal Múltiple ya que aparte de probar un modelo lineal, en la vida real, hay muchos factores que afectan a nuestra variable de salida como lo es en el caso del dataset elegido.

  1. Separamos variables.
In [518]:
# Definir quién sera mi "x" y "y".
y = df2['edad'] # Doble [] para predecir, solo uno [] para inferencia.
x = df2[['sexo_num', 'IMC', 'institucion_unidad_medica_num', 'descripcion_grupo_enfermedad_num', 'clave_enfermedad_num']]
print(y.shape)
(720,)
  1. Dividimos los datos de entrenamiento y prueba.
In [519]:
# Dividir los tratos en train y test.
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2, random_state = 0)
x_train.shape, x_test.shape, y_train.shape, y_test.shape
Out[519]:
((576, 5), (144, 5), (576,), (144,))
  1. Generamos el modelo de Regresión Lineal Múltiple.
In [520]:
# Formulamos el modelo.
modelRLM = LinearRegression()
# Entrenamos el modelo.
modelRLM.fit(x_train, y_train)
Out[520]:
LinearRegression()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
Parameters
fit_intercept  True
copy_X  True
tol  1e-06
n_jobs  None
positive  False

Aprendizaje estadístico.

In [521]:
# Aspecto de la inferencia.
X2 = sm.add_constant(x_train)
model_inference2 = sm.OLS(y_train, X2).fit()
model_inference2.conf_int()
Out[521]:
0 1
const 16.442658 32.421577
sexo_num -6.867546 -1.688942
IMC 0.261221 0.637482
institucion_unidad_medica_num -5.662872 -0.723365
descripcion_grupo_enfermedad_num -4.803355 2.277467
clave_enfermedad_num 0.056783 0.291923

Los intervalos de confianza al 95% muestran que todas las variables incluidas en el modelo son significativas en la edad, esto debido a que ninguna incluye al 0 dentro de sus intervalos.

In [522]:
# Aspecto de inferencia. 
y_pred = modelRLM.predict(x_test) # Preddicción.

residuals = y_test - y_pred # Errores.

# RSS (Residual Sum of Squares).
RSS2 = np.sum(residuals**2)

# TSS (Total Sum of Squares).
TSS2 = np.sum((y_test - np.mean(y_test))**2)

# RSE (Residual Standard Error).
n2 = len(y_test)
p2 = 4 # Solo 4 variableS.
RSE2 = np.sqrt(RSS2  / (n2 - p2 - 1))

print("RSS =", RSS2)
print("TSS =", TSS2)
print("RSE =", RSE2)
RSS = 22320.8976161139
TSS = 25115.222222222223
RSE = 12.67209521895371

Para los errores en la inferencia, podemos concluir lo siguiente:

  • RSS (Residual Sum of Squares): obtenemos un valor muy alto, esto indica la variabilidad que el modelo no logra explicar.

  • TSS (Total Sum of Squares): obtenemos también un valor muy alto, por lo que hay mucha variabilidad total de la edad en los datos.

  • RSE (Residual Standard Error): el predictor se equivoca alrededor de 12 años.

Dentro de esta variabilidad del modelo (RSS / TSS), obtenemos este no se llega a explicar alrededor del 89%.

In [523]:
x = df2[['sexo_num', 'IMC', 'institucion_unidad_medica_num', 'clave_enfermedad_num']]
y = df2['edad']

# Split train-test.
x_train, x_test, y_train, y_test = train_test_split(
    x, y, test_size=0.2, random_state=42
)

# Escalado.
scaler = StandardScaler()
x_train_scaled = scaler.fit_transform(x_train)
x_test_scaled = scaler.transform(x_test)

# DataFrame y agregar const.
x_train_scaled_df = pd.DataFrame(x_train_scaled, columns=x.columns, index=x_train.index)
x_test_scaled_df = pd.DataFrame(x_test_scaled, columns=x.columns, index=x_test.index)

# Agrega const para intercepto.
x_train_final = sm.add_constant(x_train_scaled_df, has_constant='add')
x_test_final = sm.add_constant(x_test_scaled_df, has_constant='add')

model = sm.OLS(y_train, x_train_final).fit()

print(model.summary())

# Predicciones
y_train_pred = model.predict(x_train_final)
y_test_pred = model.predict(x_test_final)

# Métricas de sklearn (estas son las correctas).
r2_train = r2_score(y_train, y_train_pred)
r2_test = r2_score(y_test, y_test_pred)

mae_train = mean_absolute_error(y_train, y_train_pred)
mae_test = mean_absolute_error(y_test, y_test_pred)

rmse_train = np.sqrt(mean_squared_error(y_train, y_train_pred))
rmse_test = np.sqrt(mean_squared_error(y_test, y_test_pred))
print('---------------------MÉTRICAS------------------------------------')
print('MAE_TRAIN: ',mae_train,'MAE_TEST: ',mae_test)
print('RMSE_TRAIN: ',rmse_train,'RMSE_TEST: ',rmse_test)
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                   edad   R-squared:                       0.118
Model:                            OLS   Adj. R-squared:                  0.112
Method:                 Least Squares   F-statistic:                     19.06
Date:                Wed, 18 Feb 2026   Prob (F-statistic):           9.96e-15
Time:                        15:20:45   Log-Likelihood:                -2275.7
No. Observations:                 576   AIC:                             4561.
Df Residuals:                     571   BIC:                             4583.
Df Model:                           4                                         
Covariance Type:            nonrobust                                         
=================================================================================================
                                    coef    std err          t      P>|t|      [0.025      0.975]
-------------------------------------------------------------------------------------------------
const                            37.9132      0.526     72.034      0.000      36.879      38.947
sexo_num                         -2.5735      0.616     -4.176      0.000      -3.784      -1.363
IMC                               2.3231      0.542      4.286      0.000       1.259       3.388
institucion_unidad_medica_num    -1.9746      0.631     -3.129      0.002      -3.214      -0.735
clave_enfermedad_num              2.6214      0.645      4.061      0.000       1.354       3.889
==============================================================================
Omnibus:                       94.207   Durbin-Watson:                   1.885
Prob(Omnibus):                  0.000   Jarque-Bera (JB):               25.732
Skew:                           0.210   Prob(JB):                     2.58e-06
Kurtosis:                       2.054   Cond. No.                         2.02
==============================================================================

Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
---------------------MÉTRICAS------------------------------------
MAE_TRAIN:  10.85243963048322 MAE_TEST:  9.717247829039389
RMSE_TRAIN:  12.57680202986031 RMSE_TEST:  11.858834610776501

Para este otro resumen, podemos observar que el modelo solo puede explicar alrededor de un 10%, que es un valor muy bajo para el modelo y solo nos verifica lo establecido anteriormente que un 89% se queda sin explicar, por lo que a la hora de querer hacer predicciones, no hay de donde basarse lo suficiente para tener un valor preciso.

Sin dejar de lado que también se penalizan los errores grandes.

Aprendizaje automático.

In [488]:
# Validar si el modelo pronostica adecuadamente.
y_pred_test = modelRLM.predict(x_test)
print(y_pred_test[0:5])
print(y_test.head())
[[42.03076874]
 [36.65897731]
 [39.46914513]
 [34.74697249]
 [36.57486897]]
       edad
37233    54
46393    50
23277    21
18502    19
37216    33

Esto es clave, ya que aquí nos podemos dar cuenta que el modelo lineal no es muy bueno con las predicciones y muy de vez en cuando llega a acercarse a uno de los valores de entrenamiento como lo es en el caso del valor 36, donde logró predecir un 33 - pero mirando los otros casos donde de un valor de 36 predice uno de 50.

In [543]:
from sklearn.linear_model import Ridge

ridge = Ridge(alpha=1.0)
ridge.fit(x_train, y_train)

y_pred_ridge = ridge.predict(x_test)
print(y_pred_ridge[0:5])
[36.689356   43.38353169 36.66213833 30.49812542 42.75113797]

Como extra, se realizó un pequeño modelo de Ridge para introducir la regularización y evaluar el comportamiento del modelo lineal - se puede observar que aún existe una diferencia entre los valores de validación de predicción (Ridge se comporta muy parecido a la Regresión Lineal Múltiple).

In [489]:
R2_train = modelRLM.score(x_train, y_train)
print('R2 train = {:.2f}'.format(R2_train))
R2_test = modelRLM.score(x_test, y_test)
print('R2 test = {:.2f}'.format(R2_test))
print('Diferencia = {:.4f}%'.format(np.abs(R2_train-R2_test)*100))
R2 train = 0.12
R2 test = 0.11
Diferencia = 1.3103%

Reafirmamos que con la diferencia de 1.9967, el modelo no presenta overfitting.

In [490]:
# Obtener y_pred_train - pred = gorrito.
y_pred_train = modelRLM.predict(x_train)

# Importar las librerías para el cálculo de error.
from sklearn.metrics import mean_squared_error # MSE.
from sklearn.metrics import mean_absolute_percentage_error #MAPE.

# Calculamos los errores de train.
mse_train = mean_squared_error(y_train, y_pred_train)
rmse_train = np.sqrt(mse_train) # SQRT DEL MSE ES EL RMSE.
mape_train = mean_absolute_percentage_error(y_train, y_pred_train)*100

print('MSE train = {:.2f}'.format(mse_train))
print('RMSE train = {:.2f}'.format(rmse_train))
print('MAPE train = {:.2f}'.format(mape_train))

# Calculamos los errores de test.
mse_test = mean_squared_error(y_test, y_pred_test)
rmse_test = np.sqrt(mse_test) # SQRT DEL MSE ES EL RMSE.
mape_test = mean_absolute_percentage_error(y_test, y_pred_test)*100

print('\nMSE test = {:.2f}'.format(mse_test))
print('RMSE test = {:.2f}'.format(rmse_test))
print('MAPE test = {:.2f}'.format(mape_test))
MSE train = 154.00
RMSE train = 12.41
MAPE train = 32.36

MSE test = 155.01
RMSE test = 12.45
MAPE test = 32.54

El alto error en el MAPE de prueba indica que el modelo no es preciso, que como se mencionó anteriormente, su alta variabilidad en cuanto lo que no llega a explicar, complica de manera impresionante al predictor y es por eso que sus resultados son erróneos.

In [495]:
df2.head(2)
Out[495]:
fecha id_consulta edad sexo peso altura municipio_unidad_medica institucion_unidad_medica clave_grupo_ enfermedad descripcion_grupo_enfermedad clave_enfermedad descripcion_enfermedad sexo_num institucion_unidad_medica_num descripcion_grupo_enfermedad_num clave_enfermedad_num altura_m IMC
2625 02/10/2024 SM_2024_41494 33 Masculino 60.0 160.0 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F122 TRASTORNOS MENTALES Y DEL COMPORTAMIENTO DEBID... 1 0 1 6 1.6 23.4375
2626 02/10/2024 SM_2024_41495 53 Femenino 60.0 160.0 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F412 TRASTORNO MIXTO DE ANSIEDAD Y DEPRESION 0 0 1 32 1.6 23.4375
In [506]:
# x = df2[['sexo_num', 'IMC', 'institucion_unidad_medica_num', 'descripcion_grupo_enfermedad_num', 'clave_enfermedad_num']]
modelRLM.predict([[0, 23.0, 0, 1, 5], [0, 23.0, 0, 1, 40]])
/opt/anaconda3/lib/python3.13/site-packages/sklearn/utils/validation.py:2749: UserWarning: X does not have valid feature names, but LinearRegression was fitted with feature names
  warnings.warn(
Out[506]:
array([[34.37602828],
       [40.47837669]])

Estos son los resultados que obtenemos de las predicciones hechas, más adelante se compararán con aquellas del modelo no lineal para explicar los resultados, tomando en cuenta también la capacidad de predicción que calculamos anteriormente.

7.3 Modelo no lineal: Random Forest Regressor.¶

In [464]:
plt.scatter(df2['IMC'], df2['edad'])
plt.xlabel('IMC')
plt.ylabel('Edad')
plt.show()
No description has been provided for this image

Esta siguiente gráfica nos sirve para ver visualmente el comportamiento de los datos dentro de la variable IMC que tiene mucha importancia en el modelo.

Por lo que se puede observar, el comportamiento de los datos no es lineal, entonces se empleará ahora un modelo no lineal que es el de Random Forest Regressor, el cuál sirve para casos donde existe mucho ruido en los datos y que no es sensible a los datos.

  1. Separamos variables.
In [524]:
# Definir quién sera mi "x" y "y".
Y = df2['edad'] # Doble [] para predecir, solo uno [] para inferencia.
X = df2[['sexo_num', 'IMC', 'institucion_unidad_medica_num', 'descripcion_grupo_enfermedad_num', 'clave_enfermedad_num']]
print(Y.shape)
print(X.shape)
(720,)
(720, 5)
  1. Dividimos los datos de entrenamiento y prueba.
In [525]:
# Dividir los tratos en train y test.
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.2, random_state = 0)
X_train.shape, X_test.shape, Y_train.shape, Y_test.shape
Out[525]:
((576, 5), (144, 5), (576,), (144,))
  1. Generamos el modelo de Random Forest Regressor.
In [526]:
# Definir el modelo by default.
modelRF= RandomForestRegressor(random_state = 0)
# Entrenemos el modelo FS.
modelRF.fit(X_train,Y_train)
Out[526]:
RandomForestRegressor(random_state=0)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
Parameters
n_estimators  100
criterion  'squared_error'
max_depth  None
min_samples_split  2
min_samples_leaf  1
min_weight_fraction_leaf  0.0
max_features  1.0
max_leaf_nodes  None
min_impurity_decrease  0.0
bootstrap  True
oob_score  False
n_jobs  None
random_state  0
verbose  0
warm_start  False
ccp_alpha  0.0
max_samples  None
monotonic_cst  None

Aprendizaje estadístico.

In [527]:
# Aspecto de la inferencia.
X_2 = sm.add_constant(X_train)
model_inference2 = sm.OLS(Y_train, X_2).fit()
model_inference2.conf_int()
Out[527]:
0 1
const 16.442658 32.421577
sexo_num -6.867546 -1.688942
IMC 0.261221 0.637482
institucion_unidad_medica_num -5.662872 -0.723365
descripcion_grupo_enfermedad_num -4.803355 2.277467
clave_enfermedad_num 0.056783 0.291923
In [528]:
# Aspecto de inferencia. 
Y_pred = modelRF.predict(X_test) # Preddicción.

residuals = Y_test - Y_pred # Errores.

# RSS (Residual Sum of Squares).
RSS2 = np.sum(residuals**2)

# TSS (Total Sum of Squares).
TSS2 = np.sum((Y_test - np.mean(Y_test))**2)

# RSE (Residual Standard Error).
n2 = len(Y_test)
p2 = 4 # Solo 4 variableS.
RSE2 = np.sqrt(RSS2  / (n2 - p2 - 1))

print("RSS =", RSS2)
print("TSS =", TSS2)
print("RSE =", RSE2)
RSS = 12324.181507309926
TSS = 25115.222222222223
RSE = 9.416112590213766

Para los errores en la inferencia, podemos concluir lo siguiente:

  • RSS (Residual Sum of Squares): obtenemos un valor muy alto, PERO no tan alto como en la Regresión Lineal Múltiple, esto indica la variabilidad que el modelo no logra explicar.

  • TSS (Total Sum of Squares): obtenemos también un valor muy alto, por lo que hay mucha variabilidad total de la edad en los datos, igual que en la Regresión Lineal Múltiple.

  • RSE (Residual Standard Error): el predictor se equivoca alrededor de 9 años.

Dentro de esta variabilidad del modelo (RSS / TSS), obtenemos que no se llega a explicar alrededor del 49% del mismo, a diferencia de la Regresión Lineal Múltiple que no explicaba el 89%.

In [516]:
X = df2[['sexo_num', 'IMC', 'institucion_unidad_medica_num', 'descripcion_grupo_enfermedad_num', 'clave_enfermedad_num']]
Y = df2['edad']

X_train, X_test, Y_train, Y_test = train_test_split(
    X, Y, test_size=0.2, random_state=42
)

# Escalado para RF.
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

modelRF.fit(X_train_scaled, Y_train)

Y_train_pred = modelRF.predict(X_train_scaled)
Y_test_pred = modelRF.predict(X_test_scaled)

r2_train = r2_score(Y_train, Y_train_pred)
r2_test = r2_score(Y_test, Y_test_pred)

mae_train = mean_absolute_error(Y_train, Y_train_pred)
mae_test = mean_absolute_error(Y_test, Y_test_pred)

rmse_train = np.sqrt(mean_squared_error(Y_train, Y_train_pred))
rmse_test = np.sqrt(mean_squared_error(Y_test, Y_test_pred))

print('---------------------MÉTRICAS------------------------------------')
print('R2_TRAIN: ', r2_train, 'R2_TEST: ', r2_test)
print('MAE_TRAIN: ', mae_train, 'MAE_TEST: ', mae_test)
print('RMSE_TRAIN: ', rmse_train, 'RMSE_TEST: ', rmse_test)
---------------------MÉTRICAS------------------------------------
R2_TRAIN:  0.8803882520500678 R2_TEST:  0.5989438271130192
MAE_TRAIN:  2.7946946261232415 MAE_TEST:  5.099833321998135
RMSE_TRAIN:  4.630998771124348 RMSE_TEST:  8.028883592334903

En este resumen de Random Forest, nos centraremos en los errores impresos por el código, rescatando los siguientes puntos:

  • En entrenamiento, el modelo explica el 88% mientras que en prueba, el modelo explica un 59% (referencia al 49% aproximado que no se explica).

  • Existe overfitting.

  • Se penalizan los errores.

Aprendizaje automático.

In [499]:
# Validar si el modelo pronostica adecuadamente.
Y_pred_test = modelRF.predict(X_test)
print(Y_pred_test[0:5])
print(Y_test.head())
[53.72       28.53       22.24       18.67405952 32.49969841]
       edad
37233    54
46393    50
23277    21
18502    19
37216    33

Punto clave como se mencionó anteriormente en la Regresión Lineal Múltiple y en la breve introducción de Ridge.

En el caso del Random Forest Regressor, el modelo se acerca mucho más a los valores que se brindan a excepción de solo un caso, que fuera de ahí, es casi la predicción exacta si no nos ponemos estrictos con los decimales (teniendo en mente las validaciones anteriores en el modelo lineal donde aún existía diferencia).

In [500]:
R2_train = modelRF.score(X_train, Y_train)
print('R2 train = {:.2f}'.format(R2_train))
R2_test = modelRF.score(X_test, Y_test)
print('R2 test = {:.2f}'.format(R2_test))
print('Diferencia = {:.4f}%'.format(np.abs(R2_train-R2_test)*100))
R2 train = 0.88
R2 test = 0.51
Diferencia = 37.1656%

Existencia de overfitting (mencionada anteriormente).

In [501]:
# Obtener y_pred_train - pred = gorrito.
Y_pred_train = modelRF.predict(X_train)

# Importar las librerías para el cálculo de error.
from sklearn.metrics import mean_squared_error # MSE.
from sklearn.metrics import mean_absolute_percentage_error #MAPE

# Calculamos los errores de train.
mse_train = mean_squared_error(Y_train, Y_pred_train)
rmse_train = np.sqrt(mse_train) # SQRT DEL MSE ES EL RMSE.
mape_train = mean_absolute_percentage_error(y_train, y_pred_train)*100

print('MSE train = {:.2f}'.format(mse_train))
print('RMSE train = {:.2f}'.format(rmse_train))
print('MAPE train = {:.2f}'.format(mape_train))

# Calculamos los errores de test.
mse_test = mean_squared_error(Y_test, Y_pred_test)
rmse_test = np.sqrt(mse_test) # SQRT DEL MSE ES EL RMSE.
mape_test = mean_absolute_percentage_error(Y_test, Y_pred_test)*100

print('MSE test = {:.2f}'.format(mse_test))
print('RMSE test = {:.2f}'.format(rmse_test))
print('MAPE test = {:.2f}'.format(mape_test))
MSE train = 20.94
RMSE train = 4.58
MAPE train = 32.36
MSE test = 85.58
RMSE test = 9.25
MAPE test = 18.23

Precisión algo mala, pero mucho menor que en la Regresión Lineal Múltiple.

In [503]:
df2.head(2)
Out[503]:
fecha id_consulta edad sexo peso altura municipio_unidad_medica institucion_unidad_medica clave_grupo_ enfermedad descripcion_grupo_enfermedad clave_enfermedad descripcion_enfermedad sexo_num institucion_unidad_medica_num descripcion_grupo_enfermedad_num clave_enfermedad_num altura_m IMC
2625 02/10/2024 SM_2024_41494 33 Masculino 60.0 160.0 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F122 TRASTORNOS MENTALES Y DEL COMPORTAMIENTO DEBID... 1 0 1 6 1.6 23.4375
2626 02/10/2024 SM_2024_41495 53 Femenino 60.0 160.0 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONE... V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F412 TRASTORNO MIXTO DE ANSIEDAD Y DEPRESION 0 0 1 32 1.6 23.4375
In [509]:
pd.Series(modelRF.feature_importances_, index=X.columns).sort_values(ascending=False)
Out[509]:
IMC                                 0.499334
clave_enfermedad_num                0.383023
sexo_num                            0.063261
institucion_unidad_medica_num       0.042830
descripcion_grupo_enfermedad_num    0.011551
dtype: float64

Reafirmando lo establecido anteriormente de la importancia de IMC cuando se vió graficamente el comportamiento de la misma con respecto a la variable dependiente.

In [505]:
# x = df2[['sexo_num', 'IMC', 'institucion_unidad_medica_num', 'descripcion_grupo_enfermedad_num', 'clave_enfermedad_num']]
modelRF.predict([[0, 23.0, 0, 1, 5], [0, 23.0, 0, 1, 40]])
/opt/anaconda3/lib/python3.13/site-packages/sklearn/utils/validation.py:2749: UserWarning: X does not have valid feature names, but RandomForestRegressor was fitted with feature names
  warnings.warn(
Out[505]:
array([21.49489286, 41.74591667])

8.1 Evaluación de los modelos.¶

Para evaluar a los modelos tanto lineal como no lineal, se pondrán en comparación sus resultados respectivos tanto del aprendizaje estadístico (inferencia) como del aprendizaje automático (predicción):

Modelo lineal: Regresión Lineal Múltiple:

  • Intervalos no incluyen al 0 - variables significativas.

  • No presenta overfitting.

  • No se explica el 89% del modelo.

  • Validación de predicciones erróneas.

  • Precisión muy mala.

  • Predicción:

    • modelRLM.predict([[0, 23.0, 0, 1, 5], [0, 23.0, 0, 1, 40]])

    • Respuesta: 34 y 40.

Modelo no lineal: Random Forest Regressor:

  • Intervalos no incluyen al 0 - variables significativas.

  • Presenta overfitting.

  • No se explica el 49% del modelo.

  • Validación de predicciones casi perfecta.

  • Precisión buena (puede mejorar).

  • Predicción:

    • modelRF.predict([[0, 23.0, 0, 1, 5], [0, 23.0, 0, 1, 40]])

    • Respuesta: 21 y 41.

Los valores brindados para la predicción de cada modelo provienen de una mujer (mujeres predominando en el registro de los datos) con las mismas características pero con un cambio drástico en la clave de la enfermedad para percatarnos que la Regresión Lineal Múltiple solo hace un ajuste pequeño en predecir la edad, mientras que el Random Forest Regressor realiza el salto grande respectivo por la diferencia de grupos, es decir, genera una mejor búsqueda que no necesita ser lineal y puede expanderse más a lo larg del dataset.

Es por eso que se concluye que el modelo de Random Forest es el más adecuado para el dataset ya que la posibilidad de salir de la relación lineal para relacionar las interacciones entre variables es la clave del modelo - justo como se observo en su validación de predicción que es excelente por esta capacidad que tiene de búsqueda.

9.1 Discusiones.¶

Para este proyecto, no se presentaron dificultades a gran escala a la hora de estar desarrollando el código, sin embargo, si fue un poco exhaustiva la búsqueda de un buen dataset que fuera funcional para los modelos que se querían implementar que en ese caso, dicho aspecto se logró y se explicó ya previamente.

10.1 Conclusiones.¶

In [540]:
pd.set_option('display.max_colwidth', None)
df2[df2['clave_enfermedad_num'] == 5]
Out[540]:
fecha id_consulta edad sexo peso altura municipio_unidad_medica institucion_unidad_medica clave_grupo_ enfermedad descripcion_grupo_enfermedad clave_enfermedad descripcion_enfermedad sexo_num institucion_unidad_medica_num descripcion_grupo_enfermedad_num clave_enfermedad_num altura_m IMC
27482 22/04/2025 SM_2025_14618 20 Masculino 70.0 165.0 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONES SAN PEDRO V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F121 TRASTORNOS MENTALES Y DEL COMPORTAMIENTO DEBIDOS AL USO DE CANNABINOIDES USO NOCIVO 1 0 1 5 1.65 25.711662
31883 08/05/2025 SM_2025_19019 20 Masculino 75.0 165.0 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONES SAN PEDRO V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F121 TRASTORNOS MENTALES Y DEL COMPORTAMIENTO DEBIDOS AL USO DE CANNABINOIDES USO NOCIVO 1 0 1 5 1.65 27.548209
31923 23/05/2025 SM_2025_19059 20 Masculino 70.0 160.0 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONES SAN PEDRO V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F121 TRASTORNOS MENTALES Y DEL COMPORTAMIENTO DEBIDOS AL USO DE CANNABINOIDES USO NOCIVO 1 0 1 5 1.60 27.343750
31924 23/05/2025 SM_2025_19060 55 Masculino 80.0 165.0 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONES SAN PEDRO V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F121 TRASTORNOS MENTALES Y DEL COMPORTAMIENTO DEBIDOS AL USO DE CANNABINOIDES USO NOCIVO 1 0 1 5 1.65 29.384757
36837 06/06/2025 SM_2025_23973 25 Masculino 80.0 170.0 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONES SAN PEDRO V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F121 TRASTORNOS MENTALES Y DEL COMPORTAMIENTO DEBIDOS AL USO DE CANNABINOIDES USO NOCIVO 1 0 1 5 1.70 27.681661
36860 12/06/2025 SM_2025_23996 20 Masculino 75.0 165.0 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONES SAN PEDRO V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F121 TRASTORNOS MENTALES Y DEL COMPORTAMIENTO DEBIDOS AL USO DE CANNABINOIDES USO NOCIVO 1 0 1 5 1.65 27.548209
36915 25/06/2025 SM_2025_24051 20 Masculino 65.0 160.0 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONES SAN PEDRO V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F121 TRASTORNOS MENTALES Y DEL COMPORTAMIENTO DEBIDOS AL USO DE CANNABINOIDES USO NOCIVO 1 0 1 5 1.60 25.390625
41643 11/07/2025 SM_2025_28779 20 Masculino 60.0 160.0 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONES SAN PEDRO V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F121 TRASTORNOS MENTALES Y DEL COMPORTAMIENTO DEBIDOS AL USO DE CANNABINOIDES USO NOCIVO 1 0 1 5 1.60 23.437500
46366 07/08/2025 SM_2025_33502 20 Masculino 70.0 160.0 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONES SAN PEDRO V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F121 TRASTORNOS MENTALES Y DEL COMPORTAMIENTO DEBIDOS AL USO DE CANNABINOIDES USO NOCIVO 1 0 1 5 1.60 27.343750
In [541]:
pd.set_option('display.max_colwidth', None)
df2[df2['clave_enfermedad_num'] == 40]
Out[541]:
fecha id_consulta edad sexo peso altura municipio_unidad_medica institucion_unidad_medica clave_grupo_ enfermedad descripcion_grupo_enfermedad clave_enfermedad descripcion_enfermedad sexo_num institucion_unidad_medica_num descripcion_grupo_enfermedad_num clave_enfermedad_num altura_m IMC
2627 02/10/2024 SM_2024_41496 60 Femenino 60.0 160.0 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONES SAN PEDRO V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F630 JUEGO PATOLOGICO 0 0 1 40 1.60 23.437500
11175 17/12/2024 SM_2024_50044 61 Femenino 60.0 160.0 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONES SAN PEDRO V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F630 JUEGO PATOLOGICO 0 0 1 40 1.60 23.437500
18480 04/02/2025 SM_2025_5616 61 Femenino 60.0 160.0 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONES SAN PEDRO V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F630 JUEGO PATOLOGICO 0 0 1 40 1.60 23.437500
27467 01/04/2025 SM_2025_14603 39 Masculino 80.0 180.0 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONES SAN PEDRO V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F630 JUEGO PATOLOGICO 1 0 1 40 1.80 24.691358
31889 09/05/2025 SM_2025_19025 39 Masculino 75.0 167.0 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONES SAN PEDRO V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F630 JUEGO PATOLOGICO 1 0 1 40 1.67 26.892323
31911 19/05/2025 SM_2025_19047 61 Femenino 65.0 160.0 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONES SAN PEDRO V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F630 JUEGO PATOLOGICO 0 0 1 40 1.60 25.390625
31912 19/05/2025 SM_2025_19048 39 Masculino 85.0 178.0 SAN PEDRO GARZA GARCIA CENTRO COMUNITARIO DE SALUD MENTAL Y ADICCIONES SAN PEDRO V TRASTORNOS MENTALES Y DEL COMPORTAMIENTO F630 JUEGO PATOLOGICO 1 0 1 40 1.78 26.827421

Para concluir, este análisis nos sirvió para establecer diversas predicciones de qué edades se ven involucradas con ciertos padecimientos de salud mental en San Pedro Garza García.

Por ejemplo, dentro del padecimiento de la clave 5 que corresponde al Trastorno Mental y del Comportamiento debdo bajo al uso de Cannabinoides, obtenemos que según las características que le brindamos al modelo para predecir, la edad promedio que nos arroja es de 21, que comparando con el dataset, hace completo sentido y esto invita a indagar un poco más del por qué de esta moda dentro de las edades de adultos sumamente jóvenes a padecer de este trastorno en específico - de igual forma, para el padecimiento de la clave 40 que corresponde al Trastorno Mental y del Comportamiento, obtenemos bajo las mismas características que corresponde a una edad promedio de 41, que nuevamente comparando con el dataset hace completo sentido, ahora encaminándonos a indagar por qué los adultos de edad media tienden a estos trastornos.

Sin dejar de lado que la flexibilidad de implementar un modelo no lineal es la que permite realizar estos análisis al ahora estar trabajando con un algoritmo capaz de explorar la variabilidad de los datos, sobretodo en casos como estos que estamos evaluando rangos de edad, pero que puede aplicarse en otros escenarios que también presenten variaciones; es por eso que el proyecto brinda resultados muy satisfactorios y enriquecedores para el lector, esperando que llegue a autoridades para una investigación a profundidad y con los expertos dentro del área de la Psicología y la Psiquiatría para llegar a otras ramas que impactan al municipio como lo que es la economía y/o educación.

11.1 Aprendizajes.¶

Dentro de este proyecto, el aprendizaje principal es el aprender a trabajar con datos que se encuentran en el internet de forma abierta, es decir, que no están dentro de páginas relacionadas al desarrollo de Machine Learning para evitar la simplicidad a la hora de codificar. Esto con la intención de prácticar cómo es que a los Científicos e Ingenieros se les brindan las bases de datos sumamente robustas y se espera de ellos que puedan basicamente hacer la "magia" que es todo lo hecho anteriormente donde aún se puede mejorar e indagar más en las predicciones, como imputar más variables con otras estadísticas u optimizar el modelo de Random Forest Regressor.

12.1 Implicaciones.¶

Las implicaciones que conllevan la realización de este proyecto van más alla del aspecto del código, que es justamente la razón del objetivo planteado desde un principio ya que no era de esperarse que en aquellos individuos que están viviendo la adultez temprana (menores de 30 años), se encuentren experimentanto problemas con Cannabis, algo que sin duda vale la pena de profundizar para encontrar la causa y el efecto de estos resultados dentro del municipio de San Pedro Garza García, donde este grupo son aquellos con los que se cuenta para seguir poniendo el nombre del municipio en alto - es aquí donde se pueden llegar a diversas hipótesis de cómo es la sociedad joven de esta región, generando esa intriga de querer conocer más pero en este caso del contexto, esto por mencionar una implicación vista en el código, donde sin duda hay muchas otras que se pueden indagar.

13.1 Posibles líneas futuras.¶

El estudio solo se limitó a San Pedro Garza García con su respectiva justificación, sin embargo, quedan muchos municipios sin cubrir donde los mismos también pueden arrojar resultados sumamente interesantes donde ya se pueda hasta abarcar un estudio a nivel estatal.

De igual forma, estaría genial si se pudieran consultar más fuentes de datos para obtener otras características diferentes y tener en consideración las mismas para predicciones mucho más acertadas y que también se puedan perfilar a los diferentes grupos de personas para un análisis sumamente profundo y que sin duda brindaría más descubrimientos por estas segmentaciones.

14.1 Referencias.¶

Arrimada, M. (2022). Las 3 etapas de la adultez (y sus características). pymOrganization. https://psicologiaymente.com/desarrollo/etapas-adultez

colaboradores de Wikipedia. (2026, 22 enero). San Pedro Garza García. Wikipedia, la Enciclopedia Libre. https://es.wikipedia.org/wiki/San_Pedro_Garza_Garc%C3%ADa

Gobierno de NL pone en marcha  Hospital de Especialidades en Salud Mental | Gobierno del Estado de Nuevo León. (s. f.). https://www.nl.gob.mx/es/boletines/gobierno-de-nl-pone-en-marcha-hospital-de-especialidades-en-salud-mental

Pardo, D. - Corresponsal de BBC News Mundo en México. (2025, 26 septiembre). «Somos un rancho, pero de primer mundo»: cómo es San Pedro Garza García, uno de los municipios más ricos de América Latina. Yahoo News. https://es-us.noticias.yahoo.com/somos-rancho-mundo-san-pedro-130147939.html?guccounter=1&guce_referrer=aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS8&guce_referrer_sig=AQAAAMmp2Bvqk5tPLjoZLTT6gG1nJpi7JuPC-S2SRk7bnb9FcZT43OxX7CFUYPWuQtbqKLrXcOkVJqszWl5x6TmjK1cyMBpiTlnnUiyESrYs7Sy00CyLDoKUkaZTu5bvX-dLaN9A7sqbnjMF3Kii-dMXw_3eT4rAl3O_6VOD4OLWU2FL

Salud mental. (2026). OPS/OMS | Organización Panamericana de la Salud. https://www.paho.org/es/temas/salud-mental

15.1 Código de Honor de la Universidad de Monterrey.¶

Doy mi palabra que he realizado esta actividad con integridad académica.