# Cargar la base de datos
data <- read.csv("C:\\Users\\joseo\\Downloads\\HousePriceData.csv")
# 1. Eliminar columna de observación (no aporta al modelo)
data$Observation <- NULL
# 2. Limpieza, hay valores negativos en el summary original (-110)
# Los convertiremos al valor absoluto o a la media.
data$Rainfall <- abs(data$Rainfall)
# Vamos a omitirlas formalmente para que no causen errores.
data <- na.omit(data)
str(data)
## 'data.frame': 898 obs. of 9 variables:
## $ Dist_Taxi : int 9796 8294 11001 8301 10510 6665 13153 5882 7495 8233 ...
## $ Dist_Market : int 5250 8186 14399 11188 12629 5142 11869 9948 11589 7067 ...
## $ Dist_Hospital: int 10703 12694 16991 12289 13921 9972 17811 13315 13370 11400 ...
## $ Carpet : int 1659 1461 1340 1451 1770 1442 1542 1261 1090 1030 ...
## $ Builtup : int 1961 1752 1609 1748 2111 1733 1858 1507 1321 1235 ...
## $ Parking : chr "Open" "Not Provided" "Not Provided" "Covered" ...
## $ City_Category: chr "CAT B" "CAT B" "CAT A" "CAT B" ...
## $ Rainfall : int 530 210 720 620 450 760 1030 1020 680 1130 ...
## $ House_Price : int 6649000 3982000 5401000 5373000 4662000 4526000 7224000 3772000 4631000 4415000 ...
## - attr(*, "na.action")= 'omit' Named int [1:7] 62 240 425 470 527 547 576
## ..- attr(*, "names")= chr [1:7] "62" "240" "425" "470" ...
summary(data$House_Price)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1492000 4643000 5860500 6092597 7195750 150000000
# Visualización rápida de la variable objetivo
boxplot(data$House_Price, main="Distribución de Precios de Casas", col="lightblue", ylab="USD")
regresion <- lm(House_Price ~
factor(Parking) +
factor(City_Category) +
Dist_Taxi +
Dist_Market +
Dist_Hospital +
Carpet +
Builtup +
Rainfall,
data = data)
summary(regresion)
##
## Call:
## lm(formula = House_Price ~ factor(Parking) + factor(City_Category) +
## Dist_Taxi + Dist_Market + Dist_Hospital + Carpet + Builtup +
## Rainfall, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3587923 -837631 -63409 785633 4577929
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5.571e+06 3.688e+05 15.105 < 2e-16 ***
## factor(Parking)No Parking -6.170e+05 1.393e+05 -4.430 1.06e-05 ***
## factor(Parking)Not Provided -5.077e+05 1.239e+05 -4.097 4.57e-05 ***
## factor(Parking)Open -2.597e+05 1.131e+05 -2.297 0.0219 *
## factor(City_Category)CAT B -1.883e+06 9.641e+04 -19.530 < 2e-16 ***
## factor(City_Category)CAT C -2.902e+06 1.062e+05 -27.322 < 2e-16 ***
## Dist_Taxi 2.832e+01 2.694e+01 1.051 0.2934
## Dist_Market 1.241e+01 2.089e+01 0.594 0.5526
## Dist_Hospital 5.073e+01 3.021e+01 1.679 0.0935 .
## Carpet 9.907e+03 1.428e+02 69.402 < 2e-16 ***
## Builtup -7.575e+03 2.412e+02 -31.405 < 2e-16 ***
## Rainfall -1.037e+02 1.552e+02 -0.668 0.5043
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1228000 on 886 degrees of freedom
## Multiple R-squared: 0.9429, Adjusted R-squared: 0.9422
## F-statistic: 1329 on 11 and 886 DF, p-value: < 2.2e-16
Basado en el resumen del modelo (\(R^2\) de 0.94): El modelo explica el 94.2% de la variación del precio, lo cual es excepcionalmente alto. Variables Críticas: Carpet (Área interna) y City_Category son los predictores más fuertes. El coeficiente de Builtup es negativo (\(-7,575\)). Esto ocurre por la multicolinealidad con Carpet. Cuando ambas crecen juntas, el modelo intenta compensar el peso de una con la otra.
# Definir los datos de la nueva casa
casa_nueva <- data.frame(
Parking = "Covered",
City_Category = "CAT A",
Dist_Taxi = 5000,
Dist_Market = 8000,
Dist_Hospital = 10000,
Carpet = 1600,
Builtup = 1900,
Rainfall = 600
)
# Realizar la predicción
prediccion_precio <- predict(regresion, casa_nueva)
cat("El valor estimado de la propiedad es de:", round(prediccion_precio, 2), "USD")
## El valor estimado de la propiedad es de: 7715207 USD
Ubicación sobre todo: Estar en CAT B o CAT C reduce el precio en millones respecto a CAT A.
Cada unidad adicional de Carpet aumenta el precio en aproximadamente $9,907 USD.
Variables como Rainfall y Dist_Market tienen un p-value mayor a 0.05, lo que sugiere que no son significativas y podrían eliminarse para simplificar el modelo sin perder mucha precisión.