title: “Assignment 4 - LDA” output: html_notebook — library(‘dplyr’) library(‘stargazer’) library(‘caret’) library(‘MASS’) library ( “ISLR” ) library(“psych”) library(“MASS”) library(“ggord”) library(“devtools”) library(“ggplot2”) library(“tidyverse”) library(“survival”)

install.packages(“epitools”) library(epitools)

hotel_data <- read.csv("C:/Users/Issac/OneDrive/Desktop/Meharry/MSDS 565 Predictive Modeling and Analytics/Predicitive Modeling/Hotel.csv")

### Visualize the data
# Install the psych package if you haven't already
install.packages("psych")
WARNING: Rtools is required to build R packages but is not currently installed. Please download and install the appropriate version of Rtools before proceeding:

https://cran.rstudio.com/bin/windows/Rtools/
Installing package into ‘C:/Users/Issac/AppData/Local/R/win-library/4.3’
(as ‘lib’ is unspecified)
trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.3/psych_2.4.6.26.zip'
Content type 'application/zip' length 3720730 bytes (3.5 MB)
downloaded 3.5 MB
package ‘psych’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
    C:\Users\Issac\AppData\Local\Temp\RtmpsxsHlm\downloaded_packages
# Load the psych package
library(psych)
Warning: package ‘psych’ was built under R version 4.3.3
Attaching package: ‘psych’

The following objects are masked from ‘package:ggplot2’:

    %+%, alpha
# Now you can use the pairs.panels function
pairs.panels(hotel_data[15:16], gap = 0, bg = c("red", "green"))



head(hotel_data)
nrow(hotel$status)
Error: object 'hotel' not found
### Odds Ratio_

### Example Approach
# Sample data a <- 50 # previous cancellations with current cancellations b <- 30 # previous cancellations without current cancellations c <- 20 # no previous cancellations with current cancellations d <- 100 # no previous cancellations without current cancellations


## Create a matrix table <- matrix(c(npc, pc, cc, ncc), ncol=2)##


### People who do not have previous cancellations

npc = length(which(hotel_data$previous_cancellations!=0))
npc
[1] 338
### People who do have previous cancellations

pc = length(which(hotel_data$previous_cancellations==0))

### People who do have current cancellations

cc = length(which(hotel_data$status=="Canceled"))

### People who do not have current cancellations

ncc = length(which(hotel_data$status == "Not_Canceled"))

df1 <- cbind(npc,pc,cc,ncc)
df1
     npc    pc    cc   ncc
[1,] 338 35937 11885 24390
table <- matrix(c(npc, pc, cc, ncc), ncol=2)
table
      [,1]  [,2]
[1,]   338 11885
[2,] 35937 24390
## 1. Among previous cancellations, what is the odds that have current cancellation

Odds_Ratio <-(npc*ncc)/(cc*pc)

Odds_Ratio
[1] 0.01930134
### Which type of room is more likely to have current booking cancelled?

 table(hotel_data$room_type,hotel_data$status)
             
              Canceled Not_Canceled
  Room_Type 1     9072        19058
  Room_Type 2      228          464
  Room_Type 3        2            5
  Room_Type 4     2069         3988
  Room_Type 5       72          193
  Room_Type 6      406          560
  Room_Type 7       36          122
 newc = which(hotel_data$status == "Canceled")/which(hotel_data$status == "Not_Canceled")
Warning: longer object length is not a multiple of shorter object length
## Room type  6 is more likely to have current booking cancelled as it has a 42% cancellation rate. 
##Preprossesing
# Remove rows with missing values
hotel_data <- na.omit(hotel_data)

# Replace infinite values with NA
hotel_data[sapply(hotel_data, is.infinite)] <- NA

# Optionally, you can impute missing values
# For example, using the mean for numeric columns
hotel_data[is.na(hotel_data)] <- lapply(hotel_data, function(x) if(is.numeric(x)) mean(x, na.rm = TRUE) else x)
#Pick 5 to 8 predictors, split your data, 70% training and 30% testing, outcome variable is status

Reduced_set <- hotel_data[,c("previous_bookings_not_canceled","status","previous_cancellations","avg_room_price","room_type","lead_time")]

print(Reduced_set)
### Setting Training and Testing Data

install.packages("caret")
Error in install.packages : Updating loaded packages
library(caret)
Warning: package ‘caret’ was built under R version 4.3.3Loading required package: ggplot2
Warning: package ‘ggplot2’ was built under R version 4.3.3Loading required package: lattice
# Determine the number of rows in the dataset
num_rows <- nrow(Reduced_set)

