1. ΔΙΕΥΡΕΥΝΗΣΗ ΤΟΥ DATASET

ΕΙΣΑΓΩΓΗ

Σε αυτή την ανάλυση μελετάμε δεδομένα από την αγορά ακινήτων, με στόχο τη δημιουργία μοντέλων γραμμικής παλινδρόμησης για την πρόβλεψη της τιμής ανά τετραγωνικό μέτρο. Το 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 ...

ΔΙΑΓΡΑΜΜΑΤΑ

Σε αυτή την ενότητα μελετάμε μερικές από τις πιο ενδιαφέρουσες συσχετίσεις μεταξύ μεταβλητών.

1. Scatter Plot: House Age vs Price per Unit Area

Σχόλιο: Δεν φαίνεται να υπάρχει ξεκάθαρη γραμμική συσχέτιση ανάμεσα στην ηλικία του σπιτιού και την τιμή του. Παρ’ όλα αυτά, διακρίνεται μια τάση τα νεότερα σπίτια (0–10 έτη) να συγκεντρώνουν μερικές από τις υψηλότερες τιμές, αν και υπάρχουν και αρκετές εξαιρέσεις.

2. Scatter Plot: Distance to MRT vs Price per Unit Area

Σχόλιο: Υπάρχει σαφής αρνητική συσχέτιση: όσο μικραίνει η απόσταση από τον σταθμό MRT, τόσο αυξάνεται η τιμή ανά τ.μ. Αυτό υποδεικνύει πως η εγγύτητα σε μέσα μαζικής μεταφοράς αποτελεί σημαντικό παράγοντα στην αποτίμηση ακινήτων.

3. Box Plot: Απόσταση από MRT vs Αριθμός Καταστημάτων

Σχόλιο: Όσο περισσότερα τα καταστήματα στην περιοχή, τόσο μικρότερη τείνει να είναι η απόσταση από MRT — πιθανώς ένδειξη κεντρικότερης τοποθεσίας.


4. Histogram: Τιμή ανά Τετραγωνικό Μέτρο

Σχόλιο: Η πλειοψηφία των ακινήτων κινείται μεταξύ 20 και 50 χιλ. NT$/m². Υπάρχει κάποια συγκέντρωση γύρω από τις 40 μονάδες, υποδηλώνοντας τυπική εμπορική αξία ανά περιοχή.


5. Bar Chart: Αριθμός Συναλλαγών ανά Έτος

Σχόλιο: Το γράφημα δείχνει τη συνολική κατανομή των συναλλαγών ανά έτος. Παρατηρείται ότι οι περισσότερες αγοραπωλησίες πραγματοποιήθηκαν το 2013, γεγονός που μπορεί να συνδέεται με τάσεις της αγοράς ή φορολογικά/οικονομικά κίνητρα εκείνης της χρονιάς.


HEATMAP ΣΥΣΧΕΤΙΣΕΩΝ

2. ΔΗΜΙΟΥΡΓΙΑ ΤΩΝ ΜΟΝΤΕΛΩΝ

DATASET SPLIT

Επειδή ετύχε να μην μου παρέχονται ως ξεχωριστά αρχεία τα 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

ΜΟΝΤΕΛΟ με 1 ΜΕΤΑΒΛΗΤΗ

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>

ΜΟΝΤΕΛΟ με 2 ΜΕΤΑΒΛΗΤΕΣ

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>

ΜΟΝΤΕΛΟ με 3 ΜΕΤΑΒΛΗΤΕΣ

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>

ΜΟΝΤΕΛΟ με 4 ΜΕΤΑΒΛΗΤΕΣ

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>

ΜΟΝΤΕΛΟ με 5 ΜΕΤΑΒΛΗΤΕΣ

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>

ΜΟΝΤΕΛΟ με 6 ΜΕΤΑΒΛΗΤΕΣ

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.

3. ΑΞΙΟΛΟΓΗΣΗ ΤΩΝ ΜΟΝΤΕΛΩΝ

ΣΥΓΚΡΙΣΗ ΜΕΤΡΙΚΩΝ

Σύγκριση των 6 διαφορετικών μοντέλων με βάση τις διαθέσιμες μετρικές
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>
Διαπιστώνουμε οτί το μοντέλο που επιλέξαμε είναι το βέλτιστο γιατί ενώ διώξαμε μια μεταβλητή έχουμε ελάχιστες διαφορές από το πλήρες μοντέλο των 6 μεταβλητών
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

4. ΠΡΟΒΛΕΨΗ - ΕΦΑΡΜΟΓΗ ΣΕ ΝΕΑ ΔΕΔΟΜΕΝΑ

# εδώ κάνω την πρόβλεψή μου
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)
Δεν θεωρώ οτί το μοντέλο μας βγήκε εν τελεί καλό αλλά βλέπουμε ότι η πρόβλεψη και τα στατιστικά της κυμαίνονται κοντά και στα 6-7 μοντέλα που φτιάξαμε
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

5. ΣΥΜΠΕΡΑΣΜΑΤΑ

Η ανάλυση ανέδειξε ότι:

  • Η απόσταση από το μετρό είναι καθοριστικός παράγοντας, με αρνητική συσχέτιση με την τιμή ανά τ.μ.
  • Η σταδιακή προσθήκη μεταβλητών (ηλικία κατοικίας, αριθμός καταστημάτων, γεωγραφικές συντεταγμένες κ.ά.) βελτίωσε σημαντικά τη δύναμη πρόβλεψης του μοντέλου.
  • Η λιγότερη επιδραστική μεταβλητή στο μοντέλο ήταν το γεωγραφικό μήκος το οποίο και αφαιρέσαμε από το τελικό μοντέλο γιατί θέλεις να έχεις ένα μοντέλο με καλή ακρίβεια αλλά και με όσες λιγότερες μεταβλητές μπορεις.
  • Κρίνοντας από το μέσο σφάλμα της πρόβλεψης σε σχέση με τον μέσο όρο της εξαρτημένης μεταβλητής θεωρώ οτι το μοντέλο μας δεν είναι και πολύ καλο (αν κάνει 8 μονάδες συν πλην λάθος από έναν μ.ο. στα 37 σημαίνει πέφτει κατα 20% περίπου έξω)

Η μελέτη καταλήγει στο συμπέρασμα ότι ένα καλά δομημένο μοντέλο παλινδρόμησης μπορεί να αποτελέσει ένα χρήσιμο εργαλείο εκτίμησης της αξίας ακινήτων, με βάση βασικούς παράγοντες της περιοχής.