{ "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-06T13:47:59+00:00", "source_file": "2-Regression/2-Data/solution/R/lesson_2-R.ipynb", "language_code": "sk" } }, "cells": [ { "cell_type": "markdown", "source": [ "# Vytvorenie regresného modelu: príprava a vizualizácia dát\n", "\n", "## **Lineárna regresia pre tekvice - Lekcia 2**\n", "#### Úvod\n", "\n", "Teraz, keď máte pripravené nástroje na budovanie modelov strojového učenia pomocou Tidymodels a Tidyverse, ste pripravení začať klásť otázky o svojich dátach. Pri práci s dátami a aplikovaní riešení strojového učenia je veľmi dôležité vedieť, ako položiť správnu otázku, aby ste mohli plne využiť potenciál svojho datasetu.\n", "\n", "V tejto lekcii sa naučíte:\n", "\n", "- Ako pripraviť svoje dáta na budovanie modelov.\n", "\n", "- Ako používať `ggplot2` na vizualizáciu dát.\n", "\n", "Otázka, na ktorú potrebujete odpoveď, určí, aký typ algoritmov strojového učenia budete používať. Kvalita odpovede, ktorú dostanete, bude výrazne závisieť od povahy vašich dát.\n", "\n", "Pozrime sa na to prostredníctvom praktického cvičenia.\n", "\n", "\n", "
\n",
" \n",
"
\n",
"\n",
"> Pripomenutie: Operátor pipe (`%>%`) vykonáva operácie v logickej postupnosti tým, že posúva objekt ďalej do funkcie alebo výrazu. Môžete si operátor pipe predstaviť ako výraz „a potom“ vo vašom kóde.\n"
],
"metadata": {
"id": "REWcIv9yX29v"
}
},
{
"cell_type": "markdown",
"source": [
"## 2. Kontrola chýbajúcich údajov\n",
"\n",
"Jedným z najbežnejších problémov, s ktorými sa dátoví analytici musia vysporiadať, sú neúplné alebo chýbajúce údaje. R reprezentuje chýbajúce alebo neznáme hodnoty pomocou špeciálnej hodnoty: `NA` (Not Available).\n",
"\n",
"Ako teda zistíme, že dátový rámec obsahuje chýbajúce hodnoty?\n",
"
\n",
"- Jedným z priamych spôsobov je použitie základnej funkcie R `anyNA`, ktorá vracia logické objekty `TRUE` alebo `FALSE`.\n"
],
"metadata": {
"id": "Zxfb3AM5YbUe"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"pumpkins %>% \n",
" anyNA()"
],
"outputs": [],
"metadata": {
"id": "G--DQutAYltj"
}
},
{
"cell_type": "markdown",
"source": [
"Zdá sa, že niektoré údaje chýbajú! To je dobré miesto, kde začať.\n",
"\n",
"- Ďalším spôsobom by bolo použiť funkciu `is.na()`, ktorá označuje, ktoré jednotlivé prvky stĺpcov chýbajú pomocou logickej hodnoty `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": [
"Dobre, práca je hotová, ale s takým veľkým dátovým rámcom by bolo neefektívne a prakticky nemožné kontrolovať všetky riadky a stĺpce jednotlivo😴.\n",
"\n",
"- Intuitívnejší spôsob by bol vypočítať súčet chýbajúcich hodnôt pre každý stĺpec:\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": [
"Oveľa lepšie! Chýbajú niektoré údaje, ale možno to nebude mať vplyv na danú úlohu. Uvidíme, aké ďalšie analýzy prinesú výsledky.\n",
"\n",
"> Okrem skvelých balíkov a funkcií má R veľmi dobrú dokumentáciu. Napríklad použite `help(colSums)` alebo `?colSums`, aby ste sa dozvedeli viac o funkcii.\n"
],
"metadata": {
"id": "9gv-crB6ZD1Y"
}
},
{
"cell_type": "markdown",
"source": [
"## 3. Dplyr: Gramatika manipulácie s dátami\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": [
"Yeees!💪\n",
"\n",
"„Ale počkaj!“, poviete si po rýchlom prehliadnutí celého dátového súboru pomocou `View(pumpkins)`, „Tu je niečo zvláštne!“🤔\n",
"\n",
"Ak sa pozriete na stĺpec `Package`, tekvice sa predávajú v rôznych konfiguráciách. Niektoré sa predávajú v mierach `1 1/9 bushel`, niektoré v mierach `1/2 bushel`, niektoré na kusy, niektoré na váhu a niektoré vo veľkých škatuliach s rôznymi šírkami.\n",
"\n",
"Poďme si to overiť:\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": [
"Úžasné!👏\n",
"\n",
"Zdá sa, že tekvice je veľmi ťažké vážiť konzistentne, takže ich vyfiltrujme tak, že vyberieme iba tekvice, ktoré obsahujú reťazec *bushel* v stĺpci `Package`, a uložme to do nového dátového rámca `new_pumpkins`.\n"
],
"metadata": {
"id": "7sMjiVujaZxY"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::filter() a stringr::str_detect()\n",
"\n",
"[`dplyr::filter()`](https://dplyr.tidyverse.org/reference/filter.html): vytvára podmnožinu údajov obsahujúcu iba **riadky**, ktoré spĺňajú vaše podmienky, v tomto prípade tekvice so slovom *bushel* v stĺpci `Package`.\n",
"\n",
"[stringr::str_detect()](https://stringr.tidyverse.org/reference/str_detect.html): zisťuje prítomnosť alebo neprítomnosť vzoru v reťazci.\n",
"\n",
"Balík [`stringr`](https://github.com/tidyverse/stringr) poskytuje jednoduché funkcie pre bežné operácie s reťazcami.\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": [
"Môžete vidieť, že sme zúžili výber na približne 415 riadkov údajov obsahujúcich tekvice na veľké množstvo.🤩 \n",
"
\n"
],
"metadata": {
"id": "VrDwF031avlR"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::case_when()\n",
"\n",
"**Ale počkajte! Ešte je tu jedna vec, ktorú treba urobiť**\n",
"\n",
"Všimli ste si, že množstvo v bušloch sa líši v jednotlivých riadkoch? Musíte normalizovať ceny tak, aby ste zobrazili cenu za bušel, nie za 1 1/9 alebo 1/2 bušela. Je čas na trochu matematiky, aby ste to štandardizovali.\n",
"\n",
"Použijeme funkciu [`case_when()`](https://dplyr.tidyverse.org/reference/case_when.html) na *mutáciu* stĺpca Price v závislosti od určitých podmienok. `case_when` umožňuje vektorovo spracovať viacero `if_else()` vyjadrení.\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": [
"Teraz môžeme analyzovať cenu za jednotku na základe ich merania v bušloch. Celá táto štúdia o bušloch tekvíc však ukazuje, aké veľmi `dôležité` je `pochopiť povahu vašich údajov`!\n",
"\n",
"> ✅ Podľa [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308) hmotnosť bušľa závisí od typu produktu, pretože ide o objemové meranie. \"Bušel paradajok, napríklad, by mal vážiť 56 libier... Listy a zelené rastliny zaberajú viac miesta s menšou hmotnosťou, takže bušel špenátu váži iba 20 libier.\" Je to všetko dosť komplikované! Nezaoberajme sa konverziou bušlov na libry, namiesto toho stanovme cenu za bušel. Celá táto štúdia o bušloch tekvíc však ukazuje, aké veľmi dôležité je pochopiť povahu vašich údajov!\n",
">\n",
"> ✅ Všimli ste si, že tekvice predávané na pol bušľa sú veľmi drahé? Dokážete zistiť prečo? Tip: malé tekvice sú oveľa drahšie ako veľké, pravdepodobne preto, že ich je oveľa viac na bušel, vzhľadom na nevyužitý priestor, ktorý zaberá jedna veľká dutá tekvica na koláč.\n"
],
"metadata": {
"id": "pS2GNPagbSdb"
}
},