options(width=100)
# Basic (instructional) logistic regression analysis script
# Built from R Commander script file
# Includes nonessential instructional elements
# (suboptimal) Ordinary least-squares regression
# Additional prediction logic
# Histograms and other plots to compare alternative predictions
# Suggested usage:
# Copy the required data files, ChurnExampleTrain.csv, ChurnExamplePred.csv
# and ChurnExampleTest.csv into a new project folder <folder>
# Change the working directory (setwd below) to point to the project <folder>
# Run this entire code block
# Set up working directory for file locations
# and load required libraries
setwd("D:/MBA/SecondTerm/Data/churn/exercise")
library(RcmdrMisc)
library(car)
# DATA ENTRY AND SUMMARIZATION
# Read Training data set, list, summarize,
# convert AreaCode to factor
ChurnTrain <-
read.table("ChurnTrain.csv",
header=TRUE, sep=",", na.strings="NA", dec=".", strip.white=TRUE)
TrainRows <- nrow(ChurnTrain)
TrainRows
## [1] 3333
ChurnTrain[1:5,]
## TrainTest State AreaCode PhoneNum Churn ChurnL ChurnTF ChurnYN VmailPlan IntPlan Tenure
## 1 Train KS 415 382-4657 0 False. FALSE no yes no 128
## 2 Train OH 415 371-7191 0 False. FALSE no yes no 107
## 3 Train NJ 415 358-1921 0 False. FALSE no no no 137
## 4 Train OH 408 375-9999 0 False. FALSE no no yes 84
## 5 Train OK 415 330-6626 0 False. FALSE no no yes 75
## CustServCall VmailMsgs DayCall DayMin DayCharge EveCall EveMin EveCharge NightCall NightMin
## 1 1 25 110 265.1 45.07 99 197.4 16.78 91 244.7
## 2 1 26 123 161.6 27.47 103 195.5 16.62 103 254.4
## 3 0 0 114 243.4 41.38 110 121.2 10.30 104 162.6
## 4 2 0 71 299.4 50.90 88 61.9 5.26 89 196.9
## 5 3 0 113 166.7 28.34 122 148.3 12.61 121 186.9
## NightCharge IntCall IntMin IntCharge
## 1 11.01 3 10.0 2.70
## 2 11.45 3 13.7 3.70
## 3 7.32 5 12.2 3.29
## 4 8.86 7 6.6 1.78
## 5 8.41 3 10.1 2.73
ChurnTrain <- within(ChurnTrain, {
AreaCode <- as.factor(AreaCode)
})
# Demonstration of Simple Logistic Regression vs Simple Linear Regression
# Churn vs DayMin with fitted regression line
scatterplot(Churn~DayMin, reg.line=lm, smooth=FALSE, spread=FALSE,
boxplots=FALSE, span=0.5, ellipse=FALSE, levels=c(.5, .9), data=ChurnTrain)

# Churn vs DayMin with fitted logistic probabilities
SimpleLogistic <- glm(Churn ~ DayMin, family=binomial(logit), data=ChurnTrain)
summary(SimpleLogistic)
##
## Call:
## glm(formula = Churn ~ DayMin, family = binomial(logit), data = ChurnTrain)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.0241 -0.6001 -0.4902 -0.3738 2.8102
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -3.929289 0.202823 -19.37 <2e-16 ***
## DayMin 0.011272 0.000975 11.56 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 2758.3 on 3332 degrees of freedom
## Residual deviance: 2614.3 on 3331 degrees of freedom
## AIC: 2618.3
##
## Number of Fisher Scoring iterations: 5
exp(coef(SimpleLogistic)) # Exponentiated coefficients ("odds ratios")
## (Intercept) DayMin
## 0.01965765 1.01133544
LogisticProb <- predict(SimpleLogistic, newdata=ChurnTrain, type = "response",
interval="none", level=.95, se.fit=FALSE)
DayMin <- ChurnTrain$DayMin
Churn <- ChurnTrain$Churn
plot(x = DayMin, y = Churn)
points(x = DayMin, y = LogisticProb, col = "red")

# Data Understanding -- Numerical summaries and scatterplot matrix
numSummary(ChurnTrain[,c("Churn", "CustServCall", "DayCall", "DayCharge",
"DayMin", "EveCall", "EveCharge", "EveMin", "IntCall", "IntCharge",
"IntMin", "NightCall", "NightCharge", "NightMin", "Tenure", "VmailMsgs")],
statistics=c("mean", "sd", "quantiles", "skewness"),
quantiles=c(0,.25,.5,.75,1), type="2")
## mean sd skewness 0% 25% 50% 75% 100% n
## Churn 0.1449145 0.3520674 2.018356061 0.00 0.00 0.00 0.00 1.00 3333
## CustServCall 1.5628563 1.3154910 1.091359482 0.00 1.00 1.00 2.00 9.00 3333
## DayCall 100.4356436 20.0690842 -0.111786639 0.00 87.00 101.00 114.00 165.00 3333
## DayCharge 30.5623072 9.2594346 -0.029083268 0.00 24.43 30.50 36.79 59.64 3333
## DayMin 179.7750975 54.4673892 -0.029077067 0.00 143.70 179.40 216.40 350.80 3333
## EveCall 100.1143114 19.9226253 -0.055563139 0.00 87.00 100.00 114.00 170.00 3333
## EveCharge 17.0835404 4.3106676 -0.023857989 0.00 14.16 17.12 20.00 30.91 3333
## EveMin 200.9803480 50.7138444 -0.023877456 0.00 166.60 201.40 235.30 363.70 3333
## IntCall 4.4794479 2.4612143 1.321478166 0.00 3.00 4.00 6.00 20.00 3333
## IntCharge 2.7645815 0.7537726 -0.245286508 0.00 2.30 2.78 3.27 5.40 3333
## IntMin 10.2372937 2.7918395 -0.245135939 0.00 8.50 10.30 12.10 20.00 3333
## NightCall 100.1077108 19.5686093 0.032499570 33.00 87.00 100.00 113.00 175.00 3333
## NightCharge 9.0393249 2.2758728 0.008886237 1.04 7.52 9.05 10.59 17.77 3333
## NightMin 200.8720372 50.5738470 0.008921291 23.20 167.00 201.20 235.30 395.00 3333
## Tenure 101.0648065 39.8221059 0.096606294 1.00 74.00 101.00 127.00 243.00 3333
## VmailMsgs 8.0990099 13.6883654 1.264823634 0.00 0.00 0.00 20.00 51.00 3333
scatterplotMatrix(~Churn+Tenure+VmailMsgs+CustServCall+
DayMin+EveMin+IntMin+NightMin, reg.line=lm, smooth=TRUE,
spread=FALSE, span=0.5, id.n=0, diagonal = 'histogram',
data=ChurnTrain)

