1. Εισαγωγή

Στην εργασία αυτή εφαρμόζονται δύο μοντέλα ταξινόμησης: Decision Trees (CART) και Logistic Regression. Στόχος είναι η πρόβλεψη της μεταβλητής Unconst με βάση τα χαρακτηριστικά του dataset.

2. Φόρτωση Dataset

Γίνεται εισαγωγή των δεδομένων στο R από αρχείο CSV ώστε να είναι διαθέσιμα για ανάλυση.

data <- read.csv("stevens.csv", stringsAsFactors = FALSE)
library(rpart)
library(rpart.plot)
## Warning: package 'rpart.plot' was built under R version 4.5.3
library(nnet)

3. Έλεγχος Δεδομένων

Ελέγχουμε τη δομή, τις πρώτες γραμμές και βασικά στατιστικά για να κατανοήσουμε τα χαρακτηριστικά του dataset.

head(data)
##    Docket Term Circuit            Issue Petitioner Respondent LowerCourt
## 1 93-1408 1994     2nd EconomicActivity   BUSINESS   BUSINESS    liberal
## 2 93-1577 1994     9th EconomicActivity   BUSINESS   BUSINESS    liberal
## 3 93-1612 1994     5th EconomicActivity   BUSINESS   BUSINESS    liberal
## 4  94-623 1994     1st EconomicActivity   BUSINESS   BUSINESS     conser
## 5 94-1175 1995     7th    JudicialPower   BUSINESS   BUSINESS     conser
## 6  95-129 1995     9th EconomicActivity   BUSINESS   BUSINESS     conser
##   Unconst Reverse
## 1       0       1
## 2       0       1
## 3       0       1
## 4       0       1
## 5       0       1
## 6       1       0
str(data)
## 'data.frame':    566 obs. of  9 variables:
##  $ Docket    : chr  "93-1408" "93-1577" "93-1612" "94-623" ...
##  $ Term      : int  1994 1994 1994 1994 1995 1995 1996 1997 1997 1999 ...
##  $ Circuit   : chr  "2nd" "9th" "5th" "1st" ...
##  $ Issue     : chr  "EconomicActivity" "EconomicActivity" "EconomicActivity" "EconomicActivity" ...
##  $ Petitioner: chr  "BUSINESS" "BUSINESS" "BUSINESS" "BUSINESS" ...
##  $ Respondent: chr  "BUSINESS" "BUSINESS" "BUSINESS" "BUSINESS" ...
##  $ LowerCourt: chr  "liberal" "liberal" "liberal" "conser" ...
##  $ Unconst   : int  0 0 0 0 0 1 0 1 0 0 ...
##  $ Reverse   : int  1 1 1 1 1 0 1 1 1 1 ...
summary(data)
##     Docket               Term        Circuit             Issue          
##  Length:566         Min.   :1994   Length:566         Length:566        
##  Class :character   1st Qu.:1995   Class :character   Class :character  
##  Mode  :character   Median :1997   Mode  :character   Mode  :character  
##                     Mean   :1997                                        
##                     3rd Qu.:1999                                        
##                     Max.   :2001                                        
##   Petitioner         Respondent         LowerCourt           Unconst      
##  Length:566         Length:566         Length:566         Min.   :0.0000  
##  Class :character   Class :character   Class :character   1st Qu.:0.0000  
##  Mode  :character   Mode  :character   Mode  :character   Median :0.0000  
##                                                           Mean   :0.2473  
##                                                           3rd Qu.:0.0000  
##                                                           Max.   :1.0000  
##     Reverse      
##  Min.   :0.0000  
##  1st Qu.:0.0000  
##  Median :1.0000  
##  Mean   :0.5459  
##  3rd Qu.:1.0000  
##  Max.   :1.0000
colnames(data)
## [1] "Docket"     "Term"       "Circuit"    "Issue"      "Petitioner"
## [6] "Respondent" "LowerCourt" "Unconst"    "Reverse"

4. Προεπεξεργασία Δεδομένων

Μετατρέπουμε τις κατηγορικές μεταβλητές σε factor ώστε να μπορούν να χρησιμοποιηθούν σωστά στα μοντέλα ταξινόμησης.

data$Unconst <- as.factor(data$Unconst)

data$Docket <- as.factor(data$Docket)
data$Term <- as.factor(data$Term)
data$Circuit <- as.factor(data$Circuit)
data$Issue <- as.factor(data$Issue)
data$Petitioner <- as.factor(data$Petitioner)
data$Respondent <- as.factor(data$Respondent)
data$LowerCourt <- as.factor(data$LowerCourt)

5. Διαχωρισμός Training / Test Set

Χωρίζουμε τα δεδομένα σε σύνολο εκπαίδευσης και ελέγχου για να αξιολογήσουμε την απόδοση των μοντέλων σε νέα δεδομένα.

set.seed(123)

sample_index <- sample(1:nrow(data), 0.7 * nrow(data))

train <- data[sample_index, ]
test <- data[-sample_index, ]

test$Docket <- factor(test$Docket, levels = levels(train$Docket))
test$Term <- factor(test$Term, levels = levels(train$Term))
test$Circuit <- factor(test$Circuit, levels = levels(train$Circuit))
test$Issue <- factor(test$Issue, levels = levels(train$Issue))
test$Petitioner <- factor(test$Petitioner, levels = levels(train$Petitioner))
test$Respondent <- factor(test$Respondent, levels = levels(train$Respondent))
test$LowerCourt <- factor(test$LowerCourt, levels = levels(train$LowerCourt))

6. Decision Tree (CART)

Δημιουργείται το μοντέλο δέντρου αποφάσεων, το οποίο χωρίζει τα δεδομένα με βάση κανόνες και χαρακτηριστικά για να κάνει προβλέψεις.

library(rpart)
library(rpart.plot)

tree_model <- rpart(Unconst ~ Docket + Term + Circuit + Issue + Petitioner + Respondent + LowerCourt,
                    data = train,
                    method = "class")

rpart.plot(tree_model)

# 7. Αξιολόγηση CART Υπολογίζουμε τις προβλέψεις του μοντέλου και μετράμε την ακρίβεια του μέσω confusion matrix και accuracy.

pred_tree <- predict(tree_model, test, type = "class")

conf_tree <- table(Predicted = pred_tree, Actual = test$Unconst)
conf_tree
##          Actual
## Predicted   0   1
##         0 114  21
##         1  20  15
accuracy_tree <- mean(pred_tree == test$Unconst)
accuracy_tree
## [1] 0.7588235

8. Logistic Regression

Εκπαιδεύεται ένα μοντέλο λογιστικής παλινδρόμησης που εκτιμά πιθανότητες για κάθε κατηγορία της μεταβλητής στόχου.

library(nnet)

log_model <- multinom(Unconst ~ Docket + Term + Circuit + Issue + Petitioner + Respondent + LowerCourt,
                      data = train)
## # weights:  619 (618 variable)
## initial  value 274.486284 
## iter  10 value 22.885837
## iter  20 value 0.112832
## iter  30 value 0.000882
## final  value 0.000065 
## converged

9. Αξιολόγηση Logistic Regression

Γίνονται προβλέψεις στο test set και υπολογίζεται η απόδοση του μοντέλου.

pred_log <- predict(log_model, test)

conf_log <- table(Predicted = pred_log, Actual = test$Unconst)
conf_log
##          Actual
## Predicted   0   1
##         0 107  14
##         1  27  22
accuracy_log <- mean(pred_log == test$Unconst)
accuracy_log
## [1] 0.7588235

10. Σύγκριση Μοντέλων

Συγκρίνεται η ακρίβεια των δύο μοντέλων για να αξιολογηθεί ποιο αποδίδει καλύτερα.

results <- data.frame(
  Model = c("Decision Tree (CART)", "Logistic Regression"),
  Accuracy = c(accuracy_tree, accuracy_log)
)

results
##                  Model  Accuracy
## 1 Decision Tree (CART) 0.7588235
## 2  Logistic Regression 0.7588235

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

Το Decision Tree παρέχει καλύτερη ερμηνευσιμότητα, ενώ η Logistic Regression προσφέρει πιο σταθερές προβλέψεις. Η επιλογή μοντέλου εξαρτάται από την ακρίβεια και την ανάγκη ερμηνείας.