1. Περιγραφή του Dataset & Μεταβλητών

1.1 Εισαγωγή

Το παρόν σύνολο δεδομένων περιλαμβάνει 21.597 εγγραφές σχετικά με πωλήσεις κατοικιών, με 21 χαρακτηριστικά (στήλες) για κάθε ακίνητο.

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

Ονόματα στηλών (Μεταβλητών)

Η βάση δεδομένων περιλαμβάνει τις παρακάτω μεταβλητές για κάθε ακίνητο:

  • id: Μοναδικός αναγνωριστικός αριθμός κατοικίας
  • dateDate: Ημερομηνία πώλησης του ακινήτου
  • price: Τιμή πώλησης (στόχος πρόβλεψης)
  • bedroomsNumber: Αριθμός υπνοδωματίων
  • bathroomsNumber: Αριθμός μπάνιων
  • sqft_livingsquare: Εμβαδόν κατοικήσιμου χώρου (σε τετραγωνικά πόδια)
  • sqft_lotsquare: Εμβαδόν οικοπέδου (σε τετραγωνικά πόδια)
  • floorsTotal: Αριθμός επιπέδων (ορόφων) του σπιτιού
  • waterfront: Αν το ακίνητο έχει θέα σε παραθαλάσσια περιοχή (ναι/όχι)
  • view: Πόσες φορές έχει προβληθεί το ακίνητο
  • condition: Συνολική κατάσταση του ακινήτου
  • grade: Βαθμολογία ακινήτου σύμφωνα με το σύστημα της κομητείας King
  • sqft_above: Εμβαδόν πάνω από το υπόγειο
  • sqft_basement: Εμβαδόν του υπογείου
  • yr_built: Έτος κατασκευής
  • yr_renovated: Έτος ανακαίνισης (αν υπάρχει)
  • zipcode: Ταχυδρομικός κώδικας
  • lat: Γεωγραφικό πλάτος
  • long: Γεωγραφικό μήκος
  • sqft_living15: Μέσο εμβαδόν κατοικήσιμου χώρου των 15 κοντινότερων κατοικιών
  • sqft_lot15: Μέσο εμβαδόν οικοπέδου των 15 κοντινότερων κατοικιών

1.2 Καθαρισμός του Dataset(Cleaning)

Για να εξασφαλίσουμε την ποιότητα της ανάλυσης, είναι απαραίτητο να καθαρίσουμε το αρχικό dataset εντοπίζοντας και αφαιρώντας κενές τιμές (NA) και διπλότυπες εγγραφές, εφόσον υπάρχουν.

cat("Παρατηρούμε ότι έχουμε ",sum(is.na(Data)), " κενά κελία επομένως θα αφαιρέσουμε τις γραμμές αυτές με σκοπό να βγάλουμε καλύτερο αποτέλεσμα!")
## Παρατηρούμε ότι έχουμε  6735  κενά κελία επομένως θα αφαιρέσουμε τις γραμμές αυτές με σκοπό να βγάλουμε καλύτερο αποτέλεσμα!
cat("Έχουμε ",sum(duplicated(Data)), " διπλότυπες εγγραφές οπότε δεν χρειαζόμαστε επεξεργασία για αφαίρεση διπλότυπων.")
## Έχουμε  0  διπλότυπες εγγραφές οπότε δεν χρειαζόμαστε επεξεργασία για αφαίρεση διπλότυπων.
cData <- na.omit(Data)
nrow(cData)
## [1] 15429

Μετά τον καθαρισμό, διατηρούμε μόνο τις εγγραφές με πλήρη δεδομένα, βελτιώνοντας έτσι την αξιοπιστία των επόμενων αναλύσεων. Το τελικό dataset περιλαμβάνει 15762 παρατηρήσεις.

summary(cData)
##        id                  date                price            bedrooms     
##  Min.   :   1000102   Min.   :2014-05-02   Min.   :  82000   Min.   : 1.000  
##  1st Qu.:2126049032   1st Qu.:2014-07-21   1st Qu.: 320000   1st Qu.: 3.000  
##  Median :3905081800   Median :2014-10-16   Median : 450000   Median : 3.000  
##  Mean   :4593824663   Mean   :2014-10-28   Mean   : 541498   Mean   : 3.379  
##  3rd Qu.:7334501250   3rd Qu.:2015-02-17   3rd Qu.: 643500   3rd Qu.: 4.000  
##  Max.   :9895000040   Max.   :2015-05-27   Max.   :7700000   Max.   :33.000  
##    bathrooms      sqft_living       sqft_lot           floors     
##  Min.   :0.500   Min.   :  370   Min.   :    520   Min.   :1.000  
##  1st Qu.:1.750   1st Qu.: 1430   1st Qu.:   5050   1st Qu.:1.000  
##  Median :2.250   Median : 1920   Median :   7620   Median :1.500  
##  Mean   :2.122   Mean   : 2086   Mean   :  15286   Mean   :1.495  
##  3rd Qu.:2.500   3rd Qu.: 2550   3rd Qu.:  10720   3rd Qu.:2.000  
##  Max.   :8.000   Max.   :13540   Max.   :1651359   Max.   :3.500  
##    waterfront            view          condition         grade       
##  Min.   :0.000000   Min.   :0.0000   Min.   :1.000   Min.   : 3.000  
##  1st Qu.:0.000000   1st Qu.:0.0000   1st Qu.:3.000   1st Qu.: 7.000  
##  Median :0.000000   Median :0.0000   Median :3.000   Median : 7.000  
##  Mean   :0.007518   Mean   :0.2289   Mean   :3.411   Mean   : 7.664  
##  3rd Qu.:0.000000   3rd Qu.:0.0000   3rd Qu.:4.000   3rd Qu.: 8.000  
##  Max.   :1.000000   Max.   :4.0000   Max.   :5.000   Max.   :13.000  
##    sqft_above   sqft_basement       yr_built     yr_renovated    
##  Min.   : 370   Min.   :   0.0   Min.   :1900   Min.   :   0.00  
##  1st Qu.:1200   1st Qu.:   0.0   1st Qu.:1952   1st Qu.:   0.00  
##  Median :1570   Median :   0.0   Median :1975   Median :   0.00  
##  Mean   :1794   Mean   : 291.8   Mean   :1971   Mean   :  81.77  
##  3rd Qu.:2220   3rd Qu.: 560.0   3rd Qu.:1997   3rd Qu.:   0.00  
##  Max.   :9410   Max.   :4820.0   Max.   :2015   Max.   :2015.00  
##     zipcode           lat             long        sqft_living15 
##  Min.   :98001   Min.   :47.16   Min.   :-122.5   Min.   : 399  
##  1st Qu.:98033   1st Qu.:47.47   1st Qu.:-122.3   1st Qu.:1490  
##  Median :98065   Median :47.57   Median :-122.2   Median :1850  
##  Mean   :98077   Mean   :47.56   Mean   :-122.2   Mean   :1991  
##  3rd Qu.:98117   3rd Qu.:47.68   3rd Qu.:-122.1   3rd Qu.:2370  
##  Max.   :98199   Max.   :47.78   Max.   :-121.3   Max.   :6210  
##    sqft_lot15    
##  Min.   :   659  
##  1st Qu.:  5100  
##  Median :  7626  
##  Mean   : 12862  
##  3rd Qu.: 10108  
##  Max.   :871200

1.3 Αρχικά Διαγράμματα Κατανόησης

ggplot(cData, aes(x = bedrooms, y = price)) +
  geom_point(color = "#2C3E50", alpha = 0.6, size = 2) +
  labs(
    title = "Σχέση μεταξύ υπνοδωματίων και τιμής",
    x = "Αριθμός Υπνοδωματίων",
    y = "Τιμή (€)"
  ) +
  scale_y_continuous(labels = label_comma()) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    axis.title = element_text(face = "bold")
  )

Μπορούμε να συμπεράνουμε από το παραπάνω διάγραμμα ότι καθώς αυξάνεται ο αριθμός των δωματίων, φαίνεται να αυξάνεται και η τιμή, διότι παρατηρούμε μια ανοδική τάση. Επομένως, μπορούμε να αναμένουμε ότι η μεταβλητή bedrooms θα παίξει σημαντικό ρόλο στο μοντέλο γραμμικής παλινδρόμησης.

ggplot(cData, aes(x = grade, y = price)) +
  geom_point(color = "#2C3E50", alpha = 0.6, size = 2) +
  labs(
    title = "Σχέση μεταξύ υπνοδωματίων και τιμής",
    x = "Αριθμός Υπνοδωματίων",
    y = "Τιμή (€)"
  ) +
  scale_y_continuous(labels = label_comma()) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    axis.title = element_text(face = "bold")
  )

Μπορούμε να συμπεράνουμε από το παραπάνω διάγραμμα ότι καθώς αυξάνεται η βαθμολογία (grade), φαίνεται να αυξάνεται και η τιμή, καθώς παρατηρούμε μια θετική συσχέτιση.΄Όπως και πριν, μπορούμε να αναμένουμε ότι η μεταβλητή grade θα παίξει σημαντικό ρόλο στο μοντέλο γραμμικής παλινδρόμησης.

1.4 Πιθανές Ερωτήσεις

2. Γραμμική Παλινδρόμηση

Στο πλαίσιο της ανάλυσής μας, θα εφαρμόσουμε κατα κύριο λόγο τη μέθοδο αφαίρεσης μεταβλητών (backward elimination). Συγκεκριμένα, θα δούμε ποιες μεταβλητές είναι οι σημαντικότερες και στην συνέχεια θα τροποποιήσουμε το μεντέλο αντίστοιχα.

2.1 Δημιουργία του μεγαλύτερου μοντέλου

allmodel <- lm(price ~ . , cData)
summary(allmodel)
## 
## Call:
## lm(formula = price ~ ., data = cData)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1209962   -99437    -8338    79705  4249730 
## 
## Coefficients: (1 not defined because of singularities)
##                         Estimate         Std. Error t value
## (Intercept)   3857482.1037059356 3523001.0411323602   1.095
## id                 -0.0000011038       0.0000005786  -1.908
## date              111.5342826888      14.5393632725   7.671
## bedrooms       -37252.4051258950    2243.5630998792 -16.604
## bathrooms       43935.4706609749    3903.7533674251  11.255
## sqft_living       154.8192186631       5.2174675774  29.673
## sqft_lot            0.0854518454       0.0565234979   1.512
## floors           5008.2083720190    4322.5078645171   1.159
## waterfront     619069.4872245024   20870.2141808766  29.663
## view            53383.7017252451    2583.2194479880  20.666
## condition       27610.3682571462    2819.9682812246   9.791
## grade           94064.6547965433    2598.5695310328  36.199
## sqft_above         37.1309846372       5.1925703017   7.151
## sqft_basement                 NA                 NA      NA
## yr_built        -2678.8974451141      86.9450779172 -30.811
## yr_renovated       21.0991420031       4.4272392616   4.766
## zipcode          -570.0708053146      39.4742359055 -14.442
## lat            604281.7533091547   12830.7863079017  47.096
## long          -213453.2017867107   15783.0718764432 -13.524
## sqft_living15      16.9623844567       4.1481247803   4.089
## sqft_lot15         -0.3521112562       0.0861214337  -4.089
##                           Pr(>|t|)    
## (Intercept)                 0.2736    
## id                          0.0564 .  
## date            0.0000000000000181 ***
## bedrooms      < 0.0000000000000002 ***
## bathrooms     < 0.0000000000000002 ***
## sqft_living   < 0.0000000000000002 ***
## sqft_lot                    0.1306    
## floors                      0.2466    
## waterfront    < 0.0000000000000002 ***
## view          < 0.0000000000000002 ***
## condition     < 0.0000000000000002 ***
## grade         < 0.0000000000000002 ***
## sqft_above      0.0000000000009016 ***
## sqft_basement                   NA    
## yr_built      < 0.0000000000000002 ***
## yr_renovated    0.0000018986408221 ***
## zipcode       < 0.0000000000000002 ***
## lat           < 0.0000000000000002 ***
## long          < 0.0000000000000002 ***
## sqft_living15   0.0000435118907329 ***
## sqft_lot15      0.0000436292276684 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 203600 on 15409 degrees of freedom
## Multiple R-squared:  0.7024, Adjusted R-squared:  0.702 
## F-statistic:  1914 on 19 and 15409 DF,  p-value: < 0.00000000000000022
# Υπολογισμός SSE & RSME για πίνακα αποτελεσμάτων
SSEall <- sum(allmodel$residuals^2) 
RMSEall<- sqrt(SSEall/nrow(cData)) 

Παρατηρούμε ότι η πλειονότητα των μεταβλητών συνοδεύεται από 3 αστεράκια, κάτι που υποδηλώνει ότι είναι ιδιαίτερα στατιστικά σημαντικές. Για τον λόγο αυτό, θα επιλέξουμε να συμπεριλάβουμε μόνο αυτές τις μεταβλητές στο μοντέλο, ώστε να εξετάσουμε πώς επηρεάζουν τα αποτελέσματα και να καθορίσουμε τα επόμενα βήματά μας.

2.2 Βελτιστοποίηση του Μοντέλου μέσω Επιλογής Σημαντικών Μεταβλητών

# Δημιουργία νέου μοντέλου μόνο με τις στατιστικά σημαντικές μεταβλητές (***)
  m1<- lm(price ~ date + bedrooms + bathrooms + sqft_living +
                  waterfront + view + condition + grade + sqft_above +
                  yr_built + yr_renovated + zipcode + lat + long + sqft_living15 + sqft_lot15,
                  data = cData)
# Υπολογισμός SSE & RSME για πίνακα αποτελεσμάτων
SSE1 <- sum(m1$residuals^2) 
RMSE1<- sqrt(SSE1/nrow(cData)) 
  
  # Προβολή των αποτελεσμάτων του μοντέλου 1
  summary(m1)
## 
## Call:
## lm(formula = price ~ date + bedrooms + bathrooms + sqft_living + 
##     waterfront + view + condition + grade + sqft_above + yr_built + 
##     yr_renovated + zipcode + lat + long + sqft_living15 + sqft_lot15, 
##     data = cData)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1212591   -99469    -8251    79399  4244044 
## 
## Coefficients:
##                    Estimate    Std. Error t value             Pr(>|t|)    
## (Intercept)   3250018.83907 3466300.37158   0.938                0.348    
## date              111.35147      14.53977   7.658   0.0000000000000199 ***
## bedrooms       -37436.82336    2242.38149 -16.695 < 0.0000000000000002 ***
## bathrooms       45157.87642    3766.41353  11.990 < 0.0000000000000002 ***
## sqft_living       153.20631       4.97223  30.812 < 0.0000000000000002 ***
## waterfront     618849.91256   20871.32949  29.651 < 0.0000000000000002 ***
## view            53455.96321    2579.91573  20.720 < 0.0000000000000002 ***
## condition       27404.83295    2814.02604   9.739 < 0.0000000000000002 ***
## grade           94300.10658    2588.45540  36.431 < 0.0000000000000002 ***
## sqft_above         40.06644       4.65403   8.609 < 0.0000000000000002 ***
## yr_built        -2664.62215      84.88914 -31.389 < 0.0000000000000002 ***
## yr_renovated       21.24302       4.42357   4.802   0.0000015837692212 ***
## zipcode          -565.92105      39.29747 -14.401 < 0.0000000000000002 ***
## lat            605157.47001   12777.97850  47.359 < 0.0000000000000002 ***
## long          -214540.34933   15674.42999 -13.687 < 0.0000000000000002 ***
## sqft_living15      16.06403       4.11443   3.904   0.0000948939174380 ***
## sqft_lot15         -0.24987       0.06229  -4.011   0.0000606748110150 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 203700 on 15412 degrees of freedom
## Multiple R-squared:  0.7022, Adjusted R-squared:  0.7019 
## F-statistic:  2272 on 16 and 15412 DF,  p-value: < 0.00000000000000022

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

Για τον λόγο αυτό, επιχειρούμε την αφαίρεση των μεταβλητών γεωγραφικής φύσης (zipcode, lat, long etc.), οι οποίες συνήθως έχουν ισχυρή επίδραση αλλά και αυξημένο υπολογιστικό κόστος λόγω της πολυπλοκότητάς τους. Το δεύτερο μοντέλο, το οποίο περιλαμβάνει μόνο τις υπόλοιπες στατιστικά σημαντικές μεταβλητές, είναι το εξής:

m2<- lm(price ~ date + bedrooms + bathrooms + sqft_living +
                waterfront + view + condition + grade + sqft_above +
                yr_built + yr_renovated,
                data = cData)
# Υπολογισμός SSE & RSME για πίνακα αποτελεσμάτων
SSE2 <- sum(m2$residuals^2) 
RMSE2<- sqrt(SSE2/nrow(cData)) 

# Προβολή των αποτελεσμάτων του μοντέλου 2
summary(m2)
## 
## Call:
## lm(formula = price ~ date + bedrooms + bathrooms + sqft_living + 
##     waterfront + view + condition + grade + sqft_above + yr_built + 
##     yr_renovated, data = cData)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1239750  -110301    -8716    91778  4186334 
## 
## Coefficients:
##                 Estimate  Std. Error t value             Pr(>|t|)    
## (Intercept)  4712964.042  305766.753  15.414 < 0.0000000000000002 ***
## date              94.603      15.649   6.045        0.00000000153 ***
## bedrooms      -39620.809    2400.767 -16.503 < 0.0000000000000002 ***
## bathrooms      56469.420    4024.092  14.033 < 0.0000000000000002 ***
## sqft_living      162.608       5.178  31.403 < 0.0000000000000002 ***
## waterfront    613572.443   22456.454  27.323 < 0.0000000000000002 ***
## view           45014.178    2726.940  16.507 < 0.0000000000000002 ***
## condition      17630.943    2986.620   5.903        0.00000000364 ***
## grade         123386.479    2596.519  47.520 < 0.0000000000000002 ***
## sqft_above        13.905       4.863   2.859              0.00425 ** 
## yr_built       -3597.911      84.118 -42.772 < 0.0000000000000002 ***
## yr_renovated      11.665       4.748   2.457              0.01403 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 219300 on 15417 degrees of freedom
## Multiple R-squared:  0.6546, Adjusted R-squared:  0.6544 
## F-statistic:  2657 on 11 and 15417 DF,  p-value: < 0.00000000000000022

Ωστόσο, παρατηρούμε ότι η τιμή του συντελεστή R² μειώνεται αισθητά, γεγονός που δηλώνει απώλεια ερμηνευτικής ισχύος. Για τον λόγο αυτό, επιλέγουμε να διατηρήσουμε μέρος των γεωγραφικών μεταβλητών ώστε να βελτιώσουμε την ακρίβεια του μοντέλου, περιορίζοντας παράλληλα την περιπλοκότητα.

Το τρίτο μοντέλο είναι το εξής:

# Δημιουργία τρίτου μοντέλου
m3<- lm(price ~ date + bedrooms + bathrooms + sqft_living +
                waterfront + view + condition + grade + sqft_above +
                yr_built + yr_renovated + zipcode + lat + long,
                data = cData)
