{ "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:04:28+00:00", "source_file": "2-Regression/2-Data/solution/R/lesson_2-R.ipynb", "language_code": "mr" } }, "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",
"चला `Date` कॉलम वापरून `mutate` वापरून काही ऑपरेशन्स करून पाहू:\n",
"\n",
"1. तारीख (सध्या कॅरेक्टर प्रकारात आहे) महिन्याच्या स्वरूपात रूपांतरित करा (या US तारखा आहेत, त्यामुळे स्वरूप `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",
"फळकुटे (Pumpkins) सतत एकसारखे वजन करणे कठीण वाटते, त्यामुळे आपण त्यांना फिल्टर करूया. `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): एखाद्या स्ट्रिंगमध्ये एखाद्या पॅटर्नची उपस्थिती किंवा अनुपस्थिती शोधतो.\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"
],
"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": [
"आता शेवटी, फक्त साहसासाठी 💁♀️, चला `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"
],
"metadata": {
"id": "y8TJ0Za_bn5Y"
}
},
{
"cell_type": "markdown",
"source": [
"## 4. ggplot2 सह डेटा व्हिज्युअलायझेशन\n",
"\n",
"
\n",
" \n",
"