PASO 1: Instalo y cargo las librerías necesarias

library(readxl)   # Importar bases de datos en formato Excel
library(dplyr)    # Manipulación y resumen de datos
library(ggplot2)  # Creación de gráficos
library(moments)  # Cálculo de asimetría y curtosis
library(scales)   # Escalas y porcentajes en gráficos
library(tidyr)    # Reorganizar tablas
library(psych)    # Estadísticas descriptivas ampliadas
library(e1071)    # Funciones adicionales para análisis estadístico

PASO 2: Importo y verifico la base de datos

En este paso importo la base de datos llamada “BD Practica R_Endocrino-1.xlsx”. Esta base contiene información de 100 observaciones y 50 variables relacionadas con características clínicas, demográficas y de estilo de vida. Uso la librería ‘readxl’ para leer el archivo en formato Excel (.xlsx) y lo guardo en un objeto de R llamado “Dataset”, que será el que usare para todos los análisis posteriores.

# Importar base de datos desde el archivo Excel
Dataset <- read_excel("BD Practica R_Endocrino-1.xlsx", sheet = "BD_Practica")

## Confirmo que el archivo se cargó correctamente:
View(Dataset)  
# me abre la base en una pestaña de RStudio para visualizar las columnas y filas

## Verifico la estructura general del conjunto de datos:
str(Dataset)     
## tibble [100 × 51] (S3: tbl_df/tbl/data.frame)
##  $ ID          : num [1:100] 700 570 29 1003 994 ...
##  $ EDAD        : num [1:100] 35 69 38 30 62 30 40 57 42 35 ...
##  $ SEXO        : chr [1:100] "Masculino" "Femenino" "Femenino" "Masculino" ...
##  $ PESO        : num [1:100] 112.5 76 89.6 57.5 82 ...
##  $ TALLA       : num [1:100] 162 168 171 159 164 ...
##  $ SEDENTARIO  : num [1:100] 1 0 0 1 0 1 1 1 0 1 ...
##  $ Escolaridad : chr [1:100] "Primaria" "Primaria" "Primaria" "Universidad" ...
##  $ TAS         : num [1:100] 125 130 120 100 130 90 120 110 125 140 ...
##  $ TAD         : num [1:100] 85 70 90 60 70 60 70 70 75 80 ...
##  $ HTA_conocida: num [1:100] 0 0 0 0 0 0 0 0 0 0 ...
##  $ HTA_OMS     : num [1:100] 0 0 1 0 0 0 0 0 0 1 ...
##  $ A_DIAB      : num [1:100] 1 0 1 0 1 0 0 0 0 1 ...
##  $ ECV_B       : num [1:100] 0 0 0 0 0 0 0 0 0 0 ...
##  $ TABACO      : num [1:100] 0 0 0 0 0 0 0 0 1 0 ...
##  $ ALCOHOL     : num [1:100] 0 0 0 1 0 1 0 0 1 0 ...
##  $ STATIN      : num [1:100] 0 0 0 0 0 0 0 0 0 0 ...
##  $ CINTURA     : num [1:100] 124 99 105 77 112 96 102 93 87 126 ...
##  $ CINTURADESP : num [1:100] 119 94 100 72 107 91 97 88 82 121 ...
##  $ CADERA      : num [1:100] 136 104 99 99 100 105 107 110 98 121 ...
##  $ OBCENT_ATP  : num [1:100] 1 0 1 0 1 1 1 1 0 1 ...
##  $ COLESTEROL  : num [1:100] 219 176 245 183 233 175 239 244 209 204 ...
##  $ HDL         : num [1:100] 56 57 65 59 48 80 50 58 50 38 ...
##  $ LDL         : num [1:100] 144 95 171 116 161 83 167 166 141 116 ...
##  $ LDL_C       : chr [1:100] "140 - 160" "80 - 100" "160 - 180" "100 - 120" ...
##  $ TG          : num [1:100] 95 120 47 38 122 60 112 104 90 250 ...
##  $ CnoHDL      : num [1:100] 163 119 180 124 185 95 189 186 159 166 ...
##  $ ApoA        : num [1:100] 132 145 0 122 129 ...
##  $ ApoB        : num [1:100] 102 72 0 76 103 50 109 87 75 93 ...
##  $ LPA         : num [1:100] 5.26 11.2 2.39 8.35 3.81 32.7 6.88 24.9 7.6 8.92 ...
##  $ A1C         : num [1:100] 6.86 6.67 6.07 4.79 5.68 ...
##  $ hba1        : num [1:100] 8.4 8.5 7.4 5.9 7.3 6.1 6.4 6.5 6 6.4 ...
##  $ CREATININA  : num [1:100] 0.8 1.1 0.8 0.7 0.7 0.5 0.8 0.6 0.7 0.9 ...
##  $ GLUCB       : num [1:100] 172 156 89 75 91 59 87 113 83 91 ...
##  $ SOG         : num [1:100] 337 301 91 74 173 87 100 117 89 74 ...
##  $ Tol_Glucosa : chr [1:100] "DM" "DM" "NGT" "NGT" ...
##  $ DM          : num [1:100] 1 1 0 0 0 0 0 0 0 0 ...
##  $ conocida    : chr [1:100] "Diabetes no conocida" "Diabetes no conocida" "Normal" "Normal" ...
##  $ SM          : num [1:100] 1 1 0 0 0 0 0 0 0 1 ...
##  $ PCR         : num [1:100] 1.1 0.34 0.32 0.34 0.34 0.3 0.3 0.34 0.32 0.4 ...
##  $ INSULINEMIA : num [1:100] 32.8 4.9 4.2 8 4.6 7.9 16.1 2.6 3.9 12.1 ...
##  $ PAI_1       : num [1:100] 53.6 39.8 24.2 17.2 24.2 11.1 33.8 8.77 13.8 49 ...
##  $ fvw         : num [1:100] 129 118 46.5 23.5 111 80.7 158 142 146 105 ...
##  $ fibri       : num [1:100] 3.37 3.13 2.69 3.8 3.24 2.84 2.8 3.29 2.94 3.02 ...
##  $ HMC         : num [1:100] 9.84 9.72 12.48 10.27 13.3 ...
##  $ HOMA        : num [1:100] 13.918 1.886 0.922 1.48 1.033 ...
##  $ IR          : num [1:100] 1 0 0 0 0 0 1 0 0 1 ...
##  $ ecnos       : chr [1:100] "bb" "ab" "aa" "ab" ...
##  $ ppr         : chr [1:100] "pp" "0" "0" "pp" ...
##  $ fibratos    : chr [1:100] "No" "No" "No" "No" ...
##  $ CETP        : chr [1:100] "B1B1" "B1B2" "0" "0" ...
##  $ PON_192     : chr [1:100] "QR" "QR" "0" "QR" ...
# me muestra el tipo de dato de cada variable (numérica, carácter, etc.)
summary(Dataset) 
##        ID              EDAD           SEXO                PESO       
##  Min.   :  29.0   Min.   :30.00   Length:100         Min.   : 46.50  
##  1st Qu.: 296.8   1st Qu.:37.75   Class :character   1st Qu.: 65.15  
##  Median : 739.5   Median :44.50   Mode  :character   Median : 74.35  
##  Mean   : 726.7   Mean   :46.25                      Mean   : 75.67  
##  3rd Qu.:1080.8   3rd Qu.:53.00                      3rd Qu.: 85.00  
##  Max.   :1383.0   Max.   :79.00                      Max.   :127.00  
##      TALLA         SEDENTARIO   Escolaridad             TAS       
##  Min.   :146.0   Min.   :0.00   Length:100         Min.   : 90.0  
##  1st Qu.:157.8   1st Qu.:0.00   Class :character   1st Qu.:110.0  
##  Median :163.6   Median :1.00   Mode  :character   Median :120.0  
##  Mean   :164.2   Mean   :0.54                      Mean   :118.3  
##  3rd Qu.:170.8   3rd Qu.:1.00                      3rd Qu.:130.0  
##  Max.   :182.0   Max.   :1.00                      Max.   :160.0  
##       TAD         HTA_conocida     HTA_OMS         A_DIAB         ECV_B     
##  Min.   : 60.0   Min.   :0.00   Min.   :0.00   Min.   :0.00   Min.   :0.00  
##  1st Qu.: 70.0   1st Qu.:0.00   1st Qu.:0.00   1st Qu.:0.00   1st Qu.:0.00  
##  Median : 70.0   Median :0.00   Median :0.00   Median :0.00   Median :0.00  
##  Mean   : 72.7   Mean   :0.17   Mean   :0.24   Mean   :0.43   Mean   :0.05  
##  3rd Qu.: 80.0   3rd Qu.:0.00   3rd Qu.:0.00   3rd Qu.:1.00   3rd Qu.:0.00  
##  Max.   :100.0   Max.   :1.00   Max.   :1.00   Max.   :1.00   Max.   :1.00  
##      TABACO        ALCOHOL         STATIN        CINTURA        CINTURADESP    
##  Min.   :0.00   Min.   :0.00   Min.   :0.00   Min.   : 68.00   Min.   : 63.00  
##  1st Qu.:0.00   1st Qu.:0.00   1st Qu.:0.00   1st Qu.: 88.75   1st Qu.: 80.75  
##  Median :0.00   Median :0.00   Median :0.00   Median : 97.00   Median : 91.00  
##  Mean   :0.15   Mean   :0.31   Mean   :0.13   Mean   : 96.24   Mean   : 89.68  
##  3rd Qu.:0.00   3rd Qu.:1.00   3rd Qu.:0.00   3rd Qu.:103.00   3rd Qu.: 96.25  
##  Max.   :1.00   Max.   :1.00   Max.   :1.00   Max.   :135.00   Max.   :128.00  
##      CADERA        OBCENT_ATP     COLESTEROL         HDL        
##  Min.   : 82.0   Min.   :0.00   Min.   :117.0   Min.   : 31.00  
##  1st Qu.: 98.0   1st Qu.:0.00   1st Qu.:185.8   1st Qu.: 46.75  
##  Median :102.0   Median :1.00   Median :209.0   Median : 54.50  
##  Mean   :104.1   Mean   :0.54   Mean   :211.8   Mean   : 55.18  
##  3rd Qu.:110.2   3rd Qu.:1.00   3rd Qu.:234.8   3rd Qu.: 61.25  
##  Max.   :136.0   Max.   :1.00   Max.   :340.0   Max.   :102.00  
##       LDL           LDL_C                 TG            CnoHDL     
##  Min.   :  0.0   Length:100         Min.   : 38.0   Min.   : 58.0  
##  1st Qu.:113.8   Class :character   1st Qu.: 63.5   1st Qu.:130.5  
##  Median :131.0   Mode  :character   Median : 91.5   Median :155.5  
##  Mean   :133.0                      Mean   :116.8   Mean   :156.7  
##  3rd Qu.:153.2                      3rd Qu.:131.5   3rd Qu.:178.5  
##  Max.   :230.0                      Max.   :843.0   Max.   :283.0  
##       ApoA            ApoB             LPA             A1C        
##  Min.   :  0.0   Min.   :  0.00   Min.   : 2.39   Min.   : 4.498  
##  1st Qu.:116.6   1st Qu.: 72.00   1st Qu.: 5.52   1st Qu.: 4.991  
##  Median :129.5   Median : 82.50   Median :10.45   Median : 5.287  
##  Mean   :124.7   Mean   : 80.43   Mean   :19.69   Mean   : 5.457  
##  3rd Qu.:144.9   3rd Qu.: 95.00   3rd Qu.:26.65   3rd Qu.: 5.607  
##  Max.   :239.9   Max.   :161.00   Max.   :74.60   Max.   :10.605  
##       hba1          CREATININA        GLUCB            SOG        
##  Min.   : 5.500   Min.   :0.400   Min.   : 59.0   Min.   :  0.00  
##  1st Qu.: 6.200   1st Qu.:0.675   1st Qu.: 85.0   1st Qu.: 83.75  
##  Median : 6.600   Median :0.800   Median : 91.0   Median :100.00  
##  Mean   : 7.226   Mean   :0.784   Mean   :100.9   Mean   :107.06  
##  3rd Qu.: 7.000   3rd Qu.:0.900   3rd Qu.:105.2   3rd Qu.:124.75  
##  Max.   :53.000   Max.   :1.400   Max.   :223.0   Max.   :337.00  
##  Tol_Glucosa              DM         conocida               SM      
##  Length:100         Min.   :0.00   Length:100         Min.   :0.00  
##  Class :character   1st Qu.:0.00   Class :character   1st Qu.:0.00  
##  Mode  :character   Median :0.00   Mode  :character   Median :0.00  
##                     Mean   :0.12                      Mean   :0.36  
##                     3rd Qu.:0.00                      3rd Qu.:1.00  
##                     Max.   :1.00                      Max.   :1.00  
##       PCR          INSULINEMIA         PAI_1            fvw        
##  Min.   :0.3000   Min.   : 0.600   Min.   : 1.29   Min.   : 23.50  
##  1st Qu.:0.3200   1st Qu.: 4.700   1st Qu.:15.10   1st Qu.: 78.38  
##  Median :0.3400   Median : 6.600   Median :24.00   Median :104.50  
##  Mean   :0.4123   Mean   : 8.599   Mean   :28.07   Mean   :106.12  
##  3rd Qu.:0.3400   3rd Qu.:10.850   3rd Qu.:37.92   3rd Qu.:137.00  
##  Max.   :2.2400   Max.   :32.800   Max.   :90.30   Max.   :199.00  
##      fibri            HMC              HOMA               IR      
##  Min.   :1.670   Min.   : 2.740   Min.   : 0.1391   Min.   :0.00  
##  1st Qu.:2.835   1st Qu.: 8.947   1st Qu.: 1.0256   1st Qu.:0.00  
##  Median :3.125   Median :10.775   Median : 1.5011   Median :0.00  
##  Mean   :3.243   Mean   :11.101   Mean   : 2.3531   Mean   :0.31  
##  3rd Qu.:3.683   3rd Qu.:12.787   3rd Qu.: 2.7168   3rd Qu.:1.00  
##  Max.   :5.740   Max.   :31.850   Max.   :17.2293   Max.   :1.00  
##     ecnos               ppr              fibratos             CETP          
##  Length:100         Length:100         Length:100         Length:100        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##    PON_192         
##  Length:100        
##  Class :character  
##  Mode  :character  
##                    
##                    
## 
# Me da un resumen estadístico de las variables numéricas y conteo de valores de texto

