Μια κλινική θέλει ένα διαφανές, ελέγξιμο σύστημα υποστήριξης απόφασης που να προτείνει φάρμακο για νέο ασθενή. Επειδή πρόκειται για ιατρική απόφαση, οι γιατροί απαιτούν ένα μοντέλο που να μπορεί να εξηγηθεί ως σαφείς κανόνες «αν–τότε», όχι ως «μαύρο κουτί».

Καθώς πρόκειται για αποφάσεις που πρέπει να ληφθούν με σαφείς κανόνες, η μέθοδος που θα χρησιμοποιηθεί είναι τα δέντρα απόφασης.

Ένα δένδρο απόφασης μπορεί να εξάγει κανόνες οι οποίοι μπορούν εύκολα να κατανοηθούν και να ερμηνευτούν από το χρήστη. Παράγουν προβλέψεις σε μορφή κανόνων και, άρα, ερμηνεύσιμα από τον χρήστη αποτελέσματα.

#About Dataset ##Content The target feature is

Drug type

The feature sets are:

Age
Sex
Blood Pressure Levels (BP)
Cholesterol Levels
Na to Potassium Ration
data <- read_csv("drug200.csv")
## Rows: 200 Columns: 6
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (4): Sex, BP, Cholesterol, Drug
## dbl (2): Age, Na_to_K
## 
## ℹ 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(data)
summary(data)
##       Age            Sex                 BP            Cholesterol       
##  Min.   :15.00   Length:200         Length:200         Length:200        
##  1st Qu.:31.00   Class :character   Class :character   Class :character  
##  Median :45.00   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :44.31                                                           
##  3rd Qu.:58.00                                                           
##  Max.   :74.00                                                           
##     Na_to_K           Drug          
##  Min.   : 6.269   Length:200        
##  1st Qu.:10.445   Class :character  
##  Median :13.937   Mode  :character  
##  Mean   :16.084                     
##  3rd Qu.:19.380                     
##  Max.   :38.247

#Ερώτηση 1

#Δημιουργία μοντέλου CART
install.packages("caTools")
## Installing package into 'C:/Users/stavr/AppData/Local/R/win-library/4.5'
## (as 'lib' is unspecified)
## package 'caTools' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\stavr\AppData\Local\Temp\RtmpoDKX6X\downloaded_packages
library(caTools)
## Warning: package 'caTools' was built under R version 4.5.3
set.seed(3000)
spl <- sample.split(data$Drug, SplitRatio = 0.7)
Train <- subset(data, spl==TRUE) 
Test <- subset(data, spl==FALSE)

install.packages("rpart")
## Installing package into 'C:/Users/stavr/AppData/Local/R/win-library/4.5'
## (as 'lib' is unspecified)
## package 'rpart' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\stavr\AppData\Local\Temp\RtmpoDKX6X\downloaded_packages
library(rpart)
## Warning: package 'rpart' was built under R version 4.5.3
install.packages("rpart.plot")
## Installing package into 'C:/Users/stavr/AppData/Local/R/win-library/4.5'
## (as 'lib' is unspecified)
## package 'rpart.plot' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\stavr\AppData\Local\Temp\RtmpoDKX6X\downloaded_packages
library(rpart.plot)
## Warning: package 'rpart.plot' was built under R version 4.5.3
DrugTree <- rpart(Drug ~ Age + Sex + BP + Cholesterol + Na_to_K, data = Train, method="class", minbucket=25)

