Customer Churn Prediction using Machine Learning|By DQLab
DQLab Telco merupakan perusahaan Telco yang sudah mempunyai banyak cabang tersebar dimana-mana. Sejak berdiri pada tahun 2019, DQLab Telco konsisten untuk memperhatikan customer experience nya sehingga tidak akan di tinggalkan pelanggan.
Walaupun baru berumur 1 tahun lebih sedikit, DQLab Telco sudah mempunyai banyak pelanggan yang beralih langganan ke kompetitior. Pihak management ingin mengurangi jumlah pelanggan yang beralih (churn) dengan menggunakan machine learning.
Pada projek kali ini, akan dilakukan Pemodelan Machine Learning dengan menggunakan data bulan lalu, yakni Juni 2020.
Langkah yang akan dilakukan adalah,
- Melakukan Exploratory Data Analysis
- Melakukan Data Pre-Processing
- Melakukan Pemodelan Machine Learning
- Menentukan Model Terbaik
Import Library yang dibutuhkan
Data yang Digunakan
Untuk Dataset yang digunakan sudah disediakan dalam format csv, silahkan baca melalui fungsi pandas di python df_load = pd.read_csv('https://storage.googleapis.com/dqlab-dataset/dqlab_telco_final.csv')
Untuk detil datanya adalah sebagai berikut:
UpdatedAt
Periode of Data takencustomerID
Customer IDgender
Whether the customer is a male or a female (Male, Female)SeniorCitizen
Whether the customer is a senior citizen or not (Yes, No)Partner
Whether the customer has a partner or not (Yes, No)tenure
Number of months the customer has stayed with the companyPhoneService
Whether the customer has a phone service or not (Yes, No)InternetService
Customer’s internet service provider (Yes, No)StreamingTV
Whether the customer has streaming TV or not (Yes, No)PaperlessBilling
Whether the customer has paperless billing or not (Yes, No)MonthlyCharges
The amount charged to the customer monthlyTotalCharges
The total amount charged to the customerChurn
Whether the customer churned or not (Yes, No)
File Unloading
Lakukan import dataset ke dalam workspace dengan menggunakan read_csv dan tampilkan juga bentuk atau shape dari dataset tersebut beserta 5 data teratas.
Exploratory Data Analysis
Exploratory Data Analysis memungkinkan analyst memahami isi data yang digunakan, mulai dari distribusi, frekuensi, korelasi dan lainnya. Pada umumnya EDA dilakukan dengan beberapa cara:
- Univariat Analysis — analisis deskriptif dengan satu variabel.
- Bivariat Analysis — analisis relasi dengan dua variabel yang biasanya dengan target variabel.
- Multivariat Analysis — analisis yang menggunakan lebih dari atau sama dengan tiga variabel.
Dalam kasus ini, kamu diminta untuk melihat persebaran dari:
- Presentase persebaran data Churn dan tidaknya dari seluruh data
- Persebaran data dari variable predictor terhadap label (Churn)
Lakukan import matplotlib dan seaborn
Memvisualisasikan Presentase Churn
Kita ingin melihat visualisasi data secara univariat terkait presentase data churn dari pelanggan. Gunakan fungsi value_counts()
untuk menghitung banyaknya unik dari sebuah kolom, pie()
untuk membuat pie chart.
Berdasarkan hasil di atas, dapat kita ketahui bahwa sebaran data secara kesuluruhan customer tidak melakukan churn, dengan detil Churn
sebanyak 26% dan No Churn
sebanyak 74%.
Exploratory Data Analysis (EDA) Variabel Numerik
Hal yang akan kita lakukan selanjutnya adalah memilih variable predictor yang bersifat numerik dan membuat plot secara bivariat, kemudian menginterpretasikannya
Gunakan data `df_load` untuk di olah di tahap ini dan gunakan fungsi `subplots()` untuk membuat gambar dan satu set subplot.
Berdasarkan hasil di atas, dapat kita ketahui bahwa untuk MonthlyCharges
ada kecenderungan semakin kecil nilai biaya bulanan yang dikenakan, semakin kecil juga kecenderungan untuk melakukan Churn
. Untuk TotalCharges
terlihat tidak ada kecenderungan apapun terhadap Churn
customers. Untuk tenure
ada kecenderungan semakin lama berlangganan customer, semakin kecil kecenderungan untuk melakukan Churn
.
Exploratory Data Analysis (EDA) Variabel Kategorik
Setelah itu, kita akan melakukan pemilihan variable predictor yang bersifat kategorik dan membuat plot secara bivariat, kemudian menginterpretasikannya
Gunakan data `df_load` untuk di olah di tahap ini. Gunakan fungsi `countplot()` untuk membuat plot dengan jumlah pengamatan di setiap bin kategorik variable.
Berdasarkan hasil di atas, dapat kita ketahui bahwa tidak ada perbedaan yang signifikan untuk orang melakukan churn
dilihat dari faktor jenis kelamin (gender
) dan layanan telfonnya (PhoneService
). Akan tetapi ada kecenderungan bahwa orang yang melakukan churn
adalah orang-orang yang tidak memiliki partner (partner: No)
, orang-orang yang statusnya adalah senior citizen(SeniorCitizen: Yes)
, orang-orang yang mempunyai layanan streaming TV (StreamingTV: Yes)
, orang-orang yang mempunyai layanan Internet (internetService: Yes)
dan orang-orang yang tagihannya paperless (PaperlessBilling: Yes)
.
Menghapus Unnecessary Columns dari data
Selanjutnya kita akan mengapus kolom yang tidak akan diikutsertakan dalam pemodelan, kemudian simpan dengan nama cleaned_df
. Tampilkan 5 rows teratas nya. Gunakan drop()
untuk menghapus kolom dari suatu data.
Encoding Data
Gunakan data dari hasil dan analisa sebelumnya cleaned_df
, untuk merubah value dari data yang masih berbentuk string untuk diubah ke dalam bentuk numeric menggunakan LabelEncoder()
. Gunakan describe()
untuk melihat deskripsi datanya.
Splitting Dataset
Gunakan data dari hasil dan analisa sebelumnya cleaned_df
, untuk dibagi datasetnya menjadi 2 bagian (70% training & 30% testing) berdasarkan variable predictor (X) dan targetnya (Y). Gunakan train_test_split() untuk membagi data tersebut. Sertakan value_counts
untuk mengecek apakah pembagian sudah sama proporsinya. Simpan hasil spliting data menjadi x_train
, y_train
, x_test
& y_test.
Setelah kita analisis lebih lanjut, ternyata ada kolom yang tidak dibutuhkuan dalam model, yaitu Id Number pelanggannya (customerID
) & periode pengambilan datanya (UpdatedAt
), maka hal ini perlu dihapus. Kemudian kita lanjut mengubah value dari data yang masih berbentuk string menjadi numeric melalui encoding, setelah dilakukan terlihat di persebaran datanya khususnya kolom min dan max dari masing masing variable sudah berubah menjadi 0 & 1. Tahap terakhir adalah membagi data menjadi 2 bagian untuk keperluan modelling, setelah dilakukan terlihat dari jumlah baris dan kolom masing-masing data sudah sesuai & prosentase kolom churn juga sama dengan data di awal, hal ini mengindikasikan bahwasannya data terpisah dengan baik dan benar.
Modelling: Logistic Regression
Pembuatan Model
Selanjutnya kita akan membuat model dengan menggunakan Algoritma Logistic Regression.
Gunakan LogisticRegression()
memanggil algoritma tersebut, fit ke data train dan simpan sebagai log_model
Jika kita menggunakan menggunakan algoritma logistic regression dengan memanggil LogisticRegression()
dari sklearn tanpa menambahi parameter apapun, maka yang dihasilkan adalah model dengan seting default dari sklearn, untuk detilnya bisa dilihat di dokumentasinya.
Performansi Model Training — Menampilkan Metrics
Setelah kita membuat modelnya, maka lakukan perhitungan untuk memperoleh classification reportnya dan confusion matrixnya di data training seperti hasil di bawah ini. Gunakan classification_report()
& confusion_matrix()
.
Performansi Model Training — Menampilkan Plots
Setelah mendapatkan hasil classification report pada tahap sebelumnya, sekarang kita akan melakukan visualisasi terhadap report tersebut.
Dari data training terlihat bahwasannya model mampu memprediksi data dengan menghasilkan akurasi sebesar 80%, dengan detil tebakan churn
yang sebenernya benar churn
adalah 640, tebakan tidak churn
yang sebenernya tidak churn
adalah 3237, tebakan tidak churn
yang sebenernya benar churn
adalah 650 dan tebakan churn
yang sebenernya tidak churn
adalah 338.
Performansi Data Testing — Menampilkan Metrics
Setelah kita membuat modelnya, maka lakukan perhitungan untuk memperoleh classification reportnya dan confusion matrixnya di data testing seperti hasil di bawah ini. Gunakan classification_report()
& confusion_matrix()
.
Performansi Data Testing — Menampilkan Plots
Setelah menampilkan metrics pada tahap sebelumnya, sekarang kita akan melakukan visualisasi dari metrics yang sudah dihasilkan sebelumnya.
Dari data testing terlihat bahwasannya model mampu memprediksi data dengan menghasilkan akurasi sebesar 79%, dengan detil tebakan churn
yang sebenernya benar churn
adalah 264, tebakan tidak churn
yang sebenernya tidak churn
adalah 1393, tebakan tidak churn
yang sebenernya benar churn
adalah 282 dan tebakan churn
yang sebenernya tidak churn
adalah 146.
Modelling : Random Forest Classifier
Pembuatan Model
Selanjutnya kita akan membuat model dengan menggunakan Algoritma Random Forest Classifier.
Gunakan RandomForestClassifier()
memanggil algoritma tersebut, fit ke data train dan simpan sebagai rdf_model
Jika kita menggunakan menggunakan algoritma Random Forest dengan memanggil RandomForestClassifier()
dari sklearn tanpa menambahi parameter apapun, maka yang dihasilkan adalah model dengan seting default dari sklearn, untuk detilnya bisa dilihat di dokumentasinya.
Performansi Data Training — Menampilkan Metrics
Setelah kita membuat modelnya, maka lakukan perhitungan untuk memperoleh classification reportnya dan confusion matrixnya di data training seperti hasil di bawah ini. Gunakan classification_report()
& confusion_matrix()
.
Performansi Data Training — Menampilkan Plots
Setelah menampilkan metrics pada tahap sebelumnya, selanjutnya kita akan melakukan visualisasi terhadap metrics tersebut.
Dari data training terlihat bahwasannya model mampu memprediksi data dengan menghasilkan akurasi sebesar 100%, dengan detil tebakan churn
yang sebenernya benar churn
adalah 1277, tebakan tidak churn
yang sebenernya tidak churn
adalah 3566, tebakan tidak churn
yang sebenernya benar churn
adalah 13 dan tebakan churn
yang sebenernya tidak churn
adalah 9.
Performansi Data Testing — Menampilkan Metrics
Setelah kita membuat modelnya, maka lakukan perhitungan untuk memperoleh classification reportnya dan confusion matrixnya di data testing seperti hasil di bawah ini. Gunakan classification_report()
& confusion_matrix()
.
Performansi Data Testing — Menampilkan Plots
Tampilkan visualisasi dari hasil metrics yang sudah diperoleh pada tahap sebelumnya
Dari data testing terlihat bahwasannya model mampu memprediksi data dengan menghasilkan akurasi sebesar 78%, dengan detil tebakan churn
yang sebenernya benar churn
adalah 263, tebakan tidak churn
yang sebenernya tidak churn
adalah 1361, tebakan tidak churn
yang sebenernya benar churn
adalah 283 dan tebakan churn
yang sebenernya tidak churn
adalah 178.
Modelling: Gradient Boosting Classifier
Pembuatan Model
Selanjutnya kita akan membuat model dengan menggunakan Algoritma Gradient Boosting Classifier.
Gunakan GradientBoostingClassifier()
memanggil algoritma tersebut, fit ke data train dan simpan sebagai gbt_model.
Jika kita menggunakan menggunakan algoritma Gradient Boosting dengan memanggil GradientBoostingClassifier()
dari package sklearn tanpa menambahi parameter apapun, maka yang dihasilkan adalah model dengan seting default dari sklearn, untuk detilnya bisa dilihat di dokumentasinya.
Perfomansi Model Data Training — Menampilkan Metrics
Setelah kita membuat modelnya, maka lakukan perhitungan untuk memperoleh classification reportnya dan confusion matrixnya di data training seperti hasil di bawah ini. Gunakan classification_report()
& confusion_matrix()
.
Perfomansi Model Data Training — Menampilkan Plots
Tampilkan visualisasi dari metrics yang sudah dihasilkan sebelumnya.
Dari data training terlihat bahwasannya model mampu memprediksi data dengan menghasilkan akurasi sebesar 82%, dengan detil tebakan churn
yang sebenernya benar churn
adalah 684, tebakan tidak churn
yang sebenernya tidak churn
adalah 3286, tebakan tidak churn
yang sebenernya benar churn
adalah 606 dan tebakan churn
yang sebenernya tidak churn
adalah 289.
Performansi Model Data Testing — Menampilkan Metrics
Setelah kita membuat modelnya, maka lakukan perhitungan untuk memperoleh classification reportnya dan confusion matrixnya di data testing seperti hasil di bawah ini. Gunakan classification_report()
& confusion_matrix()
.
Performansi Data Testing — Menampilkan Plots
Tampilkan visualisasi dari hasil metrics yang sudah diperoleh pada tahap sebelumnya.
Dari data testing terlihat bahwasannya model mampu memprediksi data dengan menghasilkan akurasi sebesar 79%, dengan detil tebakan churn
yang sebenernya benar churn
adalah 261, tebakan tidak churn
yang sebenernya tidak churn
adalah 1394, tebakan tidak churn
yang sebenernya benar churn
adalah 285 dan tebakan churn
yang sebenernya tidak churn
adalah 145.
Menentukan Algoritma Model Terbaik
Model yang baik adalah model yang mampu memberikan performa bagus di fase training dan testing model.
Over-Fitting
adalah suatu kondisi dimana model mampu memprediksi dengan sangat baik di fase training, akan tetapi tidak mampu memprediksi sama baiknya di fase testing.Under-Fitting
adalah suatu kondisi dimana model kurang mampu memprediksi dengan baik di fase training, akan tetapi mampu memprediksi dengan baik di fase testing.Appropriate-Fitting
adalah suatu kondisi dimana model mampu memprediksi dengan baik di fase training maupun di fase testing.
Untuk detil jelasnya, bisa dilihat di ilustrasi di bawah ini:
Selanjutnya kita akan menentukan model algoritma terbaik dari model yang sudah di lakukan di atas (Appropriate-Fitting), kemudian kita simpan sebagai file best_model_churn.pkl dengan tujuan untuk deployment model nantinya kita tidak perlu mengulang lagi pemodelan, cukup memanggil file tersebut saja. Simpan di file direktori sesuai dataset berada, kemudian check apakah file tersebut benar tersimpan atau tidak. Gunakan dump() dari pickle untuk menyimpan file. Anda bisa gunakan code dibawah ini untuk menyimpan file model untuk di coba di local laptop anda pribadi.
#Save Model
pickle.dump(log_model, open('best_model_churn.pkl', 'wb'))
Berdasarkan pemodelan yang telah dilakukan dengan menggunakan Logistic Regression, Random Forest dan Extreme Gradiant Boost, maka dapat disimpulkan untuk memprediksi churn dari pelanggan telco dengan menggunakan dataset ini model terbaiknya adalah menggunakan algortima Logistic Regression. Hal ini dikarenakan performa dari model Logistic Regression cenderung mampu memprediksi sama baiknya di fase training maupun testing (akurasi training 80%, akurasi testing 79%), dilain sisi algoritma lainnya cenderung Over-Fitting performanya. Akan tetapi hal ini tidak menjadikan kita untuk menarik kesimpulan bahwsannya jika untuk melakukan pemodelan apapun maka digunakan Logistic Regression, kita tetap harus melakukan banyak percobaan model untuk menentukan mana yang terbaik.