Explicación:

La función str() me permite revisar que cada variable tenga el tipo correcto:

La función summary() me permite ver los valores mínimos, máximos, medianas y medias en las variables numéricas, y también revisar si hay datos faltantes (NA).


PASO 3: Transformación y recodificación de variables

En este paso ajusto los tipos de variable para que R las interprete correctamente. Algunas variables que están en formato numérico (0 y 1) realmente representan categorías como “Sí” y “No”, y por tanto deben recodificarlas como factores. Esto me permitirá que las tablas y gráficos me muestren nombres descriptivos y no números.

# Recodificación de variables dicotómicas (0 = No, 1 = Sí)
Dataset$SEDENTARIO <- factor(Dataset$SEDENTARIO, levels = c(0,1), labels = c("No","Sí"))
Dataset$HTA_conocida <- factor(Dataset$HTA_conocida, levels = c(0,1), labels = c("No","Sí"))
Dataset$HTA_OMS <- factor(Dataset$HTA_OMS, levels = c(0,1), labels = c("No","Sí"))
Dataset$A_DIAB <- factor(Dataset$A_DIAB, levels = c(0,1), labels = c("No","Sí"))
Dataset$ECV_B <- factor(Dataset$ECV_B, levels = c(0,1), labels = c("No","Sí"))
Dataset$TABACO <- factor(Dataset$TABACO, levels = c(0,1), labels = c("No","Sí"))
Dataset$ALCOHOL <- factor(Dataset$ALCOHOL, levels = c(0,1), labels = c("No","Sí"))
Dataset$STATIN <- factor(Dataset$STATIN, levels = c(0,1), labels = c("No","Sí"))
Dataset$IR <- factor(Dataset$IR, levels = c(0,1), labels = c("No","Sí"))
Dataset$SM <- factor(Dataset$SM, levels = c(0,1), labels = c("No","Sí"))

