Anda hanya diwajibkan untuk mengumpulkan file ini saja ke uploader yang disediakan di http://elearning2.uai.ac.id/. Ganti nama file ini saat pengumpulan menjadi tugas2_NIM.ipynb.
Keterlambatan: Pengumpulan tugas yang melebihi tenggat yang telah ditentukan tidak akan diterima. Keterlambatan akan berakibat pada nilai nol untuk tugas ini.
Kolaborasi: Anda diperbolehkan untuk berdiskusi dengan teman Anda, tetapi dilarang keras menyalin kode maupun tulisan dari teman Anda.
Terdapat enam packages yang Anda akan gunakan dalam mengerjakan tugas ini, yaitu:
Anda diperbolehkan (jika dirasa perlu) untuk mengimpor modul tambahan untuk tugas ini, kecuali dijelaskan sebaliknya. Namun, seharusnya modul yang tersedia sudah cukup untuk memenuhi kebutuhan Anda.
Pastikan jawaban Anda singkat, padat, dan jelas. Mayoritas pertanyaan yang diberikan dapat dijawab dalam 3-4 kalimat saja.
NIM:
Nilai akhir: XX/100
from scipy.stats import norm, multivariate_normal
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import accuracy_score, classification_report, f1_score
from sklearn.naive_bayes import BernoulliNB, GaussianNB
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
import warnings
%matplotlib inline
plt.style.use('ggplot')
warnings.filterwarnings('ignore')
RANDOM_STATE = 1337
# Membaca file
df = pd.read_csv('../dataset/telco_churn.csv')
Salah satu masalah yang sering dihadapi suatu brand adalah pindahnya pelanggan ke brand yang lain. Hal ini sering disebut juga sebagai churn. Perusahaan telekomunikasi merupakan salah satu contoh perusahaan yang bisa mendapatkan data seperti ini karena selalu memantau perilaku penggunanya. Pertanyaannya, apa yang menjadi faktor penentu churn seorang pelanggan? Dapatkah kita memprediksi pelanggan yang akan mengalami churn?
Anda diminta untuk mengimplementasikan dan menjelaskan beberapa konsep yang digunakan dalam algoritma Naive Bayes.
Seperti apa proporsi kelas dalam dataset tersebut (dalam persentase)?
Gambarkan histogram dari tenure
. Jangan lupa untuk menuliskan label di sumbu x dan y. Apakah menurut Anda distribusi dari atribut ini normal? Jika ya, gambarkan pula distribusi normalnya. Jika tidak, mengapa?
Tidak, karena terlihat bahwa atribut ini memiliki dua modus (bimodal) yang bukan merupakan karakteristik distribusi normal/Gaussian.
Dengan menggunakan sns.distplot()
, gambarkan histogram untuk tenure
yang dibagi berdasarkan kategori Contract
. Jangan lupa untuk menaruh legenda pada grafik yang dihasilkan.
Untuk setiap data dengan nilai tenure == 0
, ubah nilai TotalCharges
menjadi 0, lalu ubah tipe kolom tersebut menjadi float.
Gambarkan histogram dari TotalCharges
.
Gambarkan kembali histogram dari TotalCharges
, tetapi kali ini dengan mengubah nilainya menggunakan fungsi logaritma terlebih dahulu. Apakah distribusinya menjadi normal?
Gambarkan scatter plot dengan tenure
sebagai sumbu x dan MonthlyCharges
sebagai sumbu y.
Berapa nilai korelasi dari kedua atribut tersebut?
Lakukan eksplorasi tambahan untuk atribut yang bersifat nominal (kategori). Temukan pola yang mungkin dapat membantu Anda memprediksi churn.
Bagi dataset menjadi data latih dan data uji dengan proporsi data uji 30% dari jumlah data. Gunakan train_test_split()
, lalu laporkan jumlah data di kedua subset yang dihasilkan.
Buatlah fungsi untuk mengubah nilai-nilai berikut dan mengembalikan DataFrame baru yang menyimpan nilai yang telah diubah:
Gender
, Partner
, Dependents
, PhoneService
, PaperlessBilling
$\in \{0,1\}$SeniorCitizen
, tenure
, MonthlyCharges
InternetService
dengan one-hot-encoderContract
dengan one-hot-encoderPayment Method
dengan one-hot-encoderSebagai alternatif dari modul OneHotEncoder
dari scikit-learn, Anda dapat membuat variabel dummy dengan Pandas.
def preprocessing(data):
pass
Dengan fungsi tersebut, ubah nilai X_train
dan X_test
. Ubah juga nilai 'Yes' menjadi 1 dan 'No' menjadi 0 pada y_train
dan y_test
.
Gunakan fungsi cross_val_score()
untuk mendapatkan akurasi dengan modul BernoulliNB
melalui 10-fold cross-validation (cv=10
).
Petunjuk: http://scikit-learn.org/stable/modules/cross_validation.html#computing-cross-validated-metrics
Hitung juga nilai $F_1$ dari 10-fold cross-validation tersebut dengan algoritma yang sama.
Lakukan kembali hal yang sama untuk menghitung nilai $F_1$, tapi kali ini ganti algoritmanya dengan GaussianNB
.
Apa yang menjadi asumsi "naif" dari algoritma Naive Bayes? Apa hubungannya dengan data yang Anda gunakan di atas?
Jawaban Anda di sini
Misalnya kita hanya menggunakan atribut tenure
dan MonthlyCharges
, cantumkan covariance matrix yang akan digunakan pada algoritma Naive Bayes dan Bayesian classifier biasa. Tunjukkan perbedaannya.
Dengan menggunakan modul numpy, buatlah fungsi untuk menghitung nilai (shannon) entropy!
def entropy(array):
"""Menghitung nilai entropy dari array of labels
e.g. [1, 0, 1, 0, 0, 0, 1] => float
"""
pass
Dengan menggunakan semua fitur pada X_train
, lakukan 10-fold cross-validation dengan DecisionTreeClassifier
menggunakan hyperparameters bawaan. Laporkan nilai $F_1$-score-nya!
Apakah nilai akurasi atau $F_1$-score dari classifier yang dibentuk akan mencapai 100% jika diterapkan pada data latih kembali? Coba lakukan prediksinya. Mengapa hasilnya seperti itu?
Tulis jawaban Anda di sini
Ubah parameter (catatan: istilah "parameter" kadang digunakan untuk merujuk "hyperparameter") max_depth
dari DecisionTreeClassifier
menjadi 4 hingga 15 (i.e. 4, 5, ..., 14, 15). Untuk setiap nilai dari parameter tersebut, tunjukkan nilai rata-rata $F_1$-score dari hasil 3-fold cross-validation dalam bentuk line plot!
Catatan: Jangan lupa untuk mengatur nilai parameter random_state
, memberikan label pada tiap sumbu, dan menyertakan legendanya!
Apa yang Anda lihat dalam grafik yang dihasilkan dalam soal 3.3.a? Mengapa kurvanya berbentuk seperti itu? Lalu, berapa nilai max_depth
yang sebaiknya kita gunakan?
Tulis jawaban Anda di sini
Cetak atribut feature_importances_
dari model terbaik yang dihasilkan! Nilai apa yang ditunjukkan oleh atribut ini?
Tulis jawaban Anda di sini
Klasifikasikan X_train
dengan menggunakan RandomForestClassifier
! Dapatkah Anda menghasilkan model dengan kinerja yang lebih baik?
Catatan: Anda sangat mungkin memerlukan hyperparameter tuning!
Cetak nilai feature_importances_
dari model terbaik dengan RandomForestClassifier
. Apakah nilai ini berbeda cara menghitungnya dengan soal 3.4?
Jawaban Anda di sini
Apa yang dimaksud dengan teknik bagging? Apa hubungannya dengan RandomForestClassifier
yang digunakan dalam eksperimen ini?
Tulis jawaban Anda di sini
Berikan kesimpulan dari apa yang sudah Anda lakukan dalam tugas bagian 3 ini! Anda diperkenankan melakukan eksplorasi tambahan jika dirasa perlu.
Tulis jawaban Anda di sini
Pada bagian ini, Anda diminta untuk mengevaluasi model terbaik dari masing-masing algoritm yang telah Anda gunakan. Perbandingan pada bagian ini juga melibatkan ongkos yang kira-kira Anda perlukan untuk masing-masing jenis kesalahan.
Latih ulang setiap model dengan hyperparameters terbaik yang Anda dapatkan dari bagian 2 dan 3 tugas ini dengan X_train
. Hitung nilai $F_1$-score dari keempat algoritma yang ada dari hasil prediksi pada data uji (test
)! Gambarkan dalam bentuk bar plot. Sertakan juga plot untuk DummyClassifier dengan menggunakan probabilitas prior-nya!
Berdasarkan semua nilai $F_1$ tersebut, model mana yang kira-kira Anda akan pilih? Apa yang menjadi pertimbangan Anda saat menentukan ongkos dari masing-masing kesalahan?
Tulis jawaban Anda di sini
Jika ternyata hasil untuk keempat algoritma sama, model apa yang akan Anda gunakan?
Tulis jawaban Anda di sini