{ "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", "

\n", " \n", "

ภาพประกอบโดย @allison_horst
\n", "\n", "\n", "\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", "
\n", "\n", "> ทบทวนสั้น ๆ: ตัวดำเนินการ pipe (`%>%`) ทำหน้าที่ดำเนินการตามลำดับตรรกะโดยส่งวัตถุไปข้างหน้าเข้าสู่ฟังก์ชันหรือคำสั่ง คุณสามารถคิดว่าตัวดำเนินการ pipe เป็นเหมือนการพูดว่า \"และจากนั้น\" ในโค้ดของคุณ\n" ], "metadata": { "id": "REWcIv9yX29v" } }, { "cell_type": "markdown", "source": [ "## 2. ตรวจสอบข้อมูลที่หายไป\n", "\n", "หนึ่งในปัญหาที่พบบ่อยที่สุดที่นักวิทยาศาสตร์ข้อมูลต้องจัดการคือข้อมูลที่ไม่สมบูรณ์หรือข้อมูลที่หายไป R แทนค่าที่หายไปหรือค่าที่ไม่ทราบด้วยค่าพิเศษที่เรียกว่า `NA` (Not Available)\n", "\n", "แล้วเราจะรู้ได้อย่างไรว่ามีค่าที่หายไปใน data frame?\n", "
\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", "

\n", " \n", "

ผลงานโดย @allison_horst
\n", "\n", "\n", "\n" ], "metadata": { "id": "o4jLY5-VZO2C" } }, { "cell_type": "markdown", "source": [ "[`dplyr`](https://dplyr.tidyverse.org/) เป็นแพ็กเกจใน Tidyverse ที่เป็นไวยากรณ์สำหรับการจัดการข้อมูล โดยมีชุดคำกริยาที่สอดคล้องกันซึ่งช่วยให้คุณแก้ปัญหาการจัดการข้อมูลที่พบบ่อยที่สุดได้ ในส่วนนี้ เราจะมาสำรวจคำกริยาบางตัวของ dplyr กัน! \n", "
\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", "
\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", "
\n" ], "metadata": { "id": "y8TJ0Za_bn5Y" } }, { "cell_type": "markdown", "source": [ "## 4. การแสดงข้อมูลด้วย ggplot2\n", "\n", "

\n", " \n", "

อินโฟกราฟิกโดย Dasani Madipalli
\n", "\n", "\n", "\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", "
\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" ] } ] }