# Variable SEXO: convierto a factor
Dataset$SEXO <- factor(Dataset$SEXO, levels = c("Femenino","Masculino"))

# Variable Escolaridad: convertir a factor ordenado
Dataset$Escolaridad <- factor(Dataset$Escolaridad,
                              levels = c("Primaria","Secundaria","Universidad"),
                              ordered = TRUE)

## Verificación de los tipos de variables después de la recodificación
str(Dataset)
## tibble [100 × 51] (S3: tbl_df/tbl/data.frame)
##  $ ID          : num [1:100] 700 570 29 1003 994 ...
##  $ EDAD        : num [1:100] 35 69 38 30 62 30 40 57 42 35 ...
##  $ SEXO        : Factor w/ 2 levels "Femenino","Masculino": 2 1 1 2 1 2 2 2 2 1 ...
##  $ PESO        : num [1:100] 112.5 76 89.6 57.5 82 ...
##  $ TALLA       : num [1:100] 162 168 171 159 164 ...
##  $ SEDENTARIO  : Factor w/ 2 levels "No","Sí": 2 1 1 2 1 2 2 2 1 2 ...
##  $ Escolaridad : Ord.factor w/ 3 levels "Primaria"<"Secundaria"<..: 1 1 1 3 2 3 2 1 1 2 ...
##  $ TAS         : num [1:100] 125 130 120 100 130 90 120 110 125 140 ...
##  $ TAD         : num [1:100] 85 70 90 60 70 60 70 70 75 80 ...
##  $ HTA_conocida: Factor w/ 2 levels "No","Sí": 1 1 1 1 1 1 1 1 1 1 ...
##  $ HTA_OMS     : Factor w/ 2 levels "No","Sí": 1 1 2 1 1 1 1 1 1 2 ...
##  $ A_DIAB      : Factor w/ 2 levels "No","Sí": 2 1 2 1 2 1 1 1 1 2 ...
##  $ ECV_B       : Factor w/ 2 levels "No","Sí": 1 1 1 1 1 1 1 1 1 1 ...
##  $ TABACO      : Factor w/ 2 levels "No","Sí": 1 1 1 1 1 1 1 1 2 1 ...
##  $ ALCOHOL     : Factor w/ 2 levels "No","Sí": 1 1 1 2 1 2 1 1 2 1 ...
##  $ STATIN      : Factor w/ 2 levels "No","Sí": 1 1 1 1 1 1 1 1 1 1 ...
##  $ CINTURA     : num [1:100] 124 99 105 77 112 96 102 93 87 126 ...
##  $ CINTURADESP : num [1:100] 119 94 100 72 107 91 97 88 82 121 ...
##  $ CADERA      : num [1:100] 136 104 99 99 100 105 107 110 98 121 ...
##  $ OBCENT_ATP  : num [1:100] 1 0 1 0 1 1 1 1 0 1 ...
##  $ COLESTEROL  : num [1:100] 219 176 245 183 233 175 239 244 209 204 ...
##  $ HDL         : num [1:100] 56 57 65 59 48 80 50 58 50 38 ...
##  $ LDL         : num [1:100] 144 95 171 116 161 83 167 166 141 116 ...
##  $ LDL_C       : chr [1:100] "140 - 160" "80 - 100" "160 - 180" "100 - 120" ...
##  $ TG          : num [1:100] 95 120 47 38 122 60 112 104 90 250 ...
##  $ CnoHDL      : num [1:100] 163 119 180 124 185 95 189 186 159 166 ...
##  $ ApoA        : num [1:100] 132 145 0 122 129 ...
##  $ ApoB        : num [1:100] 102 72 0 76 103 50 109 87 75 93 ...
##  $ LPA         : num [1:100] 5.26 11.2 2.39 8.35 3.81 32.7 6.88 24.9 7.6 8.92 ...
##  $ A1C         : num [1:100] 6.86 6.67 6.07 4.79 5.68 ...
##  $ hba1        : num [1:100] 8.4 8.5 7.4 5.9 7.3 6.1 6.4 6.5 6 6.4 ...
##  $ CREATININA  : num [1:100] 0.8 1.1 0.8 0.7 0.7 0.5 0.8 0.6 0.7 0.9 ...
##  $ GLUCB       : num [1:100] 172 156 89 75 91 59 87 113 83 91 ...
##  $ SOG         : num [1:100] 337 301 91 74 173 87 100 117 89 74 ...
##  $ Tol_Glucosa : chr [1:100] "DM" "DM" "NGT" "NGT" ...
##  $ DM          : num [1:100] 1 1 0 0 0 0 0 0 0 0 ...
##  $ conocida    : chr [1:100] "Diabetes no conocida" "Diabetes no conocida" "Normal" "Normal" ...
##  $ SM          : Factor w/ 2 levels "No","Sí": 2 2 1 1 1 1 1 1 1 2 ...
##  $ PCR         : num [1:100] 1.1 0.34 0.32 0.34 0.34 0.3 0.3 0.34 0.32 0.4 ...
##  $ INSULINEMIA : num [1:100] 32.8 4.9 4.2 8 4.6 7.9 16.1 2.6 3.9 12.1 ...
##  $ PAI_1       : num [1:100] 53.6 39.8 24.2 17.2 24.2 11.1 33.8 8.77 13.8 49 ...
##  $ fvw         : num [1:100] 129 118 46.5 23.5 111 80.7 158 142 146 105 ...
##  $ fibri       : num [1:100] 3.37 3.13 2.69 3.8 3.24 2.84 2.8 3.29 2.94 3.02 ...
##  $ HMC         : num [1:100] 9.84 9.72 12.48 10.27 13.3 ...
##  $ HOMA        : num [1:100] 13.918 1.886 0.922 1.48 1.033 ...
##  $ IR          : Factor w/ 2 levels "No","Sí": 2 1 1 1 1 1 2 1 1 2 ...
##  $ ecnos       : chr [1:100] "bb" "ab" "aa" "ab" ...
##  $ ppr         : chr [1:100] "pp" "0" "0" "pp" ...
##  $ fibratos    : chr [1:100] "No" "No" "No" "No" ...
##  $ CETP        : chr [1:100] "B1B1" "B1B2" "0" "0" ...
##  $ PON_192     : chr [1:100] "QR" "QR" "0" "QR" ...

Explicación:

Con esta recodificación logré que las variables cualitativas se traten como factores, esto evita que R me calculara promedios en variables como Sexo o Sedentario y me permite crear tablas y gráficos con etiquetas claras (“Sí”/“No”).

Resultado que he obtenido:

Interpretación:

Esto me confirma que la base de datos está completamente lista para análisis estadístico, y a partir de aquí, R me podrá calcular correctamente las medidas descriptivas y graficar según el tipo de variable (numérica o categórica).


PASO 4: Análisis descriptivo de la variable cuantitativa “EDAD”

En este paso realizare un análisis descriptivo completo de la variable EDAD. La edad es una variable cuantitativa continua que permite describir la distribución de la población estudiada en términos de tendencia central, dispersión y forma.

Calculare medidas de tendencia central y dispersión básicas:

library(dplyr)

Dataset %>%
  summarise(
    media = mean(EDAD),
    mediana = median(EDAD),
    desviacion = sd(EDAD),
    minimo = min(EDAD),
    maximo = max(EDAD),
    rango = max(EDAD) - min(EDAD),
    IQR = IQR(EDAD)
  )

Conceptos claves para poder interpretar:

La media me representa la edad promedio del grupo.

La mediana me muestra el punto central (mitad de la distribución).

La desviación estándar me refleja cuánto se dispersan las edades respecto al promedio.

