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.
1086 lines
43 KiB
1086 lines
43 KiB
{
|
|
"nbformat": 4,
|
|
"nbformat_minor": 2,
|
|
"metadata": {
|
|
"colab": {
|
|
"name": "lesson_3-R.ipynb",
|
|
"provenance": [],
|
|
"collapsed_sections": [],
|
|
"toc_visible": true
|
|
},
|
|
"kernelspec": {
|
|
"name": "ir",
|
|
"display_name": "R"
|
|
},
|
|
"language_info": {
|
|
"name": "R"
|
|
},
|
|
"coopTranslator": {
|
|
"original_hash": "5015d65d61ba75a223bfc56c273aa174",
|
|
"translation_date": "2025-09-04T06:40:00+00:00",
|
|
"source_file": "2-Regression/3-Linear/solution/R/lesson_3-R.ipynb",
|
|
"language_code": "id"
|
|
}
|
|
},
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [],
|
|
"metadata": {
|
|
"id": "EgQw8osnsUV-"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## Regresi Linear dan Polinomial untuk Penentuan Harga Labu - Pelajaran 3\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/linear-polynomial.png\"\n",
|
|
" width=\"800\"/>\n",
|
|
" <figcaption>Infografis oleh Dasani Madipalli</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"<!--{width=\"800\"}-->\n",
|
|
"\n",
|
|
"#### Pendahuluan\n",
|
|
"\n",
|
|
"Sejauh ini, Anda telah mempelajari apa itu regresi dengan data sampel yang diambil dari dataset harga labu yang akan kita gunakan sepanjang pelajaran ini. Anda juga telah memvisualisasikannya menggunakan `ggplot2`.💪\n",
|
|
"\n",
|
|
"Sekarang Anda siap untuk mendalami regresi dalam pembelajaran mesin. Dalam pelajaran ini, Anda akan mempelajari lebih lanjut tentang dua jenis regresi: *regresi linear dasar* dan *regresi polinomial*, beserta beberapa konsep matematika yang mendasari teknik-teknik ini.\n",
|
|
"\n",
|
|
"> Sepanjang kurikulum ini, kami mengasumsikan pengetahuan matematika yang minimal, dan berusaha membuatnya dapat diakses oleh siswa dari berbagai bidang, jadi perhatikan catatan, 🧮 penjelasan, diagram, dan alat pembelajaran lainnya untuk membantu pemahaman.\n",
|
|
"\n",
|
|
"#### Persiapan\n",
|
|
"\n",
|
|
"Sebagai pengingat, Anda memuat data ini untuk menjawab pertanyaan-pertanyaan berikut.\n",
|
|
"\n",
|
|
"- Kapan waktu terbaik untuk membeli labu?\n",
|
|
"\n",
|
|
"- Berapa harga yang dapat saya harapkan untuk satu kotak labu mini?\n",
|
|
"\n",
|
|
"- Haruskah saya membelinya dalam keranjang setengah bushel atau dalam kotak bushel 1 1/9? Mari kita terus menggali data ini.\n",
|
|
"\n",
|
|
"Dalam pelajaran sebelumnya, Anda telah membuat `tibble` (reimajinasi modern dari kerangka data) dan mengisinya dengan sebagian dari dataset asli, menstandarkan harga berdasarkan bushel. Namun, dengan melakukan itu, Anda hanya dapat mengumpulkan sekitar 400 data poin dan hanya untuk bulan-bulan musim gugur. Mungkin kita bisa mendapatkan sedikit lebih banyak detail tentang sifat data ini dengan membersihkannya lebih lanjut? Kita akan lihat... 🕵️♀️\n",
|
|
"\n",
|
|
"Untuk tugas ini, kita memerlukan paket-paket berikut:\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",
|
|
"- `janitor`: Paket [janitor](https://github.com/sfirke/janitor) menyediakan alat sederhana untuk memeriksa dan membersihkan data yang kotor.\n",
|
|
"\n",
|
|
"- `corrplot`: Paket [corrplot](https://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html) menyediakan alat eksplorasi visual pada matriks korelasi yang mendukung pengurutan variabel otomatis untuk membantu mendeteksi pola tersembunyi di antara variabel.\n",
|
|
"\n",
|
|
"Anda dapat menginstalnya dengan:\n",
|
|
"\n",
|
|
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"janitor\", \"corrplot\"))`\n",
|
|
"\n",
|
|
"Script di bawah ini memeriksa apakah Anda memiliki paket-paket yang diperlukan untuk menyelesaikan modul ini dan menginstalnya untuk Anda jika ada yang belum terpasang.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "WqQPS1OAsg3H"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"suppressWarnings(if (!require(\"pacman\")) install.packages(\"pacman\"))\n",
|
|
"\n",
|
|
"pacman::p_load(tidyverse, tidymodels, janitor, corrplot)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "tA4C2WN3skCf",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/"
|
|
},
|
|
"outputId": "c06cd805-5534-4edc-f72b-d0d1dab96ac0"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Kami 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",
|
|
"\n",
|
|
"## 1. Garis regresi linear\n",
|
|
"\n",
|
|
"Seperti yang Anda pelajari di Pelajaran 1, tujuan dari latihan regresi linear adalah untuk dapat menggambar *garis* *terbaik* *yang sesuai* untuk:\n",
|
|
"\n",
|
|
"- **Menunjukkan hubungan variabel**. Menunjukkan hubungan antara variabel-variabel.\n",
|
|
"\n",
|
|
"- **Membuat prediksi**. Membuat prediksi yang akurat tentang di mana titik data baru akan berada dalam hubungannya dengan garis tersebut.\n",
|
|
"\n",
|
|
"Untuk menggambar jenis garis ini, kita menggunakan teknik statistik yang disebut **Regresi Kuadrat Terkecil**. Istilah `kuadrat terkecil` berarti semua titik data di sekitar garis regresi dikuadratkan dan kemudian dijumlahkan. Idealnya, jumlah akhir ini sekecil mungkin, karena kita menginginkan jumlah kesalahan yang rendah, atau `kuadrat terkecil`. Oleh karena itu, garis terbaik adalah garis yang memberikan nilai terendah untuk jumlah kesalahan kuadrat - itulah sebabnya disebut *regresi kuadrat terkecil*.\n",
|
|
"\n",
|
|
"Kita melakukan ini karena kita ingin memodelkan garis yang memiliki jarak kumulatif terkecil dari semua titik data kita. Kita juga mengkuadratkan istilah sebelum menjumlahkannya karena kita lebih peduli pada besarnya nilai daripada arahnya.\n",
|
|
"\n",
|
|
"> **🧮 Tunjukkan matematikanya**\n",
|
|
">\n",
|
|
"> Garis ini, yang disebut *garis terbaik yang sesuai* dapat dinyatakan dengan [sebuah persamaan](https://en.wikipedia.org/wiki/Simple_linear_regression):\n",
|
|
">\n",
|
|
"> Y = a + bX\n",
|
|
">\n",
|
|
"> `X` adalah '`variabel penjelas` atau `prediktor`'. `Y` adalah '`variabel dependen` atau `hasil`'. Kemiringan garis adalah `b` dan `a` adalah titik potong sumbu y, yang merujuk pada nilai `Y` ketika `X = 0`.\n",
|
|
">\n",
|
|
"\n",
|
|
"> \n",
|
|
" Infografik oleh Jen Looper\n",
|
|
">\n",
|
|
"> Pertama, hitung kemiringan `b`.\n",
|
|
">\n",
|
|
"> Dengan kata lain, dan merujuk pada pertanyaan awal data labu kita: \"prediksi harga labu per gantang berdasarkan bulan\", `X` akan merujuk pada harga dan `Y` akan merujuk pada bulan penjualan.\n",
|
|
">\n",
|
|
"> \n",
|
|
" Infografik oleh Jen Looper\n",
|
|
"> \n",
|
|
"> Hitung nilai Y. Jika Anda membayar sekitar \\$4, itu pasti bulan April!\n",
|
|
">\n",
|
|
"> Matematika yang menghitung garis ini harus menunjukkan kemiringan garis, yang juga bergantung pada titik potong, atau di mana `Y` berada ketika `X = 0`.\n",
|
|
">\n",
|
|
"> Anda dapat mengamati metode perhitungan untuk nilai-nilai ini di situs web [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html). Juga kunjungi [Kalkulator Kuadrat Terkecil](https://www.mathsisfun.com/data/least-squares-calculator.html) untuk melihat bagaimana nilai-nilai angka memengaruhi garis.\n",
|
|
"\n",
|
|
"Tidak terlalu menakutkan, kan? 🤓\n",
|
|
"\n",
|
|
"#### Korelasi\n",
|
|
"\n",
|
|
"Satu istilah lagi yang perlu dipahami adalah **Koefisien Korelasi** antara variabel X dan Y yang diberikan. Dengan menggunakan scatterplot, Anda dapat dengan cepat memvisualisasikan koefisien ini. Plot dengan titik data yang tersebar dalam garis rapi memiliki korelasi tinggi, tetapi plot dengan titik data yang tersebar di mana-mana antara X dan Y memiliki korelasi rendah.\n",
|
|
"\n",
|
|
"Model regresi linear yang baik adalah model yang memiliki Koefisien Korelasi tinggi (lebih dekat ke 1 daripada 0) menggunakan metode Regresi Kuadrat Terkecil dengan garis regresi.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "cdX5FRpvsoP5"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## **2. Menari dengan data: membuat data frame yang akan digunakan untuk pemodelan**\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/janitor.jpg\"\n",
|
|
" width=\"700\"/>\n",
|
|
" <figcaption>Karya seni oleh @allison_horst</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"<!--{width=\"700\"}-->\n"
|
|
],
|
|
"metadata": {
|
|
"id": "WdUKXk7Bs8-V"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Muat pustaka dan dataset yang diperlukan. Ubah data menjadi data frame yang berisi subset data:\n",
|
|
"\n",
|
|
"- Hanya ambil labu yang dihargai per keranjang\n",
|
|
"\n",
|
|
"- Ubah tanggal menjadi bulan\n",
|
|
"\n",
|
|
"- Hitung harga sebagai rata-rata dari harga tertinggi dan terendah\n",
|
|
"\n",
|
|
"- Ubah harga agar mencerminkan harga berdasarkan jumlah keranjang\n",
|
|
"\n",
|
|
"> Kami telah membahas langkah-langkah ini di [pelajaran sebelumnya](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/2-Data/solution/lesson_2-R.ipynb).\n"
|
|
],
|
|
"metadata": {
|
|
"id": "fMCtu2G2s-p8"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Load the core Tidyverse packages\n",
|
|
"library(tidyverse)\n",
|
|
"library(lubridate)\n",
|
|
"\n",
|
|
"# Import the pumpkins data\n",
|
|
"pumpkins <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/2-Regression/data/US-pumpkins.csv\")\n",
|
|
"\n",
|
|
"\n",
|
|
"# Get a glimpse and dimensions of the data\n",
|
|
"glimpse(pumpkins)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Print the first 50 rows of the data set\n",
|
|
"pumpkins %>% \n",
|
|
" slice_head(n = 5)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "ryMVZEEPtERn"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Dalam semangat petualangan murni, mari kita jelajahi [`paket janitor`](../../../../../../2-Regression/3-Linear/solution/R/github.com/sfirke/janitor) yang menyediakan fungsi sederhana untuk memeriksa dan membersihkan data yang kotor. Sebagai contoh, mari kita lihat nama kolom untuk data kita:\n"
|
|
],
|
|
"metadata": {
|
|
"id": "xcNxM70EtJjb"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Return column names\n",
|
|
"pumpkins %>% \n",
|
|
" names()"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "5XtpaIigtPfW"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"🤔 Kita bisa melakukan lebih baik. Mari kita ubah nama kolom ini menjadi `friendR` dengan mengonversinya ke konvensi [snake_case](https://en.wikipedia.org/wiki/Snake_case) menggunakan `janitor::clean_names`. Untuk mengetahui lebih lanjut tentang fungsi ini: `?clean_names`\n"
|
|
],
|
|
"metadata": {
|
|
"id": "IbIqrMINtSHe"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Clean names to the snake_case convention\n",
|
|
"pumpkins <- pumpkins %>% \n",
|
|
" clean_names(case = \"snake\")\n",
|
|
"\n",
|
|
"# Return column names\n",
|
|
"pumpkins %>% \n",
|
|
" names()"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "a2uYvclYtWvX"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Sangat rapiR 🧹! Sekarang, menari dengan data menggunakan `dplyr` seperti di pelajaran sebelumnya! 💃\n"
|
|
],
|
|
"metadata": {
|
|
"id": "HfhnuzDDtaDd"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Select desired columns\n",
|
|
"pumpkins <- pumpkins %>% \n",
|
|
" select(variety, city_name, package, low_price, high_price, date)\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"# Extract the month from the dates to a new column\n",
|
|
"pumpkins <- pumpkins %>%\n",
|
|
" mutate(date = mdy(date),\n",
|
|
" month = month(date)) %>% \n",
|
|
" select(-date)\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"# Create a new column for average Price\n",
|
|
"pumpkins <- pumpkins %>% \n",
|
|
" mutate(price = (low_price + high_price)/2)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Retain only pumpkins with the string \"bushel\"\n",
|
|
"new_pumpkins <- pumpkins %>% \n",
|
|
" filter(str_detect(string = package, pattern = \"bushel\"))\n",
|
|
"\n",
|
|
"\n",
|
|
"# Normalize the pricing so that you show the pricing per bushel, not per 1 1/9 or 1/2 bushel\n",
|
|
"new_pumpkins <- new_pumpkins %>% \n",
|
|
" mutate(price = case_when(\n",
|
|
" str_detect(package, \"1 1/9\") ~ price/(1.1),\n",
|
|
" str_detect(package, \"1/2\") ~ price*2,\n",
|
|
" TRUE ~ price))\n",
|
|
"\n",
|
|
"# Relocate column positions\n",
|
|
"new_pumpkins <- new_pumpkins %>% \n",
|
|
" relocate(month, .before = variety)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Display the first 5 rows\n",
|
|
"new_pumpkins %>% \n",
|
|
" slice_head(n = 5)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "X0wU3gQvtd9f"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Kerja bagus!👌 Sekarang kamu memiliki kumpulan data yang bersih dan rapi untuk membangun model regresi baru kamu!\n",
|
|
"\n",
|
|
"Bagaimana dengan plot pencar?\n"
|
|
],
|
|
"metadata": {
|
|
"id": "UpaIwaxqth82"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Set theme\n",
|
|
"theme_set(theme_light())\n",
|
|
"\n",
|
|
"# Make a scatter plot of month and price\n",
|
|
"new_pumpkins %>% \n",
|
|
" ggplot(mapping = aes(x = month, y = price)) +\n",
|
|
" geom_point(size = 1.6)\n"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "DXgU-j37tl5K"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Sebuah scatter plot mengingatkan kita bahwa kita hanya memiliki data bulan dari Agustus hingga Desember. Kita mungkin membutuhkan lebih banyak data untuk dapat menarik kesimpulan secara linear.\n",
|
|
"\n",
|
|
"Mari kita lihat kembali data pemodelan kita:\n"
|
|
],
|
|
"metadata": {
|
|
"id": "Ve64wVbwtobI"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Display first 5 rows\n",
|
|
"new_pumpkins %>% \n",
|
|
" slice_head(n = 5)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "HFQX2ng1tuSJ"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Bagaimana jika kita ingin memprediksi `price` dari sebuah labu berdasarkan kolom `city` atau `package` yang bertipe karakter? Atau bahkan lebih sederhana, bagaimana kita bisa menemukan korelasi (yang membutuhkan kedua inputnya berupa nilai numerik) antara, misalnya, `package` dan `price`? 🤷🤷\n",
|
|
"\n",
|
|
"Model pembelajaran mesin bekerja paling baik dengan fitur numerik daripada nilai teks, jadi biasanya Anda perlu mengonversi fitur kategorikal menjadi representasi numerik.\n",
|
|
"\n",
|
|
"Ini berarti kita harus menemukan cara untuk merombak prediktor kita agar lebih mudah digunakan oleh model secara efektif, sebuah proses yang dikenal sebagai `feature engineering`.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "7hsHoxsStyjJ"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## 3. Praproses data untuk pemodelan dengan recipes 👩🍳👨🍳\n",
|
|
"\n",
|
|
"Aktivitas yang mengubah nilai prediktor agar lebih mudah digunakan oleh model secara efektif disebut `rekayasa fitur`.\n",
|
|
"\n",
|
|
"Berbagai model memiliki kebutuhan praproses yang berbeda. Sebagai contoh, metode kuadrat terkecil membutuhkan `pengkodean variabel kategorikal` seperti bulan, varietas, dan nama_kota. Ini melibatkan `mengubah` kolom dengan `nilai kategorikal` menjadi satu atau lebih `kolom numerik` yang menggantikan kolom asli.\n",
|
|
"\n",
|
|
"Sebagai contoh, misalkan data Anda mencakup fitur kategorikal berikut:\n",
|
|
"\n",
|
|
"| kota |\n",
|
|
"|:-------:|\n",
|
|
"| Denver |\n",
|
|
"| Nairobi |\n",
|
|
"| Tokyo |\n",
|
|
"\n",
|
|
"Anda dapat menerapkan *ordinal encoding* untuk mengganti setiap kategori dengan nilai integer unik, seperti ini:\n",
|
|
"\n",
|
|
"| kota |\n",
|
|
"|:----:|\n",
|
|
"| 0 |\n",
|
|
"| 1 |\n",
|
|
"| 2 |\n",
|
|
"\n",
|
|
"Dan itulah yang akan kita lakukan pada data kita!\n",
|
|
"\n",
|
|
"Di bagian ini, kita akan menjelajahi paket Tidymodels yang luar biasa lainnya: [recipes](https://tidymodels.github.io/recipes/) - yang dirancang untuk membantu Anda memproses data **sebelum** melatih model Anda. Pada intinya, sebuah recipe adalah objek yang mendefinisikan langkah-langkah apa yang harus diterapkan pada sebuah data set agar siap untuk pemodelan.\n",
|
|
"\n",
|
|
"Sekarang, mari kita buat sebuah recipe yang mempersiapkan data kita untuk pemodelan dengan mengganti setiap pengamatan di kolom prediktor dengan integer unik:\n"
|
|
],
|
|
"metadata": {
|
|
"id": "AD5kQbcvt3Xl"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Specify a recipe\n",
|
|
"pumpkins_recipe <- recipe(price ~ ., data = new_pumpkins) %>% \n",
|
|
" step_integer(all_predictors(), zero_based = TRUE)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Print out the recipe\n",
|
|
"pumpkins_recipe"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "BNaFKXfRt9TU"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Hebat! 👏 Kita baru saja membuat resep pertama yang menentukan hasil (harga) dan prediktor yang sesuai, serta memastikan semua kolom prediktor dikodekan menjadi serangkaian bilangan bulat 🙌! Mari kita uraikan dengan cepat:\n",
|
|
"\n",
|
|
"- Pemanggilan `recipe()` dengan formula memberi tahu resep tentang *peran* variabel menggunakan data `new_pumpkins` sebagai referensi. Misalnya, kolom `price` telah diberikan peran sebagai `outcome`, sementara kolom lainnya diberikan peran sebagai `predictor`.\n",
|
|
"\n",
|
|
"- `step_integer(all_predictors(), zero_based = TRUE)` menentukan bahwa semua prediktor harus dikonversi menjadi serangkaian bilangan bulat dengan penomoran dimulai dari 0.\n",
|
|
"\n",
|
|
"Kami yakin Anda mungkin berpikir seperti: \"Ini keren banget!! Tapi bagaimana jika saya perlu memastikan bahwa resep ini benar-benar melakukan apa yang saya harapkan? 🤔\"\n",
|
|
"\n",
|
|
"Itu pemikiran yang luar biasa! Anda lihat, setelah resep Anda didefinisikan, Anda dapat memperkirakan parameter yang diperlukan untuk benar-benar memproses data, lalu mengekstrak data yang telah diproses. Anda biasanya tidak perlu melakukan ini saat menggunakan Tidymodels (kita akan melihat konvensi normalnya sebentar lagi-\\> `workflows`), tetapi ini bisa berguna saat Anda ingin melakukan semacam pemeriksaan untuk memastikan bahwa resep melakukan apa yang Anda harapkan.\n",
|
|
"\n",
|
|
"Untuk itu, Anda memerlukan dua kata kerja tambahan: `prep()` dan `bake()`, dan seperti biasa, teman kecil kita dari R oleh [`Allison Horst`](https://github.com/allisonhorst/stats-illustrations) akan membantu Anda memahami ini dengan lebih baik!\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/recipes.png\"\n",
|
|
" width=\"550\"/>\n",
|
|
" <figcaption>Karya seni oleh @allison_horst</figcaption>\n"
|
|
],
|
|
"metadata": {
|
|
"id": "KEiO0v7kuC9O"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"[`prep()`](https://recipes.tidymodels.org/reference/prep.html): memperkirakan parameter yang diperlukan dari set pelatihan yang nantinya dapat diterapkan ke set data lainnya. Sebagai contoh, untuk kolom prediktor tertentu, pengamatan mana yang akan diberi nilai integer 0, 1, 2, dan seterusnya.\n",
|
|
"\n",
|
|
"[`bake()`](https://recipes.tidymodels.org/reference/bake.html): mengambil resep yang telah dipersiapkan dan menerapkan operasi tersebut ke set data apa pun.\n",
|
|
"\n",
|
|
"Dengan demikian, mari kita persiapkan dan terapkan resep kita untuk benar-benar memastikan bahwa di balik layar, kolom prediktor akan terlebih dahulu dikodekan sebelum model diterapkan.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "Q1xtzebuuTCP"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Prep the recipe\n",
|
|
"pumpkins_prep <- prep(pumpkins_recipe)\n",
|
|
"\n",
|
|
"# Bake the recipe to extract a preprocessed new_pumpkins data\n",
|
|
"baked_pumpkins <- bake(pumpkins_prep, new_data = NULL)\n",
|
|
"\n",
|
|
"# Print out the baked data set\n",
|
|
"baked_pumpkins %>% \n",
|
|
" slice_head(n = 10)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "FGBbJbP_uUUn"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Woo-hoo!🥳 Data yang telah diproses `baked_pumpkins` memiliki semua prediktor yang telah dikodekan, mengonfirmasi bahwa langkah-langkah praproses yang didefinisikan sebagai resep kita akan bekerja seperti yang diharapkan. Hal ini membuatnya lebih sulit untuk dibaca oleh Anda, tetapi jauh lebih mudah dipahami oleh Tidymodels! Luangkan waktu untuk mencari tahu pengamatan mana yang telah dipetakan ke bilangan bulat yang sesuai.\n",
|
|
"\n",
|
|
"Perlu juga disebutkan bahwa `baked_pumpkins` adalah data frame yang dapat kita gunakan untuk melakukan perhitungan.\n",
|
|
"\n",
|
|
"Sebagai contoh, mari kita coba mencari korelasi yang baik antara dua poin data Anda untuk berpotensi membangun model prediktif yang baik. Kita akan menggunakan fungsi `cor()` untuk melakukan ini. Ketik `?cor()` untuk mengetahui lebih lanjut tentang fungsi tersebut.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "1dvP0LBUueAW"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Find the correlation between the city_name and the price\n",
|
|
"cor(baked_pumpkins$city_name, baked_pumpkins$price)\n",
|
|
"\n",
|
|
"# Find the correlation between the package and the price\n",
|
|
"cor(baked_pumpkins$package, baked_pumpkins$price)\n"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "3bQzXCjFuiSV"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Ternyata, hanya ada korelasi yang lemah antara Kota dan Harga. Namun, terdapat korelasi yang sedikit lebih baik antara Paket dan Harganya. Masuk akal, bukan? Biasanya, semakin besar kotak produk, semakin tinggi harganya.\n",
|
|
"\n",
|
|
"Sambil kita membahas ini, mari kita coba juga memvisualisasikan matriks korelasi dari semua kolom menggunakan paket `corrplot`.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "BToPWbgjuoZw"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Load the corrplot package\n",
|
|
"library(corrplot)\n",
|
|
"\n",
|
|
"# Obtain correlation matrix\n",
|
|
"corr_mat <- cor(baked_pumpkins %>% \n",
|
|
" # Drop columns that are not really informative\n",
|
|
" select(-c(low_price, high_price)))\n",
|
|
"\n",
|
|
"# Make a correlation plot between the variables\n",
|
|
"corrplot(corr_mat, method = \"shade\", shade.col = NA, tl.col = \"black\", tl.srt = 45, addCoef.col = \"black\", cl.pos = \"n\", order = \"original\")"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "ZwAL3ksmutVR"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"🤩🤩 Jauh lebih baik.\n",
|
|
"\n",
|
|
"Pertanyaan yang bagus untuk diajukan sekarang adalah: '`Berapa harga yang bisa saya harapkan untuk paket labu tertentu?`' Mari kita langsung mulai!\n",
|
|
"\n",
|
|
"> Catatan: Ketika Anda **`bake()`** resep yang telah disiapkan **`pumpkins_prep`** dengan **`new_data = NULL`**, Anda akan mendapatkan data pelatihan yang telah diproses (misalnya, yang telah dikodekan). Jika Anda memiliki data lain, misalnya data uji, dan ingin melihat bagaimana resep akan memprosesnya, Anda cukup memanggang **`pumpkins_prep`** dengan **`new_data = test_set`**\n",
|
|
"\n",
|
|
"## 4. Membangun model regresi linear\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/linear-polynomial.png\"\n",
|
|
" width=\"800\"/>\n",
|
|
" <figcaption>Infografis oleh Dasani Madipalli</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"<!--{width=\"800\"}-->\n"
|
|
],
|
|
"metadata": {
|
|
"id": "YqXjLuWavNxW"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Sekarang kita telah membuat resep, dan benar-benar memastikan bahwa data akan diproses sebelumnya dengan tepat, mari kita buat model regresi untuk menjawab pertanyaan: `Berapa harga yang dapat saya harapkan dari sebuah paket labu tertentu?`\n",
|
|
"\n",
|
|
"#### Melatih model regresi linear menggunakan set pelatihan\n",
|
|
"\n",
|
|
"Seperti yang mungkin sudah Anda ketahui, kolom *price* adalah variabel `outcome` sementara kolom *package* adalah variabel `predictor`.\n",
|
|
"\n",
|
|
"Untuk melakukan ini, pertama-tama kita akan membagi data sehingga 80% masuk ke set pelatihan dan 20% ke set pengujian, kemudian mendefinisikan resep yang akan mengkodekan kolom predictor menjadi serangkaian bilangan bulat, lalu membangun spesifikasi model. Kita tidak akan mempersiapkan dan memanggang resep kita karena kita sudah tahu bahwa itu akan memproses data seperti yang diharapkan.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "Pq0bSzCevW-h"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"set.seed(2056)\n",
|
|
"# Split the data into training and test sets\n",
|
|
"pumpkins_split <- new_pumpkins %>% \n",
|
|
" initial_split(prop = 0.8)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Extract training and test data\n",
|
|
"pumpkins_train <- training(pumpkins_split)\n",
|
|
"pumpkins_test <- testing(pumpkins_split)\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"# Create a recipe for preprocessing the data\n",
|
|
"lm_pumpkins_recipe <- recipe(price ~ package, data = pumpkins_train) %>% \n",
|
|
" step_integer(all_predictors(), zero_based = TRUE)\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"# Create a linear model specification\n",
|
|
"lm_spec <- linear_reg() %>% \n",
|
|
" set_engine(\"lm\") %>% \n",
|
|
" set_mode(\"regression\")"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "CyoEh_wuvcLv"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Kerja bagus! Sekarang kita sudah memiliki resep dan spesifikasi model, kita perlu mencari cara untuk menggabungkan keduanya menjadi sebuah objek yang akan terlebih dahulu melakukan pra-pemrosesan data (prep+bake di balik layar), melatih model pada data yang telah diproses, dan juga memungkinkan aktivitas pasca-pemrosesan jika diperlukan. Bagaimana, cukup menenangkan bukan!🤩\n",
|
|
"\n",
|
|
"Dalam Tidymodels, objek praktis ini disebut [`workflow`](https://workflows.tidymodels.org/) dan dengan mudah menyimpan komponen pemodelan Anda! Ini adalah apa yang kita sebut *pipelines* dalam *Python*.\n",
|
|
"\n",
|
|
"Jadi, mari kita gabungkan semuanya ke dalam sebuah workflow!📦\n"
|
|
],
|
|
"metadata": {
|
|
"id": "G3zF_3DqviFJ"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Hold modelling components in a workflow\n",
|
|
"lm_wf <- workflow() %>% \n",
|
|
" add_recipe(lm_pumpkins_recipe) %>% \n",
|
|
" add_model(lm_spec)\n",
|
|
"\n",
|
|
"# Print out the workflow\n",
|
|
"lm_wf"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "T3olroU3v-WX"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Sebagai tambahan, sebuah alur kerja dapat disesuaikan/dilatih dengan cara yang hampir sama seperti sebuah model.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "zd1A5tgOwEPX"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Train the model\n",
|
|
"lm_wf_fit <- lm_wf %>% \n",
|
|
" fit(data = pumpkins_train)\n",
|
|
"\n",
|
|
"# Print the model coefficients learned \n",
|
|
"lm_wf_fit"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "NhJagFumwFHf"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Dari output 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 prediksi.\n",
|
|
"\n",
|
|
"#### Mengevaluasi kinerja model menggunakan set pengujian\n",
|
|
"\n",
|
|
"Saatnya melihat bagaimana kinerja model 📏! Bagaimana cara melakukannya?\n",
|
|
"\n",
|
|
"Sekarang setelah kita melatih model, kita dapat menggunakannya untuk membuat prediksi pada `test_set` menggunakan `parsnip::predict()`. Kemudian kita dapat membandingkan prediksi ini dengan nilai label aktual untuk mengevaluasi seberapa baik (atau tidak!) model bekerja.\n",
|
|
"\n",
|
|
"Mari kita mulai dengan membuat prediksi untuk set pengujian lalu menggabungkan kolom-kolom tersebut ke set pengujian.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "_4QkGtBTwItF"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Make predictions for the test set\n",
|
|
"predictions <- lm_wf_fit %>% \n",
|
|
" predict(new_data = pumpkins_test)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Bind predictions to the test set\n",
|
|
"lm_results <- pumpkins_test %>% \n",
|
|
" select(c(package, price)) %>% \n",
|
|
" bind_cols(predictions)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Print the first ten rows of the tibble\n",
|
|
"lm_results %>% \n",
|
|
" slice_head(n = 10)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "UFZzTG0gwTs9"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Ya, Anda baru saja melatih sebuah model dan menggunakannya untuk membuat prediksi! 🔮 Apakah hasilnya bagus? Mari kita evaluasi kinerja modelnya!\n",
|
|
"\n",
|
|
"Dalam Tidymodels, kita melakukan ini menggunakan `yardstick::metrics()`! Untuk regresi linear, mari kita fokus pada metrik berikut:\n",
|
|
"\n",
|
|
"- `Root Mean Square Error (RMSE)`: Akar kuadrat dari [MSE](https://en.wikipedia.org/wiki/Mean_squared_error). Ini menghasilkan metrik absolut dalam satuan yang sama dengan label (dalam kasus ini, harga labu). Semakin kecil nilainya, semakin baik modelnya (secara sederhana, ini mewakili rata-rata harga di mana prediksi salah!).\n",
|
|
"\n",
|
|
"- `Coefficient of Determination (biasanya dikenal sebagai R-squared atau R2)`: Metrik relatif di mana semakin tinggi nilainya, semakin baik kecocokan model. Pada dasarnya, metrik ini mewakili seberapa banyak variansi antara nilai label yang diprediksi dan aktual yang dapat dijelaskan oleh model.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "0A5MjzM7wW9M"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Evaluate performance of linear regression\n",
|
|
"metrics(data = lm_results,\n",
|
|
" truth = price,\n",
|
|
" estimate = .pred)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "reJ0UIhQwcEH"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Di sana kinerja model menurun. Mari kita lihat apakah kita bisa mendapatkan indikasi yang lebih baik dengan memvisualisasikan plot sebar paket dan harga, lalu menggunakan prediksi yang dibuat untuk menambahkan garis kecocokan terbaik.\n",
|
|
"\n",
|
|
"Ini berarti kita harus mempersiapkan dan memproses set pengujian untuk mengkodekan kolom paket, lalu menggabungkannya dengan prediksi yang dibuat oleh model kita.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "fdgjzjkBwfWt"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Encode package column\n",
|
|
"package_encode <- lm_pumpkins_recipe %>% \n",
|
|
" prep() %>% \n",
|
|
" bake(new_data = pumpkins_test) %>% \n",
|
|
" select(package)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Bind encoded package column to the results\n",
|
|
"lm_results <- lm_results %>% \n",
|
|
" bind_cols(package_encode %>% \n",
|
|
" rename(package_integer = package)) %>% \n",
|
|
" relocate(package_integer, .after = package)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Print new results data frame\n",
|
|
"lm_results %>% \n",
|
|
" slice_head(n = 5)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Make a scatter plot\n",
|
|
"lm_results %>% \n",
|
|
" ggplot(mapping = aes(x = package_integer, y = price)) +\n",
|
|
" geom_point(size = 1.6) +\n",
|
|
" # Overlay a line of best fit\n",
|
|
" geom_line(aes(y = .pred), color = \"orange\", size = 1.2) +\n",
|
|
" xlab(\"package\")\n",
|
|
" \n"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "R0nw719lwkHE"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Hebat! Seperti yang dapat Anda lihat, model regresi linear tidak benar-benar mampu menggeneralisasi hubungan antara sebuah paket dan harga yang sesuai.\n",
|
|
"\n",
|
|
"🎃 Selamat, Anda baru saja membuat model yang dapat membantu memprediksi harga beberapa jenis labu. Kebun labu Anda untuk liburan akan terlihat indah. Namun, Anda mungkin bisa membuat model yang lebih baik!\n",
|
|
"\n",
|
|
"## 5. Membangun model regresi polinomial\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/linear-polynomial.png\"\n",
|
|
" width=\"800\"/>\n",
|
|
" <figcaption>Infografis oleh Dasani Madipalli</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"<!--{width=\"800\"}-->\n"
|
|
],
|
|
"metadata": {
|
|
"id": "HOCqJXLTwtWI"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Kadang-kadang data kita mungkin tidak memiliki hubungan linear, tetapi kita tetap ingin memprediksi hasil. Regresi polinomial dapat membantu kita membuat prediksi untuk hubungan non-linear yang lebih kompleks.\n",
|
|
"\n",
|
|
"Ambil contoh hubungan antara paket dan harga dalam kumpulan data labu kita. Meskipun kadang-kadang ada hubungan linear antara variabel - semakin besar volume labu, semakin tinggi harganya - kadang-kadang hubungan ini tidak dapat digambarkan sebagai bidang atau garis lurus.\n",
|
|
"\n",
|
|
"> ✅ Berikut adalah [beberapa contoh lainnya](https://online.stat.psu.edu/stat501/lesson/9/9.8) dari data yang dapat menggunakan regresi polinomial\n",
|
|
">\n",
|
|
"> Lihat kembali hubungan antara Varietas dan Harga pada plot sebelumnya. Apakah scatterplot ini tampaknya harus dianalisis dengan garis lurus? Mungkin tidak. Dalam kasus ini, Anda dapat mencoba regresi polinomial.\n",
|
|
">\n",
|
|
"> ✅ Polinomial adalah ekspresi matematika yang mungkin terdiri dari satu atau lebih variabel dan koefisien\n",
|
|
"\n",
|
|
"#### Melatih model regresi polinomial menggunakan set pelatihan\n",
|
|
"\n",
|
|
"Regresi polinomial menciptakan *garis melengkung* untuk lebih cocok dengan data non-linear.\n",
|
|
"\n",
|
|
"Mari kita lihat apakah model polinomial akan memberikan performa yang lebih baik dalam membuat prediksi. Kita akan mengikuti prosedur yang agak mirip seperti sebelumnya:\n",
|
|
"\n",
|
|
"- Membuat resep yang menentukan langkah-langkah praproses yang harus dilakukan pada data kita agar siap untuk pemodelan, yaitu: encoding prediktor dan menghitung polinomial dengan derajat *n*\n",
|
|
"\n",
|
|
"- Membangun spesifikasi model\n",
|
|
"\n",
|
|
"- Menggabungkan resep dan spesifikasi model ke dalam sebuah alur kerja\n",
|
|
"\n",
|
|
"- Membuat model dengan menyesuaikan alur kerja\n",
|
|
"\n",
|
|
"- Mengevaluasi seberapa baik model bekerja pada data uji\n",
|
|
"\n",
|
|
"Mari kita mulai!\n"
|
|
],
|
|
"metadata": {
|
|
"id": "VcEIpRV9wzYr"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Specify a recipe\r\n",
|
|
"poly_pumpkins_recipe <-\r\n",
|
|
" recipe(price ~ package, data = pumpkins_train) %>%\r\n",
|
|
" step_integer(all_predictors(), zero_based = TRUE) %>% \r\n",
|
|
" step_poly(all_predictors(), degree = 4)\r\n",
|
|
"\r\n",
|
|
"\r\n",
|
|
"# Create a model specification\r\n",
|
|
"poly_spec <- linear_reg() %>% \r\n",
|
|
" set_engine(\"lm\") %>% \r\n",
|
|
" set_mode(\"regression\")\r\n",
|
|
"\r\n",
|
|
"\r\n",
|
|
"# Bundle recipe and model spec into a workflow\r\n",
|
|
"poly_wf <- workflow() %>% \r\n",
|
|
" add_recipe(poly_pumpkins_recipe) %>% \r\n",
|
|
" add_model(poly_spec)\r\n",
|
|
"\r\n",
|
|
"\r\n",
|
|
"# Create a model\r\n",
|
|
"poly_wf_fit <- poly_wf %>% \r\n",
|
|
" fit(data = pumpkins_train)\r\n",
|
|
"\r\n",
|
|
"\r\n",
|
|
"# Print learned model coefficients\r\n",
|
|
"poly_wf_fit\r\n",
|
|
"\r\n",
|
|
" "
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "63n_YyRXw3CC"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"#### Evaluasi kinerja model\n",
|
|
"\n",
|
|
"👏👏Kamu telah membuat model polinomial, mari kita buat prediksi pada set pengujian!\n"
|
|
],
|
|
"metadata": {
|
|
"id": "-LHZtztSxDP0"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Make price predictions on test data\r\n",
|
|
"poly_results <- poly_wf_fit %>% predict(new_data = pumpkins_test) %>% \r\n",
|
|
" bind_cols(pumpkins_test %>% select(c(package, price))) %>% \r\n",
|
|
" relocate(.pred, .after = last_col())\r\n",
|
|
"\r\n",
|
|
"\r\n",
|
|
"# Print the results\r\n",
|
|
"poly_results %>% \r\n",
|
|
" slice_head(n = 10)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "YUFpQ_dKxJGx"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Woo-hoo, mari kita evaluasi bagaimana model bekerja pada test_set menggunakan `yardstick::metrics()`.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "qxdyj86bxNGZ"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"metrics(data = poly_results, truth = price, estimate = .pred)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "8AW5ltkBxXDm"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"🤩🤩 Kinerja jauh lebih baik.\n",
|
|
"\n",
|
|
"`rmse` menurun dari sekitar 7 menjadi sekitar 3, menunjukkan adanya pengurangan kesalahan antara harga aktual dan harga prediksi. Anda dapat *secara bebas* menginterpretasikan ini sebagai rata-rata bahwa prediksi yang salah memiliki kesalahan sekitar \\$3. `rsq` meningkat dari sekitar 0.4 menjadi 0.8.\n",
|
|
"\n",
|
|
"Semua metrik ini menunjukkan bahwa model polinomial bekerja jauh lebih baik dibandingkan model linear. Kerja bagus!\n",
|
|
"\n",
|
|
"Mari kita lihat apakah kita bisa memvisualisasikannya!\n"
|
|
],
|
|
"metadata": {
|
|
"id": "6gLHNZDwxYaS"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Bind encoded package column to the results\r\n",
|
|
"poly_results <- poly_results %>% \r\n",
|
|
" bind_cols(package_encode %>% \r\n",
|
|
" rename(package_integer = package)) %>% \r\n",
|
|
" relocate(package_integer, .after = package)\r\n",
|
|
"\r\n",
|
|
"\r\n",
|
|
"# Print new results data frame\r\n",
|
|
"poly_results %>% \r\n",
|
|
" slice_head(n = 5)\r\n",
|
|
"\r\n",
|
|
"\r\n",
|
|
"# Make a scatter plot\r\n",
|
|
"poly_results %>% \r\n",
|
|
" ggplot(mapping = aes(x = package_integer, y = price)) +\r\n",
|
|
" geom_point(size = 1.6) +\r\n",
|
|
" # Overlay a line of best fit\r\n",
|
|
" geom_line(aes(y = .pred), color = \"midnightblue\", size = 1.2) +\r\n",
|
|
" xlab(\"package\")\r\n"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "A83U16frxdF1"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Anda dapat melihat garis lengkung yang lebih sesuai dengan data Anda! 🤩\n",
|
|
"\n",
|
|
"Anda dapat membuatnya lebih halus dengan memberikan rumus polinomial ke `geom_smooth` seperti ini:\n"
|
|
],
|
|
"metadata": {
|
|
"id": "4U-7aHOVxlGU"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Make a scatter plot\r\n",
|
|
"poly_results %>% \r\n",
|
|
" ggplot(mapping = aes(x = package_integer, y = price)) +\r\n",
|
|
" geom_point(size = 1.6) +\r\n",
|
|
" # Overlay a line of best fit\r\n",
|
|
" geom_smooth(method = lm, formula = y ~ poly(x, degree = 4), color = \"midnightblue\", size = 1.2, se = FALSE) +\r\n",
|
|
" xlab(\"package\")"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "5vzNT0Uexm-w"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Sama seperti kurva yang mulus!🤩\n",
|
|
"\n",
|
|
"Berikut cara membuat prediksi baru:\n"
|
|
],
|
|
"metadata": {
|
|
"id": "v9u-wwyLxq4G"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Make a hypothetical data frame\r\n",
|
|
"hypo_tibble <- tibble(package = \"bushel baskets\")\r\n",
|
|
"\r\n",
|
|
"# Make predictions using linear model\r\n",
|
|
"lm_pred <- lm_wf_fit %>% predict(new_data = hypo_tibble)\r\n",
|
|
"\r\n",
|
|
"# Make predictions using polynomial model\r\n",
|
|
"poly_pred <- poly_wf_fit %>% predict(new_data = hypo_tibble)\r\n",
|
|
"\r\n",
|
|
"# Return predictions in a list\r\n",
|
|
"list(\"linear model prediction\" = lm_pred, \r\n",
|
|
" \"polynomial model prediction\" = poly_pred)\r\n"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "jRPSyfQGxuQv"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Prediksi menggunakan `polynomial model` memang masuk akal, mengingat plot sebar `price` dan `package`! Dan, jika ini adalah model yang lebih baik dibandingkan model sebelumnya, berdasarkan data yang sama, Anda perlu menganggarkan untuk labu yang lebih mahal ini!\n",
|
|
"\n",
|
|
"🏆 Kerja bagus! Anda telah membuat dua model regresi dalam satu pelajaran. Pada bagian terakhir tentang regresi, Anda akan belajar tentang regresi logistik untuk menentukan kategori.\n",
|
|
"\n",
|
|
"## **🚀Tantangan**\n",
|
|
"\n",
|
|
"Uji beberapa variabel berbeda dalam notebook ini untuk melihat bagaimana korelasi berhubungan dengan akurasi model.\n",
|
|
"\n",
|
|
"## [**Kuis setelah pelajaran**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/14/)\n",
|
|
"\n",
|
|
"## **Tinjauan & Studi Mandiri**\n",
|
|
"\n",
|
|
"Dalam pelajaran ini kita belajar tentang Regresi Linear. Ada jenis Regresi penting lainnya. Bacalah tentang teknik Stepwise, Ridge, Lasso, dan Elasticnet. Kursus yang bagus untuk mempelajari lebih lanjut adalah [Stanford Statistical Learning course](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning).\n",
|
|
"\n",
|
|
"Jika Anda ingin belajar lebih banyak tentang cara menggunakan kerangka kerja Tidymodels yang luar biasa, silakan cek sumber daya berikut:\n",
|
|
"\n",
|
|
"- Situs web Tidymodels: [Mulai dengan Tidymodels](https://www.tidymodels.org/start/)\n",
|
|
"\n",
|
|
"- Max Kuhn dan Julia Silge, [*Tidy Modeling with R*](https://www.tmwr.org/)*.*\n",
|
|
"\n",
|
|
"###### **TERIMA KASIH KEPADA:**\n",
|
|
"\n",
|
|
"[Allison Horst](https://twitter.com/allison_horst?lang=en) 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"
|
|
],
|
|
"metadata": {
|
|
"id": "8zOLOWqMxzk5"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"\n---\n\n**Penafian**: \nDokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berupaya untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini.\n"
|
|
]
|
|
}
|
|
]
|
|
} |