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.
#############################################################
# 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 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.
# 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.
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:
Estas visualizaciones permiten identificar la forma general de la distribución de cada variable.
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.
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.
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.
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.
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:
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.
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.