Paso 1. Se cargan las librerías

library(MASS)
library(pacman)
p_load(MASS, tidyverse, GGally, skimr, knitr)
options(scipen = 999)

Paso 2. Se carga el dataset

data("Boston")

Función skim

El objetivo de este paso es obtener una visión general y estructurada del conjunto de datos, esto nos permitirá confirmar las dimensiones de la tabla, identificar los tipos de variables presentes (numéricas, categóricas, etc.), detectar rápidamente si existen valores faltantes (missing values) y observar la distribución estadística básica de cada variable a través de sus minigráficos.

kable(skim(Boston))
skim_type skim_variable n_missing complete_rate numeric.mean numeric.sd numeric.p0 numeric.p25 numeric.p50 numeric.p75 numeric.p100 numeric.hist
numeric crim 0 1 3.6135236 8.6015451 0.00632 0.082045 0.25651 3.677083 88.9762 ▇▁▁▁▁
numeric zn 0 1 11.3636364 23.3224530 0.00000 0.000000 0.00000 12.500000 100.0000 ▇▁▁▁▁
numeric indus 0 1 11.1367787 6.8603529 0.46000 5.190000 9.69000 18.100000 27.7400 ▇▆▁▇▁
numeric chas 0 1 0.0691700 0.2539940 0.00000 0.000000 0.00000 0.000000 1.0000 ▇▁▁▁▁
numeric nox 0 1 0.5546951 0.1158777 0.38500 0.449000 0.53800 0.624000 0.8710 ▇▇▆▅▁
numeric rm 0 1 6.2846344 0.7026171 3.56100 5.885500 6.20850 6.623500 8.7800 ▁▂▇▂▁
numeric age 0 1 68.5749012 28.1488614 2.90000 45.025000 77.50000 94.075000 100.0000 ▂▂▂▃▇
numeric dis 0 1 3.7950427 2.1057101 1.12960 2.100175 3.20745 5.188425 12.1265 ▇▅▂▁▁
numeric rad 0 1 9.5494071 8.7072594 1.00000 4.000000 5.00000 24.000000 24.0000 ▇▂▁▁▃
numeric tax 0 1 408.2371542 168.5371161 187.00000 279.000000 330.00000 666.000000 711.0000 ▇▇▃▁▇
numeric ptratio 0 1 18.4555336 2.1649455 12.60000 17.400000 19.05000 20.200000 22.0000 ▁▃▅▅▇
numeric black 0 1 356.6740316 91.2948644 0.32000 375.377500 391.44000 396.225000 396.9000 ▁▁▁▁▇
numeric lstat 0 1 12.6530632 7.1410615 1.73000 6.950000 11.36000 16.955000 37.9700 ▇▇▅▂▁
numeric medv 0 1 22.5328063 9.1971041 5.00000 17.025000 21.20000 25.000000 50.0000 ▂▇▅▁▁

Función head

El objetivo de esta instrucción es extraer e imprimir las primeras observaciones de la tabla.

kable(head(Boston))
crim zn indus chas nox rm age dis rad tax ptratio black lstat medv
0.00632 18 2.31 0 0.538 6.575 65.2 4.0900 1 296 15.3 396.90 4.98 24.0
0.02731 0 7.07 0 0.469 6.421 78.9 4.9671 2 242 17.8 396.90 9.14 21.6
0.02729 0 7.07 0 0.469 7.185 61.1 4.9671 2 242 17.8 392.83 4.03 34.7
0.03237 0 2.18 0 0.458 6.998 45.8 6.0622 3 222 18.7 394.63 2.94 33.4
0.06905 0 2.18 0 0.458 7.147 54.2 6.0622 3 222 18.7 396.90 5.33 36.2
0.02985 0 2.18 0 0.458 6.430 58.7 6.0622 3 222 18.7 394.12 5.21 28.7

Función dim

Se utiliza esta función para conocer el tamaño exacto y la escala de nuestra base de datos.

dim(Boston)
## [1] 506  14

Función str

Su propósito principal es listar todas las variables presentes, verificar los tipos de datos asignados a cada una de ellas

str(Boston)
## 'data.frame':    506 obs. of  14 variables:
##  $ crim   : num  0.00632 0.02731 0.02729 0.03237 0.06905 ...
##  $ zn     : num  18 0 0 0 0 0 12.5 12.5 12.5 12.5 ...
##  $ indus  : num  2.31 7.07 7.07 2.18 2.18 2.18 7.87 7.87 7.87 7.87 ...
##  $ chas   : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ nox    : num  0.538 0.469 0.469 0.458 0.458 0.458 0.524 0.524 0.524 0.524 ...
##  $ rm     : num  6.58 6.42 7.18 7 7.15 ...
##  $ age    : num  65.2 78.9 61.1 45.8 54.2 58.7 66.6 96.1 100 85.9 ...
##  $ dis    : num  4.09 4.97 4.97 6.06 6.06 ...
##  $ rad    : int  1 2 2 3 3 3 5 5 5 5 ...
##  $ tax    : num  296 242 242 222 222 222 311 311 311 311 ...
##  $ ptratio: num  15.3 17.8 17.8 18.7 18.7 18.7 15.2 15.2 15.2 15.2 ...
##  $ black  : num  397 397 393 395 397 ...
##  $ lstat  : num  4.98 9.14 4.03 2.94 5.33 ...
##  $ medv   : num  24 21.6 34.7 33.4 36.2 28.7 22.9 27.1 16.5 18.9 ...

Función summary

Esta herramienta calcula las principales medidas descriptivas para cada variable del conjunto de datos. En el caso de las variables numéricas, nos proporciona un resumen de cinco números más la media: el valor mínimo, el primer cuartil (Q1), la mediana, la media aritmética, el tercer cuartil (Q3) y el valor máximo.

kable(summary(Boston))
crim zn indus chas nox rm age dis rad tax ptratio black lstat medv
Min. : 0.00632 Min. : 0.00 Min. : 0.46 Min. :0.00000 Min. :0.3850 Min. :3.561 Min. : 2.90 Min. : 1.130 Min. : 1.000 Min. :187.0 Min. :12.60 Min. : 0.32 Min. : 1.73 Min. : 5.00
1st Qu.: 0.08205 1st Qu.: 0.00 1st Qu.: 5.19 1st Qu.:0.00000 1st Qu.:0.4490 1st Qu.:5.886 1st Qu.: 45.02 1st Qu.: 2.100 1st Qu.: 4.000 1st Qu.:279.0 1st Qu.:17.40 1st Qu.:375.38 1st Qu.: 6.95 1st Qu.:17.02
Median : 0.25651 Median : 0.00 Median : 9.69 Median :0.00000 Median :0.5380 Median :6.208 Median : 77.50 Median : 3.207 Median : 5.000 Median :330.0 Median :19.05 Median :391.44 Median :11.36 Median :21.20
Mean : 3.61352 Mean : 11.36 Mean :11.14 Mean :0.06917 Mean :0.5547 Mean :6.285 Mean : 68.57 Mean : 3.795 Mean : 9.549 Mean :408.2 Mean :18.46 Mean :356.67 Mean :12.65 Mean :22.53
3rd Qu.: 3.67708 3rd Qu.: 12.50 3rd Qu.:18.10 3rd Qu.:0.00000 3rd Qu.:0.6240 3rd Qu.:6.623 3rd Qu.: 94.08 3rd Qu.: 5.188 3rd Qu.:24.000 3rd Qu.:666.0 3rd Qu.:20.20 3rd Qu.:396.23 3rd Qu.:16.95 3rd Qu.:25.00
Max. :88.97620 Max. :100.00 Max. :27.74 Max. :1.00000 Max. :0.8710 Max. :8.780 Max. :100.00 Max. :12.127 Max. :24.000 Max. :711.0 Max. :22.00 Max. :396.90 Max. :37.97 Max. :50.00

Paso 3. Medidas descriptivas

Variables continuas clave

Se define un vector de caracteres, este objeto almacena los nombres de las cinco variables de interés

variables_g1 <- c("medv", "rm", "lstat", "crim", "tax")

Se crea un nuevo subconjunto de datos este únicamente tiene las columnas especificadas en el paso anterior.

Boston_g1 <- Boston %>% select(all_of(variables_g1))
kable(head(Boston_g1))
medv rm lstat crim tax
24.0 6.575 4.98 0.00632 296
21.6 6.421 9.14 0.02731 242
34.7 7.185 4.03 0.02729 242
33.4 6.998 2.94 0.03237 222
36.2 7.147 5.33 0.06905 222
28.7 6.430 5.21 0.02985 222

Media de una y varias variables

Se calcula el promedio aritmético de una variable individual.