# Fit full and reduced regression models
FullRegression <-
lm(Churn~CustServCall+DayCall+DayCharge+DayMin+EveCall+EveCharge+EveMin+
IntCall+IntCharge+IntMin+NightCall+NightCharge+NightMin+Tenure+VmailMsgs,
data=ChurnTrain)
summary(FullRegression)
##
## Call:
## lm(formula = Churn ~ CustServCall + DayCall + DayCharge + DayMin +
## EveCall + EveCharge + EveMin + IntCall + IntCharge + IntMin +
## NightCall + NightCharge + NightMin + Tenure + VmailMsgs,
## data = ChurnTrain)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.54618 -0.18444 -0.10564 -0.00315 1.12152
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -4.898e-01 6.878e-02 -7.121 1.31e-12 ***
## CustServCall 5.681e-02 4.378e-03 12.976 < 2e-16 ***
## DayCall 3.408e-04 2.874e-04 1.186 0.23572
## DayCharge -4.871e-02 2.011e+00 -0.024 0.98068
## DayMin 9.624e-03 3.419e-01 0.028 0.97754
## EveCall 1.035e-04 2.891e-04 0.358 0.72034
## EveCharge -7.939e-01 1.996e+00 -0.398 0.69088
## EveMin 6.816e-02 1.697e-01 0.402 0.68793
## IntCall -7.509e-03 2.342e-03 -3.207 0.00135 **
## IntCharge 6.713e-01 2.005e+00 0.335 0.73784
## IntMin -1.717e-01 5.414e-01 -0.317 0.75112
## NightCall 9.596e-05 2.944e-04 0.326 0.74444
## NightCharge 6.510e-01 2.021e+00 0.322 0.74734
## NightMin -2.903e-02 9.092e-02 -0.319 0.74957
## Tenure 1.442e-04 1.447e-04 0.997 0.31897
## VmailMsgs -2.267e-03 4.207e-04 -5.387 7.65e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.3321 on 3317 degrees of freedom
## Multiple R-squared: 0.1141, Adjusted R-squared: 0.1101
## F-statistic: 28.47 on 15 and 3317 DF, p-value: < 2.2e-16
ReducedRegression <- stepwise(FullRegression, direction='forward/backward', criterion='BIC')
##
## Direction: forward/backward
## Criterion: BIC
##
## Start: AIC=-6951.74
## Churn ~ 1
##
## Df Sum of Sq RSS AIC
## + CustServCall 1 17.9974 395.01 -7092.1
## + DayMin 1 17.3821 395.62 -7086.9
## + DayCharge 1 17.3821 395.62 -7086.9
## + EveMin 1 3.5564 409.45 -6972.5
## + EveCharge 1 3.5557 409.45 -6972.5
## + VmailMsgs 1 3.3252 409.68 -6970.6
## + IntCharge 1 1.9243 411.08 -6959.2
## + IntMin 1 1.9232 411.08 -6959.2
## + IntCall 1 1.1533 411.85 -6953.0
## <none> 413.01 -6951.7
## + NightCharge 1 0.5204 412.49 -6947.8
## + NightMin 1 0.5203 412.49 -6947.8
## + DayCall 1 0.1407 412.87 -6944.8
## + Tenure 1 0.1130 412.89 -6944.5
## + EveCall 1 0.0352 412.97 -6943.9
## + NightCall 1 0.0156 412.99 -6943.8
##
## Step: AIC=-7092.13
## Churn ~ CustServCall
##
## Df Sum of Sq RSS AIC
## + DayCharge 1 17.8636 377.15 -7238.3
## + DayMin 1 17.8634 377.15 -7238.3
## + EveMin 1 3.7679 391.24 -7116.0
## + EveCharge 1 3.7671 391.24 -7116.0
## + VmailMsgs 1 3.1237 391.89 -7110.5
## + IntCharge 1 2.0400 392.97 -7101.3
## + IntMin 1 2.0385 392.97 -7101.3
## + IntCall 1 0.9992 394.01 -7092.5
## <none> 395.01 -7092.1
## + NightCharge 1 0.5787 394.43 -7088.9
## + NightMin 1 0.5787 394.43 -7088.9
## + DayCall 1 0.2076 394.80 -7085.8
## + Tenure 1 0.1241 394.88 -7085.1
## + NightCall 1 0.0321 394.98 -7084.3
## + EveCall 1 0.0315 394.98 -7084.3
## - CustServCall 1 17.9974 413.01 -6951.7
##
## Step: AIC=-7238.26
## Churn ~ CustServCall + DayCharge
##
## Df Sum of Sq RSS AIC
## + EveMin 1 3.6560 373.49 -7262.6
## + EveCharge 1 3.6555 373.49 -7262.6
## + VmailMsgs 1 3.1326 374.01 -7258.0
## + IntCharge 1 2.1656 374.98 -7249.3
## + IntMin 1 2.1647 374.98 -7249.3
## + IntCall 1 1.0662 376.08 -7239.6
## <none> 377.15 -7238.3
## + NightCharge 1 0.5522 376.59 -7235.0
## + NightMin 1 0.5520 376.59 -7235.0
## + DayCall 1 0.1833 376.96 -7231.8
## + Tenure 1 0.1064 377.04 -7231.1
## + EveCall 1 0.0122 377.13 -7230.3
## + NightCall 1 0.0069 377.14 -7230.2
## + DayMin 1 0.0021 377.14 -7230.2
## - DayCharge 1 17.8636 395.01 -7092.1
## - CustServCall 1 18.4788 395.62 -7086.9
##
## Step: AIC=-7262.62
## Churn ~ CustServCall + DayCharge + EveMin
##
## Df Sum of Sq RSS AIC
## + VmailMsgs 1 3.2524 370.24 -7283.7
## + IntCharge 1 2.2289 371.26 -7274.5
## + IntMin 1 2.2279 371.26 -7274.4
## + IntCall 1 1.0752 372.41 -7264.1
## <none> 373.49 -7262.6
## + NightCharge 1 0.5891 372.90 -7259.8
## + NightMin 1 0.5889 372.90 -7259.8
## + DayCall 1 0.2207 373.27 -7256.5
## + Tenure 1 0.1151 373.37 -7255.5
## + EveCharge 1 0.0369 373.45 -7254.8
## + EveCall 1 0.0176 373.47 -7254.7
## + NightCall 1 0.0047 373.48 -7254.6
## + DayMin 1 0.0000 373.49 -7254.5
## - EveMin 1 3.6560 377.15 -7238.3
## - DayCharge 1 17.7517 391.24 -7116.0
## - CustServCall 1 18.6883 392.18 -7108.0
##
## Step: AIC=-7283.66
## Churn ~ CustServCall + DayCharge + EveMin + VmailMsgs
##
## Df Sum of Sq RSS AIC
## + IntCharge 1 2.2449 367.99 -7295.8
## + IntMin 1 2.2437 367.99 -7295.8
## + IntCall 1 1.0248 369.21 -7284.8
## <none> 370.24 -7283.7
## + NightCharge 1 0.6108 369.63 -7281.1
## + NightMin 1 0.6107 369.63 -7281.0
## + DayCall 1 0.2050 370.03 -7277.4
## + Tenure 1 0.1096 370.13 -7276.5
## + EveCharge 1 0.0225 370.21 -7275.7
## + EveCall 1 0.0150 370.22 -7275.7
## + NightCall 1 0.0066 370.23 -7275.6
## + DayMin 1 0.0002 370.24 -7275.5
## - VmailMsgs 1 3.2524 373.49 -7262.6
## - EveMin 1 3.7758 374.01 -7258.0
## - DayCharge 1 17.7590 388.00 -7135.6
## - CustServCall 1 18.4825 388.72 -7129.4
##
## Step: AIC=-7295.82
## Churn ~ CustServCall + DayCharge + EveMin + VmailMsgs + IntCharge
##
## Df Sum of Sq RSS AIC
## + IntCall 1 1.1262 366.87 -7297.9
## <none> 367.99 -7295.8
## + NightCharge 1 0.6476 367.34 -7293.6
## + NightMin 1 0.6474 367.34 -7293.6
## + DayCall 1 0.1772 367.81 -7289.3
## + Tenure 1 0.1004 367.89 -7288.6
## + EveCharge 1 0.0174 367.97 -7287.9
## + EveCall 1 0.0120 367.98 -7287.8
## + IntMin 1 0.0106 367.98 -7287.8
## + NightCall 1 0.0103 367.98 -7287.8
## + DayMin 1 0.0000 367.99 -7287.7
## - IntCharge 1 2.2449 370.24 -7283.7
## - VmailMsgs 1 3.2684 371.26 -7274.5
## - EveMin 1 3.8407 371.83 -7269.3
## - DayCharge 1 17.8856 385.88 -7145.7
## - CustServCall 1 18.6086 386.60 -7139.5
##
## Step: AIC=-7297.92
## Churn ~ CustServCall + DayCharge + EveMin + VmailMsgs + IntCharge +
## IntCall
##
## Df Sum of Sq RSS AIC
## <none> 366.87 -7297.9
## - IntCall 1 1.1262 367.99 -7295.8
## + NightCharge 1 0.6271 366.24 -7295.5
## + NightMin 1 0.6269 366.24 -7295.5
## + DayCall 1 0.1805 366.69 -7291.5
## + Tenure 1 0.1146 366.75 -7290.9
## + EveCharge 1 0.0172 366.85 -7290.0
## + EveCall 1 0.0163 366.85 -7290.0
## + IntMin 1 0.0147 366.85 -7289.9
## + NightCall 1 0.0103 366.86 -7289.9
## + DayMin 1 0.0001 366.87 -7289.8
## - IntCharge 1 2.3463 369.21 -7284.8
## - VmailMsgs 1 3.2158 370.08 -7276.9
## - EveMin 1 3.8506 370.72 -7271.2
## - DayCharge 1 17.9573 384.82 -7146.8
## - CustServCall 1 18.4486 385.31 -7142.5
summary(ReducedRegression)
##
## Call:
## lm(formula = Churn ~ CustServCall + DayCharge + EveMin + VmailMsgs +
## IntCharge + IntCall, data = ChurnTrain)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.54420 -0.18187 -0.10615 -0.00262 1.10760
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -0.3661682 0.0391409 -9.355 < 2e-16 ***
## CustServCall 0.0565896 0.0043757 12.933 < 2e-16 ***
## DayCharge 0.0079299 0.0006215 12.759 < 2e-16 ***
## EveMin 0.0006705 0.0001135 5.908 3.80e-09 ***
## VmailMsgs -0.0022703 0.0004205 -5.399 7.15e-08 ***
## IntCharge 0.0352290 0.0076383 4.612 4.14e-06 ***
## IntCall -0.0074758 0.0023396 -3.195 0.00141 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.3321 on 3326 degrees of freedom
## Multiple R-squared: 0.1117, Adjusted R-squared: 0.1101
## F-statistic: 69.72 on 6 and 3326 DF, p-value: < 2.2e-16
oldpar <- par(oma=c(0,0,3,0), mfrow=c(2,2))
plot(ReducedRegression)

par(oldpar)
# Compute predictions for reduced regression model
# Better/smarter prediction planning
ChurnPred <-
read.table("ChurnPred2.csv",
header=TRUE, sep=",", na.strings="NA", dec=".", strip.white=TRUE)
ChurnPred # Sample prediction data, n = 5
## State AreaCode PhoneNum Churn ChurnL ChurnTF ChurnYN Tenure VmailPlan IntPlan CustServCall
## 1 KS 415 413-9854 0 False. FALSE no 90 yes no 1
## 2 NJ 408 402-8337 0 False. FALSE no 113 no yes 3
## 3 AL 408 351-4935 0 False. FALSE no 74 yes no 1
## 4 MI 510 355-9594 0 False. FALSE no 52 no no 3
## 5 NE 415 329-9540 0 False. FALSE no 115 no no 1
## VmailMsgs DayCall DayMin DayCharge EveCall EveMin EveCharge NightCall NightMin NightCharge
## 1 30 104 191.3 32.52 109 257.1 21.85 89 177.7 8.00
## 2 0 98 122.4 20.81 116 223.8 19.02 148 267.5 12.04
## 3 46 109 277.7 47.21 114 270.0 22.95 82 165.3 7.44
## 4 0 100 219.0 37.23 110 148.9 12.66 129 151.8 6.83
## 5 0 104 135.4 23.02 91 138.8 11.80 92 208.5 9.38
## IntCall IntMin IntCharge
## 1 1 11.0 2.97
## 2 5 11.6 3.13
## 3 2 10.4 2.81
## 4 8 11.9 3.21
## 5 3 5.4 1.46
predict(ReducedRegression, newdata=ChurnPred, interval="prediction",
level=.95, se.fit=FALSE)
## fit lwr upr
## 1 0.149743761 -0.5021277 0.8016152
## 2 0.191577465 -0.4600025 0.8431574
## 3 0.225446905 -0.4271801 0.8780739
## 4 0.251954209 -0.3998574 0.9037658
## 5 -0.004953505 -0.6568193 0.6469123
# Compute, examine and save full-sample predictions for reduced regression
RegPred <- predict(ReducedRegression, newdata=ChurnTrain, interval="none")
with(ChurnTrain, Hist(RegPred, scale="frequency", breaks="Sturges",
col="darkgray"))