# Calculate the number of rows for the training set (70% of the data)
train_size <- round(0.7 * num_rows)

# Create a random sample of row indices for the training set
train_indices <- sample(1:num_rows, size = train_size)

# Split the data into training and testing sets
training_data <- Reduced_set[train_indices, ]
testing_data <- Reduced_set[-train_indices, ]

# Print a summary of the training and testing data
summary(training_data)
 previous_bookings_not_canceled     status  previous_cancellations
 Min.   : 0.0000                Min.   :0   Min.   : 0.0000       
 1st Qu.: 0.0000                1st Qu.:0   1st Qu.: 0.0000       
 Median : 0.0000                Median :0   Median : 0.0000       
 Mean   : 0.1563                Mean   :0   Mean   : 0.0239       
 3rd Qu.: 0.0000                3rd Qu.:0   3rd Qu.: 0.0000       
 Max.   :58.0000                Max.   :0   Max.   :13.0000       
 avg_room_price    room_type           lead_time     
 Min.   :  0.00   Length:25392       Min.   :  0.00  
 1st Qu.: 80.75   Class :character   1st Qu.: 17.00  
 Median : 99.95   Mode  :character   Median : 57.00  
 Mean   :103.51                      Mean   : 85.59  
 3rd Qu.:120.60                      3rd Qu.:127.00  
 Max.   :540.00                      Max.   :443.00  
summary(testing_data)
 previous_bookings_not_canceled     status  previous_cancellations
 Min.   : 0.0000                Min.   :0   Min.   : 0.00000      
 1st Qu.: 0.0000                1st Qu.:0   1st Qu.: 0.00000      
 Median : 0.0000                Median :0   Median : 0.00000      
 Mean   : 0.1466                Mean   :0   Mean   : 0.02205      
 3rd Qu.: 0.0000                3rd Qu.:0   3rd Qu.: 0.00000      
 Max.   :53.0000                Max.   :0   Max.   :13.00000      
 avg_room_price    room_type           lead_time    
 Min.   :  0.00   Length:10883       Min.   :  0.0  
 1st Qu.: 80.04   Class :character   1st Qu.: 17.0  
 Median : 99.00   Mode  :character   Median : 57.0  
 Mean   :103.22                      Mean   : 84.4  
 3rd Qu.:120.00                      3rd Qu.:124.0  
 Max.   :349.63                      Max.   :443.0  
# Check the dimensions of the split data
dim(training_data)
[1] 25392     6
dim(testing_data)
[1] 10883     6


## Build a linear discriminant analysis model, report confusion matrix and accuracy
library('MASS')
# Fit the LDA model
lda_model <- lda(status ~., data = Reduced_set)

summary(lda_model)

## Visualizing the lda model
ggplot2::aes(hotel_data$status,hotel_data$previous_bookings_not_canceled)
lda2 <- predict(lda1,type="response")

training_data
### Build a logistic regression model, accuracy



unique(Reduced_set$status)
[1] 0
Reduced_set$status <- ifelse(Reduced_set$status == "yes", 1, 0)
Reduced_set$status <- as.numeric(Reduced_set$status)
logit1 <- glm(status ~ ., data = Reduced_set, family = binomial)
Warning: glm.fit: algorithm did not converge
exp(coef(logit1))
                   (Intercept) previous_bookings_not_canceled 
                  2.900701e-12                   1.000000e+00 
        previous_cancellations                 avg_room_price 
                  1.000000e+00                   1.000000e+00 
          room_typeRoom_Type 2           room_typeRoom_Type 3 
                  1.000000e+00                   1.000000e+00 
          room_typeRoom_Type 4           room_typeRoom_Type 5 
                  1.000000e+00                   1.000000e+00 
          room_typeRoom_Type 6           room_typeRoom_Type 7 
                  1.000000e+00                   1.000000e+00 
                     lead_time 
                  1.000000e+00 
