Análisis de Datos

El conjunto de datos California Housing contiene información demográfica y económica de distritos censales de California. El objetivo del análisis es estudiar los factores asociados al valor medio de las viviendas (MedHouseVal), identificando relaciones entre variables y construyendo modelos de regresión que permitan explicar y predecir dicho valor. La base contiene 20640 observaciones y 10 variables, incluyendo variables de naturaleza cuantitativa relacionadas con ingresos, antigüedad de las viviendas, ocupación y número promedio de habitaciones.

library(readr)
housing <- read_csv("C:/Users/aidas/Downloads/housing.csv/housing.csv")
## Rows: 20640 Columns: 10
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): ocean_proximity
## dbl (9): longitude, latitude, housing_median_age, total_rooms, total_bedroom...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
datos<- housing
dim(datos)
## [1] 20640    10
datos
## # A tibble: 20,640 × 10
##    longitude latitude housing_median_age total_rooms total_bedrooms population
##        <dbl>    <dbl>              <dbl>       <dbl>          <dbl>      <dbl>
##  1     -122.     37.9                 41         880            129        322
##  2     -122.     37.9                 21        7099           1106       2401
##  3     -122.     37.8                 52        1467            190        496
##  4     -122.     37.8                 52        1274            235        558
##  5     -122.     37.8                 52        1627            280        565
##  6     -122.     37.8                 52         919            213        413
##  7     -122.     37.8                 52        2535            489       1094
##  8     -122.     37.8                 52        3104            687       1157
##  9     -122.     37.8                 42        2555            665       1206
## 10     -122.     37.8                 52        3549            707       1551
## # ℹ 20,630 more rows
## # ℹ 4 more variables: households <dbl>, median_income <dbl>,
## #   median_house_value <dbl>, ocean_proximity <chr>

El conjunto de datos California Housing está conformado por 10 variables, de las cuales 9 son cuantitativas y 1 cualitativa. Las variables cuantitativas incluyen información geográfica, demográfica, económica y características de las viviendas, mientras que la variable cualitativa describe la proximidad de cada distrito al océano. En general, la base de datos proporciona información relevante para analizar los factores asociados al valor medio de las viviendas, variable que constituye el principal objeto de estudio en este análisis.

caracterizacion <- data.frame(
  Variable = c(
    "longitude",
    "latitude",
    "housing_median_age",
    "total_rooms",
    "total_bedrooms",
    "population",
    "households",
    "median_income",
    "median_house_value",
    "ocean_proximity"
  ),

  Tipo = c(
    "Cuantitativa",
    "Cuantitativa",
    "Cuantitativa",
    "Cuantitativa",
    "Cuantitativa",
    "Cuantitativa",
    "Cuantitativa",
    "Cuantitativa",
    "Cuantitativa",
    "Cualitativa"
  ),

  Clasificacion = c(
    "Continua",
    "Continua",
    "Continua",
    "Discreta",
    "Discreta",
    "Discreta",
    "Discreta",
    "Continua",
    "Continua",
    "Nominal"
  ),

  Descripcion = c(
    "Longitud geografica",
    "Latitud geografica",
    "Edad mediana de viviendas",
    "Total de habitaciones",
    "Total de dormitorios",
    "Poblacion",
    "Numero de hogares",
    "Ingreso medio",
    "Valor medio de viviendas",
    "Proximidad al oceano"
  )
)
library(knitr)

kable(
  caracterizacion,
  caption = "Caracterización de variables"
)
Caracterización de variables
Variable Tipo Clasificacion Descripcion
longitude Cuantitativa Continua Longitud geografica
latitude Cuantitativa Continua Latitud geografica
housing_median_age Cuantitativa Continua Edad mediana de viviendas
total_rooms Cuantitativa Discreta Total de habitaciones
total_bedrooms Cuantitativa Discreta Total de dormitorios
population Cuantitativa Discreta Poblacion
households Cuantitativa Discreta Numero de hogares
median_income Cuantitativa Continua Ingreso medio
median_house_value Cuantitativa Continua Valor medio de viviendas
ocean_proximity Cualitativa Nominal Proximidad al oceano

Como parte del proceso de depuración y validación de la calidad de los datos, se realizó una revisión de los valores faltantes presentes en la base de datos. Este análisis permite identificar posibles registros incompletos que puedan afectar los resultados estadísticos y la construcción de los modelos de regresión. En la siguiente tabla se presenta la cantidad y el porcentaje de valores faltantes encontrados en cada variable.

