Monday, May 8, 2017

Python Case Study - Predicting Telecom Customer Churn using Logistic Regression, Support Vector Machine & Random Forest


In [ ]:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
In [2]:
telcochurn=pd.read_csv("PATH to the File with .csv file extension")
In [4]:
telcochurn.head()
Out[4]:
Account Length
International Plan
Voice Mail Plan
Num of Voice mail Messages
Total Day Minutes
Total Day Calls
Total day Charge
Total Eve Minutes
Total Eve Calls
Total Eve Charge
Total Night Minutes
Total Night Calls
Total Night Charge
Total International Minutes
Total Intl Calls
Total Intl Charge
Number Customer Service calls
Churn
0
128
0
1
25
265.1
110
45.07
197.4
99
16.78
244.7
91
11.01
10.0
3
2.70
1
0
1
107
0
1
26
161.6
123
27.47
195.5
103
16.62
254.4
103
11.45
13.7
3
3.70
1
0
2
137
0
0
0
243.4
114
41.38
121.2
110
10.30
162.6
104
7.32
12.2
5
3.29
0
0
3
84
1
0
0
299.4
71
50.90
61.9
88
5.26
196.9
89
8.86
6.6
7
1.78
2
0
4
75
1
0
0
166.7
113
28.34
148.3
122
12.61
186.9
121
8.41
10.1
3
2.73
3
0
In [5]:
telcochurn.columns
Out[5]:
Index(['Account Length', 'International Plan', 'Voice Mail Plan',
       'Num of Voice mail Messages', 'Total Day Minutes', 'Total Day Calls',
       'Total day Charge', 'Total Eve Minutes', 'Total Eve Calls',
       'Total Eve Charge', 'Total Night Minutes', 'Total Night Calls ',
       'Total Night Charge', 'Total International Minutes',
       'Total Intl  Calls', 'Total Intl Charge',
       'Number Customer Service calls ', 'Churn'],
      dtype='object')
In [13]:
feature_cols=telcochurn[['Account Length', 'International Plan', 'Voice Mail Plan',
       'Num of Voice mail Messages', 'Total Day Minutes', 'Total Day Calls',
       'Total day Charge', 'Total Eve Minutes', 'Total Eve Calls',
       'Total Eve Charge', 'Total Night Minutes', 'Total Night Calls ',
       'Total Night Charge', 'Total International Minutes',
       'Total Intl  Calls', 'Total Intl Charge',
       'Number Customer Service calls ']]
In [15]:
from sklearn.linear_model import LogisticRegression
In [16]:
logreg = LogisticRegression()
In [17]:
logreg.fit(feature_cols,telcochurn.Churn)
Out[17]:
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,
          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,
          verbose=0, warm_start=False)
In [18]:
logreg.coef_
Out[18]:
array([[  5.68650239e-04,   2.01019309e+00,  -1.76778749e+00,
          2.38957929e-02,   1.87588040e-02,  -7.72983903e-04,
         -3.71064682e-02,   5.35826051e-03,  -4.93385777e-03,
          4.24187392e-03,   3.19262545e-03,  -4.74561073e-03,
         -7.37187223e-03,   6.27536279e-02,  -8.03434746e-02,
          1.62911927e-02,   4.85563396e-01]])
In [19]:
logreg.intercept_
Out[19]:
array([-6.26440601])
In [20]:
telcochurn["predicted_class"]=logreg.predict(feature_cols)
In [21]:
telcochurn = pd.concat( [telcochurn, pd.DataFrame( logreg.predict_proba(feature_cols ) )], axis = 1) 
In [40]:
telcochurn.head()
Out[40]:
Account Length
International Plan
Voice Mail Plan
Num of Voice mail Messages
Total Day Minutes
Total Day Calls
Total day Charge
Total Eve Minutes
Total Eve Calls
Total Eve Charge
...
Total Night Calls
Total Night Charge
Total International Minutes
Total Intl Calls
Total Intl Charge
Number Customer Service calls
Churn
predicted_class
0
1
0
128
0
1
25
265.1
110
45.07
197.4
99
16.78
...
91
11.01
10.0
3
2.70
1
0
0
0.910662
0.089338
1
107
0
1
26
161.6
123
27.47
195.5
103
16.62
...
103
11.45
13.7
3
3.70
1
0
0
0.968313
0.031687
2
137
0
0
0
243.4
114
41.38
121.2
110
10.30
...
104
7.32
12.2
5
3.29
0
0
0
0.937304
0.062696
3
84
1
0
0
299.4
71
50.90
61.9
88
5.26
...
89
8.86
6.6
7
1.78
2
0
1
0.406369
0.593631
4
75
1
0
0
166.7
113
28.34
148.3
122
12.61
...
121
8.41
10.1
3
2.73
3
0
0
0.530660
0.469340
5 rows × 21 columns
In [23]:
from sklearn import metrics
In [24]:
cm=metrics.confusion_matrix(telcochurn.Churn,telcochurn.predicted_class)
In [25]:
cm
Out[25]:
array([[4201,   92],
       [ 583,  124]])
In [26]:
import seaborn as sn
In [28]:
sn.heatmap(cm,annot=True,fmt='.2f');


In [29]:
score=metrics.accuracy_score(telcochurn.Churn,telcochurn.predicted_class)
In [30]:
score
Out[30]:
0.86499999999999999
In [32]:
from sklearn.cross_validation import cross_val_score
C:\Users\rajeshdgr8\Anaconda3\lib\site-packages\sklearn\cross_validation.py:44: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.
  "This module will be removed in 0.20.", DeprecationWarning)
In [33]:
scores=cross_val_score(logreg,feature_cols,telcochurn.Churn,cv=10,scoring='accuracy')
In [34]:
scores
Out[34]:
array([ 0.86227545,  0.87225549,  0.85229541,  0.862     ,  0.864     ,
        0.868     ,  0.856     ,  0.86172345,  0.85971944,  0.8757515 ])
In [35]:
scores.mean()
Out[35]:
0.86340207360829435
In [37]:
print(metrics.classification_report(telcochurn.Churn,telcochurn.predicted_class))
             precision    recall  f1-score   support

          0       0.88      0.98      0.93      4293
          1       0.57      0.18      0.27       707

avg / total       0.84      0.86      0.83      5000

In [38]:
auc_score = metrics.roc_auc_score(telcochurn.Churn,telcochurn.predicted_class)
In [39]:
auc_score
Out[39]:
0.57697936610073108
In [41]:
import statsmodels.api as sm
In [42]:
In [50]:
logit=sm.Logit(telcochurn.Churn,feature_cols)
In [56]:
result=logit.fit()
Optimization terminated successfully.
         Current function value: 0.338345
         Iterations 7
In [59]:
result.summary()
Out[59]:
Logit Regression Results
Dep. Variable:
Churn
No. Observations:
5000
Model:
Logit
Df Residuals:
4983
Method:
MLE
Df Model:
16
Date:
Mon, 08 May 2017
Pseudo R-squ.:
0.1697
Time:
19:17:19
Log-Likelihood:
-1691.7
converged:
True
LL-Null:
-2037.5
LLR p-value:
8.251e-137

coef
std err
z
P>|z|
[0.025
0.975]
Account Length
-0.0019
0.001
-1.762
0.078
-0.004
0.000
International Plan
2.0031
0.118
16.928
0.000
1.771
2.235
Voice Mail Plan
-2.0193
0.463
-4.364
0.000
-2.926
-1.112
Num of Voice mail Messages
0.0310
0.014
2.145
0.032
0.003
0.059
Total Day Minutes
4.0780
2.604
1.566
0.117
-1.025
9.181
Total Day Calls
-0.0111
0.002
-5.468
0.000
-0.015
-0.007
Total day Charge
-23.9328
15.317
-1.563
0.118
-53.953
6.088
Total Eve Minutes
-0.0236
1.304
-0.018
0.986
-2.579
2.532
Total Eve Calls
-0.0154
0.002
-7.504
0.000
-0.019
-0.011
Total Eve Charge
0.2991
15.341
0.019
0.984
-29.768
30.367
Total Night Minutes
0.1664
0.696
0.239
0.811
-1.197
1.530
Total Night Calls
-0.0147
0.002
-7.127
0.000
-0.019
-0.011
Total Night Charge
-3.7082
15.459
-0.240
0.810
-34.007
26.591
Total International Minutes
0.4588
4.214
0.109
0.913
-7.801
8.719
Total Intl Calls
-0.1106
0.020
-5.520
0.000
-0.150
-0.071
Total Intl Charge
-1.6785
15.609
-0.108
0.914
-32.271
28.914
Number Customer Service calls
0.4315
0.031
13.821
0.000
0.370
0.493
In [60]:
from sklearn import svm
In [64]:
SVMmodel = svm.SVC() 
In [65]:
SVMmodel.fit(feature_cols,telcochurn.Churn)
Out[65]:
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
  decision_function_shape=None, degree=3, gamma='auto', kernel='rbf',
  max_iter=-1, probability=False, random_state=None, shrinking=True,
  tol=0.001, verbose=False)
In [67]:
telcochurn["SVMpredictedclass"]=SVMmodel.predict(feature_cols)
In [68]:
 
