Analisis dan Prediksi Potensi Buyer Churn
DQLab Telco merupakan perusahaan Telco yang sudah mempunyai banyak cabang. DQLab Telco sudah mempunyai banyak pelanggan yang beralih langganan ke kompetitor. Pihak administration ingin mengurangi jumlah pelanggan yang beralih (churn) dengan menggunakan machine studying.
Tim Knowledge Scientist diminta untuk mempersiapkan information sekaligus membuat mannequin prediksi yang tepat untuk menentukan pelanggan akan berhenti berlangganan (churn) atau tidak.
Kita akan melakukan Knowledge Preprocessing (Knowledge Cleaning) bulan lalu, langkah yang akan dilakukan adalah:
- Mencari ID pelanggan (Nomor telepon) yang legitimate
- Mengatasi data-data yang masih kosong (Lacking Values)
- Mengatasi Nilai-Nilai Pencilan (Outlier) dari setiap Variable
- Menstandardisasi Nilai dari Variable
Beberapa package deal yang membantu kita dalam melakukan analisis information.
- Pandas
Pandas (Python for Knowledge Evaluation) adalah library Python yang fokus untuk proses analisis information seperti manipulasi information, persiapan information, dan pembersihan information.
read_csv()
digunakan untuk membaca file csvstr.match()
digunakan untuk mencocokan dengan karakter tertentudrop()
digunakan untuk menghapusrely()
digunakan untuk menghitung masing-masing variabledrop_duplicates()
digunakan untuk menghapus information duplicate rowsfillna()
digunakan untuk mengisi dengan nilai tertentuquantile()
digunakan untuk melihat quantile ke tertentumasks()
mengganti nilai tertentu jika kondisi memenuhiastype()
mengubah tipe informationvalue_counts()
digunakan untuk menghitung unik dari kolomsort_values()
digunakan untuk type valuesisnull()
digunakan untuk mendeteksi lacking valuesdropna()
digunakan untuk menghapus lacking valueschange()
digunakan untuk mengganti nilai
2. Matplotlib
Matplotlib adalah library Python yang fokus pada visualisasi information seperti membuat plot grafik. Matplotlib dapat digunakan dalam skrip Python, Python dan IPython shell, server aplikasi internet, dan beberapa toolkit graphical consumer interface (GUI) lainnya.
determine()
digunakan untuk membuat determine gambar baru
3. Seaborn
Seaborn membangun di atas Matplotlib dan memperkenalkan tipe plot tambahan. Ini juga membuat plot Matplotlib tradisional Anda terlihat sedikit lebih cantik.
box_plot()
digunakan untuk membuat field plot
Untuk dataset yang digunakan yaitu
df_load = pd.read_csv('https://storage.googleapis.com/dqlab-dataset/dqlab_telco.csv')
Untuk element datanya adalah sebagai berikut:
UpdatedAt
Periode of Knowledge takencustomerID
Buyer IDgender
Whether or not the shopper is a male or a feminine (Male, Feminine)SeniorCitizen
Whether or not the shopper is a senior citizen or not (1, 0)Associate
Whether or not the shopper has a associate or not (Sure, No)Dependents
Whether or not the shopper has dependents or not (Sure, No)tenure
Variety of months the shopper has stayed with the corporatePhoneService
Whether or not the shopper has a cellphone service or not (Sure, No)MultipleLines
Whether or not the shopper has a number of traces or not (Sure, No, No cellphone service)InternetService
Buyer’s web service supplier (DSL, Fiber optic, No)OnlineSecurity
Whether or not the shopper has on-line safety or not (Sure, No, No web service)OnlineBackup
Whether or not the shopper has on-line backup or not (Sure, No, No web service)DeviceProtection
Whether or not the shopper has system safety or not (Sure, No, No web service)TechSupport
Whether or not the shopper has tech assist or not (Sure, No, No web service)StreamingTV
Whether or not the shopper has streaming TV or not (Sure, No, No web service)StreamingMovies
Whether or not the shopper has streaming films or not (Sure, No, No web service)Contract
The contract time period of the shopper (Month-to-month, One yr, Two yr)PaperlessBilling
Whether or not the shopper has paperless billing or not (Sure, No)PaymentMethod
The shopper’s fee methodology (Digital verify, Mailed verify, Financial institution switch (automated), Bank card (automated))MonthlyCharges
The quantity charged to the shopper month-to-monthTotalCharges
The whole quantity charged to the shopperChurn
Whether or not the shopper churned or not (Sure or No)
Hal pertama yang akan kita lakukan adalah melakukan import library dan dataset ke dalam workspace kita.
Setelah dataset di-import ke dalam workspace, tampilkan jumlah kolom dan baris dari information set dengan menggunakan .form dan print 5 baris teratas dengan menggunakan head() dan carilah ada berapa jumlah customerID yang bersifat distinctive dengan menggunakan .nunique
#import library
import pandas as pd
pd.choices.show.max_columns = 50#import dataset
df_load = pd.read_csv('https://storage.googleapis.com/dqlab-dataset/dqlab_telco.csv')
#Tampilkan jumlah baris dan kolom
print(df_load.form)
#Tampilkan 5 information teratas
print(df_load.head(5))
#Jumlah ID yang unik
print(df_load.customerID.nunique())
Notes:
1. pd.choices.show.max_columns = 50 digunakan untuk mempermudah penampilan row information
2. Simpan dataset ke dalam variabel df_load
Mencari format ID Quantity (Telephone Quantity) Pelanggan customerID
yang benar, dengan kriteria:
- Panjang karakter adalah 11–12.
- Terdiri dari angka Saja, tidak diperbolehkan ada karakter selain angka
- Diawali dengan angka 45 2 digit pertama.
Gunakan fungsi rely()
untuk menghitung banyaknya rows Buyer ID, anda juga bisa menggunakan str.match()
& regex untuk mencocokan dengan kriteria diatas. Jangan lupa gunakan astype()
untuk merubah tipe datanya yang semula numeric
Notes : Buat kolom bantuan baru dengan nama `valid_id`
df_load['valid_id'] = df_load['customerID'].astype(str).str.match(r'(45d{9,10})')
df_load = (df_load[df_load['valid_id'] == True]).drop('valid_id', axis = 1)
print('Hasil jumlah ID Buyer yang terfilter adalah', df_load['customerID'].rely())
Output:
Hasil jumlah ID Buyer yang terfilter adalah 7006
Memastikan bahwa tidak ada Id Quantity pelanggan yang duplikat. Biasanya duplikasi ID quantity ini tipenya:
- Duplikasi dikarenakan inserting melebihi satu kali dengan nilai yang sama tiap kolomnya
- Duplikasi dikarenakan inserting beda periode pengambilan information
Gunakan hasil dari pengolahan di tahap sebelumnya df_load
untuk diolah di tahap ini. Gunakan fungsi drop_duplicates()
untuk menghapus duplikasi rows, dan gunakan sort_values()
untuk mengecek pengambilan information terakhir.
# Drop Duplicate Rows
df_load.drop_duplicates()
# Drop duplicate ID sorted by Periode
df_load = df_load.sort_values('UpdatedAt', ascending=False).drop_duplicates('customerID')
print('Hasil jumlah ID Buyer yang sudah dihilangkan duplikasinya (distinct) adalah',df_load['customerID'].rely())
Output:
Hasil jumlah ID Buyer yang sudah dihilangkan duplikasinya (distinct) adalah 6993
Validitas dari ID Quantity pelanggan sangat diperlukan untuk memastikan bahwa information yang kita ambil sudah benar. Berdasarkan hasil tersebut, terdapat perbedaan jumlah nomor ID dari information pertama kali di load sampai dengan hasil akhir. Jumlah row information ketika pertama kali di load ada sebanyak 7113 rows dan 22 columns dengan 7017 jumlah ID yang distinctive. Kemudian setelah di cek validitas dari ID pelanggan, maka tersisa 6993 rows information
Selanjutnya kita akan menghapus rows dari data-data yang tidak terdeteksi apakah dia churn atau tidak. Diasumsikan information modeller hanya mau menerima information yang benar ada flag churn-nya atau tidak.
Gunakan isnull()
digunakan untuk mendeteksi lacking values dan dropna()
untuk menghapus information yang lacking values.
print('Complete lacking values information dari kolom Churn',df_load['Churn'].isnull().sum())
# Dropping all Rows with spesific column (churn)
df_load.dropna(subset=['Churn'],inplace=True)
print('Complete Rows dan kolom Knowledge setelah dihapus information Lacking Values adalah',df_load.form)
Output:
Complete lacking values information dari kolom Churn 43
Complete Rows dan kolom Knowledge setelah dihapus information Lacking Values adalah (6950, 22)
Selain dengan menghapus rows dari information, menangani lacking values bisa menggunakan nilai tertentu. Diasumsikan information modeller meminta pengisian lacking values dengan kriteria berikut:
Tenure
pihak information modeller meminta setiap rows yang memiliki lacking values untuk lama berlangganan di isi dengan 11.- Variable yang bersifat numeric selain
Tenure
di isi dengan median dari masing-masing variable tersebut.
Tentukan:
- Apakah masih ada information yang lacking values
- Jumlah lacking values dari masing-masing variable
- Tangani lacking values-nya
df_load = df_load.sort_values('UpdatedAt', ascending=False).drop_duplicates('customerID')
df_load.dropna(subset=['Churn'],inplace=True)print('Standing Lacking Values :',df_load.isnull().values.any())
print('nJumlah Lacking Values masing-masing kolom, adalah:')
print(df_load.isnull().sum().sort_values(ascending=False))
# dealing with lacking values Tenure fill with 11
df_load['tenure'].fillna(11, inplace=True)
# Dealing with lacking values num vars (besides Tenure)
for col_name in record(['MonthlyCharges','TotalCharges']):
median = df_load[col_name].median()
df_load[col_name].fillna(median, inplace=True)
print('nJumlah Lacking Values setelah di imputer datanya, adalah:')
print(df_load.isnull().sum().sort_values(ascending=False))
Setelah kita analisis lebih lanjut, ternyata masih ada lacking values dari information yang kita sudah validkan Id Quantity pelanggannya. Lacking values terdapat pada kolom Churn
, tenure
, MonthlyCharges
& TotalCharges
. Setelah kita tangani dengan cara penghapusan rows dan pengisian rows dengan nilai tertentu, terbukti sudah tidak ada lacking values lagi pada information, terbukti dari jumlah lacking values masing-masing variable yang bernilai 0. Selanjutnya kita akan melakukan penanganan pencilan (outlier)
Mendeteksi pencilan dari suatu nilai (outlier) salah satunya bisa melihat plot dari information tersebut menggunakan boxplot. Boxplot merupakan ringkasan distribusi sampel yang disajikan secara grafis yang bisa menggambarkan bentuk distribusi information (skewness), ukuran tendensi sentral dan ukuran penyebaran (keragaman). Berikut adalah tampilan umum dari boxplot dalam merepresentasikan outliers.
Penggunaan fungsi describe() pada kolom tenure, MonthlyCharges, dan TotalCharges ditunjukkan sebagai berikut.
Melalui fungsi describe() ini kita hanya memperoleh statistik deskriptif ketiga kolom ini. Agar outlier pada ketiga kolom ini dapat dideteksi maka kamu diminta untuk memvisualisasikannya menggunakan boxplot-nya. Setiap satu boxplot ada di satu canvas determine.
import pandas as pd
df_load = pd.read_csv('https://storage.googleapis.com/dqlab-dataset/dqlab_telco.csv')df_load['valid_id'] = df_load['customerID'].astype(str).str.match(r'(45d{9,10})')
df_load = (df_load[df_load['valid_id'] == True]).drop('valid_id', axis = 1)
df_load.drop_duplicates()
df_load = df_load.sort_values('UpdatedAt', ascending=False).drop_duplicates('customerID')
df_load.dropna(subset=['Churn'],inplace=True)
df_load['tenure'].fillna(11, inplace=True)
for col_name in record(['MonthlyCharges','TotalCharges']):
median = df_load[col_name].median()
df_load[col_name].fillna(median, inplace=True)
print('nPersebaran information sebelum ditangani Outlier: ')
print(df_load[['tenure','MonthlyCharges','TotalCharges']].describe())
# Creating Field Plot
import matplotlib.pyplot as plt
import seaborn as sns
# Masukkan variable
plt.determine() # untuk membuat determine baru
sns.boxplot(x=df_load['tenure'])
plt.present()
plt.determine() # untuk membuat determine baru
sns.boxplot(x=df_load['MonthlyCharges'])
plt.present()
plt.determine() # untuk membuat determine baru
sns.boxplot(x=df_load['TotalCharges'])
plt.present()
Setelah kita mengetahui variable mana saja yang terdapat pencilan (outlier), selanjutnya kita akan atasi outlier dengan menggunakan metode interquartile vary (IQR). Untuk element jelasnya, bisa dilihat di ilustrasi di bawah ini:
Gunakan hasil dari pengolahan di tahap sebelumnya df_load
untuk di olah di tahap ini. Gunakan fungsi quantile()
untuk melihat quantile tertentu, dan gunakan masks()
untuk me-replace nilai. Tentukan:
- Nilai minimal dan most information di tolerir
- Ubah nilai yang di luar vary minimal & most ke dalam nilai minimal dan most
# Dealing with with IQR
Q1 = (df_load[['tenure','MonthlyCharges','TotalCharges']]).quantile(0.25)
Q3 = (df_load[['tenure','MonthlyCharges','TotalCharges']]).quantile(0.75)IQR = Q3 - Q1
most = Q3 + (1.5*IQR)
print('Nilai Most dari masing-masing Variable adalah: ')
print(most)
minimal = Q1 - (1.5*IQR)
print('nNilai Minimal dari masing-masing Variable adalah: ')
print(minimal)
more_than = (df_load > most)
lower_than = (df_load < minimal)
df_load = df_load.masks(more_than, most, axis=1)
df_load = df_load.masks(lower_than, minimal, axis=1)
print('nPersebaran information setelah ditangani Outlier: ')
print(df_load[['tenure','MonthlyCharges','TotalCharges']].describe())
Dari ketiga boxplot dengan variable ‘tenure’,’MonthlyCharges’ & ‘TotalCharges’ terlihat jelas bahwasannya ada outlier. Hal ini bisa di identifikasi dari adanya titik-titik yang berada jauh dari gambar boxplot-nya. Kemudian kalau kita liat persebaran datanya dari kolom max nya juga ada nilai yang sangat tinggi sekali.
Kemudian nilai outlier tersebut ditangani dengan cara merubah nilainya ke nilai most & minimal dari interquartile vary (IQR). Setelah di tangani outlier-nya, dan dilihat perseberan datanya, terlihat sudah tidak ada lagi nilai yang outlier.
Mendeteksi apakah ada nilai-nilai dari variable kategorik yang tidak commonplace. Hal ini biasanya terjadi dikarenakan kesalahan enter information. Perbedaan istilah menjadi salah satu faktor yang sering terjadi, untuk itu dibutuhkan standardisasi dari information yang sudah ter-input.
Gunakan fungsi value_counts()
untuk melihat jumlah information distinctive per variable-nya.
#Loop
# Masukkan variable
for col_name in record(['gender','SeniorCitizen','Partner','Dependents','PhoneService','MultipleLines','InternetService','OnlineSecurity','OnlineBackup','DeviceProtection','TechSupport','StreamingTV','StreamingMovies','Contract','PaperlessBilling','PaymentMethod','Churn']):
print('nUnique Values Depend 33[1m' + 'Before Standardized 33[0m Variable',col_name)
print(df_load[col_name].value_counts())
Setelah kita mengeteahui variable mana saja yang ada nilai tidak commonplace, maka kita standardkan dengan pola terbanyak nya, dengan syarat tanpa mengubah maknanya. Contoh : Iya -> Sure Kemudian liat kembali distinctive values dari masing-masing variable yang sudah di ubah. Gunakan fungsi change()
untuk menstandardkan nilai.
df_load = df_load.change(['Wanita','Laki-Laki','Churn','Iya'],['Female','Male','Yes','Yes'])# Masukkan variable
for col_name in record(['gender','Dependents','Churn']):
print('nUnique Values Depend 33[1m' + 'After Standardized 33[0mVariable',col_name)
print(df_load[col_name].value_counts())
Ketika kita amati lebih jauh dari jumlah distinctive worth dari masing-masing variable kategorik, terlihat jelas bahwa ada beberapa variable yang tidak standar. Variable itu adalah:
Gender
(Feminine, Male, Wanita, Laki-Laki), yang bisa di standardkan nilainya menjadi (Feminine, Male) karena mempunyai makna yang sama.Dependents
(Sure, No, Iya), yang bisa di standardkan nilainya menjadi (Sure, No) karena mempunyai makna yang sama.Churn
(Sure, No, Churn), yang bisa di standardkan nilainya menjadi (Sure, No) karena mempunyai makna yang sama.
Setelah kita standardkan nilainya, dan kita amati kembali bentuk datanya, sudah terstandar dengan baik untuk distinctive value-nya.