{ "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-04T07:21:46+00:00", "source_file": "2-Regression/2-Data/solution/R/lesson_2-R.ipynb", "language_code": "hr" } }, "cells": [ { "cell_type": "markdown", "source": [ "# Izgradnja regresijskog modela: priprema i vizualizacija podataka\n", "\n", "## **Linearna regresija za bundeve - Lekcija 2**\n", "#### Uvod\n", "\n", "Sada kada imate alate potrebne za izgradnju modela strojnog učenja koristeći Tidymodels i Tidyverse, spremni ste početi postavljati pitanja o svojim podacima. Dok radite s podacima i primjenjujete rješenja strojnog učenja, vrlo je važno znati kako postaviti pravo pitanje kako biste pravilno iskoristili potencijale svog skupa podataka.\n", "\n", "U ovoj lekciji naučit ćete:\n", "\n", "- Kako pripremiti podatke za izgradnju modela.\n", "\n", "- Kako koristiti `ggplot2` za vizualizaciju podataka.\n", "\n", "Pitanje na koje trebate odgovoriti odredit će koju vrstu algoritama strojnog učenja ćete koristiti. Kvaliteta odgovora koji dobijete uvelike će ovisiti o prirodi vaših podataka.\n", "\n", "Pogledajmo ovo kroz praktičnu vježbu.\n", "\n", "\n", "
\n",
" \n",
"
\n",
"\n",
"> Podsjetnik: Operator cijevi (`%>%`) izvodi operacije u logičnom slijedu prosljeđujući objekt dalje u funkciju ili izraz poziva. Možete zamisliti operator cijevi kao da u vašem kodu kaže \"i onda\".\n"
],
"metadata": {
"id": "REWcIv9yX29v"
}
},
{
"cell_type": "markdown",
"source": [
"## 2. Provjera nedostajućih podataka\n",
"\n",
"Jedan od najčešćih problema s kojima se znanstvenici podataka susreću je nepotpuni ili nedostajući podaci. R predstavlja nedostajuće ili nepoznate vrijednosti posebnim sentinel vrijednostima: `NA` (Not Available).\n",
"\n",
"Kako možemo znati da podatkovni okvir sadrži nedostajuće vrijednosti?\n",
"
\n",
"- Jedan jednostavan način bio bi korištenje osnovne R funkcije `anyNA`, koja vraća logičke objekte `TRUE` ili `FALSE`.\n"
],
"metadata": {
"id": "Zxfb3AM5YbUe"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"pumpkins %>% \n",
" anyNA()"
],
"outputs": [],
"metadata": {
"id": "G--DQutAYltj"
}
},
{
"cell_type": "markdown",
"source": [
"Odlično, čini se da nedostaju neki podaci! To je dobro mjesto za početak.\n",
"\n",
"- Drugi način bio bi korištenje funkcije `is.na()` koja pokazuje koji su pojedinačni elementi stupca nedostajući s logičkom vrijednošću `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": [
"U redu, posao je obavljen, ali s velikim podatkovnim okvirom poput ovog, bilo bi neučinkovito i praktički nemoguće pregledati sve redove i stupce pojedinačno😴.\n",
"\n",
"- Intuitivniji način bio bi izračunati zbroj nedostajućih vrijednosti za svaki stupac:\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": [
"Mnogo bolje! Nedostaju neki podaci, ali možda to neće biti važno za zadatak koji je pred nama. Vidjet ćemo što će donijeti daljnja analiza.\n",
"\n",
"> Uz sjajne skupove paketa i funkcija, R ima vrlo dobru dokumentaciju. Na primjer, koristite `help(colSums)` ili `?colSums` kako biste saznali više o funkciji.\n"
],
"metadata": {
"id": "9gv-crB6ZD1Y"
}
},
{
"cell_type": "markdown",
"source": [
"## 3. Dplyr: Gramatika za manipulaciju podacima\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",
"\"Ali čekaj!\", reći ćeš nakon što brzo pregledaš cijeli skup podataka s `View(pumpkins)`, \"Ovdje nešto ne štima!\"🤔\n",
"\n",
"Ako pogledaš stupac `Package`, bundeve se prodaju u mnogim različitim konfiguracijama. Neke se prodaju u mjerama `1 1/9 bushel`, neke u mjerama `1/2 bushel`, neke po bundevi, neke po funti, a neke u velikim kutijama različitih širina.\n",
"\n",
"Provjerimo ovo:\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": [
"Nevjerojatno!👏\n",
"\n",
"Čini se da je vrlo teško dosljedno vagati bundeve, pa ih filtrirajmo odabirom samo bundeva koje sadrže niz *bushel* u stupcu `Package` i stavimo to u novi podatkovni okvir `new_pumpkins`.\n"
],
"metadata": {
"id": "7sMjiVujaZxY"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::filter() i stringr::str_detect()\n",
"\n",
"[`dplyr::filter()`](https://dplyr.tidyverse.org/reference/filter.html): stvara podskup podataka koji sadrži samo **redove** koji zadovoljavaju vaše uvjete, u ovom slučaju, bundeve s nizom *bushel* u stupcu `Package`.\n",
"\n",
"[stringr::str_detect()](https://stringr.tidyverse.org/reference/str_detect.html): otkriva prisutnost ili odsutnost uzorka u nizu.\n",
"\n",
"Paket [`stringr`](https://github.com/tidyverse/stringr) pruža jednostavne funkcije za uobičajene operacije s nizovima.\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": [
"Možete vidjeti da smo suzili na otprilike 415 redaka podataka koji sadrže bundeve po bušelu.🤩 \n",
"
\n"
],
"metadata": {
"id": "VrDwF031avlR"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::case_when()\n",
"\n",
"**Ali čekajte! Ima još nešto za napraviti**\n",
"\n",
"Jeste li primijetili da se količina u bušelu razlikuje po redovima? Trebate normalizirati cijene tako da prikazujete cijenu po bušelu, a ne po 1 1/9 ili 1/2 bušela. Vrijeme je za malo matematike kako biste to standardizirali.\n",
"\n",
"Koristit ćemo funkciju [`case_when()`](https://dplyr.tidyverse.org/reference/case_when.html) za *modifikaciju* stupca Price ovisno o određenim uvjetima. `case_when` omogućuje vektorizaciju više `if_else()` izraza.\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": [
"Sada možemo analizirati cijenu po jedinici na temelju njihove mjere u bušelima. Sve ovo proučavanje bušela bundeva, međutim, pokazuje koliko je `važno` `razumjeti prirodu svojih podataka`!\n",
"\n",
"> ✅ Prema [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308), težina bušela ovisi o vrsti proizvoda, budući da je to mjera volumena. \"Bušel rajčica, na primjer, trebao bi težiti 56 funti... Lišće i zelje zauzimaju više prostora s manje težine, pa bušel špinata teži samo 20 funti.\" Sve je to prilično komplicirano! Nemojmo se zamarati pretvaranjem bušela u funte, već radije odredimo cijenu po bušelu. Sve ovo proučavanje bušela bundeva, međutim, pokazuje koliko je važno razumjeti prirodu svojih podataka!\n",
">\n",
"> ✅ Jeste li primijetili da su bundeve koje se prodaju na pola bušela vrlo skupe? Možete li otkriti zašto? Savjet: male bundeve su puno skuplje od velikih, vjerojatno zato što ih ima mnogo više po bušelu, s obzirom na neiskorišteni prostor koji zauzima jedna velika šuplja pita bundeva.\n"
],
"metadata": {
"id": "pS2GNPagbSdb"
}
},
{
"cell_type": "markdown",
"source": [
"Sada, za čisti užitak avanture 💁♀️, premjestimo stupac Mjesec na prvu poziciju, tj. `prije` stupca `Paket`.\n",
"\n",
"`dplyr::relocate()` koristi se za promjenu pozicija stupaca.\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": [
"Dobar posao!👌 Sada imate čist i uredan skup podataka na kojem možete izgraditi svoj novi regresijski model!\n"
],
"metadata": {
"id": "y8TJ0Za_bn5Y"
}
},
{
"cell_type": "markdown",
"source": [
"## 4. Vizualizacija podataka s ggplot2\n",
"\n",
"
\n",
" \n",
"
\n"
],
"metadata": {
"id": "Ml7SDCLQcPvE"
}
},
{
"cell_type": "markdown",
"source": [
"### **Kako učiniti podatke korisnima?**\n",
"\n",
"Kako bismo prikazali korisne podatke na grafikonima, obično je potrebno nekako grupirati podatke. Na primjer, u našem slučaju, pronalaženje prosječne cijene bundeva za svaki mjesec pružilo bi više uvida u osnovne obrasce u našim podacima. To nas dovodi do još jednog brzog pregleda **dplyr**:\n",
"\n",
"#### `dplyr::group_by() %>% summarize()`\n",
"\n",
"Grupirana agregacija u R-u može se lako izračunati pomoću\n",
"\n",
"`dplyr::group_by() %>% summarize()`\n",
"\n",
"- `dplyr::group_by()` mijenja jedinicu analize s cijelog skupa podataka na pojedinačne grupe, poput grupiranja po mjesecima.\n",
"\n",
"- `dplyr::summarize()` stvara novi podatkovni okvir s jednim stupcem za svaku grupirajuću varijablu i jednim stupcem za svaku od statistika sažetka koje ste odredili.\n",
"\n",
"Na primjer, možemo koristiti `dplyr::group_by() %>% summarize()` kako bismo grupirali bundeve u grupe na temelju stupca **Month** i zatim pronašli **prosječnu cijenu** za svaki mjesec.\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": [
"Sažeto!✨\n",
"\n",
"Kategorijske značajke, poput mjeseci, bolje su prikazane pomoću stupčastog grafikona 📊. Slojevi odgovorni za stupčaste grafikone su `geom_bar()` i `geom_col()`. Pogledajte `?geom_bar` za više informacija.\n",
"\n",
"Idemo napraviti jedan!\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": [
"🤩🤩Ovo je korisnija vizualizacija podataka! Čini se da pokazuje kako su najviše cijene bundeva u rujnu i listopadu. Odgovara li to vašim očekivanjima? Zašto da ili zašto ne?\n",
"\n",
"Čestitamo na završetku druge lekcije 👏! Pripremili ste svoje podatke za izgradnju modela, a zatim otkrili više uvida koristeći vizualizacije!\n"
],
"metadata": {
"id": "zDm0VOzzcuzR"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Odricanje od odgovornosti**: \nOvaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane čovjeka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja proizlaze iz korištenja ovog prijevoda.\n"
]
}
]
}