Introducción

En esta práctica se realiza un análisis exploratorio del dataset Boston, el cual contiene información sobre características de viviendas y factores socioeconómicos en distintos lugares de Boston.

El objetivo es explorar el comportamiento de algunas variables importantes utilizando estadísticas descriptivas y diferentes tipos de gráficos como histogramas, boxplots, gráficos de dispersión y una matriz de correlación. Esto permite entender mejor la distribución de los datos y las posibles relaciones entre variables.


1. Carga de librerías y exploración del dataset

#############################################################
# Analisis exploratorio con Boston
#############################################################
library(pacman)

p_load(MASS, tidyverse, GGally, skimr)

options(scipen = 999)

# Cargar dataset
data("Boston")

# Exploración inicial
skim(Boston)
Data summary
Name Boston
Number of rows 506
Number of columns 14
_______________________
Column type frequency:
numeric 14
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
crim 0 1 3.61 8.60 0.01 0.08 0.26 3.68 88.98 ▇▁▁▁▁
zn 0 1 11.36 23.32 0.00 0.00 0.00 12.50 100.00 ▇▁▁▁▁
indus 0 1 11.14 6.86 0.46 5.19 9.69 18.10 27.74 ▇▆▁▇▁
chas 0 1 0.07 0.25 0.00 0.00 0.00 0.00 1.00 ▇▁▁▁▁
nox 0 1 0.55 0.12 0.38 0.45 0.54 0.62 0.87 ▇▇▆▅▁
rm 0 1 6.28 0.70 3.56 5.89 6.21 6.62 8.78 ▁▂▇▂▁
age 0 1 68.57 28.15 2.90 45.02 77.50 94.07 100.00 ▂▂▂▃▇
dis 0 1 3.80 2.11 1.13 2.10 3.21 5.19 12.13 ▇▅▂▁▁
rad 0 1 9.55 8.71 1.00 4.00 5.00 24.00 24.00 ▇▂▁▁▃
tax 0 1 408.24 168.54 187.00 279.00 330.00 666.00 711.00 ▇▇▃▁▇
ptratio 0 1 18.46 2.16 12.60 17.40 19.05 20.20 22.00 ▁▃▅▅▇
black 0 1 356.67 91.29 0.32 375.38 391.44 396.22 396.90 ▁▁▁▁▇
lstat 0 1 12.65 7.14 1.73 6.95 11.36 16.96 37.97 ▇▇▅▂▁
medv 0 1 22.53 9.20 5.00 17.02 21.20 25.00 50.00 ▂▇▅▁▁
head(Boston)
##      crim zn indus chas   nox    rm  age    dis rad tax ptratio  black lstat
## 1 0.00632 18  2.31    0 0.538 6.575 65.2 4.0900   1 296    15.3 396.90  4.98
## 2 0.02731  0  7.07    0 0.469 6.421 78.9 4.9671   2 242    17.8 396.90  9.14
## 3 0.02729  0  7.07    0 0.469 7.185 61.1 4.9671   2 242    17.8 392.83  4.03
## 4 0.03237  0  2.18    0 0.458 6.998 45.8 6.0622   3 222    18.7 394.63  2.94
## 5 0.06905  0  2.18    0 0.458 7.147 54.2 6.0622   3 222    18.7 396.90  5.33
## 6 0.02985  0  2.18    0 0.458 6.430 58.7 6.0622   3 222    18.7 394.12  5.21
##   medv
## 1 24.0
## 2 21.6
## 3 34.7
## 4 33.4
## 5 36.2
## 6 28.7
dim(Boston)
## [1] 506  14
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 ...
summary(Boston)
##       crim                zn             indus            chas        
##  Min.   : 0.00632   Min.   :  0.00   Min.   : 0.46   Min.   :0.00000  
##  1st Qu.: 0.08205   1st Qu.:  0.00   1st Qu.: 5.19   1st Qu.:0.00000  
##  Median : 0.25651   Median :  0.00   Median : 9.69   Median :0.00000  
##  Mean   : 3.61352   Mean   : 11.36   Mean   :11.14   Mean   :0.06917  
##  3rd Qu.: 3.67708   3rd Qu.: 12.50   3rd Qu.:18.10   3rd Qu.:0.00000  
##  Max.   :88.97620   Max.   :100.00   Max.   :27.74   Max.   :1.00000  
##       nox               rm             age              dis        
##  Min.   :0.3850   Min.   :3.561   Min.   :  2.90   Min.   : 1.130  
##  1st Qu.:0.4490   1st Qu.:5.886   1st Qu.: 45.02   1st Qu.: 2.100  
##  Median :0.5380   Median :6.208   Median : 77.50   Median : 3.207  
##  Mean   :0.5547   Mean   :6.285   Mean   : 68.57   Mean   : 3.795  
##  3rd Qu.:0.6240   3rd Qu.:6.623   3rd Qu.: 94.08   3rd Qu.: 5.188  
##  Max.   :0.8710   Max.   :8.780   Max.   :100.00   Max.   :12.127  
##       rad              tax           ptratio          black       
##  Min.   : 1.000   Min.   :187.0   Min.   :12.60   Min.   :  0.32  
##  1st Qu.: 4.000   1st Qu.:279.0   1st Qu.:17.40   1st Qu.:375.38  
##  Median : 5.000   Median :330.0   Median :19.05   Median :391.44  
##  Mean   : 9.549   Mean   :408.2   Mean   :18.46   Mean   :356.67  
##  3rd Qu.:24.000   3rd Qu.:666.0   3rd Qu.:20.20   3rd Qu.:396.23  
##  Max.   :24.000   Max.   :711.0   Max.   :22.00   Max.   :396.90  
##      lstat            medv      
##  Min.   : 1.73   Min.   : 5.00  
##  1st Qu.: 6.95   1st Qu.:17.02  
##  Median :11.36   Median :21.20  
##  Mean   :12.65   Mean   :22.53  
##  3rd Qu.:16.95   3rd Qu.:25.00  
##  Max.   :37.97   Max.   :50.00