# Fit full and reduced logistic regression models
FullLogistic <- glm(Churn ~ CustServCall + DayCall + DayCharge +
DayMin + EveCall + EveCharge + EveMin + IntCall + IntCharge +
IntMin + IntPlan + NightCall + NightCharge + NightMin +
Tenure + VmailMsgs + VmailPlan,
family=binomial(logit),
data=ChurnTrain)
summary(FullLogistic)
##
## Call:
## glm(formula = Churn ~ CustServCall + DayCall + DayCharge + DayMin +
## EveCall + EveCharge + EveMin + IntCall + IntCharge + IntMin +
## IntPlan + NightCall + NightCharge + NightMin + Tenure + VmailMsgs +
## VmailPlan, family = binomial(logit), data = ChurnTrain)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.1532 -0.5132 -0.3402 -0.1953 3.2528
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -8.6515638 0.7243142 -11.944 < 2e-16 ***
## CustServCall 0.5135638 0.0392678 13.079 < 2e-16 ***
## DayCall 0.0031962 0.0027612 1.158 0.247048
## DayCharge 1.5127081 19.2601862 0.079 0.937398
## DayMin -0.2441993 3.2742224 -0.075 0.940547
## EveCall 0.0010579 0.0027826 0.380 0.703817
## EveCharge -9.5463678 19.2437266 -0.496 0.619840
## EveMin 0.8186945 1.6357258 0.501 0.616717
## IntCall -0.0929680 0.0250603 -3.710 0.000207 ***
## IntCharge 16.3900316 19.6323938 0.835 0.403804
## IntMin -4.3377914 5.3009719 -0.818 0.413185
## IntPlan yes 2.0427543 0.1454974 14.040 < 2e-16 ***
## NightCall 0.0006993 0.0028419 0.246 0.805628
## NightCharge 2.8338084 19.4769043 0.145 0.884319
## NightMin -0.1238287 0.8764906 -0.141 0.887650
## Tenure 0.0008458 0.0013912 0.608 0.543199
## VmailMsgs 0.0358803 0.0180108 1.992 0.046355 *
## VmailPlan yes -2.0250146 0.5740840 -3.527 0.000420 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 2758.3 on 3332 degrees of freedom
## Residual deviance: 2158.7 on 3315 degrees of freedom
## AIC: 2194.7
##
## Number of Fisher Scoring iterations: 6
# Full: Pseudo (Deviance) R2 = (2758.3 - 2158.7 )/2758.3 = 0.2497
ReducedLogistic <- stepwise(FullLogistic, direction='forward/backward', criterion='BIC')
##
## Direction: forward/backward
## Criterion: BIC
##
## Start: AIC=2766.4
## Churn ~ 1
##
## Df Deviance AIC
## + IntPlan 1 2587.9 2604.1
## + DayMin 1 2614.3 2630.5
## + DayCharge 1 2614.3 2630.5
## + CustServCall 1 2627.2 2643.5
## + VmailPlan 1 2720.3 2736.6
## + VmailMsgs 1 2728.8 2745.0
## + EveMin 1 2729.4 2745.7
## + EveCharge 1 2729.4 2745.7
## + IntCharge 1 2742.6 2758.8
## + IntMin 1 2742.6 2758.8
## + IntCall 1 2748.5 2764.7
## <none> 2758.3 2766.4
## + NightCharge 1 2754.1 2770.3
## + NightMin 1 2754.1 2770.3
## + DayCall 1 2757.2 2773.4
## + Tenure 1 2757.4 2773.6
## + EveCall 1 2758.0 2774.2
## + NightCall 1 2758.2 2774.4
##
## Step: AIC=2604.12
## Churn ~ IntPlan
##
## Df Deviance AIC
## + CustServCall 1 2438.2 2462.5
## + DayMin 1 2453.2 2477.5
## + DayCharge 1 2453.2 2477.5
## + VmailPlan 1 2546.0 2570.4
## + VmailMsgs 1 2554.9 2579.2
## + EveMin 1 2560.4 2584.7
## + EveCharge 1 2560.4 2584.7
## + IntCall 1 2575.7 2600.0
## + IntCharge 1 2576.3 2600.6
## + IntMin 1 2576.3 2600.7
## <none> 2587.9 2604.1
## + NightCharge 1 2581.3 2605.7
## + NightMin 1 2581.3 2605.7
## + DayCall 1 2586.8 2611.2
## + Tenure 1 2587.5 2611.9
## + EveCall 1 2587.7 2612.0
## + NightCall 1 2587.9 2612.2
## - IntPlan 1 2758.3 2766.4
##
## Step: AIC=2462.53
## Churn ~ IntPlan + CustServCall
##
## Df Deviance AIC
## + DayMin 1 2287.4 2319.8
## + DayCharge 1 2287.4 2319.8
## + VmailPlan 1 2396.6 2429.0
## + VmailMsgs 1 2405.1 2437.5
## + EveMin 1 2406.5 2438.9
## + EveCharge 1 2406.5 2439.0
## + IntCharge 1 2425.3 2457.8
## + IntMin 1 2425.3 2457.8
## + IntCall 1 2427.1 2459.6
## <none> 2438.2 2462.5
## + NightCharge 1 2430.7 2463.1
## + NightMin 1 2430.7 2463.1
## + DayCall 1 2436.5 2468.9
## + Tenure 1 2437.9 2470.4
## + EveCall 1 2438.0 2470.4
## + NightCall 1 2438.1 2470.6
## - CustServCall 1 2587.9 2604.1
## - IntPlan 1 2627.2 2643.5
##
## Step: AIC=2319.82
## Churn ~ IntPlan + CustServCall + DayMin
##
## Df Deviance AIC
## + VmailPlan 1 2244.1 2284.6
## + VmailMsgs 1 2252.5 2293.0
## + EveMin 1 2254.5 2295.0
## + EveCharge 1 2254.5 2295.0
## + IntCharge 1 2273.2 2313.7
## + IntMin 1 2273.2 2313.8
## + IntCall 1 2274.4 2315.0
## + NightCharge 1 2278.9 2319.5
## + NightMin 1 2278.9 2319.5
## <none> 2287.4 2319.8
## + DayCall 1 2285.9 2326.5
## + Tenure 1 2287.3 2327.8
## + EveCall 1 2287.3 2327.9
## + DayCharge 1 2287.4 2327.9
## + NightCall 1 2287.4 2327.9
## - DayMin 1 2438.2 2462.5
## - CustServCall 1 2453.2 2477.5
## - IntPlan 1 2470.6 2494.9
##
## Step: AIC=2284.63
## Churn ~ IntPlan + CustServCall + DayMin + VmailPlan
##
## Df Deviance AIC
## + EveMin 1 2207.9 2256.6
## + EveCharge 1 2207.9 2256.6
## + IntCharge 1 2229.1 2277.7
## + IntMin 1 2229.1 2277.8
## + IntCall 1 2231.6 2280.3
## + NightCharge 1 2235.2 2283.9
## + NightMin 1 2235.2 2283.9
## <none> 2244.1 2284.6
## + VmailMsgs 1 2240.8 2289.4
## + DayCall 1 2242.7 2291.3
## + Tenure 1 2243.9 2292.6
## + EveCall 1 2244.0 2292.7
## + NightCall 1 2244.1 2292.7
## + DayCharge 1 2244.1 2292.7
## - VmailPlan 1 2287.4 2319.8
## - DayMin 1 2396.6 2429.0
## - CustServCall 1 2410.4 2442.9
## - IntPlan 1 2431.5 2463.9
##
## Step: AIC=2256.56
## Churn ~ IntPlan + CustServCall + DayMin + VmailPlan + EveMin
##
## Df Deviance AIC
## + IntCharge 1 2190.6 2247.4
## + IntMin 1 2190.6 2247.4
## + IntCall 1 2195.2 2252.0
## + NightCharge 1 2197.3 2254.1
## + NightMin 1 2197.3 2254.1
## <none> 2207.9 2256.6
## + VmailMsgs 1 2204.5 2261.3
## + DayCall 1 2205.9 2262.7
## + Tenure 1 2207.7 2264.4
## + EveCharge 1 2207.7 2264.5
## + EveCall 1 2207.8 2264.6
## + NightCall 1 2207.9 2264.7
## + DayCharge 1 2207.9 2264.7
## - EveMin 1 2244.1 2284.6
## - VmailPlan 1 2254.5 2295.0
## - DayMin 1 2361.9 2402.5
## - CustServCall 1 2379.6 2420.1
## - IntPlan 1 2395.9 2436.5
##
## Step: AIC=2247.4
## Churn ~ IntPlan + CustServCall + DayMin + VmailPlan + EveMin +
## IntCharge
##
## Df Deviance AIC
## + IntCall 1 2176.5 2241.4
## + NightCharge 1 2179.8 2244.7
## + NightMin 1 2179.8 2244.7
## <none> 2190.6 2247.4
## + VmailMsgs 1 2187.2 2252.0
## + DayCall 1 2188.8 2253.7
## + IntMin 1 2190.2 2255.0
## + Tenure 1 2190.4 2255.3
## + EveCharge 1 2190.4 2255.3
## + EveCall 1 2190.5 2255.4
## + NightCall 1 2190.6 2255.5
## + DayCharge 1 2190.6 2255.5
## - IntCharge 1 2207.9 2256.6
## - EveMin 1 2229.1 2277.7
## - VmailPlan 1 2238.4 2287.1
## - DayMin 1 2347.0 2395.7
## - CustServCall 1 2365.0 2413.6
## - IntPlan 1 2374.2 2422.8
##
## Step: AIC=2241.42
## Churn ~ IntPlan + CustServCall + DayMin + VmailPlan + EveMin +
## IntCharge + IntCall
##
## Df Deviance AIC
## + NightCharge 1 2165.5 2238.5
## + NightMin 1 2165.5 2238.5
## <none> 2176.5 2241.4
## + VmailMsgs 1 2172.9 2245.9
## - IntCall 1 2190.6 2247.4
## + DayCall 1 2175.0 2248.0
## + IntMin 1 2175.9 2248.9
## + Tenure 1 2176.2 2249.2
## + EveCharge 1 2176.3 2249.3
## + EveCall 1 2176.4 2249.4
## + NightCall 1 2176.5 2249.5
## + DayCharge 1 2176.5 2249.5
## - IntCharge 1 2195.2 2252.0
## - EveMin 1 2215.3 2272.1
## - VmailPlan 1 2223.4 2280.2
## - DayMin 1 2334.9 2391.7
## - CustServCall 1 2350.9 2407.7
## - IntPlan 1 2362.6 2419.4
##
## Step: AIC=2238.52
## Churn ~ IntPlan + CustServCall + DayMin + VmailPlan + EveMin +
## IntCharge + IntCall + NightCharge
##
## Df Deviance AIC
## <none> 2165.5 2238.5
## - NightCharge 1 2176.5 2241.4
## + VmailMsgs 1 2161.6 2242.7
## - IntCall 1 2179.8 2244.7
## + DayCall 1 2164.1 2245.2
## + IntMin 1 2164.8 2246.0
## + Tenure 1 2165.1 2246.2
## + EveCall 1 2165.4 2246.5
## + EveCharge 1 2165.4 2246.5
## + NightCall 1 2165.5 2246.6
## + NightMin 1 2165.5 2246.6
## + DayCharge 1 2165.5 2246.6
## - IntCharge 1 2184.4 2249.3
## - EveMin 1 2206.1 2271.0
## - VmailPlan 1 2213.1 2278.0
## - DayMin 1 2325.3 2390.2
## - CustServCall 1 2342.4 2407.3
## - IntPlan 1 2355.5 2420.4
summary(ReducedLogistic)
##
## Call:
## glm(formula = Churn ~ IntPlan + CustServCall + DayMin + VmailPlan +
## EveMin + IntCharge + IntCall + NightCharge, family = binomial(logit),
## data = ChurnTrain)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.1195 -0.5148 -0.3383 -0.2004 3.1062
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -8.048824 0.514331 -15.649 < 2e-16 ***
## IntPlan yes 2.041937 0.145164 14.066 < 2e-16 ***
## CustServCall 0.512582 0.039101 13.109 < 2e-16 ***
## DayMin 0.013005 0.001082 12.018 < 2e-16 ***
## VmailPlan yes -0.938134 0.144801 -6.479 9.25e-11 ***
## EveMin 0.007167 0.001141 6.284 3.31e-10 ***
## IntCharge 0.323989 0.075363 4.299 1.72e-05 ***
## IntCall -0.091427 0.024951 -3.664 0.000248 ***
## NightCharge 0.081464 0.024621 3.309 0.000937 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 2758.3 on 3332 degrees of freedom
## Residual deviance: 2165.5 on 3324 degrees of freedom
## AIC: 2183.5
##
## Number of Fisher Scoring iterations: 6
# Reduced: Pseudo (Deviance) R2 = (2758.3 - 2165.5)/2758.3 = 0.2154
# Exponentiate and interpret logistic coefficients
# Multiplicative change in odds per unit change in predictor
LogisticCoef <- coef(summary(ReducedLogistic))
LogisticCoef
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -8.048824326 0.514330514 -15.649129 3.367999e-55
## IntPlan yes 2.041937497 0.145163659 14.066451 6.105758e-45
## CustServCall 0.512581562 0.039100522 13.109328 2.911677e-39
## DayMin 0.013004997 0.001082170 12.017512 2.874978e-33
## VmailPlan yes -0.938133569 0.144801055 -6.478776 9.246979e-11
## EveMin 0.007166669 0.001140544 6.283553 3.309209e-10
## IntCharge 0.323989488 0.075362839 4.299062 1.715228e-05
## IntCall -0.091427037 0.024951032 -3.664259 2.480559e-04
## NightCharge 0.081464293 0.024621466 3.308669 9.374044e-04
LogisticCoef[,1]
## (Intercept) IntPlan yes CustServCall DayMin VmailPlan yes EveMin IntCharge
## -8.048824326 2.041937497 0.512581562 0.013004997 -0.938133569 0.007166669 0.323989488
## IntCall NightCharge
## -0.091427037 0.081464293
ExpCoef <- (exp(LogisticCoef[,1]))
ExpCoef
## (Intercept) IntPlan yes CustServCall DayMin VmailPlan yes EveMin IntCharge
## 0.0003194773 7.7055241748 1.6695958012 1.0130899294 0.3913575960 1.0071924108 1.3826327726
## IntCall NightCharge
## 0.9126279016 1.0848744791
cbind(LogisticCoef, ExpCoef)
## Estimate Std. Error z value Pr(>|z|) ExpCoef
## (Intercept) -8.048824326 0.514330514 -15.649129 3.367999e-55 0.0003194773
## IntPlan yes 2.041937497 0.145163659 14.066451 6.105758e-45 7.7055241748
## CustServCall 0.512581562 0.039100522 13.109328 2.911677e-39 1.6695958012
## DayMin 0.013004997 0.001082170 12.017512 2.874978e-33 1.0130899294
## VmailPlan yes -0.938133569 0.144801055 -6.478776 9.246979e-11 0.3913575960
## EveMin 0.007166669 0.001140544 6.283553 3.309209e-10 1.0071924108
## IntCharge 0.323989488 0.075362839 4.299062 1.715228e-05 1.3826327726
## IntCall -0.091427037 0.024951032 -3.664259 2.480559e-04 0.9126279016
## NightCharge 0.081464293 0.024621466 3.308669 9.374044e-04 1.0848744791
# Compute and examine training-sample predictions
# for reduced logistic --
# Logistic Pred, Logistic Prob, Classification
# Better/smarter prediction planning
ChurnPred # Sample prediction data, n = 5
## State AreaCode PhoneNum Churn ChurnL ChurnTF ChurnYN Tenure VmailPlan IntPlan CustServCall
## 1 KS 415 413-9854 0 False. FALSE no 90 yes no 1
## 2 NJ 408 402-8337 0 False. FALSE no 113 no yes 3
## 3 AL 408 351-4935 0 False. FALSE no 74 yes no 1
## 4 MI 510 355-9594 0 False. FALSE no 52 no no 3
## 5 NE 415 329-9540 0 False. FALSE no 115 no no 1
## VmailMsgs DayCall DayMin DayCharge EveCall EveMin EveCharge NightCall NightMin NightCharge
## 1 30 104 191.3 32.52 109 257.1 21.85 89 177.7 8.00
## 2 0 98 122.4 20.81 116 223.8 19.02 148 267.5 12.04
## 3 46 109 277.7 47.21 114 270.0 22.95 82 165.3 7.44
## 4 0 100 219.0 37.23 110 148.9 12.66 129 151.8 6.83
## 5 0 104 135.4 23.02 91 138.8 11.80 92 208.5 9.38
## IntCall IntMin IntCharge
## 1 1 11.0 2.97
## 2 5 11.6 3.13
## 3 2 10.4 2.81
## 4 8 11.9 3.21
## 5 3 5.4 1.46
LogisticPred <- predict(ReducedLogistic, newdata=ChurnTrain)
LogisticProb <- predict(ReducedLogistic, newdata=ChurnTrain,
type="response")
# Compute and examine full-sample predictions for reduced logistic
LogisticPred <- predict(ReducedLogistic, newdata=ChurnTrain)
with(ChurnTrain, Hist(LogisticPred, scale="frequency",
breaks="Sturges", col="darkgray"))

LogisticProb <- predict(ReducedLogistic, newdata=ChurnTrain,
type="response")
with(ChurnTrain, Hist(LogisticProb, scale="frequency",
breaks="Sturges", col="darkgray"))

scatterplot(LogisticProb~RegPred, reg.line=FALSE, smooth=TRUE, spread=FALSE,
id.method='mahal', id.n = 2, boxplots='xy', span=0.5, data=ChurnTrain)

## 543 1193
## 543 1193
scatterplot(LogisticProb~LogisticPred, reg.line=FALSE,
smooth=FALSE, spread=FALSE, id.method='mahal', id.n = 2,
boxplots='xy', span=0.5)

## 649 2270
## 649 2270
# Classification analysis, training sample
Threshold <- 0.5
LogisticClass <- rep(0, TrainRows)
LogisticClass[LogisticProb > Threshold] <- 1
LogisticClass
## [1] 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [48] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
## [95] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
## [142] 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
## [189] 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
## [236] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
## [283] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [330] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [377] 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [424] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
## [471] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [518] 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
## [565] 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
## [612] 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [659] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
## [706] 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [753] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
## [800] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
## [847] 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [894] 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
## [941] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0
## [988] 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
## [1035] 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [1082] 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [1129] 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
## [1176] 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [1223] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
## [1270] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
## [1317] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [1364] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [1411] 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
## [1458] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
## [1505] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
## [1552] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
## [1599] 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
## [1646] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [1693] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [1740] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [1787] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
## [1834] 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [1881] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [1928] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [1975] 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [2022] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [2069] 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
## [2116] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
## [2163] 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
## [2210] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
## [2257] 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
## [2304] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [2351] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1
## [2398] 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [2445] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
## [2492] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [2539] 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [2586] 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [2633] 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0
## [2680] 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [2727] 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
## [2774] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [2821] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [2868] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
## [2915] 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0
## [2962] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [3009] 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [3056] 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [3103] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
## [3150] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
## [3197] 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0
## [3244] 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [3291] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
table(LogisticClass, ChurnTrain$Churn)
##
## LogisticClass 0 1
## 0 2773 379
## 1 77 104
mean(LogisticClass==ChurnTrain$Churn)
## [1] 0.8631863
# Add predictions to data set, save to .Rdata and .csv
ChurnTrain$RegPred <- RegPred
ChurnTrain$LogisticPred <- LogisticPred
ChurnTrain$LogisticProb <- LogisticProb
ChurnTrain$LogisticClass <- LogisticClass
ChurnTrain[1:5,]
## TrainTest State AreaCode PhoneNum Churn ChurnL ChurnTF ChurnYN VmailPlan IntPlan Tenure
## 1 Train KS 415 382-4657 0 False. FALSE no yes no 128
## 2 Train OH 415 371-7191 0 False. FALSE no yes no 107
## 3 Train NJ 415 358-1921 0 False. FALSE no no no 137
## 4 Train OH 408 375-9999 0 False. FALSE no no yes 84
## 5 Train OK 415 330-6626 0 False. FALSE no no yes 75
## CustServCall VmailMsgs DayCall DayMin DayCharge EveCall EveMin EveCharge NightCall NightMin
## 1 1 25 110 265.1 45.07 99 197.4 16.78 91 244.7
## 2 1 26 123 161.6 27.47 103 195.5 16.62 103 254.4
## 3 0 0 114 243.4 41.38 110 121.2 10.30 104 162.6
## 4 2 0 71 299.4 50.90 88 61.9 5.26 89 196.9
## 5 3 0 113 166.7 28.34 122 148.3 12.61 121 186.9
## NightCharge IntCall IntMin IntCharge RegPred LogisticPred LogisticProb LogisticClass
## 1 11.01 3 10.0 2.70 0.19612116 -2.11463894 0.10768211 0
## 2 11.45 3 13.7 3.70 0.08823906 -3.11443898 0.04251557 0
## 3 7.32 5 12.2 3.29 0.12176618 -2.80969903 0.05680230 0
## 4 8.86 7 6.6 1.78 0.20252791 0.01407475 0.50351863 1
## 5 8.41 3 10.1 2.73 0.20152391 0.05693267 0.51422932 1
save("ChurnTrain", file="ChurnTrainAnalysis.RData")
write.table(ChurnTrain,
"ChurnExampleTrainAnalysis.csv", sep=",",
col.names=TRUE, row.names=FALSE, quote=FALSE, na="NA")
# MODEL EVALUATION USING TEST DATA
# Read Test data set, list, summarize,
# convert AreaCode to factor
ChurnTest <-
read.table("ChurnTest.csv",
header=TRUE, sep=",", na.strings="NA", dec=".", strip.white=TRUE)
TestRows <- nrow(ChurnTest)
TestRows
## [1] 1667
ChurnTest[1:5,]
## TrainTest State AreaCode PhoneNum Churn ChurnL ChurnTF ChurnYN VmailPlan IntPlan Tenure
## 1 Test HI 510 354-8815 0 False. FALSE no no no 101
## 2 Test MT 510 381-7211 0 False. FALSE no no no 137
## 3 Test OH 408 411-9481 0 False. FALSE no yes no 103
## 4 Test NM 415 418-9100 0 False. FALSE no no no 99
## 5 Test SC 415 413-3643 0 False. FALSE no no no 108
## CustServCall VmailMsgs DayCall DayMin DayCharge EveCall EveMin EveCharge NightCall NightMin
## 1 3 0 123 70.9 12.05 73 211.9 18.01 73 236.0
## 2 0 0 86 223.6 38.01 139 244.8 20.81 81 94.2
## 3 1 29 95 294.7 50.10 105 237.3 20.17 127 300.3
## 4 1 0 123 216.8 36.86 88 126.4 10.74 82 220.6
## 5 2 0 78 197.4 33.56 101 124.0 10.54 107 204.5
## NightCharge IntCall IntMin IntCharge
## 1 10.62 3 10.6 2.86
## 2 4.24 7 9.5 2.57
## 3 13.51 6 13.7 3.70
## 4 9.93 2 15.7 4.24
## 5 9.20 4 7.7 2.08
ChurnTest <- within(ChurnTest, {
AreaCode <- as.factor(AreaCode)
})
# Data Understanding -- Numerical summaries and scatterplot matrix
numSummary(ChurnTest[,c("Churn", "CustServCall", "DayCall", "DayCharge",
"DayMin", "EveCall", "EveCharge", "EveMin", "IntCall", "IntCharge",
"IntMin", "NightCall", "NightCharge", "NightMin", "Tenure", "VmailMsgs")],
statistics=c("mean", "sd", "quantiles", "skewness"),
quantiles=c(0,.25,.5,.75,1), type="2")
## mean sd skewness 0% 25% 50% 75% 100% n
## Churn 0.1343731 0.3411551 2.14603891 0.00 0.00 0.00 0.000 1.00 1667
## CustServCall 1.5854829 1.2881789 0.94057530 0.00 1.00 1.00 2.000 7.00 1667
## DayCall 99.2171566 19.3271480 -0.03478810 34.00 86.00 99.00 112.000 160.00 1667
## DayCharge 30.8243371 8.9644209 0.03046359 1.12 24.44 30.77 36.680 59.76 1667
## DayMin 181.3161968 52.7321741 0.03044268 6.60 143.75 181.00 215.750 351.50 1667
## EveCall 100.3443311 19.6379345 0.05444288 38.00 88.00 100.00 113.000 169.00 1667
## EveCharge 16.9959028 4.2697582 0.01469221 1.90 14.10 17.03 19.745 30.54 1667
## EveMin 199.9491902 50.2328692 0.01464847 22.30 165.90 200.40 232.300 359.30 1667
## IntCall 4.3467307 2.4462517 1.44449354 0.00 3.00 4.00 5.000 19.00 1667
## IntCharge 2.7844211 0.7287639 -0.12906592 0.00 2.32 2.81 3.240 5.32 1667
## IntMin 10.3107379 2.6996596 -0.12843413 0.00 8.60 10.40 12.000 19.70 1667
## NightCall 99.5422915 20.7174406 -0.04319867 0.00 86.00 99.00 113.000 170.00 1667
## NightCharge 8.9745591 2.2696037 0.03997807 0.00 7.50 8.97 10.490 17.17 1667
## NightMin 199.4310738 50.4370099 0.04002483 0.00 166.60 199.40 233.050 381.60 1667
## Tenure 98.6466707 39.4007551 0.13337250 1.00 72.00 98.00 126.000 238.00 1667
## VmailMsgs 7.0677864 13.2352738 1.53738062 0.00 0.00 0.00 0.000 52.00 1667
scatterplotMatrix(~Churn+Tenure+VmailMsgs+CustServCall+
DayMin+EveMin+IntMin+NightMin, reg.line=lm, smooth=TRUE,
spread=FALSE, span=0.5, id.n=0, diagonal = 'histogram',
data=ChurnTest)

# Generate test set predictions --
# Regression Pred, Logistic Pred, Logistic Prob, Classification
RegPred <- predict(ReducedRegression, newdata=ChurnTest,
interval="none")
LogisticPred <- predict(ReducedLogistic, newdata=ChurnTest,
interval="none")
LogisticProb <- predict(ReducedLogistic, newdata=ChurnTest,
interval="none", type="response")
Threshold <- 0.5
LogisticClass <- rep(0, TestRows)
LogisticClass[LogisticProb > Threshold] <- 1
LogisticClass
## [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [48] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0
## [95] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [142] 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [189] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
## [236] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
## [283] 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
## [330] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [377] 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
## [424] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [471] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [518] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [565] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [612] 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
## [659] 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [706] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [753] 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
## [800] 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [847] 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
## [894] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
## [941] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1
## [988] 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
## [1035] 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
## [1082] 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
## [1129] 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
## [1176] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [1223] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
## [1270] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
## [1317] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
## [1364] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [1411] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [1458] 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
## [1505] 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
## [1552] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
## [1599] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [1646] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
table(LogisticClass, ChurnTest$Churn)
##
## LogisticClass 0 1
## 0 1409 183
## 1 34 41
mean(LogisticClass==ChurnTest$Churn)
## [1] 0.869826
# Add predictions to test set, save and export to csv
ChurnTest$RegPred <- RegPred
ChurnTest$LogisticPred <- LogisticPred
ChurnTest$LogisticProb <- LogisticProb
ChurnTest$LogisticClass <- LogisticClass
ChurnTest[1:5,]
## TrainTest State AreaCode PhoneNum Churn ChurnL ChurnTF ChurnYN VmailPlan IntPlan Tenure
## 1 Test HI 510 354-8815 0 False. FALSE no no no 101
## 2 Test MT 510 381-7211 0 False. FALSE no no no 137
## 3 Test OH 408 411-9481 0 False. FALSE no yes no 103
## 4 Test NM 415 418-9100 0 False. FALSE no no no 99
## 5 Test SC 415 413-3643 0 False. FALSE no no no 108
## CustServCall VmailMsgs DayCall DayMin DayCharge EveCall EveMin EveCharge NightCall NightMin
## 1 3 0 123 70.9 12.05 73 211.9 18.01 73 236.0
## 2 0 0 86 223.6 38.01 139 244.8 20.81 81 94.2
## 3 1 29 95 294.7 50.10 105 237.3 20.17 127 300.3
## 4 1 0 123 216.8 36.86 88 126.4 10.74 82 220.6
## 5 2 0 78 197.4 33.56 101 124.0 10.54 107 204.5
## NightCharge IntCall IntMin IntCharge RegPred LogisticPred LogisticProb LogisticClass
## 1 10.62 3 10.6 2.86 0.1195716 -2.552929 0.07222998 0
## 2 4.24 7 9.5 2.57 0.1376049 -2.848434 0.05476231 0
## 3 13.51 6 13.7 3.70 0.2664836 -1.190372 0.23319244 0
## 4 9.93 2 15.7 4.24 0.2018943 -1.811091 0.14050635 0
## 5 9.20 4 7.7 2.08 0.1396597 -2.510146 0.07514993 0
save("ChurnTest", file="ChurnTestAnalysis.RData")
write.table(ChurnTest,
"ChurnTestAnalysis.csv", sep=",",
col.names=TRUE, row.names=FALSE, quote=FALSE, na="NA")