Σε αυτή την εργασία εφαρμόζουμε γραμμική παλινδρόμηση στο dataset King County House Sales για την περιοχή του Seattle, με στόχο την πρόβλεψη της τιμής πώλησης κατοικιών βάσει χαρακτηριστικών τους.
Το dataset περιλαμβάνει 21.597 εγγραφές και 21 μεταβλητές που περιγράφουν στοιχεία όπως: τετραγωνικά μέτρα, αριθμό υπνοδωματίων, ποιότητα, θέα, κ.ά.
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")
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 όπου
χρειάζεται.
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$. Αυτό υποδηλώνει μεγάλη διασπορά τιμών.
hist(data$price, breaks = 50, main = "Κατανομή Τιμών", xlab = "Τιμή")
Η κατανομή τιμών είναι δεξιά ασύμμετρη, με πολλές τιμές κάτω του 1 εκατομμυρίου και λίγες εξαιρετικά υψηλές.
boxplot(price ~ bedrooms, data = data, main = "Τιμή ανά Αριθμό Υπνοδωματίων")
Υπάρχει μια γενική αύξηση της τιμής με τα υπνοδωμάτια, αλλά με πολλές εξαιρέσεις και σημαντική διασπορά.
boxplot(price ~ grade, data = data, main = "Τιμή ανά Grade")
Η μεταβλητή grade (ποιοτική αξιολόγηση) έχει σαφή θετική συσχέτιση με την τιμή, υποδεικνύοντας ότι όσο καλύτερη η κατασκευή, τόσο υψηλότερη η αξία.
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) είναι σημαντικός παράγοντας.
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'
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 είναι σημαντικές.
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², συνεπώς είναι πιο ακριβές για πρόβλεψη.
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” χωρίς σημαντική απώλεια ακρίβειας.
Η χρήση της γραμμικής παλινδρόμησης στο dataset του King County αποδεικνύεται αποτελεσματική και επεξηγηματική. Το έργο αυτό αποτελεί ένα ισχυρό παράδειγμα εφαρμοσμένης επιχειρηματικής αναλυτικής, με δυνατότητα επέκτασης σε πιο πολύπλοκα μοντέλα στο μέλλον.