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

\n", " \n", "

អបអរសាទរម្ហូបអាហារប្រចាំប៉ានអាស៊ីក្នុងមេរៀនទាំងនេះ! រូបភាពដោយ Jen Looper
\n", "\n", "\n", "\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", "

\n", " \n", "

បញ្ហាប្រភេទពីរ និងពហុប្រភេទសម្រាប់អាល់ហ្គូរីធម៍បែងចែកដោះសោ។ ក្រាហ្វិកដោយ Jen Looper
\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", "

\n", " \n", "

ស្នាដៃដោយ @allison_horst
\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", "

\n", " \n", "

សិល្បៈដោយ @allison_horst
\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", "

\n", " \n", "

សិល្បៈដោយ @allison_horst
\n" ], "metadata": { "id": "WQs5621pMGwf" } }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n\n\n**ការព្រមាន**៖ \nឯកសារនេះត្រូវបាន​ប្រែសម្រួល​ដោយ​ប្រើ​ប្រាស់​សេវាកម្ម​ប្រែសម្រួល AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈ​ពេល​យើង​ព្យាយាម​ក្នុង​ការ​ធានា​នៃភាពត្រឹមត្រូវ សូម​ជ្រាប​ថា​ការ​ប្រែសម្រួល​ស្វ័យប្រវត្តិ​អាច​មាន​កំហុស ឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើម​នៅ​ភាសា​ដើម​គួរត្រូវ​បាន​គេ​កត់សម្គាល់​ថា​ជា​ប្រភព​ត្រឹមត្រូវ​និង​អ្នកមានអំណាច។ សម្រាប់​ព័ត៌មាន​សំខាន់ៗ ការប្រែសម្រួល​ដោយមនុស្ស​វិជ្ជាជីវៈ​ត្រូវបាន​សូម​ផ្តល់អាទិភាព។ យើងមិនទទួលខុសត្រូវចំពោះ​ការ​យល់ខុស ឬ​ការ​បំភាន់​ដែលបណ្តាលមកពី​ការ​ប្រើប្រាស់​ការ​ប្រែសម្រួល​នេះឡើយ។\n\n" ] } ] }