{ "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" } }, "cells": [ { "cell_type": "markdown", "source": [ "# បង្កើតម៉ូដែលវិញ្ញាសារជាក់លាក់: រៀបចំនិងមើលទិន្នន័យ\n", "\n", "## **វិញ្ញាសារជាក់លាក់សម្រាប់ផំពកិន - មេរៀនទី 2**\n", "#### គ្រប introductio\n", "\n", "ឥឡូវនេះដែលអ្នកបានត្រៀមខ្លួនជាមួយឧបករណ៍ដែលអ្នកត្រូវការដើម្បីចាប់ផ្តើមដោះស្រាយការបង្កើតម៉ូដែលសិក្សាមាស៊ីនជាមួយ Tidymodels និង Tidyverse អ្នកបានរៀបចំរួចហើយដើម្បីចាប់ផ្តើមសួរបានចំលើយពីទិន្នន័យរបស់អ្នក។ នៅពេលដែលអ្នកធ្វើការជាមួយទិន្នន័យ និងអនុវត្តដំណោះស្រាយ ML វិធីសាស្ត្រនេះ វាមានសារៈសំខាន់យ៉ាងខ្លាំងក្នុងការយល់ដឹងពីរបៀបសួរប្រាប់សំណួរដែលត្រឹមត្រូវដើម្បីបើកសមត្ថភាពរបស់សំណុំទិន្នន័យរបស់អ្នកយ៉ាងត្រឹមត្រូវ។\n", "\n", "នៅក្នុងមេរៀននេះ អ្នកនឹងរៀន:\n", "\n", "- របៀបរៀបចំទិន្នន័យរបស់អ្នកសម្រាប់ការបង្កើតម៉ូដែល។\n", "\n", "- របៀបប្រើ `ggplot2` សម្រាប់ការមើលទិន្នន័យ។\n", "\n", "សំណួរដែលអ្នកត្រូវបានបំផុតនឹងកំណត់ប្រភេទនៃអាល់ហ្គរីធម៌ ML ដែលអ្នកនឹងប្រើប្រាស់។ ហើយគុណភាពនៃចម្លើយដែលអ្នកទទួលបាននឹងពឹងផ្អែកយ៉ាងខ្លាំងលើធម្មសម្បត្តិនៃទិន្នន័យរបស់អ្នក។\n", "\n", "ចង់មើលរឿងនេះដោយធ្វើការប្រឡងផ្ទាល់។\n", "\n", "
\n",
"
\n",
"
\n",
"\n",
"> ការរំលឹកម្ដងទៀត៖ អូបერატឺ pipe (`%>%`) ប្រត្តិបត្ដិការជាមួយកំណត់ត្រានៅលំដាប់តាមហេតុផល ដោយផ្ទេរប្រធានវត្ថុមួយទៅមុខទៅមុខក្នុងសមីការឬហៅមុខងារ។ អ្នកអាចគិតពីអូបერატឺ pipe ដូចជាការនិយាយថា \"បន្ទាប់មក\" នៅក្នុងកូដរបស់អ្នក។\n"
],
"metadata": {
"id": "REWcIv9yX29v"
}
},
{
"cell_type": "markdown",
"source": [
"## 2. ពិនិត្យឃើញទិន្នន័យខ្វះ\n",
"\n",
"មួយក្នុងចំណោមបញ្ហាធម្មតាបំផុតដែលអ្នកវិទ្យាសាស្រ្តទិន្នន័យត្រូវដោះស្រាយគឺទិន្នន័យមិនពេញលេញឬខ្វះ។ R តំណាងឲ្យតម្លៃខ្វះ ឬមិនដឹងជាមួយតម្លៃសញ្ញាពិសេស៖ `NA` (មិនអាចប្រើបាន)។\n",
"\n",
"ដូចនេះ តើយើងធ្វើដូចម្តេចដើម្បីដឹងថា data frame មានតម្លៃខ្វះ?\n",
"
\n",
"- វិធីមួយផ្ទាល់សាមញ្ញគឺប្រើមុខងារ base 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",
"
\n",
"
\n"
],
"metadata": {
"id": "i5o33MQBZWWw"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::select()\n",
"\n",
"`select()` គឺជាឧបករណ៍មួយក្នុងកញ្ចប់ `dplyr` ដែលជួយអ្នកជ្រើសរើសជួរឈរដែលចង់រក្សាទុកឬដកចេញ។\n",
"\n",
"ដើម្បីធ្វើឲ្យទ្រង់ទ្រាយទិន្នន័យរបស់អ្នកងាយស្រួលប្រើប្រាស់ លប់ជួរឈរជាច្រើនរបស់វាចេញ ដោយប្រើ `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": [
"Woohoo! 🤩\n",
"\n",
"បន្ទាប់មក យើងបង្កើតជួរដេកថ្មីមួយឈ្មោះ `Price` ដែលតំណាងឱ្យតម្លៃជាមធ្យមនៃស្ពានពូពេញ។ ឥឡូវនេះ យើងនឹងគណនាមធ្យមតម្លៃពីជួរដេក `Low Price` និង `High Price` ដើម្បីបំពេញជួរដេកថ្មី Price។ \n",
"
\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` ហើយដាក់វាទៅក្នុង data frame ថ្មីឈ្មោះ `new_pumpkins`។\n",
"
\n"
],
"metadata": {
"id": "7sMjiVujaZxY"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::filter() និង stringr::str_detect()\n",
"\n",
"[`dplyr::filter()`](https://dplyr.tidyverse.org/reference/filter.html): បង្កើត subset នៃទិន្នន័យដែលមានតែ **ជួរ** ដែលបំពេញលក្ខខណ្ឌរបស់អ្នក នៅក្នុងករណីនេះ គឺក្រូចមួយដែលមានខ្សែអក្សរ *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": [
"អ្នកអាចមើលឃើញថាយើងបានកាត់បន្ថយដល់ប្រហែល ៤១៥ ជួរដេតាដែលមានទន្សោមជាច្រើនតាមប្រអប់។🤩\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": [
"ឥឡូវនេះ យើងអាចវិភាគតម្លៃក្នុងមួយឯកតាតាមការវាស់តម្លៃម៉ែត្រប៊ូសែលរបស់ពួកវា។ ការសិក្សារអំពីប៊ូសែលនៃក្រូចប៊ឺតទាំងនេះ ប៉ុន្តែ បង្ហាញថា វា `សំខាន់`យ៉ាងខ្លាំងក្នុងការទទួលយក `ការយល់ដឹងពីធម្មជាតិឯកសាររបស់អ្នក`!\n",
"\n",
"> ✅ យោងតាម [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308) ទំងន់នៃប៊ូសែលមួយអាស្រ័យលើប្រភេទផលិតផល ព្រោះវាជាការវាស់តម្លៃបរិមាណ។ \"ប៊ូសែលមួយនៃប៉េងប៉ោះ ឧទាហរណ៍ គួរតែមានទំងន់៥៦ផោន... ស្លឹក និងស្រស់កាន់កន្លែងច្រើនជាមួយទំងន់តិចជាង ដូច្នេះប៊ូសែលមួយនៃស្ពៃត្រូវមានទំងន់ត្រឹម២០ផោនប៉ុណ្ណោះ។\" វាពិបាកណាស់! មិនចាំបាច់ធ្វើការបម្លែងពីប៊ូសែលទៅផោនទេ ខណៈដែលយើងតំលៃតាមប៊ូសែលផងដែរ។ ការសិក្សារអំពីប៊ូសែលនៃក្រូចប៊ឺតទាំងនេះ បង្ហាញយ៉ាងខ្លាំងថា វាសំខាន់ណាស់ក្នុងការយល់ដឹងពីធម្មជាតិឯកសាររបស់អ្នក!\n",
">\n",
"> ✅ តើអ្នកបានសម្គាល់ទេថា ក្រូចប៊ឺតដែលលក់តាមកំរិតពាក់កណ្តាលប៊ូសែល គឺមានតម្លៃថ្លៃណាស់? តើអ្នកអាចស្រង់យកមូលហេតុបានទេ? ជំនួយ៖ ក្រូចប៊ឺតតូចៗមានតម្លៃថ្លៃជាងក្រូចធំ ដោយសារតែមានចំនួនរាប់មិនបានច្រើនក្នុងមួយប៊ូសែល បើប្រៀបធៀបទៅនឹងកន្លែងដែលមិនបានប្រើប្រាស់ដោយក្រូចបាយធំមួយដែលទទឹងទូលាយ។\n",
"
\n"
],
"metadata": {
"id": "pS2GNPagbSdb"
}
},
{
"cell_type": "markdown",
"source": [
"ចុងក្រោយនេះ សម្រាប់ការផ្សងព្រេង 💁♀️ តោះយើងប្ដូរតំណែងកូឡុំខែទៅជាទីតាំងដំបូង គឺ `មុន` កូឡុំ `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",
"
\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()` បង្កើតស៊ុមទិន្នន័យថ្មីដែលមានមួយជួរឈរសម្រាប់ប៉ារ៉ាម៉ែត្រក្រុមនីមួយ និងមួយជួរឈរសម្រាប់ស្ថិតិរួមដែលអ្នកបានបញ្ជាក់។\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\n"
]
}
]
}