sum(is.na(housing))
## [1] 207
colSums(is.na(housing))
##          longitude           latitude housing_median_age        total_rooms 
##                  0                  0                  0                  0 
##     total_bedrooms         population         households      median_income 
##                207                  0                  0                  0 
## median_house_value    ocean_proximity 
##                  0                  0
round(
  colSums(is.na(housing))/nrow(housing)*100,
  2
)
##          longitude           latitude housing_median_age        total_rooms 
##                  0                  0                  0                  0 
##     total_bedrooms         population         households      median_income 
##                  1                  0                  0                  0 
## median_house_value    ocean_proximity 
##                  0                  0
faltantes <- data.frame(
  Variable = names(housing),
  Valores_Faltantes = colSums(is.na(housing)),
  Porcentaje = round(
    colSums(is.na(housing))/nrow(housing)*100,
    2
  )
)

faltantes
##                              Variable Valores_Faltantes Porcentaje
## longitude                   longitude                 0          0
## latitude                     latitude                 0          0
## housing_median_age housing_median_age                 0          0
## total_rooms               total_rooms                 0          0
## total_bedrooms         total_bedrooms               207          1
## population                 population                 0          0
## households                 households                 0          0
## median_income           median_income                 0          0
## median_house_value median_house_value                 0          0
## ocean_proximity       ocean_proximity                 0          0

Se identificó que únicamente la variable total_bedrooms presenta valores faltantes, con 207 observaciones ausentes. Las demás variables no registran datos faltantes, lo que evidencia una adecuada calidad general de la información.

Una vez identificados los valores faltantes, se procedió a depurar la base de datos mediante la eliminación de los registros incompletos utilizando la función na.omit(). Posteriormente, se verificó nuevamente la presencia de datos ausentes con el fin de garantizar que todas las variables estuvieran completas para los análisis estadísticos posteriores.

housing_limpio <- na.omit(housing)
housing$total_bedrooms[
is.na(housing$total_bedrooms)
] <- median(
housing$total_bedrooms,
na.rm = TRUE
)
housing_limpio <- na.omit(housing)
colSums(is.na(housing_limpio))
##          longitude           latitude housing_median_age        total_rooms 
##                  0                  0                  0                  0 
##     total_bedrooms         population         households      median_income 
##                  0                  0                  0                  0 
## median_house_value    ocean_proximity 
##                  0                  0

Los resultados evidencian que, después del proceso de depuración, ninguna de las variables presenta valores faltantes. Esto indica que la base de datos quedó completamente limpia y apta para la aplicación de técnicas de análisis exploratorio, correlación y regresión, sin riesgo de sesgos asociados a datos ausentes.

nrow(housing)
## [1] 20640
nrow(housing_limpio)
## [1] 20640
nrow(housing) - nrow(housing_limpio)
## [1] 0

Se eliminaron 207 observaciones incompletas, conservándose más del 99% de la información original.

Se calcularon estadísticas descriptivas para obtener una visión general del comportamiento de las variables, identificando su tendencia central, dispersión y rango de variación antes de realizar los análisis posteriores.

summary(housing_limpio)
##    longitude         latitude     housing_median_age  total_rooms   
##  Min.   :-124.3   Min.   :32.54   Min.   : 1.00      Min.   :    2  
##  1st Qu.:-121.8   1st Qu.:33.93   1st Qu.:18.00      1st Qu.: 1448  
##  Median :-118.5   Median :34.26   Median :29.00      Median : 2127  
##  Mean   :-119.6   Mean   :35.63   Mean   :28.64      Mean   : 2636  
##  3rd Qu.:-118.0   3rd Qu.:37.71   3rd Qu.:37.00      3rd Qu.: 3148  
##  Max.   :-114.3   Max.   :41.95   Max.   :52.00      Max.   :39320  
##  total_bedrooms     population      households     median_income    
##  Min.   :   1.0   Min.   :    3   Min.   :   1.0   Min.   : 0.4999  
##  1st Qu.: 297.0   1st Qu.:  787   1st Qu.: 280.0   1st Qu.: 2.5634  
##  Median : 435.0   Median : 1166   Median : 409.0   Median : 3.5348  
##  Mean   : 536.8   Mean   : 1425   Mean   : 499.5   Mean   : 3.8707  
##  3rd Qu.: 643.2   3rd Qu.: 1725   3rd Qu.: 605.0   3rd Qu.: 4.7432  
##  Max.   :6445.0   Max.   :35682   Max.   :6082.0   Max.   :15.0001  
##  median_house_value ocean_proximity   
##  Min.   : 14999     Length:20640      
##  1st Qu.:119600     Class :character  
##  Median :179700     Mode  :character  
##  Mean   :206856                       
##  3rd Qu.:264725                       
##  Max.   :500001

Los resultados evidencian diferencias importantes en la dispersión de las variables, así como posibles valores extremos en aquellas relacionadas con habitaciones, población y hogares, aspectos que serán considerados en los análisis posteriores.

Con el fin de analizar la distribución del valor medio de las viviendas (median_house_value), se construyeron un histograma y un diagrama de caja. Estas representaciones gráficas permiten identificar la forma de la distribución, la presencia de asimetrías y posibles valores atípicos.

housing_limpio <- housing
library(summarytools)
## Warning: package 'summarytools' was built under R version 4.5.3
view(dfSummary(housing_limpio))
## Switching method to 'browser'
## Output file written: C:\Users\aidas\AppData\Local\Temp\RtmpAB6Dgd\file592440fe1839.html
par(mfrow= c (1,2))

hist(housing_limpio$median_house_value, col = "blue")
boxplot(housing_limpio$median_house_value, col = "blue", horizontal = T)

El histograma muestra que la distribución del valor medio de las viviendas presenta una asimetría positiva, ya que la mayor concentración de observaciones se encuentra en valores bajos y medios, mientras que existe una cola hacia valores más altos. Por su parte, el diagrama de caja evidencia la presencia de valores extremos en la parte superior de la distribución, lo que sugiere la existencia de viviendas con precios considerablemente superiores al comportamiento general de los datos. En conjunto, ambas gráficas indican que la variable no presenta una distribución perfectamente simétrica y que podrían existir observaciones influyentes que deben considerarse en los análisis posteriores.

Con el propósito de identificar la intensidad y dirección de las relaciones entre las variables cuantitativas, se construyó una matriz de correlación. Este análisis permite detectar asociaciones lineales que pueden resultar relevantes para la construcción de modelos de regresión.

library(PerformanceAnalytics)
## Warning: package 'PerformanceAnalytics' was built under R version 4.5.3
## Cargando paquete requerido: xts
## Warning: package 'xts' was built under R version 4.5.3
## Cargando paquete requerido: zoo
## Warning: package 'zoo' was built under R version 4.5.3
## 
## Adjuntando el paquete: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## 
## Adjuntando el paquete: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
## 
##     legend
chart.Correlation(
  housing_limpio[,sapply(housing_limpio,is.numeric)],
  histogram = TRUE,
  pch = 19
)

La matriz de correlación general permitió identificar relaciones lineales entre las variables del conjunto de datos, evidenciando asociaciones fuertes entre algunas características demográficas y estructurales de los distritos. No obstante, dado que el objetivo del estudio se centra en analizar el comportamiento del valor medio de las viviendas y las variables seleccionadas en la guía, a continuación se realizará un análisis específico utilizando únicamente las variables MedHouseVal, MedInc, HouseAge, AveRooms y AveOccup. Esto permitirá responder de manera precisa las preguntas planteadas y evaluar las relaciones más relevantes para la construcción de los modelos de regresión.

datos_modelo <- housing_limpio[,c(
"median_house_value",
"median_income",
"housing_median_age",
"total_rooms",
"population"
)]

A continuación, se presentan las medidas descriptivas y la distribución de las variables seleccionadas, con el fin de identificar patrones generales, niveles de dispersión y posibles asimetrías en los datos.

summary(datos_modelo)
##  median_house_value median_income     housing_median_age  total_rooms   
##  Min.   : 14999     Min.   : 0.4999   Min.   : 1.00      Min.   :    2  
##  1st Qu.:119600     1st Qu.: 2.5634   1st Qu.:18.00      1st Qu.: 1448  
##  Median :179700     Median : 3.5348   Median :29.00      Median : 2127  
##  Mean   :206856     Mean   : 3.8707   Mean   :28.64      Mean   : 2636  
##  3rd Qu.:264725     3rd Qu.: 4.7432   3rd Qu.:37.00      3rd Qu.: 3148  
##  Max.   :500001     Max.   :15.0001   Max.   :52.00      Max.   :39320  
##    population   
##  Min.   :    3  
##  1st Qu.:  787  
##  Median : 1166  
##  Mean   : 1425  
##  3rd Qu.: 1725  
##  Max.   :35682
hist(datos_modelo$median_house_value, col = "blue")