El rango me muestra la diferencia entre el valor máximo y mínimo.

El IQR (rango intercuartílico) me indica la amplitud del 50% central de los datos.

Mi interpretación de las medidas descriptivas de la variable EDAD:

La media de edad (46.2 años) representa el promedio general del grupo. Esto sugiere que la población del estudio está compuesta, en su mayoría, por adultos de mediana edad.

La mediana (44.5 años) me indica que el 50% de los participantes tiene menos de 44.5 años y el otro 50% tiene más. La cercanía entre la media y la mediana me sugiere que la distribución de la edad es aproximadamente simétrica.

La desviación estándar (11.2 años) refleja una variabilidad moderada, lo que significa que, en promedio, las edades se desvían unos 11 años del promedio, lo cual denota una población heterogénea, con presencia tanto de adultos jóvenes como mayores.

El valor mínimo (30 años) y máximo (79 años) muestran el rango etario total del grupo. El rango (49 años) cuantifica esta amplitud, confirmando que la muestra abarca adultos en diferentes etapas del ciclo vital.

El rango intercuartílico (IQR = 15.2) me indica que el 50% central de los individuos tiene edades comprendidas entre aproximadamente 37 y 52 años (Q1 y Q3), concentrando la mayor parte de los valores en torno a la mediana. En conjunto, estas medidas me describen una distribución de edad centrada en la adultez media, con dispersión moderada y sin evidencia inicial de asimetrías muy marcadas.


