Σε αυτή την ανάλυση μελετάμε δεδομένα από την αγορά ακινήτων, με στόχο τη δημιουργία μοντέλων γραμμικής παλινδρόμησης για την πρόβλεψη της τιμής ανά τετραγωνικό μέτρο. Το link για το dataset μπορείτε να το βρείτε εδώ: dataset link. Το dataset περιέχει 414 εγγραφές και απαρτίζεται από 8 διαφορετικές στήλες/χαρακτηριστικά.
| Μεταβλητή (όνομα στο dataset) | Περιγραφή | Μονάδα Μέτρησης |
|---|---|---|
X1 transaction date |
Ημερομηνία συναλλαγής | έτος.μήνας (π.χ. 2012.917) |
X2 house age |
Ηλικία κατοικίας | έτη |
X3 distance to the nearest MRT station |
Απόσταση από κοντινότερο σταθμό μετρό | μέτρα |
X4 number of convenience stores |
Πλήθος κοντινών καταστημάτων (π.χ. μίνι μάρκετ) | αριθμός |
X5 latitude |
Γεωγραφικό πλάτος του ακινήτου | δεκαδικός βαθμός (°) |
X6 longitude |
Γεωγραφικό μήκος του ακινήτου | δεκαδικός βαθμός (°) |
Y house price of unit area |
Τιμή ανά τετραγωνικό μέτρο του ακινήτου | χιλιάδες TWD/m² (ΝΤ$/m²) |
## 'data.frame': 414 obs. of 8 variables:
## $ No : int 1 2 3 4 5 6 7 8 9 10 ...
## $ X1.transaction.date : int 2013 2013 2014 2014 2013 2013 2013 2013 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 ...
Σε αυτή την ενότητα μελετάμε μερικές από τις πιο ενδιαφέρουσες συσχετίσεις μεταξύ μεταβλητών.
Σχόλιο: Δεν φαίνεται να υπάρχει ξεκάθαρη γραμμική συσχέτιση ανάμεσα στην ηλικία του σπιτιού και την τιμή του. Παρ’ όλα αυτά, διακρίνεται μια τάση τα νεότερα σπίτια (0–10 έτη) να συγκεντρώνουν μερικές από τις υψηλότερες τιμές, αν και υπάρχουν και αρκετές εξαιρέσεις.
Σχόλιο: Υπάρχει σαφής αρνητική συσχέτιση: όσο μικραίνει η απόσταση από τον σταθμό MRT, τόσο αυξάνεται η τιμή ανά τ.μ. Αυτό υποδεικνύει πως η εγγύτητα σε μέσα μαζικής μεταφοράς αποτελεί σημαντικό παράγοντα στην αποτίμηση ακινήτων.
Σχόλιο: Όσο περισσότερα τα καταστήματα στην περιοχή, τόσο μικρότερη τείνει να είναι η απόσταση από MRT — πιθανώς ένδειξη κεντρικότερης τοποθεσίας.
Σχόλιο: Η πλειοψηφία των ακινήτων κινείται μεταξύ 20 και 50 χιλ. NT$/m². Υπάρχει κάποια συγκέντρωση γύρω από τις 40 μονάδες, υποδηλώνοντας τυπική εμπορική αξία ανά περιοχή.
Σχόλιο: Το γράφημα δείχνει τη συνολική κατανομή των συναλλαγών ανά έτος. Παρατηρείται ότι οι περισσότερες αγοραπωλησίες πραγματοποιήθηκαν το 2013, γεγονός που μπορεί να συνδέεται με τάσεις της αγοράς ή φορολογικά/οικονομικά κίνητρα εκείνης της χρονιάς.
Επειδή ετύχε να μην μου παρέχονται ως ξεχωριστά αρχεία τα train και test από το Kaggle παρά μόνο ένα συνολικό csv, πρέπει εγώ να μοιράσω τα δεδομένα μου έτσι ώστε να κρατήσω κάποια και για το test στο οποίο θα κάνω την πρόβλεψή μου.
set.seed(21106)
split <- sample.split(dataset_realEstate$Y.house.price.of.unit.area, SplitRatio = 0.75)
train_set <- subset(dataset_realEstate, split == TRUE)
test_set <- subset(dataset_realEstate, split == FALSE)
Παρακάτω βλέπουμε πόσες εγγραφές εν τέλει μπήκαν στο train και πόσες στο test
nrow(train_set)
## [1] 310
nrow(test_set)
## [1] 104
y = 45.70 - 0.0073 * x1
y = a + b₁ × Απόσταση από Μετρό
## # A tibble: 310 × 9
## .rownames Y.house.price.of.unit.area X3.distance.to.the.nea…¹ .fitted .resid
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 1 37.9 84.9 45.1 -7.18
## 2 2 42.2 307. 43.4 -1.25
## 3 3 47.3 562. 41.6 5.74
## 4 4 54.8 562. 41.6 13.2
## 5 5 43.1 391. 42.8 0.274
## 6 6 32.1 2175. 29.7 2.43
## 7 8 46.7 288. 43.6 3.11
## 8 10 22.1 1783. 32.6 -10.5
## 9 11 41.4 405. 42.7 -1.32
## 10 12 58.1 90.5 45.0 13.1
## # ℹ 300 more rows
## # ℹ abbreviated name: ¹X3.distance.to.the.nearest.MRT.station
## # ℹ 4 more variables: .hat <dbl>, .sigma <dbl>, .cooksd <dbl>, .std.resid <dbl>
## # A tibble: 1 × 12
## r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.431 0.429 10.2 233. 1.37e-39 1 -1160. 2326. 2337.
## # ℹ 3 more variables: deviance <dbl>, df.residual <int>, nobs <int>
y = 50.22 - 0.0072 * x1 - 0.25 * x2
y = a + b₁ × Απόσταση από Μετρό + b₂ × Ηλικία Κατοικίας
## # A tibble: 1 × 12
## r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.478 0.474 9.82 140. 5.05e-44 2 -1146. 2301. 2316.
## # ℹ 3 more variables: deviance <dbl>, df.residual <int>, nobs <int>
y = 43.84 - 0.0055 * x1 - 0.26 * x2 + 1.18 * x3
y = a + b₁ × Απόσταση από Μετρό + b₂ × Ηλικία Κατοικίας + b₃ × Αριθμός Καταστημάτων
## # A tibble: 1 × 12
## r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.521 0.516 9.42 111. 1.43e-48 3 -1133. 2276. 2295.
## # ℹ 3 more variables: deviance <dbl>, df.residual <int>, nobs <int>
y = -6.12e+03 - 4.36e-03 * x1 - 2.87e-01 * x2 + 1.05e+00 * x3 + 2.47e+02 * x4
y = a + b₁ × Απόσταση από Μετρό + b₂ × Ηλικία Κατοικίας + b₃ × Αριθμός Καταστημάτων + b₄ × Γεωγραφικό Πλάτος
## # A tibble: 1 × 12
## r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.555 0.549 9.10 94.9 2.32e-52 4 -1122. 2256. 2278.
## # ℹ 3 more variables: deviance <dbl>, df.residual <int>, nobs <int>
y = -4.89e+03 - 4.46e-03 * x1 - 2.87e-01 * x2 + 1.05e+00 * x3 + 2.46e+02 * x4 - 9.95e+00 * x5
y = a + b₁ × Απόσταση από Μετρό + b₂ × Ηλικία Κατοικίας + b₃ × Αριθμός Καταστημάτων + b₄ × Γεωγραφικό Πλάτος + b₅ × Γεωγραφικό Μήκος
## # A tibble: 1 × 12
## r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.555 0.547 9.11 75.7 2.38e-51 5 -1122. 2258. 2284.
## # ℹ 3 more variables: deviance <dbl>, df.residual <int>, nobs <int>
y = -1.40e+04 - 4.91e-03 * x1 - 2.85e-01 * x2 + 1.04e+00 * x3 + 2.29e+02 * x4 - 1.95e+01 * x5 + 5.32e+00 * x6
y = a + b₁ × Απόσταση από Μετρό + b₂ × Ηλικία Κατοικίας + b₃ × Αριθμός Καταστημάτων + b₄ × Γεωγραφικό Πλάτος + b₅ × Γεωγραφικό Μήκος + b₆ × Έτος Συναλλαγής
## # A tibble: 1 × 12
## r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.574 0.566 8.92 68.1 2.56e-53 6 -1115. 2246. 2275.
## # ℹ 3 more variables: deviance <dbl>, df.residual <int>, nobs <int>
##
## Call:
## lm(formula = Y.house.price.of.unit.area ~ X3.distance.to.the.nearest.MRT.station +
## X2.house.age + X4.number.of.convenience.stores + X5.latitude +
## X6.longitude + X1.transaction.date, data = train_set)
##
## Residuals:
## Min 1Q Median 3Q Max
## -33.875 -5.062 -0.769 4.053 76.328
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.404e+04 7.569e+03 -1.855 0.064571
## X3.distance.to.the.nearest.MRT.station -4.914e-03 8.366e-04 -5.874 1.12e-08
## X2.house.age -2.855e-01 4.529e-02 -6.304 1.02e-09
## X4.number.of.convenience.stores 1.050e+00 2.168e-01 4.840 2.07e-06
## X5.latitude 2.299e+02 5.064e+01 4.540 8.13e-06
## X6.longitude -1.957e+01 5.710e+01 -0.343 0.731992
## X1.transaction.date 5.326e+00 1.427e+00 3.734 0.000225
##
## (Intercept) .
## X3.distance.to.the.nearest.MRT.station ***
## X2.house.age ***
## X4.number.of.convenience.stores ***
## X5.latitude ***
## X6.longitude
## X1.transaction.date ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 8.922 on 303 degrees of freedom
## Multiple R-squared: 0.5742, Adjusted R-squared: 0.5658
## F-statistic: 68.11 on 6 and 303 DF, p-value: < 2.2e-16
Σημείωση1: Όλα τις παραπάνω εξισώσεις τις έβγαλα με την εντολή coef() και μέσα έβαζα το αντίστοιχο μοντέλο κάθε φορά για να βρω τους συντελεστές.
Σημείωση2: Άφησα να φαίνεται το summary() μόνο στο τελευταίο μοντέλο που είναι το πλήρες και έχει μέσα όλες τις ανεξάρτητες μεταβλητές ώστε να μπορείς να δεις από τα αστεράκια ποιες είναι οι πιο επιδραστικές μεταβλητές (παρακάτω μιλάω πιο αναλυτικά), επίσης σε όλα τα ενδιάμεσα μοντέλα απλά αφήσα να φαίνεται η glance() και τέλος μόνο στο 1ο μοντέλο άφησα να φαίνεται και η augment() για επίδειξη των μεθόδων.
Σημείωση3: Διάγραμμα και γραφική παράσταση έβγαλα μόνο για το 1ο μοντέλο εφόσον μόνο σε τόσες διαστάσεις μπορούμε να δείξουμε για το μοντέλο στο R Studio.
| Model | R_squared | SSE | Fstat | RMSE | RSE |
|---|---|---|---|---|---|
| m1 | 0.4309 | 32242.64 | 233.2168 | 10.1985 | 10.2315 |
| m2 | 0.4777 | 29592.91 | 140.3812 | 9.7704 | 9.8180 |
| m3 | 0.5206 | 27162.22 | 110.7580 | 9.3606 | 9.4215 |
| m4 | 0.5546 | 25234.17 | 94.9493 | 9.0222 | 9.0959 |
| m5 | 0.5547 | 25231.74 | 75.7235 | 9.0218 | 9.1104 |
| m6 | 0.5742 | 24122.02 | 68.1120 | 8.8212 | 8.9225 |
##
## Call:
## lm(formula = Y.house.price.of.unit.area ~ X3.distance.to.the.nearest.MRT.station +
## X2.house.age + X4.number.of.convenience.stores + X5.latitude +
## X6.longitude + X1.transaction.date, data = train_set)
##
## Residuals:
## Min 1Q Median 3Q Max
## -33.875 -5.062 -0.769 4.053 76.328
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.404e+04 7.569e+03 -1.855 0.064571
## X3.distance.to.the.nearest.MRT.station -4.914e-03 8.366e-04 -5.874 1.12e-08
## X2.house.age -2.855e-01 4.529e-02 -6.304 1.02e-09
## X4.number.of.convenience.stores 1.050e+00 2.168e-01 4.840 2.07e-06
## X5.latitude 2.299e+02 5.064e+01 4.540 8.13e-06
## X6.longitude -1.957e+01 5.710e+01 -0.343 0.731992
## X1.transaction.date 5.326e+00 1.427e+00 3.734 0.000225
##
## (Intercept) .
## X3.distance.to.the.nearest.MRT.station ***
## X2.house.age ***
## X4.number.of.convenience.stores ***
## X5.latitude ***
## X6.longitude
## X1.transaction.date ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 8.922 on 303 degrees of freedom
## Multiple R-squared: 0.5742, Adjusted R-squared: 0.5658
## F-statistic: 68.11 on 6 and 303 DF, p-value: < 2.2e-16
Κάνοντας summary το μοντέλο 6 που περιλαμβάνει όλες τις ανεξάρτητες μεταβλητές, βλέπουμε ότι την λιγότερη επιδραστικότητα έχει η μεταβλητή longitude (γεωγραφικό μήκος) και όντως αυτό το παρατηρούμε και στα διαγράμματα κατά τα οποία όταν από το model4 πήγαμε στο model5 και προσθέσαμε αυτήν την μεταβλητή οι γραμμές στο γραφήματα φανερώνουν πολύ μικρές αλλαγές ακρίβειας και λάθους, έως και ελάχιστες.
Οπότε για να έχουμε το πιο στοιβαρό μοντέλο που πετυχαίνει όμως το ίδιο ικανοποιητικό βαθμό ακρίβειας, απλά από το 6ο που τις περιλαμβάνει όλες αφαιρούμε την μεταβλητή longitude.
y = -1.428e+04 - 4.215e+00 * x1 - 2.689e-01 * x2 + 4.447e-03 * x3 + 1.132e+00 * x4 - 2.339e+02 * x6
y = a + b₁ × Έτος Συναλλαγής + b₂ × Ηλικία Κατοικίας + b₃ × Απόσταση από Μετρό + b₄ × Αριθμός Καταστημάτων + b₆ × Γεωγραφικό Πλάτος
## # A tibble: 1 × 12
## r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.574 0.567 8.91 81.9 2.85e-54 5 -1115. 2244. 2270.
## # ℹ 3 more variables: deviance <dbl>, df.residual <int>, nobs <int>
| Model | R_squared | SSE | Fstat | RMSE | RSE |
|---|---|---|---|---|---|
| m6 | 0.5742 | 24122.02 | 68.1120 | 8.8212 | 8.9225 |
| m7 | 0.5741 | 24131.37 | 81.9488 | 8.8229 | 8.9095 |
# εδώ κάνω την πρόβλεψή μου
TimesAnaTetragoniko_Prediction <- predict(m7, newdata=test_set)
# εδώ υπολογίζω τις κλασσικές μετρικές
SSE_PRED <- sum((TimesAnaTetragoniko_Prediction - test_set$Y.house.price.of.unit.area)^2)
SST_PRED <- sum((mean(train_set$Y.house.price.of.unit.area) - test_set$Y.house.price.of.unit.area)^2)
R2_PRED <- 1 - SSE_PRED/SST_PRED
RMSE_PRED <- sqrt(SSE_PRED/nrow(test_set))
# εδώ υπολογίζω τον μ.ο. της τιμής αν τ.μ. σε όλο το dataset
mesiTimi_ana_t.m. <- mean(dataset_realEstate$Y.house.price.of.unit.area)
| Model | R_squared | SSE | RMSE | SST |
|---|---|---|---|---|
| m6 | 0.5742 | 24122.020 | 8.8212 | 9999.00 |
| m7 | 0.5741 | 24131.375 | 8.8229 | 9999.00 |
| prediction | 0.6084 | 7757.163 | 8.6364 | 19807.87 |
## [1] 37.98019
Κατά μέσο όρο έχουμε ένα σφάλμα 8.6364 χρηματικών μονάδων αν τ.μ., το οποίο μου φαίνεται μεγάλο αν συγκριθεί με τον μ.ο. στα 37.98019 που έχει το dataset
Η ανάλυση ανέδειξε ότι:
Η μελέτη καταλήγει στο συμπέρασμα ότι ένα καλά δομημένο μοντέλο παλινδρόμησης μπορεί να αποτελέσει ένα χρήσιμο εργαλείο εκτίμησης της αξίας ακινήτων, με βάση βασικούς παράγοντες της περιοχής.