Alur Penyusunan Laporan

Tata cara penyusunan laporan yang baik menggunakan R Markdown (Rmd) melibatkan beberapa langkah berikut ini secara lebih detail:

Buat Dokumen R Markdown Baru

Di RStudio, buat dokumen R Markdown baru dengan memilih “File” -> “New File” -> “R Markdown”. Pilih format output yang diinginkan (misalnya, HTML, PDF, atau Word) dan tentukan judul laporan serta informasi metadata lainnya.

Struktur Dokumen R Markdown

Setelah file .Rmd dibuat, Anda akan melihat beberapa bagian dalam file tersebut. Secara umum, struktur file .Rmd terdiri dari beberapa bagian utama, termasuk header, chunk options, teks naratif, dan chunk kode. Berikut adalah penjelasan untuk setiap bagian:

Header (YAML)

Dalam menghasilkan tampilan yang rapi dari hasil file .Rmd, terdapat beberapa pengaturan yang dapat kita lakukan untuk mempercantik hasil dari penulisan analisa. Header pada R Markdown atau disebut dengan YAML (Yet Another Markup Languange). YAML pada file .Rmd memiliki peranan sebagai tempat untuk menuliskan judul dari proyek yang dikerjakan, nama penulis, tanggal bahkan sampai pengaturan dari table of content.

Dalam Capstone ML, Anda wajib untuk menyertakan YAML yang minimal berisikan informasi, sebagai berikut:

  • Judul topik capstone
  • Nama Bapak/Ibu
  • Table of Content

Bagian YAML diawali dengan tanda --- dan berisi informasi metadata, seperti judul laporan, penulis, tanggal, dan format output yang diinginkan. Misalnya:

---
title: "Judul Topik Capstone"
author: "Nama Anda"
output:
  html_document:
    toc: true
    toc_float:
      collapsed: true
    number_sections: true
    df_print: paged
---

Pengaturan Chunk

Sering kali ketika kita mengaktifkan sebuauh library, terdapat sebuah warning ataupun message yang muncul seperti gambar di bawah ini.

Agar nantinya warning ataupun message pada saat pemanggilan library tidak muncul, Anda dapat melakukan pengaturannya dengan menambahkan satu chunk dengan format seperti di bawah ini.

# chunk options
knitr::opts_chunk$set(
  message = FALSE,
  warning = FALSE
)

Terdapat beberapa pengaturan opsional lainnya yang dapat kita tambahkan

  • fig.align = bertujuan untuk membuat alignment (posisi left/right/center)
  • fig.height & fig.width = bertujuan untuk mengatur tinggi & lebar gambar (berupa grafik)
  • out.height & out.width = bertujuan untuk mengatur tinggi & lebar gambar

Teks Naratif

Bagian ini digunakan untuk menulis teks naratif, menjelaskan analisis, dan memberikan penjelasan. Anda dapat menggunakan sintaks Markdown untuk memformat teks, menambahkan judul, paragraf, daftar, tautan, dan lainnya. Berikut adalah tata cara menulis teks naratif di Markdown secara detail:

  1. Judul: Untuk membuat judul, Anda dapat menggunakan tanda # diikuti oleh spasi dan judul yang ingin ditulis. Jumlah tanda # menentukan tingkat kepentingan judul, dengan # tunggal untuk judul utama dan ##, ###, dan seterusnya untuk tingkat yang lebih rendah. Contoh:
# Ini adalah judul utama
## Ini adalah judul tingkat kedua
  • # Heading 1

Tujuan dari penggunaan heading 1 adalah untuk menuliskan bagian rubrics yang akan dikerjakan, seperti Model Fitting and Evaluation.

Penggunaan Heading 1 dapat dibuat dengan menggunakan simbol #

  • ## Heading 2

Tujuan dari penggunaan heading 2 adalah untuk menuliskan proses yang dikerjakan pada bagian sub-rubrics yang akan dikerjakan, seperti Compare multiple model.