summary(DrugTree)
## Call:
## rpart(formula = Drug ~ Age + Sex + BP + Cholesterol + Na_to_K, 
##     data = Train, method = "class", minbucket = 25)
##   n= 140 
## 
##          CP nsplit rel error    xerror       xstd
## 1 0.5000000      0 1.0000000 1.0000000 0.07755667
## 2 0.2105263      1 0.5000000 0.5131579 0.06979356
## 3 0.0100000      2 0.2894737 0.5131579 0.06979356
## 
## Variable importance
## Na_to_K      BP     Age 
##      66      30       4 
## 
## Node number 1: 140 observations,    complexity param=0.5
##   predicted class=DrugY  expected loss=0.5428571  P(node) =1
##     class counts:    16    11    11    38    64
##    probabilities: 0.114 0.079 0.079 0.271 0.457 
##   left son=2 (76 obs) right son=3 (64 obs)
##   Primary splits:
##       Na_to_K     < 14.8285 to the left,  improve=46.4240600, (0 missing)
##       BP          splits as  LRR,         improve=11.6393400, (0 missing)
##       Age         < 48.5    to the left,  improve= 2.6315610, (0 missing)
##       Cholesterol splits as  LR,          improve= 2.1412700, (0 missing)
##       Sex         splits as  RL,          improve= 0.2096639, (0 missing)
##   Surrogate splits:
##       Age < 18.5    to the right, agree=0.564, adj=0.047, (0 split)
##       BP  splits as  RLL,         agree=0.550, adj=0.016, (0 split)
## 
## Node number 2: 76 observations,    complexity param=0.2105263
##   predicted class=drugX  expected loss=0.5  P(node) =0.5428571
##     class counts:    16    11    11    38     0
##    probabilities: 0.211 0.145 0.145 0.500 0.000 
##   left son=4 (27 obs) right son=5 (49 obs)
##   Primary splits:
##       BP          splits as  LRR,         improve=20.3491100, (0 missing)
##       Age         < 53.5    to the left,  improve= 4.7568920, (0 missing)
##       Cholesterol splits as  LR,          improve= 3.6961490, (0 missing)
##       Na_to_K     < 10.1085 to the right, improve= 0.9276552, (0 missing)
##       Sex         splits as  RL,          improve= 0.2187970, (0 missing)
##   Surrogate splits:
##       Age     < 67.5    to the right, agree=0.658, adj=0.037, (0 split)
##       Na_to_K < 12.7345 to the right, agree=0.658, adj=0.037, (0 split)
## 
## Node number 3: 64 observations
##   predicted class=DrugY  expected loss=0  P(node) =0.4571429
##     class counts:     0     0     0     0    64
##    probabilities: 0.000 0.000 0.000 0.000 1.000 
## 
## Node number 4: 27 observations
##   predicted class=drugA  expected loss=0.4074074  P(node) =0.1928571
##     class counts:    16    11     0     0     0
##    probabilities: 0.593 0.407 0.000 0.000 0.000 
## 
## Node number 5: 49 observations
##   predicted class=drugX  expected loss=0.2244898  P(node) =0.35
##     class counts:     0     0    11    38     0
##    probabilities: 0.000 0.000 0.224 0.776 0.000

Παρατηρούμε ότι η μεταβλητή με τη μεγαλύτερη σημασία είναι η Na_to_K.

#Πρόβλεψη
PredictCART <- predict (DrugTree, newdata=Test, type='class')

table(Test$Drug, PredictCART)
##        PredictCART
##         drugA drugB drugC drugX DrugY
##   drugA     7     0     0     0     0
##   drugB     5     0     0     0     0
##   drugC     0     0     0     5     0
##   drugX     0     0     0    16     0
##   DrugY     0     0     0     0    27

##Ερώτηση 2 Αν Na_to_K > 15 τότε DrugY Αν Na_to_K < 10 και BP = NORMAL τότε DrugX

##Ερώτηση 3 Στο εύρος τιμών του Na_to_K 15 - 40 επικρατεί μία τιμή φαρμάκων.

##Ερώτηση 4 Δυσκολότερο να προβλεφθεί είναι το DrugY, μιας και έχει το μεγαλύτερο ποσοστό expected loss.

Αυτό ίσως συμβαίνει εξαιτίας του μεγάλου εύρους των τιμών στη μεταβλητή Na_to_K και της μεγάλης σημασίας της μεταβλητής αυτής.

##Ερώτηση 5