{ "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:49:10+00:00", "source_file": "2-Regression/2-Data/solution/R/lesson_2-R.ipynb", "language_code": "sl" } }, "cells": [ { "cell_type": "markdown", "source": [ "# Zgradite regresijski model: priprava in vizualizacija podatkov\n", "\n", "## **Linearna regresija za buče - Lekcija 2**\n", "#### Uvod\n", "\n", "Zdaj, ko imate na voljo orodja, ki jih potrebujete za začetek gradnje modelov strojnega učenja z Tidymodels in Tidyverse, ste pripravljeni začeti postavljati vprašanja o svojih podatkih. Ko delate s podatki in uporabljate rešitve strojnega učenja, je zelo pomembno, da znate postaviti prava vprašanja, da pravilno izkoristite potencial svojega nabora podatkov.\n", "\n", "V tej lekciji boste spoznali:\n", "\n", "- Kako pripraviti podatke za gradnjo modela.\n", "\n", "- Kako uporabiti `ggplot2` za vizualizacijo podatkov.\n", "\n", "Vprašanje, na katerega želite dobiti odgovor, bo določilo, katere vrste algoritmov strojnega učenja boste uporabili. Kakovost odgovora, ki ga dobite, pa bo močno odvisna od narave vaših podatkov.\n", "\n", "Poglejmo to skozi praktično vajo.\n", "\n", "\n", "

\n", " \n", "

Umetniško delo @allison_horst
\n", "\n", "\n", "\n" ], "metadata": { "id": "Pg5aexcOPqAZ" } }, { "cell_type": "markdown", "source": [ "## 1. Uvoz podatkov o bučah in priklic Tidyverse\n", "\n", "Za obdelavo te lekcije bomo potrebovali naslednje pakete:\n", "\n", "- `tidyverse`: [tidyverse](https://www.tidyverse.org/) je [zbirka paketov za R](https://www.tidyverse.org/packages), zasnovana za hitrejše, enostavnejše in bolj zabavno podatkovno znanost!\n", "\n", "Namestite jih lahko z ukazom:\n", "\n", "`install.packages(c(\"tidyverse\"))`\n", "\n", "Spodnji skript preveri, ali imate nameščene pakete, potrebne za dokončanje tega modula, in jih namesti, če kateri manjka.\n" ], "metadata": { "id": "dc5WhyVdXAjR" } }, { "cell_type": "code", "execution_count": null, "source": [ "suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n", "pacman::p_load(tidyverse)" ], "outputs": [], "metadata": { "id": "GqPYUZgfXOBt" } }, { "cell_type": "markdown", "source": [ "Zdaj zaženimo nekaj paketov in naložimo [podatke](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv), ki so na voljo za to lekcijo!\n" ], "metadata": { "id": "kvjDTPDSXRr2" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Load the core Tidyverse packages\n", "library(tidyverse)\n", "\n", "# Import the pumpkins data\n", "pumpkins <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/2-Regression/data/US-pumpkins.csv\")\n", "\n", "\n", "# Get a glimpse and dimensions of the data\n", "glimpse(pumpkins)\n", "\n", "\n", "# Print the first 50 rows of the data set\n", "pumpkins %>% \n", " slice_head(n =50)" ], "outputs": [], "metadata": { "id": "VMri-t2zXqgD" } }, { "cell_type": "markdown", "source": [ "Hitro `glimpse()` takoj pokaže, da so prisotne prazne vrednosti ter mešanica nizov (`chr`) in numeričnih podatkov (`dbl`). `Date` je tipa znak, poleg tega pa je tu še nenavadni stolpec z imenom `Package`, kjer so podatki mešanica med `sacks`, `bins` in drugimi vrednostmi. Podatki so, pravzaprav, precej zmedeni 😤.\n", "\n", "Pravzaprav ni ravno pogosto, da bi dobili podatkovni niz, ki je popolnoma pripravljen za uporabo pri ustvarjanju modela strojnega učenja kar takoj. A brez skrbi, v tej lekciji se boste naučili, kako pripraviti surov podatkovni niz z uporabo standardnih knjižnic v R 🧑‍🔧. Prav tako se boste naučili različnih tehnik za vizualizacijo podatkov.📈📊\n", "
\n", "\n", "> Osvežitev: Operator cevi (`%>%`) izvaja operacije v logičnem zaporedju tako, da objekt posreduje naprej v funkcijo ali izraz klica. Operator cevi si lahko predstavljate kot \"in potem\" v vaši kodi.\n" ], "metadata": { "id": "REWcIv9yX29v" } }, { "cell_type": "markdown", "source": [ "## 2. Preverjanje manjkajočih podatkov\n", "\n", "Ena najpogostejših težav, s katerimi se soočajo podatkovni znanstveniki, so nepopolni ali manjkajoči podatki. R predstavlja manjkajoče ali neznane vrednosti s posebnim označevalcem: `NA` (Not Available).\n", "\n", "Kako torej ugotovimo, da podatkovni okvir vsebuje manjkajoče vrednosti?\n", "
\n", "- Eden od preprostih načinov je uporaba osnovne R funkcije `anyNA`, ki vrne logične vrednosti `TRUE` ali `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, zdi se, da manjkajo nekateri podatki! To je dobro izhodišče.\n", "\n", "- Druga možnost bi bila uporaba funkcije `is.na()`, ki pokaže, kateri posamezni elementi stolpcev manjkajo, z logično vrednostjo `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": [ "V redu, naloga je opravljena, vendar bi bilo z veliko podatkovno tabelo, kot je ta, neučinkovito in praktično nemogoče pregledati vse vrstice in stolpce posamično😴.\n", "\n", "- Bolj intuitiven način bi bil izračunati vsoto manjkajočih vrednosti za vsak stolpec:\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": [ "Veliko bolje! Manjkajo podatki, vendar morda to ne bo pomembno za nalogo. Poglejmo, kaj bo prinesla nadaljnja analiza.\n", "\n", "> Poleg odličnih paketov in funkcij ima R zelo dobro dokumentacijo. Na primer, uporabite `help(colSums)` ali `?colSums`, da izveste več o funkciji.\n" ], "metadata": { "id": "9gv-crB6ZD1Y" } }, { "cell_type": "markdown", "source": [ "## 3. Dplyr: Slovnica za manipulacijo podatkov\n", "\n", "

\n", " \n", "

Ilustracija avtorice @allison_horst
\n", "\n", "\n", "\n" ], "metadata": { "id": "o4jLY5-VZO2C" } }, { "cell_type": "markdown", "source": [ "[`dplyr`](https://dplyr.tidyverse.org/), paket v Tidyverse, je slovnica za obdelavo podatkov, ki ponuja dosleden nabor glagolov, s katerimi lahko rešite najpogostejše izzive pri obdelavi podatkov. V tem razdelku bomo raziskali nekatere glagole dplyr!\n" ], "metadata": { "id": "i5o33MQBZWWw" } }, { "cell_type": "markdown", "source": [ "#### dplyr::select()\n", "\n", "`select()` je funkcija v paketu `dplyr`, ki vam pomaga izbrati stolpce za ohranitev ali izključitev.\n", "\n", "Da bo vaš podatkovni okvir lažji za delo, odstranite več njegovih stolpcev z uporabo `select()` in obdržite samo tiste stolpce, ki jih potrebujete.\n", "\n", "Na primer, v tej vaji bo naša analiza vključevala stolpce `Package`, `Low Price`, `High Price` in `Date`. Izberimo te stolpce.\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()` je funkcija v paketu `dplyr`, ki vam omogoča ustvarjanje ali spreminjanje stolpcev, pri čemer obstoječi stolpci ostanejo nespremenjeni.\n", "\n", "Splošna struktura funkcije mutate je:\n", "\n", "`data %>% mutate(new_column_name = what_it_contains)`\n", "\n", "Poglejmo, kako deluje `mutate`, z uporabo stolpca `Date` in izvedbo naslednjih operacij:\n", "\n", "1. Pretvorba datumov (trenutno tipa znak) v format meseca (to so ameriški datumi, zato je format `MM/DD/YYYY`).\n", "\n", "2. Izvleček meseca iz datumov v nov stolpec.\n", "\n", "V jeziku R paket [lubridate](https://lubridate.tidyverse.org/) olajša delo s podatki tipa Datum-čas. Zato uporabimo `dplyr::mutate()`, `lubridate::mdy()`, `lubridate::month()` in preverimo, kako doseči zgoraj navedene cilje. Stolpec Date lahko odstranimo, saj ga v nadaljnjih operacijah ne bomo več potrebovali.\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": [ "Juhu! 🤩\n", "\n", "Zdaj ustvarimo nov stolpec `Price`, ki predstavlja povprečno ceno buče. Nato izračunajmo povprečje stolpcev `Low Price` in `High Price`, da zapolnimo novi stolpec 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": [ "Ja!💪\n", "\n", "\"Počakaj malo!\", boš rekel po hitrem pregledu celotnega nabora podatkov z `View(pumpkins)`, \"Tukaj je nekaj nenavadnega!\"🤔\n", "\n", "Če pogledaš stolpec `Package`, so buče prodane v različnih konfiguracijah. Nekatere so prodane v merah `1 1/9 bushel`, nekatere v merah `1/2 bushel`, nekatere na bučo, nekatere na funt, in nekatere v velikih škatlah z različnimi širinami.\n", "\n", "Preverimo to:\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": [ "Neverjetno!👏\n", "\n", "Buče je očitno zelo težko dosledno tehtati, zato jih filtrirajmo tako, da izberemo samo buče z nizom *bushel* v stolpcu `Package` in jih shranimo v nov podatkovni okvir `new_pumpkins`.\n" ], "metadata": { "id": "7sMjiVujaZxY" } }, { "cell_type": "markdown", "source": [ "#### dplyr::filter() in stringr::str_detect()\n", "\n", "[`dplyr::filter()`](https://dplyr.tidyverse.org/reference/filter.html): ustvari podmnožico podatkov, ki vsebuje **vrstice**, ki ustrezajo vašim pogojem, v tem primeru buče z nizom *bushel* v stolpcu `Package`.\n", "\n", "[stringr::str_detect()](https://stringr.tidyverse.org/reference/str_detect.html): zazna prisotnost ali odsotnost vzorca v nizu.\n", "\n", "Paket [`stringr`](https://github.com/tidyverse/stringr) ponuja enostavne funkcije za pogoste operacije z nizi.\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": [ "Vidite, da smo zožili izbor na približno 415 vrstic podatkov, ki vsebujejo buče po koših.🤩\n" ], "metadata": { "id": "VrDwF031avlR" } }, { "cell_type": "markdown", "source": [ "#### dplyr::case_when()\n", "\n", "**Ampak počakajte! Še nekaj je treba narediti**\n", "\n", "Ste opazili, da se količina košev razlikuje po vrsticah? Potrebno je normalizirati cene, da bodo prikazane na koš, ne pa na 1 1/9 ali 1/2 koša. Čas je za nekaj matematike, da to standardiziramo.\n", "\n", "Uporabili bomo funkcijo [`case_when()`](https://dplyr.tidyverse.org/reference/case_when.html), da *spremenimo* stolpec Price glede na določene pogoje. `case_when` omogoča vektorizacijo več `if_else()` stavkov.\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": [ "Zdaj lahko analiziramo ceno na enoto glede na njihovo meritev v bušlnih. Vsa ta študija o bušlnih buč pa kaže, kako zelo `pomembno` je `razumeti naravo svojih podatkov`!\n", "\n", "> ✅ Po navedbah [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308) teža bušlja zavisi od vrste pridelka, saj gre za meritev prostornine. \"Bušelj paradižnikov, na primer, naj bi tehtal 56 funtov... Listi in zelenjava zavzamejo več prostora z manjšo težo, zato bušelj špinače tehta le 20 funtov.\" Vse skupaj je precej zapleteno! Ne ukvarjajmo se s pretvorbo iz bušljev v funte, ampak raje določimo ceno po bušlju. Vsa ta študija o bušlnih buč pa kaže, kako zelo pomembno je razumeti naravo svojih podatkov!\n", ">\n", "> ✅ Ste opazili, da so buče, prodane po pol bušlja, zelo drage? Ali lahko ugotovite, zakaj? Namig: majhne buče so precej dražje od velikih, verjetno zato, ker jih je v bušlju veliko več, glede na neizkoriščen prostor, ki ga zavzame ena velika votla buča za pito.\n" ], "metadata": { "id": "pS2GNPagbSdb" } }, { "cell_type": "markdown", "source": [ "Pomembno pravilo: \n", "1. NE dodajajte '''markdown ali kakršnih koli drugih oznak okoli prevoda \n", "2. Poskrbite, da prevod ne bo zvenel preveč dobesedno \n", "3. Prevedite tudi komentarje \n", "4. Ta datoteka je napisana v obliki Markdown - ne obravnavajte je kot XML ali HTML \n", "5. Ne prevajajte: \n", " - [!NOTE], [!WARNING], [!TIP], [!IMPORTANT], [!CAUTION] \n", " - Imen spremenljivk, funkcij, razredov \n", " - Oznak, kot so @@INLINE_CODE_x@@ ali @@CODE_BLOCK_x@@ \n", " - URL-jev ali poti \n", "6. Ohranite vso izvirno oblikovanje Markdown nespremenjeno \n", "7. Vrni SAMO prevedeno vsebino brez dodatnih oznak ali oblikovanja \n", "\n", "Zdaj pa, za čisto avanturo 💁‍♀️, premaknimo stolpec Month na prvo mesto, torej `pred` stolpec `Package`. \n", "\n", "Za spremembo položajev stolpcev se uporablja `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": [ "Odlično delo!👌 Zdaj imate čist in urejen nabor podatkov, na katerem lahko zgradite svoj novi regresijski model! \n", "
\n" ], "metadata": { "id": "y8TJ0Za_bn5Y" } }, { "cell_type": "markdown", "source": [ "## 4. Vizualizacija podatkov z ggplot2\n", "\n", "

\n", " \n", "

Infografika avtorja Dasani Madipalli
\n", "\n", "\n", "\n", "\n", "Obstaja *modri* rek, ki pravi:\n", "\n", "> \"Preprost graf je analitiku podatkov prinesel več informacij kot katerakoli druga naprava.\" --- John Tukey\n", "\n", "Del vloge podatkovnega znanstvenika je prikazati kakovost in naravo podatkov, s katerimi dela. To pogosto dosežejo z ustvarjanjem zanimivih vizualizacij, kot so grafi, diagrami in prikazi, ki pokažejo različne vidike podatkov. Na ta način lahko vizualno prikažejo odnose in vrzeli, ki jih je sicer težko odkriti.\n", "\n", "Vizualizacije lahko pomagajo tudi pri določanju najbolj primerne tehnike strojnega učenja za podatke. Na primer, razpršen diagram, ki sledi črti, nakazuje, da so podatki primerni za nalogo linearne regresije.\n", "\n", "R ponuja več sistemov za izdelavo grafov, vendar je [`ggplot2`](https://ggplot2.tidyverse.org/index.html) eden najbolj elegantnih in vsestranskih. `ggplot2` omogoča sestavljanje grafov z **združevanjem neodvisnih komponent**.\n", "\n", "Začnimo s preprostim razpršenim diagramom za stolpca Price in Month.\n", "\n", "V tem primeru bomo začeli z [`ggplot()`](https://ggplot2.tidyverse.org/reference/ggplot.html), podali podatkovni niz in estetsko preslikavo (z [`aes()`](https://ggplot2.tidyverse.org/reference/aes.html)), nato pa dodali sloje (kot je [`geom_point()`](https://ggplot2.tidyverse.org/reference/geom_point.html)) za razpršene diagrame.\n" ], "metadata": { "id": "mYSH6-EtbvNa" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Set a theme for the plots\n", "theme_set(theme_light())\n", "\n", "# Create a scatter plot\n", "p <- ggplot(data = new_pumpkins, aes(x = Price, y = Month))\n", "p + geom_point()" ], "outputs": [], "metadata": { "id": "g2YjnGeOcLo4" } }, { "cell_type": "markdown", "source": [ "Je to uporaben graf 🤷? Ali te kaj na njem preseneča?\n", "\n", "Ni posebej uporaben, saj zgolj prikazuje tvoje podatke kot razpored točk v določenem mesecu.\n", "
\n" ], "metadata": { "id": "Ml7SDCLQcPvE" } }, { "cell_type": "markdown", "source": [ "### **Kako naredimo podatke uporabne?**\n", "\n", "Da bi prikazali koristne podatke na grafikonih, je običajno potrebno podatke nekako združiti. Na primer, v našem primeru bi iskanje povprečne cene buč za vsak mesec omogočilo boljši vpogled v osnovne vzorce v naših podatkih. To nas pripelje do še ene hitre predstavitve **dplyr**:\n", "\n", "#### `dplyr::group_by() %>% summarize()`\n", "\n", "Združeno agregiranje v R lahko enostavno izvedemo z\n", "\n", "`dplyr::group_by() %>% summarize()`\n", "\n", "- `dplyr::group_by()` spremeni enoto analize iz celotnega nabora podatkov na posamezne skupine, kot so na primer meseci.\n", "\n", "- `dplyr::summarize()` ustvari nov podatkovni okvir z enim stolpcem za vsako spremenljivko skupine in enim stolpcem za vsako statistiko povzetka, ki ste jo določili.\n", "\n", "Na primer, lahko uporabimo `dplyr::group_by() %>% summarize()` za združevanje buč v skupine na podlagi stolpca **Month** in nato izračunamo **povprečno ceno** za vsak mesec.\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": [ "Jedrnato!✨\n", "\n", "Kategorijske značilnosti, kot so meseci, so bolje prikazane z uporabo stolpčnega diagrama 📊. Plasti, ki so odgovorne za stolpčne diagrame, so `geom_bar()` in `geom_col()`. Preverite `?geom_bar` za več informacij.\n", "\n", "Pa ga ustvarimo!\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": [ "🤩🤩 To je bolj uporabna vizualizacija podatkov! Zdi se, da kaže, da so najvišje cene buč v septembru in oktobru. Ali to ustreza vašim pričakovanjem? Zakaj ali zakaj ne?\n", "\n", "Čestitke za zaključek druge lekcije 👏! Pripravili ste svoje podatke za gradnjo modela in nato odkrili več vpogledov z uporabo vizualizacij!\n" ], "metadata": { "id": "zDm0VOzzcuzR" } }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n---\n\n**Omejitev odgovornosti**: \nTa dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda.\n" ] } ] }