Actividad 2 Modelos Estadísticos para la toma de decisiones

Caso Compañía C&A

Problema Planteado

Maria comenzó como agente de bienes raíces en Cali hace 10 años. Después de laborar dos años para una empresa nacional, se traslado a Bogotá y trabajó para otra agencia de bienes raíces. Sus amigos y familiares la convencieron de que con su experiencia y conocimientos del negocio debía abrir su propia agencia. Terminó por adquirir la licencia de intermediario y al poco tiempo fundó su propia compañía, C&A (Casas y Apartamentos) en Cali. Santiago y Lina, dos vendedores de la empresa anterior aceptaron trabajar en la nueva compaña. En la actualidad ocho agentes de bienes raíces colaboran con ella en C&A.

Actualmente las ventas de bienes raíces en Cali se han visto disminuidas de manera significativa en lo corrido del año. Durante este periodo muchas instituciones bancarias de ahorro y vivienda están prestando grandes sumas de dinero para la industria y la construcción comercial y residencial. Cuando el efecto producto de las tensiones políticas y sociales disminuya, se espera que la actividad económica de este sector se reactive.

Hace dos días, María recibió una carta solicitando asesoría para la compra de dos viviendas por parte de una compañía internacional que desea ubicar a dos de sus empleados con sus familias en la ciudad. Las solicitudes incluyen las siguientes condiciones:

Características Vivienda 1 Vivienda 2
Tipo Casa Apartamento
Área construida 200 300
Parqueaderos 1 3
Baños 2 3
Habitaciones 4 5
Estrato 4 o 5 5 o 6
Zona Norte Sur
Crédito preaprobado 350 millones 850 millones

El problema consiste en ayudar a María a responder la solicitud, mediante técnicas modelación que usted conoce. Ella requiere le envíe un informe ejecutivo donde analice los dos casos y sus recomendaciones (Informe). Como soporte se debe anexar las estimaciones, validaciones y comparación de modelos requeridos (Anexos) .

1. Primer paso

Enunciado

Realice un filtro a la base de datos e incluya solo las ofertas de : base1: casas, de la zona norte de la ciudad. Presente los primeros 3 registros de las bases y algunas tablas que comprueben la consulta. (Adicional un mapa con los puntos de las bases. Discutir si todos los puntos se ubican en la zona correspondiente o se presentan valores en otras zonas, por que?).

Desarrollo

Instalación de paquetes y carga de datos

#install.packages("devtools") # solo la primera vez
#install.packages("leaflet")
#install.packages("leaflet.extras")
# devtools::install_github("dgonxalex80/paqueteMODELOS", force =TRUE)
library(paqueteMODELOS)
library(ggplot2)
library(dplyr)
library(leaflet)

data("vivienda")

Se realiza la limpieza de la base datos y corrección de valores faltantes.

# Cargar la librería para imputación
if (!require(dplyr)) {
  install.packages("dplyr")
}

library(dplyr)

# Función para calcular la moda
getmode <- function(v) {
   uniqv <- unique(v)
   uniqv[which.max(tabulate(match(v, uniqv)))]
}

# Realizamos la imputación para variables numéricas
vivienda$areaconst[is.na(vivienda$areaconst)] <- median(vivienda$areaconst, na.rm = TRUE)
vivienda$parqueaderos[is.na(vivienda$parqueaderos)] <- median(vivienda$parqueaderos, na.rm = TRUE)
vivienda$banios[is.na(vivienda$banios)] <- median(vivienda$banios, na.rm = TRUE)
vivienda$habitaciones[is.na(vivienda$habitaciones)] <- median(vivienda$habitaciones, na.rm = TRUE)

# Imputación para variables categóricas (si existen)

vivienda$zona[is.na(vivienda$zona)] <- getmode(vivienda$zona)
vivienda$tipo[is.na(vivienda$tipo)] <- getmode(vivienda$tipo)
vivienda$piso[is.na(vivienda$piso)] <- getmode(vivienda$piso)


# Para la variable 'estrato' que es numérica pero categórica en la práctica, podemos usar también la moda
vivienda$estrato[is.na(vivienda$estrato)] <- getmode(vivienda$estrato)

# Eliminar la columna 'piso'
vivienda <- vivienda %>% select(-piso)

# Eliminar filas con cualquier valor faltante
vivienda <- na.omit(vivienda)

Ahora que la base tiene las correcciones pertinentes, procederemos a filtrarlos según los criterios: casas en la zona norte de la ciudad.