Penggunaan Heading 2 dapat dibuat dengan menggunakan simbol ##

NB: Untuk penambahan heading berikutnya silahkan tambahkan jumlah #.

  1. Paragraf: Untuk membuat paragraf, cukup pisahkan teks dengan baris kosong. Misalnya:
Ini adalah paragraf pertama.
 
Ini adalah paragraf kedua.
  1. Teks Miring dan Tebal: Untuk memberikan penekanan pada teks, Anda dapat menggunakan tanda asterisk (*) atau garis bawah (_). Untuk membuat teks miring, tambahkan tanda asterisk atau garis bawah di sekitar teks yang ingin dimiringkan. Untuk membuat teks tebal, tambahkan dua tanda asterisk atau garis bawah di sekitar teks yang ingin ditebalkan. Contoh:
Ini adalah *teks miring* dan ini adalah **teks tebal**.
  1. Daftar: Anda dapat membuat daftar dengan menggunakan tanda dash (-) atau angka (1.) di awal setiap item daftar. Pastikan Anda memberikan satu spasi setelah tanda dash atau angka. Misalnya:
- Item 1
- Item 2
  - Subitem 2.1
  - Subitem 2.2
    1. Item A
    2. Item B
  1. Tautan: Untuk menambahkan tautan, Anda dapat menggunakan format [teks tautan](URL). Misalnya:
