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.
671 lines
24 KiB
671 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-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",
|
|
"<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. Mengimpor data labu dan memanggil Tidyverse\n",
|
|
"\n",
|
|
"Kita akan membutuhkan paket-paket berikut untuk mempelajari pelajaran ini:\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",
|
|
"Anda dapat menginstalnya dengan:\n",
|
|
"\n",
|
|
"`install.packages(c(\"tidyverse\"))`\n",
|
|
"\n",
|
|
"Script di bawah ini memeriksa apakah Anda memiliki paket yang diperlukan untuk menyelesaikan modul ini dan menginstalnya untuk Anda jika ada yang belum terpasang.\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 jalankan beberapa paket dan muat [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": [
|
|
"Sebuah `glimpse()` cepat langsung menunjukkan bahwa terdapat nilai kosong dan campuran antara string (`chr`) dan data numerik (`dbl`). `Date` memiliki tipe karakter, dan ada juga kolom aneh bernama `Package` di mana datanya merupakan campuran antara `sacks`, `bins`, dan nilai lainnya. Data ini, sebenarnya, cukup berantakan 😤.\n",
|
|
"\n",
|
|
"Memang, tidak umum mendapatkan dataset yang sepenuhnya siap digunakan untuk membuat model ML langsung tanpa persiapan. Tapi jangan khawatir, dalam pelajaran ini, Anda akan belajar bagaimana mempersiapkan dataset mentah menggunakan pustaka standar R 🧑🔧. Anda juga akan mempelajari berbagai teknik untuk memvisualisasikan data. 📈📊\n",
|
|
"<br>\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",
|
|
"<br>\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",
|
|
"<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 paket dalam Tidyverse, adalah tata bahasa manipulasi data yang menyediakan serangkaian kata kerja konsisten untuk membantu Anda menyelesaikan tantangan manipulasi data yang paling umum. Pada bagian ini, kita akan menjelajahi beberapa kata kerja dari dplyr!\n"
|
|
],
|
|
"metadata": {
|
|
"id": "i5o33MQBZWWw"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"#### dplyr::select()\n",
|
|
"\n",
|
|
"`select()` adalah fungsi dalam paket `dplyr` yang membantu Anda memilih kolom untuk disimpan atau dikecualikan.\n",
|
|
"\n",
|
|
"Untuk membuat data frame Anda lebih mudah digunakan, hapus beberapa kolomnya menggunakan `select()`, dan simpan hanya kolom yang Anda butuhkan.\n",
|
|
"\n",
|
|
"Sebagai contoh, dalam latihan ini, analisis kita akan melibatkan kolom `Package`, `Low Price`, `High Price`, dan `Date`. Mari kita pilih kolom-kolom tersebut.\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 paket `dplyr` yang membantu Anda membuat atau memodifikasi kolom, sambil tetap mempertahankan kolom yang sudah ada.\n",
|
|
"\n",
|
|
"Struktur umum dari `mutate` adalah:\n",
|
|
"\n",
|
|
"`data %>% mutate(new_column_name = what_it_contains)`\n",
|
|
"\n",
|
|
"Mari kita coba menggunakan `mutate` pada kolom `Date` dengan melakukan operasi berikut:\n",
|
|
"\n",
|
|
"1. Mengonversi tanggal (yang saat ini bertipe karakter) ke format bulan (ini adalah tanggal AS, jadi formatnya adalah `MM/DD/YYYY`).\n",
|
|
"\n",
|
|
"2. Mengekstrak bulan dari tanggal ke kolom baru.\n",
|
|
"\n",
|
|
"Di R, paket [lubridate](https://lubridate.tidyverse.org/) mempermudah bekerja dengan data Date-time. Jadi, mari kita gunakan `dplyr::mutate()`, `lubridate::mdy()`, `lubridate::month()` dan lihat bagaimana cara mencapai tujuan di atas. Kita dapat menghapus kolom Date karena tidak akan digunakan lagi dalam operasi berikutnya.\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",
|
|
"Selanjutnya, mari kita buat kolom baru `Price`, yang mewakili harga rata-rata sebuah labu. Sekarang, mari kita ambil rata-rata dari kolom `Low Price` dan `High Price` untuk mengisi kolom Price yang baru. \n",
|
|
"<br>\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",
|
|
"<br>\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",
|
|
"<p >\n",
|
|
" <img src=\"../../images/data-visualization.png\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>Infografis oleh Dasani Madipalli</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"<!--{width=\"600\"}-->\n",
|
|
"\n",
|
|
"Ada sebuah *pepatah bijak* yang berbunyi seperti ini:\n",
|
|
"\n",
|
|
"> \"Grafik sederhana telah memberikan lebih banyak informasi kepada pikiran analis data dibandingkan alat lainnya.\" --- John Tukey\n",
|
|
"\n",
|
|
"Bagian dari peran seorang ilmuwan data adalah menunjukkan kualitas dan sifat data yang mereka kerjakan. Untuk melakukan ini, mereka sering membuat visualisasi yang menarik, seperti plot, grafik, dan diagram, yang menunjukkan berbagai aspek data. Dengan cara ini, mereka dapat secara visual menunjukkan hubungan dan celah yang sulit ditemukan dengan cara lain.\n",
|
|
"\n",
|
|
"Visualisasi juga dapat membantu menentukan teknik pembelajaran mesin yang paling sesuai untuk data tersebut. Sebagai contoh, scatterplot yang tampak mengikuti garis menunjukkan bahwa data tersebut cocok untuk latihan regresi linier.\n",
|
|
"\n",
|
|
"R menawarkan beberapa sistem untuk membuat grafik, tetapi [`ggplot2`](https://ggplot2.tidyverse.org/index.html) adalah salah satu yang paling elegan dan paling serbaguna. `ggplot2` memungkinkan Anda menyusun grafik dengan **menggabungkan komponen independen**.\n",
|
|
"\n",
|
|
"Mari kita mulai dengan scatter plot sederhana untuk kolom Price dan Month.\n",
|
|
"\n",
|
|
"Dalam kasus ini, kita akan mulai dengan [`ggplot()`](https://ggplot2.tidyverse.org/reference/ggplot.html), memberikan dataset dan pemetaan estetika (dengan [`aes()`](https://ggplot2.tidyverse.org/reference/aes.html)) lalu menambahkan 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": [
|
|
"Apakah ini plot yang berguna 🤷? Apakah ada yang mengejutkan Anda tentang ini?\n",
|
|
"\n",
|
|
"Ini tidak terlalu berguna karena hanya menampilkan data Anda sebagai sebaran titik dalam bulan tertentu. \n",
|
|
"<br>\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"
|
|
]
|
|
}
|
|
]
|
|
} |