Out[68]:
Account Length
International Plan
Voice Mail Plan
Num of Voice mail Messages
Total Day Minutes
Total Day Calls
Total day Charge
Total Eve Minutes
Total Eve Calls
Total Eve Charge
...
Total Night Charge
Total International Minutes
Total Intl Calls
Total Intl Charge
Number Customer Service calls
Churn
predicted_class
0
1
SVMpredictedclass
0
128
0
1
25
265.1
110
45.07
197.4
99
16.78
...
11.01
10.0
3
2.70
1
0
0
0.910662
0.089338
0
1
107
0
1
26
161.6
123
27.47
195.5
103
16.62
...
11.45
13.7
3
3.70
1
0
0
0.968313
0.031687
0
2
137
0
0
0
243.4
114
41.38
121.2
110
10.30
...
7.32
12.2
5
3.29
0
0
0
0.937304
0.062696
0
3
84
1
0
0
299.4
71
50.90
61.9
88
5.26
...
8.86
6.6
7
1.78
2
0
1
0.406369
0.593631
0
4
75
1
0
0
166.7
113
28.34
148.3
122
12.61
...
8.41
10.1
3
2.73
3
0
0
0.530660
0.469340
0
5 rows × 22 columns
In [69]:
svmcm=metrics.confusion_matrix(telcochurn.Churn,telcochurn.SVMpredictedclass)
In [70]:
svmcm
Out[70]:
array([[4293,    0],
       [   0,  707]])
In [71]:
sn.heatmap(svmcm,annot=True,fmt='.2f');
Description: data:image/png;base64,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
In [72]:
svmscore=metrics.accuracy_score(telcochurn.Churn,telcochurn.SVMpredictedclass)
In [73]:
svmscore
Out[73]:
1.0
In [74]:
svmscores=cross_val_score(SVMmodel,feature_cols,telcochurn.Churn,cv=10,scoring='accuracy')
In [75]:
svmscores
Out[75]:
array([ 0.85828343,  0.85828343,  0.85828343,  0.858     ,  0.858     ,
        0.858     ,  0.858     ,  0.85971944,  0.85971944,  0.85971944])
In [76]:
svmscores.mean()
Out[76]:
0.8586008616034464
In [77]:
print(metrics.classification_report(telcochurn.Churn,telcochurn.SVMpredictedclass))
             precision    recall  f1-score   support

          0       1.00      1.00      1.00      4293
          1       1.00      1.00      1.00       707

avg / total       1.00      1.00      1.00      5000

In [78]:
auc_score = metrics.roc_auc_score(telcochurn.Churn,telcochurn.SVMpredictedclass)
In [79]:
auc_score
Out[79]:
1.0
In [83]:
from sklearn.ensemble import RandomForestClassifier
In [84]:
rf = RandomForestClassifier(n_estimators=100)
In [85]:
rf.fit(feature_cols,telcochurn.Churn)
Out[85]:
RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
            max_depth=None, max_features='auto', max_leaf_nodes=None,
            min_impurity_split=1e-07, min_samples_leaf=1,
            min_samples_split=2, min_weight_fraction_leaf=0.0,
            n_estimators=100, n_jobs=1, oob_score=False, random_state=None,
            verbose=0, warm_start=False)
In [86]:
telcochurn["Randfpredictedclass"]=rf.predict(feature_cols)
In [87]:
telcochurn.head()
Out[87]:
Account Length
International Plan
Voice Mail Plan
Num of Voice mail Messages
Total Day Minutes
Total Day Calls
Total day Charge
Total Eve Minutes
Total Eve Calls
Total Eve Charge
...
Total International Minutes
Total Intl Calls
Total Intl Charge
Number Customer Service calls
Churn
predicted_class
0
1
SVMpredictedclass
Randfpredictedclass
0
128
0
1
25
265.1
110
45.07
197.4
99
16.78
...
10.0
3
2.70
1
0
0
0.910662
0.089338
0
0
1
107
0
1
26
161.6
123
27.47
195.5
103
16.62
...
13.7
3
3.70
1
0
0
0.968313
0.031687
0
0
2
137
0
0
0
243.4
114
41.38
121.2
110
10.30
...
12.2
5
3.29
0
0
0
0.937304
0.062696
0
0
3
84
1
0
0
299.4
71
50.90
61.9
88
5.26
...
6.6
7
1.78
2
0
1
0.406369
0.593631
0
0
4
75
1
0
0
166.7
113
28.34
148.3
122
12.61
...
10.1
3
2.73
3
0
0
0.530660
0.469340
0
0
5 rows × 23 columns
In [88]:
RFcm=metrics.confusion_matrix(telcochurn.Churn,telcochurn.Randfpredictedclass)
In [89]:
RFcm
Out[89]:
array([[4293,    0],
       [   0,  707]])
In [ ]:
 

No comments:

Post a Comment