Predicting Customer Retention at The Tire Rack

Project Objective

To investigate the relationship between tire Wet and Noise level on return customers.

Question 1 & 2: Develop the Model & Assess Predictor Significance

Step 1: Install and load required libraries

library(readxl)
library(Hmisc) #allows us to call the correlation function
## Warning: package 'Hmisc' was built under R version 4.3.3
## 
## Attaching package: 'Hmisc'
## The following objects are masked from 'package:base':
## 
##     format.pval, units
library(pscl) #allows us to call the pseudo R-squae package to evaluate our model
## Warning: package 'pscl' was built under R version 4.3.3
## Classes and Methods for R originally developed in the
## Political Science Computational Laboratory
## Department of Political Science
## Stanford University (2002-2015),
## by and under the direction of Simon Jackman.
## hurdle and zeroinfl functions by Achim Zeileis.
library(pROC) #allows us to run the Area Under Curve (AUC) package to get the plot and AUC score
## Warning: package 'pROC' was built under R version 4.3.3
## Type 'citation("pROC")' for a citation.
## 
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
## 
##     cov, smooth, var

Step 2: Import & clean the data

# Import the Data
tire_df <- read_excel("Class Exercise 15_TireRatings.xlsx")
tire_df
## # A tibble: 68 × 5
##    Tire                                        Wet Noise Buy_Again Purchase
##    <chr>                                     <dbl> <dbl>     <dbl>    <dbl>
##  1 BFGoodrich g-Force Super Sport A/S          8     7.2       6.1        0
##  2 BFGoodrich g-Force Super Sport A/S H&V      8     7.2       6.6        1
##  3 BFGoodrich g-Force T/A KDWS                 7.6   7.5       6.9        1
##  4 Bridgestone B381                            6.6   5.4       6.6        0
##  5 Bridgestone Insignia SE200                  5.8   6.3       4          0
##  6 Bridgestone Insignia SE200-02               6.3   5.7       4.5        0
##  7 Bridgestone Potenza G 019 Grid              7.7   5.2       5          0
##  8 Bridgestone Potenza RE92                    5     6.2       2.5        0
##  9 Bridgestone Potenza RE92A                   5.6   6.4       2.7        0
## 10 Bridgestone Potenza RE960AS Pole Position   8.8   8.5       8.1        1
## # ℹ 58 more rows
# Clean the data - drop irrelevant column
t_df <- subset(tire_df, select = c(Wet, Noise, Purchase))
t_df
## # A tibble: 68 × 3
##      Wet Noise Purchase
##    <dbl> <dbl>    <dbl>
##  1   8     7.2        0
##  2   8     7.2        1
##  3   7.6   7.5        1
##  4   6.6   5.4        0
##  5   5.8   6.3        0
##  6   6.3   5.7        0
##  7   7.7   5.2        0
##  8   5     6.2        0
##  9   5.6   6.4        0
## 10   8.8   8.5        1
## # ℹ 58 more rows

Step 3: Summarize the data

head(t_df)
## # A tibble: 6 × 3
##     Wet Noise Purchase
##   <dbl> <dbl>    <dbl>
## 1   8     7.2        0
## 2   8     7.2        1
## 3   7.6   7.5        1
## 4   6.6   5.4        0
## 5   5.8   6.3        0
## 6   6.3   5.7        0
Data Description: A description of the features are presented in the table below.
Variable        | Definition
--------------- | -------------
1. Wet          | A tire's average wet traction performance rating
2. Noise        | A tire's average noise level generated rating
3. Purchase     | A respondent buying the tire again (1: yes and 0: no)
summary(t_df)
##       Wet            Noise          Purchase     
##  Min.   :4.300   Min.   :3.600   Min.   :0.0000  
##  1st Qu.:6.450   1st Qu.:6.000   1st Qu.:0.0000  
##  Median :7.750   Median :7.100   Median :0.0000  
##  Mean   :7.315   Mean   :6.903   Mean   :0.4412  
##  3rd Qu.:8.225   3rd Qu.:7.925   3rd Qu.:1.0000  
##  Max.   :9.200   Max.   :8.900   Max.   :1.0000

Step 4: Feature Selection (i.e., correlation analysis)

corr <- rcorr(as.matrix(t_df))
corr
##           Wet Noise Purchase
## Wet      1.00  0.76     0.74
## Noise    0.76  1.00     0.72
## Purchase 0.74  0.72     1.00
## 
## n= 68 
## 
## 
## P
##          Wet Noise Purchase
## Wet           0     0      
## Noise     0         0      
## Purchase  0   0
Interpretation: All the predictors are significant with the target variable. There's no multicollinearity in the data.

Step 5: Build the logistic regression model

model <- glm(Purchase ~ Wet + Noise, data = t_df, family = binomial)
summary(model)
## 
## Call:
## glm(formula = Purchase ~ Wet + Noise, family = binomial, data = t_df)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)   
## (Intercept) -39.4982    12.4779  -3.165  0.00155 **
## Wet           3.3745     1.2641   2.670  0.00760 **
## Noise         1.8163     0.8312   2.185  0.02887 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 93.325  on 67  degrees of freedom
## Residual deviance: 27.530  on 65  degrees of freedom
## AIC: 33.53
## 
## Number of Fisher Scoring iterations: 8
Interpretation: All the independent variables were significant (p-value < 0.05)

Question 3 + 4: Predicting with New Information

new_data1 <- data.frame(Wet = 7, Noise = 7)
new_data2 <- data.frame(Wet = 8, Noise = 8)

## Predict the probability
prob1 <- predict(model, newdata = new_data1, type = "response") 
round((prob1 * 100),2) # Question 3
##    1 
## 4.06
prob2 <- predict(model, newdata = new_data2, type = "response") 
round((prob2 * 100),2) # Question 4
##     1 
## 88.37

Question 5: Overall Model Significance

Pseudo-R-squared

pR2(model)
## fitting null model for pseudo-r2
##         llh     llhNull          G2    McFadden        r2ML        r2CU 
## -13.7649516 -46.6623284  65.7947536   0.7050093   0.6199946   0.8305269
Interpretation: A McFadden R-squared of 0.71 means that our LR model explains about 70.5% of the variability in the outcome relative to a model with no predictors. This is considered a great fit.

Area Under the Curve (AUC)

The Area Under the Curve (AUC) score represents the ability of the model to correctly classify students who will return to Lakeland college and those who will not.
roc_curve <- roc(t_df$Purchase, fitted(model))
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
plot(roc_curve)

auc(roc_curve)
## Area under the curve: 0.9741
Interpretation: An AUC score of 0.97 indicates that the LR model has a high level of accuracy in predicting whether respondents would buy the tire again.