PASO 4B: Medidas de forma (asimetría y curtosis) y coeficiente de variación

En este paso analizaré la forma de la distribución de la variable EDAD. La asimetría (skewness) me permite identificar si la distribución se inclina hacia edades mayores o menores y la curtosis (kurtosis) evalúa si los valores están más o menos concentrados alrededor de la media. Además, calcularé el coeficiente de variación (CV) como una medida relativa de dispersión que compara la desviación estándar con la media.

library(e1071)

coef_variacion <- function(x) sd(x, na.rm = TRUE) / mean(x, na.rm = TRUE)

forma_edad <- Dataset %>%
  summarise(
    media = mean(EDAD, na.rm = TRUE),
    sd = sd(EDAD, na.rm = TRUE),
    CV = coef_variacion(EDAD),
    asimetria = skewness(EDAD, type = 3, na.rm = TRUE),
    curtosis = kurtosis(EDAD, type = 3, na.rm = TRUE)
  )
forma_edad

Interpretación de las medidas de forma y dispersión relativa:

Variable analizada: EDAD

La media (46.2 años) me representa el valor promedio de la edad en toda la muestra, siendo este valor el que me permite tener una idea general del “centro” de la distribución, por lo que en términos clínico-epidemiológicos, me indica que la población de ete estudio está compuesta principalmente por adultos de mediana edad, lo que puede ser relevante para interpretar factores de riesgo metabólicos o cardiovasculares.

La desviación estándar (DE = 11.2 años) me muestra cuánto se dispersan las edades alrededor del promedio, por lo que cuanto mayor sea la DE, más heterogénea es la población, por lo que en este caso, una DE de 11.2 me indica que la mayoría de los individuos difieren del promedio por unos 11 años aproximadamente, lo que refleja una variabilidad moderada dentro del grupo etario.

El coeficiente de variación (CV = 0.242) se calcula como la relación entre la desviación estándar y la media (sd/mean), siendo una medida de dispersión relativa, que me permite comparar la variabilidad entre diferentes variables con distintas unidades. Un CV de 24.2% significa que la dispersión de la edad representa cerca del 24% del valor medio, lo cual se considera una variabilidad moderada. Estadísticamente, un CV menor al 30% suele interpretarse como estabilidad u homogeneidad en la variable medida.

La asimetría (skewness = 0.566) indica que la distribución de edades está ligeramente sesgada hacia la derecha (asimetría positiva), esto significa que la mayoría de las personas tienen edades por debajo de la media, pero existen algunos valores más altos (personas mayores) que extienden la cola derecha del histograma, siendo un patrón típico en poblaciones adultas, donde hay más personas en edades medias que en edades avanzadas.

La curtosis (kurtosis = -0.442) evalúa el grado de “apuntamiento” o concentración de los valores en torno a la media. Un valor negativo (curtosis < 0) indica una distribución platicúrtica, es decir, más aplanada que la normal, por lo que me sugiere que las edades están más dispersas y que no existen valores extremos concentrados alrededor del promedio, por lo que la población no presenta un grupo muy dominante en una edad específica, sino una distribución amplia y más homogénea de edades dentro del rango adulto.

En conjunto, los resultados parecen que indican que la variable EDAD tiene una distribución moderadamente simétrica, con dispersión media y una ligera tendencia hacia edades mayores, pero sin valores extremos que distorsionen la media. Esta información considero que es fundamental para decidir qué pruebas estadísticas aplicar (por ejemplo, paramétricas si se confirma normalidad).


PASO 4C: Representación gráfica de la distribución de EDAD

En este paso graficaré la variable EDAD para visualizar su distribución y confirmar los resultados numéricos obtenidos en los pasos anteriores. Las gráficas me permitiran identificar visualmente si la variable presenta simetría, sesgo o valores atípicos, lo cual es importante para decidir el tipo de análisis estadístico que puediera aplicar.

Utilizaré dos tipos de gráficos complementarios:

Histograma: me muestra la frecuencia con que se repiten los valores de edad.

Boxplot o diagrama de caja: permite observar la dispersión, la mediana y posibles valores extremos (outliers).

library(ggplot2)

## ---- HISTOGRAMA DE EDAD ----
ggplot(Dataset, aes(x = EDAD)) +
  geom_histogram(
    bins = 10,                  # Número de barras o intervalos
    fill = "skyblue",           # Color de relleno
    color = "black",            # Color del borde
    alpha = 0.7                 # Transparencia
  ) +
  labs(
    title = "Distribución de la variable EDAD",
    x = "Edad (años)",
    y = "Frecuencia"
  ) +
  theme_minimal()

Interpretación del histograma:

Observo que la mayoría de los participantes se concentran entre los 35 y 55 años, con una menor frecuencia en edades más altas. La forma del histograma me coincide con la asimetría positiva encontrada en el análisis numérico (ligera cola hacia la derecha), lo que me confirma que existen algunos individuos mayores que elevan el promedio general. No evidencio valores extremos o atípicos notables, lo que refuerza la estabilidad del conjunto de datos.

