{ "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:46:12+00:00", "source_file": "2-Regression/2-Data/solution/R/lesson_2-R.ipynb", "language_code": "hi" } }, "cells": [ { "cell_type": "markdown", "source": [ "# एक प्रतिगमन मॉडल बनाएं: डेटा तैयार करें और विज़ुअलाइज़ करें\n", "\n", "## **कद्दू के लिए रैखिक प्रतिगमन - पाठ 2**\n", "#### परिचय\n", "\n", "अब जब आपके पास मशीन लर्निंग मॉडल बनाने के लिए Tidymodels और Tidyverse के साथ काम करने के उपकरण तैयार हैं, तो आप अपने डेटा से सवाल पूछने के लिए तैयार हैं। जब आप डेटा के साथ काम करते हैं और एमएल समाधान लागू करते हैं, तो यह समझना बहुत महत्वपूर्ण है कि सही सवाल कैसे पूछा जाए ताकि आपके डेटा सेट की संभावनाओं को सही तरीके से खोला जा सके।\n", "\n", "इस पाठ में, आप सीखेंगे:\n", "\n", "- मॉडल-निर्माण के लिए अपने डेटा को कैसे तैयार करें।\n", "\n", "- डेटा विज़ुअलाइज़ेशन के लिए `ggplot2` का उपयोग कैसे करें।\n", "\n", "आपके द्वारा पूछे जाने वाले सवाल यह तय करेंगे कि आप किस प्रकार के एमएल एल्गोरिदम का उपयोग करेंगे। और आपको जो उत्तर मिलेगा उसकी गुणवत्ता काफी हद तक आपके डेटा की प्रकृति पर निर्भर करेगी।\n", "\n", "आइए इसे एक व्यावहारिक अभ्यास के माध्यम से समझते हैं।\n", "\n", "
\n",
" \n",
"
\n",
"\n",
"> एक पुनश्चर्या: पाइप ऑपरेटर (`%>%`) लॉजिकल क्रम में ऑपरेशन्स करता है, जिसमें एक ऑब्जेक्ट को आगे किसी फंक्शन या कॉल एक्सप्रेशन में पास किया जाता है। आप पाइप ऑपरेटर को अपने कोड में \"और फिर\" कहने जैसा समझ सकते हैं।\n"
],
"metadata": {
"id": "REWcIv9yX29v"
}
},
{
"cell_type": "markdown",
"source": [
"## 2. डेटा में कमी की जांच करें\n",
"\n",
"डेटा वैज्ञानिकों को जिन सबसे आम समस्याओं का सामना करना पड़ता है, उनमें से एक है अधूरी या गायब डेटा। R गायब या अज्ञात मानों को एक विशेष संकेतक मान `NA` (Not Available) के रूप में दर्शाता है।\n",
"\n",
"तो हम कैसे जानेंगे कि डेटा फ्रेम में गायब मान हैं? \n",
"
\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": [
"## 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",
"आइए `mutate` का उपयोग करके `Date` कॉलम पर निम्नलिखित कार्य करें:\n",
"\n",
"1. तारीखों को (जो वर्तमान में character प्रकार की हैं) महीने के प्रारूप में बदलें (ये अमेरिकी तारीखें हैं, इसलिए प्रारूप `MM/DD/YYYY` है)।\n",
"\n",
"2. तारीखों से महीने को निकालकर एक नए कॉलम में डालें।\n",
"\n",
"R में, [lubridate](https://lubridate.tidyverse.org/) पैकेज Date-time डेटा के साथ काम करना आसान बनाता है। तो, आइए `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",
"
\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* स्ट्रिंग वाले कद्दू।\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": [
"आप देख सकते हैं कि हमने लगभग 415 पंक्तियों के डेटा को सीमित कर दिया है, जिसमें कद्दू बसों में शामिल हैं।🤩 \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 कॉलम को *mutate* किया जा सके। `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) के अनुसार, बुशल का वजन उत्पाद के प्रकार पर निर्भर करता है, क्योंकि यह एक आयतन माप है। \"उदाहरण के लिए, टमाटर का एक बुशल 56 पाउंड वजन का होता है... पत्तियां और साग अधिक जगह लेते हैं लेकिन वजन कम होता है, इसलिए पालक का एक बुशल केवल 20 पाउंड का होता है।\" यह सब काफी जटिल है! चलिए बुशल-से-पाउंड रूपांतरण करने की झंझट में न पड़ें और इसके बजाय बुशल के आधार पर मूल्य निर्धारण करें। कद्दू के बुशल का यह सारा अध्ययन, हालांकि, यह दिखाने के लिए है कि अपने डेटा की प्रकृति को समझना कितना महत्वपूर्ण है!\n",
">\n",
"> ✅ क्या आपने देखा कि आधे-बुशल में बिकने वाले कद्दू बहुत महंगे हैं? क्या आप इसका कारण समझ सकते हैं? संकेत: छोटे कद्दू बड़े कद्दुओं की तुलना में बहुत महंगे होते हैं, शायद इसलिए कि एक बड़े खोखले पाई कद्दू द्वारा ली गई जगह के कारण प्रति बुशल उनमें बहुत अधिक छोटे कद्दू होते हैं।\n"
],
"metadata": {
"id": "pS2GNPagbSdb"
}
},
{
"cell_type": "markdown",
"source": [
"अब अंत में, सिर्फ रोमांच के लिए 💁♀️, चलिए Month कॉलम को पहले स्थान पर ले चलते हैं, यानी `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",
"
\n"
],
"metadata": {
"id": "y8TJ0Za_bn5Y"
}
},
{
"cell_type": "markdown",
"source": [
"## 4. ggplot2 के साथ डेटा विज़ुअलाइज़ेशन\n",
"\n",
"
\n",
" \n",
"