# Filtrar las casas en la zona norte
base1 <- vivienda[vivienda$tipo == 'Casa' & vivienda$zona == 'Zona Norte', ]

# Presentar los primeros 3 registros
head(base1, 3)
## # A tibble: 3 × 12
##      id zona    estrato preciom areaconst parqueaderos banios habitaciones tipo 
##   <dbl> <chr>     <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl> <chr>
## 1  1209 Zona N…       5     320       150            2      4            6 Casa 
## 2  1592 Zona N…       5     780       380            2      3            3 Casa 
## 3  4057 Zona N…       6     750       445            2      7            6 Casa 
## # ℹ 3 more variables: barrio <chr>, longitud <dbl>, latitud <dbl>

Ahora se realiza la creación de un mapa de puntos.

library(leaflet)

# Crear un mapa
mapa <- leaflet(data = base1) %>%
  addTiles()  # Agregar capa base (puedes personalizarla)

# Agregar marcadores (puntos) al mapa
mapa <- mapa %>%
  addMarkers(
    lng = ~longitud,  # Columna con longitud
    lat = ~latitud,   # Columna con latitud
    label = ~id,      # Etiqueta para los marcadores (puedes personalizarla)
    popup = ~paste("Tipo: ", tipo, "<br>Barrio: ", barrio)  # Información adicional en el popup
  )

# Mostrar el mapa
mapa

Para poder tener un mejor criterio de respuesta al enunciado planteado se Realiza un mapa de calor y un mapa de rango de precios.

library(leaflet)


mapa <- leaflet(data = base1) %>%
  addTiles()  


colores <- colorFactor(
  palette = c("blue", "green", "orange", "red"),  # Colores disponibles
  domain = base1$preciom  # Columna "preciom" para asignar colores
)


mapa <- mapa %>%
  addCircleMarkers(
    lng = ~longitud,  # Columna con longitud
    lat = ~latitud,   # Columna con latitud
    radius = 5,       # Tamaño de los marcadores
    color = ~colores(preciom),  # Asignar colores basados en "preciom"
    fillOpacity = 0.6,  # Opacidad de relleno
    popup = ~paste("Tipo: ", tipo, "<br>Barrio: ", barrio, "<br>Precio: $", preciom)  # Información en el popup
  )


mapa <- mapa %>%
  addLegend(
    position = "bottomright",
    colors = c("blue", "green", "orange", "red"),  # Colores disponibles
    labels = c("0-100", "101-200", "201-300", "301+"),
    title = "Precio (Millones de pesos)"
  )

# Mostrar el mapa
mapa

Se presentan registros que se presnetan en zonas difetenes a la la “Zona Norte” lo cual puede ser por Coordenadas geográficas incorrectas, la zona mal clasificada o cohordenadas mal descritas geograficamente.

2. Segundo paso

Enunciado

  1. Realice un análisis exploratorio de datos enfocado en la correlación entre la variable respuesta (precio de la casa) en función del área construida, estrato, numero de baños, numero de habitaciones y zona donde se ubica la vivienda. Use gráficos interactivos con el paquete plotly e interprete los resultados.

Desarrollo

Para este punto se va a realizar un análisis exploratorio de datos enfocado en la correlación entre el precio de la vivienda y otras variables como el área construida, estrato, número de baños, número de habitaciones y la zona donde se ubica la vivienda. Para este análisis, emplearemos gráficos interactivos utilizando el paquete plotly en R.

#install.packages("plotly")
library(plotly)
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
scatter_precio_area <- plot_ly(data = base1, x = ~areaconst, y = ~preciom, text = ~zona, mode = "markers", type = "scatter", marker = list(size = 10), name = "Precio vs. Área Construida")

scatter_precio_estrato <- plot_ly(data = base1, x = ~estrato, y = ~preciom, text = ~zona, mode = "markers", type = "scatter", marker = list(size = 10), name = "Precio vs. Estrato")


scatter_precio_banios <- plot_ly(data = base1, x = ~banios, y = ~preciom, text = ~zona, mode = "markers", type = "scatter", marker = list(size = 10), name = "Precio vs. Número de Baños")


scatter_precio_habitaciones <- plot_ly(data = base1, x = ~habitaciones, y = ~preciom, text = ~zona, mode = "markers", type = "scatter", marker = list(size = 10), name = "Precio vs. Numero de Habitaciones")


matriz_correlacion <- cor(base1[c("preciom", "areaconst", "estrato", "banios", "habitaciones")])


