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.
ML-For-Beginners/translations/th/2-Regression/2-Data/solution/R/lesson_2-R.ipynb

672 lines
38 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-06T13:54:07+00:00",
"source_file": "2-Regression/2-Data/solution/R/lesson_2-R.ipynb",
"language_code": "th"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"# สร้างโมเดลการถดถอย: เตรียมและแสดงข้อมูล\n",
"\n",
"## **การถดถอยเชิงเส้นสำหรับฟักทอง - บทเรียนที่ 2**\n",
"#### บทนำ\n",
"\n",
"เมื่อคุณมีเครื่องมือที่จำเป็นสำหรับการเริ่มต้นสร้างโมเดลการเรียนรู้ของเครื่องด้วย Tidymodels และ Tidyverse คุณก็พร้อมที่จะเริ่มตั้งคำถามกับข้อมูลของคุณแล้ว การทำงานกับข้อมูลและการนำโซลูชัน ML มาใช้ สิ่งสำคัญคือการเข้าใจวิธีตั้งคำถามที่ถูกต้องเพื่อปลดล็อกศักยภาพของชุดข้อมูลของคุณอย่างเหมาะสม\n",
"\n",
"ในบทเรียนนี้ คุณจะได้เรียนรู้:\n",
"\n",
"- วิธีเตรียมข้อมูลของคุณสำหรับการสร้างโมเดล\n",
"\n",
"- วิธีใช้ `ggplot2` สำหรับการแสดงข้อมูล\n",
"\n",
"คำถามที่คุณต้องการคำตอบจะกำหนดประเภทของอัลกอริทึม ML ที่คุณจะใช้ และคุณภาพของคำตอบที่คุณได้รับจะขึ้นอยู่กับลักษณะของข้อมูลของคุณอย่างมาก\n",
"\n",
"มาดูตัวอย่างการทำงานจริงกันเถอะ\n",
"\n",
"\n",
"<p >\n",
" <img src=\"../../images/unruly_data.jpg\"\n",
" width=\"700\"/>\n",
" <figcaption>ภาพประกอบโดย @allison_horst</figcaption>\n",
"\n",
"\n",
"<!--![ภาพประกอบโดย \\@allison_horst](../../../../../../2-Regression/2-Data/images/unruly_data.jpg)<br>ภาพประกอบโดย \\@allison_horst-->\n"
],
"metadata": {
"id": "Pg5aexcOPqAZ"
}
},
{
"cell_type": "markdown",
"source": [
"## 1. การนำเข้าข้อมูลฟักทองและเรียกใช้ Tidyverse\n",
"\n",
"เราจะต้องใช้แพ็กเกจต่อไปนี้เพื่อจัดการบทเรียนนี้:\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) คือ [ชุดของแพ็กเกจ R](https://www.tidyverse.org/packages) ที่ออกแบบมาเพื่อทำให้การวิเคราะห์ข้อมูลเร็วขึ้น ง่ายขึ้น และสนุกมากขึ้น!\n",
"\n",
"คุณสามารถติดตั้งแพ็กเกจเหล่านี้ได้ด้วยคำสั่ง:\n",
"\n",
"`install.packages(c(\"tidyverse\"))`\n",
"\n",
"สคริปต์ด้านล่างจะตรวจสอบว่าคุณมีแพ็กเกจที่จำเป็นสำหรับการทำโมดูลนี้หรือไม่ และจะติดตั้งให้คุณในกรณีที่บางแพ็กเกจขาดหายไป\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": [
"ตอนนี้ มาเริ่มต้นใช้งานแพ็กเกจและโหลด [ข้อมูล](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) ที่เตรียมไว้สำหรับบทเรียนนี้!\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": [
"การใช้คำสั่ง `glimpse()` อย่างรวดเร็วจะช่วยให้เห็นได้ทันทีว่ามีช่องว่างในข้อมูล และมีการผสมผสานระหว่างข้อมูลประเภทข้อความ (`chr`) และข้อมูลตัวเลข (`dbl`) นอกจากนี้ `Date` ยังเป็นประเภทตัวอักษร และยังมีคอลัมน์แปลก ๆ ที่ชื่อว่า `Package` ซึ่งข้อมูลในคอลัมน์นี้เป็นการผสมกันระหว่าง `sacks`, `bins` และค่าอื่น ๆ อีกด้วย โดยรวมแล้ว ข้อมูลนี้ค่อนข้างยุ่งเหยิง 😤\n",
"\n",
"ในความเป็นจริง การได้รับชุดข้อมูลที่พร้อมใช้งานสำหรับสร้างโมเดล Machine Learning โดยตรงนั้นไม่ใช่เรื่องปกติ แต่ไม่ต้องกังวล เพราะในบทเรียนนี้ คุณจะได้เรียนรู้วิธีการเตรียมชุดข้อมูลดิบโดยใช้ไลบรารีมาตรฐานของ R 🧑‍🔧 นอกจากนี้ คุณยังจะได้เรียนรู้เทคนิคต่าง ๆ ในการสร้างภาพข้อมูลอีกด้วย 📈📊\n",
"<br>\n",
"\n",
"> ทบทวนสั้น ๆ: ตัวดำเนินการ pipe (`%>%`) ทำหน้าที่ดำเนินการตามลำดับตรรกะโดยส่งวัตถุไปข้างหน้าเข้าสู่ฟังก์ชันหรือคำสั่ง คุณสามารถคิดว่าตัวดำเนินการ pipe เป็นเหมือนการพูดว่า \"และจากนั้น\" ในโค้ดของคุณ\n"
],
"metadata": {
"id": "REWcIv9yX29v"
}
},
{
"cell_type": "markdown",
"source": [
"## 2. ตรวจสอบข้อมูลที่หายไป\n",
"\n",
"หนึ่งในปัญหาที่พบบ่อยที่สุดที่นักวิทยาศาสตร์ข้อมูลต้องจัดการคือข้อมูลที่ไม่สมบูรณ์หรือข้อมูลที่หายไป R แทนค่าที่หายไปหรือค่าที่ไม่ทราบด้วยค่าพิเศษที่เรียกว่า `NA` (Not Available)\n",
"\n",
"แล้วเราจะรู้ได้อย่างไรว่ามีค่าที่หายไปใน data frame?\n",
"<br>\n",
"- วิธีที่ตรงไปตรงมาคือการใช้ฟังก์ชันพื้นฐานของ R `anyNA` ซึ่งจะคืนค่าตรรกะเป็น `TRUE` หรือ `FALSE`\n"
],
"metadata": {
"id": "Zxfb3AM5YbUe"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"pumpkins %>% \n",
" anyNA()"
],
"outputs": [],
"metadata": {
"id": "G--DQutAYltj"
}
},
{
"cell_type": "markdown",
"source": [
"เยี่ยมเลย ดูเหมือนว่าจะมีข้อมูลบางส่วนหายไป! นั่นเป็นจุดเริ่มต้นที่ดี\n",
"\n",
"- อีกวิธีหนึ่งคือการใช้ฟังก์ชัน `is.na()` ซึ่งจะแสดงว่ามีองค์ประกอบในคอลัมน์ใดที่หายไป โดยจะระบุด้วยค่าตรรกะ `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": [
"โอเค งานเสร็จแล้ว แต่เมื่อเจอกับ Data Frame ขนาดใหญ่แบบนี้ การตรวจสอบแถวและคอลัมน์ทั้งหมดทีละตัวจะไม่มีประสิทธิภาพและแทบจะเป็นไปไม่ได้เลย😴\n",
"\n",
"- วิธีที่เข้าใจง่ายกว่าคือการคำนวณผลรวมของค่าที่หายไปในแต่ละคอลัมน์:\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": [
"ดีขึ้นมาก! มีข้อมูลที่ขาดหายไป แต่บางทีอาจจะไม่สำคัญสำหรับงานที่กำลังทำอยู่ ลองดูว่าการวิเคราะห์เพิ่มเติมจะนำไปสู่อะไร\n",
"\n",
"> นอกจากชุดแพ็กเกจและฟังก์ชันที่ยอดเยี่ยมแล้ว R ยังมีเอกสารประกอบที่ดีมากอีกด้วย ตัวอย่างเช่น ใช้ `help(colSums)` หรือ `?colSums` เพื่อค้นหาข้อมูลเพิ่มเติมเกี่ยวกับฟังก์ชันนี้\n"
],
"metadata": {
"id": "9gv-crB6ZD1Y"
}
},
{
"cell_type": "markdown",
"source": [
"## 3. Dplyr: ไวยากรณ์สำหรับการจัดการข้อมูล\n",
"\n",
"<p >\n",
" <img src=\"../../images/dplyr_wrangling.png\"\n",
" width=\"569\"/>\n",
" <figcaption>ผลงานโดย @allison_horst</figcaption>\n",
"\n",
"\n",
"<!--![ผลงานโดย \\@allison_horst](../../../../../../2-Regression/2-Data/images/dplyr_wrangling.png)<br/>ผลงานโดย \\@allison_horst-->\n"
],
"metadata": {
"id": "o4jLY5-VZO2C"
}
},
{
"cell_type": "markdown",
"source": [
"[`dplyr`](https://dplyr.tidyverse.org/) เป็นแพ็กเกจใน Tidyverse ที่เป็นไวยากรณ์สำหรับการจัดการข้อมูล โดยมีชุดคำกริยาที่สอดคล้องกันซึ่งช่วยให้คุณแก้ปัญหาการจัดการข้อมูลที่พบบ่อยที่สุดได้ ในส่วนนี้ เราจะมาสำรวจคำกริยาบางตัวของ dplyr กัน! \n",
"<br>\n"
],
"metadata": {
"id": "i5o33MQBZWWw"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::select()\n",
"\n",
"`select()` เป็นฟังก์ชันในแพ็กเกจ `dplyr` ที่ช่วยให้คุณเลือกคอลัมน์ที่ต้องการเก็บไว้หรือไม่ต้องการ\n",
"\n",
"เพื่อให้การทำงานกับ data frame ง่ายขึ้น คุณสามารถลบคอลัมน์บางส่วนออกโดยใช้ `select()` และเก็บไว้เฉพาะคอลัมน์ที่คุณต้องการ\n",
"\n",
"ตัวอย่างเช่น ในการวิเคราะห์ครั้งนี้ เราจะใช้คอลัมน์ `Package`, `Low Price`, `High Price` และ `Date` มาทำการเลือกคอลัมน์เหล่านี้กัน\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()` เป็นฟังก์ชันในแพ็กเกจ `dplyr` ที่ช่วยให้คุณสร้างหรือแก้ไขคอลัมน์ โดยยังคงคอลัมน์เดิมไว้\n",
"\n",
"โครงสร้างทั่วไปของ `mutate` คือ:\n",
"\n",
"`data %>% mutate(new_column_name = what_it_contains)`\n",
"\n",
"ลองใช้ `mutate` กับคอลัมน์ `Date` โดยทำตามขั้นตอนต่อไปนี้:\n",
"\n",
"1. แปลงวันที่ (ซึ่งปัจจุบันเป็นประเภทตัวอักษร) ให้เป็นรูปแบบเดือน (วันที่เหล่านี้เป็นวันที่ในสหรัฐฯ ดังนั้นรูปแบบคือ `MM/DD/YYYY`)\n",
"\n",
"2. ดึงข้อมูลเดือนจากวันที่ไปยังคอลัมน์ใหม่\n",
"\n",
"ใน R แพ็กเกจ [lubridate](https://lubridate.tidyverse.org/) ทำให้การทำงานกับข้อมูลวันที่และเวลาเป็นเรื่องง่ายขึ้น ดังนั้นเราจะใช้ `dplyr::mutate()`, `lubridate::mdy()`, `lubridate::month()` เพื่อบรรลุเป้าหมายข้างต้น เราสามารถลบคอลัมน์ Date ได้ เนื่องจากเราไม่จำเป็นต้องใช้มันอีกในขั้นตอนถัดไป\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": [
"เยี่ยมไปเลย! 🤩\n",
"\n",
"ต่อไป มาสร้างคอลัมน์ใหม่ชื่อ `Price` ซึ่งแสดงถึงราคากลางของฟักทองกันเถอะ ตอนนี้เราจะคำนวณค่าเฉลี่ยของคอลัมน์ `Low Price` และ `High Price` เพื่อเติมข้อมูลในคอลัมน์ Price ใหม่นี้\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": [
"เยส!💪\n",
"\n",
"\"แต่เดี๋ยวก่อน!\" คุณอาจพูดหลังจากดูข้อมูลทั้งหมดด้วย `View(pumpkins)` \"มีอะไรแปลกๆ อยู่ที่นี่!\"🤔\n",
"\n",
"ถ้าคุณดูที่คอลัมน์ `Package` จะเห็นว่าฟักทองถูกขายในรูปแบบที่หลากหลาย บางส่วนขายในหน่วย `1 1/9 bushel` บางส่วนในหน่วย `1/2 bushel` บางส่วนขายเป็นลูก บางส่วนขายเป็นปอนด์ และบางส่วนขายในกล่องใหญ่ที่มีขนาดแตกต่างกัน\n",
"\n",
"ลองตรวจสอบดูสิ:\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": [
"น่าทึ่งมาก!👏\n",
"\n",
"ดูเหมือนว่าฟักทองจะมีน้ำหนักที่วัดได้ไม่คงที่ ดังนั้นเรามากรองพวกมันโดยเลือกเฉพาะฟักทองที่มีคำว่า *bushel* อยู่ในคอลัมน์ `Package` และนำสิ่งนี้ไปใส่ในกรอบข้อมูลใหม่ชื่อ `new_pumpkins`\n"
],
"metadata": {
"id": "7sMjiVujaZxY"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::filter() และ stringr::str_detect()\n",
"\n",
"[`dplyr::filter()`](https://dplyr.tidyverse.org/reference/filter.html): สร้างชุดข้อมูลย่อยที่มีเฉพาะ **แถว** ที่ตรงตามเงื่อนไขของคุณ ในกรณีนี้คือ ฟักทองที่มีคำว่า *bushel* อยู่ในคอลัมน์ `Package`\n",
"\n",
"[stringr::str_detect()](https://stringr.tidyverse.org/reference/str_detect.html): ตรวจสอบว่ามีหรือไม่มีรูปแบบที่กำหนดในสตริง\n",
"\n",
"แพ็กเกจ [`stringr`](https://github.com/tidyverse/stringr) มีฟังก์ชันที่ใช้งานง่ายสำหรับการจัดการสตริงทั่วไป\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": [
"คุณสามารถเห็นได้ว่าเราจำกัดข้อมูลให้เหลือประมาณ 415 แถวที่เกี่ยวกับฟักทองตามปริมาณเป็นบุชเชล 🤩\n",
"<br>\n"
],
"metadata": {
"id": "VrDwF031avlR"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::case_when()\n",
"\n",
"**แต่เดี๋ยวก่อน! ยังมีอีกสิ่งที่ต้องทำ**\n",
"\n",
"คุณสังเกตไหมว่าปริมาณในหน่วย bushel แตกต่างกันในแต่ละแถว? คุณจำเป็นต้องปรับราคาที่แสดงให้เป็นราคาต่อ bushel ไม่ใช่ต่อ 1 1/9 หรือ 1/2 bushel ถึงเวลาทำคณิตศาสตร์เพื่อทำให้มันเป็นมาตรฐานเดียวกัน\n",
"\n",
"เราจะใช้ฟังก์ชัน [`case_when()`](https://dplyr.tidyverse.org/reference/case_when.html) เพื่อ *ปรับเปลี่ยน* คอลัมน์ Price ตามเงื่อนไขบางอย่าง `case_when` ช่วยให้คุณสามารถจัดการคำสั่ง `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": [
"ตอนนี้เราสามารถวิเคราะห์ราคาต่อหน่วยโดยอิงจากการวัดผลตามหน่วย bushel ได้แล้ว การศึกษาหน่วย bushel ของฟักทองนี้แสดงให้เห็นว่า `สำคัญมาก` ที่จะต้อง `เข้าใจลักษณะของข้อมูลของคุณ`!\n",
"\n",
"> ✅ ตามข้อมูลจาก [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308) น้ำหนักของ bushel ขึ้นอยู่กับประเภทของผลผลิต เนื่องจากมันเป็นการวัดตามปริมาตร \"ตัวอย่างเช่น bushel ของมะเขือเทศควรมีน้ำหนัก 56 ปอนด์... ใบและผักใบเขียวใช้พื้นที่มากกว่าแต่น้ำหนักน้อยกว่า ดังนั้น bushel ของผักโขมจึงมีน้ำหนักเพียง 20 ปอนด์\" มันค่อนข้างซับซ้อน! เราไม่ต้องยุ่งยากกับการแปลง bushel เป็นปอนด์ แต่ให้ตั้งราคาตาม bushel แทน การศึกษาหน่วย bushel ของฟักทองนี้แสดงให้เห็นว่า สำคัญมากที่จะต้องเข้าใจลักษณะของข้อมูลของคุณ!\n",
"\n",
"> ✅ คุณสังเกตไหมว่าฟักทองที่ขายเป็นครึ่ง bushel นั้นมีราคาแพงมาก? คุณสามารถหาสาเหตุได้ไหม? คำใบ้: ฟักทองลูกเล็กมีราคาสูงกว่าฟักทองลูกใหญ่มาก อาจเป็นเพราะมีจำนวนมากกว่าต่อ bushel เนื่องจากพื้นที่ที่ไม่ได้ใช้ซึ่งถูกครอบครองโดยฟักทองพายลูกใหญ่ที่กลวง\n"
],
"metadata": {
"id": "pS2GNPagbSdb"
}
},
{
"cell_type": "markdown",
"source": [
"สุดท้ายนี้ เพื่อความสนุกสนานและการผจญภัย 💁‍♀️ เรามาย้ายคอลัมน์ Month ไปอยู่ในตำแหน่งแรกกันดีกว่า นั่นคือ `ก่อน` คอลัมน์ `Package`\n",
"\n",
"สามารถใช้ `dplyr::relocate()` เพื่อเปลี่ยนตำแหน่งของคอลัมน์ได้\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": [
"เยี่ยมมาก!👌 ตอนนี้คุณมีชุดข้อมูลที่สะอาดและเป็นระเบียบเรียบร้อย ซึ่งคุณสามารถใช้สร้างโมเดลการถดถอยใหม่ของคุณได้! \n",
"<br>\n"
],
"metadata": {
"id": "y8TJ0Za_bn5Y"
}
},
{
"cell_type": "markdown",
"source": [
"## 4. การแสดงข้อมูลด้วย ggplot2\n",
"\n",
"<p >\n",
" <img src=\"../../images/data-visualization.png\"\n",
" width=\"600\"/>\n",
" <figcaption>อินโฟกราฟิกโดย Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"<!--![อินโฟกราฟิกโดย Dasani Madipalli](../../../../../../2-Regression/2-Data/images/data-visualization.png){width=\"600\"}-->\n",
"\n",
"มีคำกล่าวที่ชาญฉลาดว่า:\n",
"\n",
"> \"กราฟง่าย ๆ ได้นำข้อมูลมาสู่ความคิดของนักวิเคราะห์ข้อมูลมากกว่าวิธีการอื่นใด\" --- John Tukey\n",
"\n",
"หนึ่งในบทบาทของนักวิทยาศาสตร์ข้อมูลคือการแสดงให้เห็นถึงคุณภาพและลักษณะของข้อมูลที่พวกเขากำลังทำงานด้วย เพื่อทำสิ่งนี้ พวกเขามักสร้างการแสดงผลที่น่าสนใจ เช่น แผนภาพ กราฟ และแผนภูมิ ที่แสดงแง่มุมต่าง ๆ ของข้อมูล ด้วยวิธีนี้ พวกเขาสามารถแสดงความสัมพันธ์และช่องว่างที่อาจยากต่อการค้นพบในรูปแบบอื่น\n",
"\n",
"การแสดงผลข้อมูลยังช่วยในการเลือกเทคนิคการเรียนรู้ของเครื่องที่เหมาะสมที่สุดสำหรับข้อมูล ตัวอย่างเช่น แผนภาพกระจายที่ดูเหมือนจะมีแนวโน้มตามเส้นตรง อาจบ่งชี้ว่าข้อมูลนั้นเหมาะสำหรับการวิเคราะห์การถดถอยเชิงเส้น\n",
"\n",
"R มีระบบหลายแบบสำหรับการสร้างกราฟ แต่ [`ggplot2`](https://ggplot2.tidyverse.org/index.html) เป็นหนึ่งในระบบที่มีความสง่างามและหลากหลายที่สุด `ggplot2` ช่วยให้คุณสร้างกราฟโดย **การรวมองค์ประกอบอิสระเข้าด้วยกัน**\n",
"\n",
"เริ่มต้นด้วยแผนภาพกระจายง่าย ๆ สำหรับคอลัมน์ Price และ Month\n",
"\n",
"ในกรณีนี้ เราจะเริ่มต้นด้วย [`ggplot()`](https://ggplot2.tidyverse.org/reference/ggplot.html) โดยใส่ชุดข้อมูลและการแมปเชิงสุนทรียะ (ด้วย [`aes()`](https://ggplot2.tidyverse.org/reference/aes.html)) จากนั้นเพิ่มเลเยอร์ (เช่น [`geom_point()`](https://ggplot2.tidyverse.org/reference/geom_point.html)) สำหรับแผนภาพกระจาย\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": [
"นี่เป็นพล็อตที่มีประโยชน์หรือเปล่า 🤷? มีอะไรที่ทำให้คุณแปลกใจไหม?\n",
"\n",
"มันไม่ได้มีประโยชน์มากนัก เพราะทั้งหมดที่มันทำคือแสดงข้อมูลของคุณเป็นการกระจายของจุดในเดือนที่กำหนด\n",
"<br>\n"
],
"metadata": {
"id": "Ml7SDCLQcPvE"
}
},
{
"cell_type": "markdown",
"source": [
"### **เราจะทำให้มันมีประโยชน์ได้อย่างไร?**\n",
"\n",
"เพื่อให้กราฟแสดงข้อมูลที่มีประโยชน์ คุณมักจะต้องจัดกลุ่มข้อมูลในบางรูปแบบ ตัวอย่างเช่น ในกรณีของเรา การหาค่าเฉลี่ยของราคาฟักทองในแต่ละเดือนจะช่วยให้เราเข้าใจรูปแบบที่ซ่อนอยู่ในข้อมูลได้มากขึ้น ซึ่งนำเราไปสู่การใช้งาน **dplyr** อีกหนึ่งฟังก์ชัน:\n",
"\n",
"#### `dplyr::group_by() %>% summarize()`\n",
"\n",
"การคำนวณแบบจัดกลุ่มใน R สามารถทำได้ง่าย ๆ โดยใช้\n",
"\n",
"`dplyr::group_by() %>% summarize()`\n",
"\n",
"- `dplyr::group_by()` เปลี่ยนหน่วยการวิเคราะห์จากทั้งชุดข้อมูลไปเป็นกลุ่มย่อย เช่น กลุ่มตามเดือน\n",
"\n",
"- `dplyr::summarize()` สร้าง Data Frame ใหม่ที่มีคอลัมน์สำหรับตัวแปรที่ใช้จัดกลุ่ม และคอลัมน์สำหรับสถิติสรุปที่คุณระบุ\n",
"\n",
"ตัวอย่างเช่น เราสามารถใช้ `dplyr::group_by() %>% summarize()` เพื่อจัดกลุ่มฟักทองตามคอลัมน์ **Month** และหาค่า **ราคาเฉลี่ย** สำหรับแต่ละเดือน\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": [
"กระชับ!✨\n",
"\n",
"ฟีเจอร์ประเภทหมวดหมู่ เช่น เดือน มักจะแสดงผลได้ดีกว่าด้วยกราฟแท่ง 📊 เลเยอร์ที่ใช้สำหรับสร้างกราฟแท่งคือ `geom_bar()` และ `geom_col()` สามารถดูข้อมูลเพิ่มเติมได้ที่ `?geom_bar`\n",
"\n",
"มาลองสร้างกันเลย!\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": [
"🤩🤩นี่คือการแสดงข้อมูลที่มีประโยชน์มากขึ้น! ดูเหมือนว่าราคาสูงสุดของฟักทองจะเกิดขึ้นในเดือนกันยายนและตุลาคม ตรงกับที่คุณคาดไว้หรือไม่? เพราะอะไร?\n",
"\n",
"ขอแสดงความยินดีที่คุณจบบทเรียนที่สอง 👏! คุณได้เตรียมข้อมูลสำหรับการสร้างโมเดล จากนั้นค้นพบข้อมูลเชิงลึกเพิ่มเติมผ่านการแสดงผลข้อมูล!\n"
],
"metadata": {
"id": "zDm0VOzzcuzR"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ข้อจำกัดความรับผิดชอบ**: \nเอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้\n"
]
}
]
}