mean(Boston_g1$medv)
## [1] 22.53281

Esta instrucción toma las cinco columnas de interés y les aplica la función mean (promedio) a todas simultáneamente.

kable(sapply(Boston[variables_g1], mean))
x
medv 22.532806
rm 6.284634
lstat 12.653063
crim 3.613524
tax 408.237154

Desviación estándar

Siguiendo la misma lógica de programación del paso anterior, se procede a evaluar la dispersión de los datos.

kable(sapply(Boston[variables_g1], sd))
x
medv 9.1971041
rm 0.7026171
lstat 7.1410615
crim 8.6015451
tax 168.5371161

Paso 4. Histogramas

En esta sección, el objetivo es visualizar el comportamiento individual de las tres variables más relevantes del estudio: medv, rm y lstat. Para lograr una comparación visual eficiente en un solo bloque, se reestructuran los datos al formato largo (long format) y se utiliza la gramática de gráficos de ggplot2. El uso de paneles múltiples (faceting) con escalas independientes en el eje horizontal nos permite observar la frecuencia y concentración de los datos de cada característica sin que pierdan la perspectiva de sus propias unidades de medida.


Histograma de medv, rm y lstat

Boston %>% 
  select(medv, rm, lstat) %>% 
  pivot_longer(cols = everything(),
               names_to = "variable",
               values_to = "valor") %>% 
  ggplot(aes(x = valor, fill = variable)) +
  geom_histogram(color = "white", bins = 15) +
  facet_wrap(~variable, scales = "free_x") +
  scale_fill_manual(values = c(medv = "skyblue", rm = "salmon",
                               lstat = "lightgreen")) +
  theme_minimal()


Histograma de lstat

ggplot(Boston, aes(x = lstat)) +
  geom_histogram(fill = "lightgreen", color = "white", bins = 15) +
  theme_minimal()


Histograma de medv

ggplot(Boston, aes(x = medv)) +
  geom_histogram(fill = "skyblue", color = "white", bins = 23) +
  theme_minimal()


Histograma de rm

ggplot(Boston, aes(x = rm)) +
  geom_histogram(fill = "salmon", color = "white", bins = 23) +
  theme_minimal()


Interpretación

  • Habitaciones (rm): El gráfico nos muestra una tendencia central muy clara. Esto indica que la oferta inmobiliaria es bastante estándar, con la gran mayoría de las viviendas ofreciendo entre 6 y 7 habitaciones en promedio.

  • Población vulnerable (lstat): La gráfica se concentra fuertemente a la izquierda. Esto refleja que la mayor parte de los vecindarios analizados tienen un bajo porcentaje de población con estatus socioeconómico menor.

  • Valor de la vivienda (medv): La distribución de los precios tiene su volumen principal en torno a los 20,000 y 25,000, sin embargo, el salto abrupto o ‘pico’ en el extremo derecho de la gráfica (exactamente en 50,000) sugiere que los precios fueron ‘topados’ artificialmente durante la recolección de los datos, registrando cualquier casa más cara que eso simplemente como $50,000.


Paso 5. Boxplots

Se procede a evaluar la dispersión y la presencia de valores atípicos (outliers) mediante diagramas de caja (boxplots).


Boxplot de medv y lstat

Boston %>% 
  select(medv, lstat) %>% 
  pivot_longer(cols = everything(),
               names_to = "variable",
               values_to = "valor") %>% 
  ggplot(aes(x = valor, y = valor, fill = variable)) +
  geom_boxplot() +
  scale_fill_brewer(palette = "Set2") +  
  theme_minimal()


Boxplot de medv

ggplot(Boston, aes(y = medv)) +
  geom_boxplot(fill = "red") +
  theme_minimal()


Boxplot de rm

ggplot(Boston, aes(y = rm)) +
  geom_boxplot(fill = "blue") +
  theme_minimal()


Boxplot de lstat

ggplot(Boston, aes(y = lstat)) +
  geom_boxplot(fill = "green") +
  theme_minimal()


