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.
670 lines
24 KiB
670 lines
24 KiB
{
|
|
"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",
|
|
"<p >\n",
|
|
" <img src=\"../../images/unruly_data.jpg\"\n",
|
|
" width=\"700\"/>\n",
|
|
" <figcaption>Karya seni oleh @allison_horst</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"<!--<br>Karya seni oleh \\@allison_horst-->\n"
|
|
],
|
|
"metadata": {
|
|
"id": "Pg5aexcOPqAZ"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## 1. Mengimport data labu dan memanggil Tidyverse\n",
|
|
"\n",
|
|
"Kita akan memerlukan pakej-pakej berikut untuk memproses dan menganalisis pelajaran ini:\n",
|
|
"\n",
|
|
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) adalah [koleksi pakej R](https://www.tidyverse.org/packages) yang direka untuk menjadikan sains data lebih pantas, mudah, dan menyeronokkan!\n",
|
|
"\n",
|
|
"Anda boleh memasangnya seperti berikut:\n",
|
|
"\n",
|
|
"`install.packages(c(\"tidyverse\"))`\n",
|
|
"\n",
|
|
"Skrip di bawah akan memeriksa sama ada anda mempunyai pakej yang diperlukan untuk melengkapkan modul ini dan memasangnya untuk anda jika ada yang belum dipasang.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "dc5WhyVdXAjR"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n",
|
|
"pacman::p_load(tidyverse)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "GqPYUZgfXOBt"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Sekarang, mari kita hidupkan beberapa pakej dan muatkan [data](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) yang disediakan untuk pelajaran ini!\n"
|
|
],
|
|
"metadata": {
|
|
"id": "kvjDTPDSXRr2"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Load the core Tidyverse packages\n",
|
|
"library(tidyverse)\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 =50)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "VMri-t2zXqgD"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Satu `glimpse()` pantas menunjukkan terdapat kekosongan dan campuran antara rentetan (`chr`) dan data berangka (`dbl`). `Date` adalah jenis karakter dan terdapat juga satu lajur pelik yang dipanggil `Package` di mana datanya adalah campuran antara `sacks`, `bins` dan nilai-nilai lain. Data ini, sebenarnya, agak bersepah 😤.\n",
|
|
"\n",
|
|
"Sebenarnya, tidaklah biasa untuk menerima dataset yang sudah siap sepenuhnya untuk digunakan bagi mencipta model ML secara langsung. Tetapi jangan risau, dalam pelajaran ini, anda akan belajar cara menyediakan dataset mentah menggunakan pustaka R standard 🧑🔧. Anda juga akan belajar pelbagai teknik untuk memvisualkan data.📈📊\n",
|
|
"<br>\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",
|
|
"<br>\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",
|
|
"<p>\n",
|
|
" <img src=\"../../images/dplyr_wrangling.png\"\n",
|
|
" width=\"569\"/>\n",
|
|
" <figcaption>Karya seni oleh @allison_horst</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"<!--<br/>Karya seni oleh \\@allison_horst-->\n"
|
|
],
|
|
"metadata": {
|
|
"id": "o4jLY5-VZO2C"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"[`dplyr`](https://dplyr.tidyverse.org/), sebuah pakej dalam Tidyverse, adalah tatabahasa manipulasi data yang menyediakan satu set kata kerja yang konsisten untuk membantu anda menyelesaikan cabaran manipulasi data yang paling biasa. Dalam bahagian ini, kita akan meneroka beberapa kata kerja dplyr!\n"
|
|
],
|
|
"metadata": {
|
|
"id": "i5o33MQBZWWw"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"#### dplyr::select()\n",
|
|
"\n",
|
|
"`select()` ialah fungsi dalam pakej `dplyr` yang membantu anda memilih lajur untuk disimpan atau dikecualikan.\n",
|
|
"\n",
|
|
"Untuk menjadikan rangka data anda lebih mudah digunakan, buang beberapa lajur dengan menggunakan `select()`, dan simpan hanya lajur yang anda perlukan.\n",
|
|
"\n",
|
|
"Sebagai contoh, dalam latihan ini, analisis kita akan melibatkan lajur `Package`, `Low Price`, `High Price` dan `Date`. Mari kita pilih lajur-lajur ini.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "x3VGMAGBZiUr"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Select desired columns\n",
|
|
"pumpkins <- pumpkins %>% \n",
|
|
" select(Package, `Low Price`, `High Price`, Date)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Print data set\n",
|
|
"pumpkins %>% \n",
|
|
" slice_head(n = 5)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "F_FgxQnVZnM0"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"#### dplyr::mutate()\n",
|
|
"\n",
|
|
"`mutate()` adalah fungsi dalam pakej `dplyr` yang membantu anda mencipta atau mengubah suai lajur, sambil mengekalkan lajur yang sedia ada.\n",
|
|
"\n",
|
|
"Struktur umum `mutate` adalah:\n",
|
|
"\n",
|
|
"`data %>% mutate(new_column_name = what_it_contains)`\n",
|
|
"\n",
|
|
"Mari kita cuba menggunakan `mutate` dengan lajur `Date` dengan melakukan operasi berikut:\n",
|
|
"\n",
|
|
"1. Tukarkan tarikh (yang kini dalam jenis karakter) kepada format bulan (ini adalah tarikh AS, jadi formatnya adalah `MM/DD/YYYY`).\n",
|
|
"\n",
|
|
"2. Ekstrak bulan daripada tarikh ke dalam lajur baru.\n",
|
|
"\n",
|
|
"Dalam R, pakej [lubridate](https://lubridate.tidyverse.org/) memudahkan kerja dengan data tarikh-masa. Jadi, mari kita gunakan `dplyr::mutate()`, `lubridate::mdy()`, `lubridate::month()` dan lihat bagaimana untuk mencapai objektif di atas. Kita boleh membuang lajur `Date` kerana kita tidak akan memerlukannya lagi dalam operasi seterusnya.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "2KKo0Ed9Z1VB"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Load lubridate\n",
|
|
"library(lubridate)\n",
|
|
"\n",
|
|
"pumpkins <- pumpkins %>% \n",
|
|
" # Convert the Date column to a date object\n",
|
|
" mutate(Date = mdy(Date)) %>% \n",
|
|
" # Extract month from Date\n",
|
|
" mutate(Month = month(Date)) %>% \n",
|
|
" # Drop Date column\n",
|
|
" select(-Date)\n",
|
|
"\n",
|
|
"# View the first few rows\n",
|
|
"pumpkins %>% \n",
|
|
" slice_head(n = 7)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "5joszIVSZ6xe"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Woohoo! 🤩\n",
|
|
"\n",
|
|
"Seterusnya, mari kita cipta lajur baru `Price`, yang mewakili harga purata labu. Sekarang, mari kita ambil purata daripada lajur `Low Price` dan `High Price` untuk mengisi lajur Price yang baru.\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 selepas meneliti keseluruhan set data dengan `View(pumpkins)`, \"Ada sesuatu yang pelik di sini!\"🤔\n",
|
|
"\n",
|
|
"Jika anda melihat pada lajur `Package`, labu dijual dalam pelbagai konfigurasi. Ada yang dijual dalam ukuran `1 1/9 bushel`, ada yang dalam ukuran `1/2 bushel`, ada yang dijual per labu, ada yang per paun, dan ada yang dalam kotak besar dengan lebar yang berbeza-beza.\n",
|
|
"\n",
|
|
"Mari kita sahkan 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": [
|
|
"Hebat!👏\n",
|
|
"\n",
|
|
"Labu nampaknya sangat sukar untuk ditimbang secara konsisten, jadi mari kita tapis dengan memilih hanya labu yang mempunyai perkataan *bushel* dalam lajur `Package` dan letakkan ini dalam kerangka data baharu `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): menghasilkan subset data yang hanya mengandungi **baris** yang memenuhi syarat anda, dalam kes ini, labu dengan string *bushel* dalam lajur `Package`.\n",
|
|
"\n",
|
|
"[stringr::str_detect()](https://stringr.tidyverse.org/reference/str_detect.html): mengesan kehadiran atau ketiadaan corak dalam satu string.\n",
|
|
"\n",
|
|
"Pakej [`stringr`](https://github.com/tidyverse/stringr) menyediakan fungsi mudah untuk operasi string yang biasa.\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 boleh lihat bahawa kami telah mengecilkan kepada kira-kira 415 baris data yang mengandungi labu mengikut jumlah besar.🤩\n",
|
|
"<br>\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",
|
|
"<p >\n",
|
|
" <img src=\"../../images/data-visualization.png\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>Infografik oleh Dasani Madipalli</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"<!--{width=\"600\"}-->\n",
|
|
"\n",
|
|
"Terdapat satu pepatah *bijak* yang berbunyi seperti ini:\n",
|
|
"\n",
|
|
"> \"Graf mudah telah membawa lebih banyak maklumat kepada pemikiran penganalisis data berbanding alat lain.\" --- John Tukey\n",
|
|
"\n",
|
|
"Sebahagian daripada peranan saintis data adalah untuk menunjukkan kualiti dan sifat data yang mereka sedang kerjakan. Untuk melakukan ini, mereka sering mencipta visualisasi yang menarik, atau plot, graf, dan carta, yang menunjukkan pelbagai aspek data. Dengan cara ini, mereka dapat menunjukkan hubungan dan jurang secara visual yang mungkin sukar untuk dikesan.\n",
|
|
"\n",
|
|
"Visualisasi juga boleh membantu menentukan teknik pembelajaran mesin yang paling sesuai untuk data tersebut. Sebagai contoh, scatterplot yang kelihatan mengikuti satu garis menunjukkan bahawa data tersebut adalah calon yang baik untuk latihan regresi linear.\n",
|
|
"\n",
|
|
"R menawarkan beberapa sistem untuk membuat graf, tetapi [`ggplot2`](https://ggplot2.tidyverse.org/index.html) adalah salah satu yang paling elegan dan serba boleh. `ggplot2` membolehkan anda menyusun graf dengan **menggabungkan komponen-komponen bebas**.\n",
|
|
"\n",
|
|
"Mari kita mulakan dengan scatter plot mudah untuk lajur Price dan Month.\n",
|
|
"\n",
|
|
"Jadi dalam kes ini, kita akan bermula dengan [`ggplot()`](https://ggplot2.tidyverse.org/reference/ggplot.html), menyediakan set data dan pemetaan estetik (dengan [`aes()`](https://ggplot2.tidyverse.org/reference/aes.html)) kemudian menambah lapisan (seperti [`geom_point()`](https://ggplot2.tidyverse.org/reference/geom_point.html)) untuk scatter plot.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "mYSH6-EtbvNa"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Set a theme for the plots\n",
|
|
"theme_set(theme_light())\n",
|
|
"\n",
|
|
"# Create a scatter plot\n",
|
|
"p <- ggplot(data = new_pumpkins, aes(x = Price, y = Month))\n",
|
|
"p + geom_point()"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "g2YjnGeOcLo4"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Adakah ini plot yang berguna 🤷? Adakah apa-apa mengenainya mengejutkan anda?\n",
|
|
"\n",
|
|
"Ia tidak begitu berguna kerana apa yang dilakukan hanyalah memaparkan data anda sebagai taburan titik dalam bulan tertentu. \n",
|
|
"<br>\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"
|
|
]
|
|
}
|
|
]
|
|
} |