Primero se cargaron las librerías necesarias y el dataset Boston.

Después se realizó una exploración inicial utilizando funciones como head(), dim(), str() y summary(), que permiten ver las primeras filas, el tamaño de la base de datos, la estructura de las variables y algunas estadísticas básicas.

La función skim() también ayuda a obtener una visión general rápida de las variables, mostrando estadísticas y pequeñas visualizaciones que facilitan entender la distribución de los datos.

2. Medidas descriptivas

# Variables continuas principales
variables_g1 <- c("medv","rm","lstat","crim","tax")

Boston_g1 <- Boston %>% 
  select(all_of(variables_g1))

# Media de medv
mean(Boston_g1$medv)
## [1] 22.53281
# Media de varias variables
sapply(Boston[variables_g1], mean)
##       medv         rm      lstat       crim        tax 
##  22.532806   6.284634  12.653063   3.613524 408.237154
# Desviación estándar
sapply(Boston[variables_g1], sd)
##        medv          rm       lstat        crim         tax 
##   9.1971041   0.7026171   7.1410615   8.6015451 168.5371161

En esta sección se calcularon algunas medidas descriptivas de variables importantes del dataset.

La variable medv representa el valor medio de las viviendas. También se calcularon medias y desviaciones estándar para varias variables al mismo tiempo usando sapply().

Estas estadísticas ayudan a entender el comportamiento general de los datos y la variabilidad que tiene cada variable.

3. Histogramas

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"))+
  labs(title="Histogramas de medv, rm y lstat")+
  theme_minimal()

En este gráfico se muestran histogramas de tres variables importantes: medv, rm y lstat.

Los histogramas permiten observar cómo se distribuyen los datos. En este caso se puede ver que:

  • medv se concentra en valores intermedios.
  • rm suele estar alrededor de 6 habitaciones.
  • lstat presenta mayor concentración en valores bajos.

Esto da una primera idea de cómo se comportan estas variables dentro del dataset.

4. Análisis univariante

