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")