{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Data Mining\n", "\n", "## Tugas 2: Klasifikasi dengan Naive Bayes dan Decision Trees\n", "\n", "### Mekanisme\n", "\n", "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**.\n", "\n", "**Keterlambatan**: Pengumpulan tugas yang melebihi tenggat yang telah ditentukan tidak akan diterima. Keterlambatan akan berakibat pada nilai nol untuk tugas ini.\n", "\n", "**Kolaborasi**: Anda diperbolehkan untuk berdiskusi dengan teman Anda, tetapi *dilarang keras* menyalin kode maupun tulisan dari teman Anda.\n", "\n", "### Petunjuk\n", "\n", "Terdapat enam *packages* yang Anda akan gunakan dalam mengerjakan tugas ini, yaitu:\n", "\n", "- matplotlib\n", "- numpy\n", "- pandas\n", "- scipy\n", "- seaborn\n", "- scikit-learn\n", "\n", "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.\n", "\n", "Pastikan jawaban Anda singkat, padat, dan jelas. Mayoritas pertanyaan yang diberikan dapat dijawab dalam 3-4 kalimat saja." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**NIM: **\n", "\n", "**Nilai akhir: XX/100**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Import" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from scipy.stats import norm, multivariate_normal\n", "from sklearn.model_selection import train_test_split, cross_val_score\n", "from sklearn.metrics import accuracy_score, classification_report, f1_score\n", "from sklearn.naive_bayes import BernoulliNB, GaussianNB\n", "from sklearn.tree import DecisionTreeClassifier\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import pandas as pd\n", "import seaborn as sns\n", "import warnings\n", "%matplotlib inline\n", "\n", "plt.style.use('ggplot')\n", "warnings.filterwarnings('ignore')\n", "\n", "RANDOM_STATE = 1337" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Membaca file\n", "df = pd.read_csv('../dataset/telco_churn.csv')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Deskripsi Dataset\n", "\n", "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*?\n", "\n", "Sumber: https://www.ibm.com/communities/analytics/watson-analytics-blog/predictive-insights-in-the-telco-customer-churn-data-set/" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. Eksplorasi Awal Data (20 poin)\n", "\n", "Anda diminta untuk mengimplementasikan dan menjelaskan beberapa konsep yang digunakan dalam algoritma Naive Bayes." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Soal 1.1 (1 poin)\n", "\n", "Seperti apa proporsi kelas dalam dataset tersebut (dalam persentase)?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Soal 1.2.a (3 poin)\n", "\n", "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?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tidak, karena terlihat bahwa atribut ini memiliki dua modus (bimodal) yang bukan merupakan karakteristik distribusi normal/Gaussian." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Soal 1.2.b (3 poin)\n", "\n", "Dengan menggunakan `sns.distplot()`, gambarkan histogram untuk `tenure` yang dibagi berdasarkan kategori `Contract`. Jangan lupa untuk menaruh legenda pada grafik yang dihasilkan." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Soal 1.3.a (2 poin)\n", "\n", "Untuk setiap data dengan nilai `tenure == 0`, ubah nilai `TotalCharges` menjadi 0, lalu ubah tipe kolom tersebut menjadi float." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Soal 1.3.b (2 poin)\n", "\n", "Gambarkan histogram dari `TotalCharges`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Soal 1.3.c (2 poin)\n", "\n", "Gambarkan kembali histogram dari `TotalCharges`, tetapi kali ini dengan mengubah nilainya menggunakan fungsi logaritma terlebih dahulu. Apakah distribusinya menjadi normal?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Soal 1.4.a (2 poin)\n", "\n", "Gambarkan *scatter plot* dengan `tenure` sebagai sumbu x dan `MonthlyCharges` sebagai sumbu y." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Soal 1.4.b (1 poin)\n", "\n", "Berapa nilai korelasi dari kedua atribut tersebut?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Soal 1.5 (4 poin)\n", "\n", "Lakukan eksplorasi tambahan untuk atribut yang bersifat nominal (kategori). Temukan pola yang mungkin dapat membantu Anda memprediksi *churn*." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Naive Bayes (20 poin)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Soal 2.1 (2 poin)\n", "\n", "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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Soal 2.2.a (6 poin)\n", "\n", "Buatlah fungsi untuk mengubah nilai-nilai berikut dan mengembalikan DataFrame baru yang menyimpan nilai yang telah diubah:\n", "\n", "1. `Gender`, `Partner`, `Dependents`, `PhoneService`, `PaperlessBilling` $\\in \\{0,1\\}$\n", "2. `SeniorCitizen`, `tenure`, `MonthlyCharges`\n", "3. `InternetService` dengan one-hot-encoder\n", "4. `Contract` dengan one-hot-encoder\n", "5. `Payment Method` dengan one-hot-encoder\n", "\n", "Sebagai alternatif dari modul `OneHotEncoder` dari scikit-learn, Anda dapat membuat variabel *dummy* dengan Pandas." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def preprocessing(data):\n", " pass" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Soal 2.2.b (2 poin)\n", "\n", "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`." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Soal 2.3.a (2 poin)\n", "\n", "Gunakan fungsi `cross_val_score()` untuk mendapatkan akurasi dengan modul `BernoulliNB` melalui 10-fold cross-validation (`cv=10`).\n", "\n", "*Petunjuk: http://scikit-learn.org/stable/modules/cross_validation.html#computing-cross-validated-metrics*" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Soal 2.3.b (2 poin)\n", "\n", "Hitung juga nilai $F_1$ dari 10-fold cross-validation tersebut dengan algoritma yang sama." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Soal 2.3.c (2 poin)\n", "\n", "Lakukan kembali hal yang sama untuk menghitung nilai $F_1$, tapi kali ini ganti algoritmanya dengan `GaussianNB`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Soal 2.4.a (2 poin)\n", "\n", "Apa yang menjadi asumsi \"naif\" dari algoritma Naive Bayes? Apa hubungannya dengan data yang Anda gunakan di atas?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Jawaban Anda di sini*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Soal 2.4.b (2 poin)\n", "\n", "Misalnya kita hanya menggunakan atribut `tenure` dan `MonthlyCharges`, cantumkan *covariance matrix* yang akan digunakan pada algoritma Naive Bayes dan Bayesian classifier biasa. Tunjukkan perbedaannya." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3. Decision Trees (40 poin)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Soal 3.1 (6 poin)\n", "\n", "Dengan menggunakan modul numpy, buatlah fungsi untuk menghitung nilai (shannon) entropy!" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def entropy(array):\n", " \"\"\"Menghitung nilai entropy dari array of labels\n", " \n", " e.g. [1, 0, 1, 0, 0, 0, 1] => float\n", " \"\"\"\n", " pass" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Soal 3.2.a (2 poin)\n", "\n", "Dengan menggunakan semua fitur pada `X_train`, lakukan 10-fold cross-validation dengan `DecisionTreeClassifier` menggunakan _hyperparameters_ bawaan. Laporkan nilai $F_1$-score-nya!" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Soal 3.2.b (4 poin)\n", "\n", "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?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "_Tulis jawaban Anda di sini_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Soal 3.3.a (7 poin)\n", "\n", "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_!\n", "\n", "*Catatan: Jangan lupa untuk mengatur nilai parameter `random_state`, memberikan label pada tiap sumbu, dan menyertakan legendanya!*" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Soal 3.3.b (3 poin)\n", "\n", "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?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Tulis jawaban Anda di sini*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Soal 3.4 (3 poin)\n", "\n", "Cetak atribut `feature_importances_` dari model terbaik yang dihasilkan! Nilai apa yang ditunjukkan oleh atribut ini?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "_Tulis jawaban Anda di sini_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Soal 3.5.a (4 poin)\n", "\n", "Klasifikasikan `X_train` dengan menggunakan `RandomForestClassifier`! Dapatkah Anda menghasilkan model dengan kinerja yang lebih baik?\n", "\n", "*Catatan: Anda sangat mungkin memerlukan hyperparameter tuning!*" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Soal 3.5.b (3 poin)\n", "\n", "Cetak nilai `feature_importances_` dari model terbaik dengan `RandomForestClassifier`. Apakah nilai ini berbeda cara menghitungnya dengan soal 3.4?" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Jawaban Anda di sini*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Soal 3.5.c (3 poin)\n", "\n", "Apa yang dimaksud dengan teknik _bagging_? Apa hubungannya dengan `RandomForestClassifier` yang digunakan dalam eksperimen ini?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "_Tulis jawaban Anda di sini_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Soal 3.6 (5 poin)\n", "\n", "Berikan kesimpulan dari apa yang sudah Anda lakukan dalam tugas bagian 3 ini! Anda diperkenankan melakukan eksplorasi tambahan jika dirasa perlu." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "_Tulis jawaban Anda di sini_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 4. Evaluasi Model (20 poin)\n", "\n", "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." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Soal 4.1 (12 poin)\n", "\n", "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!" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Soal 4.2.a (5 poin)\n", "\n", "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?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "_Tulis jawaban Anda di sini_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Soal 4.2.b (3 poin)\n", "\n", "Jika ternyata hasil untuk keempat algoritma sama, model apa yang akan Anda gunakan?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Tulis jawaban Anda di sini*" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.2" } }, "nbformat": 4, "nbformat_minor": 1 }