ggplot(Boston, aes(x=medv))+
  geom_histogram(fill = "skyblue", color = "white", bins = 10)+
  ggtitle("Histograma de medv")+
  theme_minimal()

Este histograma muestra la distribución del valor medio de las viviendas (medv). Se observa que la mayoría de los valores se encuentran en un rango intermedio, aunque también existen algunos valores más altos.

ggplot(Boston, aes(x=rm))+
  geom_histogram(fill = "salmon", color = "white", bins = 15)+
  ggtitle("Histograma de rm")+
  theme_minimal()

Aquí se observa la distribución del número promedio de habitaciones (rm). La mayoría de las viviendas tienen alrededor de 5 a 7 habitaciones, lo cual parece ser el tamaño típico de las casas en este conjunto de datos.

ggplot(Boston, aes(x=lstat))+
  geom_histogram(fill = "lightgreen", color = "white", bins = 23)+
  ggtitle("Histograma de lstat")+
  theme_minimal()

La variable lstat representa el porcentaje de población con bajo estatus socioeconómico. La mayoría de los valores son relativamente bajos, aunque hay algunos barrios con porcentajes más altos.

5. Boxplot

Boston %>% 
  pivot_longer(cols = everything(),
               names_to = "variable",
               values_to = "valor") %>% 
  ggplot(aes(x= variable, y = valor, fill = variable))+
  geom_boxplot()+
  scale_fill_brewer(palette = "Set2")+
  ggtitle("Boxplot de variables")+
  theme_minimal()
## Warning in RColorBrewer::brewer.pal(n, pal): n too large, allowed maximum for palette Set2 is 8
## Returning the palette you asked for with that many colors

El boxplot permite observar la dispersión de las variables y detectar posibles valores atípicos (outliers).

En este caso se puede ver que algunas variables tienen mayor variabilidad que otras y también aparecen algunos valores extremos.

6. Relación entre variables

Boston %>% 
  select(medv, rm, lstat, crim, tax) %>% 
  pivot_longer(cols = c(rm, lstat, crim, tax),
               names_to = "variable",
               values_to = "valor") %>% 
  ggplot(aes(x = valor, y = medv, color = variable)) +
  geom_point() +
  facet_wrap(~variable, scales = "free_x") +
  ggtitle("Relación de medv",
          subtitle = "Gráficos por faceta") +
  theme_minimal()

En estos gráficos se intenta observar cómo se relaciona medv con otras variables del dataset.

Por ejemplo, se puede notar que el número de habitaciones (rm) parece estar relacionado con valores más altos de vivienda, mientras que variables como lstat o crim podrían relacionarse con valores más bajos.

7. Análisis bivariante

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

Este gráfico muestra la relación entre la tasa de criminalidad (crim) y el valor medio de las viviendas (medv).

Se utiliza una escala logarítmica porque la variable crim tiene valores muy dispersos. En general se observa que zonas con mayor criminalidad tienden a tener valores de vivienda más bajos.

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

Aquí se analiza la relación entre el nivel de impuestos (tax) y el valor medio de las viviendas. No se observa una relación tan clara como con otras variables, aunque sí existe cierta variación en los valores.

8. Matriz de correlación

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

La matriz de correlación permite observar las relaciones entre varias variables al mismo tiempo.

En este caso se puede notar que:

  • rm tiene una relación positiva con medv.
  • lstat tiene una relación negativa con medv.

Esto sugiere que el número de habitaciones puede influir positivamente en el valor de las viviendas, mientras que un mayor porcentaje de población de bajo estatus podría estar asociado con valores más bajos.

Conclusiones

A partir del análisis exploratorio se pudo observar el comportamiento de diferentes variables del dataset Boston.

Las visualizaciones permitieron identificar la distribución de los datos y algunas relaciones importantes entre variables. En particular, el número de habitaciones parece estar relacionado con valores más altos de vivienda, mientras que factores como la criminalidad o el estatus socioeconómico pueden influir negativamente.

Este tipo de análisis es útil como primer paso antes de aplicar modelos estadísticos más complejos, ya que permite comprender mejor la estructura y características de los datos.