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.
#############################################################
# Analisis exploratorio con Boston
#############################################################
library(pacman)
p_load(MASS, tidyverse, GGally, skimr)
options(scipen = 999)
# Cargar dataset
data("Boston")
# Exploración inicial
skim(Boston)
| 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.
# 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.
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:
Esto da una primera idea de cómo se comportan estas variables dentro del dataset.
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.
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.
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.
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.
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:
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.
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.