heatmap_correlacion <- plot_ly(z = matriz_correlacion, x = colnames(matriz_correlacion), y = colnames(matriz_correlacion), type = "heatmap", name = "Matriz de Correlación")


subplot_graficos <- subplot(
  scatter_precio_area, scatter_precio_estrato, scatter_precio_banios, scatter_precio_habitaciones,
  nrows = 2, margin = 0.05
)


subplot_graficos

Gráfico de Dispersión:

El primer gráfico de dispersión muestra cuatro relaciones diferentes entre el precio y otras variables de las viviendas:

  1. Precio vs. Área Construida (azul): Parece haber una correlación positiva entre el área construida y el precio de las viviendas. A medida que el área construida aumenta, el precio también tiende a aumentar. Esto es esperable ya que casas más grandes suelen tener precios más altos.

  2. Precio vs. Estrato (naranja): Existe una agrupación distintiva por estrato, lo que indica que el precio de las viviendas tiende a ser mayor en estratos más altos. Los puntos están alineados verticalmente por cada categoría de estrato, lo que refleja que el estrato es una variable categórica.

  3. Precio vs. Número de Baños (verde): El precio también parece aumentar con el número de baños, lo que sugiere que las viviendas con más baños suelen ser más caras, probablemente reflejando un mayor tamaño o más amenidades de la vivienda.

  4. Precio vs. Número de Habitaciones (rojo): Similar al número de baños, hay una tendencia al alza en el precio con un número creciente de habitaciones, aunque hay mucha variabilidad, especialmente en viviendas con más de 5 habitaciones.

# Calculamos la matriz de correlación para las variables de interés
correlaciones <- cor(base1[,c('preciom', 'areaconst', 'estrato', 'banios', 'habitaciones')], use = "complete.obs")

# Visualización de la matriz de correlación
plot_ly(z = correlaciones, x = colnames(correlaciones), y = colnames(correlaciones), type = "heatmap")

Mapa de Calor de Correlación:

El segundo gráfico muestra la matriz de correlación entre las mismas variables analizadas anteriormente.

  1. Preciom (precio) y areaconst (área construida): Hay una fuerte correlación positiva entre el precio y el área construida, lo cual es consistente con el análisis del gráfico de dispersión.

  2. Preciom y estrato: Existe una correlación positiva moderada entre el precio y el estrato, lo que indica que los estratos más altos generalmente se asocian con precios más altos.

  3. Preciom y banios (número de baños): Hay una correlación positiva que indica que a más baños, generalmente el precio de la vivienda es más alto.

  4. Preciom y habitaciones (número de habitaciones): También hay una correlación positiva, aunque posiblemente más débil que con el área construida, lo que sugiere que el número de habitaciones influye en el precio, pero no tanto como el área construida.

Estos resultados indican que todas las variables seleccionadas tienen una relación directa con el precio de las viviendas, siendo el área construida y el estrato social las que presentan una relación más fuerte. Esto podría ser debido a que estas dos características son indicadores clave de la calidad y el valor percibido de una propiedad en el mercado inmobiliario de Cali.

3. Tercer paso

Enunciado

Estime un modelo de regresión lineal múltiple con las variables del punto anterior (precio = f(área construida, estrato, número de cuartos, número de parqueaderos, número de baños ) ) e interprete los coeficientes si son estadísticamente significativos. Las interpretaciones deber están contextualizadas y discutir si los resultados son lógicos. Adicionalmente interprete el coeficiente R2 y discuta el ajuste del modelo e implicaciones (que podrían hacer para mejorarlo).

Desarrollo

En R, podemos hacer esto usando la función lm() para ajustar el modelo y luego interpretar los coeficientes resultantes.

# Ajustar el modelo de regresión lineal múltiple
modelo <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = base1)

# Resumen del modelo para obtener los coeficientes y estadísticas
summary(modelo)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = base1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -924.94  -77.71  -17.66   45.90 1081.29 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -251.05177   30.11848  -8.335 3.94e-16 ***
## areaconst       0.81090    0.04352  18.634  < 2e-16 ***
## estrato        84.61108    7.17727  11.789  < 2e-16 ***
## habitaciones    0.95948    4.10569   0.234  0.81529    
## parqueaderos   16.55976    5.70396   2.903  0.00381 ** 
## banios         24.57669    5.35583   4.589 5.26e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 158.2 on 716 degrees of freedom
## Multiple R-squared:  0.6548, Adjusted R-squared:  0.6524 
## F-statistic: 271.6 on 5 and 716 DF,  p-value: < 2.2e-16

