Introducción

En esta práctica se realiza un análisis exploratorio del conjunto de datos Boston, el cual incluye información sobre características de viviendas y factores sociales y económicos en diferentes zonas de la ciudad de Boston. El objetivo del análisis es conocer el comportamiento de algunas variables relevantes mediante estadísticas descriptivas y visualizaciones como histogramas, diagramas de caja, gráficos de dispersión y una matriz de correlación. Este tipo de exploración permite identificar patrones, variabilidad en los datos y 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 para realizar el análisis y se importó el dataset Boston.

Posteriormente se utilizó un conjunto de funciones para explorar la estructura de la base de datos. Por ejemplo, head() permite visualizar las primeras observaciones, dim() muestra el número de filas y columnas, mientras que str() permite identificar el tipo de cada variable.

Además, la función summary() proporciona un resumen estadístico básico de todas las variables. Por su parte, skim() ofrece una visión general más completa, incluyendo estadísticas descriptivas y pequeñas visualizaciones que ayudan a 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 estadísticas básicas para ciertas variables continuas del dataset, como medv, rm, lstat, crim y tax.

La variable medv representa el valor medio de las viviendas en cada zona. Para obtener una visión general de los datos se calcularon las medias y desviaciones estándar de estas variables utilizando la función sapply().

Estas medidas permiten identificar el nivel promedio de cada variable y el grado de dispersión de los datos, lo que ayuda a comprender mejor su comportamiento general dentro del conjunto de datos.

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 apartado se construyeron histogramas para las variables medv, rm y lstat.

Los histogramas son útiles para observar cómo se distribuyen los valores de cada variable. A partir de estos gráficos se puede notar que:

  • medv presenta una mayor concentración en valores intermedios.
  • rm muestra que la mayoría de las viviendas tienen aproximadamente entre 5 y 7 habitaciones.
  • lstat tiende a concentrarse en valores bajos, aunque existen algunos casos con valores más elevados.

Estas visualizaciones permiten identificar la forma general de la distribución de cada variable.

4. Análisis univariante

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

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

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

En esta parte se analizaron individualmente algunas variables mediante histogramas.

El gráfico de medv permite observar cómo se distribuye el valor promedio de las viviendas. La mayoría de los valores se encuentran dentro de un rango intermedio, aunque también existen algunos valores extremos.

En el caso de rm, la distribución indica que el número promedio de habitaciones suele situarse cerca de 6, lo cual podría representar el tamaño típico de las viviendas en el conjunto de datos.

Por otro lado, la variable lstat, que representa el porcentaje de población con bajo estatus socioeconómico, presenta mayor concentración en valores pequeños, aunque también existen zonas con porcentajes considerablemente 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

Para complementar el análisis se utilizó un boxplot que permite observar la dispersión de las variables y detectar posibles valores atípicos.

Este tipo de gráfico muestra la mediana, los cuartiles y los valores extremos de cada variable. A partir del boxplot se puede notar que algunas variables presentan mayor variabilidad que otras y que existen algunos valores que se alejan del comportamiento general del conjunto de datos.

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 esta sección se analizaron las relaciones entre el valor medio de las viviendas (medv) y otras variables relevantes del dataset.

Mediante gráficos de dispersión se puede observar cómo cambia el valor de medv en función de variables como el número de habitaciones (rm), el porcentaje de población de bajo estatus (lstat), la tasa de criminalidad (crim) y el nivel de impuestos (tax).

Los gráficos sugieren que algunas de estas variables podrían tener una relación con el valor de las viviendas. Por ejemplo, un mayor número de habitaciones parece asociarse con valores de vivienda más altos, mientras que niveles elevados de criminalidad o mayor proporción de población de bajo estatus 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()

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

En este apartado se analizaron de manera más específica las relaciones entre algunas variables.

El gráfico entre crim y medv muestra que, en general, los barrios con mayor tasa de criminalidad tienden a presentar valores de vivienda más bajos. Para facilitar la visualización se utilizó una escala logarítmica en el eje de criminalidad, ya que esta variable presenta valores muy dispersos.

También se analizó la relación entre tax y medv. Aunque la relación no parece ser tan clara como en otras variables, se puede observar cierta variación en los valores de vivienda conforme cambian los niveles de impuestos.

8. Matriz de correlación

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

Finalmente, se utilizó una matriz de correlación visual para analizar la relación entre medv, rm y lstat.

Esta visualización permite observar simultáneamente las distribuciones de cada variable y las relaciones entre ellas. Los resultados muestran que:

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

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

Conclusiones

El análisis exploratorio del dataset Boston permitió comprender mejor la estructura y comportamiento de varias de sus variables.

Las diferentes visualizaciones ayudaron a identificar patrones en la distribución de los datos y posibles relaciones entre variables. En particular, se observó que factores como el número de habitaciones, la tasa de criminalidad y el nivel socioeconómico de la población pueden estar relacionados con el valor medio de las viviendas.

Este tipo de análisis constituye un paso importante antes de aplicar modelos estadísticos más avanzados, ya que permite conocer mejor las características del conjunto de datos.