Ini adalah [tautan ke Google](https://www.google.com/).
  1. Gambar: Untuk menambahkan gambar, Anda dapat menggunakan format ![teks alternatif](URL). Teks alternatif akan ditampilkan jika gambar tidak dapat ditampilkan. Misalnya:
![Logo OpenAI](https://www.example.com/logo.png)
  1. Blok Kutipan: Untuk membuat blok kutipan, cukup tambahkan tanda > di awal setiap baris kutipan. Misalnya:
> Ini adalah contoh blok kutipan.
> Ini adalah baris kedua dalam kutipan.
  1. Kode: Untuk menampilkan kode, Anda dapat menggunakan tanda backtick untuk menandai teks sebagai kode inline. Untuk menyisipkan blok kode yang lebih panjang, Anda dapat menggunakan tiga tanda backtick (```) sebelum dan setelah blok kode. Misalnya:

    Inline code: print("Hello, World!")

    Blok kode:

print("Ini adalah contoh blok kode.")
x <- 10
y <- 20
z <- x + y
print(z)
  1. Tabel: Untuk membuat tabel, Anda dapat menggunakan tanda vertikal (|) sebagai pemisah antara kolom, dan garis pemisah (---) sebagai baris pemisah antara header tabel dan isi tabel. Misalnya:
| Nama   | Usia |
|--------|------|
| John   | 30   |
| Sarah  | 28   |
  1. Pemformatan Lainnya: Markdown juga mendukung fitur-fitur tambahan seperti superskrip (^), subskrip (~), dan garis horizontal (---). Anda dapat menggunakan sintaks tersebut sesuai kebutuhan.

Chunk Kode

Bagian ini digunakan untuk menulis dan mengeksekusi chunk kode R. Anda dapat menambahkan chunk kode dengan menggunakan tanda ```{r} dan menulis kode R di dalamnya.

Alur Pengerjaan Content

Alur General

Tata cara penulisan narasi untuk menjelaskan kode dan proses yang dilakukan dalam laporan dapat mengikuti langkah-langkah berikut:

  1. Klarifikasi Tujuan: Mulailah narasi dengan mengklarifikasi tujuan dari kode atau proses yang akan dijelaskan. Jelaskan secara ringkas apa yang akan dicapai dengan kode tersebut.

  2. Penjelasan Umum: Berikan penjelasan umum tentang apa yang dilakukan oleh kode atau proses tersebut. Gambarkan konsep atau algoritma yang digunakan, serta langkah-langkah yang akan diambil.

  3. Pemahaman Awal: Jika diperlukan, jelaskan pemahaman awal tentang data atau konteks yang terlibat dalam proses atau analisis. Ini dapat mencakup deskripsi tentang variabel, dataset, atau asumsi yang digunakan.

  4. Deskripsi Kode atau Langkah-langkah: Jelaskan kode atau langkah-langkah yang akan dijalankan secara terperinci. Gunakan bahasa yang jelas dan sederhana untuk menjelaskan apa yang dilakukan oleh setiap baris kode atau langkah-langkah.

  5. Pengantar Visualisasi: Jika ada visualisasi yang dihasilkan oleh kode atau proses, berikan pengantar singkat tentang tujuan dan jenis visualisasi yang akan ditampilkan. Jelaskan apa yang ingin Anda komunikasikan melalui visualisasi tersebut.

  6. Penjelasan Hasil: Setelah kode atau proses dijalankan, jelaskan hasil yang dihasilkan. Jelaskan bagaimana hasil tersebut terkait dengan tujuan yang telah ditetapkan sebelumnya. Jika ada kesimpulan atau temuan yang signifikan, sertakan juga penjelasan tentang hal itu.

  7. Pengantar Langkah Berikutnya: Jika ada langkah-langkah atau analisis selanjutnya yang perlu dilakukan setelah kode atau proses ini, berikan pengantar singkat tentang apa yang akan dilakukan selanjutnya. Jelaskan mengapa langkah-langkah tersebut diperlukan dan bagaimana mereka akan membantu dalam analisis lebih lanjut.

  8. Kesimpulan: Akhiri narasi dengan kesimpulan singkat tentang kode atau proses yang telah dijelaskan. Jelaskan apakah tujuan yang ditetapkan telah tercapai dan apa yang telah dipelajari dari proses tersebut.

Dalam menjelaskan kode, pastikan untuk mengikuti prinsip-prinsip tata bahasa yang baik, seperti memberikan penjelasan yang cukup detail, menghindari penggunaan istilah teknis yang tidak jelas, dan menggunakan contoh atau ilustrasi jika diperlukan. Selain itu, pastikan narasi Anda terorganisir dengan baik dan mudah diikuti oleh pembaca.

Alur Spesifik

Secara spesifik, setiap rubrics dari Capstone ML yang kami sediakan. Anda harus mengerjakan beberapa rubrics besar sebagai berikut.

  • Data Wrangling
  • Exploratory Data Analysis
  • Data Preprocess
  • Model and Evaluation
  • Prediction Performance
  • Kesimpulan

Berikut adalah panduan dalam penulisan setiap poinnya:

Data Wrangling

Pada bagian ini, akan diawali dengan pembacaan data. Silakan membaca data dan menampilkan maksimal 6 baris saat akan dikenitkan, seperti contoh di bawah ini:

head(iris)

Selain menampilkan data, Anda juga dapat menjelaskan intuisi dari masing-masing kolom data yang ditunjukkan.

Deskripsi Kolom Data:

  • Sepal.Length: Panjang dari ukuran daun
  • Sepal.Width: Lebar dari ukuran daun
  • Petal.Length: Panjang dari ukuran bunga
  • Petal.Width: Lebar dari ukuran bunga
  • Species: Jenis spesies (setosa, versicolor, virginica)

Setelah melakukan pemanggilan data dan memberikan deskripsi, Anda dapat melanjutkan dengan beberapa tahap pembersihan data. Kami harap Anda dapat menjelaskan dengan jelas tahapan yang dilakukan dalam proses pembersihan data. Sebagai contoh, tahap berikutnya adalah memeriksa tipe data dan mengubahnya jika diperlukan. Berikut adalah contoh pengerjaan yang kami harapkan.

Pengecekan Tipe Data

Tahapan berikutnya yang perlu dilanjutkan adalah melakukan eksplorasi data. Sebagai contoh, terdapat dua eksplorasi yang ingin dilakukan. Mari kita jelaskan setiap bagian pembahasan secara rinci. Berikut adalah contoh narasi yang disusun untuk setiap eksplorasi.

EDA1: Pengecekan dengan summary()

Pada tahap ini, kita akan melakukan eksplorasi data menggunakan fungsi summary(). Fungsi ini memberikan ringkasan dari 5 perhitungan statistik untuk kolom dengan tipe data numerik, serta perhitungan frekuensi kemunculan untuk kolom dengan tipe data kategorikal. Mari kita terapkan fungsi ini pada data yang kita miliki.

summary(iris)
##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
##        Species  
##  setosa    :50  
##  versicolor:50  
##  virginica :50  
##                 
##                 
## 

Dari hasil fungsi summary(), kita dapat menemukan beberapa temuan sebagai berikut:

  • Terdapat 3 spesies bunga iris dalam data kita, dan setiap spesies memiliki jumlah kemunculan yang sama.
  • Rentang nilai pada setiap kolom numerik berbeda-beda.

EDA2: Pengecekan outlier

Setelah mengecek penyebaran data pada kolom-kolom numerik, kita dapat melihat apakah terdapat outlier dalam data menggunakan visualisasi boxplot(). Fungsi boxplot() digunakan untuk menganalisis lebih lanjut kolom numerik yang kita pilih, dengan menyediakan argumen nama_data$nama_kolom_numerik.

boxplot(iris$Sepal.Width)

Dari visualisasi di atas, kita dapat mengetahui bahwa rentang lebar yang dianggap normal berkisar antara 2.25 hingga 4. Jika lebar lebih kecil atau lebih besar dari rentang tersebut, dapat dikategorikan sebagai outlier. Selain melihat visualisasi Boxplot, kita juga dapat mencari informasi tentang jumlah nilai outlier yang sebenarnya ada. Untuk itu, kita dapat menyimpan hasil boxplot pada sebuah variabel dan menggunakan $out untuk menampilkan outlier.

box_sw <- boxplot(iris$Sepal.Width)

box_sw$out
## [1] 4.4 4.1 4.2 2.0

Dari hasilnya, kita dapat mengetahui bahwa data kita hanya memiliki sedikit nilai yang dianggap outlier. Hanya terdapat 4 pengamatan yang dianggap sebagai outlier dari total 150 pengamatan data.

Dari contoh pengerjaan di atas, kami berharap Anda dapat melakukan eksplorasi data dari data yang telah disiapkan, menjelaskan fungsi-fungsi yang digunakan, dan mengungkapkan wawasan dari setiap eksplorasi yang dilakukan. Selain itu, kami juga berharap Anda dapat membagi setiap eksplorasi menjadi sub-heading atau menggunakan format yang terstruktur untuk mempermudah pemahaman.

Data Preprocessing

Setelah melewati dua tahapan di awal, tahapan ketiga yang perlu Anda lakukan adalah mempersiapkan data agar lebih siap sebelum di-implementasikan ke model machine learning yang akan digunakan. Sebagai contoh, kita ingin melakukan tahapan cross validation.

Tahapan cross validation adalah tahapan yang kita gunakan untuk mengetahui seberapa baik performa model kita memprediksi terhadap data baru.

Lantas, bagaimana cara mengetahui apakah model yang kita buat telah baik dalam memprediksi data baru? Di sinilah mengapa kita melakukan Train-test splitting. Kita membagi data kita menjadi 2 kelompok, yaitu data train dan test.

  • Data train: Data yang model gunakan untuk training.
  • Data test: Data untuk evaluasi model (Untuk melihat seberapa baik model memprediksi terhadap data yang tidak digunakan untuk training)

Jika diibaratkan, seorang siswa dapat dikatakan pintar ketika dapat menjawab benar soal-soal ujian yang tidak pernah dikerjakannya pada soal-soal latihan untuk persiapan ujian. Data train diibaratkan soal latihan, dan data test diibaratkan soal ujian. Adapun model kita diibaratkan sebagai siswa.

Sekarang, mari kita coba lakukan pemisahan data dengan menggunakan fungsi yang terdapat pada chunk di bawah ini.

# Penentuan nilai random
set.seed(123)

# Pengaturan pemisahan data dengan fungsi initial split dari library rsample
init <- initial_split(data = iris, # parameter untuk mengisi data yang digunakan
                      prop = 0.8, # parameter mengatur proporsi untuk data train
                      strata = Species) # parameter untuk memberitahu kolom target

# Membagi data untuk data train dengan fungsi training()
data_train <- training(init)

# Membagi data untuk data test dengan fungsi testing()
data_test <- testing(init)

Setelah menjalan fungsi di atas, kita sudah berhasil untuk melakukan pembagian data yang akan digunakan sebagai data latih dan data uji. Terdapat dua hal yang perlu di perhatikan, jangan mengubah angka pada fungsi set.seed() dan jumlah prorposi yang dialokasikan pada data latih kita, tujuannya agar hasil dari model yang kita buat tidak berubah ketika kita melakukan pengulangan dari awal.

Tahapan berikutnya yang perlu kita lakukan adalah mengecek proporsi data pada data latih yang kita miliki.

prop.table(table(data_train$Species))
## 
##     setosa versicolor  virginica 
##  0.3333333  0.3333333  0.3333333

Dari hasil pengamatan di atas, kita mengetahui bahwa proporsi data untuk setiap kelas target yang kita miliki adalah seimbang. Akan tetapi jika data tersebut belum proporsional, kita dapat membuat tahapan selanjutnyab yaitu tahapan balancing data.

Dari contoh pengerjaan di atas, kami mengharapkan Anda berhasil melakukan Data Preprocessing beserta menjelaskan tahapan-tahapan yang terdapat pada bagian tersebut secara runtut dan dapat menyambungkan penjelsasan sebelumnya dengan tahapan yang akan dilakukan setelahnya.

Model and Evaluation

Pada bagian ini, kami akan meminta Anda untuk membuat sebuah model dan melakukan evaluasi terhadap hasilnya. Sebagai contoh, kita akan melakukan tahapan “Model and Evaluation”.

Dalam dataset yang kita miliki, kelas target adalah multikelas, sehingga kita tidak dapat menggunakan model regresi logistik karena model tersebut hanya digunakan untuk prediksi pada kelas biner (2 kelas) saja. Namun, tidak perlu khawatir, masih terdapat model lain yang dapat digunakan, salah satunya adalah K-NN (K-Nearest Neighbors), serta model pembanding yang akan kita gunakan adalah Random Forest.

Model 1: K-NN

Salah satu alasan mengapa kita memilih model K-NN adalah karena model ini sangat cocok ketika semua variabel dalam bentuk numerik, karena model K-NN menggunakan perhitungan jarak Euclidean.

Tahap pertama yang perlu kita lakukan adalah menentukan nilai K, dengan menggunakan akar kuadrat dari jumlah pengamatan data yang kita miliki menggunakan fungsi sqrt().

sqrt(nrow(data_train))
## [1] 10.95445

Dari hasil perhitungan di atas, kita dapat membulatkan ke atas nilai K yang akan digunakan menjadi 11. Ini dikarenakan salah satu aturan praktis dalam menentukan nilai K adalah memilih nilai K yang ganjil. Setelah itu, kita dapat membuat model K-NN dengan menggunakan fungsi knn() dari paket class.

Pada fungsi knn(), terdapat 4 parameter yang perlu diisi, yaitu:

  • train = data train - prediktor dengan tipe numerik
  • test = data test - prediktor dengan tipe numerik
  • cl = data train - label (target) aktual (kategorikal)
  • k = jumlah K yang telah ditentukan sebelumnya
knn_pred <- knn(train = data_train %>% select(-Species), 
                test = data_test %>% select(-Species), 
                cl = as.factor(data_train$Species), 
                k = 11)

head(knn_pred)
## [1] setosa setosa setosa setosa setosa setosa
## Levels: setosa versicolor virginica

Setelah melakukan pemodelan dan mendapatkan hasil prediksi, kita dapat melakukan evaluasi menggunakan matriks kebingungan (confusion matrix) dengan menggunakan fungsi confusionMatrix() dari paket caret.

eval_knn <- 
confusionMatrix(data = knn_pred, 
                reference = as.factor(data_test$Species))

eval_knn
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         10          0         0
##   versicolor      0         10         0
##   virginica       0          0        10
## 
## Overall Statistics
##                                      
##                Accuracy : 1          
##                  95% CI : (0.8843, 1)
##     No Information Rate : 0.3333     
##     P-Value [Acc > NIR] : 4.857e-15  
##                                      
##                   Kappa : 1          
##                                      
##  Mcnemar's Test P-Value : NA         
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                 1.0000            1.0000           1.0000
## Specificity                 1.0000            1.0000           1.0000
## Pos Pred Value              1.0000            1.0000           1.0000
## Neg Pred Value              1.0000            1.0000           1.0000
## Prevalence                  0.3333            0.3333           0.3333
## Detection Rate              0.3333            0.3333           0.3333
## Detection Prevalence        0.3333            0.3333           0.3333
## Balanced Accuracy           1.0000            1.0000           1.0000

Dari hasil evaluasi di atas, model K-NN telah menghasilkan prediksi dengan performa yang sangat baik, karena semua data test dapat diprediksi dengan benar oleh model yang telah disiapkan. Meskipun hasil evaluasi menunjukkan bahwa model tersebut telah menghasilkan prediksi yang baik, masih terdapat satu model lain yang akan kita coba pada bagian selanjutnya.

Model 2: Random Forest

Pada pembuatan model pembanding atau model kedua, silakan terapkan langkah-langkah yang sama dengan contoh penjelasan pembuatan model K-NN.

Dari contoh pengerjaan di atas, kami berharap Anda dapat menjelaskan fungsi-fungsi atau parameter-parameter yang digunakan dalam pembuatan model, dan dalam tahapan prediksi, harap sertakan penjelasan mengenai hasil yang diperoleh. Selain itu, jika Anda melakukan proses penyetelan model (model tuning), harap dijelaskan penyetelan apa yang dilakukan dan hasil yang diperoleh.

Prediction Performance

Dalam rangka membandingkan beberapa model yang dibuat dalam rubrik ini, disarankan untuk membuat sebuah dataframe baru yang mengumpulkan informasi penting dari setiap model. Berikut ini adalah contoh pembuatan dataframe baru:

compare_knn <- data_frame(Model = "K-NN",
                         Accuracy = round((eval_knn$overall[1] * 100), 2),
                         Recall = round((eval_knn$byClass[1] * 100), 2),
                         Precision = round((eval_knn$byClass[3] * 100), 2))

compare_rf <- data_frame(Model = "RF",
                         Accuracy = 92,
                         Recall = 90,
                         Precision = 98)

rbind(compare_knn, compare_rf)

Dengan menggunakan dataframe ini, Anda dapat dengan mudah membandingkan dan melihat performa dari setiap model yang telah dibuat.

Diharapkan dengan contoh di atas, Anda dapat membuat dan mengisi dataframe dengan informasi yang relevan dari setiap model yang dibuat.

Kesimpulan

Pada bagian kesimpulan, Anda dapat memberikan ringkasan mengenai temuan yang Anda peroleh dari tahapan EDA, model mana yang memberikan performa terbaik, proses yang Anda lakukan untuk meningkatkan hasil model, saran bisnis yang dapat Anda berikan berdasarkan topik yang diambil, dan sebagainya. Anda juga dapat mencantumkan link referensi yang Anda gunakan.