Skip to content

Commit ff57c0d

Browse files
committedFeb 11, 2025
feat: create 01_data_preprocessing.ipynb and 02_modeling.ipynb
1 parent 670cba4 commit ff57c0d

File tree

2 files changed

+1497
-0
lines changed

2 files changed

+1497
-0
lines changed
 

‎ChurnAnalysis/notebooks/01_data_preprocessing.ipynb

+933
Large diffs are not rendered by default.
+564
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,564 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "code",
5+
"execution_count": 1,
6+
"metadata": {},
7+
"outputs": [],
8+
"source": [
9+
"import sys\n",
10+
"sys.path.append('..')\n",
11+
"from data_preprocessing import DataPreprocessing\n",
12+
"from model_training import ModelTraining\n",
13+
"import config"
14+
]
15+
},
16+
{
17+
"cell_type": "code",
18+
"execution_count": 2,
19+
"metadata": {},
20+
"outputs": [],
21+
"source": [
22+
"PROCESSED_DATA_PATH = config.DATA_FOLDER + config.PROCESSED_DATA_PATH"
23+
]
24+
},
25+
{
26+
"cell_type": "code",
27+
"execution_count": 3,
28+
"metadata": {},
29+
"outputs": [
30+
{
31+
"name": "stderr",
32+
"output_type": "stream",
33+
"text": [
34+
"2025-02-12 01:33:36,106 - INFO - Loading dataset from ../data/../data/processed_churn_data.csv\n"
35+
]
36+
}
37+
],
38+
"source": [
39+
"data = DataPreprocessing.load_data(PROCESSED_DATA_PATH)"
40+
]
41+
},
42+
{
43+
"cell_type": "code",
44+
"execution_count": 4,
45+
"metadata": {},
46+
"outputs": [
47+
{
48+
"data": {
49+
"text/html": [
50+
"<div>\n",
51+
"<style scoped>\n",
52+
" .dataframe tbody tr th:only-of-type {\n",
53+
" vertical-align: middle;\n",
54+
" }\n",
55+
"\n",
56+
" .dataframe tbody tr th {\n",
57+
" vertical-align: top;\n",
58+
" }\n",
59+
"\n",
60+
" .dataframe thead th {\n",
61+
" text-align: right;\n",
62+
" }\n",
63+
"</style>\n",
64+
"<table border=\"1\" class=\"dataframe\">\n",
65+
" <thead>\n",
66+
" <tr style=\"text-align: right;\">\n",
67+
" <th></th>\n",
68+
" <th>user</th>\n",
69+
" <th>churn</th>\n",
70+
" <th>age</th>\n",
71+
" <th>housing</th>\n",
72+
" <th>deposits</th>\n",
73+
" <th>withdrawal</th>\n",
74+
" <th>purchases_partners</th>\n",
75+
" <th>purchases</th>\n",
76+
" <th>cc_taken</th>\n",
77+
" <th>cc_recommended</th>\n",
78+
" <th>...</th>\n",
79+
" <th>payment_type</th>\n",
80+
" <th>waiting_4_loan</th>\n",
81+
" <th>cancelled_loan</th>\n",
82+
" <th>received_loan</th>\n",
83+
" <th>rejected_loan</th>\n",
84+
" <th>zodiac_sign</th>\n",
85+
" <th>left_for_two_month_plus</th>\n",
86+
" <th>left_for_one_month</th>\n",
87+
" <th>reward_rate</th>\n",
88+
" <th>is_referred</th>\n",
89+
" </tr>\n",
90+
" </thead>\n",
91+
" <tbody>\n",
92+
" <tr>\n",
93+
" <th>0</th>\n",
94+
" <td>23547</td>\n",
95+
" <td>0</td>\n",
96+
" <td>28.0</td>\n",
97+
" <td>R</td>\n",
98+
" <td>0</td>\n",
99+
" <td>0</td>\n",
100+
" <td>1</td>\n",
101+
" <td>0</td>\n",
102+
" <td>0</td>\n",
103+
" <td>96</td>\n",
104+
" <td>...</td>\n",
105+
" <td>Weekly</td>\n",
106+
" <td>0</td>\n",
107+
" <td>0</td>\n",
108+
" <td>0</td>\n",
109+
" <td>0</td>\n",
110+
" <td>Leo</td>\n",
111+
" <td>0</td>\n",
112+
" <td>0</td>\n",
113+
" <td>1.47</td>\n",
114+
" <td>1</td>\n",
115+
" </tr>\n",
116+
" <tr>\n",
117+
" <th>1</th>\n",
118+
" <td>58313</td>\n",
119+
" <td>0</td>\n",
120+
" <td>35.0</td>\n",
121+
" <td>R</td>\n",
122+
" <td>47</td>\n",
123+
" <td>2</td>\n",
124+
" <td>86</td>\n",
125+
" <td>47</td>\n",
126+
" <td>0</td>\n",
127+
" <td>285</td>\n",
128+
" <td>...</td>\n",
129+
" <td>Semi-Monthly</td>\n",
130+
" <td>0</td>\n",
131+
" <td>0</td>\n",
132+
" <td>0</td>\n",
133+
" <td>0</td>\n",
134+
" <td>Capricorn</td>\n",
135+
" <td>1</td>\n",
136+
" <td>0</td>\n",
137+
" <td>2.17</td>\n",
138+
" <td>0</td>\n",
139+
" </tr>\n",
140+
" <tr>\n",
141+
" <th>2</th>\n",
142+
" <td>8095</td>\n",
143+
" <td>0</td>\n",
144+
" <td>26.0</td>\n",
145+
" <td>R</td>\n",
146+
" <td>26</td>\n",
147+
" <td>3</td>\n",
148+
" <td>38</td>\n",
149+
" <td>25</td>\n",
150+
" <td>0</td>\n",
151+
" <td>74</td>\n",
152+
" <td>...</td>\n",
153+
" <td>Bi-Weekly</td>\n",
154+
" <td>0</td>\n",
155+
" <td>0</td>\n",
156+
" <td>0</td>\n",
157+
" <td>0</td>\n",
158+
" <td>Capricorn</td>\n",
159+
" <td>0</td>\n",
160+
" <td>0</td>\n",
161+
" <td>1.10</td>\n",
162+
" <td>1</td>\n",
163+
" </tr>\n",
164+
" <tr>\n",
165+
" <th>3</th>\n",
166+
" <td>3120</td>\n",
167+
" <td>1</td>\n",
168+
" <td>32.0</td>\n",
169+
" <td>R</td>\n",
170+
" <td>5</td>\n",
171+
" <td>3</td>\n",
172+
" <td>111</td>\n",
173+
" <td>5</td>\n",
174+
" <td>0</td>\n",
175+
" <td>227</td>\n",
176+
" <td>...</td>\n",
177+
" <td>Bi-Weekly</td>\n",
178+
" <td>0</td>\n",
179+
" <td>0</td>\n",
180+
" <td>0</td>\n",
181+
" <td>0</td>\n",
182+
" <td>Taurus</td>\n",
183+
" <td>0</td>\n",
184+
" <td>0</td>\n",
185+
" <td>1.83</td>\n",
186+
" <td>0</td>\n",
187+
" </tr>\n",
188+
" <tr>\n",
189+
" <th>4</th>\n",
190+
" <td>41406</td>\n",
191+
" <td>0</td>\n",
192+
" <td>21.0</td>\n",
193+
" <td>na</td>\n",
194+
" <td>0</td>\n",
195+
" <td>0</td>\n",
196+
" <td>4</td>\n",
197+
" <td>0</td>\n",
198+
" <td>0</td>\n",
199+
" <td>0</td>\n",
200+
" <td>...</td>\n",
201+
" <td>Bi-Weekly</td>\n",
202+
" <td>0</td>\n",
203+
" <td>0</td>\n",
204+
" <td>0</td>\n",
205+
" <td>0</td>\n",
206+
" <td>Cancer</td>\n",
207+
" <td>0</td>\n",
208+
" <td>0</td>\n",
209+
" <td>0.07</td>\n",
210+
" <td>0</td>\n",
211+
" </tr>\n",
212+
" </tbody>\n",
213+
"</table>\n",
214+
"<p>5 rows × 28 columns</p>\n",
215+
"</div>"
216+
],
217+
"text/plain": [
218+
" user churn age housing deposits withdrawal purchases_partners \\\n",
219+
"0 23547 0 28.0 R 0 0 1 \n",
220+
"1 58313 0 35.0 R 47 2 86 \n",
221+
"2 8095 0 26.0 R 26 3 38 \n",
222+
"3 3120 1 32.0 R 5 3 111 \n",
223+
"4 41406 0 21.0 na 0 0 4 \n",
224+
"\n",
225+
" purchases cc_taken cc_recommended ... payment_type waiting_4_loan \\\n",
226+
"0 0 0 96 ... Weekly 0 \n",
227+
"1 47 0 285 ... Semi-Monthly 0 \n",
228+
"2 25 0 74 ... Bi-Weekly 0 \n",
229+
"3 5 0 227 ... Bi-Weekly 0 \n",
230+
"4 0 0 0 ... Bi-Weekly 0 \n",
231+
"\n",
232+
" cancelled_loan received_loan rejected_loan zodiac_sign \\\n",
233+
"0 0 0 0 Leo \n",
234+
"1 0 0 0 Capricorn \n",
235+
"2 0 0 0 Capricorn \n",
236+
"3 0 0 0 Taurus \n",
237+
"4 0 0 0 Cancer \n",
238+
"\n",
239+
" left_for_two_month_plus left_for_one_month reward_rate is_referred \n",
240+
"0 0 0 1.47 1 \n",
241+
"1 1 0 2.17 0 \n",
242+
"2 0 0 1.10 1 \n",
243+
"3 0 0 1.83 0 \n",
244+
"4 0 0 0.07 0 \n",
245+
"\n",
246+
"[5 rows x 28 columns]"
247+
]
248+
},
249+
"execution_count": 4,
250+
"metadata": {},
251+
"output_type": "execute_result"
252+
}
253+
],
254+
"source": [
255+
"data.head()"
256+
]
257+
},
258+
{
259+
"cell_type": "code",
260+
"execution_count": 5,
261+
"metadata": {},
262+
"outputs": [],
263+
"source": [
264+
"mt = ModelTraining(PROCESSED_DATA_PATH,\n",
265+
" logistic_regression_params=config.LOGISTIC_REGRESSION_PARAMS,\n",
266+
" grid_search_params=config.GRID_SEARCH_PARAMS)"
267+
]
268+
},
269+
{
270+
"cell_type": "code",
271+
"execution_count": 6,
272+
"metadata": {},
273+
"outputs": [
274+
{
275+
"name": "stderr",
276+
"output_type": "stream",
277+
"text": [
278+
"2025-02-12 01:33:36,281 - INFO - Performing feature engineering on the dataset\n"
279+
]
280+
}
281+
],
282+
"source": [
283+
"mt._split_data()"
284+
]
285+
},
286+
{
287+
"cell_type": "code",
288+
"execution_count": 7,
289+
"metadata": {},
290+
"outputs": [],
291+
"source": [
292+
"mt._balance_data()"
293+
]
294+
},
295+
{
296+
"cell_type": "code",
297+
"execution_count": 8,
298+
"metadata": {},
299+
"outputs": [],
300+
"source": [
301+
"mt._scale_features()"
302+
]
303+
},
304+
{
305+
"cell_type": "code",
306+
"execution_count": 9,
307+
"metadata": {},
308+
"outputs": [],
309+
"source": [
310+
"mt.build_model()"
311+
]
312+
},
313+
{
314+
"cell_type": "code",
315+
"execution_count": 10,
316+
"metadata": {},
317+
"outputs": [
318+
{
319+
"name": "stdout",
320+
"output_type": "stream",
321+
"text": [
322+
"Test Data Accuracy: 0.6298\n"
323+
]
324+
},
325+
{
326+
"data": {
327+
"image/png": "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",
328+
"text/plain": [
329+
"<Figure size 1000x700 with 2 Axes>"
330+
]
331+
},
332+
"metadata": {},
333+
"output_type": "display_data"
334+
}
335+
],
336+
"source": [
337+
"accuracy, precision, recall, f1 = mt.evaluate_model()"
338+
]
339+
},
340+
{
341+
"cell_type": "code",
342+
"execution_count": 11,
343+
"metadata": {},
344+
"outputs": [
345+
{
346+
"name": "stdout",
347+
"output_type": "stream",
348+
"text": [
349+
"SVM Accuracy: 0.654 (+/- 0.034)\n"
350+
]
351+
},
352+
{
353+
"data": {
354+
"text/plain": [
355+
"(0.6542955657681, 0.03387213416308271)"
356+
]
357+
},
358+
"execution_count": 11,
359+
"metadata": {},
360+
"output_type": "execute_result"
361+
}
362+
],
363+
"source": [
364+
"mt.cross_validate_model()"
365+
]
366+
},
367+
{
368+
"cell_type": "code",
369+
"execution_count": 12,
370+
"metadata": {},
371+
"outputs": [
372+
{
373+
"name": "stdout",
374+
"output_type": "stream",
375+
"text": [
376+
"Took 13.44 seconds\n"
377+
]
378+
}
379+
],
380+
"source": [
381+
"best_accuracy, best_parameters, best_score = mt.tune_model()"
382+
]
383+
},
384+
{
385+
"cell_type": "code",
386+
"execution_count": 13,
387+
"metadata": {},
388+
"outputs": [
389+
{
390+
"data": {
391+
"text/plain": [
392+
"(0.6551769760245102, {'C': 0.1, 'penalty': 'l1'}, 0.6551769760245102)"
393+
]
394+
},
395+
"execution_count": 13,
396+
"metadata": {},
397+
"output_type": "execute_result"
398+
}
399+
],
400+
"source": [
401+
"best_accuracy, best_parameters, best_score"
402+
]
403+
},
404+
{
405+
"cell_type": "code",
406+
"execution_count": 15,
407+
"metadata": {},
408+
"outputs": [],
409+
"source": [
410+
"final_results = mt.save_results()"
411+
]
412+
},
413+
{
414+
"cell_type": "code",
415+
"execution_count": 16,
416+
"metadata": {},
417+
"outputs": [
418+
{
419+
"data": {
420+
"text/html": [
421+
"<div>\n",
422+
"<style scoped>\n",
423+
" .dataframe tbody tr th:only-of-type {\n",
424+
" vertical-align: middle;\n",
425+
" }\n",
426+
"\n",
427+
" .dataframe tbody tr th {\n",
428+
" vertical-align: top;\n",
429+
" }\n",
430+
"\n",
431+
" .dataframe thead th {\n",
432+
" text-align: right;\n",
433+
" }\n",
434+
"</style>\n",
435+
"<table border=\"1\" class=\"dataframe\">\n",
436+
" <thead>\n",
437+
" <tr style=\"text-align: right;\">\n",
438+
" <th></th>\n",
439+
" <th>user</th>\n",
440+
" <th>churn</th>\n",
441+
" <th>predicted_churn</th>\n",
442+
" </tr>\n",
443+
" </thead>\n",
444+
" <tbody>\n",
445+
" <tr>\n",
446+
" <th>0</th>\n",
447+
" <td>25745</td>\n",
448+
" <td>0.0</td>\n",
449+
" <td>0</td>\n",
450+
" </tr>\n",
451+
" <tr>\n",
452+
" <th>1</th>\n",
453+
" <td>46433</td>\n",
454+
" <td>1.0</td>\n",
455+
" <td>0</td>\n",
456+
" </tr>\n",
457+
" <tr>\n",
458+
" <th>2</th>\n",
459+
" <td>1376</td>\n",
460+
" <td>0.0</td>\n",
461+
" <td>0</td>\n",
462+
" </tr>\n",
463+
" <tr>\n",
464+
" <th>3</th>\n",
465+
" <td>15062</td>\n",
466+
" <td>1.0</td>\n",
467+
" <td>1</td>\n",
468+
" </tr>\n",
469+
" <tr>\n",
470+
" <th>4</th>\n",
471+
" <td>33076</td>\n",
472+
" <td>1.0</td>\n",
473+
" <td>0</td>\n",
474+
" </tr>\n",
475+
" <tr>\n",
476+
" <th>...</th>\n",
477+
" <td>...</td>\n",
478+
" <td>...</td>\n",
479+
" <td>...</td>\n",
480+
" </tr>\n",
481+
" <tr>\n",
482+
" <th>3788</th>\n",
483+
" <td>3555</td>\n",
484+
" <td>1.0</td>\n",
485+
" <td>1</td>\n",
486+
" </tr>\n",
487+
" <tr>\n",
488+
" <th>3789</th>\n",
489+
" <td>24158</td>\n",
490+
" <td>0.0</td>\n",
491+
" <td>0</td>\n",
492+
" </tr>\n",
493+
" <tr>\n",
494+
" <th>3790</th>\n",
495+
" <td>35673</td>\n",
496+
" <td>0.0</td>\n",
497+
" <td>0</td>\n",
498+
" </tr>\n",
499+
" <tr>\n",
500+
" <th>3791</th>\n",
501+
" <td>35778</td>\n",
502+
" <td>0.0</td>\n",
503+
" <td>0</td>\n",
504+
" </tr>\n",
505+
" <tr>\n",
506+
" <th>3792</th>\n",
507+
" <td>9603</td>\n",
508+
" <td>0.0</td>\n",
509+
" <td>0</td>\n",
510+
" </tr>\n",
511+
" </tbody>\n",
512+
"</table>\n",
513+
"<p>3793 rows × 3 columns</p>\n",
514+
"</div>"
515+
],
516+
"text/plain": [
517+
" user churn predicted_churn\n",
518+
"0 25745 0.0 0\n",
519+
"1 46433 1.0 0\n",
520+
"2 1376 0.0 0\n",
521+
"3 15062 1.0 1\n",
522+
"4 33076 1.0 0\n",
523+
"... ... ... ...\n",
524+
"3788 3555 1.0 1\n",
525+
"3789 24158 0.0 0\n",
526+
"3790 35673 0.0 0\n",
527+
"3791 35778 0.0 0\n",
528+
"3792 9603 0.0 0\n",
529+
"\n",
530+
"[3793 rows x 3 columns]"
531+
]
532+
},
533+
"execution_count": 16,
534+
"metadata": {},
535+
"output_type": "execute_result"
536+
}
537+
],
538+
"source": [
539+
"final_results"
540+
]
541+
}
542+
],
543+
"metadata": {
544+
"kernelspec": {
545+
"display_name": "Python 3",
546+
"language": "python",
547+
"name": "python3"
548+
},
549+
"language_info": {
550+
"codemirror_mode": {
551+
"name": "ipython",
552+
"version": 3
553+
},
554+
"file_extension": ".py",
555+
"mimetype": "text/x-python",
556+
"name": "python",
557+
"nbconvert_exporter": "python",
558+
"pygments_lexer": "ipython3",
559+
"version": "3.12.6"
560+
}
561+
},
562+
"nbformat": 4,
563+
"nbformat_minor": 2
564+
}

0 commit comments

Comments
 (0)
Please sign in to comment.