#Cargar paquetes
library(pacman) # paquete que permite cargar e instalar otros paquetes automáticamente
## Warning: package 'pacman' was built under R version 4.5.2
p_load(MASS, tidyverse, GGally, skimr) # carga varios paquetes usados para análisis y visualización
options(scipen=999) # evita notación científica en los números
#-----------------------------------------
#1. Cargar y explorar el dataset
#-----------------------------------------
data("Boston") # carga el dataset Boston incluido en el paquete MASS
skim(Boston) # muestra un resumen exploratorio detallado de todas las variables
Data summary
| Name |
Boston |
| Number of rows |
506 |
| Number of columns |
14 |
| _______________________ |
|
| Column type frequency: |
|
| numeric |
14 |
| ________________________ |
|
| Group variables |
None |
Variable type: numeric
| 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) # muestra las primeras filas del dataset
## 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) # muestra número de filas y columnas
## [1] 506 14
str(Boston) # muestra la estructura de las variables (tipo de dato)
## '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 básico de cada variable
## 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
#-----------------------------------------
#2. Medidas descriptivas
#-----------------------------------------
#Variables continuas clave
variables_g1 <- c("medv", "rm", "lstat", "crim", "tax") # vector con las variables de interés
Boston_g1 <- Boston %>% select(all_of(variables_g1)) # crea un subconjunto del dataset con esas variables
#Media y desv estandar
mean(Boston_g1$medv) # calcula la media de la variable medv
## [1] 22.53281
sapply(Boston[variables_g1], mean) # calcula la media para cada variable seleccionada
## medv rm lstat crim tax
## 22.532806 6.284634 12.653063 3.613524 408.237154
sapply(Boston[variables_g1], sd) # calcula la desviación estándar de cada variable
## medv rm lstat crim tax
## 9.1971041 0.7026171 7.1410615 8.6015451 168.5371161
#-----------------------------------------
# Histogramas
#-----------------------------------------
?pivot_longer # abre la ayuda de la función pivot_longer
Boston %>%
select(medv, rm, lstat) %>% # selecciona variables para graficar
pivot_longer(cols = everything(), # convierte datos de formato ancho a largo
names_to = "variable",
values_to = "valor") %>%
ggplot(aes(x= valor, fill = variable)) + # define estética del gráfico
geom_histogram(color = "white", bins = 15) + # crea histogramas
facet_wrap(~variable, scales = "free_x") + # separa histogramas por variable
scale_fill_manual(values = c(medv = "skyblue", rm = "salmon",
lstat = "lightgreen")) +
#scale_fill_brewer(palette = "Set2")+
labs(title = "Histogramas de medv, rm y lstat") +
theme_minimal()

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

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

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

#Boxplots
# ----------------------------------------
Boston %>%
select(medv, lstat) %>% # selecciona variables
pivot_longer(cols = everything(), #cambiar ancho a formato largo
names_to = "variable",
values_to = "valor") %>%
ggplot(aes(x = variable, y = valor, fill = variable)) +
geom_boxplot() + # crea diagramas de caja
scale_fill_brewer(palette = "Set1") +
scale_color_manual(values = c(rm="skyblue", lstat="red",
crim="purple", tax="orange"))+
ggtitle("Boxplot de medvy lstat") +
theme_minimal()
## Warning: No shared levels found between `names(values)` of the manual scale and the
## data's colour values.

#Grafica univariante
#-----------------------------------------
ggplot(Boston, aes(x = medv))+
geom_boxplot(fill = "lightblue") + # boxplot de medv
ggtitle("Boxplot de medv") +
theme_minimal()

ggplot(Boston, aes(y = lstat)) +
geom_boxplot(fill = "lightgreen") + # boxplot de lstat
ggtitle("Boxplot de lstat") +
theme_minimal()

#Relacion entre variables
#------------------------------------------
Boston %>%
select(medv, rm, lstat, crim,tax) %>% # selecciona variables
pivot_longer(cols=-medv,
names_to = "variable",
values_to = "valor") %>%
ggplot(aes(x = valor, y = medv,color=variable))+
geom_point()+ # grafica dispersión
facet_wrap(~variable, scales = "free_x")+ # una gráfica por variable
scale_fill_brewer(palette = "Set2")+
scale_color_manual(values = c(rm="skyblue", lstat="red",
crim="purple", tax="orange"))+
ggtitle("Relacion de medv")+
theme_minimal()

#Grafica bivariante
ggplot(Boston, aes(x = rm, y = medv)) +
geom_point(color = "blue") + # relación entre número de habitaciones y valor de vivienda
ggtitle("medv vs rm") +
theme_minimal()

ggplot(Boston, aes(x = lstat, y = medv)) +
geom_point(color = "red") + # relación entre nivel socioeconómico bajo y valor de vivienda
ggtitle("medv vs lstat") +
theme_minimal()

ggplot(Boston, aes(x = crim, y = medv)) +
geom_point(color = "purple") + # relación entre criminalidad y valor de vivienda
#scale_c_log10() +
ggtitle("medv vs crim (escala log)") +
theme_minimal()

ggplot(Boston, aes(x = tax, y = medv)) +
geom_point(color = "orange") + # relación entre impuestos y valor de vivienda
ggtitle("medv vs tax") +
theme_minimal()

#-------------------------------
#Matriz de correlación visual
#-------------------------------
ggpairs(Boston[, c("medv", "rm", "lstat")]) # matriz de dispersión y correlación entre variables

## Observaciones
#A partir del análisis exploratorio se identifican varios patrones relevantes:
#- Existe una relación positiva entre el número de habitaciones (rm) y el valor de las viviendas (medv).
#- Se observa una relación negativa fuerte entre lstat y medv, lo que indica que un mayor porcentaje de población de bajo estatus socioeconómico se asocia con viviendas de menor valor.
#- La variable crim también muestra una relación negativa con medv, lo que sugiere que mayores niveles de criminalidad pueden afectar el valor de las propiedades.
#- Los boxplots permiten detectar algunos valores atípicos en variables como lstat y crim.
## Conclusiones
#El análisis exploratorio permite identificar factores importantes que influyen en el valor de las viviendas.
#Las variables rm, lstat y crim parecen tener una relación significativa con medv. En particular, el número de habitaciones presenta una relación positiva con el valor de la vivienda, mientras que variables asociadas a condiciones socioeconómicas o criminalidad presentan relaciones negativas.
#Este análisis constituye un primer paso para comprender la estructura de los datos y puede servir como base para futuros modelos de regresión o análisis predictivos.