Το παρόν έγγραφο αποτελεί μια αρχική ερευνητική προσέγγιση σε ένα σύνολο δεδομένων που αφορά κατοικίες. Στο παρόν Markdown αναπτύσσεται μια μεθοδολογία η οποία περιλαμβάνει τη διερεύνηση του dataset, την αναλυτική δεδομένων (EDA), την προεπεξεργασία δεδομένων, καθώς και την εφαρμογή διαφόρων πειραμάτων με τη μέθοδο της γραμμικής παλινδρόμησης, με στόχο την αξιολόγηση και σύγκριση των αποτελεσμάτων. Σκοπός της παρούσας μελέτης είναι η βέλτιστη αξιοποίηση του συνόλου δεδομένων με απώτερο στόχο την ακριβή πρόβλεψη της τιμής κατοικιών.
#Εισαγωγή dataset
dataset<-read.csv("C:/Users/dadak/Desktop/exams/housing.csv")
#Προβολή μεγέθους dataset
dim(dataset)## [1] 21597 21
Το dataset προέρχεται απο το Github.Περιλαμβάνει 21.597 εγγραφές (κατοικίες). Αποτελείται από 20 ανεξάρτητες μεταβλητές (features), οι οποίες περιγράφουν τα χαρακτηριστικά κάθε κατοικίας, καθώς και μία εξαρτημένη μεταβλητή, την «price», η οποία εκφράζει το εκτιμώμενο κόστος της κατοικίας.
Ακολουθεί ο πίνακας με τα ονόματα και τις περιγραφές των μεταβλητών του συνόλου δεδομένων Kings County:
Τέλος παρουσιάζεται ένα Histogram και ενα boxplot με την κατανομή και την διασπορά της τιμής κατοικίας για την περαιτέρω κατανόηση του σύνόλου δεδομένων.
Η Εξερευνητική Ανάλυση Δεδομένων (EDA) αποτελεί ουσιώδες στάδιο σε κάθε ερευνητική διαδικασία, καθώς επιτρέπει την εις βάθος κατανόηση της δομής και των χαρακτηριστικών του συνόλου δεδομένων. Στο παρόν τμήμα πραγματοποιείται η προβολή της δομής του dataset, η εμφάνιση των πρώτων γραμμών για μια πρώτη οπτική επισκόπηση, καθώς και η συνοπτική στατιστική ανάλυση των μεταβλητών. Μέσω αυτών των διαδικασιών επιτυγχάνεται ο εντοπισμός πιθανών ακραίων τιμών, ελλειπτικών δεδομένων ή άλλων ανωμαλιών που ενδέχεται να επηρεάσουν την ορθή εφαρμογή των μεθόδων ανάλυσης που θα ακολουθήσουν.
## 'data.frame': 21597 obs. of 21 variables:
## $ id : num 7.13e+09 6.41e+09 5.63e+09 2.49e+09 1.95e+09 ...
## $ date : chr "10/13/2014" "12/9/2014" "2/25/2015" "12/9/2014" ...
## $ price : int 221900 538000 180000 604000 510000 1230000 257500 291850 229500 323000 ...
## $ bedrooms : int 3 3 2 4 3 4 3 3 3 3 ...
## $ bathrooms : num 1 2.25 1 3 2 4.5 2.25 1.5 1 2.5 ...
## $ sqft_living : int 1180 2570 770 1960 1680 5420 1715 1060 1780 1890 ...
## $ sqft_lot : int 5650 7242 10000 5000 8080 101930 6819 9711 7470 6560 ...
## $ floors : num 1 2 1 1 1 1 2 1 1 2 ...
## $ waterfront : int NA 0 0 0 0 0 0 0 0 0 ...
## $ view : int 0 0 0 0 0 0 0 NA 0 0 ...
## $ condition : int 3 3 3 5 3 3 3 3 3 3 ...
## $ grade : int 7 7 6 7 8 11 7 7 7 7 ...
## $ sqft_above : int 1180 2170 770 1050 1680 3890 1715 1060 1050 1890 ...
## $ sqft_basement: chr "0" "400" "0" "910" ...
## $ yr_built : int 1955 1951 1933 1965 1987 2001 1995 1963 1960 2003 ...
## $ yr_renovated : int 0 1991 NA 0 0 0 0 0 0 0 ...
## $ zipcode : int 98178 98125 98028 98136 98074 98053 98003 98198 98146 98038 ...
## $ lat : num 47.5 47.7 47.7 47.5 47.6 ...
## $ long : num -122 -122 -122 -122 -122 ...
## $ sqft_living15: int 1340 1690 2720 1360 1800 4760 2238 1650 1780 2390 ...
## $ sqft_lot15 : int 5650 7639 8062 5000 7503 101930 6819 9711 8113 7570 ...
## 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 NA 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 NA 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
## id date price bedrooms
## Min. :1.000e+06 Length:21597 Min. : 78000 Min. : 1.000
## 1st Qu.:2.123e+09 Class :character 1st Qu.: 322000 1st Qu.: 3.000
## Median :3.905e+09 Mode :character Median : 450000 Median : 3.000
## Mean :4.580e+09 Mean : 540297 Mean : 3.373
## 3rd Qu.:7.309e+09 3rd Qu.: 645000 3rd Qu.: 4.000
## Max. :9.900e+09 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.: 5040 1st Qu.:1.000
## Median :2.250 Median : 1910 Median : 7618 Median :1.500
## Mean :2.116 Mean : 2080 Mean : 15099 Mean :1.494
## 3rd Qu.:2.500 3rd Qu.: 2550 3rd Qu.: 10685 3rd Qu.:2.000
## Max. :8.000 Max. :13540 Max. :1651359 Max. :3.500
##
## waterfront view condition grade
## Min. :0.0000 Min. :0.0000 Min. :1.00 Min. : 3.000
## 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:3.00 1st Qu.: 7.000
## Median :0.0000 Median :0.0000 Median :3.00 Median : 7.000
## Mean :0.0076 Mean :0.2339 Mean :3.41 Mean : 7.658
## 3rd Qu.:0.0000 3rd Qu.:0.0000 3rd Qu.:4.00 3rd Qu.: 8.000
## Max. :1.0000 Max. :4.0000 Max. :5.00 Max. :13.000
## NA's :2376 NA's :63
## sqft_above sqft_basement yr_built yr_renovated
## Min. : 370 Length:21597 Min. :1900 Min. : 0.00
## 1st Qu.:1190 Class :character 1st Qu.:1951 1st Qu.: 0.00
## Median :1560 Mode :character Median :1975 Median : 0.00
## Mean :1789 Mean :1971 Mean : 83.64
## 3rd Qu.:2210 3rd Qu.:1997 3rd Qu.: 0.00
## Max. :9410 Max. :2015 Max. :2015.00
## NA's :3842
## 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 :1840
## Mean :98078 Mean :47.56 Mean :-122.2 Mean :1987
## 3rd Qu.:98118 3rd Qu.:47.68 3rd Qu.:-122.1 3rd Qu.:2360
## Max. :98199 Max. :47.78 Max. :-121.3 Max. :6210
##
## sqft_lot15
## Min. : 651
## 1st Qu.: 5100
## Median : 7620
## Mean : 12758
## 3rd Qu.: 10083
## Max. :871200
##
Η προεπεξεργασία των δεδομένων αποτελεί ουσιώδες στάδιο πριν από την εκπαίδευση του μοντέλου, καθώς διασφαλίζει ότι πληρούνται οι προϋποθέσεις για την ορθή εφαρμογή της γραμμικής παλινδρόμησης. Στο πλαίσιο αυτό, πραγματοποιείται έλεγχος για διπλότυπες εγγραφές, ακραίες τιμές και εκτός ορίων παρατηρήσεις (outliers), καθώς και επιλογή των κατάλληλων ανεξάρτητων μεταβλητών (features) που θα χρησιμοποιηθούν στη διαδικασία μοντελοποίησης. Η ορθή προεπεξεργασία συμβάλλει καθοριστικά στη βελτίωση της ακρίβειας και της αξιοπιστίας των αποτελεσμάτων που θα προκύψουν από το μοντέλο πρόβλεψης.
Figure3: Εμφάνιση ελλιπών τιμών ανά μεταβλητή
#Οπτικοποιώ την κατανομή τιμών για τα features με πολλά missing values
table(dataset$yr_renovated, useNA = "ifany")##
## 0 1934 1940 1944 1945 1946 1948 1950 1951 1953 1954 1955 1956
## 17011 1 2 1 3 1 1 1 1 1 1 3 3
## 1957 1958 1959 1960 1962 1963 1964 1965 1967 1968 1969 1970 1971
## 2 3 1 3 2 4 5 4 2 7 4 9 1
## 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984
## 3 4 2 5 1 7 3 7 8 4 8 15 16
## 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997
## 14 14 14 11 20 22 16 13 12 14 12 11 12
## 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010
## 16 15 29 15 17 31 22 29 20 30 15 21 15
## 2011 2012 2013 2014 2015 <NA>
## 9 8 31 73 14 3842
##
## 0 1 <NA>
## 19075 146 2376
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
#Αφαίρεση feature year renovated
dataset <- dataset %>% select(-yr_renovated)
#Αντικατάσταση feature waterfront σε 0
dataset$waterfront[is.na(dataset$waterfront)] <- 0Παρατηρείται απο τον πίνακα ότι η μεταβλητή yr_renovated έχει 3842 missing values και 17011 εγγραφές μη καταχωρημένες (year renovated=0). Για τον λόγο αυτό αφαιρείται από το dataset καθώς δεν προσθέτει καμία αξία και διαφοροποίηση για την πρόβλεψη.
Η μεταβλητή waterfront περιέχει missing values που ερμηνεύονται ως έλλειψη θέας σε υδάτινη επιφάνεια (Καθώς αποτελεί το 99,3% του dataset). Για το λόγο αυτό, τα NA αντικαταστάθηκαν με μηδενικές τιμές (0).
## Αρχικός αριθμός γραμμών: 21597
## Αριθμός γραμμών μετά την αφαίρεση: 21534
## Γραμμές που αφαιρέθηκαν: 63
Στο πλαίσιο της προεπεξεργασίας δεδομένων, πραγματοποιήθηκε διαχείριση των missing values. Ειδικότερα, για τις μεταβλητές με περιορισμένο ποσοστό ελλειπτικών παρατηρήσεων σε σχέση με το συνολικό μέγεθος του συνόλου δεδομένων, επιλέχθηκε η αφαίρεση των αντίστοιχων γραμμών. Η επιλογή αυτή δικαιολογείται από το γεγονός ότι οι συγκεκριμένες ελλείψεις δεν αναμένεται να επηρεάσουν ουσιαστικά την ακρίβεια και την αντιπροσωπευτικότητα των αποτελεσμάτων που θα προκύψουν από την ανάλυση.
#Εύρεση και αφαίρεση διπλότυπων
nrow_before<-nrow(dataset)
# Πόσες διπλότυπες γραμμές υπάρχουν;
duplicates_found <- sum(duplicated(dataset))
# Αφαίρεση διπλότυπων
dataset <- dataset[!duplicated(dataset), ]
# Πλήθος συνολικών γραμμών μετά
nrow_after <- nrow(dataset)
# Εκτύπωση αποτελεσμάτων
cat("Διπλότυπες εγγραφές που εντοπίστηκαν και αφαιρέθηκαν:", duplicates_found, "\n")## Διπλότυπες εγγραφές που εντοπίστηκαν και αφαιρέθηκαν: 0
## Γραμμές πριν: 21534 - Γραμμές μετά: 21534
Η διαδικασία επιλογής χαρακτηριστικών αποτελεί καθοριστικό βήμα για τη βελτίωση της αποδοτικότητας και της ακρίβειας ενός μοντέλου πρόβλεψης. Στο πλαίσιο αυτό, απομακρύνω μεταβλητές που δεν συνεισφέρουν ουσιαστική πληροφορία, όπως μοναδικούς αναγνωριστικούς αριθμούς (π.χ. id), καθώς και χαρακτηριστικά με πολύ χαμηλή διακύμανση, τα οποία δεν παρουσιάζουν επαρκή διαφοροποίηση ώστε να συμβάλουν στην εξήγηση της εξαρτημένης μεταβλητής. Η εφαρμογή κατωφλίου διακύμανσης στο 10% του εύρους των τιμών επιτρέπει τον εντοπισμό και την αφαίρεση τέτοιων μη ενημερωτικών χαρακτηριστικών, βελτιώνοντας τη σταθερότητα και την ερμηνευσιμότητα του τελικού μοντέλου.
# Αφαιρώ το id γιατί δεν παρέχει προβλεπτική αξία
dataset <- dataset %>% select(-id)
# Βρίσκω τις αριθμητικές στήλες (εκτός από την εξαρτημένη price)
numeric_cols <- dataset %>%
select(where(is.numeric)) %>%
select(-price)
# Υπολογίζω διακύμανση για κάθε μεταβλητή
variances <- sapply(numeric_cols, var, na.rm = TRUE)
# Υπολογίζω το εύρος (range) για κανονικοποίηση
ranges <- sapply(numeric_cols, function(x) diff(range(x, na.rm = TRUE)))
# Υπολογίζω την αναλογία διακύμανσης προς εύρος
var_ratio <- variances / ranges
# Ορίζω κατώφλι: 10% του εύρους
threshold <- 0.1
# Διατηρώ μεταβλητές που ξεπερνούν το όριο
keep_features <- names(var_ratio[var_ratio > threshold])
# Αποθηκεύω μεταβλητές που αφαιρώ
drop_features <- setdiff(names(numeric_cols), keep_features)
# Ενημερώνω το dataset (κρατώ και την price)
dataset <- dataset %>% select(all_of(keep_features), price)
# Πόσα πριν - πόσα μετά
features_before <- length(names(numeric_cols)) + 1 # +1 για το id που έριξα
features_after <- length(keep_features)
# Δείχνω σύνοψη
cat("Αρχικός αριθμός μεταβλητών (χωρίς την price):", features_before, "\n")## Αρχικός αριθμός μεταβλητών (χωρίς την price): 17
## Αριθμός μεταβλητών που διατηρώ: 11
## Μεταβλητές που διατηρώ: sqft_living sqft_lot floors view condition grade sqft_above yr_built zipcode sqft_living15 sqft_lot15
## Μεταβλητές που αφαιρώ: bedrooms bathrooms waterfront lat long
Για την αξιόπιστη αξιολόγηση της γενικευσιμότητας του μοντέλου γραμμικής παλινδρόμησης, εφαρμόζω cross-validation με διαστρωμάτωση. Συγκεκριμένα, το σύνολο δεδομένων χωρίζεται σε τέσσερις ισομεγέθεις υποομάδες (4-fold), διατηρώντας την κατανομή της εξαρτημένης μεταβλητής στα διαφορετικά folds. Η μεθοδολογία αυτή μειώνει τον κίνδυνο υπερεκπαίδευσης (overfitting) και επιτρέπει την πιο ακριβή εκτίμηση της απόδοσης του μοντέλου σε νέα, αδημοσίευτα δεδομένα.
## Loading required package: lattice
# Δημιουργώ κατηγορική εκδοχή της τιμής για διαστρωμάτωση (π.χ. 4 κατηγορίες)
dataset$strata <- cut(
dataset$price,
breaks = quantile(dataset$price, probs = seq(0, 1, by = 0.25)),
include.lowest = TRUE,
labels = FALSE
)
# Ορίζω 4-fold cross-validation με διαστρωμάτωση
train_control <- trainControl(
method = "cv",
number = 4,
verboseIter = TRUE,
savePredictions = TRUE
)Για την εφαρμογή μοντέλων γραμμικής παλινδρόμησης, πραγματοποιήθηκε αρχικά ανάλυση συσχετίσεων μέσω heatmap, με σκοπό την κατανόηση των σχέσεων μεταξύ των μεταβλητών του συνόλου δεδομένων.
Στον παρακάτω πίνακα περιλαμβάνονται μόνο οι αριθμητικές μεταβλητές, καθώς αυτές είναι κατάλληλες για τη χρήση σε γραμμική παλινδρόμηση.
# Φορτώνεις πακέτα
library(reshape2) # Για να κάνεις melt το correlation matrix
# Κράτησε ΜΟΝΟ αριθμητικές στήλες
num_data <- dataset %>%
select(where(is.numeric))
cor_matrix <- cor(num_data,use = "complete.obs")
knitr::kable(round(cor_matrix, 2), caption = "Πίνακας Συσχετίσεων Μεταβλητών")| sqft_living | sqft_lot | floors | view | condition | grade | sqft_above | yr_built | zipcode | sqft_living15 | sqft_lot15 | price | strata | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| sqft_living | 1.00 | 0.17 | 0.35 | 0.28 | -0.06 | 0.76 | 0.88 | 0.32 | -0.20 | 0.76 | 0.18 | 0.70 | 0.60 |
| sqft_lot | 0.17 | 1.00 | -0.01 | 0.08 | -0.01 | 0.12 | 0.18 | 0.05 | -0.13 | 0.15 | 0.72 | 0.09 | 0.10 |
| floors | 0.35 | -0.01 | 1.00 | 0.03 | -0.26 | 0.46 | 0.52 | 0.49 | -0.06 | 0.28 | -0.01 | 0.26 | 0.29 |
| view | 0.28 | 0.08 | 0.03 | 1.00 | 0.05 | 0.25 | 0.17 | -0.05 | 0.09 | 0.28 | 0.07 | 0.40 | 0.27 |
| condition | -0.06 | -0.01 | -0.26 | 0.05 | 1.00 | -0.15 | -0.16 | -0.36 | 0.00 | -0.09 | 0.00 | 0.04 | 0.03 |
| grade | 0.76 | 0.12 | 0.46 | 0.25 | -0.15 | 1.00 | 0.76 | 0.45 | -0.19 | 0.71 | 0.12 | 0.67 | 0.62 |
| sqft_above | 0.88 | 0.18 | 0.52 | 0.17 | -0.16 | 0.76 | 1.00 | 0.42 | -0.26 | 0.73 | 0.20 | 0.61 | 0.52 |
| yr_built | 0.32 | 0.05 | 0.49 | -0.05 | -0.36 | 0.45 | 0.42 | 1.00 | -0.35 | 0.33 | 0.07 | 0.05 | 0.06 |
| zipcode | -0.20 | -0.13 | -0.06 | 0.09 | 0.00 | -0.19 | -0.26 | -0.35 | 1.00 | -0.28 | -0.15 | -0.05 | -0.02 |
| sqft_living15 | 0.76 | 0.15 | 0.28 | 0.28 | -0.09 | 0.71 | 0.73 | 0.33 | -0.28 | 1.00 | 0.18 | 0.59 | 0.55 |
| sqft_lot15 | 0.18 | 0.72 | -0.01 | 0.07 | 0.00 | 0.12 | 0.20 | 0.07 | -0.15 | 0.18 | 1.00 | 0.08 | 0.09 |
| price | 0.70 | 0.09 | 0.26 | 0.40 | 0.04 | 0.67 | 0.61 | 0.05 | -0.05 | 0.59 | 0.08 | 1.00 | 0.72 |
| strata | 0.60 | 0.10 | 0.29 | 0.27 | 0.03 | 0.62 | 0.52 | 0.06 | -0.02 | 0.55 | 0.09 | 0.72 | 1.00 |
# Υπολογίζεις τον πίνακα συσχετίσεων
corr_matrix <- cor(num_data, use = "complete.obs")
# Μετατρέπεις σε μακρά μορφή
melted_corr <- melt(corr_matrix)
# Σχεδιάζεις το heatmap
ggplot(melted_corr, aes(x = Var1, y = Var2, fill = value)) +
geom_tile(color = "white") +
scale_fill_gradient2(low = "blue", high = "red", mid = "white",
midpoint = 0, limit = c(-1,1), space = "Lab",
name = "Pearson\nCorrelation") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) +
coord_fixed()Σύμφωνα με το correlation matrix η μεταβλητή price φαίνεται να έχει την υψηλότερη συσχέτιση με το feature ‘sqft_living’ (0.70). Για τον λόγο αυτό στο 1ο πείραμα μοντέλων γραμμικής παλινδρόμησης επιλέγεται μόνο αυτό το feature για την πρόβλεψη.
## + Fold1: intercept=TRUE
## - Fold1: intercept=TRUE
## + Fold2: intercept=TRUE
## - Fold2: intercept=TRUE
## + Fold3: intercept=TRUE
## - Fold3: intercept=TRUE
## + Fold4: intercept=TRUE
## - Fold4: intercept=TRUE
## Aggregating results
## Fitting final model on full training set
## # A tibble: 1 × 4
## Model R_squared SSE RMSE
## <chr> <dbl> <dbl> <dbl>
## 1 1 Feature 0.492 1.47e15 260896.
## Model R_squared SSE RMSE
## Length:1 Min. :0.4917 Min. :1.465e+15 Min. :260896
## Class :character 1st Qu.:0.4917 1st Qu.:1.465e+15 1st Qu.:260896
## Mode :character Median :0.4917 Median :1.465e+15 Median :260896
## Mean :0.4917 Mean :1.465e+15 Mean :260896
## 3rd Qu.:0.4917 3rd Qu.:1.465e+15 3rd Qu.:260896
## Max. :0.4917 Max. :1.465e+15 Max. :260896
Σχολιασμός Αποτελεσμάτων 1ου Μοντέλου
Το πρώτο μοντέλο γραμμικής παλινδρόμησης, το οποίο βασίζεται
αποκλειστικά στη μεταβλητή sqft_living, παρουσιάζει
συντελεστή προσδιορισμού (R²) περίπου 0.49. Αυτό σημαίνει ότι το μοντέλο
εξηγεί περίπου το 49% της διακύμανσης της τιμής των κατοικιών, γεγονός
που είναι αναμενόμενο, καθώς χρησιμοποιείται μόνο μία ανεξάρτητη
μεταβλητή. Η τιμή του SSE (1.47e15) και του RMSE (~260,863) υποδεικνύουν
ότι η ακρίβεια πρόβλεψης μπορεί να βελτιωθεί περαιτέρω με την προσθήκη
επιπλέον σχετικών χαρακτηριστικών στο μοντέλο.
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## `geom_smooth()` using formula = 'y ~ x'
Στο παραπάνω διάγραμμα παρουσιάζεται η σχέση μεταξύ της τιμής
κατοικίας και του εμβαδού κατοικίας (sqft_living) για το
πρώτο μοντέλο γραμμικής παλινδρόμησης. Παρατηρείται μια σαφής θετική
γραμμική συσχέτιση, όπως καταδεικνύεται από τη γραμμή παλινδρόμησης, η
οποία επιβεβαιώνει ότι η αύξηση του εμβαδού συνδέεται με αύξηση της
τιμής. Ωστόσο, η διασπορά των σημείων γύρω από τη γραμμή υποδεικνύει την
ύπαρξη σημαντικής μεταβλητότητας, γεγονός που αιτιολογεί την ανάγκη
ενίσχυσης του μοντέλου με επιπλέον μεταβλητές.
Για το 2ο μοντέλο γραμμικής παλινδρόμησης αυξάνεται η πολυπλοκότητα του μοντέλου και χρησιμοποιείται και το feature ‘grade’ που έχει την 2η μεγαλύτερη συσχέτιση, με στόχο να αυξήσουμε την προβλεπτική ικανότητα του μοντέλου.
## + Fold1: intercept=TRUE
## - Fold1: intercept=TRUE
## + Fold2: intercept=TRUE
## - Fold2: intercept=TRUE
## + Fold3: intercept=TRUE
## - Fold3: intercept=TRUE
## + Fold4: intercept=TRUE
## - Fold4: intercept=TRUE
## Aggregating results
## Fitting final model on full training set
## # A tibble: 1 × 4
## Model R_squared SSE RMSE
## <chr> <dbl> <dbl> <dbl>
## 1 2 Features 0.535 1.34e15 249696.
##
## Call:
## lm(formula = .outcome ~ ., data = dat)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1060805 -138190 -25053 100386 4803911
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6.022e+05 1.331e+04 -45.24 <2e-16 ***
## sqft_living 1.830e+02 2.866e+00 63.85 <2e-16 ***
## grade 9.946e+04 2.242e+03 44.35 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 249700 on 21531 degrees of freedom
## Multiple R-squared: 0.5347, Adjusted R-squared: 0.5347
## F-statistic: 1.237e+04 on 2 and 21531 DF, p-value: < 2.2e-16
Σχολιασμός Αποτελεσμάτων 2ου Μοντέλου
Στο δεύτερο μοντέλο γραμμικής παλινδρόμησης, η χρήση της πρόσθετης
μεταβλητής grade είχε ως αποτέλεσμα τη βελτίωση του
συντελεστή προσδιορισμού (R²) από 0.49 σε περίπου 0.53. Αυτό δείχνει ότι
το μοντέλο εξηγεί πλέον περίπου το 53% της διακύμανσης της τιμής
κατοικίας, έναντι του 49% που επιτύγχανε το απλούστερο μοντέλο με μόνο
το sqft_living. Παράλληλα, παρατηρείται μείωση του RMSE
(από ~260,863 σε ~249,838) και μείωση του SSE, γεγονός που υποδηλώνει
μικρότερο συνολικό σφάλμα πρόβλεψης. Η σύγκριση αυτή καταδεικνύει ότι η
προσθήκη ενός σχετικού χαρακτηριστικού μπορεί να βελτιώσει σημαντικά την
προβλεπτική ικανότητα του μοντέλου.
Για το 3ο μοντέλο γραμμικής παλινδρόμησης αυξάνεται η πολυπλοκότητα του μοντέλου και χρησιμοποιείται όλα τα features που έχουμε επιλέξει απο το feature selection ώστε να αυξηθεί ακόμα περισσότερο η ικανότητα του μοντέλου να προβλέπει σωστά τις τιμές μειώνοντας τo σφάλμα
## + Fold1: intercept=TRUE
## - Fold1: intercept=TRUE
## + Fold2: intercept=TRUE
## - Fold2: intercept=TRUE
## + Fold3: intercept=TRUE
## - Fold3: intercept=TRUE
## + Fold4: intercept=TRUE
## - Fold4: intercept=TRUE
## Aggregating results
## Fitting final model on full training set
## # A tibble: 1 × 4
## Model R_squared SSE RMSE
## <chr> <dbl> <dbl> <dbl>
## 1 All Features 0.689 8.96e14 204123.
##
## Call:
## lm(formula = .outcome ~ ., data = dat)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1024685 -90572 -6462 65762 4922391
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.401e+07 2.949e+06 4.751 2.04e-06 ***
## sqft_living 1.216e+02 3.748e+00 32.457 < 2e-16 ***
## sqft_lot -9.669e-02 4.847e-02 -1.995 0.046073 *
## floors 2.052e+03 3.536e+03 0.580 0.561750
## view 7.111e+04 1.989e+03 35.750 < 2e-16 ***
## condition 7.783e+03 2.349e+03 3.313 0.000926 ***
## grade 7.967e+04 2.241e+03 35.550 < 2e-16 ***
## sqft_above 1.864e+01 4.288e+00 4.347 1.39e-05 ***
## yr_built -2.188e+03 6.613e+01 -33.093 < 2e-16 ***
## zipcode -1.055e+02 2.964e+01 -3.558 0.000374 ***
## sqft_living15 -1.721e+01 3.491e+00 -4.928 8.35e-07 ***
## sqft_lot15 -4.068e-01 7.398e-02 -5.499 3.86e-08 ***
## strata 1.141e+05 1.775e+03 64.259 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 204000 on 21521 degrees of freedom
## Multiple R-squared: 0.6896, Adjusted R-squared: 0.6895
## F-statistic: 3985 on 12 and 21521 DF, p-value: < 2.2e-16
Το τρίτο μοντέλο γραμμικής παλινδρόμησης, το οποίο περιλαμβάνει όλα τα χαρακτηριστικά που επιλέχθηκαν στο στάδιο επιλογής μεταβλητών, παρουσιάζει αισθητά βελτιωμένη επίδοση σε σχέση με τα προηγούμενα πειράματα. Ο συντελεστής προσδιορισμού (R²) ανέρχεται πλέον σε περίπου 0.69, γεγονός που σημαίνει ότι το μοντέλο εξηγεί σχεδόν το 69% της συνολικής διακύμανσης της τιμής κατοικίας. Παράλληλα, το RMSE μειώθηκε σημαντικά (~204,059), υποδεικνύοντας χαμηλότερο μέσο σφάλμα πρόβλεψης. Η σύγκριση αυτή επιβεβαιώνει ότι η ενσωμάτωση περισσότερων κατάλληλων χαρακτηριστικών συμβάλλει ουσιαστικά στη βελτίωση της ακρίβειας του μοντέλου.
Η παρούσα εργασία ανέδειξε τη σημασία της δομημένης και συστηματικής
ανάλυσης ενός συνόλου δεδομένων που αφορά τιμές κατοικιών στην περιοχή
του Kings County. Η αρχική διερεύνηση (EDA) επέτρεψε την κατανόηση της
δομής και των βασικών στατιστικών χαρακτηριστικών του dataset,
αναδεικνύοντας πιθανά προβλήματα όπως ελλειπτικά δεδομένα, ακραίες τιμές
και διπλότυπες εγγραφές. Μέσα από στοχευμένη προεπεξεργασία, αφαιρέθηκαν
μη χρήσιμα χαρακτηριστικά (π.χ. id), αντικαταστάθηκαν τιμές
με λογικές παραδοχές (π.χ. waterfront), αφαιρέθηκαν γραμμές
με περιορισμένα ελλείποντα δεδομένα και αντιμετωπίστηκαν οι διπλότυπες
εγγραφές, διασφαλίζοντας έτσι την αξιοπιστία της περαιτέρω ανάλυσης.
Η εφαρμογή εξερευνητικής ανάλυσης συσχετίσεων μέσω heatmap ανέδειξε
τα πιο ισχυρά χαρακτηριστικά που σχετίζονται με την τιμή της κατοικίας,
επιβεβαιώνοντας τη σημασία του sqft_living και του
grade ως βασικών παραμέτρων. Η διαδικασία επιλογής
χαρακτηριστικών, με κριτήριο τη διακύμανση, επέτρεψε την απομάκρυνση
μεταβλητών με περιορισμένη διαφοροποίηση που δεν συνεισέφεραν ουσιαστική
πληροφορία στο τελικό μοντέλο, μειώνοντας έτσι τον θόρυβο και αυξάνοντας
τη σταθερότητα των αποτελεσμάτων.
Η σύγκριση τριών διαφορετικών πειραμάτων γραμμικής παλινδρόμησης
ανέδειξε τη σημασία της προσεκτικής επιλογής και συνδυαστικής
αξιοποίησης των κατάλληλων χαρακτηριστικών. Το αρχικό μοντέλο, που
βασίστηκε αποκλειστικά στο sqft_living, πέτυχε ένα R²
περίπου 49%, δείχνοντας τις περιορισμένες δυνατότητες ενός απλού
μονοδιάστατου μοντέλου. Η προσθήκη του grade αύξησε το R²
σε περίπου 53% και μείωσε το μέσο σφάλμα πρόβλεψης (RMSE),
επιβεβαιώνοντας την προστιθέμενη αξία της σωστής επιλογής πρόσθετων
μεταβλητών. Το τελικό μοντέλο, που αξιοποίησε το πλήρες σύνολο των
επιλεγμένων χαρακτηριστικών, κατέγραψε περαιτέρω αύξηση του R² σε
περίπου 69% και σημαντική μείωση του RMSE, καταδεικνύοντας την ισχυρή
συμβολή της πολυπαραγοντικής προσέγγισης στην ακρίβεια της
πρόβλεψης.
Συνολικά, η εργασία αυτή αποδεικνύει ότι η προσεκτική εξερευνητική ανάλυση, η κατάλληλη προεπεξεργασία και η μεθοδική επιλογή μεταβλητών αποτελούν καθοριστικούς παράγοντες για την ανάπτυξη αξιόπιστων και αποδοτικών μοντέλων γραμμικής παλινδρόμησης, τα οποία μπορούν να αξιοποιηθούν αποτελεσματικά για την εκτίμηση της τιμής κατοικιών ή άλλων παρόμοιων προβλημάτων πρόβλεψης.