#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.