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/km/4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb

725 lines
45 KiB

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

{
"nbformat": 4,
"nbformat_minor": 2,
"metadata": {
"colab": {
"name": "lesson_10-R.ipynb",
"provenance": [],
"collapsed_sections": []
},
"kernelspec": {
"name": "ir",
"display_name": "R"
},
"language_info": {
"name": "R"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"# សាងសង់ម៉ូដែលចាត់ថ្នាក់ៈ ម្ហូបអាស៊ីនិងឥណ្ឌាសாளីឆ្ងាញ់\n"
],
"metadata": {
"id": "ItETB4tSFprR"
}
},
{
"cell_type": "markdown",
"source": [
"## អំនើ្លបាចំព័ទ្ធទៅកាន់ការបែងចែក: សម្អាត ផ្តិតផ្គុំ និងមើលទិន្នន័យរបស់អ្នក\n",
"\n",
"នៅក្នុងមេរៀន​បួន​នេះ អ្នកនឹងស្វែងយល់ពីកម្រិតមូលដ្ឋានមួយនៃការរៀនម៉ាស៊ីនគ្លាស៊ីច - *ការបែងចែក*។ យើងនឹងដើរតាមវិធីប្រើប្រាស់អាល់ហ្គូរីធម៍បែងចែកនានាមួយជាមួយនឹងសំណុំទិន្នន័យអំពីម្ហូបឆែបឆៃដ៏អស្ចារ្យទាំងអាស៊ី និងឥណ្ឌា។ សង្ឃឹមថាអ្នកឃ្លីប!\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/km/pinch.1b035ec9ba7e0d40.webp\"\n",
" width=\"600\"/>\n",
" <figcaption>អបអរសាទរម្ហូបអាហារប្រចាំប៉ានអាស៊ីក្នុងមេរៀនទាំងនេះ! រូបភាពដោយ Jen Looper</figcaption>\n",
"\n",
"\n",
"<!--![Celebrate pan-Asian cuisines in these lessons! Image by Jen Looper](../../../../../../translated_images/km/pinch.b33c0ba76f284aad.webp)-->\n",
"\n",
"ការបែងចែកជារបៀបមួយនៃ [ការរៀនភាគីត្រួតត្រា](https://wikipedia.org/wiki/Supervised_learning) ដែលមានចំណុចស្រដៀងជាច្រើនជាមួយវិធីសាស្រ្តព្យាករណ៍កំណត់តម្លៃ។ ក្នុងការបែងចែក អ្នកហ្វឹកហ្វឺនម៉ូដែលមួយដើម្បីព្យាករណ៍ថា `ប្រភេទ` អ្វីមួយដែលធាតុមួយស្ថិតលើវា។ ប្រសិនបើការរៀនម៉ាស៊ីនគឺស្តីពីការព្យាករណ៍តម្លៃ ឬឈ្មោះទៅកាន់វត្ថុដោយប្រើសំណុំទិន្នន័យ ការបែងចែកទូទៅចែកចេញជាពីរគូរៈ *ការបែងចែកពីរប្រភេទ* និង *ការបែងចែកពហុប្រភេទ*។\n",
"\n",
"ចងចាំ៖\n",
"\n",
"- **ព្យាករណ៍បញ្ចាត់បន្ទាត់** ជួយអ្នកព្យាករណ៍ទំនាក់ទំនងរវាងអថេរនានា ហើយបញ្ចេញការព្យាករណ៍មិនខុសពីទីតាំងចំណុចទិន្នន័យថ្មីក្នុងទំនាក់ទំនងជាមួយបន្ទាត់នោះ។ ដូច្នេះ អ្នកអាចព្យាករណ៍តម្លៃជាទំនាក់ទំនងជាក់លាក់ ដូចជា *តម្លៃនៃផ្លែមូសនៅខែ កញ្ញា ប្រៀបធៀបទៅខែធ្នូ* ជាឧទាហរណ៍។\n",
"\n",
"- **ព្យាករណ៍លូជីស្ទិច** ជួយអ្នករកឃើញ \"ប្រភេទពីរប្រភេទ\": នៅតម្លៃនេះ, *ផ្លែមូសនេះមានពណ៌លឿងឬពណ៌ផ្សេងទេ*?\n",
"\n",
"ការបែងចែកប្រើអាល់ហ្គូរីធម៍ជាច្រើនដើម្បីកំណត់វិធីផ្សេងៗសម្រាប់កំណត់ស្លាកឬថ្នាក់របស់ចំណុចទិន្នន័យមួយ។ យើងនឹងធ្វើការជាមួយទិន្នន័យអាហារនេះដើម្បីមើលថា តើដោយពីប៉ុន្មានគ្រឿងផ្សំ អ្នកអាចកំណត់ប្រភពអាហារនោះឬអត់។\n",
"\n",
"### [**សំណួរត្រៀមមុនមេរៀន**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/19/)\n",
"\n",
"### **មុខម្ហូប**\n",
"\n",
"ការបែងចែកគឺជាព្រឹត្តិការណ៍មូលដ្ឋានមួយនៃអ្នកស្រាវជ្រាវការរៀនម៉ាស៊ីន និងវិទ្យាសាស្រ្តទិន្នន័យ។ ចាប់ពីការបែងចែកតម្លៃពីរភេទមូលដ្ឋានមួយ (\"អ៊ីមែលនេះជាស្ពាមឬអត់?\") ទៅដល់ការបែងចែក និងបំបែករូបភាពស្មុគស្មាញដោយប្រើកុំព្យូទ័រមើល, វានានាសមរម្យក្នុងការបំបែកទិន្នន័យទៅកាន់ថ្នាក់ទំនាក់ទំនងនិងសួរបញ្ហាពីវា។\n",
"\n",
"ដើម្បីបញ្ជាក់ពីដំណើរការនេះក្នុងវិជ្ជាជីវៈវិទ្យាសាស្រ្ត, វិធីសាស្រ្តការបែងចែករបស់អ្នកបង្កើតម៉ូដែលព្យាករណ៍ ដែលអនុញ្ញាតឲ្យអ្នកប៉ះពាល់ទំនាក់ទំនងរវាងអថេរបញ្ចូលទៅអថេរចេញ។\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/km/binary-multiclass.b56d0c86c81105a6.webp\"\n",
" width=\"600\"/>\n",
" <figcaption>បញ្ហាប្រភេទពីរ និងពហុប្រភេទសម្រាប់អាល់ហ្គូរីធម៍បែងចែកដោះសោ។ ក្រាហ្វិកដោយ Jen Looper</figcaption>\n",
"\n",
"\n",
"\n",
"មុនចាប់ផ្តើមដំណើរការសម្អាតទិន្នន័យ, មើលវា និងត្រៀមវាសម្រាប់ភារកិច្ច ML របស់យើង, យើងត្រូវរៀនពីវិធីផ្សេងៗដែលការរៀនម៉ាស៊ីនអាចប្រើដើម្បីបែងចែកទិន្នន័យ។\n",
"\n",
"យកមកពី [ស្ថិតិវិទ្យា](https://wikipedia.org/wiki/Statistical_classification), ការបែងចែកដោយប្រើការរៀនម៉ាស៊ីនគ្លាស៊ីចប្រើលក្ខណៈជាចម្បង ដូចជា `ស្រវឹងបារី`, `ទម្ងន់`, និង `អាយុ` ដើម្បីកំណត់ *សព្វះប្រហែលនៃការរីកចម្រើនជម្ងឺ X*។ ជាវិធីសាស្ត្រ supervised learning ដូចកម្រិតព្យាករណ៍ដែលអ្នកបានអនុវត្តមុននេះ, ទិន្នន័យរបស់អ្នកត្រូវបានតម្លាភាព ហើយដែលអាល់ហ្គូរីធម៍ ML ប្រើស្លាកទាំងនោះដើម្បីចាត់ថ្នាក់ទិន្នន័យ និងព្យាករណ៍ថ្នាក់ (ឬ 'លក្ខណៈ') នៃសំណុំទិន្នន័យ ហើយចាត់វាទៅក្រុមឬលទ្ធផលមួយ។\n",
"\n",
"✅ ចំណាយពេលមួយដើម្បីស្រមៃពីសំណុំទិន្នន័យអំពីអាហារ។ ម៉ូដែលពហុប្រភេទអាចឆ្លើយសំណួរអ្វីបានខ្លះ? ម៉ូដែលពីរប្រភេទអាចឆ្លើយសំណួរអ្វីបានខ្លះ? តើប្រសិនបើអ្នកចង់កំណត់ថាអាហារដ៏គ្នានោះប្រហែលជានឹងប្រើ fenugreek ទេឬអត់? តើប្រសិនបើអ្នកចង់មើលថា ក្នុងករណីមានកាបូបដេញមួយពេញដោយ star anise, artichokes, cauliflower និង horseradish អ្នកអាចបង្កើតម្ហូបទេជាអាហារឥណ្ឌាទេ?\n",
"\n",
"### **ជំរាបសួរ 'អ្នកបែងចែក'**\n",
"\n",
"សំណួរដែលយើងចង់សួរពីសំណុំទិន្នន័យអាហារនេះចាំបាច់ជាគំរូសំណួរពហុប្រភេទ**, ព្រោះយើងមានអាហារជាតិមួយចំនួនដែលអាចប្រើបាន។ ផ្អែកលើក្រុមគ្រឿងផ្សំមួយណាមួយ, តើថ្នាក់ណាមួយក្នុងចំណោមថ្នាក់ណាច្រើនទាំងនេះ តើទិន្នន័យនឹងប៉ះពាល់ពីអ្វី?\n",
"\n",
"Tidymodels ផ្តល់ជូនសំណុំអាល់ហ្គូរីធម៍ផ្សេងៗដើម្បីប្រើបែងចែកទិន្នន័យ, អាស្រ័យលើប្រភេទបញ្ហាដែលអ្នកចង់ដោះស្រាយ។ ក្នុងមេរៀនបន្ទាប់ អ្នកនឹងរៀនអំពីអាល់ហ្គូរីធម៍ជាច្រើនទាំងនេះ។\n",
"\n",
"#### **មុខងារជាមុនតម្រូវ**\n",
"\n",
"សម្រាប់មេរៀននេះ យើងនឹងត្រូវការកញ្ចប់ទីតាំងដូច​ខាងក្រោម ដើម្បីសម្អាត ផ្តិតផ្គុំ និងមើលទិន្នន័យរបស់យើង៖\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) គឺជាសំណុំ [កញ្ចប់ R](https://www.tidyverse.org/packages) ដែលគេរចនាឡើងដើម្បីឲ្យវិទ្យាសាស្រ្តទិន្នន័យមានល្បឿនលឿន ស្រួលបំផុត និងរីករាយ!\n",
"\n",
"- `tidymodels`: សំណុំរចនាសម្ព័ន្ធ [tidymodels](https://www.tidymodels.org/) ជាសំណុំ [កញ្ចប់](https://www.tidymodels.org/packages/) សម្រាប់ម៉ូដែល និងការរៀនម៉ាស៊ីន។\n",
"\n",
"- `DataExplorer`: កញ្ចប់ [DataExplorer](https://cran.r-project.org/web/packages/DataExplorer/vignettes/dataexplorer-intro.html) មានគោលបំណង លៃតម្រូវ និងស្វ័យប្រវត្តិដំណើរការវិភាគទិន្នន័យមូលដ្ឋាន និងរាយការណ៍។\n",
"\n",
"- `themis`: កញ្ចប់ [themis](https://themis.tidymodels.org/) ផ្តល់ជូនជំហានបន្ថែមសម្រាប់ដោះស្រាយបញ្ហាទិន្នន័យមិនសមស្រប។\n",
"\n",
"អ្នកអាចដំឡើងវាទាំងនេះបានដោយបញ្ជា៖\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"DataExplorer\", \"here\"))`\n",
"\n",
"ជាជម្រើសផ្សេងទៀត ស្គ្រីបខាងក្រោមពិនិត្យថាតើអ្នកមានកញ្ចប់ដែលត្រូវការដើម្បីបញ្ចប់មូឌុលនេះ ឬនៅ និងដំឡើងវាឲ្យក្នុងករណីខ្វះកញ្ចប់។\n"
],
"metadata": {
"id": "ri5bQxZ-Fz_0"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"suppressWarnings(if (!require(\"pacman\"))install.packages(\"pacman\"))\r\n",
"\r\n",
"pacman::p_load(tidyverse, tidymodels, DataExplorer, themis, here)"
],
"outputs": [],
"metadata": {
"id": "KIPxa4elGAPI"
}
},
{
"cell_type": "markdown",
"source": [
"យើងនឹងផ្ទុកកញ្ចប់ដ៏អស្ចារ្យទាំងនេះក្នុងពេលក្រោយ ហើយធ្វើអោយវាអាចប្រើបាននៅក្នុងវគ្គសម័យ R បច្ចុប្បន្នរបស់យើង។ (នេះគឺសម្រាប់ការបង្ហាញតែមួយ, `pacman::p_load()` បានធ្វើរួចហើយសម្រាប់អ្នក)\n"
],
"metadata": {
"id": "YkKAxOJvGD4C"
}
},
{
"cell_type": "markdown",
"source": [
"## លំហាត់ - សម្អាត និងតុល្យភាពទិន្នន័យរបស់អ្នក\n",
"\n",
"ភារកិច្ចដំបូងនៅដៃមុនចាប់ផ្តើមគម្រោងនេះ គឺសម្អាត និង **តុល្យភាព** ទិន្នន័យរបស់អ្នកដើម្បីទទួលបានលទ្ធផលល្អប្រសើរជាងមុន\n",
"\n",
"មកស្គាល់ទិន្នន័យគ្នាដែរ!🕵️\n"
],
"metadata": {
"id": "PFkQDlk0GN5O"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Import data\r\n",
"df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/4-Classification/data/cuisines.csv\")\r\n",
"\r\n",
"# View the first 5 rows\r\n",
"df %>% \r\n",
" slice_head(n = 5)\r\n"
],
"outputs": [],
"metadata": {
"id": "Qccw7okxGT0S"
}
},
{
"cell_type": "markdown",
"source": [
"គួរឱ្យចាប់អារម្មណ៍! ពីរូបរាងវា តួបែបទីមួយគឺជាបន្ទាត់ `id` មួយប្រភេទ។ យើងចង់ទទួលបានព័ត៌មានបន្ថែមអំពីទិន្នន័យនេះ។\n"
],
"metadata": {
"id": "XrWnlgSrGVmR"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Basic information about the data\r\n",
"df %>%\r\n",
" introduce()\r\n",
"\r\n",
"# Visualize basic information above\r\n",
"df %>% \r\n",
" plot_intro(ggtheme = theme_light())"
],
"outputs": [],
"metadata": {
"id": "4UcGmxRxGieA"
}
},
{
"cell_type": "markdown",
"source": [
"From the output, we can immediately see that we have `2448` rows and `385` columns and `0` missing values. We also have 1 discrete column, *cuisine*.\n",
"\n",
"## វាយឆ្លើយ - រៀនអំពីម្ហូបជាតិ\n",
"\n",
"ឥឡូវនេះការងារចាប់ផ្តើមមានភាពរំភើបច្រើន។ អ្នកមកស្វែងយល់អំពីការចែកចាយទិន្នន័យ តាមប្រភេទម្ហូបជាតិ។\n"
],
"metadata": {
"id": "AaPubl__GmH5"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Count observations per cuisine\r\n",
"df %>% \r\n",
" count(cuisine) %>% \r\n",
" arrange(n)\r\n",
"\r\n",
"# Plot the distribution\r\n",
"theme_set(theme_light())\r\n",
"df %>% \r\n",
" count(cuisine) %>% \r\n",
" ggplot(mapping = aes(x = n, y = reorder(cuisine, -n))) +\r\n",
" geom_col(fill = \"midnightblue\", alpha = 0.7) +\r\n",
" ylab(\"cuisine\")"
],
"outputs": [],
"metadata": {
"id": "FRsBVy5eGrrv"
}
},
{
"cell_type": "markdown",
"source": [
"មានប្រភេទម្ហូបចំនួនកំណត់មួយ ប៉ុន្តែការចែកចាយទិន្នន័យមិនស្មើគ្នាទេ។ អ្នកអាចជួសជុលវាបាន! មុនពេលធ្វើដូច្នោះ សូមស្រាវជ្រាវបន្ថែមតិចជាងនេះ។ \n",
"\n",
"បន្ទាប់មក យើងនឹងចែកចាយម្ហូបនីមួយៗទៅក្នុង tibble ផ្ទាល់ខ្លួនរបស់វា ហើយស្វែងរកមើលថាតើមានទិន្នន័យប៉ុន្មាន (ជួរឈរ, បន្ទាត់) រៀងរាល់ប្រភេទម្ហូបមួយៗ។ \n",
"\n",
"> A [tibble](https://tibble.tidyverse.org/) គឺជារាងទិន្នន័យទំនើបមួយ។ \n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/km/dplyr_filter.b480b264b03439ff.webp\"\n",
" width=\"600\"/>\n",
" <figcaption>ស្នាដៃដោយ @allison_horst</figcaption>\n"
],
"metadata": {
"id": "vVvyDb1kG2in"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Create individual tibble for the cuisines\r\n",
"thai_df <- df %>% \r\n",
" filter(cuisine == \"thai\")\r\n",
"japanese_df <- df %>% \r\n",
" filter(cuisine == \"japanese\")\r\n",
"chinese_df <- df %>% \r\n",
" filter(cuisine == \"chinese\")\r\n",
"indian_df <- df %>% \r\n",
" filter(cuisine == \"indian\")\r\n",
"korean_df <- df %>% \r\n",
" filter(cuisine == \"korean\")\r\n",
"\r\n",
"\r\n",
"# Find out how much data is available per cuisine\r\n",
"cat(\" thai df:\", dim(thai_df), \"\\n\",\r\n",
" \"japanese df:\", dim(japanese_df), \"\\n\",\r\n",
" \"chinese_df:\", dim(chinese_df), \"\\n\",\r\n",
" \"indian_df:\", dim(indian_df), \"\\n\",\r\n",
" \"korean_df:\", dim(korean_df))"
],
"outputs": [],
"metadata": {
"id": "0TvXUxD3G8Bk"
}
},
{
"cell_type": "markdown",
"source": [
"អស្ចារ្យ!😋\n",
"\n",
"## **ហាត់ប្រាណ - រកឃើញសារធាតុសំខាន់ៗតាមម្ហូបប្រភេទជាមួយ dplyr**\n",
"\n",
"ឥឡូវនេះ អ្នកអាចធ្វើការជ្រៀតចូលជ្រៅក្នុងទិន្នន័យ ហើយស្វែងយល់ថាតើសារធាតុណាដែលជាមធ្យមសម្រាប់ម្ហូបប្រភេទនីមួយៗ។ អ្នកគួរតែសម្អាតទិន្នន័យដែលបញ្ជេញមកជាច្រើនដែលបង្កើតការភាន់ច្រឡំរវាងម្ហូបប្រភេទ ដូច្នេះចូរយើងស្វែងយល់អំពីបញ្ហានេះ។\n",
"\n",
"បង្កើតមុខងារ `create_ingredient()` នៅក្នុង R ដែលធ្វើការចេញផ្តល់មកជាតារាងដាតាដាហ្វ្រេមអំពីសារធាតុផ្សំមួយ។ មុខងារនេះនឹងចាប់ផ្តើមដោយការដកបញ្ជៅមួយដែលគ្មានប្រយោជន៍ចេញ ហើយរៀបចំតាមសារធាតុផ្សំជាតាមចំនួនរបស់ពួកវា។\n",
"\n",
"រចនាសម្ព័ន្ធមូលដ្ឋាននៃមុខងារមួយនៅក្នុង R គឺ៖\n",
"\n",
"`myFunction <- function(arglist){`\n",
"\n",
"**`...`**\n",
"\n",
"**`return`**`(value)`\n",
"\n",
"`}`\n",
"\n",
"ការណែនាំស្អាតសំរាប់មុខងារ R អាចរកឃើញបាន [នៅទីនេះ](https://skirmer.github.io/presentations/functions_with_r.html#1)។\n",
"\n",
"ចាប់ផ្តើមតម្រឹមមក! យើងនឹងប្រើប្រាស់ [កិរិយាសព្ទ dplyr](https://dplyr.tidyverse.org/) ដែលយើងបានរៀននៅមេរៀនមុនៗ។ ដូចជាការត្រលប់មកមើលឡើងវិញ៖\n",
"\n",
"- `dplyr::select()`: ជួយអ្នកជ្រើសរើសថាតើក колонមានណាមួយដើម្បីរក្សា ឬដកចេញ។\n",
"\n",
"- `dplyr::pivot_longer()`: ជួយអ្នក \"ពង្រីក\" ទិន្នន័យ បន្ថែមចំនួនជួរដេក ហើយកាត់បន្ថយចំនួនជួរឈរ។\n",
"\n",
"- `dplyr::group_by()` និង `dplyr::summarise()`: ជួយអ្នករកស្ថិតិសង្ខេបសម្រាប់ក្រុមខុសៗគ្នា ហើយដាក់វាទៅក្នុងតារាងដ៏ស្អាតមួយ។\n",
"\n",
"- `dplyr::filter()`: បង្កើតជាផ្នែករងនៃទិន្នន័យ ដែលមានតែជួរដេកដែលបំពេញលក្ខខណ្ឌរបស់អ្នកប៉ុណ្ណោះ។\n",
"\n",
"- `dplyr::mutate()`: ជួយអ្នកបង្កើត ឬកែប្រែក колонមួយ។\n",
"\n",
"សូមពិនិត្យមើល [មេរៀនFilled with *art*](https://allisonhorst.shinyapps.io/dplyr-learnr/#section-welcome) នៃ learnr ដែលបង្កើតដោយ Allison Horst ដែលណែនាំមុខងារព្យួរការទិន្នន័យមានប្រយោជន៍នៅក្នុង dplyr *(ជាផ្នែកនៃ Tidyverse)*។\n"
],
"metadata": {
"id": "K3RF5bSCHC76"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Creates a functions that returns the top ingredients by class\r\n",
"\r\n",
"create_ingredient <- function(df){\r\n",
" \r\n",
" # Drop the id column which is the first colum\r\n",
" ingredient_df = df %>% select(-1) %>% \r\n",
" # Transpose data to a long format\r\n",
" pivot_longer(!cuisine, names_to = \"ingredients\", values_to = \"count\") %>% \r\n",
" # Find the top most ingredients for a particular cuisine\r\n",
" group_by(ingredients) %>% \r\n",
" summarise(n_instances = sum(count)) %>% \r\n",
" filter(n_instances != 0) %>% \r\n",
" # Arrange by descending order\r\n",
" arrange(desc(n_instances)) %>% \r\n",
" mutate(ingredients = factor(ingredients) %>% fct_inorder())\r\n",
" \r\n",
" \r\n",
" return(ingredient_df)\r\n",
"} # End of function"
],
"outputs": [],
"metadata": {
"id": "uB_0JR82HTPa"
}
},
{
"cell_type": "markdown",
"source": [
"ឥឡូវនេះ​យើងអាច​ប្រើ​មុខងារ​ដើម្បី​ទទួលបាន​គំនិត​អំពី​គ្រឿងផ្សំ​ចំនួនដប់ដ៏ពេញនិយម​បំផុត​តាម​ប្រភេទម្ហូប។ ចូរយក​ចេញ​មើល​ជាមួយ `thai_df`។\n"
],
"metadata": {
"id": "h9794WF8HWmc"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Call create_ingredient and display popular ingredients\r\n",
"thai_ingredient_df <- create_ingredient(df = thai_df)\r\n",
"\r\n",
"thai_ingredient_df %>% \r\n",
" slice_head(n = 10)"
],
"outputs": [],
"metadata": {
"id": "agQ-1HrcHaEA"
}
},
{
"cell_type": "markdown",
"source": [
"នៅក្នុងផ្នែកមុន យើងបានប្រើ `geom_col()` យើងចង់មើលថាតើអ្នកអាចប្រើ `geom_bar` ដែរ ដើម្បីបង្កើតសៀរមាត្តរបារផងដែរ។ ប្រើ `?geom_bar` សម្រាប់អានបន្ថែម។\n"
],
"metadata": {
"id": "kHu9ffGjHdcX"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Make a bar chart for popular thai cuisines\r\n",
"thai_ingredient_df %>% \r\n",
" slice_head(n = 10) %>% \r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"steelblue\") +\r\n",
" xlab(\"\") + ylab(\"\")"
],
"outputs": [],
"metadata": {
"id": "fb3Bx_3DHj6e"
}
},
{
"cell_type": "markdown",
"source": [
"ចូរធ្វើអោយដូចគ្នាសម្រាប់ទិន្នន័យជប៉ុននេះផង\n"
],
"metadata": {
"id": "RHP_xgdkHnvM"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Get popular ingredients for Japanese cuisines and make bar chart\r\n",
"create_ingredient(df = japanese_df) %>% \r\n",
" slice_head(n = 10) %>%\r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"darkorange\", alpha = 0.8) +\r\n",
" xlab(\"\") + ylab(\"\")\r\n"
],
"outputs": [],
"metadata": {
"id": "019v8F0XHrRU"
}
},
{
"cell_type": "markdown",
"source": [
"តើអាហារចិនយ៉ាងដូចម្តេច?\n"
],
"metadata": {
"id": "iIGM7vO8Hu3v"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Get popular ingredients for Chinese cuisines and make bar chart\r\n",
"create_ingredient(df = chinese_df) %>% \r\n",
" slice_head(n = 10) %>%\r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"cyan4\", alpha = 0.8) +\r\n",
" xlab(\"\") + ylab(\"\")"
],
"outputs": [],
"metadata": {
"id": "lHd9_gd2HyzU"
}
},
{
"cell_type": "markdown",
"source": [
"មកមើលម្ហូបឥណ្ឌាក្នុងចំណោមវាជាអំណោយជាតិ 🌶️។\n"
],
"metadata": {
"id": "ir8qyQbNH1c7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Get popular ingredients for Indian cuisines and make bar chart\r\n",
"create_ingredient(df = indian_df) %>% \r\n",
" slice_head(n = 10) %>%\r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"#041E42FF\", alpha = 0.8) +\r\n",
" xlab(\"\") + ylab(\"\")"
],
"outputs": [],
"metadata": {
"id": "ApukQtKjH5FO"
}
},
{
"cell_type": "markdown",
"source": [
"ចុងក្រោយ បង្ហាញគ្រឿងផ្សំកូរ៉េ។\n"
],
"metadata": {
"id": "qv30cwY1H-FM"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Get popular ingredients for Korean cuisines and make bar chart\r\n",
"create_ingredient(df = korean_df) %>% \r\n",
" slice_head(n = 10) %>%\r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"#852419FF\", alpha = 0.8) +\r\n",
" xlab(\"\") + ylab(\"\")"
],
"outputs": [],
"metadata": {
"id": "lumgk9cHIBie"
}
},
{
"cell_type": "markdown",
"source": [
"ពីរូបភាពតំណាងទិន្នន័យ ឥឡូវនេះយើងអាចដកចេញគ្រឿងផ្សំដែលមានប្រើប្រាស់ទូទៅបំផុតដែលបង្កើតការយ៉ាងច្របូកច្របល់ចំពោះម្ហូបប្រភេទផ្សេងៗ ដោយប្រើ `dplyr::select()`។\n",
"\n",
"មនុស្សគ្រប់គ្នាស្រឡាញ់អង្ករ ខ្ទឹម និងខ្ញី!\n"
],
"metadata": {
"id": "iO4veMXuIEta"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Drop id column, rice, garlic and ginger from our original data set\r\n",
"df_select <- df %>% \r\n",
" select(-c(1, rice, garlic, ginger))\r\n",
"\r\n",
"# Display new data set\r\n",
"df_select %>% \r\n",
" slice_head(n = 5)"
],
"outputs": [],
"metadata": {
"id": "iHJPiG6rIUcK"
}
},
{
"cell_type": "markdown",
"source": [
"## ការប្រមូលផ្តុំទិន្នន័យជាមុនដោយប្រើរូបមន្ត 👩‍🍳👨‍🍳 - គ្រប់គ្រងទិន្នន័យមិនស្មើគ្នា ⚖️\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/km/recipes.186acfa8ed2e8f00.webp\"\n",
" width=\"600\"/>\n",
" <figcaption>សិល្បៈដោយ @allison_horst</figcaption>\n",
"\n",
"ដោយសារមេរៀននេះជារឿងអំពីម្ហូបសេប, យើងត្រូវតែដាក់ `recipes` ទៅក្នុងបរិបទ។\n",
"\n",
"Tidymodels ផ្ដល់នូវកញ្ចប់មួយទៀតដែលគួរអោយចាប់អារម្មណ៍: `recipes`- កញ្ចប់សម្រាប់ការប្រមូលផ្តុំទិន្នន័យជាមុន។\n"
],
"metadata": {
"id": "kkFd-JxdIaL6"
}
},
{
"cell_type": "markdown",
"source": [
"ចង់មើលការចែកចាយនៃម្ហូបរបស់យើងម្តងទៀត។\n"
],
"metadata": {
"id": "6l2ubtTPJAhY"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Distribution of cuisines\r\n",
"old_label_count <- df_select %>% \r\n",
" count(cuisine) %>% \r\n",
" arrange(desc(n))\r\n",
"\r\n",
"old_label_count"
],
"outputs": [],
"metadata": {
"id": "1e-E9cb7JDVi"
}
},
{
"cell_type": "markdown",
"source": [
"ដូចដែលអ្នកអាចមើលឃើញ មានការចែកចាយមិនស្មើគ្នាក្នុងចំនួនម្ហូបអាហារ។ ម្ហូបអាហារកូរ៉េប្រហែលជា ៣ ដងនៃម្ហូបអាហារថៃ។ ទិន្នន័យមិនស្មើគ្នានេះជារឿយៗធ្វើឲ្យមានផលប៉ះពាល់អវិជ្ជមានទៅលើការបង្ហាត់ម៉ូដែល។ ពិចារណាពីការបែងចែកពីរប្រភេទ។ ប្រសិនបើទិន្នន័យភាគច្រើនរបស់អ្នកជាប្រភេទមួយម៉ូដែល ML នឹងទាយយ៉ាងច្រើននូវប្រភេទនោះ ដោយសារតែមានទិន្នន័យច្រើនសម្រាប់វា។ ការតុល្យភាពទិន្នន័យជួយយកទិន្នន័យដែលត្រូវបានព្យួរជ្រុង និងជួយដកចេញពីភាពមិនស្មើគ្នានេះ។ ម៉ូដែលជាច្រើនមានសមត្ថភាពល្អបំផុតនៅពេលចំនួនការសង្កេតឃើញស្មើគ្នា ហើយដូច្នេះ លំបាកចំពោះទិន្នន័យមិនស្មើគ្នា។\n",
"\n",
"មានវិធីធំៗពីរដើម្បីដោះស្រាយបញ្ហាទិន្នន័យមិនស្មើគ្នា៖\n",
"\n",
"- បន្ថែមការសង្កេតទៅក្នុងប្រភេទតិច: `ការបន្ថែមទិន្នន័យ` ឧ. ប្រើអាល់ហ្គរីធึម SMOTE\n",
"\n",
"- ដកការសង្កេតចេញពីប្រភេទភាគច្រើន: `ការកាត់បន្ថយទិន្នន័យ`\n",
"\n",
"ឥឡូវនេះយើងនឹងបង្ហាញទ្រង់ទ្រាយធ្វើដូចម្ដេចដើម្បីដោះស្រាយបញ្ហាទិន្នន័យមិនស្មើគ្នាប្រើ `recipe`។ ឯកសារ recipe អាចគិតថាជារូបរាងសម្រាប់ពិពណ៌នាពីជំហានជាក់លាក់ដែលគួរត្រូវបានអនុវត្តលើទិន្នន័យ ដើម្បីធ្វើឲ្យវាត្រៀមសម្រាប់វិភាគទិន្នន័យ។\n"
],
"metadata": {
"id": "soAw6826JKx9"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Load themis package for dealing with imbalanced data\r\n",
"library(themis)\r\n",
"\r\n",
"# Create a recipe for preprocessing data\r\n",
"cuisines_recipe <- recipe(cuisine ~ ., data = df_select) %>% \r\n",
" step_smote(cuisine)\r\n",
"\r\n",
"cuisines_recipe"
],
"outputs": [],
"metadata": {
"id": "HS41brUIJVJy"
}
},
{
"cell_type": "markdown",
"source": [
"ចង់បំបែកជំហានដំបូងនៃការកំណត់ទិន្នន័យរបស់យើង។\n",
"\n",
"- ការហៅ `recipe()` ជាមួយនឹងរូបមន្តបានប្រាប់ឱ្យ recipe ស្គាល់ *តួនាទី* នៃអថេរជាមួយ `df_select` ទិន្នន័យជាគន្លងយោង។ ឧទាហរណ៍ជួរដេក `cuisine` ត្រូវបានផ្ដល់តួនាទីជា `outcome` ខណៈជួរដេកផ្សេងទៀតត្រូវបានផ្ដល់តួនាទីជា `predictor`។\n",
"\n",
"- [`step_smote(cuisine)`](https://themis.tidymodels.org/reference/step_smote.html) បង្កើត *កំណត់បែបបទ* នៃជំហាន recipe មួយដែលបង្កើតឧទាហរណ៍ថ្មីៗនៃថ្នាក់តិចចំនួនដោយប្រើអ្នកជិតខាងបំផុតនៃករណីទាំងនេះ។\n",
"\n",
"ឥឡូវនេះ ប្រសិនបើយើងចង់មើលទិន្នន័យដែលបានកំណត់រួចជាមុន ត្រូវតែ [**`prep()`**](https://recipes.tidymodels.org/reference/prep.html) និង [**`bake()`**](https://recipes.tidymodels.org/reference/bake.html) recipe របស់យើង។\n",
"\n",
"`prep()`: ประมาณค่าพารามิเตอร์ที่จำเป็นจากชุดฝึกซ้อมที่สามารถนำไปใช้กับชุดข้อมูลอื่นได้ในภายหลัง។\n",
"\n",
"`bake()`: យក recipe ដែលបានកំណត់រួចហើយដាក់អនុវត្តលើគ្រប់សំណុំទិន្នន័យមួយណា។\n"
],
"metadata": {
"id": "Yb-7t7XcJaC8"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Prep and bake the recipe\r\n",
"preprocessed_df <- cuisines_recipe %>% \r\n",
" prep() %>% \r\n",
" bake(new_data = NULL) %>% \r\n",
" relocate(cuisine)\r\n",
"\r\n",
"# Display data\r\n",
"preprocessed_df %>% \r\n",
" slice_head(n = 5)\r\n",
"\r\n",
"# Quick summary stats\r\n",
"preprocessed_df %>% \r\n",
" introduce()"
],
"outputs": [],
"metadata": {
"id": "9QhSgdpxJl44"
}
},
{
"cell_type": "markdown",
"source": [
"ឥឡូវនេះយើងចាំពិនិត្យចែកចាយម្ហូបអាហាររបស់យើង ហើយប្រៀបធៀបវាជាមួយទិន្នន័យដែលមានការមិនសមតុល្យ។\n"
],
"metadata": {
"id": "dmidELh_LdV7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Distribution of cuisines\r\n",
"new_label_count <- preprocessed_df %>% \r\n",
" count(cuisine) %>% \r\n",
" arrange(desc(n))\r\n",
"\r\n",
"list(new_label_count = new_label_count,\r\n",
" old_label_count = old_label_count)"
],
"outputs": [],
"metadata": {
"id": "aSh23klBLwDz"
}
},
{
"cell_type": "markdown",
"source": [
"យឹម! ទិន្នន័យនេះឆ្ងាយ និងស្អាត, មានតុល្យភាព ហើយឆ្ងាញ់ណាស់ 😋!\n",
"\n",
"> ជាច្បាប់, រេស៊ីពីជាមធ្យោបាយមួយសម្រាប់ការរៀបចំទិន្នន័យដែលវាកំណត់ថា តើជំហានណាខ្លះដែលគួរត្រូវអនុវត្តទៅលើសំណុំទិន្នន័យ ដើម្បីធ្វើឱ្យវាម្រាមម៉ូនសម្រាប់ការគំរូ។ ក្នុងករណីនោះ, `workflow()` ជាទូទៅត្រូវបានប្រើ (ដូចដែលយើងបានឃើញក្នុងមេរៀនមុនៗរបស់ពួកយើង) ជំនួសការប៉ាន់ប្រមាណរេស៊ីពីដោយដៃ។\n",
">\n",
"> ដូច្នេះ អ្នកមិនអាចត្រូវការប្រើ **`prep()`** និង **`bake()`** ជារេស៊ីពីនៅពេលប្រើ tidymodels ប៉ុន្តែវាជាភាសារបស់ឧបករណ៍មួយ ដើម្បីផ្ទៀងផ្ទាត់ថារេស៊ីពីកំពុងធ្វើអ្វីដែលអ្នករំពឹងទុក ដូចក្នុងករណីរបស់យើង។\n",
">\n",
"> នៅពេលដែលអ្នក **`bake()`** រេស៊ីពីដែលបានរៀបចំជាមួយ **`new_data = NULL`**, អ្នកនឹងទទួលបានទិន្នន័យដែលអ្នកបានផ្ដល់ពេលកំណត់រេស៊ីពីត្រឡប់មកវិញ ប៉ុន្តែបានរត់តាមជំហាននៃការរៀបចំជាមុន។\n",
"\n",
"ឥឡូវនេះ ចូរកត់ត្រា ចម្លងទិន្នន័យនេះសម្រាប់ប្រើនៅមេរៀននាពេលអនាគត៖\n"
],
"metadata": {
"id": "HEu80HZ8L7ae"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Save preprocessed data\r\n",
"write_csv(preprocessed_df, \"../../../data/cleaned_cuisines_R.csv\")"
],
"outputs": [],
"metadata": {
"id": "cBmCbIgrMOI6"
}
},
{
"cell_type": "markdown",
"source": [
"CSV ថ្មីនេះឥឡូវនេះអាចរកឃើញនៅក្នុងថតទិន្នន័យដើម។\n",
"\n",
"**🚀ការ​ប្រកួតប្រជែង**\n",
"\n",
"មេរៀននេះមានសំណុំនៃទិន្នន័យច្រើននាក់ដែលគួរឱ្យចាប់អារម្មណ៍។ សូមស្វែងរកក្នុងថត `data` ហើយមើលថាតើមានទិន្នន័យណាដែលសមស្របសម្រាប់ការធ្វើចំណាត់ថ្នាក់ពីរភាគ ឬចំណាត់ថ្នាក់ច្រើនជំពូកទេ? តើអ្នកនឹងសួរបញ្ហាអ្វីពីទិន្នន័យនេះ?\n",
"\n",
"## [**ភាសាការប្រលងក្រោយមេរៀន**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/20/)\n",
"\n",
"## **ការត្រួតពិនិត្យ & ការសិក្សាឯកត្ត**\n",
"\n",
"- សូមពិនិត្យមើល [package themis](https://github.com/tidymodels/themis)។ តើយុទ្ធសាស្ត្រផ្សេងទៀតណាអាចប្រើដើម្បីដោះស្រាយបញ្ហាទិន្នន័យមិនសមមាត្របាន?\n",
"\n",
"- គេហទំព័រយោងរបស់ម៉ូដែល Tidy [reference website](https://www.tidymodels.org/start/)។\n",
"\n",
"- H. Wickham និង G. Grolemund, [*R សម្រាប់វិទ្យាសាស្ត្រទិន្នន័យ៖ ការមើលឃើញ, ម៉ូដែល, ការបំលែង, ការរៀបចំ, និងការនាំចូលទិន្នន័យ*](https://r4ds.had.co.nz/)។\n",
"\n",
"#### អរគុណចំពោះ៖\n",
"\n",
"[`Allison Horst`](https://twitter.com/allison_horst/) សម្រាប់ការបង្កើតរូបភាពដ៏អស្ចារ្យដែលធ្វើឲ្យ R កាន់តែស្វាគមន៍ និងមានភាពទាក់ទាញ។ សូមរករូបភាពបន្ថែមតាម [កម្រងរូបភាពរបស់នាង](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM)។\n",
"\n",
"[Cassie Breviu](https://www.twitter.com/cassieview) និង [Jen Looper](https://www.twitter.com/jenlooper) សម្រាប់ការបង្កើតជំនាន់ Python ដើមនៃមូឌុលនេះ ♥️\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/km/r_learners_sm.cd14eb3581a9f28d.webp\"\n",
" width=\"600\"/>\n",
" <figcaption>សិល្បៈដោយ @allison_horst</figcaption>\n"
],
"metadata": {
"id": "WQs5621pMGwf"
}
},
{
"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"
]
}
]
}