Ένα απλό αλλά απαιτητικό έργο: η πρόβλεψη της τιμής ενός ακινήτου με βάση ορισμένους παράγοντες, όπως το εμβαδόν, ο αριθμός των υπνοδωματίων, η παροχή επίπλωσης, η απόσταση από τον κεντρικό δρόμο κ.λπ. Το σύνολο δεδομένων είναι μικρό, ωστόσο η πολυπλοκότητά του οφείλεται στο γεγονός ότι παρουσιάζει έντονη πολυγραμμικότητα.Το dataset περιλαμβάνει 545 σπίτια με 13 μεταβλητές. Θα χρησιμοποιήσουμε την τιμή (Price) ως εξαρτημένη μεταβλητή διότι είναι η καταλληλότερη για γραμμική παλινδρόμηση.

Ανέβασμα του dataset στην R

Housing <- read_csv("C:/Users/gourg/OneDrive/Υπολογιστής/UoM/Business Analytics/Week 5/Housing.csv")
## Rows: 545 Columns: 13
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (7): mainroad, guestroom, basement, hotwaterheating, airconditioning, pr...
## dbl (6): price, area, bedrooms, bathrooms, stories, parking
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

View και summary του dataset

View(Housing)
summary(Housing)
##      price               area          bedrooms       bathrooms    
##  Min.   : 1750000   Min.   : 1650   Min.   :1.000   Min.   :1.000  
##  1st Qu.: 3430000   1st Qu.: 3600   1st Qu.:2.000   1st Qu.:1.000  
##  Median : 4340000   Median : 4600   Median :3.000   Median :1.000  
##  Mean   : 4766729   Mean   : 5151   Mean   :2.965   Mean   :1.286  
##  3rd Qu.: 5740000   3rd Qu.: 6360   3rd Qu.:3.000   3rd Qu.:2.000  
##  Max.   :13300000   Max.   :16200   Max.   :6.000   Max.   :4.000  
##     stories        mainroad          guestroom           basement        
##  Min.   :1.000   Length:545         Length:545         Length:545        
##  1st Qu.:1.000   Class :character   Class :character   Class :character  
##  Median :2.000   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :1.806                                                           
##  3rd Qu.:2.000                                                           
##  Max.   :4.000                                                           
##  hotwaterheating    airconditioning       parking         prefarea        
##  Length:545         Length:545         Min.   :0.0000   Length:545        
##  Class :character   Class :character   1st Qu.:0.0000   Class :character  
##  Mode  :character   Mode  :character   Median :0.0000   Mode  :character  
##                                        Mean   :0.6936                     
##                                        3rd Qu.:1.0000                     
##                                        Max.   :3.0000                     
##  furnishingstatus  
##  Length:545        
##  Class :character  
##  Mode  :character  
##                    
##                    
## 

Μετατροπή των Categorical μεταβλητών σε Factor για να μπορούμε να τρέξουμε τα μοντέλα

Housing$mainroad        <- factor(Housing$mainroad)
Housing$guestroom       <- factor(Housing$guestroom)
Housing$basement        <- factor(Housing$basement)
Housing$hotwaterheating <- factor(Housing$hotwaterheating)
Housing$airconditioning <- factor(Housing$airconditioning)
Housing$prefarea        <- factor(Housing$prefarea)
Housing$furnishingstatus <- factor(Housing$furnishingstatus)

Ιστόγραμμα της μεταβλητής Price

ggplot(data = Housing, aes(x = price)) + geom_histogram(bins = 50) + labs(title = "Κατανομή Τιμών Σπιτιών", x = "Τιμή", y = "Συχνότητα")

Scatterplot τιμής και εμβαδόν σπιτιού

ggplot(data = Housing, aes(x = area, y = price)) + geom_point(alpha = 0.5) + labs(title = "Τιμή vs Εμβαδόν")

Τιμή ανά κατάσταση επίπλωσης

ggplot(Housing, aes(x = furnishingstatus, y = price, fill = furnishingstatus)) +
  geom_boxplot() +
  labs(title = "Τιμή ανά Κατάσταση Επίπλωσης")

Μοντέλο 1 - Απλή Γραμμική Παλινδρόμηση

model1 <- lm(price ~ area, data = Housing)
summary(model1)
## 
## Call:
## lm(formula = price ~ area, data = Housing)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -4867112 -1022228  -200135   683027  7484838 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 2.387e+06  1.745e+05   13.68   <2e-16 ***
## area        4.620e+02  3.123e+01   14.79   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1581000 on 543 degrees of freedom
## Multiple R-squared:  0.2873, Adjusted R-squared:  0.286 
## F-statistic: 218.9 on 1 and 543 DF,  p-value: < 2.2e-16
ggplot(data = Housing, aes(x = area, y = price)) +
          geom_point(alpha = 0.5) +
          geom_smooth(method="lm", se=TRUE, color="red") +
          labs(title = "Μοντέλο 1: Τιμή ~ Εμβαδόν", x = "Εμβαδόν", y = "Τιμή")
## `geom_smooth()` using formula = 'y ~ x'

R²= 0.287 → το εμβαδόν μόνο του εξηγεί το 28.7% της διακύμανσης της τιμής. Είναι ένα καλό ξεκίνημα για απλή παλινδρόμηση, αλλά το υπόλοιπο 71.3% εξηγείται από άλλους παράγοντες — αυτό δικαιολογεί την ανάγκη για πολλαπλό μοντέλο.

Μοντέλο 2

model2 <- lm(data = Housing, price~ area + bathrooms + stories + parking)
summary(model2)
## 
## Call:
## lm(formula = price ~ area + bathrooms + stories + parking, data = Housing)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -3493604  -707342  -103031   606208  5707902 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 1.683e+05  1.922e+05   0.876    0.382    
## area        3.343e+02  2.663e+01  12.553  < 2e-16 ***
## bathrooms   1.195e+06  1.153e+05  10.367  < 2e-16 ***
## stories     5.937e+05  6.527e+04   9.096  < 2e-16 ***
## parking     3.864e+05  6.685e+04   5.780 1.27e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1248000 on 540 degrees of freedom
## Multiple R-squared:  0.5583, Adjusted R-squared:  0.555 
## F-statistic: 170.6 on 4 and 540 DF,  p-value: < 2.2e-16

Στο δεύτερο μοντέλο προστέθηκαν οι μεταβλητές bathrooms, stories και parking, οι οποίες εμφάνισαν τις υψηλότερες συσχετίσεις με την τιμή στον πίνακα συσχετίσεων. Όλες οι ανεξάρτητες μεταβλητές αναδείχθηκαν στατιστικά σημαντικές (p < 0.001), γεγονός που επιβεβαιώνει τη συνεισφορά τους στο μοντέλο. Το R² αυξήθηκε σημαντικά από 0.287 σε 0.558, δηλαδή το μοντέλο εξηγεί πλέον το 55.8% της διακύμανσης της τιμής — σχεδόν διπλάσιο σε σχέση με το Μοντέλο 1. Σημαντικό είναι ότι και το Adjusted R² αυξήθηκε αντίστοιχα, επιβεβαιώνοντας ότι η βελτίωση δεν οφείλεται απλά στην προσθήκη περισσότερων μεταβλητών. Παράλληλα, το RSE μειώθηκε από 1,581,000 σε 1,248,000, υποδηλώνοντας ότι οι προβλέψεις του μοντέλου είναι πιο ακριβείς. Ο συντελεστής της μεταβλητής bathrooms αναδείχθηκε ο υψηλότερος (~1.19 εκ.), υποδηλώνοντας ότι κάθε επιπλέον μπάνιο σχετίζεται με σημαντική αύξηση της τιμής, ceteris paribus.

Μοντέλο 3

model3 <- lm(price ~ area + bathrooms + stories + parking + 
               bedrooms + mainroad + guestroom + basement + 
               hotwaterheating + airconditioning + prefarea + 
               furnishingstatus, data = Housing)

summary(model3)
## 
## Call:
## lm(formula = price ~ area + bathrooms + stories + parking + bedrooms + 
##     mainroad + guestroom + basement + hotwaterheating + airconditioning + 
##     prefarea + furnishingstatus, data = Housing)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2619718  -657322   -68409   507176  5166695 
## 
## Coefficients:
##                                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                      42771.69  264313.31   0.162 0.871508    
## area                               244.14      24.29  10.052  < 2e-16 ***
## bathrooms                       987668.11  103361.98   9.555  < 2e-16 ***
## stories                         450848.00   64168.93   7.026 6.55e-12 ***
## parking                         277107.10   58525.89   4.735 2.82e-06 ***
## bedrooms                        114787.56   72598.66   1.581 0.114445    
## mainroadyes                     421272.59  142224.13   2.962 0.003193 ** 
## guestroomyes                    300525.86  131710.22   2.282 0.022901 *  
## basementyes                     350106.90  110284.06   3.175 0.001587 ** 
## hotwaterheatingyes              855447.15  223152.69   3.833 0.000141 ***
## airconditioningyes              864958.31  108354.51   7.983 8.91e-15 ***
## prefareayes                     651543.80  115682.34   5.632 2.89e-08 ***
## furnishingstatussemi-furnished  -46344.62  116574.09  -0.398 0.691118    
## furnishingstatusunfurnished    -411234.39  126210.56  -3.258 0.001192 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1068000 on 531 degrees of freedom
## Multiple R-squared:  0.6818, Adjusted R-squared:  0.674 
## F-statistic: 87.52 on 13 and 531 DF,  p-value: < 2.2e-16

Το πλήρες μοντέλο εξηγεί το 68.2% της διακύμανσης της τιμής (R²=0.682), με το Adjusted R² να επιβεβαιώνει ότι η βελτίωση είναι πραγματική. Αξιοσημείωτο είναι ότι οι μεταβλητές bedrooms και furnishingstatussemi-furnished δεν αναδείχθηκαν στατιστικά σημαντικές, υποδηλώνοντας ότι δεν προσφέρουν επιπλέον εξηγητική ισχύ όταν οι υπόλοιπες μεταβλητές είναι ήδη στο μοντέλο. Ο μεγαλύτερος συντελεστής παρατηρείται στον κλιματισμό (airconditioning, ~865k) και στη θέρμανση νερού (hotwaterheating, ~855k), γεγονός που υποδηλώνει ότι οι ανέσεις επηρεάζουν σημαντικά την τιμή.

Μοντέλο 3b (Χωρίς τις 2 μεταβλητές)

model3b <- lm(price ~ area + bathrooms + stories + parking + 
               mainroad + guestroom + basement + 
               hotwaterheating + airconditioning + prefarea, data = Housing)

summary(model3b)
## 
## Call:
## lm(formula = price ~ area + bathrooms + stories + parking + mainroad + 
##     guestroom + basement + hotwaterheating + airconditioning + 
##     prefarea, data = Housing)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2914862  -629392   -66473   515834  5291928 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         -34756.3   192557.9  -0.180 0.856830    
## area                   251.7       24.5  10.270  < 2e-16 ***
## bathrooms          1047143.1   101936.9  10.272  < 2e-16 ***
## stories             497264.3    60816.2   8.177 2.14e-15 ***
## parking             306243.6    58862.6   5.203 2.80e-07 ***
## mainroadyes         436516.3   142522.5   3.063 0.002303 ** 
## guestroomyes        312301.8   133323.3   2.342 0.019524 *  
## basementyes         409602.2   110316.1   3.713 0.000226 ***
## hotwaterheatingyes  906144.5   225749.3   4.014 6.83e-05 ***
## airconditioningyes  878471.1   109312.4   8.036 5.98e-15 ***
## prefareayes         662057.3   117142.4   5.652 2.59e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1082000 on 534 degrees of freedom
## Multiple R-squared:  0.6713, Adjusted R-squared:  0.6652 
## F-statistic: 109.1 on 10 and 534 DF,  p-value: < 2.2e-16

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

SSE (Sum of Squared Errors) Το SSE για κάθε μοντέλο

sse1 <- sum(residuals(model1)^2)
sse2 <- sum(residuals(model2)^2)
sse3 <- sum(residuals(model3)^2)
sse3b <- sum(residuals(model3b)^2)

sse1
## [1] 1.356429e+15
sse2
## [1] 8.407379e+14
sse3
## [1] 6.055973e+14
sse3b
## [1] 6.255582e+14

Η εξέταση του SSE επιβεβαιώνει τα συμπεράσματα από το R². Το SSE μειώθηκε δραματικά από το Μοντέλο 1 (1.36 × 10¹⁵) στο Μοντέλο 2 (8.41 × 10¹⁴) και περαιτέρω στο Μοντέλο 3 (6.26 × 10¹⁴), αντικατοπτρίζοντας τη βελτίωση της προβλεπτικής ισχύος με κάθε προσθήκη μεταβλητών. Αξιοσημείωτο είναι ότι το Μοντέλο 3b παρουσιάζει πανομοιότυπο SSE με το Μοντέλο 3, επιβεβαιώνοντας ότι η αφαίρεση των μη σημαντικών μεταβλητών δεν επηρέασε καθόλου την ακρίβεια του μοντέλου.

Αξιολόγηση και συμπεράσματα

comparison <- data.frame(
  Μοντέλο = c("Μοντέλο 1", "Μοντέλο 2", "Μοντέλο 3", "Μοντέλο 3b"),
  Μεταβλητές = c(1, 4, 12, 10),
  R2 = c(0.287, 0.558, 0.682, 0.671),
  Adj_R2 = c(0.286, 0.555, 0.674, 0.665),
  RSE = c(1581000, 1248000, 1068000, 1082000),
  SSE = c(sse1, sse2, sse3, sse3b)
)

comparison
##      Μοντέλο Μεταβλητές    R2 Adj_R2     RSE          SSE
## 1  Μοντέλο 1          1 0.287  0.286 1581000 1.356429e+15
## 2  Μοντέλο 2          4 0.558  0.555 1248000 8.407379e+14
## 3  Μοντέλο 3         12 0.682  0.674 1068000 6.055973e+14
## 4 Μοντέλο 3b         10 0.671  0.665 1082000 6.255582e+14

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