LS0tDQoNCnRpdGxlOiAiQXNzaWdubWVudCA0IC0gTERBIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCmxpYnJhcnkoJ2RwbHlyJykNCmxpYnJhcnkoJ3N0YXJnYXplcicpDQpsaWJyYXJ5KCdjYXJldCcpDQpsaWJyYXJ5KCdNQVNTJykNCmxpYnJhcnkgKCAiSVNMUiIgKQ0KbGlicmFyeSgicHN5Y2giKQ0KbGlicmFyeSgiTUFTUyIpDQpsaWJyYXJ5KCJnZ29yZCIpDQpsaWJyYXJ5KCJkZXZ0b29scyIpDQpsaWJyYXJ5KCJnZ3Bsb3QyIikNCmxpYnJhcnkoInRpZHl2ZXJzZSIpDQpsaWJyYXJ5KCJzdXJ2aXZhbCIpDQoNCmluc3RhbGwucGFja2FnZXMoImVwaXRvb2xzIikNCmxpYnJhcnkoZXBpdG9vbHMpDQoNCg0KDQpgYGB7cn0NCmhvdGVsX2RhdGEgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL0lzc2FjL09uZURyaXZlL0Rlc2t0b3AvTWVoYXJyeS9NU0RTIDU2NSBQcmVkaWN0aXZlIE1vZGVsaW5nIGFuZCBBbmFseXRpY3MvUHJlZGljaXRpdmUgTW9kZWxpbmcvSG90ZWwuY3N2IikNCg0KIyMjIFZpc3VhbGl6ZSB0aGUgZGF0YQ0KIyBJbnN0YWxsIHRoZSBwc3ljaCBwYWNrYWdlIGlmIHlvdSBoYXZlbid0IGFscmVhZHkNCmluc3RhbGwucGFja2FnZXMoInBzeWNoIikNCg0KIyBMb2FkIHRoZSBwc3ljaCBwYWNrYWdlDQpsaWJyYXJ5KHBzeWNoKQ0KDQojIE5vdyB5b3UgY2FuIHVzZSB0aGUgcGFpcnMucGFuZWxzIGZ1bmN0aW9uDQpwYWlycy5wYW5lbHMoaG90ZWxfZGF0YVsxNToxNl0sIGdhcCA9IDAsIGJnID0gYygicmVkIiwgImdyZWVuIikpDQoNCg0KaGVhZChob3RlbF9kYXRhKQ0KbnJvdyhob3RlbCRzdGF0dXMpDQoNCnBsb3QoaG90ZWxfZGF0YVtjKDE1LDE2KV0sY29sPWhvdGVsX2RhdGFbLDJdKQ0KDQojIyMgQ29tcGFyZWQgd2l0aCBwZW9wbGUgd2hvIGRvZXMgbm90IGhhdmUgcHJldmlvdXMgY2FuY2VsbGF0aW9uLCB3aGF0IGlzIHRoZSBvZGRzIHJhdGlvIG9mIHBlb3BsZSB3aG8gaGFzIHByZXZpb3VzIGNhbmNlbGxhdGlvbnMgcmVnYXJkaW5nIHRvIGNhbmNlbGVkIGN1cnJlbnQgYm9va2luZz8gV2hhdCBkbyB5b3UgbGVhcm4gZnJvbSB0aGlzPw0KDQoNCiMjIFlvdSBjYW4gdGhlbiBsb29rIGF0IHRoZSBvZGRzIHJhdGlvDQoNCmBgYA0KYGBge3J9DQojIyMgT2RkcyBSYXRpb18NCg0KIyMjIEV4YW1wbGUgQXBwcm9hY2gNCiMgU2FtcGxlIGRhdGEgYSA8LSA1MCAjIHByZXZpb3VzIGNhbmNlbGxhdGlvbnMgd2l0aCBjdXJyZW50IGNhbmNlbGxhdGlvbnMgYiA8LSAzMCAjIHByZXZpb3VzIGNhbmNlbGxhdGlvbnMgd2l0aG91dCBjdXJyZW50IGNhbmNlbGxhdGlvbnMgYyA8LSAyMCAjIG5vIHByZXZpb3VzIGNhbmNlbGxhdGlvbnMgd2l0aCBjdXJyZW50IGNhbmNlbGxhdGlvbnMgZCA8LSAxMDAgIyBubyBwcmV2aW91cyBjYW5jZWxsYXRpb25zIHdpdGhvdXQgY3VycmVudCBjYW5jZWxsYXRpb25zDQoNCg0KIyMgQ3JlYXRlIGEgbWF0cml4IHRhYmxlIDwtIG1hdHJpeChjKG5wYywgcGMsIGNjLCBuY2MpLCBuY29sPTIpIyMNCg0KDQojIyMgUGVvcGxlIHdobyBkbyBub3QgaGF2ZSBwcmV2aW91cyBjYW5jZWxsYXRpb25zDQoNCm5wYyA9IGxlbmd0aCh3aGljaChob3RlbF9kYXRhJHByZXZpb3VzX2NhbmNlbGxhdGlvbnMhPTApKQ0KbnBjDQojIyMgUGVvcGxlIHdobyBkbyBoYXZlIHByZXZpb3VzIGNhbmNlbGxhdGlvbnMNCg0KcGMgPSBsZW5ndGgod2hpY2goaG90ZWxfZGF0YSRwcmV2aW91c19jYW5jZWxsYXRpb25zPT0wKSkNCg0KIyMjIFBlb3BsZSB3aG8gZG8gaGF2ZSBjdXJyZW50IGNhbmNlbGxhdGlvbnMNCg0KY2MgPSBsZW5ndGgod2hpY2goaG90ZWxfZGF0YSRzdGF0dXM9PSJDYW5jZWxlZCIpKQ0KDQojIyMgUGVvcGxlIHdobyBkbyBub3QgaGF2ZSBjdXJyZW50IGNhbmNlbGxhdGlvbnMNCg0KbmNjID0gbGVuZ3RoKHdoaWNoKGhvdGVsX2RhdGEkc3RhdHVzID09ICJOb3RfQ2FuY2VsZWQiKSkNCg0KZGYxIDwtIGNiaW5kKG5wYyxwYyxjYyxuY2MpDQpkZjENCg0KdGFibGUgPC0gbWF0cml4KGMobnBjLCBwYywgY2MsIG5jYyksIG5jb2w9MikNCnRhYmxlDQoNCiMjIDEuIEFtb25nIHByZXZpb3VzIGNhbmNlbGxhdGlvbnMsIHdoYXQgaXMgdGhlIG9kZHMgdGhhdCBoYXZlIGN1cnJlbnQgY2FuY2VsbGF0aW9uDQoNCk9kZHNfUmF0aW8gPC0obnBjKm5jYykvKGNjKnBjKQ0KDQpPZGRzX1JhdGlvDQoNCg0KYGBgDQpgYGAge3J9DQojIyMgV2hpY2ggdHlwZSBvZiByb29tIGlzIG1vcmUgbGlrZWx5IHRvIGhhdmUgY3VycmVudCBib29raW5nIGNhbmNlbGxlZD8NCg0KIHRhYmxlKGhvdGVsX2RhdGEkcm9vbV90eXBlLGhvdGVsX2RhdGEkc3RhdHVzKQ0KIG5ld2MgPSB3aGljaChob3RlbF9kYXRhJHN0YXR1cyA9PSAiQ2FuY2VsZWQiKS93aGljaChob3RlbF9kYXRhJHN0YXR1cyA9PSAiTm90X0NhbmNlbGVkIikNCg0KIyMgUm9vbSB0eXBlICA2IGlzIG1vcmUgbGlrZWx5IHRvIGhhdmUgY3VycmVudCBib29raW5nIGNhbmNlbGxlZCBhcyBpdCBoYXMgYSA0MiUgY2FuY2VsbGF0aW9uIHJhdGUuIA0KDQpgYGANCmBgYHtyfQ0KIyNQcmVwcm9zc2VzaW5nDQojIFJlbW92ZSByb3dzIHdpdGggbWlzc2luZyB2YWx1ZXMNCmhvdGVsX2RhdGEgPC0gbmEub21pdChob3RlbF9kYXRhKQ0KDQojIFJlcGxhY2UgaW5maW5pdGUgdmFsdWVzIHdpdGggTkENCmhvdGVsX2RhdGFbc2FwcGx5KGhvdGVsX2RhdGEsIGlzLmluZmluaXRlKV0gPC0gTkENCg0KIyBPcHRpb25hbGx5LCB5b3UgY2FuIGltcHV0ZSBtaXNzaW5nIHZhbHVlcw0KIyBGb3IgZXhhbXBsZSwgdXNpbmcgdGhlIG1lYW4gZm9yIG51bWVyaWMgY29sdW1ucw0KaG90ZWxfZGF0YVtpcy5uYShob3RlbF9kYXRhKV0gPC0gbGFwcGx5KGhvdGVsX2RhdGEsIGZ1bmN0aW9uKHgpIGlmKGlzLm51bWVyaWMoeCkpIG1lYW4oeCwgbmEucm0gPSBUUlVFKSBlbHNlIHgpDQoNCg0KYGBgDQoNCg0KYGBge3J9DQojUGljayA1IHRvIDggcHJlZGljdG9ycywgc3BsaXQgeW91ciBkYXRhLCA3MCUgdHJhaW5pbmcgYW5kIDMwJSB0ZXN0aW5nLCBvdXRjb21lIHZhcmlhYmxlIGlzIHN0YXR1cw0KDQpSZWR1Y2VkX3NldCA8LSBob3RlbF9kYXRhWyxjKCJwcmV2aW91c19ib29raW5nc19ub3RfY2FuY2VsZWQiLCJzdGF0dXMiLCJwcmV2aW91c19jYW5jZWxsYXRpb25zIiwiYXZnX3Jvb21fcHJpY2UiLCJyb29tX3R5cGUiLCJsZWFkX3RpbWUiKV0NCg0KcHJpbnQoUmVkdWNlZF9zZXQpDQpgYGANCg0KYGBgIHtyfQ0KIyMjIFNldHRpbmcgVHJhaW5pbmcgYW5kIFRlc3RpbmcgRGF0YQ0KDQppbnN0YWxsLnBhY2thZ2VzKCJjYXJldCIpDQpsaWJyYXJ5KGNhcmV0KQ0KDQojIERldGVybWluZSB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGRhdGFzZXQNCm51bV9yb3dzIDwtIG5yb3coUmVkdWNlZF9zZXQpDQoNCiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2Ygcm93cyBmb3IgdGhlIHRyYWluaW5nIHNldCAoNzAlIG9mIHRoZSBkYXRhKQ0KdHJhaW5fc2l6ZSA8LSByb3VuZCgwLjcgKiBudW1fcm93cykNCg0KIyBDcmVhdGUgYSByYW5kb20gc2FtcGxlIG9mIHJvdyBpbmRpY2VzIGZvciB0aGUgdHJhaW5pbmcgc2V0DQp0cmFpbl9pbmRpY2VzIDwtIHNhbXBsZSgxOm51bV9yb3dzLCBzaXplID0gdHJhaW5fc2l6ZSkNCg0KIyBTcGxpdCB0aGUgZGF0YSBpbnRvIHRyYWluaW5nIGFuZCB0ZXN0aW5nIHNldHMNCnRyYWluaW5nX2RhdGEgPC0gUmVkdWNlZF9zZXRbdHJhaW5faW5kaWNlcywgXQ0KdGVzdGluZ19kYXRhIDwtIFJlZHVjZWRfc2V0Wy10cmFpbl9pbmRpY2VzLCBdDQoNCiMgUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSB0cmFpbmluZyBhbmQgdGVzdGluZyBkYXRhDQpzdW1tYXJ5KHRyYWluaW5nX2RhdGEpDQpzdW1tYXJ5KHRlc3RpbmdfZGF0YSkNCg0KDQojIENoZWNrIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBzcGxpdCBkYXRhDQpkaW0odHJhaW5pbmdfZGF0YSkNCmRpbSh0ZXN0aW5nX2RhdGEpDQpgYGANCg0KDQpgYGAge3J9DQoNCg0KIyMgQnVpbGQgYSBsaW5lYXIgZGlzY3JpbWluYW50IGFuYWx5c2lzIG1vZGVsLCByZXBvcnQgY29uZnVzaW9uIG1hdHJpeCBhbmQgYWNjdXJhY3kNCmxpYnJhcnkoJ01BU1MnKQ0KIyBGaXQgdGhlIExEQSBtb2RlbA0KbGRhX21vZGVsIDwtIGxkYShzdGF0dXMgfi4sIGRhdGEgPSBSZWR1Y2VkX3NldCkNCg0Kc3VtbWFyeShsZGFfbW9kZWwpDQoNCiMjIFZpc3VhbGl6aW5nIHRoZSBsZGEgbW9kZWwNCmdncGxvdDI6OmFlcyhob3RlbF9kYXRhJHN0YXR1cyxob3RlbF9kYXRhJHByZXZpb3VzX2Jvb2tpbmdzX25vdF9jYW5jZWxlZCkNCmxkYTIgPC0gcHJlZGljdChsZGExLHR5cGU9InJlc3BvbnNlIikNCg0KdHJhaW5pbmdfZGF0YQ0KYGBgDQoNCmBgYCB7cn0NCiMjIyBCdWlsZCBhIGxvZ2lzdGljIHJlZ3Jlc3Npb24gbW9kZWwsIGFjY3VyYWN5DQoNCg0KDQp1bmlxdWUoUmVkdWNlZF9zZXQkc3RhdHVzKQ0KUmVkdWNlZF9zZXQkc3RhdHVzIDwtIGlmZWxzZShSZWR1Y2VkX3NldCRzdGF0dXMgPT0gInllcyIsIDEsIDApDQpSZWR1Y2VkX3NldCRzdGF0dXMgPC0gYXMubnVtZXJpYyhSZWR1Y2VkX3NldCRzdGF0dXMpDQpsb2dpdDEgPC0gZ2xtKHN0YXR1cyB+IC4sIGRhdGEgPSBSZWR1Y2VkX3NldCwgZmFtaWx5ID0gYmlub21pYWwpDQoNCmV4cChjb2VmKGxvZ2l0MSkpDQoNCmBgYA0KDQoNCg0KDQo=