Los resultados del modelo de regresión lineal múltiple nos proporcionan información valiosa sobre cómo cada variable independiente contribuye al precio de las viviendas (preciom). Aquí está una interpretación de los resultados:

La salida del modelo de regresión lineal proporciona una serie de estadísticas que nos ayudan a interpretar la relación entre las variables independientes (areaconst, estrato, habitaciones, parqueaderos, banios) y la variable dependiente (preciom).

Coeficientes (Estimates): - Intercepto (Intercept): El valor del intercepto es -251.05. Este número representa el precio estimado (en millones) de una vivienda cuando todas las demás variables son cero. En la práctica, no tendría sentido ya que no puedes tener una casa con cero metros cuadrados, cero habitaciones, etc. - Area Construida (areaconst): Por cada metro cuadrado adicional, el precio de la vivienda aumenta en promedio 0.8109 millones de pesos. Este efecto es muy significativo (p < 2e-16). - Estrato (estrato): Cada incremento en el nivel de estrato se asocia con un aumento promedio de 84.61108 millones de pesos en el precio. Este efecto es altamente significativo (p < 2e-16). - Habitaciones (habitaciones): El número de habitaciones no tiene un efecto significativo en el precio (p = 0.81529), lo que sugiere que, bajo este modelo, el número de habitaciones no influye significativamente en el precio de la vivienda. - Parqueaderos (parqueaderos): Cada espacio de parqueadero adicional se asocia con un aumento en el precio de 16.55976 millones, y este efecto es estadísticamente significativo (p = 0.00381). - Baños (banios): Cada baño adicional se asocia con un aumento en el precio de 24.57669 millones, y este coeficiente es significativo (p = 5.26e-06).

Bondad de Ajuste: - Error Estándar Residual (Residual standard error): El error estándar de los residuos es 158.2, que da una idea de cuánto se desvían las predicciones del modelo de los valores reales. - R cuadrado (Multiple R-squared): El valor de 0.6548 indica que aproximadamente el 65.48% de la variabilidad en el precio de la vivienda es explicada por el modelo. - R cuadrado ajustado (Adjusted R-squared): El valor ajustado de 0.6524 es una versión del R cuadrado que está ajustada por el número de predictores en el modelo. Sugiere que después de ajustar por el número de variables, el modelo aún explica aproximadamente el 65.24% de la variabilidad. - Estadístico F (F-statistic): El valor de 271.6 y un p-valor menor a 2.2e-16 indica que hay una relación muy significativa entre las variables independientes juntas y el precio de la vivienda. En otras palabras, el modelo en conjunto es significativamente mejor que un modelo sin ninguna de las variables independientes.

En resumen, el modelo indica que el área construida, el estrato, los parqueaderos y el número de baños son predictores significativos del precio de las viviendas, con el estrato y el área construida siendo los más influyentes. El número de habitaciones no parece tener una influencia significativa en el precio dentro de este modelo. El modelo tiene un buen ajuste general y es estadísticamente significativo.

4. Cuarto paso

Enunciado

Estime un modelo de regresión lineal múltiple con las variables del punto anterior (precio = f(área construida, estrato, número de cuartos, número de parqueaderos, número de baños ) ) e interprete los coeficientes si son estadísticamente significativos. Las interpretaciones deber están contextualizadas y discutir si los resultados son lógicos. Adicionalmente interprete el coeficiente R2 y discuta el ajuste del modelo e implicaciones (que podrían hacer para mejorarlo).

3.1 Linelidad

plot(modelo, which = 1)  # Debería mostrar una relación lineal en el gráfico de Residuales vs Fitted

El gráfico de “Residuales vs Valores Ajustados” muestra que los residuales se distribuyen de manera aleatoria alrededor de la línea horizontal de cero, lo cual es un indicador de que la relación entre las variables predictoras y la respuesta puede ser adecuadamente capturada por un modelo lineal. Adicionalmente se puede decir lo siguiente:

  1. Ausencia de Patrones Claros: No hay patrones claros o curvas sistemáticas que sugieran no linealidad. Los residuales no forman ningún patrón distintivo, lo cual es un buen indicio de que la relación entre las variables predictoras y la variable de respuesta es lineal.

  2. Distribución Aleatoria de Residuales: Los residuales se distribuyen de forma aleatoria tanto por encima como por debajo de la línea de cero, lo que sugiere que el modelo está capturando la relación entre las variables de forma adecuada.

  3. Outliers: Se observan algunos residuales que están bastante alejados de la línea de cero, lo que podría indicar la presencia de valores atípicos. Estos valores atípicos pueden tener un impacto significativo en el modelo y podrían ser candidatos para una investigación más detallada o para ser eliminados si hay una justificación válida.

  4. Igualdad de Varianza (Homocedasticidad): La dispersión de los residuales parece ser consistente a través del rango de valores ajustados, lo cual es un indicio de que los errores tienen varianza constante (homocedasticidad). No parece haber un patrón de embudo que sugiera lo contrario.