boxplot(datos_modelo$median_house_value, col = "blue", horizontal = T)

Las variables seleccionadas presentan una variabilidad considerable, especialmente en el valor medio de las viviendas, cuyos valores oscilan entre 14.999 y 500.001. La media (206.856) es superior a la mediana (179.700), lo que sugiere una distribución asimétrica positiva. Esta característica se confirma en el diagrama de caja, donde se observan valores atípicos en el extremo superior de la distribución. En general, los resultados evidencian una importante heterogeneidad entre los distritos analizados, particularmente en los precios de las viviendas.

Una vez descrito el comportamiento general de las variables seleccionadas, se procede a analizar las relaciones existentes entre ellas mediante las matrices de covarianza y correlación, con el fin de identificar posibles asociaciones relevantes para la construcción de modelos de regresión.

library(PerformanceAnalytics)

chart.Correlation(datos_modelo) 

La matriz de correlación evidencia relaciones de diferente intensidad entre las variables seleccionadas. Se destaca una correlación positiva moderadamente fuerte entre el ingreso medio (median_income) y el valor medio de las viviendas (median_house_value) (r = 0.69), lo que sugiere que los distritos con mayores ingresos tienden a presentar viviendas de mayor valor. Por otra parte, la antigüedad de las viviendas (housing_median_age) muestra una relación positiva débil con el valor de las viviendas (r = 0.11), mientras que las variables total_rooms y population presentan asociaciones positivas muy bajas (r = 0.13 y r = -0.03, respectivamente). Asimismo, se observa una correlación alta entre total_rooms y population (r = 0.86), indicando una fuerte relación entre el tamaño de las viviendas y la cantidad de habitantes de los distritos.

#Análisis preliminar para la construcción del modelo de regresión lineal simple

Con el propósito de analizar la relación entre el valor medio de las viviendas (median_house_value) y el ingreso medio de los hogares (median_income), se realizó una exploración inicial de las variables seleccionadas. En primer lugar, se verificó el tamaño del conjunto de datos y posteriormente se evaluó el supuesto de normalidad mediante pruebas estadísticas, con el fin de conocer el comportamiento de las variables y seleccionar las técnicas de análisis más adecuadas para la construcción del modelo de regresión.

dim(datos_modelo)
## [1] 20640     5

Dado que el tamaño de la muestra es superior a 50 observaciones, se empleó la prueba de Kolmogorov-Smirnov para evaluar el supuesto de normalidad.

#Hipótesis nula (H0):
# Los datos de la variable median_house_value se ajustan a una distribución normal.

# Hipótesis alternativa (H1):
# Los datos de la variable median_house_value no se ajustan a una distribución normal.

ks.test(
datos_modelo$median_house_value,
"pnorm",
mean(datos_modelo$median_house_value),
sd(datos_modelo$median_house_value)
)
## Warning in ks.test.default(datos_modelo$median_house_value, "pnorm",
## mean(datos_modelo$median_house_value), : ties should not be present for the
## one-sample Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  datos_modelo$median_house_value
## D = 0.10299, p-value < 2.2e-16
## alternative hypothesis: two-sided
# Hipótesis nula (H0):
# Los datos de la variable median_income se ajustan a una distribución normal.

# Hipótesis alternativa (H1):
# Los datos de la variable median_income no se ajustan a una distribución normal.

ks.test(
datos_modelo$median_income,
"pnorm",
mean(datos_modelo$median_income),
sd(datos_modelo$median_income)
)
## Warning in ks.test.default(datos_modelo$median_income, "pnorm",
## mean(datos_modelo$median_income), : ties should not be present for the
## one-sample Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  datos_modelo$median_income
## D = 0.089427, p-value < 2.2e-16
## alternative hypothesis: two-sided

En ambos casos se obtuvo un valor p inferior al nivel de significancia de 0.05, por lo que se rechazó la hipótesis nula de normalidad. En consecuencia, se concluye que ninguna de las dos variables presenta una distribución normal, resultado que coincide con la asimetría observada previamente en los análisis gráficos y descriptivos.