Η συλλογή δεδομένων που επεξεργαζόμαστε αφορά της αγορές ακινήτων. Στόχος μας να αναπτύξουμε ένα στατιστικό μοντέλο το οποίο θα μπορεί να προβλέψει την αξία ενός ακινήτου ανά τετραγωνικό . Για να το πετύχουμε αυτό , θα εξετάσουμε ανεξάρτητες μεταβλητές όπως :
library(ggplot2)
real_estate <- read.csv("Real estate.csv")
real_estate <- real_estate[,-1]
str(real_estate)
## 'data.frame': 414 obs. of 7 variables:
## $ X1.transaction.date : num 2013 2013 2014 2014 2013 ...
## $ X2.house.age : num 32 19.5 13.3 13.3 5 7.1 34.5 20.3 31.7 17.9 ...
## $ X3.distance.to.the.nearest.MRT.station: num 84.9 306.6 562 562 390.6 ...
## $ X4.number.of.convenience.stores : int 10 9 5 5 5 3 7 6 1 3 ...
## $ X5.latitude : num 25 25 25 25 25 ...
## $ X6.longitude : num 122 122 122 122 122 ...
## $ Y.house.price.of.unit.area : num 37.9 42.2 47.3 54.8 43.1 32.1 40.3 46.7 18.8 22.1 ...
head(real_estate)
## X1.transaction.date X2.house.age X3.distance.to.the.nearest.MRT.station
## 1 2012.917 32.0 84.87882
## 2 2012.917 19.5 306.59470
## 3 2013.583 13.3 561.98450
## 4 2013.500 13.3 561.98450
## 5 2012.833 5.0 390.56840
## 6 2012.667 7.1 2175.03000
## X4.number.of.convenience.stores X5.latitude X6.longitude
## 1 10 24.98298 121.5402
## 2 9 24.98034 121.5395
## 3 5 24.98746 121.5439
## 4 5 24.98746 121.5439
## 5 5 24.97937 121.5425
## 6 3 24.96305 121.5125
## Y.house.price.of.unit.area
## 1 37.9
## 2 42.2
## 3 47.3
## 4 54.8
## 5 43.1
## 6 32.1
Στην συνέχεια θα προχωρήσουμε στην δημιουργία μερικών διαγραμμάτων για να δούμε οπτικά πως σχετίζονται οι ανεξάρτητες μεταβλητές με την τιμή του ακινήτου. Ακόμα θα υπολογίσουμε τις συσχετίσεις για να έχουμε μια μαθηματική εικόνα για τις πιο «δυνατές» μεταβλητές του μοντέλου μας.
ggplot(real_estate, aes(x = X3.distance.to.the.nearest.MRT.station, y = Y.house.price.of.unit.area)) +
geom_point(color = "blue", alpha = 0.6) +
labs(title = "Σχέση Απόστασης από το Μετρό και Τιμής Ακινήτου",
x = "Απόσταση από σταθμό Μετρό (μέτρα)",
y = "Τιμή ανά μονάδα εμβαδού") +
theme_minimal()
ggplot(real_estate, aes(x = X2.house.age , y= Y.house.price.of.unit.area))+
geom_point(color= "blue", alpha = 0.6)+
labs(title = "Σχέση ηλικίας Ακινήτου και την τιμή του",
x= "Ηλικία ακινήτου",
y = "Τιμή ανά μονάδα εμβαδού") +
theme_minimal()
ggplot(real_estate, aes(x = as.factor(X4.number.of.convenience.stores), y = Y.house.price.of.unit.area)) +
geom_boxplot(fill = "orange", alpha = 0.7) +
labs(title = "Κατανομή Τιμής Ακινήτου ανάλογα με τον Αριθμό Καταστημάτων",
x = "Αριθμός καταστημάτων ευκολίας",
y = "Τιμή ανά μονάδα εμβαδού") +
theme_minimal()
simple_model <- lm(Y.house.price.of.unit.area ~ X3.distance.to.the.nearest.MRT.station, data = real_estate)
summary(simple_model)
##
## Call:
## lm(formula = Y.house.price.of.unit.area ~ X3.distance.to.the.nearest.MRT.station,
## data = real_estate)
##
## Residuals:
## Min 1Q Median 3Q Max
## -35.396 -6.007 -1.195 4.831 73.483
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 45.8514271 0.6526105 70.26 <2e-16
## X3.distance.to.the.nearest.MRT.station -0.0072621 0.0003925 -18.50 <2e-16
##
## (Intercept) ***
## X3.distance.to.the.nearest.MRT.station ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 10.07 on 412 degrees of freedom
## Multiple R-squared: 0.4538, Adjusted R-squared: 0.4524
## F-statistic: 342.2 on 1 and 412 DF, p-value: < 2.2e-16
SSE_simple <- sum(simple_model$residuals^2)
cat("Το SSE του απλού μοντέλου είναι:", SSE_simple, "\n")
## Το SSE του απλού μοντέλου είναι: 41766.7
RMSE_simple <- sqrt(SSE_simple / nrow(real_estate))
cat("Το RMSE του απλού μοντέλου είναι:", RMSE_simple, "\n")
## Το RMSE του απλού μοντέλου είναι: 10.04419
model2 <- lm(Y.house.price.of.unit.area ~ X2.house.age + X3.distance.to.the.nearest.MRT.station, data = real_estate)
summary(model2)
##
## Call:
## lm(formula = Y.house.price.of.unit.area ~ X2.house.age + X3.distance.to.the.nearest.MRT.station,
## data = real_estate)
##
## Residuals:
## Min 1Q Median 3Q Max
## -36.032 -4.742 -1.037 4.533 71.930
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 49.8855858 0.9677644 51.547 < 2e-16
## X2.house.age -0.2310266 0.0420383 -5.496 6.84e-08
## X3.distance.to.the.nearest.MRT.station -0.0072086 0.0003795 -18.997 < 2e-16
##
## (Intercept) ***
## X2.house.age ***
## X3.distance.to.the.nearest.MRT.station ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 9.73 on 411 degrees of freedom
## Multiple R-squared: 0.4911, Adjusted R-squared: 0.4887
## F-statistic: 198.3 on 2 and 411 DF, p-value: < 2.2e-16
model3 <- lm(Y.house.price.of.unit.area ~ X2.house.age + X3.distance.to.the.nearest.MRT.station + X4.number.of.convenience.stores, data = real_estate)
summary(model3)
##
## Call:
## lm(formula = Y.house.price.of.unit.area ~ X2.house.age + X3.distance.to.the.nearest.MRT.station +
## X4.number.of.convenience.stores, data = real_estate)
##
## Residuals:
## Min 1Q Median 3Q Max
## -37.304 -5.430 -1.738 4.325 77.315
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 42.977286 1.384542 31.041 < 2e-16
## X2.house.age -0.252856 0.040105 -6.305 7.47e-10
## X3.distance.to.the.nearest.MRT.station -0.005379 0.000453 -11.874 < 2e-16
## X4.number.of.convenience.stores 1.297443 0.194290 6.678 7.91e-11
##
## (Intercept) ***
## X2.house.age ***
## X3.distance.to.the.nearest.MRT.station ***
## X4.number.of.convenience.stores ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 9.251 on 410 degrees of freedom
## Multiple R-squared: 0.5411, Adjusted R-squared: 0.5377
## F-statistic: 161.1 on 3 and 410 DF, p-value: < 2.2e-16
model4 <- lm(Y.house.price.of.unit.area ~ X2.house.age + X3.distance.to.the.nearest.MRT.station + X4.number.of.convenience.stores + X5.latitude, data = real_estate)
summary(model4)
##
## Call:
## lm(formula = Y.house.price.of.unit.area ~ X2.house.age + X3.distance.to.the.nearest.MRT.station +
## X4.number.of.convenience.stores + X5.latitude, data = real_estate)
##
## Residuals:
## Min 1Q Median 3Q Max
## -34.522 -5.292 -1.579 4.264 76.466
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -5.916e+03 1.113e+03 -5.317 1.74e-07
## X2.house.age -2.687e-01 3.893e-02 -6.903 1.95e-11
## X3.distance.to.the.nearest.MRT.station -4.175e-03 4.928e-04 -8.473 4.37e-16
## X4.number.of.convenience.stores 1.165e+00 1.897e-01 6.141 1.94e-09
## X5.latitude 2.386e+02 4.456e+01 5.355 1.43e-07
##
## (Intercept) ***
## X2.house.age ***
## X3.distance.to.the.nearest.MRT.station ***
## X4.number.of.convenience.stores ***
## X5.latitude ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 8.954 on 409 degrees of freedom
## Multiple R-squared: 0.5711, Adjusted R-squared: 0.5669
## F-statistic: 136.2 on 4 and 409 DF, p-value: < 2.2e-16
model5 <- lm(Y.house.price.of.unit.area ~ X2.house.age + X3.distance.to.the.nearest.MRT.station + X4.number.of.convenience.stores + X5.latitude + X6.longitude, data = real_estate)
summary(model5)
##
## Call:
## lm(formula = Y.house.price.of.unit.area ~ X2.house.age + X3.distance.to.the.nearest.MRT.station +
## X4.number.of.convenience.stores + X5.latitude + X6.longitude,
## data = real_estate)
##
## Residuals:
## Min 1Q Median 3Q Max
## -34.546 -5.267 -1.600 4.247 76.372
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -4.946e+03 6.211e+03 -0.796 0.426
## X2.house.age -2.689e-01 3.900e-02 -6.896 2.04e-11
## X3.distance.to.the.nearest.MRT.station -4.259e-03 7.233e-04 -5.888 8.17e-09
## X4.number.of.convenience.stores 1.163e+00 1.902e-01 6.114 2.27e-09
## X5.latitude 2.378e+02 4.495e+01 5.290 2.00e-07
## X6.longitude -7.805e+00 4.915e+01 -0.159 0.874
##
## (Intercept)
## X2.house.age ***
## X3.distance.to.the.nearest.MRT.station ***
## X4.number.of.convenience.stores ***
## X5.latitude ***
## X6.longitude
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 8.965 on 408 degrees of freedom
## Multiple R-squared: 0.5712, Adjusted R-squared: 0.5659
## F-statistic: 108.7 on 5 and 408 DF, p-value: < 2.2e-16
SSE_multi <- sum(model4$residuals^2)
cat("Το SSE του πολλαπλού μοντέλου είναι:", SSE_multi, "\n")
## Το SSE του πολλαπλού μοντέλου είναι: 32791.59
RMSE_multi <- sqrt(SSE_multi / nrow(real_estate))
cat("Το RMSE του πολλαπλού μοντέλου είναι:", RMSE_multi, "\n")
## Το RMSE του πολλαπλού μοντέλου είναι: 8.899817
Από την παραπάνω διερευνητική ανάλυση και τα οπτικά μέσα που χρησιμοποιήσαμε , εξάγουμε τα εξής συμπεράσματα πριν καν προχωρήσουμε την μοντελοποίηση:
Διάγραμμα Διασποράς (X2.house.age):
Εξετάζοντας τη σχέση μεταξύ της ηλικίας του ακινήτου και της τιμής του,
παρατηρούμε μια γενικά αρνητική τάση, αν και με αρκετή διασπορά. Τα
νεόδμητα σπίτια (ηλικίας 0-5 ετών) τείνουν να συγκεντρώνουν τις
υψηλότερες τιμές πώλησης. Καθώς η ηλικία αυξάνεται, η τιμή φαίνεται να
υποχωρεί σταδιακά, γεγονός που είναι απολύτως λογικό στην αγορά ακινήτων
λόγω παλαιότητας και ανάγκης για μελλοντικές ανακαινίσεις.
Διάγραμμα Διασποράς
(X3.distance.to.the.nearest.MRT.station):
Οπτικοποιώντας τη σχέση τιμής και απόστασης από το μετρό, επιβεβαιώνεται
η αρνητική τάση. Παρατηρούμε ότι τα ακίνητα που βρίσκονται σε ακτίνα
κάτω των 1000 μέτρων από το μετρό έχουν αισθητά υψηλότερες τιμές, ενώ
καθώς η απόσταση αυξάνεται, οι τιμές συμπιέζονται προς τα κάτω.
Θηκόγραμμα
(X4.number.of.convenience.stores): Η ανάλυση της
τιμής σε σχέση με τον αριθμό των καταστημάτων δείχνει μια σαφή,
κλιμακωτή αύξηση της διάμεσης τιμής (η μεσαία γραμμή στα “κουτιά”) όσο
αυξάνονται τα διαθέσιμα καταστήματα στη γύρω περιοχή. Αυτό υποδεικνύει
ότι η εμπορικότητα της περιοχής αποτελεί ισχυρό παράγοντα διαμόρφωσης
της αξίας των ακινήτων.
Επιλογή μεταβλητών: Το βέλτιστο μοντέλο μας χρησιμοποιεί 4 ανεξάρτητες μεταβλητές (ηλικία, απόσταση από μετρό, αριθμός καταστημάτων, γεωγραφικό πλάτος).Όλες αυτές οι μεταβλητές είναι στατιστικά σημαντικές (p-value< 0.05).
Ερμηνεία R-squared: Το Multiple R-squared του μοντέλου (model4) ανέρχεται περίπου στο 0.5669, που σημαίνει ότι το 56.69% της μεταβλητότητας στην τιμή των ακινήτων εξηγείται από αυτόν τον συνδυασμό παραγόντων.Είναι μια σημαντική βελτιώση σε σχέση με το απλό μοντέλο (που είχε μόνο την απόσταση από το μετρό).
Σύγκριση Σφαλμάτων (SSE): Το SSE μειώθηκε αισθητά σε σχέση με το αρχικό μοντέλο απλής παλιδρόμησης, υποδεικνύοντας ότι οι προβλέψεις μας είναι πλέον πολύ πιο κοντά στις πραγματικές τιμές. Αφαιρώντας τις μη σημαντικές μεταβλητές από το αρχικό πολλαπλό μοντέλο, καταφέραμε να διατηρήσουμε την ακρίβεια αποφεύγοντας το overfitting