{ "nbformat": 4, "nbformat_minor": 2, "metadata": { "colab": { "name": "lesson_2-R.ipynb", "provenance": [], "collapsed_sections": [], "toc_visible": true }, "kernelspec": { "name": "ir", "display_name": "R" }, "language_info": { "name": "R" }, "coopTranslator": { "original_hash": "f3c335f9940cfd76528b3ef918b9b342", "translation_date": "2025-09-04T07:24:29+00:00", "source_file": "2-Regression/2-Data/solution/R/lesson_2-R.ipynb", "language_code": "id" } }, "cells": [ { "cell_type": "markdown", "source": [ "# Membangun Model Regresi: Persiapkan dan Visualisasikan Data\n", "\n", "## **Regresi Linear untuk Labu - Pelajaran 2**\n", "#### Pendahuluan\n", "\n", "Sekarang setelah Anda memiliki alat yang diperlukan untuk mulai membangun model pembelajaran mesin menggunakan Tidymodels dan Tidyverse, Anda siap untuk mulai mengajukan pertanyaan tentang data Anda. Saat bekerja dengan data dan menerapkan solusi ML, sangat penting untuk memahami cara mengajukan pertanyaan yang tepat agar dapat memanfaatkan potensi dataset Anda dengan baik.\n", "\n", "Dalam pelajaran ini, Anda akan belajar:\n", "\n", "- Cara mempersiapkan data Anda untuk membangun model.\n", "\n", "- Cara menggunakan `ggplot2` untuk visualisasi data.\n", "\n", "Pertanyaan yang perlu Anda jawab akan menentukan jenis algoritma ML yang akan Anda gunakan. Dan kualitas jawaban yang Anda dapatkan sangat bergantung pada sifat data Anda.\n", "\n", "Mari kita lihat ini melalui latihan praktis.\n", "\n", "\n", "
\n",
" \n",
"
\n",
"\n",
"> Pengingat: Operator pipe (`%>%`) melakukan operasi dalam urutan logis dengan meneruskan sebuah objek ke depan ke dalam fungsi atau ekspresi panggilan. Anda dapat menganggap operator pipe seperti mengatakan \"dan kemudian\" dalam kode Anda.\n"
],
"metadata": {
"id": "REWcIv9yX29v"
}
},
{
"cell_type": "markdown",
"source": [
"## 2. Periksa data yang hilang\n",
"\n",
"Salah satu masalah paling umum yang harus dihadapi oleh ilmuwan data adalah data yang tidak lengkap atau hilang. R merepresentasikan nilai yang hilang, atau tidak diketahui, dengan nilai sentinel khusus: `NA` (Not Available).\n",
"\n",
"Jadi, bagaimana kita mengetahui bahwa data frame mengandung nilai yang hilang?\n",
"
\n",
"- Salah satu cara yang sederhana adalah menggunakan fungsi dasar R `anyNA` yang mengembalikan objek logis `TRUE` atau `FALSE`.\n"
],
"metadata": {
"id": "Zxfb3AM5YbUe"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"pumpkins %>% \n",
" anyNA()"
],
"outputs": [],
"metadata": {
"id": "G--DQutAYltj"
}
},
{
"cell_type": "markdown",
"source": [
"Bagus, sepertinya ada beberapa data yang hilang! Itu adalah tempat yang baik untuk memulai.\n",
"\n",
"- Cara lain adalah dengan menggunakan fungsi `is.na()` yang menunjukkan elemen kolom mana yang hilang dengan nilai logis `TRUE`.\n"
],
"metadata": {
"id": "mU-7-SB6YokF"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"pumpkins %>% \n",
" is.na() %>% \n",
" head(n = 7)"
],
"outputs": [],
"metadata": {
"id": "W-DxDOR4YxSW"
}
},
{
"cell_type": "markdown",
"source": [
"Oke, pekerjaan selesai, tetapi dengan data frame besar seperti ini, akan tidak efisien dan hampir mustahil untuk meninjau semua baris dan kolom satu per satuπ΄.\n",
"\n",
"- Cara yang lebih intuitif adalah dengan menghitung jumlah nilai yang hilang untuk setiap kolom:\n"
],
"metadata": {
"id": "xUWxipKYY0o7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"pumpkins %>% \n",
" is.na() %>% \n",
" colSums()"
],
"outputs": [],
"metadata": {
"id": "ZRBWV6P9ZArL"
}
},
{
"cell_type": "markdown",
"source": [
"Jauh lebih baik! Ada data yang hilang, tetapi mungkin itu tidak akan menjadi masalah untuk tugas ini. Mari kita lihat apa yang akan dihasilkan analisis lebih lanjut.\n",
"\n",
"> Selain kumpulan paket dan fungsi yang luar biasa, R memiliki dokumentasi yang sangat baik. Sebagai contoh, gunakan `help(colSums)` atau `?colSums` untuk mengetahui lebih lanjut tentang fungsi tersebut.\n"
],
"metadata": {
"id": "9gv-crB6ZD1Y"
}
},
{
"cell_type": "markdown",
"source": [
"## 3. Dplyr: Tata Bahasa Manipulasi Data\n",
"\n",
"
\n",
" \n",
"
\n"
],
"metadata": {
"id": "nIgLjNMCZ-6Y"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Create a new column Price\n",
"pumpkins <- pumpkins %>% \n",
" mutate(Price = (`Low Price` + `High Price`)/2)\n",
"\n",
"# View the first few rows of the data\n",
"pumpkins %>% \n",
" slice_head(n = 5)"
],
"outputs": [],
"metadata": {
"id": "Zo0BsqqtaJw2"
}
},
{
"cell_type": "markdown",
"source": [
"Yeees!πͺ\n",
"\n",
"\"Tapi tunggu!\", Anda akan berkata setelah melihat seluruh data dengan `View(pumpkins)`, \"Ada sesuatu yang aneh di sini!\"π€\n",
"\n",
"Jika Anda melihat kolom `Package`, labu dijual dalam berbagai konfigurasi. Beberapa dijual dalam ukuran `1 1/9 bushel`, beberapa dalam ukuran `1/2 bushel`, beberapa per labu, beberapa per pon, dan beberapa dalam kotak besar dengan lebar yang bervariasi.\n",
"\n",
"Mari kita verifikasi ini:\n"
],
"metadata": {
"id": "p77WZr-9aQAR"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Verify the distinct observations in Package column\n",
"pumpkins %>% \n",
" distinct(Package)"
],
"outputs": [],
"metadata": {
"id": "XISGfh0IaUy6"
}
},
{
"cell_type": "markdown",
"source": [
"Luar Biasa!π\n",
"\n",
"Labu tampaknya sangat sulit untuk ditimbang secara konsisten, jadi mari kita menyaringnya dengan memilih hanya labu yang memiliki string *bushel* di kolom `Package` dan memasukkannya ke dalam kerangka data baru `new_pumpkins`.\n"
],
"metadata": {
"id": "7sMjiVujaZxY"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::filter() dan stringr::str_detect()\n",
"\n",
"[`dplyr::filter()`](https://dplyr.tidyverse.org/reference/filter.html): membuat subset data yang hanya berisi **baris** yang memenuhi kondisi Anda, dalam hal ini, labu dengan string *bushel* di kolom `Package`.\n",
"\n",
"[stringr::str_detect()](https://stringr.tidyverse.org/reference/str_detect.html): mendeteksi keberadaan atau ketiadaan pola dalam sebuah string.\n",
"\n",
"Paket [`stringr`](https://github.com/tidyverse/stringr) menyediakan fungsi sederhana untuk operasi string yang umum.\n"
],
"metadata": {
"id": "L8Qfcs92ageF"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Retain only pumpkins with \"bushel\"\n",
"new_pumpkins <- pumpkins %>% \n",
" filter(str_detect(Package, \"bushel\"))\n",
"\n",
"# Get the dimensions of the new data\n",
"dim(new_pumpkins)\n",
"\n",
"# View a few rows of the new data\n",
"new_pumpkins %>% \n",
" slice_head(n = 5)"
],
"outputs": [],
"metadata": {
"id": "hy_SGYREampd"
}
},
{
"cell_type": "markdown",
"source": [
"Anda dapat melihat bahwa kami telah mempersempitnya menjadi sekitar 415 baris data yang berisi labu per keranjang.π€©\n",
"
\n"
],
"metadata": {
"id": "VrDwF031avlR"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::case_when()\n",
"\n",
"**Tapi tunggu! Masih ada satu hal lagi yang perlu dilakukan**\n",
"\n",
"Apakah Anda memperhatikan bahwa jumlah bushel berbeda di setiap baris? Anda perlu menormalkan harga sehingga Anda menampilkan harga per bushel, bukan per 1 1/9 atau 1/2 bushel. Saatnya melakukan beberapa perhitungan untuk menstandarkan ini.\n",
"\n",
"Kita akan menggunakan fungsi [`case_when()`](https://dplyr.tidyverse.org/reference/case_when.html) untuk *memodifikasi* kolom Price berdasarkan beberapa kondisi. `case_when` memungkinkan Anda memvektorisasi beberapa pernyataan `if_else()`.\n"
],
"metadata": {
"id": "mLpw2jH4a0tx"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Convert the price if the Package contains fractional bushel values\n",
"new_pumpkins <- new_pumpkins %>% \n",
" mutate(Price = case_when(\n",
" str_detect(Package, \"1 1/9\") ~ Price/(1 + 1/9),\n",
" str_detect(Package, \"1/2\") ~ Price/(1/2),\n",
" TRUE ~ Price))\n",
"\n",
"# View the first few rows of the data\n",
"new_pumpkins %>% \n",
" slice_head(n = 30)"
],
"outputs": [],
"metadata": {
"id": "P68kLVQmbM6I"
}
},
{
"cell_type": "markdown",
"source": [
"Sekarang, kita bisa menganalisis harga per unit berdasarkan ukuran bushel mereka. Semua studi tentang bushel labu ini, bagaimanapun, menunjukkan betapa `pentingnya` untuk `memahami sifat data Anda`!\n",
"\n",
"> β
Menurut [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308), berat bushel tergantung pada jenis hasil panen, karena ini adalah pengukuran volume. \"Satu bushel tomat, misalnya, seharusnya memiliki berat 56 pon... Daun dan sayuran hijau mengambil lebih banyak ruang dengan berat yang lebih sedikit, sehingga satu bushel bayam hanya memiliki berat 20 pon.\" Semuanya cukup rumit! Mari kita tidak repot-repot membuat konversi bushel ke pon, dan sebagai gantinya menetapkan harga berdasarkan bushel. Semua studi tentang bushel labu ini, bagaimanapun, menunjukkan betapa pentingnya untuk memahami sifat data Anda!\n",
">\n",
"> β
Apakah Anda memperhatikan bahwa labu yang dijual per setengah bushel sangat mahal? Bisakah Anda mencari tahu alasannya? Petunjuk: labu kecil jauh lebih mahal daripada yang besar, mungkin karena ada jauh lebih banyak labu kecil per bushel, mengingat ruang kosong yang tidak terpakai yang diambil oleh satu labu pai besar yang berongga.\n"
],
"metadata": {
"id": "pS2GNPagbSdb"
}
},
{
"cell_type": "markdown",
"source": [
"Sekarang terakhir, demi petualangan semata πββοΈ, mari kita pindahkan kolom Bulan ke posisi pertama yaitu `sebelum` kolom `Package`.\n",
"\n",
"`dplyr::relocate()` digunakan untuk mengubah posisi kolom.\n"
],
"metadata": {
"id": "qql1SowfbdnP"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Create a new data frame new_pumpkins\n",
"new_pumpkins <- new_pumpkins %>% \n",
" relocate(Month, .before = Package)\n",
"\n",
"new_pumpkins %>% \n",
" slice_head(n = 7)"
],
"outputs": [],
"metadata": {
"id": "JJ1x6kw8bixF"
}
},
{
"cell_type": "markdown",
"source": [
"Kerja bagus!π Sekarang Anda memiliki dataset yang bersih dan rapi untuk membangun model regresi baru Anda!\n"
],
"metadata": {
"id": "y8TJ0Za_bn5Y"
}
},
{
"cell_type": "markdown",
"source": [
"## 4. Visualisasi data dengan ggplot2\n",
"\n",
"
\n",
" \n",
"
\n"
],
"metadata": {
"id": "Ml7SDCLQcPvE"
}
},
{
"cell_type": "markdown",
"source": [
"### **Bagaimana cara membuatnya berguna?**\n",
"\n",
"Untuk menampilkan grafik dengan data yang bermanfaat, biasanya Anda perlu mengelompokkan data dengan cara tertentu. Misalnya, dalam kasus kita, menemukan harga rata-rata labu untuk setiap bulan akan memberikan wawasan lebih tentang pola yang mendasari data kita. Hal ini membawa kita ke satu lagi fitur **dplyr**:\n",
"\n",
"#### `dplyr::group_by() %>% summarize()`\n",
"\n",
"Agregasi terkelompok dalam R dapat dengan mudah dihitung menggunakan\n",
"\n",
"`dplyr::group_by() %>% summarize()`\n",
"\n",
"- `dplyr::group_by()` mengubah unit analisis dari keseluruhan dataset menjadi kelompok individu seperti per bulan.\n",
"\n",
"- `dplyr::summarize()` membuat data frame baru dengan satu kolom untuk setiap variabel pengelompokan dan satu kolom untuk setiap statistik ringkasan yang telah Anda tentukan.\n",
"\n",
"Sebagai contoh, kita dapat menggunakan `dplyr::group_by() %>% summarize()` untuk mengelompokkan labu berdasarkan kolom **Month** dan kemudian menemukan **harga rata-rata** untuk setiap bulan.\n"
],
"metadata": {
"id": "jMakvJZIcVkh"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Find the average price of pumpkins per month\r\n",
"new_pumpkins %>%\r\n",
" group_by(Month) %>% \r\n",
" summarise(mean_price = mean(Price))"
],
"outputs": [],
"metadata": {
"id": "6kVSUa2Bcilf"
}
},
{
"cell_type": "markdown",
"source": [
"Ringkas!β¨\n",
"\n",
"Fitur kategorikal seperti bulan lebih baik direpresentasikan menggunakan plot batang π. Lapisan yang bertanggung jawab untuk diagram batang adalah `geom_bar()` dan `geom_col()`. Lihat `?geom_bar` untuk mengetahui lebih lanjut.\n",
"\n",
"Mari kita buat satu!\n"
],
"metadata": {
"id": "Kds48GUBcj3W"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Find the average price of pumpkins per month then plot a bar chart\r\n",
"new_pumpkins %>%\r\n",
" group_by(Month) %>% \r\n",
" summarise(mean_price = mean(Price)) %>% \r\n",
" ggplot(aes(x = Month, y = mean_price)) +\r\n",
" geom_col(fill = \"midnightblue\", alpha = 0.7) +\r\n",
" ylab(\"Pumpkin Price\")"
],
"outputs": [],
"metadata": {
"id": "VNbU1S3BcrxO"
}
},
{
"cell_type": "markdown",
"source": [
"π€©π€©Ini adalah visualisasi data yang lebih berguna! Tampaknya menunjukkan bahwa harga tertinggi untuk labu terjadi pada bulan September dan Oktober. Apakah itu sesuai dengan ekspektasimu? Mengapa atau mengapa tidak?\n",
"\n",
"Selamat telah menyelesaikan pelajaran kedua π! Kamu telah mempersiapkan data untuk membangun model, lalu menemukan lebih banyak wawasan menggunakan visualisasi!\n"
],
"metadata": {
"id": "zDm0VOzzcuzR"
}
},
{
"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 penerjemah manusia profesional. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini.\n"
]
}
]
}