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/fa/2-Regression/2-Data/solution/R/lesson_2-R.ipynb

669 lines
31 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_2-R.ipynb",
"provenance": [],
"collapsed_sections": [],
"toc_visible": true
},
"kernelspec": {
"name": "ir",
"display_name": "R"
},
"language_info": {
"name": "R"
},
"coopTranslator": {
"original_hash": "f3c335f9940cfd76528b3ef918b9b342",
"translation_date": "2025-09-04T01:44:39+00:00",
"source_file": "2-Regression/2-Data/solution/R/lesson_2-R.ipynb",
"language_code": "fa"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"# ساخت یک مدل رگرسیون: آماده‌سازی و تجسم داده‌ها\n",
"\n",
"## **رگرسیون خطی برای کدو تنبل - درس دوم**\n",
"#### مقدمه\n",
"\n",
"حالا که ابزارهای لازم برای شروع ساخت مدل‌های یادگیری ماشین با استفاده از Tidymodels و Tidyverse را در اختیار دارید، آماده‌اید تا سوالاتی از داده‌های خود بپرسید. هنگام کار با داده‌ها و اعمال راه‌حل‌های یادگیری ماشین، بسیار مهم است که بدانید چگونه سوالات درست بپرسید تا بتوانید به درستی از پتانسیل‌های مجموعه داده خود استفاده کنید.\n",
"\n",
"در این درس، شما یاد خواهید گرفت:\n",
"\n",
"- چگونه داده‌های خود را برای ساخت مدل آماده کنید.\n",
"\n",
"- چگونه از `ggplot2` برای تجسم داده‌ها استفاده کنید.\n",
"\n",
"سوالی که نیاز به پاسخ آن دارید، تعیین می‌کند که از چه نوع الگوریتم‌های یادگیری ماشین استفاده خواهید کرد. همچنین کیفیت پاسخی که دریافت می‌کنید، به شدت به ماهیت داده‌های شما بستگی دارد.\n",
"\n",
"بیایید این موضوع را با انجام یک تمرین عملی بررسی کنیم.\n",
"\n",
"<p >\n",
" <img src=\"../../images/unruly_data.jpg\"\n",
" width=\"700\"/>\n",
" <figcaption>اثر هنری از @allison_horst</figcaption>\n"
],
"metadata": {
"id": "Pg5aexcOPqAZ"
}
},
{
"cell_type": "markdown",
"source": [
"## ۱. وارد کردن داده‌های کدو تنبل و فراخوانی 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",
"در حقیقت، خیلی رایج نیست که یک مجموعه داده کاملاً آماده برای استفاده و ساخت یک مدل یادگیری ماشین به شما هدیه داده شود. اما نگران نباشید، در این درس یاد می‌گیرید که چگونه یک مجموعه داده خام را با استفاده از کتابخانه‌های استاندارد R آماده کنید 🧑‍🔧. همچنین تکنیک‌های مختلفی برای تجسم داده‌ها را خواهید آموخت. 📈📊\n",
"<br>\n",
"\n",
"> یک یادآوری: عملگر پایپ (`%>%`) عملیات را به صورت منطقی و پشت سر هم انجام می‌دهد و یک شیء را به جلو به یک تابع یا عبارت ارسال می‌کند. می‌توانید عملگر پایپ را به این صورت تصور کنید که در کد شما به معنای \"و سپس\" است.\n"
],
"metadata": {
"id": "REWcIv9yX29v"
}
},
{
"cell_type": "markdown",
"source": [
"## ۲. بررسی داده‌های ناقص\n",
"\n",
"یکی از رایج‌ترین مشکلاتی که دانشمندان داده باید با آن مواجه شوند، داده‌های ناقص یا گم‌شده است. در زبان R، مقادیر گم‌شده یا ناشناخته با یک مقدار خاص به نام `NA` (مخفف Not Available) نمایش داده می‌شوند.\n",
"\n",
"اما چگونه می‌توانیم بفهمیم که یک فریم داده شامل مقادیر گم‌شده است؟\n",
"<br>\n",
"- یکی از روش‌های ساده استفاده از تابع پایه 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": [
"باشه، کار انجام شد اما با یک دیتافریم بزرگ مثل این، بررسی تک‌تک سطرها و ستون‌ها به‌صورت جداگانه غیربهینه و عملاً غیرممکن است 😴.\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": [
"## ۳. Dplyr: دستور زبانی برای دستکاری داده‌ها\n",
"\n",
"<p >\n",
" <img src=\"../../images/dplyr_wrangling.png\"\n",
" width=\"569\"/>\n",
" <figcaption>اثر هنری از @allison_horst</figcaption>\n",
"\n",
"\n",
"<!--![اثر هنری از \\@allison_horst](../../../../../../translated_images/dplyr_wrangling.f5f99c64fd4580f1377fee3ea428b6f8fd073845ec0f8409d483cfe148f0984e.fa.png)<br/>اثر هنری از \\@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",
"بیایید با استفاده از ستون `Date` چند عملیات انجام دهیم تا نحوه کار `mutate` را بررسی کنیم:\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": [
"هورا! 🤩\n",
"\n",
"حالا بیایید یک ستون جدید به نام `Price` ایجاد کنیم که نشان‌دهنده قیمت متوسط یک کدو تنبل است. سپس میانگین ستون‌های `Low Price` و `High Price` را محاسبه می‌کنیم تا ستون جدید Price را پر کنیم.\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` دارند و این را در یک داده‌فریم جدید به نام `new_pumpkins` قرار دهیم.\n"
],
"metadata": {
"id": "7sMjiVujaZxY"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::filter() و stringr::str_detect()\n",
"\n",
"[`dplyr::filter()`](https://dplyr.tidyverse.org/reference/filter.html): زیرمجموعه‌ای از داده‌ها ایجاد می‌کند که فقط شامل **ردیف‌هایی** است که شرایط شما را برآورده می‌کنند. در این مثال، کدوهایی که رشته *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",
"متوجه شدید که مقدار بوشل در هر سطر متفاوت است؟ باید قیمت‌گذاری را نرمال‌سازی کنید تا قیمت را بر اساس هر بوشل نشان دهید، نه بر اساس ۱ ۱/۹ یا ۱/۲ بوشل. وقت آن است که کمی ریاضی انجام دهید تا آن را استاندارد کنید.\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"
],
"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": [
"## ۴. مصورسازی داده‌ها با ggplot2\n",
"\n",
"<p >\n",
" <img src=\"../../images/data-visualization.png\"\n",
" width=\"600\"/>\n",
" <figcaption>اینفوگرافیک از داسانی مدیپالی</figcaption>\n",
"\n",
"\n",
"<!--![اینفوگرافیک از داسانی مدیپالی](../../../../../../translated_images/data-visualization.54e56dded7c1a804d00d027543f2881cb32da73aeadda2d4a4f10f3497526114.fa.png){width=\"600\"}-->\n",
"\n",
"یک ضرب‌المثل *حکیمانه* وجود دارد که می‌گوید:\n",
"\n",
"> \"یک نمودار ساده اطلاعات بیشتری به ذهن تحلیل‌گر داده می‌رساند تا هر ابزار دیگری.\" --- جان توکی\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"
],
"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",
"قابل محاسبه است.\n",
"\n",
"- `dplyr::group_by()` واحد تحلیل را از کل مجموعه داده به گروه‌های جداگانه مانند هر ماه تغییر می‌دهد.\n",
"\n",
"- `dplyr::summarize()` یک فریم داده جدید ایجاد می‌کند که شامل یک ستون برای هر متغیر گروه‌بندی و یک ستون برای هر آماری خلاصه‌ای است که مشخص کرده‌اید.\n",
"\n",
"به عنوان مثال، می‌توانیم از `dplyr::group_by() %>% summarize()` استفاده کنیم تا کدو تنبل‌ها را بر اساس ستون **ماه** گروه‌بندی کنیم و سپس **میانگین قیمت** را برای هر ماه پیدا کنیم.\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این سند با استفاده از سرویس ترجمه هوش مصنوعی [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما تلاش می‌کنیم دقت را حفظ کنیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است شامل خطاها یا نادرستی‌ها باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، توصیه می‌شود از ترجمه حرفه‌ای انسانی استفاده کنید. ما مسئولیتی در قبال سوء تفاهم‌ها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم.\n"
]
}
]
}