Interpretación

  • Valor de la vivienda (medv): El boxplot naranja nos muestra que el 50% central de los precios medianos fluctúa aproximadamente entre los 17,000 y 25,000, con una mediana cercana a los 21,000 (línea horizontal central), la gran cantidad de puntos negros por encima confirma la presencia de múltiples valores atípicos altos, reiterando que existen vecindarios exclusivos
  • Habitaciones (rm): Revela una distribución concentrada en su zona central, que representa el 50% de las observaciones centrales, es bastante estrecha y abarca aproximadamente desde las 5.9 hasta las 6.6 habitaciones, la línea central gruesa nos indica que la mediana se ubica claramente en torno a las 6.2 habitaciones, la presencia de valores atípicos, en el extremo inferior, llegando a registrar viviendas con un promedio cercano a las 3.5 habitaciones, por otro lado, en el extremo superior, se detectan residencias atípicamente grandes que alcanzan casi las 9 habitaciones.
  • Población vulnerable (lstat): El boxplot verde revela que la mitad de los vecindarios tienen entre un 7% y un 17% de población de menor estatus socioeconómico, con una mediana rondando el 11%, se observan valores atípicos en el extremo superior (por encima del 30%), indicando que existen focos aislados en la ciudad con niveles de vulnerabilidad excepcionalmente altos.

Paso 6. Gráfico de dispersión

Se procede a graficar múltiples diagramas de dispersión, utilizando la técnica de paneles cruzados (faceting), se evalúa simultáneamente la relación de nuestra variable dependiente (medv) frente a cuatro variables independientes


Relación de medv

Boston %>% 
  select(medv, rm, lstat, crim, tax) %>% 
  pivot_longer(cols = -medv,
               names_to = "variable",
               values_to = "valor") %>% 
  ggplot(aes(x = valor, y = medv, color = variable)) +
  geom_point() +
  facet_wrap(~variable, scales = "free_x") +
  scale_fill_brewer(palette = "Set2") +  
  scale_color_manual(values = c(rm = "blue", lstat = "red", crim = "purple", tax = "orange")) +
  theme_minimal()


Medv vs lstat

ggplot(Boston, aes(x = lstat, y = medv)) +
    geom_point(color = "red") +
    theme_minimal()


Medv vs crim(escala log)

ggplot(Boston, aes(x = crim, y = medv)) +
  scale_x_log10() +
  geom_point(color = "purple") +
  theme_minimal()


Medv vs tax

ggplot(Boston, aes(x = tax, y = medv)) +
  geom_point(color = "orange") +
  theme_minimal()


Interpretación

  • Habitaciones (rm): Muestra la relación lineal positiva, se observa una tendencia diagonal ascendente casi perfecta, confirmando que a mayor cantidad de cuartos, el valor de la vivienda aumenta de manera constante y proporcional.

  • Población vulnerable (lstat): Una fuerte correlación negativa, pero con una forma no lineal (ligeramente curva o exponencial), los precios caen drásticamente en los primeros niveles de vulnerabilidad, y luego la caída se suaviza conforme el porcentaje de pobreza es muy alto.

  • Criminalidad (crim): Presenta una distribución en forma de L, observamos que las propiedades de alto valor solo existen en zonas donde el crimen es prácticamente cero, a medida que el índice de criminalidad aumenta mínimamente, los precios se desploman y se mantienen en el rango más bajo.

  • Impuestos (tax): No muestra una tendencia lineal típica, sino más bien agrupaciones, destaca especialmente una línea vertical densa en el extremo derecho, todas las viviendas sujetas a este nivel de impuestos particular tienen precios sistemáticamente bajos, lo cual sugiere que pertenecen a un sector geográfico o industrial muy específico con características propias.


Paso 7. Matriz de correlación visual

El siguiente paso es cuantificar su comportamiento general. Para ello, se calculan dos métricas estadísticas fundamentales: la media aritmética, para entender la tendencia central de cada característica, y la desviación estándar, para evaluar el grado de dispersión o variabilidad de los datos respecto a dicho promedio.

ggpairs(Boston[, c("medv", "rm", "lstat")])


Interpretación

Las métricas calculadas revelan contrastes interesantes en la variabilidad de las distintas características:

  • Por un lado, la cantidad de habitaciones (rm) presenta un promedio de 6.28 y una desviación estándar muy baja (0.70); esto nos indica que el tamaño de las viviendas es sumamente uniforme en casi todos los vecindarios.

  • En contraste, la tasa de criminalidad (crim) muestra un comportamiento muy distinto: su desviación estándar (8.60) es más del doble de su propia media (3.61), esta altísima dispersión es un claro indicador de que la criminalidad no está distribuida de manera uniforme en la ciudad, sugiriendo la existencia de zonas específicas con índices de delincuencia extremadamente altos que sesgan el promedio general.