Sin embargo, es importante notar que la interpretación de estos gráficos siempre involucra un grado de subjetividad y que conclusiones más definitivas a menudo requieren un análisis más detallado, incluyendo la consideración de otras métricas y diagnósticos.

3.2 Independencia de los errores

# 2. Independencia de los errores
plot(modelo, which = 2)  # No debería haber patrones en los Residuales vs Fitted

En un gráfico Q-Q perfectamente normal, los puntos deberían caer en una línea recta. En este caso se puede afirmar lo siguiente:

  1. Distribución Central: En la parte central del gráfico (entre los cuantiles teóricos de aproximadamente -2 y 2), los puntos se adhieren bastante bien a la línea, lo que indica que los residuos en el centro de la distribución son aproximadamente normales.

  2. Colas de la Distribución: Sin embargo, en las colas, especialmente en la derecha (valores positivos), los puntos se desvían de la línea, lo que indica que hay residuales que no se ajustan a una distribución normal. Esto sugiere presencia de valores atípicos o extremos.

  3. Valores Atípicos: Los puntos etiquetados como 0405, 5130, y especialmente 0632 indican valores residuales que son extremadamente atípicos en comparación con el resto de los datos. Estos podrían estar afectando la normalidad de los residuos.

  4. Posible Sesgo en los Datos: La desviación en las colas puede sugerir que hay un sesgo en los datos, donde los valores extremos no se están modelando bien con una distribución normal. Esto podría ser una indicación de que el modelo no está capturando toda la complejidad de los datos, o que hay influencias no consideradas que están afectando los precios de las viviendas.

En resumen, mientras que los residuos parecen aproximadamente normales en el centro de la distribución, hay claras desviaciones de la normalidad en las colas. Esto sugiere que el supuesto de normalidad de los residuales está parcialmente cumplido, pero se debe prestar atención a los valores atípicos y considerar su impacto en el modelo. Podrían explorarse transformaciones de los datos o la exclusión de valores atípicos, si es apropiado, para mejorar la normalidad y el ajuste del modelo.

3.3 Homocedasticidad

# 3. Homocedasticidad
plot(modelo, which = 3)  # La varianza de los errores debe ser constante (spread of residuals should be even across all fitted values)

Este gráfico se utiliza para evaluar la homocedasticidad de los residuales, que es el supuesto de que los residuales tienen varianzas constantes (igual dispersión de los residuales) a través de todas las predicciones del modelo.

Interpretación del gráfico Scale-Location:

  1. Homocedasticidad: Buscamos una dispersión constante de los residuales a lo largo de los valores ajustados. En este gráfico, se observa una tendencia creciente en la dispersión de los residuales a medida que aumentan los valores ajustados (los residuales se abren en forma de cono hacia la derecha). Esto podría indicar que hay heterocedasticidad presente, lo cual es una violación del supuesto de homocedasticidad.

  2. Linea Roja: La línea roja en el gráfico representa la relación entre los residuales estandarizados y los valores ajustados. Idealmente, esta línea debería ser horizontal y plana si los residuales estuvieran igualmente dispersos a lo largo de los valores ajustados. En este caso, la línea tiene una pendiente positiva, lo que sugiere que los residuales más grandes tienden a ocurrir en valores ajustados más altos.

  3. Valores Atípicos: Al igual que en el gráfico Q-Q, hay algunos puntos etiquetados que se destacan por tener residuales estandarizados más grandes. Los puntos 0405, 5130 y 6320 indican valores residuales que están lejos de la mayoría, lo que podría ser una señal de que ciertos valores no se ajustan bien al modelo.

Sobre la multicolinealidad, este gráfico no es el que se utiliza para detectarla. La multicolinealidad se refiere a la correlación entre las variables predictoras y se suele evaluar mediante estadísticas como el Factor de Inflación de la Varianza (VIF). Si bien no se aborda directamente con este gráfico, la presencia de multicolinealidad puede influir en la dispersión de los residuales al complicar la estimación de los coeficientes del modelo.

En resumen, este gráfico sugiere que podríamos tener un problema de heterocedasticidad en los residuales, lo que podría requerir que se exploren métodos para estabilizar la varianza, como transformaciones de las variables (logarítmica, raíz cuadrada, etc.), o usar técnicas de regresión robustas que no asumen homocedasticidad. Para abordar la multicolinealidad, se necesitarían medidas adicionales como el cálculo del VIF.

3.4 Multicolinealidad

# Mostrar la matriz de correlación
print(correlaciones)
##                preciom areaconst   estrato    banios habitaciones
## preciom      1.0000000 0.7313480 0.6123503 0.5233357    0.3227096
## areaconst    0.7313480 1.0000000 0.4573818 0.4628152    0.3753323
## estrato      0.6123503 0.4573818 1.0000000 0.4083039    0.1073141
## banios       0.5233357 0.4628152 0.4083039 1.0000000    0.5755314
## habitaciones 0.3227096 0.3753323 0.1073141 0.5755314    1.0000000
# Asegúrese de tener la librería car, si no, instálela
#if (!require(car)) {
#  install.packages("car")
#}

library(car)
## Loading required package: carData
## 
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
## 
##     recode
## The following object is masked from 'package:boot':
## 
##     logit
# Calculo el VIF
vif_modelo <- vif(modelo)

print(vif_modelo)
##    areaconst      estrato habitaciones parqueaderos       banios 
##     1.523989     1.433058     1.621630     1.120670     1.918323
vif_data <- as.data.frame(vif_modelo)
names(vif_data) <- c("VIF")
vif_data$Variables <- rownames(vif_data)
rownames(vif_data) <- NULL
vif_data <- vif_data[order(-vif_data$VIF), ]

# Imprima el dataframe
print(vif_data)
##        VIF    Variables
## 5 1.918323       banios
## 3 1.621630 habitaciones
## 1 1.523989    areaconst
## 2 1.433058      estrato
## 4 1.120670 parqueaderos

Interpretando los resultados obtenidos:

  1. baños (VIF = 1.967421): Esta es la variable con el VIF más alto, pero aún está por debajo del umbral común de 5 que muchos estadísticos utilizan como indicador de una multicolinealidad preocupante. Esto sugiere que, aunque baños está correlacionado con las otras variables predictivas, la correlación no es lo suficientemente fuerte como para causar serios problemas de multicolinealidad.

  2. habitaciones (VIF = 1.721015): Similar a baños, la variable habitaciones tiene un VIF menor a 5, lo que indica una moderada correlación con las otras variables, pero no a un nivel que comprometa la integridad del modelo.

  3. areaconst (VIF = 1.460998): Esta variable tiene un VIF cercano a 1, lo cual es ideal y sugiere que no hay prácticamente ninguna multicolinealidad con las otras variables predictivas en el modelo.

  4. estrato (VIF = 1.307757): Al igual que areaconst, estrato tiene un VIF bajo, indicando que no hay preocupaciones significativas de multicolinealidad.

  5. parqueaderos (VIF = 1.226334): Este VIF también es bajo, mostrando que parqueaderos no está correlacionado fuertemente con las otras variables en el modelo.

En conclusión, ninguno de los VIFs excede el umbral común de preocupación de 5, lo que sugiere que no hay problemas evidentes de multicolinealidad en este modelo. Las variables predictoras parecen tener una relación relativamente independiente entre sí, lo que es bueno para la estabilidad del modelo y la interpretación de los coeficientes. No sería necesario tomar medidas adicionales para abordar la multicolinealidad basándonos en estos resultados.

5. Quinto Paso

Enunciado

Realice una partición en los datos de forma aleatoria donde 70% sea un set para entrenar el modelo y 30% para prueba. Estime el modelo con la muestra del 70%. Muestre los resultados.

Desarrollo

Para el quinto punto, es necesario dividir la base de datos en dos conjuntos: un conjunto de entrenamiento que representará el 70% de los datos y un conjunto de prueba que representará el 30%. Luego se ajusta el modelo de regresión lineal múltiple con el conjunto de entrenamiento. Este proceso se hace típicamente para poder evaluar el modelo con datos que no se han usado en el entrenamiento, ayudando a verificar la capacidad de generalización del modelo.

# Asegurarse de que el paquete 'caTools' está instalado para la partición de datos
if (!require(caTools)) {
  install.packages("caTools")
}
## Loading required package: caTools
library(caTools)

# Establecer una semilla para reproducibilidad
set.seed(123)

# Partición de los datos
split <- sample.split(base1$preciom, SplitRatio = 0.7)

# Crear los datos de entrenamiento
train_data <- subset(base1, split == TRUE)

# Crear los datos de prueba
test_data <- subset(base1, split == FALSE)

# Ajustar el modelo con los datos de entrenamiento
modelo <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = train_data)

# Mostrar los resultados del modelo
summary(modelo)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = train_data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -922.11  -77.98  -18.54   48.41 1074.60 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -275.88419   35.43499  -7.786 3.81e-14 ***
## areaconst       0.79563    0.04904  16.225  < 2e-16 ***
## estrato        86.32360    8.40439  10.271  < 2e-16 ***
## habitaciones    3.77987    4.84646   0.780   0.4358    
## parqueaderos   17.28047    6.95374   2.485   0.0133 *  
## banios         27.06051    6.38333   4.239 2.66e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 159.2 on 517 degrees of freedom
## Multiple R-squared:  0.6664, Adjusted R-squared:  0.6632 
## F-statistic: 206.5 on 5 and 517 DF,  p-value: < 2.2e-16

La estimación del modelo de regresión lineal realizado en el conjunto de entrenamiento (train_data) indica lo siguiente:

Coeficientes (Estimates): - Intercepto (Intercept): El valor del intercepto es -275.88. Esta sería la estimación del precio en millones de pesos cuando todas las otras variables son cero, lo cual no es práctico, pero sirve como punto de referencia. - Area Construida (areaconst): Por cada metro cuadrado adicional en área construida, el precio de la vivienda aumenta en promedio 0.79563 millones de pesos. Este es un efecto significativo (p < 2e-16). - Estrato (estrato): Cada incremento en el nivel de estrato se asocia con un aumento promedio de 86.32360 millones de pesos en el precio. Este efecto es altamente significativo (p < 2e-16). - Habitaciones (habitaciones): El número de habitaciones tiene un coeficiente de 3.77987, pero este no es estadísticamente significativo (p = 0.4358), lo que implica que no hay evidencia suficiente para afirmar que el número de habitaciones afecta el precio de la vivienda dentro de este conjunto de datos. - Parqueaderos (parqueaderos): Cada parqueadero adicional está asociado con un aumento en el precio de 17.28047 millones, y este efecto es estadísticamente significativo (p = 0.0133). - Baños (banios): Cada baño adicional está asociado con un aumento en el precio de 27.06051 millones, y este efecto también es estadísticamente significativo (p = 2.66e-05).

Bondad de Ajuste: - Error Estándar Residual: El modelo tiene un error estándar residual de 159.2, lo que nos da una medida de la desviación típica de las predicciones del modelo de los valores reales. - R cuadrado (Multiple R-squared): El valor de 0.6664 sugiere que alrededor del 66.64% de la variabilidad en el precio de la vivienda es explicada por las variables en el modelo. - R cuadrado ajustado (Adjusted R-squared): Con un valor de 0.6632, después de ajustar por el número de predictores, el modelo aún explica aproximadamente el 66.32% de la variabilidad del precio de la vivienda. - Estadístico F (F-statistic): Un valor de 206.5 con un p-valor inferior a 2.2e-16 nos indica que el modelo es estadísticamente significativo y que las variables en conjunto son buenos predictores del precio de las viviendas.

En resumen, el modelo ajustado muestra que el área construida, el estrato, los parqueaderos y el número de baños son predictores significativos del precio de las viviendas. Aunque el número de habitaciones tiene una contribución positiva al precio según el coeficiente, esta variable no resulta ser un predictor significativo dentro del conjunto de entrenamiento. El modelo ajustado explica una proporción sustancial de la variabilidad del precio de la vivienda, indicando un buen ajuste.

6. Sexto Paso

Enunciado

Realice predicciones con el modelo anterior usando los datos de prueba (30%).

Desarrollo

Para realizar predicciones con el modelo anterior usando los datos de prueba, se realiza el siguiente código:

# Realizar predicciones en el conjunto de prueba
predicciones <- predict(modelo, newdata = test_data)

# Agregar las predicciones al dataframe de test_data para comparar
test_data$predicciones <- predicciones