## ---- BOXPLOT DE EDAD ----
ggplot(Dataset, aes(y = EDAD)) +
  geom_boxplot(
    fill = "lightgreen",
    color = "darkgreen",
    outlier.color = "red",
    outlier.shape = 8,
    outlier.size = 3
  ) +
  labs(
    title = "Diagrama de caja de la variable EDAD",
    y = "Edad (años)"
  ) +
  theme_minimal()

Interpretación del boxplot:

El diagrama muestra que la mediana de edad se sitúa cerca de los 45 años, lo cual coincide con el valor numérico que me dio en el calculo antes (mediana = 44.5). La caja (que representa el rango intercuartílico) es de tamaño moderado, lo que me indica una dispersión media en las edades centrales. La línea de la mediana no está centrada exactamente dentro de la caja, lo que refuerza el leve sesgo positivo ya identificado en los cálculos de asimetría (skewness = 0.566), es decir, una ligera inclinación hacia edades mayores.

Observo un único valor atípico leve (~79 años), que corresponde a un individuo mayor dentro del grupo, este valor no altera la tendencia general y considero que es compatible con la variabilidad esperada en una población adulta, por lo cual no representa un error o una observación anómala.

En conjunto, ambas gráficas (histograma y boxplot) me confirman que la variable EDAD presenta una distribución aproximadamente normal, con una leve asimetría hacia edades más altas, dispersión moderada y sin valores extremos significativos.


PASO 5: Tablas de frecuencia y tablas cruzadas

En este paso generaré tablas de frecuencia simples y cruzadas para las variables categóricas de interés: SEDENTARIO y ESCOLARIDAD. Las tablas de frecuencia me permiten resumir el número de observaciones por categoría, y las tablas cruzadas muestran cómo se relacionan dos variables entre sí dentro del conjunto de datos. Esto constituye la base de mi análisis descriptivo categórico en R.

library(dplyr)
library(tidyr)

## ---- TABLA DE FRECUENCIA UNIVARIADA ----
## Variable: SEDENTARIO (0 = No sedentario, 1 = Sedentario)

freq_sedentario <- Dataset %>%
  count(SEDENTARIO) %>%
  mutate(
    porcentaje = round(100 * n / sum(n), 1)
  )
freq_sedentario

Interpretación:

Esta tabla me resume la distribución del comportamiento sedentario. El número absoluto (n) indica cuántas personas son sedentarias y cuántas no. El porcentaje (%) expresa la proporción dentro del total de la muestra. Por ejemplo, si el 60% se clasifica como sedentario, esto sugiere que la mayoría de la población tiene baja actividad física, lo que podría tener implicaciones en la salud metabólica o cardiovascular.

Interpretación de la tabla de frecuencia de la variable SEDENTARIO:

Al ejecutar el código, obtuve una tabla con dos categorías:

Esto significa que, dentro de la población que he analizado, el 54% de los participantes se identificaron como sedentarios, mientras que el 46% no lo son, es decir, existe una ligera predominancia de individuos con estilo de vida sedentario.

Desde un punto de vista descriptivo y epidemiológico, este resultado considero que indica que más de la mitad de la muestra presenta un nivel bajo de actividad física, lo que podría representar un factor de riesgo relevante para enfermedades crónicas no transmisibles (como hipertensión, obesidad o diabetes tipo 2).

Estadísticamente, esta tabla resume la frecuencia absoluta (n) y la frecuencia relativa (porcentaje), mostrando cómo se distribuye la variable categórica “SEDENTARIO” en la base de datos. Este tipo de tabla me parece importante para describir el comportamiento de las variables cualitativas y constituye la base para comparaciones posteriores (por ejemplo, mediante tablas cruzadas o pruebas de independencia Chi-cuadrado).

En resumen tengo que en esta base de datos que estoy analizando:


PASO 5B: Tabla cruzada entre SEDENTARIO y ESCOLARIDAD

En este paso analizo cómo se distribuye el sedentarismo según el nivel educativo, pues esta relación me parece útil para observar posibles patrones de comportamiento o estilos de vida asociados con la escolaridad.

library(dplyr)
library(tidyr)

## Creo la tabla cruzada
tabla_cruzada <- Dataset %>%
  count(SEDENTARIO, Escolaridad) %>%
  pivot_wider(
    names_from = Escolaridad,
    values_from = n,
    values_fill = 0
  )

tabla_cruzada

Interpretación de la tabla cruzada SEDENTARIO × ESCOLARIDAD:

En esta tabla observo cómo se distribuye el sedentarismo (clasificado como “Sí” o “No”) según el nivel educativo de los participantes.

En conjunto, esta tabla me sugiere una posible relación entre el nivel educativo y el sedentarismo: a menor escolaridad, parece haber una mayor proporción de personas sedentarias. Aunque esta observación es descriptiva y no implica causalidad, pero sí aporta una pista útil para futuras hipótesis epidemiológicas o intervenciones en salud pública si se llevan a cabo.


PASO 6: Visualización gráfica del sedentarismo según escolaridad

En este paso construyo un gráfico de barras agrupadas que muestra la relación entre el nivel educativo (Escolaridad) y el comportamiento sedentario (Sí / No). Esto me permite identificar visualmente cómo se distribuye el sedentarismo entre los distintos niveles educativos.

library(ggplot2)

# Gráfico de barras agrupadas
ggplot(Dataset, aes(x = Escolaridad, fill = SEDENTARIO)) +
  geom_bar(position = "dodge", color = "black") +
  scale_fill_manual(values = c("lightblue", "salmon")) +
  labs(title = "Distribución del sedentarismo según nivel educativo",
       x = "Nivel educativo",
       y = "Frecuencia de personas",
       fill = "Sedentarismo") +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    axis.text.x = element_text(angle = 15, vjust = 1, hjust = 1)
  )

# Gráfico de barras apiladas (alternativo)
ggplot(Dataset, aes(x = Escolaridad, fill = SEDENTARIO)) +
  geom_bar(position = "fill", color = "black") +
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(values = c("lightblue", "salmon")) +
  labs(title = "Proporción de sedentarismo por nivel educativo",
       x = "Nivel educativo",
       y = "Porcentaje (%)",
       fill = "Sedentarismo") +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    axis.text.x = element_text(angle = 15, vjust = 1, hjust = 1)
  )

Interpretación de los gráficos:

1. Gráfico de barras agrupadas:

Este gráfico muestra las frecuencias absolutas de personas sedentarias (“Sí”) y no sedentarias (“No”) dentro de cada nivel educativo. Observo que las categorías con mayor número de participantes son la educación primaria y secundaria, por lo que en ambos grupos, las barras rojas (sedentarios) superan levemente a las azules (no sedentarios), me sugiere que el sedentarismo es más común entre quienes tienen menor escolaridad.

En contraste, el grupo con educación universitaria presenta la tendencia inversa, pues predominan los individuos no sedentarios, lo cual podría estar asociado a un mayor nivel de conciencia sobre la importancia del autocuidado, acceso a información en salud o mejores condiciones laborales y sociales.

Este patrón respalda la evidencia de que la educación puede aveces actuar como un determinante social que influye en los hábitos de actividad física y, por tanto, en los estilos de vida saludables.

2. Gráfico de barras apiladas (proporciones):

En esta representación relativa, observo la misma tendencia, pero expresada en términos porcentuales, por ejemplo la proporción de personas sedentarias (zona roja) es mayor en los niveles de primaria y secundaria, alcanzando más del 50%, mientras que en el grupo universitario esa proporción desciende de forma notoria. En “sin estudios”, aunque el número es bajo, casi todos los casos son sedentarios, lo cual refuerza la asociación entre menor educación y menor actividad física.

De forma integral, ambos gráficos reflejan una relación inversa entre el nivel educativo y el sedentarismo, pues a medida que aumenta la escolaridad, disminuye la proporción de personas sedentarias. Este hallazgo, aunque descriptivo, considero que tiene relevancia epidemiológica porque evidencia desigualdades sociales que podrían considerarse en programas de promoción de la salud y prevención de enfermedades crónicas no transmisibles.


Gráfico de dispersión entre Peso y Talla

Este gráfico me explora la relación entre el peso y la talla de los participantes y me permite identificar tendencias de proporcionalidad y posibles valores atípicos.

ggplot(Dataset, aes(x = PESO, y = TALLA)) +
  geom_point(color = "darkblue", size = 2) +
  labs(title = "Relación entre Peso y Talla",
       x = "Peso (kg)",
       y = "Talla (cm)") +
  theme_minimal(base_size = 13)

Interpretación del gráfico de dispersión:

Tipo de gráfico:

Este es un gráfico de dispersión (scatter plot), diseñado para representar visualmente la relación entre dos variables cuantitativas, como en este caso, el peso (kg) y la talla (cm) de los participantes. Cada punto del gráfico corresponde a un individuo en la muestra, ubicando su valor de peso en el eje X y su talla en el eje Y. Este tipo de gráfico es apropiado porque explora asociaciones lineales o patrones de tendencia entre variables continuas.

Observo una tendencia ascendente, donde los puntos se agrupan con una ligera pendiente positiva, pues a medida que aumenta la talla, también veo que tiende a aumentar el peso. Esto me sugiere una relación directamente proporcional entre ambas variables, lo que es fisiológicamente esperable dado que la estatura se asocia con una mayor masa corporal.

La nube de puntos, aunque considero que es dispersa, mantiene coherencia en el patrón, donde las personas más bajitas presentan pesos menores, mientras que los sujetos más altos tienden a concentrarse en valores de peso superiores. Además, desde una perspectiva epidemiológica, esta relación puede reflejar la variabilidad corporal dentro de una población adulta, donde el peso está determinado no solo por la talla, sino también por factores metabólicos, hábitos de vida y composición corporal.

La ausencia de puntos extremos me sugiere que no existen valores atípicos importantes, por lo que considero que es estable la distribución.

En términos descriptivos, este gráfico permite identificar que las variables son coherentes con su comportamiento esperado, sin evidencias de errores de registro o inconsistencias. Además, respalda el uso de medidas de correlación o regresión lineal en análisis posteriores si se desea cuantificar la fuerza de asociación entre peso y talla.

En síntesis: