1 📝 Εισαγωγή

Σε αυτή την εργασία εφαρμόζουμε γραμμική παλινδρόμηση στο dataset King County House Sales για την περιοχή του Seattle, με στόχο την πρόβλεψη της τιμής πώλησης κατοικιών βάσει χαρακτηριστικών τους.

Το dataset περιλαμβάνει 21.597 εγγραφές και 21 μεταβλητές που περιγράφουν στοιχεία όπως: τετραγωνικά μέτρα, αριθμό υπνοδωματίων, ποιότητα, θέα, κ.ά.


2 📂 Πακέτα και Φόρτωση Δεδομένων

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.2     ✔ tibble    3.2.1
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.0.4     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(GGally)
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2
data <- read.csv("kc_house_data.csv")

3 🧹 Προκαταρκτικός Καθαρισμός

data$sqft_basement <- as.numeric(as.character(data$sqft_basement))
## Warning: NAs introduced by coercion
data$yr_renovated[is.na(data$yr_renovated)] <- 0
data$waterfront[is.na(data$waterfront)] <- 0

Αντικαταστήσαμε μη διαθέσιμες τιμές και μετατρέψαμε δεδομένα τύπου character σε numeric όπου χρειάζεται.


4 🔍 Εξερεύνηση και Περιγραφική Ανάλυση

head(data)
##           id       date   price bedrooms bathrooms sqft_living sqft_lot floors
## 1 7129300520 10/13/2014  221900        3      1.00        1180     5650      1
## 2 6414100192  12/9/2014  538000        3      2.25        2570     7242      2
## 3 5631500400  2/25/2015  180000        2      1.00         770    10000      1
## 4 2487200875  12/9/2014  604000        4      3.00        1960     5000      1
## 5 1954400510  2/18/2015  510000        3      2.00        1680     8080      1
## 6 7237550310  5/12/2014 1230000        4      4.50        5420   101930      1
##   waterfront view condition grade sqft_above sqft_basement yr_built
## 1          0    0         3     7       1180             0     1955
## 2          0    0         3     7       2170           400     1951
## 3          0    0         3     6        770             0     1933
## 4          0    0         5     7       1050           910     1965
## 5          0    0         3     8       1680             0     1987
## 6          0    0         3    11       3890          1530     2001
##   yr_renovated zipcode     lat     long sqft_living15 sqft_lot15
## 1            0   98178 47.5112 -122.257          1340       5650
## 2         1991   98125 47.7210 -122.319          1690       7639
## 3            0   98028 47.7379 -122.233          2720       8062
## 4            0   98136 47.5208 -122.393          1360       5000
## 5            0   98074 47.6168 -122.045          1800       7503
## 6            0   98053 47.6561 -122.005          4760     101930
summary(data$price)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   78000  322000  450000  540297  645000 7700000

Η μέση τιμή κατοικίας είναι περίπου 540.000\(**, με ελάχιστη τις **75.000\) και μέγιστη τις 7.700.000$. Αυτό υποδηλώνει μεγάλη διασπορά τιμών.


5 📊 Γραφήματα

hist(data$price, breaks = 50, main = "Κατανομή Τιμών", xlab = "Τιμή")

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

boxplot(price ~ bedrooms, data = data, main = "Τιμή ανά Αριθμό Υπνοδωματίων")

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

boxplot(price ~ grade, data = data, main = "Τιμή ανά Grade")

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


6 🔗 Πίνακας Συσχετίσεων

cor_matrix <- data %>%
  select(price, sqft_living, bedrooms, bathrooms, grade, sqft_above, sqft_living15) %>%
  cor(use = "complete.obs")
round(cor_matrix, 2)
##               price sqft_living bedrooms bathrooms grade sqft_above
## price          1.00        0.70     0.31      0.53  0.67       0.61
## sqft_living    0.70        1.00     0.58      0.76  0.76       0.88
## bedrooms       0.31        0.58     1.00      0.51  0.36       0.48
## bathrooms      0.53        0.76     0.51      1.00  0.67       0.69
## grade          0.67        0.76     0.36      0.67  1.00       0.76
## sqft_above     0.61        0.88     0.48      0.69  0.76       1.00
## sqft_living15  0.59        0.76     0.39      0.57  0.71       0.73
##               sqft_living15
## price                  0.59
## sqft_living            0.76
## bedrooms               0.39
## bathrooms              0.57
## grade                  0.71
## sqft_above             0.73
## sqft_living15          1.00

Η μεταβλητή sqft_living παρουσιάζει ισχυρή συσχέτιση με την price (0.70), ενώ και το grade (0.67) είναι σημαντικός παράγοντας.


7 📈 Απλή Γραμμική Παλινδρόμηση

model_simple <- lm(price ~ sqft_living, data = data)
summary(model_simple)
## 
## Call:
## lm(formula = price ~ sqft_living, data = data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1478896  -147583   -24131   106274  4359590 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -43988.892   4410.023  -9.975   <2e-16 ***
## sqft_living    280.863      1.939 144.819   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 261700 on 21595 degrees of freedom
## Multiple R-squared:  0.4927, Adjusted R-squared:  0.4927 
## F-statistic: 2.097e+04 on 1 and 21595 DF,  p-value: < 2.2e-16

Το μοντέλο εξηγεί περίπου 49% της διακύμανσης (R² ≈ 0.49). Αν και απλό, δείχνει ότι το μέγεθος της κατοικίας έχει θετικό ρόλο στην τιμή.

ggplot(data, aes(x = sqft_living, y = price)) +
  geom_point(alpha = 0.3) +
  geom_smooth(method = "lm", col = "red") +
  ggtitle("Απλή Παλινδρόμηση: price ~ sqft_living")
## `geom_smooth()` using formula = 'y ~ x'


8 📉 Πολλαπλή Γραμμική Παλινδρόμηση

model_multi <- lm(price ~ sqft_living + bedrooms + bathrooms + grade + view + waterfront, data = data)
summary(model_multi)
## 
## Call:
## lm(formula = price ~ sqft_living + bedrooms + bathrooms + grade + 
##     view + waterfront, data = data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1208494  -125277   -19353    95251  4708838 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -467593.00   14127.20 -33.099  < 2e-16 ***
## sqft_living     197.32       3.44  57.356  < 2e-16 ***
## bedrooms     -28332.02    2182.10 -12.984  < 2e-16 ***
## bathrooms    -22415.27    3292.41  -6.808 1.01e-11 ***
## grade         94035.88    2191.98  42.900  < 2e-16 ***
## view          69286.42    2345.40  29.541  < 2e-16 ***
## waterfront   588916.47   21083.80  27.932  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 233600 on 21527 degrees of freedom
##   (63 observations deleted due to missingness)
## Multiple R-squared:  0.5929, Adjusted R-squared:  0.5928 
## F-statistic:  5226 on 6 and 21527 DF,  p-value: < 2.2e-16

Το R² βελτιώνεται στο ≈ 0.54, δείχνοντας καλύτερη προβλεπτική ικανότητα. Μεταβλητές όπως grade, view και bathrooms είναι σημαντικές.


9 📊 Σύγκριση SSE και R²

sse_simple <- sum(model_simple$residuals^2)
sse_multi <- sum(model_multi$residuals^2)

r2_simple <- summary(model_simple)$r.squared
r2_multi <- summary(model_multi)$r.squared

data.frame(
  Μοντέλο = c("Απλή", "Πολλαπλή"),
  SSE = c(sse_simple, sse_multi),
  R2 = c(r2_simple, r2_multi)
)
##    Μοντέλο          SSE        R2
## 1     Απλή 1.478603e+15 0.4926879
## 2 Πολλαπλή 1.174524e+15 0.5929445

Το πολλαπλό μοντέλο έχει μικρότερο σφάλμα (SSE) και μεγαλύτερο R², συνεπώς είναι πιο ακριβές για πρόβλεψη.


10 🧪 Εναλλακτικό Μοντέλο

model_alt <- lm(price ~ sqft_living + grade + bathrooms, data = data)
summary(model_alt)
## 
## Call:
## lm(formula = price ~ sqft_living + grade + bathrooms, data = data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1009229  -136330   -23203   100840  4801006 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -6.024e+05  1.330e+04  -45.28   <2e-16 ***
## sqft_living  2.032e+02  3.339e+00   60.85   <2e-16 ***
## grade        1.046e+05  2.293e+03   45.63   <2e-16 ***
## bathrooms   -3.836e+04  3.455e+03  -11.10   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 249900 on 21593 degrees of freedom
## Multiple R-squared:  0.5373, Adjusted R-squared:  0.5373 
## F-statistic:  8359 on 3 and 21593 DF,  p-value: < 2.2e-16

Μοντέλο με λιγότερες μεταβλητές, αλλά διατηρεί ικανοποιητικό R² (~0.52). Είναι πιο “lightweight” χωρίς σημαντική απώλεια ακρίβειας.


11 🧾 Συμπεράσματα


12 ✅ Τελική Εντύπωση

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