{ "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-08-29T19:05:52+00:00", "source_file": "2-Regression/2-Data/solution/R/lesson_2-R.ipynb", "language_code": "ne" } }, "cells": [ { "cell_type": "markdown", "source": [ "# रिग्रेसन मोडेल बनाउनुहोस्: डेटा तयार पार्नुहोस् र भिजुअलाइज गर्नुहोस्\n", "\n", "## **कद्दूहरूको लागि रेखीय रिग्रेसन - पाठ २**\n", "#### परिचय\n", "\n", "अब तपाईं Tidymodels र Tidyverse को साथ मेसिन लर्निङ मोडेल निर्माण गर्न आवश्यक उपकरणहरूसँग तयार हुनुहुन्छ, तपाईं आफ्नो डेटासँग प्रश्न सोध्न सुरु गर्न तयार हुनुहुन्छ। जब तपाईं डेटासँग काम गर्नुहुन्छ र ML समाधानहरू लागू गर्नुहुन्छ, सही प्रश्न सोध्न जान्नु अत्यन्त महत्त्वपूर्ण छ ताकि तपाईंको डेटासेटको सम्भावनाहरू सही रूपमा अनलक गर्न सकियोस्।\n", "\n", "यस पाठमा, तपाईंले सिक्नुहुनेछ:\n", "\n", "- मोडेल निर्माणको लागि आफ्नो डेटा कसरी तयार गर्ने।\n", "\n", "- डेटा भिजुअलाइजेसनको लागि `ggplot2` कसरी प्रयोग गर्ने।\n", "\n", "तपाईंले उत्तर खोज्न चाहेको प्रश्नले कुन प्रकारको ML एल्गोरिदम प्रयोग गर्ने निर्धारण गर्नेछ। र तपाईंले पाउने उत्तरको गुणस्तर तपाईंको डेटाको प्रकृतिमा धेरै हदसम्म निर्भर हुनेछ।\n", "\n", "यसलाई व्यावहारिक अभ्यासमार्फत हेर्नुहोस्।\n", "\n", "\n", "
\n",
" \n",
"
\n",
"\n",
"> एक पुनःस्मरण: पाइप अपरेटर (`%>%`) ले वस्तुलाई अगाडि बढाएर कुनै फङ्सन वा कल अभिव्यक्तिमा पास गरेर तार्किक क्रममा अपरेसनहरू सम्पन्न गर्छ। तपाईं पाइप अपरेटरलाई आफ्नो कोडमा \"र त्यसपछि\" भन्ने जस्तै सोच्न सक्नुहुन्छ।\n"
],
"metadata": {
"id": "REWcIv9yX29v"
}
},
{
"cell_type": "markdown",
"source": [
"## २. हराएको डाटाको जाँच गर्नुहोस्\n",
"\n",
"डाटा वैज्ञानिकहरूले प्रायः सामना गर्नुपर्ने समस्याहरू मध्ये एक अधुरो वा हराएको डाटा हो। R ले हराएको वा अज्ञात मानहरूलाई विशेष संकेत मान `NA` (Not Available) को रूपमा प्रतिनिधित्व गर्छ।\n",
"\n",
"त्यसो भए हामी कसरी थाहा पाउने कि डाटा फ्रेममा हराएका मानहरू छन्?\n",
"
\n",
"- एउटा सोझो तरिका भनेको `anyNA` नामक base R function प्रयोग गर्नु हो, जसले `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": [
"## 3. Dplyr: डेटा व्यवस्थापनको व्याकरण\n",
"\n",
"
\n",
" \n",
"
\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",
"कद्दूहरूलाई स्थिर रूपमा तौल गर्न धेरै गाह्रो देखिन्छ, त्यसैले हामी तिनीहरूलाई फिल्टर गरेर `Package` स्तम्भमा *bushel* स्ट्रिङ भएका कद्दूहरू मात्र चयन गरौं र यसलाई नयाँ डेटा फ्रेम `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): यो डेटा सेटको एउटा उपसमूह बनाउँछ जसमा केवल ती **पङ्क्तिहरू** समावेश हुन्छन् जसले तपाईंको सर्तहरू पूरा गर्छन्। यस अवस्थामा, `Package` स्तम्भमा *bushel* शब्द भएको pumpkins समावेश गरिन्छ।\n",
"\n",
"[stringr::str_detect()](https://stringr.tidyverse.org/reference/str_detect.html): स्ट्रिङमा कुनै ढाँचा (pattern) को उपस्थिति वा अनुपस्थिति पत्ता लगाउँछ।\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",
"
\n"
],
"metadata": {
"id": "VrDwF031avlR"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::case_when()\n",
"\n",
"**तर पर्खिनुहोस्! अझै एउटा काम गर्न बाँकी छ**\n",
"\n",
"के तपाईंले ध्यान दिनुभयो कि बुसलको मात्रा प्रत्येक पङ्क्तिमा फरक छ? तपाईंले मूल्यलाई सामान्यीकृत गर्न आवश्यक छ ताकि तपाईं प्रति 1 1/9 वा 1/2 बुसल होइन, प्रति बुसलको मूल्य देखाउनुहोस्। यसलाई मानकीकरण गर्न गणित गर्नुपर्ने समय आएको छ।\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` स्तम्भभन्दा अगाडि, `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"
],
"metadata": {
"id": "y8TJ0Za_bn5Y"
}
},
{
"cell_type": "markdown",
"source": [
"## ४. ggplot2 को साथमा डाटा भिजुअलाइजेसन\n",
"\n",
"
\n",
" \n",
"