#Cargar paquetes
library(MASS)
library(dplyr)
##
## Adjuntando el paquete: 'dplyr'
## The following object is masked from 'package:MASS':
##
## select
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(tidyr)
library(ggplot2)
library(GGally)
# Cargar base Boston
data("Boston")
# Exploración inicial
head(Boston) # primeras filas
## 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) # dimensiones
## [1] 506 14
str(Boston) # estructura
## '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) # resumen estadístico
## 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
La base Boston contiene información sobre viviendas en distintos barrios de Boston. Con estas funciones iniciales podemos ver su tamaño, estructura y un resumen de las variables. skim es útil porque además de estadísticas básicas, muestra visualizaciones rápidas que ayudan a detectar la forma de la distribución de cada variable.
#-------------------------------------------------------------
# 2- Medidas descriptivas
#-------------------------------------------------------------
variables_g1 <- c("medv","rm","lstat","crim","tax")
Boston_g1 <- Boston %>% select(all_of(variables_g1))
mean(Boston_g1$medv)
## [1] 22.53281
sapply(Boston[variables_g1], mean)
## medv rm lstat crim tax
## 22.532806 6.284634 12.653063 3.613524 408.237154
sapply(Boston[variables_g1], sd)
## medv rm lstat crim tax
## 9.1971041 0.7026171 7.1410615 8.6015451 168.5371161
Aquí calculamos medidas descriptivas de variables clave. La media de medv nos da el valor promedio de las viviendas, mientras que sapply permite obtener medias y desviaciones estándar de varias columnas a la vez. Esto ayuda a comparar rápidamente la escala y variabilidad de cada variable.
#-------------------------------------------------------------
# 2- 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()
Estos histogramas muestran la distribución de tres variables
importantes:
medv: el valor medio de las viviendas, con una concentración clara en valores intermedios.
rm: número de habitaciones promedio, que tiende a concentrarse entre 5 y 7.
lstat: porcentaje de población con bajo estatus socioeconómico, que se concentra en valores bajos pero con una cola hacia la derecha.
La visualización conjunta permite comparar cómo se distribuyen estas variables y detectar patrones iniciales.Este gráfico muestra la distribución de tres variables clave.
medv tiene una distribución sesgada a la izquierda, con muchas viviendas en el rango de 20 a 25 mil dólares, pero también algunas con valores mucho más altos.
rm presenta una forma aproximadamente normal, centrada en 6 habitaciones, lo que sugiere que la mayoría de las viviendas tienen entre 5 y 7 cuartos.
lstat tiene una distribución sesgada a la derecha, indicando que la mayoría de los barrios tienen bajo porcentaje de población con estatus socioeconómico bajo, pero hay algunos con valores extremos.
ggplot(Boston, aes(x=medv))+
geom_histogram(fill = "skyblue", color = "white", bins = 10)+
ggtitle("Histograma de medv")+
theme_minimal()
La variable medv muestra una concentración de valores entre 20 y 25, con
una cola hacia la derecha. Esto indica que la mayoría de las viviendas
tienen precios medios, pero existen algunas con valores
significativamente más altos.
ggplot(Boston, aes(x=rm))+
geom_histogram(fill = "salmon", color = "white", bins = 15)+
ggtitle("Histograma de rm")+
theme_minimal()
La variable rm tiene una distribución centrada en 6 habitaciones, lo que
sugiere que la mayoría de las viviendas tienen entre 5 y 7 cuartos. Esto
puede reflejar el tamaño típico de las casas en Boston.
ggplot(Boston, aes(x=lstat))+
geom_histogram(fill = "lightgreen", color = "white", bins = 23)+
ggtitle("Histograma de lstat")+
theme_minimal()
ELa variable lstat muestra una distribución sesgada a la derecha, lo que
indica que la mayoría de los barrios tienen bajo porcentaje de población
con estatus socioeconómico bajo, aunque hay algunos con valores muy
elevados.
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 medv y lstat")+
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
Este boxplot permite visualizar la dispersión y los valores
atípicos.
En medv, se observan valores extremos hacia arriba, indicando barrios con viviendas mucho más caras.
En lstat, hay una gran dispersión, lo que sugiere desigualdad entre barrios en cuanto al estatus socioeconómico.
Boston %>%
select(medv,rm,lstat,crim,tax) %>%
pivot_longer(cols = medv,
names_to = "variable",
values_to = "valor") %>%
ggplot( aes(x = valor,y = variable, fill = variable))+
geom_point()+
facet_wrap(~variable, scales = "free_x")+
scale_fill_brewer(palette = "Set2")+
scale_fill_manual(values = c(rm = "blue", crim = "salmon", lstat = "pink", tax = "orange"))+
ggtitle("Relacion de medv", subtitle = "Graficos por faceta")+
theme_minimal()
## Scale for fill is already present.
## Adding another scale for fill, which will replace the existing scale.
## Warning: No shared levels found between `names(values)` of the manual scale and the
## data's fill values.
## No shared levels found between `names(values)` of the manual scale and the
## data's fill values.
Aquí se muestran relaciones bivariantes entre medv y otras variables. Se
observa que:
A mayor número de habitaciones (rm), el valor medio de las viviendas tiende a ser más alto.
Con mayor porcentaje de población de bajo estatus (lstat), el valor medio disminuye.
Variables como crim y tax también muestran relaciones, aunque menos claras.
Esto sugiere que tanto características físicas como socioeconómicas influyen en el precio de las viviendas.
ggplot(Boston, aes(x=crim,y=medv))+
geom_point(color = "purple")+
scale_x_log10()+
ggtitle("medv vs crim (escala log)")+
theme_minimal()
La relación entre crim (tasa de criminalidad) y medv muestra que en
barrios con alta criminalidad los valores de vivienda tienden a ser más
bajos. Al aplicar escala logarítmica en el eje X se facilita la
interpretación, ya que la variable crim tiene una distribución muy
sesgada.
ggplot(Boston, aes(x=tax,y=medv))+
geom_point(color = "orange")+
ggtitle("tax vs crim (escala log)")+
theme_minimal()
En este gráfico se observa cómo el nivel de impuestos (tax) se relaciona
con el valor medio de las viviendas. Aunque la relación no es tan fuerte
como con rm o lstat, se aprecia que en barrios con impuestos más altos
los valores de vivienda tienden a variar más.
#-------------------------------------------------------------
# Matriz de correlación visual
#-------------------------------------------------------------
ggpairs(Boston[, c("medv","rm","lstat")])
La matriz de correlación visual muestra cómo se relacionan entre sí
medv, rm y lstat. Se confirma que:
rm está positivamente correlacionada con medv.
lstat está negativamente correlacionada con medv.
Estas relaciones son consistentes con lo que vimos en los gráficos anteriores y refuerzan la idea de que el número de habitaciones y el estatus socioeconómico son factores clave en el precio de las viviendas.