To Real Estate Price Prediction κοινοποιήθηκε στο Kaggle, ένα αποθετήριο βάσεων, συνόλων δεδομένων και θεωριών πεδίων. Το Dataset αποτελείται από συναλλαγές ακινήτων στην Ταϊβάν και έχει ως στόχο την πρόβλεψη των τιμών τους ανά τετραγωνικό μέτρο. Οι τιμές βασίζονται σε δεδομένα από τις 31 Αυγούστου 2012 έως και τις 2 Αυγούστου 2013.
Η ανάλυση των δεδομένων του Dataset μπορεί να βοηθήσει στο data-driven decision-making (DDDM) στον κλάδο των ακινήτων. Ουσιαστικά συμβάλλει στην κατανόηση των παραγόντων που επηρεάζουν τις τιμές των ακινήτων, στην πρόβλεψη της αξίας τους και στη βελτιστοποίηση των επενδυτικών στρατηγικών.
| Μεταβλητή | Περιγραφή | Τύπος | Εύρος | Μονάδα Μέτρησης |
|---|---|---|---|---|
| TransactionDate | Ημερομηνία συναλλαγής | Αριθμητική | 2012-08-31 - 2013-08-02 |
|
| HouseAge | Ηλικία του ακινήτου | Αριθμητική | 0 - 43.8 | Έτος |
| MRTdistance | Απόσταση από τον κοντινότερο σταθμό μετρό | Αριθμητική | 23.38 - 6488.02 | Meter(m) |
| NoConvinienceStores | Πλήθος κοντινών καταστημάτων | Αριθμητική | 0 - 10 |
|
| Latitude | Γεωγραφικό πλάτος | Αριθμητική | 24.93207 - 25.01459 |
|
| Longitude | Γεωγραφικό μήκος | Αριθμητική | 121.47353 - 121.56627 |
|
| SQMprice | Τιμή ανά τετραγωνικό μέτρο | Αριθμητική | 7.6 - 117.5 | Dollar($) |
Ελλιπείς Τιμές
cat(sum(is.na(realEstate)))
## 0
Διπλότυπες Εγγραφές
cat(sum(duplicated(realEstate)))
## 0
summary(realEstate)
## TransactionDate HouseAge MRTdistance NoConvinienceStores
## Min. :2012-08-31 Min. : 0.000 Min. : 23.38 Min. : 0.000
## 1st Qu.:2012-12-01 1st Qu.: 9.025 1st Qu.: 289.32 1st Qu.: 1.000
## Median :2013-03-03 Median :16.100 Median : 492.23 Median : 4.000
## Mean :2013-02-23 Mean :17.713 Mean :1083.89 Mean : 4.094
## 3rd Qu.:2013-06-02 3rd Qu.:28.150 3rd Qu.:1454.28 3rd Qu.: 6.000
## Max. :2013-08-02 Max. :43.800 Max. :6488.02 Max. :10.000
## Latitude Longitude SQMprice
## Min. :24.93 Min. :121.5 Min. : 7.60
## 1st Qu.:24.96 1st Qu.:121.5 1st Qu.: 27.70
## Median :24.97 Median :121.5 Median : 38.45
## Mean :24.97 Mean :121.5 Mean : 37.98
## 3rd Qu.:24.98 3rd Qu.:121.5 3rd Qu.: 46.60
## Max. :25.01 Max. :121.6 Max. :117.50
ggplot(realEstate, aes(MRTdistance, SQMprice)) +
geom_point(color = "steelblue") +
labs(title = "Τιμή ανά τ.μ. vs Απόσταση από σταθμό μετρό",
x = "Απόσταση από σταθμό μετρό (m)",
y = "Τιμή ανά τ.μ.($)") +
theme_minimal()
Σχόλιο
Παρατηρείται αρνητική
συσχέτιση μεταξύ των δύο μεταβλητών, δηλαδή όσο
μεγαλύτερη είναι η απόσταση από τον πλησιέστερο σταθμό του
μετρό, τόσο μικρότερη η τιμή του ακινήτου. Αυτό είναι λογικό,
αφού η εύκολη πρόσβαση στις συγκοινωνίες αυξάνει την
εμπορική αξία.
ggplot(realEstate, aes(as.factor(NoConvinienceStores), SQMprice)) +
geom_boxplot(fill = "tomato") +
labs(title = "Κατανομή Τιμής ανά τ.μ. vs Αριθμός Καταστημάτων",
x = "Αριθμός Convenience Stores",
y = "Τιμή ανά τ.μ.($)") +
theme_minimal()
Σχόλιο
Βλέπουμε ότι σε περιοχές με
περισσότερα καταστήματα, η τιμή των ακινήτων τείνει να είναι
υψηλότερη. Η ύπαρξη υποδομών εξυπηρέτησης
φαίνεται πως παίζει σημαντικό ρόλο στη διαμόρφωση των τιμών.
ggplot(realEstate, aes(HouseAge)) +
geom_histogram(binwidth = 1, fill = "darkgreen", color = "white") +
labs(title = "Κατανομή ηλικίας ακινήτων",
x = "Ηλικία (σε έτη)",
y = "Πλήθος") +
theme_minimal()
Σχόλιο
Η πλειοψηφία των σπιτιών δείχνει πως
είναι σχετικά νεόκτιστα (0-20 ετών), κάτι που μπορεί να
επηρεάζει αυξητικά την τιμή τους. Υπάρχει μικρότερος
αριθμός παλαιότερων ακινήτων.
ggplot(realEstate, aes(as.factor(TransactionDate))) +
geom_bar(fill = "purple") +
labs(title = "Αριθμός συναλλαγών ανά ημερομηνία",
x = "Ημερομηνία συναλλαγής",
y = "Πλήθος συναλλαγών") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 50, hjust = 1))
Σχόλιο
Οι συναλλαγές φαίνεται να
συγκεντρώνονται σε συγκεκριμένες χρονικές περιόδους και πιθανόν
να επηρεάζονται από οικονομικούς ή εποχικούς παράγοντες στην αγορά
ακινήτων.
Χωρίζουμε το dataset με τυχαίο τρόπο σε δύο ξεχωριστά αρχεία train και test. Το train αποτελεί το 70% της βάσης και ορίζουμε το seed σε 918 καθιστώντας τον τυχαίο διαχωρισμό train/test σταθερό σε κάθε εκτέλεση του κώδικα. Το train χρησιμοποιείται για τη δημιουργία του μοντέλου μας και το test για να μετρήσουμε πως αυτό λειτουργεί για δεδομένα εκτός του train.
library(caTools)
set.seed(918)
spl = sample(1:nrow(realEstate), size=0.7 * nrow(realEstate))
realEstate_train = realEstate[spl,]
realEstate_test = realEstate[-spl,]
cat("Train set:", nrow(realEstate_train), "καταχωρήσεις | Test set:", nrow(realEstate_test), "καταχωρήσεις")
## Train set: 289 καταχωρήσεις | Test set: 125 καταχωρήσεις
Ο παρακάτω πίνακας δείχνει τους συντελεστές γραμμικής συσχέτισης (Pearson) μεταξύ των διαφόρων μεταβλητών. Όσο πιο κοντά είναι οι τιμές στο +1 ή -1, τόσο ισχυρότερη είναι η θετική ή η αρνητική γραμμική σχέση αντιστοίχως. Για την κατασκευή των μοντέλων, εφαρμόζουμε τη μέθοδο πρόσθεσης μεταβλητών (forward), επιλέγοντας πρώτα τις μεταβλητές που εμφανίζουν τη μεγαλύτερη συσχέτιση (θετική ή αρνητική) με την εξαρτημένη μεταβλητή SQMprice, ταξινομώντας τις με φθίνουσα σειρά σύμφωνα με το μέγεθος της συσχέτισής τους.
| HouseAge | MRTdistance | NoConvinienceStores | Latitude | Longitude | SQMprice | |
|---|---|---|---|---|---|---|
| HouseAge | 1.00 | 0.04 | 0.02 | 0.04 | -0.05 | -0.26 |
| MRTdistance | 0.04 | 1.00 | -0.62 | -0.60 | -0.84 | -0.69 |
| NoConvinienceStores | 0.02 | -0.62 | 1.00 | 0.46 | 0.48 | 0.60 |
| Latitude | 0.04 | -0.60 | 0.46 | 1.00 | 0.45 | 0.56 |
| Longitude | -0.05 | -0.84 | 0.48 | 0.45 | 1.00 | 0.58 |
| SQMprice | -0.26 | -0.69 | 0.60 | 0.56 | 0.58 | 1.00 |
Σχόλια
Την ισχυρότερη αρνητική συσχέτιση με την
SQMprice έχει η MRTdistance (r = -0.67)
Τις ισχυρότερες θετικές συσχετίσεις με την τιμή SQMprice έχουν οι
εξής μεταβλητές:
NoConvinienceStores (r = +0.57)
Latitude (r = +0.55)
Longitude (r = +0.52)
Η HouseAge έχει αδύναμη αρνητική συσχέτιση (-0.21) με την SQMprice και μπορεί να χρησιμοποιηθεί δευτερευόντως.
model1 <- lm(SQMprice ~ MRTdistance, data = realEstate_train)
summary(model1)
##
## Call:
## lm(formula = SQMprice ~ MRTdistance, data = realEstate_train)
##
## Residuals:
## Min 1Q Median 3Q Max
## -35.268 -6.145 -1.026 5.943 33.978
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 45.6335262 0.7534803 60.56 <2e-16 ***
## MRTdistance -0.0070327 0.0004396 -16.00 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 9.743 on 287 degrees of freedom
## Multiple R-squared: 0.4714, Adjusted R-squared: 0.4696
## F-statistic: 256 on 1 and 287 DF, p-value: < 2.2e-16
Σχόλια
Όταν το ακίνητο βρίσκεται δίπλα σε σταθμό μετρό (απόσταση=0), τότε η εκτιμώμενη τιμή ανά τ.μ. είναι περίπου 45,63$ (Intercept Estimate). Για κάθε επιπλέον μέτρο απόστασης από τον σταθμό, η τιμή μειώνεται κατά 0,00703 (MRTdistance Estimate).
Το μοντέλο εξηγεί περίπου το 47.1% της διακύμανσης της τιμής ανά τ.μ. (Multiple R²), μόνο με 1 μεταβλητή.
Κατά μέσο όρο, οι πραγματικές τιμές διαφέρουν από τις προβλεπόμενες κατά περίπου 9.7 μονάδες (Residual standard error - RMSE).
Η μεταβλητή MRTdistance είναι στατιστικά σημαντική καθώς το t-value < 0.001 (***).
model2 <- lm(SQMprice ~ MRTdistance + NoConvinienceStores, data = realEstate_train)
summary(model2)
##
## Call:
## lm(formula = SQMprice ~ MRTdistance + NoConvinienceStores, data = realEstate_train)
##
## Residuals:
## Min 1Q Median 3Q Max
## -36.351 -5.924 -1.039 5.835 29.466
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 38.4328292 1.5466494 24.849 < 2e-16 ***
## MRTdistance -0.0052655 0.0005381 -9.784 < 2e-16 ***
## NoConvinienceStores 1.2648051 0.2403711 5.262 2.8e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 9.32 on 286 degrees of freedom
## Multiple R-squared: 0.5181, Adjusted R-squared: 0.5147
## F-statistic: 153.7 on 2 and 286 DF, p-value: < 2.2e-16
Σχόλια
Με την προσθήκη της μεταβλητής NoConvinienceStores παρατηρούμε πως η εκτιμώμενη τιμή ανά τ.μ. είναι περίπου 38.43$ (Intercept Estimate) όταν MRTdistance=0 και NoConvinienceStores=0. Για κάθε επιπλέον κατάστημα κοντά στο ακίνητο, η τιμή αυξάνεται κατά περίπου 1.26 (NoConvinienceStores Estimate), ενώ για κάθε επιπλέον μέτρο απόστασης από σταθμό μετρό, η τιμή μειώνεται κατά 0,0053 (MRTdistance Estimate).
Το μοντέλο 2 εξηγεί περίπου το 51.8% της διακύμανσης της τιμής (Multiple R²) του ακινήτου, ποσοστό που είναι μεγαλύτερο από το προηγούμενο μοντέλο.
Παρατηρούμε ελαφρώς μικρότερο σφάλμα πρόβλεψης (9.32) σε σχέση με το προηγούμενο μοντέλο (Residual standard error - RMSE).
Η μεταβλητή NoConvinienceStores είναι στατιστικά σημαντική καθώς το t-value < 0.001 (***).
model3 <- lm(SQMprice ~ MRTdistance + NoConvinienceStores + Latitude + Longitude, data = realEstate_train)
summary(model3)
##
## Call:
## lm(formula = SQMprice ~ MRTdistance + NoConvinienceStores + Latitude +
## Longitude, data = realEstate_train)
##
## Residuals:
## Min 1Q Median 3Q Max
## -33.627 -5.637 -1.135 5.217 30.676
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.229e+04 8.028e+03 -1.531 0.126900
## MRTdistance -3.569e-03 9.207e-04 -3.876 0.000132 ***
## NoConvinienceStores 1.152e+00 2.374e-01 4.853 2.01e-06 ***
## Latitude 2.200e+02 5.321e+01 4.135 4.68e-05 ***
## Longitude 5.622e+01 6.401e+01 0.878 0.380512
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 9.08 on 284 degrees of freedom
## Multiple R-squared: 0.5457, Adjusted R-squared: 0.5393
## F-statistic: 85.3 on 4 and 284 DF, p-value: < 2.2e-16
Σχόλια
Το μοντέλο εξηγεί περίπου το 54.5% της διακύμανσης της τιμής (Multiple R²) του ακινήτου, ποσοστό που είναι μεγαλύτερο από το προηγούμενο μοντέλο.
Παρατηρούμε ελαφρώς μικρότερο σφάλμα πρόβλεψης (9.08) σε σχέση με το προηγούμενο μοντέλο (Residual standard error - RMSE).
Η μεταβλητή Latitude είναι στατιστικά σημαντική καθώς το t-value < 0.001 (***), σε αντίθεση με την μεταβλητή Longitude με t-value = 0.38.
model4 <- lm(SQMprice ~ MRTdistance + NoConvinienceStores + Latitude + HouseAge, data = realEstate_train)
summary(model4)
##
## Call:
## lm(formula = SQMprice ~ MRTdistance + NoConvinienceStores + Latitude +
## HouseAge, data = realEstate_train)
##
## Residuals:
## Min 1Q Median 3Q Max
## -34.494 -5.449 -1.214 5.105 34.870
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -5.963e+03 1.228e+03 -4.856 1.98e-06 ***
## MRTdistance -3.844e-03 5.462e-04 -7.037 1.48e-11 ***
## NoConvinienceStores 1.206e+00 2.193e-01 5.500 8.49e-08 ***
## Latitude 2.405e+02 4.917e+01 4.891 1.68e-06 ***
## HouseAge -3.017e-01 4.366e-02 -6.910 3.18e-11 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 8.413 on 284 degrees of freedom
## Multiple R-squared: 0.6101, Adjusted R-squared: 0.6046
## F-statistic: 111.1 on 4 and 284 DF, p-value: < 2.2e-16
Σχόλια
Το μοντέλο αυτό αποτελεί την πιο πλήρη και ακριβή εκδοχή γραμμικής παλινδρόμησης που έχουμε έως τώρα, ενσωματώνοντας τόσο δημογραφικές όσο και γεωγραφικές μεταβλητές. Εξηγεί το 61% της διακύμανσης της τιμής (Multiple R²) του ακινήτου, ποσοστό που είναι μεγαλύτερο από όλα τα προηγούμενα μοντέλα.
Παρατηρούμε μικρότερο σφάλμα πρόβλεψης (8.41) σε σχέση με τα προηγούμενα μοντέλα (Residual standard error - RMSE).
Η μεταβλητή HouseAge είναι στατιστικά σημαντική καθώς το t-value < 0.001 (***).
| Model | RMSE | R_Squared |
|---|---|---|
| SQMprice ~ MRTdistance | 9.71 | 0.4714 |
| SQMprice ~ MRTdistance + NoConvinienceStores | 9.27 | 0.5181 |
| SQMprice ~ MRTdistance + NoConvinienceStores + Latitude + Longitude | 9.00 | 0.5457 |
| SQMprice ~ MRTdistance + NoConvinienceStores + Latitude + HouseAge | 8.34 | 0.6101 |
Επιλέγουμε το μοντέλο 4 για τις προβλέψεις στο test set, καθώς αυτό έχει την μεγαλύτερη τιμή στο R² και το μικρότερο RMSE.
predictTest <- predict(model4, newdata = realEstate_test)
head(predictTest)
## 14 19 20 24 25 30
## 29.85699 45.35872 50.17699 48.41746 34.70367 46.33334
cat("Μέση Τιμή: ", mean(predictTest), "\n", "Πραγματική Μέση Τιμή: ", mean(realEstate_test$SQMprice), "\n", "Εύρος Τιμών: ", range(predictTest))
## Μέση Τιμή: 38.50945
## Πραγματική Μέση Τιμή: 38.3776
## Εύρος Τιμών: 8.759522 54.51496
Η μέση προβλεπόμενη τιμή ανά τετραγωνικό μέτρο είναι 38.51, σχεδόν ίδια με τη πραγματική μέση τιμή των 38.38, κάτι που δείχνει την πολύ καλή ευθυγράμμιση του μοντέλου με τα πραγματικά δεδομένα.
Το μοντέλο προβλέπει τιμές από 8.76 έως 54.51 $/τ.μ., γεγονός που δείχνει καλή διακύμανση και ικανότητα του μοντέλου να ανταποκριθεί σε διαφορετικά προφίλ ακινήτων.
Οι τιμές όπως τα 50.18, 45.36, και 29.86 δείχνουν ότι το μοντέλο μπορεί να χειριστεί τόσο υψηλές όσο και πιο χαμηλές αξίες με σχετική ευελιξία.
SSE_test <- sum((predictTest - realEstate_test$SQMprice)^2)
SST_test <- sum((mean(realEstate_train$SQMprice) - realEstate_test$SQMprice)^2)
cat("R² = ", R2 <- 1 - SSE_test/SST_test, "\n", "RMSE = ", RMSE <- sqrt(SSE_test/nrow(realEstate_test)))
## R² = 0.4867067
## RMSE = 10.11759
Σχόλια
Παρατηρούμε πτώση του R², από 0.6101 στο train set σε 0.487 στο test set, κάτι που σημαίνει πως το μοντέλο δεν μπορεί να προβλέψει με την ίδια ακρίβεια δεδομένα εκτός εκπαίδευσης.
Παρατηρούμε αύξηση του RMSE, από 8.34 στο train set σε 10.12 στο test set, πράγμα που δείχνει ότι το μοντέλο κάνει πιο ανακριβείς προβλέψεις και περισσότερα λάθη όταν αντιμετωπίζει νέα δεδομένα.
Η πιο σύνθετη μορφή του μοντέλου με τις επιπλέον μεταβλητές (Latitude, HouseAge) δείχνει την καλύτερη επίδοση στο training set, αλλά ενδέχεται να χρειάζεται περαιτέρω κανονικοποίηση για τη βελτίωση της απόδοσής του στο test set.
realEstate_test$Predicted_SQMprice <- predictTest
ggplot(realEstate_test, aes(x = Predicted_SQMprice, y = SQMprice)) +
geom_point(color = "steelblue", alpha = 0.7, size = 3) +
geom_smooth(method = "lm", se = FALSE, color = "tomato", linewidth = 1) +
geom_abline(intercept = 0, slope = 1, linetype = "dashed", color = "gray30") + labs(
title = "Μοντέλο 4: Προβλεπόμενη vs Πραγματική Τιμή ανά τ.μ.(Test Set)",
x = "Προβλεπόμενη Τιμή ($/τ.μ.)",
y = "Πραγματική Τιμή ($/τ.μ.)",
caption = "Διακεκομμένη Γραμμή = Τέλεια Πρόβλεψη"
) +
theme_minimal(base_size = 14) +
theme(
plot.title = element_text(face = "bold", hjust = 0.5),
panel.grid.minor = element_blank()
) +
scale_x_continuous(limits = c(0, 60)) +
scale_y_continuous(limits = c(0, 60))
Σχόλια
Κάθε σημείο στο διάγραμμα αντιπροσωπεύει ένα ακίνητο από το dataset. Ο άξονας y δείχνει την πραγματική τιμή του ακινήτου, ενώ ο άξονας x δείχνει την προβλεπόμενη τιμή από το μοντέλο.
Η διακεκομμένη γραμμή είναι η γραμμή ταύτισης (y = x). Αν ένα σημείο βρίσκεται πάνω σε αυτήν, σημαίνει ότι η πρόβλεψη του μοντέλου ήταν ακριβής. Η κόκκινη γραμμή είναι η πραγματική γραμμή παλινδρόμησης, δηλαδή η καλύτερη γραμμική προσαρμογή των σημείων.
Τα περισσότερα σημεία βρίσκονται κοντά στην κόκκινη διαγώνιο, γεγονός που δείχνει ότι το μοντέλο προβλέπει ικανοποιητικά τις τιμές των ακινήτων. Ωστόσο, υπάρχει κάποια διασπορά γύρω από τη διαγώνιο, που δείχνει σφάλματα πρόβλεψης για ορισμένα ακίνητα, ειδικά σε ακραίες τιμές. Η γραμμή παλινδρόμησης τείνει να έχει μικρότερη κλίση από τη γραμμή ταύτισης, κάτι που δείχνει πως το μοντέλο υποτιμά υψηλές και υπερεκτιμά χαμηλές τιμές.
Οι άξονες περιορίζονται στο διάστημα [0, 60], εστιάζοντας στο εύρος όπου βρίσκονται οι περισσότερες παρατηρήσεις.
Το γράφημα δείχνει ότι το μοντέλο αντιλαμβάνεται επαρκώς, αλλά όχι στον μέγιστο βαθμό, την τάση των τιμών, γεγονός που επιβεβαιώνεται και από τα μέτρια αποτελέσματα σε R² και RMSE στο test set.