You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ML-For-Beginners/translations/id/4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb

725 lines
28 KiB

{
"nbformat": 4,
"nbformat_minor": 2,
"metadata": {
"colab": {
"name": "lesson_10-R.ipynb",
"provenance": [],
"collapsed_sections": []
},
"kernelspec": {
"name": "ir",
"display_name": "R"
},
"language_info": {
"name": "R"
},
"coopTranslator": {
"original_hash": "2621e24705e8100893c9bf84e0fc8aef",
"translation_date": "2025-09-04T08:59:49+00:00",
"source_file": "4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb",
"language_code": "id"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [],
"metadata": {
"id": "ItETB4tSFprR"
}
},
{
"cell_type": "markdown",
"source": [
"## Pengantar Klasifikasi: Membersihkan, Mempersiapkan, dan Memvisualisasikan Data Anda\n",
"\n",
"Dalam empat pelajaran ini, Anda akan menjelajahi salah satu fokus utama pembelajaran mesin klasik - *klasifikasi*. Kita akan mempelajari penggunaan berbagai algoritma klasifikasi dengan dataset tentang berbagai masakan brilian dari Asia dan India. Semoga Anda lapar!\n",
"\n",
"<p >\n",
" <img src=\"../../images/pinch.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Rayakan masakan pan-Asia dalam pelajaran ini! Gambar oleh Jen Looper</figcaption>\n",
"\n",
"\n",
"<!--![Rayakan masakan pan-Asia dalam pelajaran ini! Gambar oleh Jen Looper](../../../../../../4-Classification/1-Introduction/solution/R/images/pinch.png)-->\n",
"\n",
"Klasifikasi adalah bentuk [pembelajaran terawasi](https://wikipedia.org/wiki/Supervised_learning) yang memiliki banyak kesamaan dengan teknik regresi. Dalam klasifikasi, Anda melatih model untuk memprediksi kategori mana suatu item termasuk. Jika pembelajaran mesin bertujuan untuk memprediksi nilai atau nama sesuatu menggunakan dataset, maka klasifikasi umumnya terbagi menjadi dua kelompok: *klasifikasi biner* dan *klasifikasi multikelas*.\n",
"\n",
"Ingat:\n",
"\n",
"- **Regresi linear** membantu Anda memprediksi hubungan antara variabel dan membuat prediksi akurat tentang di mana titik data baru akan berada dalam hubungan dengan garis tersebut. Misalnya, Anda dapat memprediksi nilai numerik seperti *berapa harga labu pada bulan September dibandingkan Desember*.\n",
"\n",
"- **Regresi logistik** membantu Anda menemukan \"kategori biner\": pada titik harga ini, *apakah labu ini berwarna oranye atau tidak-oranye*?\n",
"\n",
"Klasifikasi menggunakan berbagai algoritma untuk menentukan cara lain dalam menentukan label atau kelas suatu titik data. Mari kita bekerja dengan data masakan ini untuk melihat apakah, dengan mengamati sekelompok bahan, kita dapat menentukan asal masakannya.\n",
"\n",
"### [**Kuis Pra-Pelajaran**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/19/)\n",
"\n",
"### **Pengantar**\n",
"\n",
"Klasifikasi adalah salah satu aktivitas mendasar bagi peneliti pembelajaran mesin dan ilmuwan data. Dari klasifikasi dasar nilai biner (\"apakah email ini spam atau bukan?\"), hingga klasifikasi dan segmentasi gambar yang kompleks menggunakan visi komputer, kemampuan untuk mengelompokkan data ke dalam kelas dan mengajukan pertanyaan tentangnya selalu berguna.\n",
"\n",
"Untuk menyatakan proses ini secara lebih ilmiah, metode klasifikasi Anda menciptakan model prediktif yang memungkinkan Anda memetakan hubungan antara variabel input dengan variabel output.\n",
"\n",
"<p >\n",
" <img src=\"../../images/binary-multiclass.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Masalah biner vs. multikelas untuk algoritma klasifikasi. Infografis oleh Jen Looper</figcaption>\n",
"\n",
"\n",
"\n",
"Sebelum memulai proses membersihkan data, memvisualisasikannya, dan mempersiapkannya untuk tugas ML kita, mari kita pelajari sedikit tentang berbagai cara pembelajaran mesin dapat digunakan untuk mengklasifikasikan data.\n",
"\n",
"Berasal dari [statistik](https://wikipedia.org/wiki/Statistical_classification), klasifikasi menggunakan pembelajaran mesin klasik memanfaatkan fitur-fitur seperti `smoker`, `weight`, dan `age` untuk menentukan *kemungkinan mengembangkan penyakit X*. Sebagai teknik pembelajaran terawasi yang mirip dengan latihan regresi yang Anda lakukan sebelumnya, data Anda diberi label dan algoritma ML menggunakan label tersebut untuk mengklasifikasikan dan memprediksi kelas (atau 'fitur') dari suatu dataset dan menetapkannya ke dalam kelompok atau hasil tertentu.\n",
"\n",
"✅ Luangkan waktu sejenak untuk membayangkan sebuah dataset tentang masakan. Apa yang dapat dijawab oleh model multikelas? Apa yang dapat dijawab oleh model biner? Bagaimana jika Anda ingin menentukan apakah suatu masakan kemungkinan menggunakan fenugreek? Bagaimana jika Anda ingin melihat apakah, dengan sekantong bahan seperti star anise, artichoke, kembang kol, dan lobak, Anda dapat membuat hidangan khas India?\n",
"\n",
"### **Halo 'classifier'**\n",
"\n",
"Pertanyaan yang ingin kita ajukan pada dataset masakan ini sebenarnya adalah pertanyaan **multikelas**, karena kita memiliki beberapa kemungkinan masakan nasional untuk dikerjakan. Diberikan sekumpulan bahan, ke dalam kelas mana dari banyak kelas ini data tersebut akan cocok?\n",
"\n",
"Tidymodels menawarkan beberapa algoritma berbeda untuk digunakan dalam mengklasifikasikan data, tergantung pada jenis masalah yang ingin Anda selesaikan. Dalam dua pelajaran berikutnya, Anda akan mempelajari beberapa algoritma ini.\n",
"\n",
"#### **Prasyarat**\n",
"\n",
"Untuk pelajaran ini, kita memerlukan paket-paket berikut untuk membersihkan, mempersiapkan, dan memvisualisasikan data kita:\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) adalah [koleksi paket R](https://www.tidyverse.org/packages) yang dirancang untuk membuat ilmu data lebih cepat, mudah, dan menyenangkan!\n",
"\n",
"- `tidymodels`: Kerangka kerja [tidymodels](https://www.tidymodels.org/) adalah [koleksi paket](https://www.tidymodels.org/packages/) untuk pemodelan dan pembelajaran mesin.\n",
"\n",
"- `DataExplorer`: Paket [DataExplorer](https://cran.r-project.org/web/packages/DataExplorer/vignettes/dataexplorer-intro.html) dirancang untuk menyederhanakan dan mengotomatisasi proses EDA serta pembuatan laporan.\n",
"\n",
"- `themis`: Paket [themis](https://themis.tidymodels.org/) menyediakan Langkah Resep Tambahan untuk Menangani Data yang Tidak Seimbang.\n",
"\n",
"Anda dapat menginstalnya dengan:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"DataExplorer\", \"here\"))`\n",
"\n",
"Sebagai alternatif, skrip di bawah ini akan memeriksa apakah Anda memiliki paket yang diperlukan untuk menyelesaikan modul ini dan menginstalnya untuk Anda jika belum ada.\n"
],
"metadata": {
"id": "ri5bQxZ-Fz_0"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"suppressWarnings(if (!require(\"pacman\"))install.packages(\"pacman\"))\r\n",
"\r\n",
"pacman::p_load(tidyverse, tidymodels, DataExplorer, themis, here)"
],
"outputs": [],
"metadata": {
"id": "KIPxa4elGAPI"
}
},
{
"cell_type": "markdown",
"source": [
"Nanti kita akan memuat paket-paket keren ini dan membuatnya tersedia di sesi R kita saat ini. (Ini hanya untuk ilustrasi, `pacman::p_load()` sudah melakukannya untuk Anda)\n"
],
"metadata": {
"id": "YkKAxOJvGD4C"
}
},
{
"cell_type": "markdown",
"source": [
"## Latihan - membersihkan dan menyeimbangkan data Anda\n",
"\n",
"Tugas pertama yang harus dilakukan sebelum memulai proyek ini adalah membersihkan dan **menyeimbangkan** data Anda untuk mendapatkan hasil yang lebih baik.\n",
"\n",
"Mari kita kenali datanya! 🕵️\n"
],
"metadata": {
"id": "PFkQDlk0GN5O"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Import data\r\n",
"df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/4-Classification/data/cuisines.csv\")\r\n",
"\r\n",
"# View the first 5 rows\r\n",
"df %>% \r\n",
" slice_head(n = 5)\r\n"
],
"outputs": [],
"metadata": {
"id": "Qccw7okxGT0S"
}
},
{
"cell_type": "markdown",
"source": [
"Menarik! Dari tampilannya, kolom pertama adalah semacam kolom `id`. Mari kita cari sedikit lebih banyak informasi tentang data tersebut.\n"
],
"metadata": {
"id": "XrWnlgSrGVmR"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Basic information about the data\r\n",
"df %>%\r\n",
" introduce()\r\n",
"\r\n",
"# Visualize basic information above\r\n",
"df %>% \r\n",
" plot_intro(ggtheme = theme_light())"
],
"outputs": [],
"metadata": {
"id": "4UcGmxRxGieA"
}
},
{
"cell_type": "markdown",
"source": [
"Dari outputnya, kita dapat langsung melihat bahwa kita memiliki `2448` baris dan `385` kolom serta `0` nilai yang hilang. Kita juga memiliki 1 kolom diskret, *cuisine*.\n",
"\n",
"## Latihan - mempelajari tentang jenis masakan\n",
"\n",
"Sekarang pekerjaan mulai menjadi lebih menarik. Mari kita temukan distribusi data berdasarkan jenis masakan.\n"
],
"metadata": {
"id": "AaPubl__GmH5"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Count observations per cuisine\r\n",
"df %>% \r\n",
" count(cuisine) %>% \r\n",
" arrange(n)\r\n",
"\r\n",
"# Plot the distribution\r\n",
"theme_set(theme_light())\r\n",
"df %>% \r\n",
" count(cuisine) %>% \r\n",
" ggplot(mapping = aes(x = n, y = reorder(cuisine, -n))) +\r\n",
" geom_col(fill = \"midnightblue\", alpha = 0.7) +\r\n",
" ylab(\"cuisine\")"
],
"outputs": [],
"metadata": {
"id": "FRsBVy5eGrrv"
}
},
{
"cell_type": "markdown",
"source": [
"Ada sejumlah jenis masakan, tetapi distribusi datanya tidak merata. Kamu bisa memperbaikinya! Sebelum itu, jelajahi sedikit lebih jauh.\n",
"\n",
"Selanjutnya, mari kita tetapkan setiap jenis masakan ke dalam tibble masing-masing dan cari tahu seberapa banyak data yang tersedia (baris, kolom) untuk setiap jenis masakan.\n",
"\n",
"> Sebuah [tibble](https://tibble.tidyverse.org/) adalah kerangka data modern.\n",
"\n",
"<p >\n",
" <img src=\"../../images/dplyr_filter.jpg\"\n",
" width=\"600\"/>\n",
" <figcaption>Karya seni oleh @allison_horst</figcaption>\n"
],
"metadata": {
"id": "vVvyDb1kG2in"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Create individual tibble for the cuisines\r\n",
"thai_df <- df %>% \r\n",
" filter(cuisine == \"thai\")\r\n",
"japanese_df <- df %>% \r\n",
" filter(cuisine == \"japanese\")\r\n",
"chinese_df <- df %>% \r\n",
" filter(cuisine == \"chinese\")\r\n",
"indian_df <- df %>% \r\n",
" filter(cuisine == \"indian\")\r\n",
"korean_df <- df %>% \r\n",
" filter(cuisine == \"korean\")\r\n",
"\r\n",
"\r\n",
"# Find out how much data is available per cuisine\r\n",
"cat(\" thai df:\", dim(thai_df), \"\\n\",\r\n",
" \"japanese df:\", dim(japanese_df), \"\\n\",\r\n",
" \"chinese_df:\", dim(chinese_df), \"\\n\",\r\n",
" \"indian_df:\", dim(indian_df), \"\\n\",\r\n",
" \"korean_df:\", dim(korean_df))"
],
"outputs": [],
"metadata": {
"id": "0TvXUxD3G8Bk"
}
},
{
"cell_type": "markdown",
"source": [
"## **Latihan - Menemukan bahan utama berdasarkan jenis masakan menggunakan dplyr**\n",
"\n",
"Sekarang kamu bisa menggali lebih dalam ke dalam data dan mempelajari apa saja bahan khas untuk setiap jenis masakan. Kamu perlu membersihkan data berulang yang dapat menyebabkan kebingungan antar jenis masakan, jadi mari kita pelajari masalah ini.\n",
"\n",
"Buatlah fungsi `create_ingredient()` dalam R yang mengembalikan dataframe bahan. Fungsi ini akan dimulai dengan menghapus kolom yang tidak berguna dan mengurutkan bahan berdasarkan jumlahnya.\n",
"\n",
"Struktur dasar dari sebuah fungsi dalam R adalah:\n",
"\n",
"`myFunction <- function(arglist){`\n",
"\n",
"**`...`**\n",
"\n",
"**`return`**`(value)`\n",
"\n",
"`}`\n",
"\n",
"Pengantar yang rapi tentang fungsi dalam R dapat ditemukan [di sini](https://skirmer.github.io/presentations/functions_with_r.html#1).\n",
"\n",
"Mari kita langsung mulai! Kita akan menggunakan [kata kerja dplyr](https://dplyr.tidyverse.org/) yang telah kita pelajari di pelajaran sebelumnya. Sebagai pengingat:\n",
"\n",
"- `dplyr::select()`: membantu kamu memilih kolom mana yang ingin disimpan atau dikecualikan.\n",
"\n",
"- `dplyr::pivot_longer()`: membantu kamu \"memanjangkan\" data, meningkatkan jumlah baris dan mengurangi jumlah kolom.\n",
"\n",
"- `dplyr::group_by()` dan `dplyr::summarise()`: membantu kamu menemukan statistik ringkasan untuk berbagai grup, dan menyusunnya dalam tabel yang rapi.\n",
"\n",
"- `dplyr::filter()`: membuat subset data yang hanya berisi baris yang memenuhi kondisi kamu.\n",
"\n",
"- `dplyr::mutate()`: membantu kamu membuat atau memodifikasi kolom.\n",
"\n",
"Lihatlah [tutorial learnr penuh seni ini](https://allisonhorst.shinyapps.io/dplyr-learnr/#section-welcome) oleh Allison Horst, yang memperkenalkan beberapa fungsi pengolahan data yang berguna dalam dplyr *(bagian dari Tidyverse)*.\n"
],
"metadata": {
"id": "K3RF5bSCHC76"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Creates a functions that returns the top ingredients by class\r\n",
"\r\n",
"create_ingredient <- function(df){\r\n",
" \r\n",
" # Drop the id column which is the first colum\r\n",
" ingredient_df = df %>% select(-1) %>% \r\n",
" # Transpose data to a long format\r\n",
" pivot_longer(!cuisine, names_to = \"ingredients\", values_to = \"count\") %>% \r\n",
" # Find the top most ingredients for a particular cuisine\r\n",
" group_by(ingredients) %>% \r\n",
" summarise(n_instances = sum(count)) %>% \r\n",
" filter(n_instances != 0) %>% \r\n",
" # Arrange by descending order\r\n",
" arrange(desc(n_instances)) %>% \r\n",
" mutate(ingredients = factor(ingredients) %>% fct_inorder())\r\n",
" \r\n",
" \r\n",
" return(ingredient_df)\r\n",
"} # End of function"
],
"outputs": [],
"metadata": {
"id": "uB_0JR82HTPa"
}
},
{
"cell_type": "markdown",
"source": [
"Sekarang kita bisa menggunakan fungsi ini untuk mendapatkan gambaran tentang sepuluh bahan paling populer berdasarkan masakan. Mari kita coba dengan `thai_df`.\n"
],
"metadata": {
"id": "h9794WF8HWmc"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Call create_ingredient and display popular ingredients\r\n",
"thai_ingredient_df <- create_ingredient(df = thai_df)\r\n",
"\r\n",
"thai_ingredient_df %>% \r\n",
" slice_head(n = 10)"
],
"outputs": [],
"metadata": {
"id": "agQ-1HrcHaEA"
}
},
{
"cell_type": "markdown",
"source": [
"Pada bagian sebelumnya, kita menggunakan `geom_col()`, mari kita lihat bagaimana Anda juga dapat menggunakan `geom_bar` untuk membuat diagram batang. Gunakan `?geom_bar` untuk membaca lebih lanjut.\n"
],
"metadata": {
"id": "kHu9ffGjHdcX"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Make a bar chart for popular thai cuisines\r\n",
"thai_ingredient_df %>% \r\n",
" slice_head(n = 10) %>% \r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"steelblue\") +\r\n",
" xlab(\"\") + ylab(\"\")"
],
"outputs": [],
"metadata": {
"id": "fb3Bx_3DHj6e"
}
},
{
"cell_type": "markdown",
"source": [
"Mari kita lakukan hal yang sama untuk data Jepang\n"
],
"metadata": {
"id": "RHP_xgdkHnvM"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Get popular ingredients for Japanese cuisines and make bar chart\r\n",
"create_ingredient(df = japanese_df) %>% \r\n",
" slice_head(n = 10) %>%\r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"darkorange\", alpha = 0.8) +\r\n",
" xlab(\"\") + ylab(\"\")\r\n"
],
"outputs": [],
"metadata": {
"id": "019v8F0XHrRU"
}
},
{
"cell_type": "markdown",
"source": [
"Bagaimana dengan masakan Cina?\n"
],
"metadata": {
"id": "iIGM7vO8Hu3v"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Get popular ingredients for Chinese cuisines and make bar chart\r\n",
"create_ingredient(df = chinese_df) %>% \r\n",
" slice_head(n = 10) %>%\r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"cyan4\", alpha = 0.8) +\r\n",
" xlab(\"\") + ylab(\"\")"
],
"outputs": [],
"metadata": {
"id": "lHd9_gd2HyzU"
}
},
{
"cell_type": "markdown",
"source": [],
"metadata": {
"id": "ir8qyQbNH1c7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Get popular ingredients for Indian cuisines and make bar chart\r\n",
"create_ingredient(df = indian_df) %>% \r\n",
" slice_head(n = 10) %>%\r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"#041E42FF\", alpha = 0.8) +\r\n",
" xlab(\"\") + ylab(\"\")"
],
"outputs": [],
"metadata": {
"id": "ApukQtKjH5FO"
}
},
{
"cell_type": "markdown",
"source": [
"Akhirnya, plot bahan-bahan Korea.\n"
],
"metadata": {
"id": "qv30cwY1H-FM"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Get popular ingredients for Korean cuisines and make bar chart\r\n",
"create_ingredient(df = korean_df) %>% \r\n",
" slice_head(n = 10) %>%\r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"#852419FF\", alpha = 0.8) +\r\n",
" xlab(\"\") + ylab(\"\")"
],
"outputs": [],
"metadata": {
"id": "lumgk9cHIBie"
}
},
{
"cell_type": "markdown",
"source": [
"Dari visualisasi data, kita sekarang dapat menghapus bahan-bahan yang paling umum yang menciptakan kebingungan antara masakan yang berbeda, menggunakan `dplyr::select()`.\n",
"\n",
"Semua orang menyukai nasi, bawang putih, dan jahe!\n"
],
"metadata": {
"id": "iO4veMXuIEta"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Drop id column, rice, garlic and ginger from our original data set\r\n",
"df_select <- df %>% \r\n",
" select(-c(1, rice, garlic, ginger))\r\n",
"\r\n",
"# Display new data set\r\n",
"df_select %>% \r\n",
" slice_head(n = 5)"
],
"outputs": [],
"metadata": {
"id": "iHJPiG6rIUcK"
}
},
{
"cell_type": "markdown",
"source": [
"## Praproses data menggunakan resep 👩‍🍳👨‍🍳 - Mengatasi data yang tidak seimbang ⚖️\n",
"\n",
"<p >\n",
" <img src=\"../../images/recipes.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Karya seni oleh @allison_horst</figcaption>\n",
"\n",
"Karena pelajaran ini berkaitan dengan masakan, kita harus menempatkan `recipes` dalam konteks yang sesuai.\n",
"\n",
"Tidymodels menyediakan satu lagi paket yang keren: `recipes` - sebuah paket untuk praproses data.\n"
],
"metadata": {
"id": "kkFd-JxdIaL6"
}
},
{
"cell_type": "markdown",
"source": [
"Mari kita lihat kembali distribusi masakan kita.\n"
],
"metadata": {
"id": "6l2ubtTPJAhY"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Distribution of cuisines\r\n",
"old_label_count <- df_select %>% \r\n",
" count(cuisine) %>% \r\n",
" arrange(desc(n))\r\n",
"\r\n",
"old_label_count"
],
"outputs": [],
"metadata": {
"id": "1e-E9cb7JDVi"
}
},
{
"cell_type": "markdown",
"source": [
"Seperti yang dapat Anda lihat, terdapat distribusi yang cukup tidak merata dalam jumlah jenis masakan. Masakan Korea hampir 3 kali lebih banyak dibandingkan masakan Thailand. Data yang tidak seimbang sering kali memiliki dampak negatif terhadap kinerja model. Pikirkan tentang klasifikasi biner. Jika sebagian besar data Anda berasal dari satu kelas, model pembelajaran mesin akan lebih sering memprediksi kelas tersebut, hanya karena ada lebih banyak data untuk kelas itu. Menyeimbangkan data mengambil data yang miring dan membantu menghilangkan ketidakseimbangan ini. Banyak model bekerja paling baik ketika jumlah observasi seimbang dan, oleh karena itu, cenderung kesulitan dengan data yang tidak seimbang.\n",
"\n",
"Ada dua cara utama untuk menangani kumpulan data yang tidak seimbang:\n",
"\n",
"- menambahkan observasi ke kelas minoritas: `Over-sampling` misalnya menggunakan algoritma SMOTE\n",
"\n",
"- menghapus observasi dari kelas mayoritas: `Under-sampling`\n",
"\n",
"Sekarang, mari kita demonstrasikan cara menangani kumpulan data yang tidak seimbang menggunakan sebuah `recipe`. Recipe dapat dianggap sebagai cetak biru yang menjelaskan langkah-langkah apa saja yang harus diterapkan pada kumpulan data agar siap untuk analisis data.\n"
],
"metadata": {
"id": "soAw6826JKx9"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Load themis package for dealing with imbalanced data\r\n",
"library(themis)\r\n",
"\r\n",
"# Create a recipe for preprocessing data\r\n",
"cuisines_recipe <- recipe(cuisine ~ ., data = df_select) %>% \r\n",
" step_smote(cuisine)\r\n",
"\r\n",
"cuisines_recipe"
],
"outputs": [],
"metadata": {
"id": "HS41brUIJVJy"
}
},
{
"cell_type": "markdown",
"source": [
"Mari kita uraikan langkah-langkah pra-pemrosesan kita.\n",
"\n",
"- Pemanggilan `recipe()` dengan sebuah formula memberi tahu recipe tentang *peran* dari variabel-variabel menggunakan data `df_select` sebagai referensi. Sebagai contoh, kolom `cuisine` telah diberikan peran `outcome`, sementara kolom lainnya diberikan peran `predictor`.\n",
"\n",
"- [`step_smote(cuisine)`](https://themis.tidymodels.org/reference/step_smote.html) membuat *spesifikasi* dari langkah recipe yang secara sintetis menghasilkan contoh baru dari kelas minoritas menggunakan tetangga terdekat dari kasus-kasus tersebut.\n",
"\n",
"Sekarang, jika kita ingin melihat data yang telah diproses, kita harus [**`prep()`**](https://recipes.tidymodels.org/reference/prep.html) dan [**`bake()`**](https://recipes.tidymodels.org/reference/bake.html) recipe kita.\n",
"\n",
"`prep()`: memperkirakan parameter yang diperlukan dari set pelatihan yang nantinya dapat diterapkan pada set data lainnya.\n",
"\n",
"`bake()`: mengambil recipe yang telah diproses (prepped) dan menerapkan operasi tersebut pada set data apa pun.\n"
],
"metadata": {
"id": "Yb-7t7XcJaC8"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Prep and bake the recipe\r\n",
"preprocessed_df <- cuisines_recipe %>% \r\n",
" prep() %>% \r\n",
" bake(new_data = NULL) %>% \r\n",
" relocate(cuisine)\r\n",
"\r\n",
"# Display data\r\n",
"preprocessed_df %>% \r\n",
" slice_head(n = 5)\r\n",
"\r\n",
"# Quick summary stats\r\n",
"preprocessed_df %>% \r\n",
" introduce()"
],
"outputs": [],
"metadata": {
"id": "9QhSgdpxJl44"
}
},
{
"cell_type": "markdown",
"source": [
"Mari kita periksa distribusi masakan kita dan membandingkannya dengan data yang tidak seimbang.\n"
],
"metadata": {
"id": "dmidELh_LdV7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Distribution of cuisines\r\n",
"new_label_count <- preprocessed_df %>% \r\n",
" count(cuisine) %>% \r\n",
" arrange(desc(n))\r\n",
"\r\n",
"list(new_label_count = new_label_count,\r\n",
" old_label_count = old_label_count)"
],
"outputs": [],
"metadata": {
"id": "aSh23klBLwDz"
}
},
{
"cell_type": "markdown",
"source": [
"Yum! Datanya bersih, seimbang, dan sangat lezat 😋!\n",
"\n",
"> Biasanya, sebuah resep digunakan sebagai praprosesor untuk pemodelan di mana ia mendefinisikan langkah-langkah apa yang harus diterapkan pada kumpulan data agar siap untuk pemodelan. Dalam kasus tersebut, biasanya digunakan `workflow()` (seperti yang telah kita lihat di pelajaran sebelumnya) daripada memperkirakan resep secara manual.\n",
">\n",
"> Oleh karena itu, Anda biasanya tidak perlu menggunakan **`prep()`** dan **`bake()`** resep saat menggunakan tidymodels, tetapi fungsi-fungsi tersebut berguna untuk memastikan bahwa resep bekerja sesuai dengan yang Anda harapkan seperti dalam kasus kita.\n",
">\n",
"> Ketika Anda **`bake()`** sebuah resep yang telah dipersiapkan dengan **`new_data = NULL`**, Anda akan mendapatkan kembali data yang Anda berikan saat mendefinisikan resep, tetapi telah melalui langkah-langkah praproses.\n",
"\n",
"Sekarang mari kita simpan salinan data ini untuk digunakan di pelajaran mendatang:\n"
],
"metadata": {
"id": "HEu80HZ8L7ae"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Save preprocessed data\r\n",
"write_csv(preprocessed_df, \"../../../data/cleaned_cuisines_R.csv\")"
],
"outputs": [],
"metadata": {
"id": "cBmCbIgrMOI6"
}
},
{
"cell_type": "markdown",
"source": [
"CSV baru ini sekarang dapat ditemukan di folder data utama.\n",
"\n",
"**🚀Tantangan**\n",
"\n",
"Kurikulum ini berisi beberapa dataset yang menarik. Telusuri folder `data` dan lihat apakah ada dataset yang cocok untuk klasifikasi biner atau multi-kelas? Pertanyaan apa yang akan Anda ajukan terhadap dataset ini?\n",
"\n",
"## [**Kuis setelah kuliah**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/20/)\n",
"\n",
"## **Tinjauan & Studi Mandiri**\n",
"\n",
"- Lihat [paket themis](https://github.com/tidymodels/themis). Teknik lain apa yang bisa kita gunakan untuk menangani data yang tidak seimbang?\n",
"\n",
"- Situs referensi model Tidy [website referensi](https://www.tidymodels.org/start/).\n",
"\n",
"- H. Wickham dan G. Grolemund, [*R untuk Ilmu Data: Visualisasi, Model, Transformasi, Penataan, dan Impor Data*](https://r4ds.had.co.nz/).\n",
"\n",
"#### TERIMA KASIH KEPADA:\n",
"\n",
"[`Allison Horst`](https://twitter.com/allison_horst/) atas ilustrasi luar biasa yang membuat R lebih ramah dan menarik. Temukan lebih banyak ilustrasi di [galerinya](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM).\n",
"\n",
"[Cassie Breviu](https://www.twitter.com/cassieview) dan [Jen Looper](https://www.twitter.com/jenlooper) atas pembuatan versi Python asli dari modul ini ♥️\n",
"\n",
"<p >\n",
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
" width=\"600\"/>\n",
" <figcaption>Karya seni oleh @allison_horst</figcaption>\n"
],
"metadata": {
"id": "WQs5621pMGwf"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Penafian**: \nDokumen ini telah diterjemahkan menggunakan layanan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berupaya untuk memberikan hasil yang akurat, harap diperhatikan bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang berwenang. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa terjemahan manusia profesional. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini.\n"
]
}
]
}