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/2-Regression/1-Tools/solution/R/lesson_1-R.ipynb

449 lines
29 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

{
"nbformat": 4,
"nbformat_minor": 2,
"metadata": {
"colab": {
"name": "lesson_1-R.ipynb",
"provenance": [],
"collapsed_sections": [],
"toc_visible": true
},
"kernelspec": {
"name": "ir",
"display_name": "R"
},
"language_info": {
"name": "R"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"# បង្កើតម៉ូដែលរេក្រេស្សិន៖ ចាប់ផ្តើមជាមួយ R និង Tidymodels សម្រាប់ម៉ូដែលរេក្រេស្សិន\n"
],
"metadata": {
"id": "YJUHCXqK57yz"
}
},
{
"cell_type": "markdown",
"source": [
"## ការណែនាំអំពីការត្រួតពិនិត្យ - មេរៀន ១\n",
"\n",
"#### យកវាទៅក្នុងទិសដៅ\n",
"\n",
"✅ មានប្រភេទវិធីសាស្រ្តត្រួតពិនិត្យជាច្រើន ហើយការជ្រើសរើសរបស់អ្នកអាស្រ័យលើចម្លើយដែលអ្នកកំពុងស្វែងរក។ ប្រសិនបើអ្នកចង់ទាយទុកកម្ពស់ប្រហែលសម្រាប់មនុស្សម្នាក់មានអាយុជាក់លាក់ អ្នកនឹងប្រើ `linear regression` ពីព្រោះអ្នកកំពុងស្វែងរក **តម្លៃលេខ**។ ប្រសិនបើអ្នកមានចំណាប់អារម្មណ៍ក្នុងការរកមើលថាតើប្រភេទម្ហូបមួយគួរត្រូវបានគិតថាជា វេហ្គាន់ ឬអត់ អ្នកកំពុងស្វែងរក **ការបែងចែកប្រភេទ** ដូច្នេះអ្នកនឹងប្រើ `logistic regression`។ អ្នកនឹងរៀនបន្ថែមអំពី logistic regression បន្ទាប់។ សូមគិតបន្តិចអំពីសំណួរខ្លះៗដែលអ្នកអាចសួរពីទិន្នន័យ ហើយវិធីសាស្រ្តណាមួយនៃវិធីเหล่านี้ដែលអាចសមរម្យជាងគេ។\n",
"\n",
"នៅក្នុងផ្នែកនេះ អ្នកនឹងធ្វើការជាមួយ [ឌាតាសេតតូចមួយអំពីជំងឺទឹកនោមផ្អែម](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html)។ សូមនឹកស្រមៃថា អ្នកចង់សាកល្បងការព្យាបាលសម្រាប់អ្នកជំងឺទឹកនោមផ្អែម។ ម៉ាស៊ីនរៀនអាចជួយអ្នកកំណត់ថា អ្នកជំងឺណាដែលនឹងឆ្លើយតបល្អជាងចំពោះការព្យាបាល ដោយផ្អែកលើការបញ្ចូលរួមនៃអថេរពីរបៀបផ្សេងៗ។ តែម៉ូដែលត្រួតពិនិត្យមានតំរូវការសាមញ្ញមួយ កាលណាត្រូវបានបង្ហាញជារូបភាព អាចបង្ហាញព័ត៌មានអំពីអថេរពីរដែលអាចជួយអ្នករៀបចំបទពិសោធន៍គ្លីនិកសាកល្បងទ្រឹស្តី។\n",
"\n",
"ហេតុនេះហើយបានជាអ្នកចាប់ផ្តើមការងារនេះបាន! \n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/km/encouRage.e75d5fe0367fb913.webp\"\n",
" width=\"630\"/>\n",
" <figcaption>ស្នាដៃដោយ @allison_horst</figcaption>\n",
"\n",
"<!--![Artwork by \\@allison_horst](../../../../../../translated_images/km/encouRage.e75d5fe0367fb913.webp)<br>Artwork by @allison_horst-->\n"
],
"metadata": {
"id": "LWNNzfqd6feZ"
}
},
{
"cell_type": "markdown",
"source": [
"## 1. ការផ្ទុកឧបករណ៍របស់យើងឡើង\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",
"អ្នកអាចដំឡើងវាដូចជា៖\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\"))`\n",
"\n",
"ស្គ្រីបខាងក្រោមនេះត្រួតពិនិត្យថា តើអ្នកមានបណ្ណាល័យទាំងនេះដើម្បីបញ្ចប់មូឌុលនេះរួចថែមទៀត ហើយតំឡើងសម្រាប់អ្នក ប្រសិនបើមានខាតខាត។\n"
],
"metadata": {
"id": "FIo2YhO26wI9"
}
},
{
"cell_type": "code",
"execution_count": 2,
"source": [
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n",
"pacman::p_load(tidyverse, tidymodels)"
],
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"Loading required package: pacman\n",
"\n"
]
}
],
"metadata": {
"id": "cIA9fz9v7Dss",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "2df7073b-86b2-4b32-cb86-0da605a0dc11"
}
},
{
"cell_type": "markdown",
"source": [
"ឥឡូវនេះ យើងសូមផ្ទុកបណ្ណាល័យអស្ចារ្យទាំងនេះ ហើយធ្វើឲ្យវាប្រើបានក្នុងសម័យ R បច្ចុប្បន្នរបស់យើង។ (នេះគ្រាន់តែសម្រាប់ការបង្ហាញតែប៉ុណ្ណោះ `pacman::p_load()` បានធ្វើរួចហើយសម្រាប់អ្នក)\n"
],
"metadata": {
"id": "gpO_P_6f9WUG"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# load the core Tidyverse packages\r\n",
"library(tidyverse)\r\n",
"\r\n",
"# load the core Tidymodels packages\r\n",
"library(tidymodels)\r\n"
],
"outputs": [],
"metadata": {
"id": "NLMycgG-9ezO"
}
},
{
"cell_type": "markdown",
"source": [
"## 2. សំណុំទិន្នន័យជំងឺឆ្លងឈ сахар\n",
"\n",
"ក្នុងការអនុវត្តនេះ យើងនឹងបង្ហាញជំនាញការស្រង់ទិន្នន័យរបស់យើងដោយធ្វើការព្យាករណ៍លើសំណុំទិន្នន័យជំងឺឆ្លងឈ сахар។ [សំណុំទិន្នន័យជំងឺឆ្លងឈ сахар](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt) មាន `៤៤២ គំរូ` នៃទិន្នន័យជុំវិញជំងឺឆ្លងឈ сахар ដែលមានអថេរព្យាករណ៍លក្ខណៈ ១០ គឺ `អាយុ`, `ភេទ`, `រូបមាត្រមាឌរាងកាយ`, `សម្ពាធឈាមមធ្យម`, និង `ការវាស់ម៉ាស៊ីនសាំមេរ៉ា ៦ នាក់` ជាមួយអថេរវិលតប `y`៖ ជាអនុមាត្រលេខវាស់វែងនៃការរីកចម្រើនជំងឺមួយឆ្នាំបន្ទាប់ពីកំណត់ចំណុចដើម។\n",
"\n",
"|ចំនួនការសង្កេត|៤៤២|\n",
"|-----------------|:---|\n",
"|ចំនួនអថេរព្យាករណ៍|ជួរដេកទី ១០ ដំបូងគឺអថេរព្យាករណ៍ជាលេខ|\n",
"|លទ្ធផល/គោលដៅ|ជួរដេកទី ១១ ជាអនុមាត្រាលេខវាស់វែងនៃការរីកចម្រើនជំងឺមួយឆ្នាំបន្ទាប់ពីកំណត់ចំណុចដើម|\n",
"|ព័ត៌មានអថេរព្យាករណ៍|- អាយុជាឆ្នាំ\n",
"||- ភេទ\n",
"||- bmi មាត្ររូបធាតុរាងកាយ\n",
"||- bp សម្ពាធឈាមមធ្យម\n",
"||- s1 tc, គ្លេសតេរាលសេរ៉ូមសរុប\n",
"||- s2 ldl, លីពីតភាគតិច\n",
"||- s3 hdl, លីពីតភាគខ្ពស់\n",
"||- s4 tch, គ្លេសតេរាលសរុប / HDL\n",
"||- s5 ltg, ប្រហែលជាលក់នៃកម្រិតថ្រីក្លីសេរូម\n",
"||- s6 glu, កម្រិតស្ករក្នុងឈាម|\n",
"\n",
"\n",
"\n",
"\n",
"> 🎓 ចងចាំថា នេះគឺជាការរៀនដោយមានការត្រួតពិនិត្យ ហើយយើងត្រូវការគោលដៅឈ្មោះ 'y'។\n",
"\n",
"មុនពេលអ្នកអាចដោះស្រាយទិន្នន័យជាមួយ R បាន អ្នកត្រូវនាំចូលទិន្នន័យទៅក្នុងអង្គច័ន្ទ R ឬ បង្កើតការតភ្ជាប់ទៅកាន់ទិន្នន័យដែល R អាចប្រើដើម្បីចូលប្រើទិន្នន័យពីចម្ងាយ។\n",
"\n",
"> កញ្ចប់ [readr](https://readr.tidyverse.org/), ដែលជាផ្នែកមួយនៃ Tidyverse, ផ្ដល់នូវវិធីរហ័ស និងផ friendliness បានសម្រាប់អានទិន្នន័យរាងគូទ័រចូលទៅក្នុង R។\n",
"\n",
"ឥលូវនេះ នាំចូលសំណុំទិន្នន័យជំងឺឆ្លងឈ сахар ដែលផ្ដល់នៅក្នុង URL ផ្ដើមនេះ៖ <https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html>\n",
"\n",
"បន្ថែមពីនេះ យើងនឹង​ធ្វើតេស្តសុវត្ថិភាពជាមួយទិន្នន័យរបស់យើងដោយប្រើ `glimpse()` ហើយបង្ហាញជួរដេកដំបូង ៥ ជួរដោយប្រើ `slice()`។\n",
"\n",
"មុនពេលទៅកាន់ជំហានបន្ទាប់ សូមណែនាំអ្វីដែលអ្នកនឹងជួបញឹកញាប់ក្នុងកូដ R 🥁🥁: អុបរ៉ាត័រពីប `%>%`\n",
"\n",
"អុបរ៉ាត័រពីប (`%>%`) បំពេញសកម្មភាពជាដំណាក់កាលតាមលំដាប់ ដោយផ្ដល់វត្ថុទៅមុខក្នុងមុខងារឬវេយ្យាករណ៍ហៅ។ អ្នកអាចគិតអុបរ៉ាត័រពីបថា “បន្ទាប់មក” ក្នុងកូដរបស់អ្នក។\n"
],
"metadata": {
"id": "KM6iXLH996Cl"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Import the data set\r\n",
"diabetes <- read_table2(file = \"https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt\")\r\n",
"\r\n",
"\r\n",
"# Get a glimpse and dimensions of the data\r\n",
"glimpse(diabetes)\r\n",
"\r\n",
"\r\n",
"# Select the first 5 rows of the data\r\n",
"diabetes %>% \r\n",
" slice(1:5)"
],
"outputs": [],
"metadata": {
"id": "Z1geAMhM-bSP"
}
},
{
"cell_type": "markdown",
"source": [
"`glimpse()` បង្ហាញឲ្យយើងឃើញថា​ទិន្នន័យនេះមានជួរដេក ៤៤២ និងជួរឈរ ១១ ដែលជួរឈរទាំងអស់មានប្រភេទទិន្នន័យជា `double`\n",
"\n",
"<br>\n",
"\n",
"\n",
"\n",
"> glimpse() និង slice() គឺជាអនុគមន៍នៅក្នុង [`dplyr`](https://dplyr.tidyverse.org/)។ Dplyr ជាផ្នែកមួយនៃ Tidyverse គឺជាវិប្បដិសារក្នុងការដំណើរការទិន្នន័យ ដែលផ្តល់នូវសំណុំគំរូពាក្យកិរិយាដែលមានភាពស្របគ្នា ដែលជួយអ្នកដោះស្រាយបញ្ហាដំណើរការទិន្នន័យទូទៅបំផុត\n",
"\n",
"<br>\n",
"\n",
"ឥឡូវពេលដែលយើងមានទិន្នន័យហើយ មកកាន់ការជ្រើសរើសមួយលក្ខណៈ (`bmi`) សម្រាប់អនុវត្តការហាត់នេះ។ នេះក៏ត្រូវការឲ្យយើងជ្រើសរើសជួរឈរដែលចង់បាន។ តើយើងធ្វើបែបណា?\n",
"\n",
"[`dplyr::select()`](https://dplyr.tidyverse.org/reference/select.html) អនុញ្ញាតឲ្យយើង *ជ្រើសរើស* (ហើយញឹកញាប់អាចប្តូរឈ្មោះ) ជួរឈរនៅក្នុងសំណុំទិន្នន័យមួយ។\n"
],
"metadata": {
"id": "UwjVT1Hz-c3Z"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Select predictor feature `bmi` and outcome `y`\r\n",
"diabetes_select <- diabetes %>% \r\n",
" select(c(bmi, y))\r\n",
"\r\n",
"# Print the first 5 rows\r\n",
"diabetes_select %>% \r\n",
" slice(1:10)"
],
"outputs": [],
"metadata": {
"id": "RDY1oAKI-m80"
}
},
{
"cell_type": "markdown",
"source": [
"## 3. ទិន្នន័យសម្រាប់បណ្តុះបណ្តាល និងសាកល្បង\n",
"\n",
"វាជាវិធានការដែលត្រូវអនុវត្តនៅក្នុងការរៀនតាមការត្រួតពិនិត្យ ដើម្បី *បំបែក* ទិន្នន័យចេញជាសំណុំនៃពីរផ្នែក; សំណុំនៃទិន្នន័យ (ដែលជាទូទៅធំជាង) សម្រាប់បង្រៀនម៉ូដែល ហើយសំណុំនៃទិន្នន័យតូច \"hold-back\" សម្រាប់មើលថា ម៉ូដែលបានបំពេញការងារយ៉ាងដូចម្តេច។\n",
"\n",
"ឥឡូវនេះពេលយើងមានទិន្នន័យរួចរាល់ អ្នកអាចមើលថាតើម៉ាស៊ីនអាចជួយកំណត់ការបំបែកត្រឹមត្រូវរវាងលេខក្នុងឧទាហរណ៍ទិន្នន័យនេះបានទេ។ យើងអាចប្រើកញ្ចប់ [rsample](https://tidymodels.github.io/rsample/) ដែលជាមួយនឹងស៊ុមរ៉ែធមូល Tidymodels ដើម្បីបង្កើតអតិបរមាមួយដែលមានព្រឹត្តិបត្រស្តីពី *វិធី* បំបែកទិន្នន័យ ហើយបន្ទាប់មកប្រើមុខងារ rsample ច្រើនទៀតពីរមុខងារដើម្បីទាញយកសំណុំទិន្នន័យបណ្តុះបណ្តាល និងសាកល្បងដែលបានបង្កើត៖\n"
],
"metadata": {
"id": "SDk668xK-tc3"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"set.seed(2056)\r\n",
"# Split 67% of the data for training and the rest for tesing\r\n",
"diabetes_split <- diabetes_select %>% \r\n",
" initial_split(prop = 0.67)\r\n",
"\r\n",
"# Extract the resulting train and test sets\r\n",
"diabetes_train <- training(diabetes_split)\r\n",
"diabetes_test <- testing(diabetes_split)\r\n",
"\r\n",
"# Print the first 3 rows of the training set\r\n",
"diabetes_train %>% \r\n",
" slice(1:10)"
],
"outputs": [],
"metadata": {
"id": "EqtHx129-1h-"
}
},
{
"cell_type": "markdown",
"source": [
"## 4. បណ្តុះបណ្តាលគំរូសមីការស្រមោលជាមួយ Tidymodels\n",
"\n",
"ឥឡូវនេះយើងមានស្រេចក្នុងការបណ្តុះបណ្តាលគំរូរបស់យើង!\n",
"\n",
"ក្នុង Tidymodels អ្នកកំណត់គំរូដោយប្រើ `parsnip()` ដោយបញ្ជាក់បីកន្លែង៖\n",
"\n",
"- ប្រភេទគំរូ **type** ផ្តែកគំរូៗ ដូចជាសមីការស្រមោលបន្ទាត់, សមីការស្រមោលឡូជីស្ទិច, គំរូដើមសម្រេចចិត្ត និងផ្សេងៗទៀត។\n",
"\n",
"- របៀបធ្វើដំណើរ **mode** រួមបញ្ចូលជម្រើសទូទៅដូចជា សមីការស្រមោល និង ការបែងចែកចំណាត់ថ្នាក់; ប្រភេទគំរូមួយចំនួនគាំទ្រតែម្ដងឬទាំងពីរ ខណៈដែលមួយចំនួនមានតែរបៀបធ្វើដំណើរតែមួយ។\n",
"\n",
"- មេកានិចគំរូ **engine** គឺជាឧបករណ៍គណនាសម្រាប់តម្រៀបគំរូ។ ជាញឹកញាប់គឺជាកញ្ចប់ R មួយចំនួន ដូចជា **`\"lm\"`** ឬ **`\"ranger\"`**\n",
"\n",
"ព័ត៌មាននេះត្រូវបានកត់ត្រា​នៅក្នុងការបញ្ជាក់គំរូ ដូច្នេះមកបង្កើតមួយបានហើយ!\n"
],
"metadata": {
"id": "sBOS-XhB-6v7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Build a linear model specification\r\n",
"lm_spec <- \r\n",
" # Type\r\n",
" linear_reg() %>% \r\n",
" # Engine\r\n",
" set_engine(\"lm\") %>% \r\n",
" # Mode\r\n",
" set_mode(\"regression\")\r\n",
"\r\n",
"\r\n",
"# Print the model specification\r\n",
"lm_spec"
],
"outputs": [],
"metadata": {
"id": "20OwEw20--t3"
}
},
{
"cell_type": "markdown",
"source": [
"បន្ទាប់ពីម៉ូដែលត្រូវបាន *កំណត់* រួចហើយ ម៉ូដែលអាចត្រូវបាន `ពិនិត្យប្រមាណ` ឬ `បណ្តុះបណ្តាល` ដោយប្រើមុខងារ [`fit()`](https://parsnip.tidymodels.org/reference/fit.html) ជាទូទៅប្រើរូបមន្តមួយនិងទិន្នន័យមួយចំនួន។\n",
"\n",
"`y ~ .` មានន័យថាយើងនឹងត្រូវបណ្ដុះ `y` ជាបរិមាណដែលត្រូវព្យាករណ៍/គោលដៅ ដែលពណ៌នាដោយអ្នកដាំនេះរាល់គ្នា ie, `.` (ក្នុងករណីនេះ យើងមានអ្នកដាំតែមួយគត់គឺ `bmi` )\n"
],
"metadata": {
"id": "_oDHs89k_CJj"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Build a linear model specification\r\n",
"lm_spec <- linear_reg() %>% \r\n",
" set_engine(\"lm\") %>%\r\n",
" set_mode(\"regression\")\r\n",
"\r\n",
"\r\n",
"# Train a linear regression model\r\n",
"lm_mod <- lm_spec %>% \r\n",
" fit(y ~ ., data = diabetes_train)\r\n",
"\r\n",
"# Print the model\r\n",
"lm_mod"
],
"outputs": [],
"metadata": {
"id": "YlsHqd-q_GJQ"
}
},
{
"cell_type": "markdown",
"source": [
"ពីលទ្ធផលនៃម៉ូឌែល យើងអាចមើលឃើញអនុគមន៍ដែលបានរៀនឃើញនៅពេលបណ្តុះបណ្តាល។ វាតំណឹងអនុគមន៍នៃបន្ទាត់ដែលមានការសម្រួលល្អបំផុតដែលផ្តល់ឱ្យយើងនូវកំហុសសរុបទាបជាងគេទាំងពីរចន្លោះអថេរពិតនិងបានទាយ។\n",
"\n",
"<br>\n",
"\n",
"## 5. ធ្វើការទាយលទ្ធផលលើសំណុំទិន្នន័យតេស្ត\n",
"\n",
"ឥឡូវនេះដែលយើងបានបណ្តុះបណ្តាលម៉ូឌែលមួយរួចហើយ យើងអាចប្រើវាដើម្បីទាយការវិវឌ្ឍជំងឺ y សម្រាប់សំណុំទិន្នន័យតេស្តដោយប្រើ [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html)។ វានឹងត្រូវបានប្រើដើម្បីគូរបន្ទាត់រវាងក្រុមទិន្នន័យ។\n"
],
"metadata": {
"id": "kGZ22RQj_Olu"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Make predictions for the test set\r\n",
"predictions <- lm_mod %>% \r\n",
" predict(new_data = diabetes_test)\r\n",
"\r\n",
"# Print out some of the predictions\r\n",
"predictions %>% \r\n",
" slice(1:5)"
],
"outputs": [],
"metadata": {
"id": "nXHbY7M2_aao"
}
},
{
"cell_type": "markdown",
"source": [
"Woohoo! 💃🕺 យើងទើបតែបណ្តុះម៉ូដែលមួយ ហើយប្រើវាធ្វើការព្យាករណ៍!\n",
"\n",
"នៅពេលធ្វើការព្យាករណ៍ ទម្រង់ប្រើប្រាស់របស់ tidymodels គឺតែងតែបង្កើតតារាង tibble/data frame នៃលទ្ធផលដែលមានឈ្មោះជួរឈរប្រក្រតី។ នេះធ្វើឲ្យងាយស្រួលក្នុងការរួមបញ្ចូលទិន្នន័យដើម និងការព្យាករណ៍នៅក្នុងទម្រង់ដែលប្រើប្រាស់បានសម្រាប់ប្រតិបត្តិការបន្តដូចជាការគូររូប។\n",
"\n",
"`dplyr::bind_cols()` ភ្ជាប់ជួរឈរពហុទិន្នន័យបានយ៉ាងមានប្រសិទ្ធភាព។\n"
],
"metadata": {
"id": "R_JstwUY_bIs"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Combine the predictions and the original test set\r\n",
"results <- diabetes_test %>% \r\n",
" bind_cols(predictions)\r\n",
"\r\n",
"\r\n",
"results %>% \r\n",
" slice(1:5)"
],
"outputs": [],
"metadata": {
"id": "RybsMJR7_iI8"
}
},
{
"cell_type": "markdown",
"source": [
"## 6. រូបភាពលទ្ធផលម៉ូដែល\n",
"\n",
"ឥឡូវនេះ ពេលវេលាដើម្បីមើលវា secara visual 📈។ យើងនឹងបង្កើតរូបភាព scatter plot របស់តម្លៃ `y` និង `bmi` ទាំងអស់ក្នុងសំណុំតេស្ត បន្ទាប់មកប្រើការព្យាករណ៍ដើម្បីគូរបន្ទាត់នៅកន្លែងដែលសមស្របបំផុត ចន្លោះក្រុមទិន្នន័យនៃម៉ូដែល។\n",
"\n",
"R មានប្រព័ន្ធជាច្រើនសម្រាប់បង្កើតក្រាហ្វិច ប៉ុន្តែ `ggplot2` គឺជាឯកឯកភាពមួយក្នុងចំណោមស្រស់ស្អាត និងចម្រុះបំផុត។ វាអនុញ្ញាតឲ្យអ្នកបង្កើតក្រាហ្វិចដោយ **ប្រមូលផ្តុំធាតុដោយឯករាជ្យ**។\n"
],
"metadata": {
"id": "XJbYbMZW_n_s"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Set a theme for the plot\r\n",
"theme_set(theme_light())\r\n",
"# Create a scatter plot\r\n",
"results %>% \r\n",
" ggplot(aes(x = bmi)) +\r\n",
" # Add a scatter plot\r\n",
" geom_point(aes(y = y), size = 1.6) +\r\n",
" # Add a line plot\r\n",
" geom_line(aes(y = .pred), color = \"blue\", size = 1.5)"
],
"outputs": [],
"metadata": {
"id": "R9tYp3VW_sTn"
}
},
{
"cell_type": "markdown",
"source": [
"> ✅ គិតបន្តិចអំពីអ្វីកំពុងកើតឡើងនៅទីនេះ។ ខ្សែស្របមួយកំពុងដំណើរការតាមចំណុចតូចៗជាច្រើន ផ្ទាល់តែវាកំពុងធ្វើអ្វីយ៉ាងដូចម្តេច? តើអ្នកអាចឃើញថាអ្នកគួរត្រូវបានប្រើខ្សែនេះដើម្បីទាកទាយថាចំណុចទិន្នន័យថ្មីមួយដែលមិនទាន់បានឃើញគួរត្រូវតាំងនៅឯណាក្នុងទំនាក់ទំនងជាមួយអ័ក្ស y នៃតារាងនេះដែរឬទេ? ជួយព្យាយាមពន្យល់ជាភាសាអំពីការប្រើប្រាស់ដែលពាក់ព័ន្ធនឹងគំរូនេះ។\n",
"\n",
"សូមអបអរសាទរ អ្នកបានបង្កើតគំរូទំនាក់ទំនងបន្ទាត់ដំបូងរបស់អ្នក បានបង្កើតការទស្សន៍ទាយជាមួយវា ហើយបានបង្ហាញវាលើតារាងមួយ!\n"
],
"metadata": {
"id": "zrPtHIxx_tNI"
}
},
{
"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"
]
}
]
}