
{
"cell_type": "markdown",
"source": [
"DÔLEŽITÉ PRAVIDLÁ: \n",
"1. NEPRIDÁVAJTE '''markdown alebo akékoľvek iné značky okolo prekladu \n",
"2. Uistite sa, že preklad neznie príliš doslovne \n",
"3. Preložte aj komentáre \n",
"4. Tento súbor je napísaný vo formáte Markdown - nezaobchádzajte s ním ako s XML alebo HTML \n",
"5. Neprekladajte: \n",
" - [!NOTE], [!WARNING], [!TIP], [!IMPORTANT], [!CAUTION] \n",
" - Názvy premenných, funkcií, tried \n",
" - Zástupné symboly ako @@INLINE_CODE_x@@ alebo @@CODE_BLOCK_x@@ \n",
" - URL alebo cesty \n",
"6. Zachovajte všetko pôvodné formátovanie Markdownu \n",
"7. Vráťte IBA preložený obsah bez akýchkoľvek dodatočných značiek alebo formátovania \n",
"\n",
"A teraz nakoniec, len pre dobrodružstvo 💁♀️, presuňme stĺpec Month na prvú pozíciu, teda `pred` stĺpec `Package`. \n",
"\n",
"Na zmenu pozícií stĺpcov sa používa `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": [
"Skvelá práca!👌 Teraz máte čistý, uprataný dataset, na ktorom môžete postaviť svoj nový regresný model! \n",
"
\n"
],
"metadata": {
"id": "y8TJ0Za_bn5Y"
}
},
{
"cell_type": "markdown",
"source": [
"## 4. Vizualizácia dát s ggplot2\n",
"\n",
"
\n",
" \n",
"
\n"
],
"metadata": {
"id": "Ml7SDCLQcPvE"
}
},
{
"cell_type": "markdown",
"source": [
"### **Ako to urobiť užitočným?**\n",
"\n",
"Aby grafy zobrazovali užitočné údaje, zvyčajne je potrebné údaje nejako zoskupiť. Napríklad v našom prípade by zistenie priemernej ceny tekvíc za každý mesiac poskytlo viac informácií o základných vzoroch v našich údajoch. To nás privádza k ďalšiemu preletu nad **dplyr**:\n",
"\n",
"#### `dplyr::group_by() %>% summarize()`\n",
"\n",
"Zoskupenú agregáciu v R je možné jednoducho vypočítať pomocou\n",
"\n",
"`dplyr::group_by() %>% summarize()`\n",
"\n",
"- `dplyr::group_by()` mení jednotku analýzy z celého datasetu na jednotlivé skupiny, napríklad podľa mesiacov.\n",
"\n",
"- `dplyr::summarize()` vytvára nový dátový rámec s jedným stĺpcom pre každú zoskupovaciu premennú a jedným stĺpcom pre každú štatistiku, ktorú ste špecifikovali.\n",
"\n",
"Napríklad môžeme použiť `dplyr::group_by() %>% summarize()` na zoskupenie tekvíc do skupín na základe stĺpca **Month** a potom vypočítať **priemernú cenu** za každý mesiac.\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": [
"Stručne!✨\n",
"\n",
"Kategorické prvky, ako sú mesiace, sú lepšie znázornené pomocou stĺpcového grafu 📊. Vrstvy zodpovedné za stĺpcové grafy sú `geom_bar()` a `geom_col()`. Viac informácií nájdete v `?geom_bar`.\n",
"\n",
"Poďme si jeden vytvoriť!\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": [
"🤩🤩 Toto je užitočnejšia vizualizácia dát! Zdá sa, že najvyššia cena za tekvice sa vyskytuje v septembri a októbri. Zodpovedá to vašim očakávaniam? Prečo áno alebo prečo nie?\n",
"\n",
"Gratulujeme k dokončeniu druhej lekcie 👏! Pripravili ste svoje dáta na vytváranie modelov a potom ste odhalili ďalšie poznatky pomocou vizualizácií!\n"
],
"metadata": {
"id": "zDm0VOzzcuzR"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Upozornenie**: \nTento dokument bol preložený pomocou služby na automatický preklad [Co-op Translator](https://github.com/Azure/co-op-translator). Aj keď sa snažíme o presnosť, upozorňujeme, že automatické preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho pôvodnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre dôležité informácie odporúčame profesionálny ľudský preklad. Nezodpovedáme za žiadne nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu.\n"
]
}
]
}