{ "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-06T11:54:32+00:00", "source_file": "2-Regression/2-Data/solution/R/lesson_2-R.ipynb", "language_code": "ms" } }, "cells": [ { "cell_type": "markdown", "source": [ "# Bina model regresi: sediakan dan visualkan data\n", "\n", "## **Regresi Linear untuk Labu - Pelajaran 2**\n", "#### Pengenalan\n", "\n", "Sekarang anda telah dilengkapi dengan alat yang diperlukan untuk mula membina model pembelajaran mesin menggunakan Tidymodels dan Tidyverse, anda bersedia untuk mula bertanya soalan kepada data anda. Semasa anda bekerja dengan data dan menerapkan penyelesaian ML, adalah sangat penting untuk memahami cara bertanya soalan yang betul untuk membuka potensi dataset anda dengan tepat.\n", "\n", "Dalam pelajaran ini, anda akan belajar:\n", "\n", "- Cara menyediakan data anda untuk pembinaan model.\n", "\n", "- Cara menggunakan `ggplot2` untuk visualisasi data.\n", "\n", "Soalan yang perlu dijawab akan menentukan jenis algoritma ML yang akan anda gunakan. Dan kualiti jawapan yang anda peroleh sangat bergantung pada sifat data anda.\n", "\n", "Mari kita lihat ini dengan melalui latihan praktikal.\n", "\n", "\n", "
\n",
" \n",
"
\n",
"\n",
"> Ulang kaji: Operator paip (`%>%`) melaksanakan operasi dalam urutan logik dengan menghantar objek ke hadapan ke dalam fungsi atau ekspresi panggilan. Anda boleh menganggap operator paip sebagai mengatakan \"dan kemudian\" dalam kod anda.\n"
],
"metadata": {
"id": "REWcIv9yX29v"
}
},
{
"cell_type": "markdown",
"source": [
"## 2. Periksa data yang hilang\n",
"\n",
"Salah satu isu paling biasa yang perlu ditangani oleh saintis data ialah data yang tidak lengkap atau hilang. R mewakili nilai yang hilang, atau tidak diketahui, dengan nilai sentinel khas: `NA` (Not Available).\n",
"\n",
"Jadi, bagaimana kita tahu bahawa rangka data mengandungi nilai yang hilang?\n",
"
\n",
"- Salah satu cara yang mudah adalah dengan menggunakan fungsi asas R `anyNA` yang mengembalikan objek logik `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": [
"Hebat, nampaknya ada beberapa data yang hilang! Itu adalah tempat yang baik untuk bermula.\n",
"\n",
"- Cara lain adalah dengan menggunakan fungsi `is.na()` yang menunjukkan elemen lajur individu yang hilang dengan nilai logik `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": [
"Baiklah, sudah selesai tetapi dengan bingkai data yang besar seperti ini, ia akan menjadi tidak efisien dan hampir mustahil untuk menyemak semua baris dan lajur secara individuπ΄.\n",
"\n",
"- Cara yang lebih intuitif adalah dengan mengira jumlah nilai yang hilang untuk setiap lajur:\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": [
"Data yang hilang mungkin tidak menjadi masalah untuk tugasan ini. Mari kita lihat apa yang akan dibawa oleh analisis lanjut.\n",
"\n",
"> Bersama-sama dengan set pakej dan fungsi yang hebat, R mempunyai 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: Tatabahasa untuk Manipulasi Data\n",
"\n",
"
\n",
" \n",
"
\n"
],
"metadata": {
"id": "VrDwF031avlR"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::case_when()\n",
"\n",
"**Tapi tunggu! Ada satu perkara lagi yang perlu dilakukan**\n",
"\n",
"Adakah anda perasan bahawa jumlah bushel berbeza untuk setiap baris? Anda perlu menormalkan harga supaya anda menunjukkan harga per bushel, bukan per 1 1/9 atau 1/2 bushel. Masa untuk melakukan sedikit matematik untuk menyeragamkannya.\n",
"\n",
"Kita akan menggunakan fungsi [`case_when()`](https://dplyr.tidyverse.org/reference/case_when.html) untuk *mutate* lajur Harga bergantung kepada beberapa syarat. `case_when` membolehkan anda memvektorkan 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 boleh menganalisis harga per unit berdasarkan ukuran bushel mereka. Namun, semua kajian tentang bushel labu ini 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 bergantung pada jenis hasil tanaman, kerana ia adalah ukuran isipadu. \"Sebagai contoh, satu bushel tomato sepatutnya mempunyai berat 56 paun... Daun dan sayur-sayuran mengambil lebih banyak ruang dengan berat yang kurang, jadi satu bushel bayam hanya 20 paun.\" Semuanya agak rumit! Jangan susahkan diri dengan membuat penukaran bushel kepada paun, sebaliknya tetapkan harga berdasarkan bushel. Namun, semua kajian tentang bushel labu ini menunjukkan betapa pentingnya untuk memahami sifat data anda!\n",
">\n",
"> β
Adakah anda perasan bahawa labu yang dijual dalam setengah bushel sangat mahal? Bolehkah anda fikirkan sebabnya? Petunjuk: labu kecil jauh lebih mahal daripada yang besar, mungkin kerana terdapat lebih banyak labu kecil dalam satu bushel, memandangkan ruang yang tidak digunakan oleh satu labu pai besar yang berongga.\n"
],
"metadata": {
"id": "pS2GNPagbSdb"
}
},
{
"cell_type": "markdown",
"source": [
"Sekarang akhirnya, demi sedikit pengembaraan πββοΈ, mari kita pindahkan juga lajur Bulan ke posisi pertama iaitu `sebelum` lajur `Pakej`.\n",
"\n",
"`dplyr::relocate()` digunakan untuk menukar kedudukan lajur.\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 yang bagus!π Anda kini mempunyai set data yang bersih dan teratur untuk membina model regresi baharu 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 kita menjadikannya berguna?**\n",
"\n",
"Untuk memaparkan carta dengan data yang berguna, anda biasanya perlu mengelompokkan data dengan cara tertentu. Sebagai contoh, dalam kes kita, mencari harga purata labu untuk setiap bulan akan memberikan lebih banyak pandangan terhadap corak asas dalam data kita. Ini membawa kita kepada satu lagi ciri **dplyr**:\n",
"\n",
"#### `dplyr::group_by() %>% summarize()`\n",
"\n",
"Pengagregatan berkelompok dalam R boleh dikira dengan mudah menggunakan\n",
"\n",
"`dplyr::group_by() %>% summarize()`\n",
"\n",
"- `dplyr::group_by()` mengubah unit analisis daripada keseluruhan dataset kepada kumpulan individu seperti setiap bulan.\n",
"\n",
"- `dplyr::summarize()` mencipta kerangka data baharu dengan satu lajur untuk setiap pembolehubah pengelompokan dan satu lajur untuk setiap statistik ringkasan yang telah anda tentukan.\n",
"\n",
"Sebagai contoh, kita boleh menggunakan `dplyr::group_by() %>% summarize()` untuk mengelompokkan labu berdasarkan lajur **Month** dan kemudian mencari **harga purata** 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",
"Ciri-ciri kategori seperti bulan lebih sesuai diwakili menggunakan plot bar π. Lapisan yang bertanggungjawab untuk carta bar adalah `geom_bar()` dan `geom_col()`. Rujuk `?geom_bar` untuk mengetahui lebih lanjut.\n",
"\n",
"Jom 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! Ia kelihatan menunjukkan bahawa harga tertinggi untuk labu berlaku pada bulan September dan Oktober. Adakah itu memenuhi jangkaan anda? Mengapa atau mengapa tidak?\n",
"\n",
"Tahniah kerana telah menyelesaikan pelajaran kedua π! Anda telah menyediakan data anda untuk pembinaan model, kemudian menemui lebih banyak maklumat menggunakan visualisasi!\n"
],
"metadata": {
"id": "zDm0VOzzcuzR"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Penafian**: \nDokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Walaupun kami berusaha untuk memastikan ketepatan, sila ambil perhatian bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya harus dianggap sebagai sumber yang berwibawa. Untuk maklumat yang kritikal, terjemahan manusia profesional adalah disyorkan. Kami tidak bertanggungjawab atas sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini.\n"
]
}
]
}