# Υπολογισμός SSE & RSME για πίνακα αποτελεσμάτων
SSE3 <- sum(m3$residuals^2) 
RMSE3<- sqrt(SSE3/nrow(cData)) 

# Προβολή των αποτελεσμάτων του μοντέλου 3
summary(m3)
## 
## Call:
## lm(formula = price ~ date + bedrooms + bathrooms + sqft_living + 
##     waterfront + view + condition + grade + sqft_above + yr_built + 
##     yr_renovated + zipcode + lat + long, data = cData)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1234177   -98943    -8298    79465  4218764 
## 
## Coefficients:
##                 Estimate  Std. Error t value             Pr(>|t|)    
## (Intercept)  4546170.071 3370887.944   1.349                0.177    
## date             110.324      14.552   7.581   0.0000000000000362 ***
## bedrooms      -36725.914    2236.095 -16.424 < 0.0000000000000002 ***
## bathrooms      45115.660    3760.099  11.999 < 0.0000000000000002 ***
## sqft_living      156.030       4.816  32.400 < 0.0000000000000002 ***
## waterfront    617138.432   20884.402  29.550 < 0.0000000000000002 ***
## view           54535.574    2552.627  21.364 < 0.0000000000000002 ***
## condition      26938.418    2814.585   9.571 < 0.0000000000000002 ***
## grade          97390.570    2479.367  39.280 < 0.0000000000000002 ***
## sqft_above        41.515       4.635   8.957 < 0.0000000000000002 ***
## yr_built       -2673.723      84.732 -31.555 < 0.0000000000000002 ***
## yr_renovated      20.276       4.420   4.587   0.0000045301269927 ***
## zipcode         -582.953      39.115 -14.903 < 0.0000000000000002 ***
## lat           610162.108   12754.929  47.837 < 0.0000000000000002 ***
## long         -215905.186   15171.803 -14.231 < 0.0000000000000002 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 203800 on 15414 degrees of freedom
## Multiple R-squared:  0.7016, Adjusted R-squared:  0.7014 
## F-statistic:  2589 on 14 and 15414 DF,  p-value: < 0.00000000000000022

2.3. Αποτελέσματα

results <- data.frame(
  Model = c(
    "All variables",
    "Date + Bedrooms + Bathrooms + Sqft_living + Waterfront + View + Condition + Grade + Sqft_above + Yr_built + Yr_renovated + Zipcode + Lat + Long + Sqft_living15 + Sqft_lot15",
    "Date + Bedrooms + Bathrooms + Sqft_living + Waterfront + View + Condition + Grade + Sqft_above + Yr_built + Yr_renovated",
    "Date + Bedrooms + Bathrooms + Sqft_living + Waterfront + View + Condition + Grade + Sqft_above + Yr_built + Yr_renovated + Zipcode + Lat + Long"
  ),
  R_squared = c(
    summary(allmodel)$r.squared,
    summary(m1)$r.squared,
    summary(m2)$r.squared,
    summary(m3)$r.squared
  ),
  SSE = c(
    SSEall,
    SSE1,
    SSE2,
    SSE3
  ),
  RMSE = c(
    RMSEall,
    RMSE1,
    RMSE2,
    RMSE3
  )
)

knitr::kable(results, digits = 4, caption = "Σύγκριση Μοντέλων: R-squared και SSE")
Σύγκριση Μοντέλων: R-squared και SSE
Model R_squared SSE RMSE
All variables 0.7024 638915871098484 203494.6
Date + Bedrooms + Bathrooms + Sqft_living + Waterfront + View + Condition + Grade + Sqft_above + Yr_built + Yr_renovated + Zipcode + Lat + Long + Sqft_living15 + Sqft_lot15 0.7022 639226035046862 203544.0
Date + Bedrooms + Bathrooms + Sqft_living + Waterfront + View + Condition + Grade + Sqft_above + Yr_built + Yr_renovated 0.6546 741386477626054 219206.5
Date + Bedrooms + Bathrooms + Sqft_living + Waterfront + View + Condition + Grade + Sqft_above + Yr_built + Yr_renovated + Zipcode + Lat + Long 0.7016 640507248770261 203747.9

Ακολουθεί η εφαρμογή πρόβλεψης, όπου θα χρησιμοποιηθεί το τρίτο μοντέλο. Το Μοντέλο 3 επιτυγχάνει μια ισορροπία μεταξύ απλότητας και προβλεπτικής ισχύος. Παρά την ελαφρώς αυξημένη πολυπλοκότητα λόγω της προσθήκης γεωγραφικών μεταβλητών, παρατηρείται σημαντική βελτίωση στο R², η οποία πλησιάζει την απόδοση του πληρέστερου μοντέλου. Αυτό δικαιολογεί τη διατήρηση των συγκεκριμένων μεταβλητών, με αποτέλεσμα το τρίτο μοντέλο να θεωρείται το πλέον κατάλληλο για την πρόβλεψη της τιμής των κατοικιών.

3.Εφαρμογή Πρόβλεψης

Για την αξιολόγηση του μοντέλου m3, τα δεδομένα θα χωριστούν σε σύνολα εκπαίδευσης και δοκιμής με αναλογία 75% - 25%, ώστε να ελεγχθεί η ικανότητα πρόβλεψης σε νέα, άγνωστα δεδομένα. Θα προσαρμόσουμε το μοντέλο στο σύνολο εκπαίδευσης και στη συνέχεια θα γίνουν προβλέψεις για τις τιμές κατοικιών στο σύνολο δοκιμής.

Θα υπολογίσουμε το άθροισμα τετραγωνικών σφαλμάτων (SSE) μεταξύ προβλεπόμενων και πραγματικών τιμών καθώς και το RMSE (ρίζα μέσου τετραγωνικού σφάλματος) για να αξιολογήσουμε το μέγεθος του μέσου σφάλματος της πρόβλεψης, σε μονάδες τιμής κατοικίας. Με αυτόν τον τρόπο, θα εκτιμήσουμε την απόδοση του μοντέλου σε νέα δεδομένα, διασφαλίζοντας ότι δεν θα έχει γίνει υπερπροσαρμογή στα δεδομένα εκπαίδευσης.

#Σύμφωνα με το iis
set.seed(956)

split <- sample.split(cData$price,SplitRatio=0.75)
Train = subset(cData,split==TRUE)
Test = subset(cData,split==FALSE)
nrow(Test)
## [1] 3338
nrow(Train)
## [1] 12091
Prediction <- predict(m3, newdata=Test)

SSEPred <- sum((Prediction - Test$price)^2)
SSTPred <- sum((mean(Train$price) - Test$price)^2)
R2Pred <- 1 - SSEPred/SSTPred
cat(R2Pred)
## 0.6973713
RMSEPred <- sqrt(SSEPred / nrow(Test))
cat(RMSEPred)
## 184892.9

3.1 Συμπεράσματα

Το της τάξης του 0.697 σημαίνει ότι το μοντέλο εξηγεί περίπου το 69,7% της μεταβλητότητας των πραγματικών τιμών στο σύνολο δοκιμής, κάτι που είναι αρκετά ικανοποιητικό για δεδομένα με φυσική ποικιλότητα όπως οι τιμές ακινήτων.

Η τιμή του RMSE περίπου 184,893 υποδεικνύει το μέσο μέγεθος του σφάλματος πρόβλεψης στις ίδιες μονάδες με την τιμή ακινήτου. Αν συγκριθεί με το μέσο μέγεθος των τιμών στο dataset, το σφάλμα αυτό είναι αποδεκτό, αν και μπορεί να βελτιωθεί περαιτέρω με επιπλέον βελτιώσεις στο μοντέλο.

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