# Mostrar las primeras filas del dataframe de test_data para ver las predicciones
head(test_data)
## # A tibble: 6 × 13
##      id zona    estrato preciom areaconst parqueaderos banios habitaciones tipo 
##   <dbl> <chr>     <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl> <chr>
## 1  4057 Zona N…       6     750       445            2      7            6 Casa 
## 2  7824 Zona N…       4     600       160            1      4            5 Casa 
## 3   141 Zona N…       3     230       160            2      2            3 Casa 
## 4  1003 Zona N…       3     380       300            2      5            8 Casa 
## 5  1276 Zona N…       4     305       117            2      3            4 Casa 
## 6  1667 Zona N…       4     350       118            2      3            3 Casa 
## # ℹ 4 more variables: barrio <chr>, longitud <dbl>, latitud <dbl>,
## #   predicciones <dbl>

7. Séptimo Paso

Enunciado

Calcule el error cuadrático medio, el error absoluto medio y el R2, interprete.

Desarrollo

# Instalar la librería Metrics si aún no está instalada
if (!require(Metrics)) {
    install.packages("Metrics")
}
## Loading required package: Metrics
library(Metrics)

# Realizar predicciones en el conjunto de prueba
predicciones <- predict(modelo, newdata = test_data)

# Asegúrate de reemplazar 'preciom' con el nombre real de tu columna de precio en test_data
# Calcular el Error Cuadrático Medio (MSE)
mse <- mse(test_data$preciom, predicciones)

# Calcular el Error Absoluto Medio (MAE)
mae <- mae(test_data$preciom, predicciones)

# Calcular el R2 Score
ss_total <- sum((test_data$preciom - mean(test_data$preciom))^2)
ss_residual <- sum((test_data$preciom - predicciones)^2)
r2 <- 1 - ss_residual / ss_total

# Imprimir las métricas
print(paste("Mean Squared Error (MSE):", mse))
## [1] "Mean Squared Error (MSE): 24497.4927923824"
print(paste("Mean Absolute Error (MAE):", mae))
## [1] "Mean Absolute Error (MAE): 101.884310171561"
print(paste("R^2 Score:", r2))
## [1] "R^2 Score: 0.615159675894746"

Los resultados de las métricas de evaluación para tu modelo de regresión lineal basado en las predicciones del conjunto de prueba son los siguientes:

  • Mean Squared Error (MSE): 24497.49 - El MSE es una medida de la calidad de un estimador; es siempre no negativo, y los valores más pequeños son mejores. Un MSE de aproximadamente 24497 indica que, en promedio, el cuadrado de la diferencia entre los valores predichos y los reales es de 24497. Esta es una medida de error que considera tanto la varianza como el sesgo del estimador. Sin embargo, sin un contexto sobre la escala de la variable de precios y comparándolo con la variabilidad inherente a esos precios, es difícil juzgar si este es un buen resultado. La interpretación directa del MSE puede ser desafiante debido a que está en unidades cuadradas de la variable predicha.

  • Mean Absolute Error (MAE): 101.88 - El MAE promedio es de aproximadamente 101.88 millones de pesos (asumiendo que la unidad de medida de preciom es millones de pesos, como se ha manejado en el problema). A diferencia del MSE, el MAE proporciona una idea más intuitiva del error promedio absoluto de las predicciones. Un MAE de 101.88 sugiere que, en promedio, las predicciones del modelo se desvían en 101.88 millones de pesos del valor real, ya sea por encima o por debajo.

  • R^2 Score: 0.6152 - El coeficiente de determinación \(R^2\) es de aproximadamente 0.615, lo que indica que el modelo es capaz de explicar el 61.52% de la variabilidad observada en los precios de las viviendas en el conjunto de prueba. Este es un indicador de la bondad de ajuste del modelo; cuanto más cercano a 1, mejor es el modelo para explicar los datos. Un \(R^2\) de 0.615 es moderadamente alto, sugiriendo que el modelo tiene una capacidad razonable para predecir el precio de las viviendas, aunque todavía hay un margen para la mejora.

En resumen, el modelo tiene un desempeño decente pero no excelente en la predicción del precio de las viviendas. Mientras que el \(R^2\) sugiere una capacidad moderada de explicación, los valores de MSE y MAE indican que hay errores significativos en las predicciones. Esto podría deberse a la complejidad inherente de los datos, la presencia de factores no considerados en el modelo o la necesidad de explorar modelos más sofisticados o transformaciones de datos para mejorar las predicciones.