{ "nbformat": 4, "nbformat_minor": 2, "metadata": { "colab": { "name": "lesson_1-R.ipynb", "provenance": [], "collapsed_sections": [], "toc_visible": true }, "kernelspec": { "name": "ir", "display_name": "R" }, "language_info": { "name": "R" }, "coopTranslator": { "original_hash": "c18d3bd0bd8ae3878597e89dcd1fa5c1", "translation_date": "2025-09-04T07:09:48+00:00", "source_file": "2-Regression/1-Tools/solution/R/lesson_1-R.ipynb", "language_code": "id" } }, "cells": [ { "cell_type": "markdown", "source": [], "metadata": { "id": "YJUHCXqK57yz" } }, { "cell_type": "markdown", "source": [ "## Pengantar ke Regresi - Pelajaran 1\n", "\n", "#### Memahami dalam konteks\n", "\n", "✅ Ada banyak jenis metode regresi, dan pilihan metode tergantung pada jawaban yang ingin Anda cari. Jika Anda ingin memprediksi tinggi badan yang mungkin untuk seseorang berdasarkan usia tertentu, Anda akan menggunakan `linear regression`, karena Anda mencari **nilai numerik**. Jika Anda ingin mengetahui apakah jenis masakan tertentu harus dianggap vegan atau tidak, Anda mencari **penentuan kategori**, sehingga Anda akan menggunakan `logistic regression`. Anda akan mempelajari lebih lanjut tentang logistic regression nanti. Pikirkan beberapa pertanyaan yang dapat Anda ajukan dari data, dan metode mana yang lebih sesuai.\n", "\n", "Di bagian ini, Anda akan bekerja dengan [dataset kecil tentang diabetes](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html). Bayangkan Anda ingin menguji pengobatan untuk pasien diabetes. Model Machine Learning dapat membantu Anda menentukan pasien mana yang akan merespons pengobatan dengan lebih baik, berdasarkan kombinasi variabel. Bahkan model regresi yang sangat dasar, ketika divisualisasikan, dapat menunjukkan informasi tentang variabel yang dapat membantu Anda mengatur uji klinis teoritis Anda.\n", "\n", "Dengan demikian, mari kita mulai tugas ini!\n", "\n", "
\n",
" \n",
"
\n",
"\n",
"> glimpse() dan slice() adalah fungsi dalam [`dplyr`](https://dplyr.tidyverse.org/). Dplyr, bagian dari Tidyverse, adalah tata bahasa manipulasi data yang menyediakan serangkaian kata kerja konsisten untuk membantu Anda menyelesaikan tantangan manipulasi data yang paling umum.\n",
"\n",
"
\n",
"\n",
"Sekarang kita memiliki data, mari kita fokus pada satu fitur (`bmi`) untuk dijadikan target dalam latihan ini. Ini akan membutuhkan kita untuk memilih kolom yang diinginkan. Jadi, bagaimana cara melakukannya?\n",
"\n",
"[`dplyr::select()`](https://dplyr.tidyverse.org/reference/select.html) memungkinkan kita untuk *memilih* (dan secara opsional mengganti nama) kolom dalam sebuah data frame.\n"
],
"metadata": {
"id": "UwjVT1Hz-c3Z"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Select predictor feature `bmi` and outcome `y`\r\n",
"diabetes_select <- diabetes %>% \r\n",
" select(c(bmi, y))\r\n",
"\r\n",
"# Print the first 5 rows\r\n",
"diabetes_select %>% \r\n",
" slice(1:10)"
],
"outputs": [],
"metadata": {
"id": "RDY1oAKI-m80"
}
},
{
"cell_type": "markdown",
"source": [
"## 3. Data Pelatihan dan Pengujian\n",
"\n",
"Dalam pembelajaran terawasi, adalah praktik umum untuk *membagi* data menjadi dua subset; satu set (biasanya lebih besar) untuk melatih model, dan satu set \"cadangan\" yang lebih kecil untuk melihat bagaimana kinerja model.\n",
"\n",
"Sekarang kita memiliki data yang siap, kita dapat melihat apakah mesin dapat membantu menentukan pembagian logis antara angka-angka dalam dataset ini. Kita dapat menggunakan paket [rsample](https://tidymodels.github.io/rsample/), yang merupakan bagian dari kerangka kerja Tidymodels, untuk membuat sebuah objek yang berisi informasi tentang *bagaimana* membagi data, dan kemudian dua fungsi rsample lainnya untuk mengekstrak set pelatihan dan pengujian yang telah dibuat:\n"
],
"metadata": {
"id": "SDk668xK-tc3"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"set.seed(2056)\r\n",
"# Split 67% of the data for training and the rest for tesing\r\n",
"diabetes_split <- diabetes_select %>% \r\n",
" initial_split(prop = 0.67)\r\n",
"\r\n",
"# Extract the resulting train and test sets\r\n",
"diabetes_train <- training(diabetes_split)\r\n",
"diabetes_test <- testing(diabetes_split)\r\n",
"\r\n",
"# Print the first 3 rows of the training set\r\n",
"diabetes_train %>% \r\n",
" slice(1:10)"
],
"outputs": [],
"metadata": {
"id": "EqtHx129-1h-"
}
},
{
"cell_type": "markdown",
"source": [
"## 4. Melatih model regresi linear dengan Tidymodels\n",
"\n",
"Sekarang kita siap untuk melatih model kita!\n",
"\n",
"Dalam Tidymodels, Anda menentukan model menggunakan `parsnip()` dengan menyebutkan tiga konsep:\n",
"\n",
"- **Tipe model** membedakan jenis model seperti regresi linear, regresi logistik, model pohon keputusan, dan sebagainya.\n",
"\n",
"- **Mode model** mencakup opsi umum seperti regresi dan klasifikasi; beberapa tipe model mendukung salah satu dari ini, sementara yang lain hanya memiliki satu mode.\n",
"\n",
"- **Mesin model** adalah alat komputasi yang akan digunakan untuk menyesuaikan model. Sering kali ini adalah paket R, seperti **`\"lm\"`** atau **`\"ranger\"`**\n",
"\n",
"Informasi pemodelan ini ditangkap dalam spesifikasi model, jadi mari kita buat satu!\n"
],
"metadata": {
"id": "sBOS-XhB-6v7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Build a linear model specification\r\n",
"lm_spec <- \r\n",
" # Type\r\n",
" linear_reg() %>% \r\n",
" # Engine\r\n",
" set_engine(\"lm\") %>% \r\n",
" # Mode\r\n",
" set_mode(\"regression\")\r\n",
"\r\n",
"\r\n",
"# Print the model specification\r\n",
"lm_spec"
],
"outputs": [],
"metadata": {
"id": "20OwEw20--t3"
}
},
{
"cell_type": "markdown",
"source": [
"Setelah sebuah model *ditentukan*, model tersebut dapat `diestimasi` atau `dilatih` menggunakan fungsi [`fit()`](https://parsnip.tidymodels.org/reference/fit.html), biasanya dengan menggunakan formula dan beberapa data.\n",
"\n",
"`y ~ .` berarti kita akan memodelkan `y` sebagai kuantitas/target yang diprediksi, dijelaskan oleh semua prediktor/fitur yaitu `.` (dalam kasus ini, kita hanya memiliki satu prediktor: `bmi`).\n"
],
"metadata": {
"id": "_oDHs89k_CJj"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Build a linear model specification\r\n",
"lm_spec <- linear_reg() %>% \r\n",
" set_engine(\"lm\") %>%\r\n",
" set_mode(\"regression\")\r\n",
"\r\n",
"\r\n",
"# Train a linear regression model\r\n",
"lm_mod <- lm_spec %>% \r\n",
" fit(y ~ ., data = diabetes_train)\r\n",
"\r\n",
"# Print the model\r\n",
"lm_mod"
],
"outputs": [],
"metadata": {
"id": "YlsHqd-q_GJQ"
}
},
{
"cell_type": "markdown",
"source": [
"Dari keluaran model, kita dapat melihat koefisien yang dipelajari selama pelatihan. Koefisien tersebut mewakili koefisien dari garis terbaik yang memberikan kesalahan keseluruhan terendah antara variabel aktual dan yang diprediksi.\n",
"
\n",
"\n",
"## 5. Membuat prediksi pada set uji\n",
"\n",
"Sekarang setelah kita melatih model, kita dapat menggunakannya untuk memprediksi progresi penyakit y pada dataset uji menggunakan [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html). Ini akan digunakan untuk menggambar garis di antara kelompok data.\n"
],
"metadata": {
"id": "kGZ22RQj_Olu"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Make predictions for the test set\r\n",
"predictions <- lm_mod %>% \r\n",
" predict(new_data = diabetes_test)\r\n",
"\r\n",
"# Print out some of the predictions\r\n",
"predictions %>% \r\n",
" slice(1:5)"
],
"outputs": [],
"metadata": {
"id": "nXHbY7M2_aao"
}
},
{
"cell_type": "markdown",
"source": [
"Woohoo! 💃🕺 Kami baru saja melatih sebuah model dan menggunakannya untuk membuat prediksi!\n",
"\n",
"Saat membuat prediksi, konvensi tidymodels adalah selalu menghasilkan tibble/data frame hasil dengan nama kolom yang sudah distandarisasi. Hal ini mempermudah penggabungan data asli dan prediksi dalam format yang dapat digunakan untuk operasi selanjutnya seperti membuat plot.\n",
"\n",
"`dplyr::bind_cols()` secara efisien menggabungkan beberapa data frame berdasarkan kolom.\n"
],
"metadata": {
"id": "R_JstwUY_bIs"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Combine the predictions and the original test set\r\n",
"results <- diabetes_test %>% \r\n",
" bind_cols(predictions)\r\n",
"\r\n",
"\r\n",
"results %>% \r\n",
" slice(1:5)"
],
"outputs": [],
"metadata": {
"id": "RybsMJR7_iI8"
}
},
{
"cell_type": "markdown",
"source": [
"## 6. Plot hasil pemodelan\n",
"\n",
"Sekarang saatnya melihat ini secara visual 📈. Kita akan membuat scatter plot dari semua nilai `y` dan `bmi` pada set pengujian, lalu menggunakan prediksi untuk menggambar garis di tempat yang paling sesuai, di antara pengelompokan data model.\n",
"\n",
"R memiliki beberapa sistem untuk membuat grafik, tetapi `ggplot2` adalah salah satu yang paling elegan dan paling serbaguna. Ini memungkinkan Anda untuk menyusun grafik dengan **menggabungkan komponen independen**.\n"
],
"metadata": {
"id": "XJbYbMZW_n_s"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Set a theme for the plot\r\n",
"theme_set(theme_light())\r\n",
"# Create a scatter plot\r\n",
"results %>% \r\n",
" ggplot(aes(x = bmi)) +\r\n",
" # Add a scatter plot\r\n",
" geom_point(aes(y = y), size = 1.6) +\r\n",
" # Add a line plot\r\n",
" geom_line(aes(y = .pred), color = \"blue\", size = 1.5)"
],
"outputs": [],
"metadata": {
"id": "R9tYp3VW_sTn"
}
},
{
"cell_type": "markdown",
"source": [
"✅ Pikirkan sebentar tentang apa yang sedang terjadi di sini. Sebuah garis lurus melewati banyak titik kecil data, tetapi apa sebenarnya yang sedang dilakukan? Bisakah kamu melihat bagaimana garis ini seharusnya dapat digunakan untuk memprediksi di mana titik data baru yang belum terlihat seharusnya berada dalam hubungannya dengan sumbu y pada plot? Cobalah untuk menjelaskan dengan kata-kata kegunaan praktis dari model ini.\n",
"\n",
"Selamat, kamu telah membuat model regresi linear pertama, membuat prediksi dengannya, dan menampilkannya dalam sebuah plot!\n"
],
"metadata": {
"id": "zrPtHIxx_tNI"
}
},
{
"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"
]
}
]
}