{ "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-03T19:46:27+00:00", "source_file": "2-Regression/2-Data/solution/R/lesson_2-R.ipynb", "language_code": "lt" } }, "cells": [ { "cell_type": "markdown", "source": [ "# Sukurkite regresijos modelį: paruoškite ir vizualizuokite duomenis\n", "\n", "## **Linijinė regresija moliūgams - Pamoka 2**\n", "#### Įvadas\n", "\n", "Dabar, kai turite įrankius, reikalingus pradėti kurti mašininio mokymosi modelius naudojant Tidymodels ir Tidyverse, esate pasiruošę pradėti užduoti klausimus savo duomenims. Dirbant su duomenimis ir taikant ML sprendimus, labai svarbu mokėti užduoti tinkamus klausimus, kad galėtumėte tinkamai atskleisti savo duomenų potencialą.\n", "\n", "Šioje pamokoje išmoksite:\n", "\n", "- Kaip paruošti duomenis modelio kūrimui.\n", "\n", "- Kaip naudoti `ggplot2` duomenų vizualizacijai.\n", "\n", "Klausimas, į kurį norite gauti atsakymą, nulems, kokio tipo ML algoritmus naudosite. O atsakymo kokybė labai priklausys nuo jūsų duomenų pobūdžio.\n", "\n", "Pažiūrėkime, kaip tai veikia praktiniame uždavinyje.\n", "\n", "\n", "
\n",
" \n",
"
\n",
"\n",
"> Primename: Vamzdžio operatorius (`%>%`) atlieka operacijas logine seka, perduodamas objektą į priekį į funkciją arba iškvietimo išraišką. Galite galvoti apie vamzdžio operatorių kaip \"ir tada\" savo kode.\n"
],
"metadata": {
"id": "REWcIv9yX29v"
}
},
{
"cell_type": "markdown",
"source": [
"## 2. Patikrinkite, ar nėra trūkstamų duomenų\n",
"\n",
"Viena iš dažniausiai pasitaikančių problemų, su kuriomis susiduria duomenų mokslininkai, yra neišsamūs arba trūkstami duomenys. R trūkstamas arba nežinomas reikšmes žymi specialia žymeklio reikšme: `NA` (Not Available).\n",
"\n",
"Taigi, kaip sužinoti, ar duomenų rėmelis turi trūkstamų reikšmių?\n",
"
\n",
"- Vienas paprastas būdas būtų naudoti bazinę R funkciją `anyNA`, kuri grąžina loginį objektą `TRUE` arba `FALSE`.\n"
],
"metadata": {
"id": "Zxfb3AM5YbUe"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"pumpkins %>% \n",
" anyNA()"
],
"outputs": [],
"metadata": {
"id": "G--DQutAYltj"
}
},
{
"cell_type": "markdown",
"source": [
"Puiku, atrodo, kad trūksta kai kurių duomenų! Tai gera vieta pradėti.\n",
"\n",
"- Kitas būdas būtų naudoti funkciją `is.na()`, kuri nurodo, kurie atskiri stulpelio elementai yra trūkstami, pažymėdama juos logine reikšme `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": [
"Gerai, darbas atliktas, tačiau su tokia didele duomenų lentele būtų neefektyvu ir praktiškai neįmanoma peržiūrėti visų eilučių ir stulpelių atskirai😴.\n",
"\n",
"- Intuityvesnis būdas būtų apskaičiuoti trūkstamų reikšmių sumą kiekvienam stulpeliui:\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": [
"Daug geriau! Trūksta duomenų, bet galbūt tai nesutrukdys atlikti užduotį. Pažiūrėkime, ką atneš tolimesnė analizė.\n",
"\n",
"> Be nuostabių paketų ir funkcijų rinkinių, R turi labai gerą dokumentaciją. Pavyzdžiui, naudokite `help(colSums)` arba `?colSums`, kad sužinotumėte daugiau apie šią funkciją.\n"
],
"metadata": {
"id": "9gv-crB6ZD1Y"
}
},
{
"cell_type": "markdown",
"source": [
"## 3. Dplyr: Duomenų manipuliavimo gramatika\n",
"\n",
"
\n",
" \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": [
"Taip!💪\n",
"\n",
"„Bet palauk!“, pasakysite peržiūrėję visą duomenų rinkinį su `View(pumpkins)`, „Čia kažkas keisto!“🤔\n",
"\n",
"Jei pažvelgsite į `Package` stulpelį, moliūgai parduodami įvairiomis konfigūracijomis. Kai kurie parduodami `1 1/9 bushel` matu, kai kurie `1/2 bushel` matu, kai kurie pagal moliūgą, kai kurie pagal svorį, o kai kurie didelėse dėžėse su skirtingais pločiais.\n",
"\n",
"Patikrinkime tai:\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": [
"Nuostabu!👏\n",
"\n",
"Moliūgus atrodo labai sunku sverti nuosekliai, todėl filtruokime juos, pasirinkdami tik tuos moliūgus, kurių `Package` stulpelyje yra žodis *bushel*, ir sudėkime tai į naują duomenų rėmelį `new_pumpkins`.\n"
],
"metadata": {
"id": "7sMjiVujaZxY"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::filter() ir stringr::str_detect()\n",
"\n",
"[`dplyr::filter()`](https://dplyr.tidyverse.org/reference/filter.html): sukuria duomenų poskyrį, kuriame yra tik tos **eilutės**, kurios atitinka jūsų sąlygas, šiuo atveju moliūgai, kurių stulpelyje `Package` yra žodis *bushel*.\n",
"\n",
"[stringr::str_detect()](https://stringr.tidyverse.org/reference/str_detect.html): nustato, ar eilutėje yra tam tikras raštas, ar jo nėra.\n",
"\n",
"[`stringr`](https://github.com/tidyverse/stringr) paketas suteikia paprastas funkcijas dažniausiai atliekamoms operacijoms su eilutėmis.\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": [
"Galite matyti, kad mes susiaurinome iki maždaug 415 eilučių duomenų, kuriuose yra moliūgai pagal statinę.🤩\n"
],
"metadata": {
"id": "VrDwF031avlR"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::case_when()\n",
"\n",
"**Bet palaukite! Yra dar vienas dalykas, kurį reikia padaryti**\n",
"\n",
"Ar pastebėjote, kad kiekis skiriasi kiekvienoje eilutėje? Jums reikia normalizuoti kainodarą, kad būtų rodoma kaina už vieną bušelį, o ne už 1 1/9 ar 1/2 bušelio. Laikas atlikti keletą skaičiavimų, kad tai standartizuotumėte.\n",
"\n",
"Naudosime funkciją [`case_when()`](https://dplyr.tidyverse.org/reference/case_when.html), kad *pakeistume* Price stulpelį pagal tam tikras sąlygas. `case_when` leidžia vektorizuoti kelis `if_else()` teiginius.\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": [
"Dabar galime analizuoti kainas už vienetą, remdamiesi jų matavimu bušeliais. Visa ši bušelių moliūgų analizė, tačiau, parodo, kaip labai `svarbu` yra `suprasti savo duomenų prigimtį`!\n",
"\n",
"> ✅ Pasak [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308), bušelio svoris priklauso nuo produkto tipo, nes tai yra tūrio matas. \"Pavyzdžiui, pomidorų bušelis turėtų sverti 56 svarus... Lapai ir žalumynai užima daugiau vietos su mažesniu svoriu, todėl špinatų bušelis sveria tik 20 svarų.\" Viskas gana sudėtinga! Nesivarginkime konvertuoti bušelių į svarus, o vietoj to nustatykime kainą pagal bušelį. Visa ši bušelių moliūgų analizė, tačiau, parodo, kaip labai svarbu yra suprasti savo duomenų prigimtį!\n",
">\n",
"> ✅ Ar pastebėjote, kad moliūgai, parduodami pusbušeliais, yra labai brangūs? Ar galite suprasti kodėl? Užuomina: maži moliūgai yra daug brangesni nei dideli, tikriausiai todėl, kad jų bušelyje yra daug daugiau, atsižvelgiant į nepanaudotą vietą, kurią užima vienas didelis tuščiaviduris pyrago moliūgas.\n"
],
"metadata": {
"id": "pS2GNPagbSdb"
}
},
{
"cell_type": "markdown",
"source": [
"Dabar galiausiai, dėl nuotykių dvasios 💁♀️, perkelkime stulpelį „Mėnuo“ į pirmąją poziciją, t. y. „prieš“ stulpelį „Paketas“.\n",
"\n",
"Funkcija `dplyr::relocate()` naudojama stulpelių pozicijoms pakeisti.\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": [
"Puikus darbas!👌 Dabar turite švarią, tvarkingą duomenų bazę, ant kurios galite kurti savo naują regresijos modelį!\n",
"
\n"
],
"metadata": {
"id": "y8TJ0Za_bn5Y"
}
},
{
"cell_type": "markdown",
"source": [
"## 4. Duomenų vizualizacija su ggplot2\n",
"\n",
"
\n",
" \n",
"
\n"
],
"metadata": {
"id": "Ml7SDCLQcPvE"
}
},
{
"cell_type": "markdown",
"source": [
"### **Kaip padaryti tai naudingą?**\n",
"\n",
"Norint, kad diagramos rodytų naudingus duomenis, paprastai reikia kažkaip sugrupuoti duomenis. Pavyzdžiui, mūsų atveju, vidutinės moliūgų kainos nustatymas kiekvienam mėnesiui suteiktų daugiau įžvalgų apie pagrindinius duomenų modelius. Tai veda mus prie dar vieno **dplyr** apžvalgos:\n",
"\n",
"#### `dplyr::group_by() %>% summarize()`\n",
"\n",
"Grupinė agregacija R kalboje gali būti lengvai apskaičiuota naudojant\n",
"\n",
"`dplyr::group_by() %>% summarize()`\n",
"\n",
"- `dplyr::group_by()` pakeičia analizės vienetą nuo viso duomenų rinkinio į atskiras grupes, tokias kaip mėnesiai.\n",
"\n",
"- `dplyr::summarize()` sukuria naują duomenų rėmelį su viena stulpeliu kiekvienam grupavimo kintamajam ir viena stulpeliu kiekvienai jūsų nurodytai suvestinės statistikai.\n",
"\n",
"Pavyzdžiui, mes galime naudoti `dplyr::group_by() %>% summarize()` tam, kad sugrupuotume moliūgus pagal **Month** stulpelį ir tada rastume **vidutinę kainą** kiekvienam mėnesiui.\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": [
"Trumpai!✨\n",
"\n",
"Kategoriniai požymiai, tokie kaip mėnesiai, geriausiai pateikiami naudojant stulpelinę diagramą 📊. Už stulpelinių diagramų atsakingi sluoksniai yra `geom_bar()` ir `geom_col()`. Norėdami sužinoti daugiau, peržiūrėkite `?geom_bar`.\n",
"\n",
"Sukurkime vieną!\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": [
"🤩🤩Tai naudingesnė duomenų vizualizacija! Panašu, kad didžiausia moliūgų kaina yra rugsėjį ir spalį. Ar tai atitinka jūsų lūkesčius? Kodėl taip arba kodėl ne?\n",
"\n",
"Sveikinimai baigus antrąją pamoką 👏! Jūs paruošėte savo duomenis modelio kūrimui, o tada atskleidėte daugiau įžvalgų naudodami vizualizacijas!\n"
],
"metadata": {
"id": "zDm0VOzzcuzR"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Atsakomybės apribojimas**: \nŠis dokumentas buvo išverstas naudojant AI vertimo paslaugą [Co-op Translator](https://github.com/Azure/co-op-translator). Nors siekiame tikslumo, prašome atkreipti dėmesį, kad automatiniai vertimai gali turėti klaidų ar netikslumų. Originalus dokumentas jo gimtąja kalba turėtų būti laikomas autoritetingu šaltiniu. Dėl svarbios informacijos rekomenduojama profesionali žmogaus vertimo paslauga. Mes neprisiimame atsakomybės už nesusipratimus ar klaidingus interpretavimus, atsiradusius naudojant šį vertimą.\n"
]
}
]
}