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.
666 lines
39 KiB
666 lines
39 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"
|
|
}
|
|
},
|
|
"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",
|
|
"<p >\n",
|
|
" <img src=\"../../../../../../translated_images/km/unruly_data.0eedc7ced92d2d91.webp\"\n",
|
|
" width=\"700\"/>\n",
|
|
" <figcaption>ស្នាដៃដោយ @allison_horst</figcaption>\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",
|
|
"ពិតប្រាកដ វានៅមិនធម្មតាទេដែលនឹងទទួលបានឯកសារទិន្នន័យ ដែលបានរៀបចំរួចរាល់សម្រាប់ប្រើបង្កើតម៉ូឌែល ML ពីប្រអប់ទេ។ ប៉ុន្តែកុំបារម្ភ នៅក្នុងមេរៀននេះ អ្នកនឹងរៀនពីរបៀបរៀបចំឯកសារទិន្នន័យដើមឲ្យបានត្រឹមត្រូវដោយប្រើបណ្ណាល័យ R ដែលមានស្តង់ដារ 🧑🔧។ អ្នកនឹងរៀនពីបច្ចេកទេសផ្សេងៗដើម្បីសម្របសម្រួលទិន្នន័យផងដែរ 📈📊\n",
|
|
"<br>\n",
|
|
"\n",
|
|
"> ការរំលឹកម្ដងទៀត៖ អូបერატឺ pipe (`%>%`) ប្រត្តិបត្ដិការជាមួយកំណត់ត្រានៅលំដាប់តាមហេតុផល ដោយផ្ទេរប្រធានវត្ថុមួយទៅមុខទៅមុខក្នុងសមីការឬហៅមុខងារ។ អ្នកអាចគិតពីអូបერატឺ pipe ដូចជាការនិយាយថា \"បន្ទាប់មក\" នៅក្នុងកូដរបស់អ្នក។\n"
|
|
],
|
|
"metadata": {
|
|
"id": "REWcIv9yX29v"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## 2. ពិនិត្យឃើញទិន្នន័យខ្វះ\n",
|
|
"\n",
|
|
"មួយក្នុងចំណោមបញ្ហាធម្មតាបំផុតដែលអ្នកវិទ្យាសាស្រ្តទិន្នន័យត្រូវដោះស្រាយគឺទិន្នន័យមិនពេញលេញឬខ្វះ។ R តំណាងឲ្យតម្លៃខ្វះ ឬមិនដឹងជាមួយតម្លៃសញ្ញាពិសេស៖ `NA` (មិនអាចប្រើបាន)។\n",
|
|
"\n",
|
|
"ដូចនេះ តើយើងធ្វើដូចម្តេចដើម្បីដឹងថា data frame មានតម្លៃខ្វះ?\n",
|
|
"<br>\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",
|
|
"<p >\n",
|
|
" <img src=\"../../../../../../translated_images/km/dplyr_wrangling.f5f99c64fd4580f1.webp\"\n",
|
|
" width=\"569\"/>\n",
|
|
" <figcaption>សិល្បៈដោយ @allison_horst</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"<!--<br/>Artwork by \\@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",
|
|
"ដើម្បីធ្វើឲ្យទ្រង់ទ្រាយទិន្នន័យរបស់អ្នកងាយស្រួលប្រើប្រាស់ លប់ជួរឈរជាច្រើនរបស់វាចេញ ដោយប្រើ `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",
|
|
"<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": [
|
|
"យ៉េស!💪\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",
|
|
"<br>\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",
|
|
"<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": [
|
|
"ឥឡូវនេះ យើងអាចវិភាគតម្លៃក្នុងមួយឯកតាតាមការវាស់តម្លៃម៉ែត្រប៊ូសែលរបស់ពួកវា។ ការសិក្សារអំពីប៊ូសែលនៃក្រូចប៊ឺតទាំងនេះ ប៉ុន្តែ បង្ហាញថា វា `សំខាន់`យ៉ាងខ្លាំងក្នុងការទទួលយក `ការយល់ដឹងពីធម្មជាតិឯកសាររបស់អ្នក`!\n",
|
|
"\n",
|
|
"> ✅ យោងតាម [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308) ទំងន់នៃប៊ូសែលមួយអាស្រ័យលើប្រភេទផលិតផល ព្រោះវាជាការវាស់តម្លៃបរិមាណ។ \"ប៊ូសែលមួយនៃប៉េងប៉ោះ ឧទាហរណ៍ គួរតែមានទំងន់៥៦ផោន... ស្លឹក និងស្រស់កាន់កន្លែងច្រើនជាមួយទំងន់តិចជាង ដូច្នេះប៊ូសែលមួយនៃស្ពៃត្រូវមានទំងន់ត្រឹម២០ផោនប៉ុណ្ណោះ។\" វាពិបាកណាស់! មិនចាំបាច់ធ្វើការបម្លែងពីប៊ូសែលទៅផោនទេ ខណៈដែលយើងតំលៃតាមប៊ូសែលផងដែរ។ ការសិក្សារអំពីប៊ូសែលនៃក្រូចប៊ឺតទាំងនេះ បង្ហាញយ៉ាងខ្លាំងថា វាសំខាន់ណាស់ក្នុងការយល់ដឹងពីធម្មជាតិឯកសាររបស់អ្នក!\n",
|
|
">\n",
|
|
"> ✅ តើអ្នកបានសម្គាល់ទេថា ក្រូចប៊ឺតដែលលក់តាមកំរិតពាក់កណ្តាលប៊ូសែល គឺមានតម្លៃថ្លៃណាស់? តើអ្នកអាចស្រង់យកមូលហេតុបានទេ? ជំនួយ៖ ក្រូចប៊ឺតតូចៗមានតម្លៃថ្លៃជាងក្រូចធំ ដោយសារតែមានចំនួនរាប់មិនបានច្រើនក្នុងមួយប៊ូសែល បើប្រៀបធៀបទៅនឹងកន្លែងដែលមិនបានប្រើប្រាស់ដោយក្រូចបាយធំមួយដែលទទឹងទូលាយ។\n",
|
|
"<br>\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",
|
|
"<br>\n"
|
|
],
|
|
"metadata": {
|
|
"id": "y8TJ0Za_bn5Y"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## 4. ការបង្ហាញទិន្នន័យជាមួយ ggplot2\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../../../../../translated_images/km/data-visualization.54e56dded7c1a804.webp\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>រូបភាពពត៌មានដោយ Dasani Madipalli</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"<!--{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()` បង្កើតស៊ុមទិន្នន័យថ្មីដែលមានមួយជួរឈរសម្រាប់ប៉ារ៉ាម៉ែត្រក្រុមនីមួយ និងមួយជួរឈរសម្រាប់ស្ថិតិរួមដែលអ្នកបានបញ្ជាក់។\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<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**ការជ្រាបជ្រ↵ណា**៖ \nឯកសារនេះត្រូវបានបំលែងភាសាដោយប្រើសេវាកម្មបម្លែងភាសា AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលយើងខំប្រឹងប្រែងឲ្យបានច្បាស់លាស់ សូមយកចិត្តទុកដាក់ទៅលើការបំលែងភាសាដោយស្វ័យប្រវត្តិនេះនិយាយឡើងថា អាចមានកំហុស ឬភាពមិនត្រឹមត្រូវខ្លះ។ ឯកសារដើមក្នុងភាសាដើមគួរត្រូវបានដាក់ជាដែនព្រះរាជ្យ។ សម្រាប់ព័ត៌មានសំខាន់ៗណាមួយ អ្នកមានការណែនាំឲ្យប្រែសម្រួលដោយអ្នកជំនាញមនុស្ស។ យើងមិនមានការទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសពីការប្រើប្រាស់ការបំលែងភាសានេះឡើយ។\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
|
|
]
|
|
}
|
|
]
|
|
} |