You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ML-For-Beginners/translations/lt/2-Regression/3-Linear/solution/R/lesson_3-R.ipynb

1084 lines
42 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

{
"nbformat": 4,
"nbformat_minor": 2,
"metadata": {
"colab": {
"name": "lesson_3-R.ipynb",
"provenance": [],
"collapsed_sections": [],
"toc_visible": true
},
"kernelspec": {
"name": "ir",
"display_name": "R"
},
"language_info": {
"name": "R"
},
"coopTranslator": {
"original_hash": "5015d65d61ba75a223bfc56c273aa174",
"translation_date": "2025-09-03T19:21:06+00:00",
"source_file": "2-Regression/3-Linear/solution/R/lesson_3-R.ipynb",
"language_code": "lt"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [],
"metadata": {
"id": "EgQw8osnsUV-"
}
},
{
"cell_type": "markdown",
"source": [
"## Linijinė ir polinominė regresija moliūgų kainodarai - 3 pamoka\n",
"<p >\n",
" <img src=\"../../images/linear-polynomial.png\"\n",
" width=\"800\"/>\n",
" <figcaption>Infografika: Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"#### Įvadas\n",
"\n",
"Iki šiol jūs susipažinote su regresijos sąvoka, naudodami pavyzdinius duomenis iš moliūgų kainodaros duomenų rinkinio, kurį naudosime visoje šioje pamokoje. Taip pat vizualizavote duomenis naudodami `ggplot2`. 💪\n",
"\n",
"Dabar esate pasiruošę gilintis į regresiją, skirtą mašininio mokymosi užduotims. Šioje pamokoje sužinosite daugiau apie du regresijos tipus: *paprastą linijinę regresiją* ir *polinominę regresiją*, kartu su kai kuriais matematiniais pagrindais, kuriais remiasi šios technikos.\n",
"\n",
"> Visame šioje mokymo programoje mes darome prielaidą, kad turite minimalias matematikos žinias, ir siekiame, kad ji būtų prieinama studentams iš kitų sričių. Todėl atkreipkite dėmesį į pastabas, 🧮 išnašas, diagramas ir kitus mokymosi įrankius, kurie padės geriau suprasti medžiagą.\n",
"\n",
"#### Pasiruošimas\n",
"\n",
"Primename, kad jūs įkeliat šiuos duomenis tam, kad galėtumėte užduoti klausimus apie juos.\n",
"\n",
"- Kada geriausias laikas pirkti moliūgus?\n",
"\n",
"- Kokia kaina galima tikėtis už dėžę miniatiūrinių moliūgų?\n",
"\n",
"- Ar turėčiau juos pirkti pusės bušelio krepšiuose ar 1 1/9 bušelio dėžėse? Pasigilinkime į šiuos duomenis.\n",
"\n",
"Ankstesnėje pamokoje sukūrėte `tibble` (modernų duomenų rėmelio variantą) ir užpildėte jį dalimi originalaus duomenų rinkinio, standartizuodami kainas pagal bušelį. Tačiau, atlikdami šį veiksmą, surinkote tik apie 400 duomenų taškų ir tik rudens mėnesiams. Galbūt galime gauti šiek tiek daugiau informacijos apie duomenų pobūdį, jei juos dar labiau išvalysime? Pažiūrėsime... 🕵️‍♀️\n",
"\n",
"Šiai užduočiai mums reikės šių paketų:\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) yra [R paketų kolekcija](https://www.tidyverse.org/packages), sukurta tam, kad duomenų mokslas būtų greitesnis, lengvesnis ir įdomesnis!\n",
"\n",
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) sistema yra [paketų kolekcija](https://www.tidymodels.org/packages/) modeliavimui ir mašininiam mokymuisi.\n",
"\n",
"- `janitor`: [janitor paketas](https://github.com/sfirke/janitor) siūlo paprastus įrankius, skirtus nešvarių duomenų analizei ir valymui.\n",
"\n",
"- `corrplot`: [corrplot paketas](https://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html) suteikia vizualinį koreliacijos matricos tyrimo įrankį, kuris palaiko automatinį kintamųjų pertvarkymą, padedantį aptikti paslėptus modelius tarp kintamųjų.\n",
"\n",
"Galite juos įdiegti naudodami:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"janitor\", \"corrplot\"))`\n",
"\n",
"Žemiau pateiktas scenarijus patikrina, ar turite reikalingus paketus šiam moduliui užbaigti, ir, jei jų trūksta, įdiegia juos jums.\n"
],
"metadata": {
"id": "WqQPS1OAsg3H"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"suppressWarnings(if (!require(\"pacman\")) install.packages(\"pacman\"))\n",
"\n",
"pacman::p_load(tidyverse, tidymodels, janitor, corrplot)"
],
"outputs": [],
"metadata": {
"id": "tA4C2WN3skCf",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "c06cd805-5534-4edc-f72b-d0d1dab96ac0"
}
},
{
"cell_type": "markdown",
"source": [
"Vėliau įkelsime šiuos puikius paketus ir padarysime juos prieinamus dabartinėje R sesijoje. (Tai tik iliustracija, `pacman::p_load()` jau tai padarė už jus)\n",
"\n",
"## 1. Linijinės regresijos linija\n",
"\n",
"Kaip sužinojote 1 pamokoje, linijinės regresijos tikslas yra sukurti *geriausiai tinkamą liniją*, kuri:\n",
"\n",
"- **Parodo kintamųjų ryšius**. Parodo ryšį tarp kintamųjų.\n",
"\n",
"- **Atlieka prognozes**. Leidžia tiksliai prognozuoti, kur naujas duomenų taškas atsidurs santykyje su ta linija.\n",
"\n",
"Norėdami nubrėžti tokią liniją, naudojame statistinį metodą, vadinamą **Mažiausių kvadratų regresija**. Terminas `mažiausių kvadratų` reiškia, kad visi duomenų taškai aplink regresijos liniją yra kvadratuojami ir tada sudedami. Idealiu atveju galutinė suma turėtų būti kuo mažesnė, nes siekiame mažo klaidų skaičiaus, arba `mažiausių kvadratų`. Taigi, geriausiai tinkama linija yra ta, kuri duoda mažiausią kvadratinių klaidų sumą - todėl ji vadinama *mažiausių kvadratų regresija*.\n",
"\n",
"Tai darome, nes norime modeliuoti liniją, kuri turi mažiausią bendrą atstumą nuo visų mūsų duomenų taškų. Be to, prieš sudėdami terminus, juos kvadratuojame, nes mums svarbi jų dydžio reikšmė, o ne kryptis.\n",
"\n",
"> **🧮 Parodykite matematiką**\n",
">\n",
"> Ši linija, vadinama *geriausiai tinkama linija*, gali būti išreikšta [lygtimi](https://en.wikipedia.org/wiki/Simple_linear_regression):\n",
">\n",
"> Y = a + bX\n",
">\n",
"> `X` yra '`paaiškinamasis kintamasis` arba `prognozė`'. `Y` yra '`priklausomas kintamasis` arba `rezultatas`'. Linijos nuolydis yra `b`, o `a` yra y-ašies perėjimo taškas, kuris nurodo `Y` reikšmę, kai `X = 0`.\n",
">\n",
"\n",
"> ![](../../../../../../2-Regression/3-Linear/solution/images/slope.png \"nuolydis = $y/x$\")\n",
" Infografikas sukurtas Jen Looper\n",
">\n",
"> Pirmiausia apskaičiuokite nuolydį `b`.\n",
">\n",
"> Kitaip tariant, remiantis mūsų moliūgų duomenų pradiniu klausimu: \"prognozuoti moliūgo kainą už bušelį pagal mėnesį\", `X` reikštų kainą, o `Y` reikštų pardavimo mėnesį.\n",
">\n",
"> ![](../../../../../../translated_images/calculation.989aa7822020d9d0ba9fc781f1ab5192f3421be86ebb88026528aef33c37b0d8.lt.png)\n",
" Infografikas sukurtas Jen Looper\n",
"> \n",
"> Apskaičiuokite Y reikšmę. Jei mokate apie \\$4, tai turi būti balandis!\n",
">\n",
"> Matematiniai skaičiavimai, kurie nustato liniją, turi parodyti linijos nuolydį, kuris taip pat priklauso nuo perėjimo taško, arba kur `Y` yra, kai `X = 0`.\n",
">\n",
"> Galite stebėti šių reikšmių skaičiavimo metodą [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html) svetainėje. Taip pat apsilankykite [šiame mažiausių kvadratų skaičiuotuve](https://www.mathsisfun.com/data/least-squares-calculator.html), kad pamatytumėte, kaip skaičių reikšmės veikia liniją.\n",
"\n",
"Nebaisu, tiesa? 🤓\n",
"\n",
"#### Koreliacija\n",
"\n",
"Dar vienas terminas, kurį reikia suprasti, yra **Koreliacijos koeficientas** tarp duotų X ir Y kintamųjų. Naudodami sklaidos diagramą, galite greitai vizualizuoti šį koeficientą. Diagrama, kurioje duomenų taškai išsidėstę tvarkinga linija, turi aukštą koreliaciją, o diagrama, kurioje taškai išsibarstę tarp X ir Y, turi žemą koreliaciją.\n",
"\n",
"Geras linijinės regresijos modelis bus tas, kuris turi aukštą (artimesnį 1 nei 0) Koreliacijos koeficientą, naudojant mažiausių kvadratų regresijos metodą su regresijos linija.\n"
],
"metadata": {
"id": "cdX5FRpvsoP5"
}
},
{
"cell_type": "markdown",
"source": [
"## **2. Šokis su duomenimis: duomenų rėmelio kūrimas, kuris bus naudojamas modeliavimui**\n",
"\n",
"<p >\n",
" <img src=\"../../images/janitor.jpg\"\n",
" width=\"700\"/>\n",
" <figcaption>Piešinys @allison_horst</figcaption>\n",
"\n",
"\n",
"<!--![Piešinys \\@allison_horst](../../../../../../translated_images/janitor.e4a77dd3d3e6a32e25327090b8a9c00dc7cf459c44fa9f184c5ecb0d48ce3794.lt.jpg){width=\"700\"}-->\n"
],
"metadata": {
"id": "WdUKXk7Bs8-V"
}
},
{
"cell_type": "markdown",
"source": [
"Įkelkite reikalingas bibliotekas ir duomenų rinkinį. Konvertuokite duomenis į duomenų rėmelį, kuriame yra duomenų dalis:\n",
"\n",
"- Pasirinkite tik moliūgus, kurių kaina nurodyta už statinę\n",
"\n",
"- Konvertuokite datą į mėnesį\n",
"\n",
"- Apskaičiuokite kainą kaip vidurkį tarp aukštos ir žemos kainos\n",
"\n",
"- Konvertuokite kainą, kad ji atspindėtų kainodarą pagal statinės kiekį\n",
"\n",
"> Šiuos žingsnius aptarėme [ankstesnėje pamokoje](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/2-Data/solution/lesson_2-R.ipynb).\n"
],
"metadata": {
"id": "fMCtu2G2s-p8"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Load the core Tidyverse packages\n",
"library(tidyverse)\n",
"library(lubridate)\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 = 5)"
],
"outputs": [],
"metadata": {
"id": "ryMVZEEPtERn"
}
},
{
"cell_type": "markdown",
"source": [
"Nuotykių dvasia, pažvelkime į [`janitor package`](../../../../../../2-Regression/3-Linear/solution/R/github.com/sfirke/janitor), kuris siūlo paprastas funkcijas duomenų tikrinimui ir valymui. Pavyzdžiui, pažvelkime į mūsų duomenų stulpelių pavadinimus:\n"
],
"metadata": {
"id": "xcNxM70EtJjb"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Return column names\n",
"pumpkins %>% \n",
" names()"
],
"outputs": [],
"metadata": {
"id": "5XtpaIigtPfW"
}
},
{
"cell_type": "markdown",
"source": [
"🤔 Galime padaryti geriau. Pakeiskime šių stulpelių pavadinimus į `friendR`, konvertuodami juos į [snake_case](https://en.wikipedia.org/wiki/Snake_case) konvenciją, naudodami `janitor::clean_names`. Norėdami sužinoti daugiau apie šią funkciją: `?clean_names`\n"
],
"metadata": {
"id": "IbIqrMINtSHe"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Clean names to the snake_case convention\n",
"pumpkins <- pumpkins %>% \n",
" clean_names(case = \"snake\")\n",
"\n",
"# Return column names\n",
"pumpkins %>% \n",
" names()"
],
"outputs": [],
"metadata": {
"id": "a2uYvclYtWvX"
}
},
{
"cell_type": "markdown",
"source": [
"Daug tvarkos su tidyR 🧹! Dabar šokis su duomenimis naudojant `dplyr`, kaip ir ankstesnėje pamokoje! 💃\n"
],
"metadata": {
"id": "HfhnuzDDtaDd"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Select desired columns\n",
"pumpkins <- pumpkins %>% \n",
" select(variety, city_name, package, low_price, high_price, date)\n",
"\n",
"\n",
"\n",
"# Extract the month from the dates to a new column\n",
"pumpkins <- pumpkins %>%\n",
" mutate(date = mdy(date),\n",
" month = month(date)) %>% \n",
" select(-date)\n",
"\n",
"\n",
"\n",
"# Create a new column for average Price\n",
"pumpkins <- pumpkins %>% \n",
" mutate(price = (low_price + high_price)/2)\n",
"\n",
"\n",
"# Retain only pumpkins with the string \"bushel\"\n",
"new_pumpkins <- pumpkins %>% \n",
" filter(str_detect(string = package, pattern = \"bushel\"))\n",
"\n",
"\n",
"# Normalize the pricing so that you show the pricing per bushel, not per 1 1/9 or 1/2 bushel\n",
"new_pumpkins <- new_pumpkins %>% \n",
" mutate(price = case_when(\n",
" str_detect(package, \"1 1/9\") ~ price/(1.1),\n",
" str_detect(package, \"1/2\") ~ price*2,\n",
" TRUE ~ price))\n",
"\n",
"# Relocate column positions\n",
"new_pumpkins <- new_pumpkins %>% \n",
" relocate(month, .before = variety)\n",
"\n",
"\n",
"# Display the first 5 rows\n",
"new_pumpkins %>% \n",
" slice_head(n = 5)"
],
"outputs": [],
"metadata": {
"id": "X0wU3gQvtd9f"
}
},
{
"cell_type": "markdown",
"source": [
"Puiku darbas!👌 Dabar turite švarią, tvarkingą duomenų aibę, ant kurios galite kurti savo naują regresijos modelį!\n",
"\n",
"Gal norėtumėte sklaidos diagramos?\n"
],
"metadata": {
"id": "UpaIwaxqth82"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Set theme\n",
"theme_set(theme_light())\n",
"\n",
"# Make a scatter plot of month and price\n",
"new_pumpkins %>% \n",
" ggplot(mapping = aes(x = month, y = price)) +\n",
" geom_point(size = 1.6)\n"
],
"outputs": [],
"metadata": {
"id": "DXgU-j37tl5K"
}
},
{
"cell_type": "markdown",
"source": [
"Sklaidos diagrama primena, kad turime tik duomenis nuo rugpjūčio iki gruodžio. Tikriausiai mums reikia daugiau duomenų, kad galėtume daryti išvadas linijiniu būdu.\n",
"\n",
"Pažvelkime dar kartą į mūsų modeliavimo duomenis:\n"
],
"metadata": {
"id": "Ve64wVbwtobI"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Display first 5 rows\n",
"new_pumpkins %>% \n",
" slice_head(n = 5)"
],
"outputs": [],
"metadata": {
"id": "HFQX2ng1tuSJ"
}
},
{
"cell_type": "markdown",
"source": [
"Ką daryti, jei norėtume prognozuoti moliūgo `kainą`, remdamiesi `miesto` arba `pakuotės` stulpeliais, kurie yra simbolių tipo? Arba dar paprasčiau kaip galėtume rasti koreliaciją (kuri reikalauja, kad abu jos įvesties duomenys būtų skaitiniai) tarp, tarkime, `pakuotės` ir `kainos`? 🤷🤷\n",
"\n",
"Mašininio mokymosi modeliai geriausiai veikia su skaitinėmis savybėmis, o ne tekstinėmis reikšmėmis, todėl paprastai reikia konvertuoti kategorines savybes į skaitines reprezentacijas.\n",
"\n",
"Tai reiškia, kad turime rasti būdą, kaip pertvarkyti savo prognozuojančius kintamuosius, kad modelis galėtų juos efektyviau naudoti šis procesas vadinamas `savybių inžinerija`.\n"
],
"metadata": {
"id": "7hsHoxsStyjJ"
}
},
{
"cell_type": "markdown",
"source": [
"## 3. Duomenų paruošimas modeliui su recipes 👩‍🍳👨‍🍳\n",
"\n",
"Veiklos, kurios pertvarko prognozuojamųjų kintamųjų reikšmes, kad modelis galėtų jas efektyviau naudoti, vadinamos `funkcijų inžinerija`.\n",
"\n",
"Skirtingiems modeliams reikalingi skirtingi išankstinio apdorojimo reikalavimai. Pavyzdžiui, mažiausių kvadratų metodui reikia `kategorinių kintamųjų kodavimo`, tokių kaip mėnuo, veislė ir miesto_pavadinimas. Tai paprasčiausiai reiškia, kad `kategorinių reikšmių` stulpelis yra `paverčiamas` į vieną ar kelis `skaitinius stulpelius`, kurie pakeičia originalą.\n",
"\n",
"Pavyzdžiui, tarkime, jūsų duomenyse yra toks kategorinis kintamasis:\n",
"\n",
"| miestas |\n",
"|:----------:|\n",
"| Denveris |\n",
"| Nairobis |\n",
"| Tokijas |\n",
"\n",
"Galite taikyti *ordininį kodavimą*, kad kiekvienai kategorijai priskirtumėte unikalią sveikojo skaičiaus reikšmę, štai taip:\n",
"\n",
"| miestas |\n",
"|:-------:|\n",
"| 0 |\n",
"| 1 |\n",
"| 2 |\n",
"\n",
"Ir būtent tai mes padarysime su savo duomenimis!\n",
"\n",
"Šiame skyriuje nagrinėsime dar vieną nuostabų Tidymodels paketą: [recipes](https://tidymodels.github.io/recipes/) - kuris sukurtas tam, kad padėtų jums iš anksto apdoroti duomenis **prieš** mokant modelį. Pagrindinė recepto esmė yra objektas, kuris apibrėžia, kokie žingsniai turėtų būti taikomi duomenų rinkiniui, kad jis būtų paruoštas modeliui.\n",
"\n",
"Dabar sukurkime receptą, kuris paruoš mūsų duomenis modeliui, pakeisdamas unikaliu sveikuoju skaičiumi visas stebėjimų reikšmes prognozuojamųjų kintamųjų stulpeliuose:\n"
],
"metadata": {
"id": "AD5kQbcvt3Xl"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Specify a recipe\n",
"pumpkins_recipe <- recipe(price ~ ., data = new_pumpkins) %>% \n",
" step_integer(all_predictors(), zero_based = TRUE)\n",
"\n",
"\n",
"# Print out the recipe\n",
"pumpkins_recipe"
],
"outputs": [],
"metadata": {
"id": "BNaFKXfRt9TU"
}
},
{
"cell_type": "markdown",
"source": [
"Nuostabu! 👏 Mes ką tik sukūrėme pirmąjį receptą, kuris nurodo rezultatą (kainą) ir atitinkamus prognozuotojus, bei tai, kad visos prognozuotojų stulpeliai turėtų būti užkoduoti kaip sveikieji skaičiai 🙌! Greitai išskaidykime tai:\n",
"\n",
"- Kvietimas `recipe()` su formule nurodo receptui kintamųjų *roles*, naudojant `new_pumpkins` duomenis kaip atskaitos tašką. Pavyzdžiui, `price` stulpeliui priskirta `outcome` rolė, o likusiems stulpeliams priskirta `predictor` rolė.\n",
"\n",
"- `step_integer(all_predictors(), zero_based = TRUE)` nurodo, kad visi prognozuotojai turėtų būti konvertuoti į sveikųjų skaičių rinkinį, pradedant numeraciją nuo 0.\n",
"\n",
"Esame tikri, kad galvojate: \"Tai taip šaunu!! Bet ką daryti, jei man reikia patvirtinti, kad receptai daro būtent tai, ko tikėjausi? 🤔\"\n",
"\n",
"Puiki mintis! Matote, kai jūsų receptas apibrėžtas, galite įvertinti parametrus, reikalingus duomenų išankstiniam apdorojimui, ir tada išgauti apdorotus duomenis. Paprastai to nereikia daryti naudojant Tidymodels (tuoj pamatysime įprastą konvenciją-\\> `workflows`), bet tai gali būti naudinga, jei norite atlikti tam tikrą patikrinimą, kad įsitikintumėte, jog receptai veikia taip, kaip tikitės.\n",
"\n",
"Tam jums reikės dar dviejų veiksmažodžių: `prep()` ir `bake()`, o kaip visada, mūsų mažieji R draugai iš [`Allison Horst`](https://github.com/allisonhorst/stats-illustrations) padės geriau tai suprasti!\n",
"\n",
"<p >\n",
" <img src=\"../../images/recipes.png\"\n",
" width=\"550\"/>\n",
" <figcaption>Piešinys @allison_horst</figcaption>\n"
],
"metadata": {
"id": "KEiO0v7kuC9O"
}
},
{
"cell_type": "markdown",
"source": [
"[`prep()`](https://recipes.tidymodels.org/reference/prep.html): apskaičiuoja reikalingus parametrus iš mokymo duomenų rinkinio, kurie vėliau gali būti pritaikyti kitiems duomenų rinkiniams. Pavyzdžiui, tam tikrai prognozės stulpeliui, kokia stebėsena bus priskirta sveikasis skaičius 0, 1, 2 ir t.t.\n",
"\n",
"[`bake()`](https://recipes.tidymodels.org/reference/bake.html): naudoja paruoštą receptą ir taiko operacijas bet kuriam duomenų rinkiniui.\n",
"\n",
"Taigi, paruoškime ir pritaikykime savo receptus, kad tikrai įsitikintume, jog prognozės stulpeliai bus pirmiausia užkoduoti prieš pritaikant modelį.\n"
],
"metadata": {
"id": "Q1xtzebuuTCP"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Prep the recipe\n",
"pumpkins_prep <- prep(pumpkins_recipe)\n",
"\n",
"# Bake the recipe to extract a preprocessed new_pumpkins data\n",
"baked_pumpkins <- bake(pumpkins_prep, new_data = NULL)\n",
"\n",
"# Print out the baked data set\n",
"baked_pumpkins %>% \n",
" slice_head(n = 10)"
],
"outputs": [],
"metadata": {
"id": "FGBbJbP_uUUn"
}
},
{
"cell_type": "markdown",
"source": [
"Oho-ho! 🥳 Apdoroti duomenys `baked_pumpkins` turi visus savo prediktorius užkoduotus, patvirtinant, kad iš anksto apibrėžti duomenų paruošimo žingsniai, vadinami mūsų receptu, veikia kaip tikėtasi. Tai gali apsunkinti skaitymą, tačiau Tidymodels tai supras daug geriau! Skirkite šiek tiek laiko, kad sužinotumėte, kuri stebėsena buvo susieta su atitinkamu sveikuoju skaičiumi.\n",
"\n",
"Taip pat verta paminėti, kad `baked_pumpkins` yra duomenų rėmelis, su kuriuo galime atlikti skaičiavimus.\n",
"\n",
"Pavyzdžiui, pabandykime rasti gerą koreliaciją tarp dviejų jūsų duomenų taškų, kad galėtume potencialiai sukurti gerą prognozavimo modelį. Tam naudosime funkciją `cor()`. Įveskite `?cor()`, kad sužinotumėte daugiau apie šią funkciją.\n"
],
"metadata": {
"id": "1dvP0LBUueAW"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Find the correlation between the city_name and the price\n",
"cor(baked_pumpkins$city_name, baked_pumpkins$price)\n",
"\n",
"# Find the correlation between the package and the price\n",
"cor(baked_pumpkins$package, baked_pumpkins$price)\n"
],
"outputs": [],
"metadata": {
"id": "3bQzXCjFuiSV"
}
},
{
"cell_type": "markdown",
"source": [
"Kaip paaiškėjo, tarp Miesto ir Kainos yra tik silpna koreliacija. Tačiau tarp Pakuotės ir jos Kainos koreliacija yra šiek tiek stipresnė. Tai logiška, tiesa? Paprastai, kuo didesnė produkcijos dėžė, tuo didesnė kaina.\n",
"\n",
"Kol esame prie šios temos, pabandykime vizualizuoti visų stulpelių koreliacijos matricą naudojant `corrplot` paketą.\n"
],
"metadata": {
"id": "BToPWbgjuoZw"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Load the corrplot package\n",
"library(corrplot)\n",
"\n",
"# Obtain correlation matrix\n",
"corr_mat <- cor(baked_pumpkins %>% \n",
" # Drop columns that are not really informative\n",
" select(-c(low_price, high_price)))\n",
"\n",
"# Make a correlation plot between the variables\n",
"corrplot(corr_mat, method = \"shade\", shade.col = NA, tl.col = \"black\", tl.srt = 45, addCoef.col = \"black\", cl.pos = \"n\", order = \"original\")"
],
"outputs": [],
"metadata": {
"id": "ZwAL3ksmutVR"
}
},
{
"cell_type": "markdown",
"source": [
"🤩🤩 Daug geriau.\n",
"\n",
"Geras klausimas, kurį dabar galima užduoti šiems duomenims, būtų: '`Kokios kainos galiu tikėtis už tam tikrą moliūgų paketą?`' Pradėkime!\n",
"\n",
"> Pastaba: Kai **`bake()`** paruoštą receptą **`pumpkins_prep`** su **`new_data = NULL`**, gaunate apdorotus (t. y. užkoduotus) mokymo duomenis. Jei turėtumėte kitą duomenų rinkinį, pavyzdžiui, testavimo rinkinį, ir norėtumėte pamatyti, kaip receptas jį apdorotų, tiesiog kepkite **`pumpkins_prep`** su **`new_data = test_set`**\n",
"\n",
"## 4. Sukurkite linijinį regresijos modelį\n",
"\n",
"<p >\n",
" <img src=\"../../images/linear-polynomial.png\"\n",
" width=\"800\"/>\n",
" <figcaption>Infografikas: Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"<!--![Infografikas: Dasani Madipalli](../../../../../../translated_images/linear-polynomial.5523c7cb6576ccab0fecbd0e3505986eb2d191d9378e785f82befcf3a578a6e7.lt.png){width=\"800\"}-->\n"
],
"metadata": {
"id": "YqXjLuWavNxW"
}
},
{
"cell_type": "markdown",
"source": [
"Dabar, kai sukūrėme receptą ir patvirtinome, kad duomenys bus tinkamai apdoroti, pereikime prie regresijos modelio kūrimo, kad atsakytume į klausimą: „Kokios kainos galiu tikėtis už tam tikrą moliūgų pakuotę?“\n",
"\n",
"#### Treniruokime linijinį regresijos modelį naudodami mokymo rinkinį\n",
"\n",
"Kaip jau turbūt supratote, stulpelis *price* yra `rezultato` kintamasis, o stulpelis *package* yra `prognozės` kintamasis.\n",
"\n",
"Norėdami tai padaryti, pirmiausia padalinsime duomenis taip, kad 80% patektų į mokymo rinkinį, o 20% į testavimo rinkinį. Tada apibrėšime receptą, kuris užkoduos prognozės stulpelį į sveikųjų skaičių rinkinį, ir sukursime modelio specifikaciją. Mes neapdorosime ir nekepinsime savo recepto, nes jau žinome, kad jis tinkamai apdoros duomenis.\n"
],
"metadata": {
"id": "Pq0bSzCevW-h"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"set.seed(2056)\n",
"# Split the data into training and test sets\n",
"pumpkins_split <- new_pumpkins %>% \n",
" initial_split(prop = 0.8)\n",
"\n",
"\n",
"# Extract training and test data\n",
"pumpkins_train <- training(pumpkins_split)\n",
"pumpkins_test <- testing(pumpkins_split)\n",
"\n",
"\n",
"\n",
"# Create a recipe for preprocessing the data\n",
"lm_pumpkins_recipe <- recipe(price ~ package, data = pumpkins_train) %>% \n",
" step_integer(all_predictors(), zero_based = TRUE)\n",
"\n",
"\n",
"\n",
"# Create a linear model specification\n",
"lm_spec <- linear_reg() %>% \n",
" set_engine(\"lm\") %>% \n",
" set_mode(\"regression\")"
],
"outputs": [],
"metadata": {
"id": "CyoEh_wuvcLv"
}
},
{
"cell_type": "markdown",
"source": [
"Puiku! Dabar, kai turime receptą ir modelio specifikaciją, reikia rasti būdą, kaip juos sujungti į objektą, kuris pirmiausia apdoros duomenis (užkulisiuose atliks paruošimą ir kepimą), pritaikys modelį apdorotiems duomenims ir taip pat leis atlikti galimas papildomas apdorojimo veiklas. Kaip tau toks ramybės užtikrinimas!🤩\n",
"\n",
"Tidymodels bibliotekoje šis patogus objektas vadinamas [`workflow`](https://workflows.tidymodels.org/) ir patogiai talpina jūsų modeliavimo komponentus! Tai, ką Python'e vadintume *pipelines*.\n",
"\n",
"Taigi, sujunkime viską į vieną workflow!📦\n"
],
"metadata": {
"id": "G3zF_3DqviFJ"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Hold modelling components in a workflow\n",
"lm_wf <- workflow() %>% \n",
" add_recipe(lm_pumpkins_recipe) %>% \n",
" add_model(lm_spec)\n",
"\n",
"# Print out the workflow\n",
"lm_wf"
],
"outputs": [],
"metadata": {
"id": "T3olroU3v-WX"
}
},
{
"cell_type": "markdown",
"source": [
"Be abejo, darbo eiga gali būti pritaikyta/apmokyta panašiai kaip modelis.\n"
],
"metadata": {
"id": "zd1A5tgOwEPX"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Train the model\n",
"lm_wf_fit <- lm_wf %>% \n",
" fit(data = pumpkins_train)\n",
"\n",
"# Print the model coefficients learned \n",
"lm_wf_fit"
],
"outputs": [],
"metadata": {
"id": "NhJagFumwFHf"
}
},
{
"cell_type": "markdown",
"source": [
"Iš modelio išvesties galime matyti koeficientus, išmoktus mokymo metu. Jie atspindi geriausiai tinkančios tiesės koeficientus, kurie suteikia mažiausią bendrą klaidą tarp tikrųjų ir prognozuotų kintamųjų.\n",
"\n",
"#### Modelio veikimo įvertinimas naudojant testų rinkinį\n",
"\n",
"Atėjo laikas pamatyti, kaip modelis pasirodė 📏! Kaip tai padaryti?\n",
"\n",
"Dabar, kai modelis yra išmokytas, galime jį naudoti prognozėms atlikti testų rinkiniui, pasitelkdami `parsnip::predict()`. Tada galime palyginti šias prognozes su tikrosiomis etikečių reikšmėmis, kad įvertintume, kaip gerai (ar ne taip gerai!) modelis veikia.\n",
"\n",
"Pradėkime nuo prognozių atlikimo testų rinkiniui, tada prijunkime stulpelius prie testų rinkinio.\n"
],
"metadata": {
"id": "_4QkGtBTwItF"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Make predictions for the test set\n",
"predictions <- lm_wf_fit %>% \n",
" predict(new_data = pumpkins_test)\n",
"\n",
"\n",
"# Bind predictions to the test set\n",
"lm_results <- pumpkins_test %>% \n",
" select(c(package, price)) %>% \n",
" bind_cols(predictions)\n",
"\n",
"\n",
"# Print the first ten rows of the tibble\n",
"lm_results %>% \n",
" slice_head(n = 10)"
],
"outputs": [],
"metadata": {
"id": "UFZzTG0gwTs9"
}
},
{
"cell_type": "markdown",
"source": [
"Taip, jūs ką tik apmokėte modelį ir panaudojote jį prognozėms! 🔮 Ar jis geras? Įvertinkime modelio veikimą!\n",
"\n",
"Tidymodels bibliotekoje tai darome naudodami `yardstick::metrics()`! Kalbant apie linijinę regresiją, sutelkime dėmesį į šiuos rodiklius:\n",
"\n",
"- `Root Mean Square Error (RMSE)`: Kvadratinė šaknis iš [MSE](https://en.wikipedia.org/wiki/Mean_squared_error). Tai absoliutus rodiklis, pateikiamas ta pačia vienete kaip ir etiketė (šiuo atveju, moliūgo kaina). Kuo mažesnė reikšmė, tuo geresnis modelis (paprastai tariant, tai reiškia vidutinę kainą, kuria prognozės yra neteisingos!).\n",
"\n",
"- `Determinuotumo koeficientas (dažniausiai žinomas kaip R-squared arba R2)`: Santykinis rodiklis, kurio didesnė reikšmė rodo geresnį modelio pritaikymą. Iš esmės, šis rodiklis parodo, kiek modelis sugeba paaiškinti variaciją tarp prognozuotų ir faktinių etikečių reikšmių.\n"
],
"metadata": {
"id": "0A5MjzM7wW9M"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Evaluate performance of linear regression\n",
"metrics(data = lm_results,\n",
" truth = price,\n",
" estimate = .pred)"
],
"outputs": [],
"metadata": {
"id": "reJ0UIhQwcEH"
}
},
{
"cell_type": "markdown",
"source": [
"Tenka modelio našumas. Pažiūrėkime, ar galime gauti geresnį indikatorių vizualizuodami sklaidos diagramą, kurioje pavaizduotas paketas ir kaina, o tada naudodami prognozes uždėti geriausiai tinkantį linijos grafiką.\n",
"\n",
"Tai reiškia, kad turėsime paruošti ir apdoroti testavimo rinkinį, kad užkoduotume paketo stulpelį, o tada sujungti tai su mūsų modelio atliktomis prognozėmis.\n"
],
"metadata": {
"id": "fdgjzjkBwfWt"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Encode package column\n",
"package_encode <- lm_pumpkins_recipe %>% \n",
" prep() %>% \n",
" bake(new_data = pumpkins_test) %>% \n",
" select(package)\n",
"\n",
"\n",
"# Bind encoded package column to the results\n",
"lm_results <- lm_results %>% \n",
" bind_cols(package_encode %>% \n",
" rename(package_integer = package)) %>% \n",
" relocate(package_integer, .after = package)\n",
"\n",
"\n",
"# Print new results data frame\n",
"lm_results %>% \n",
" slice_head(n = 5)\n",
"\n",
"\n",
"# Make a scatter plot\n",
"lm_results %>% \n",
" ggplot(mapping = aes(x = package_integer, y = price)) +\n",
" geom_point(size = 1.6) +\n",
" # Overlay a line of best fit\n",
" geom_line(aes(y = .pred), color = \"orange\", size = 1.2) +\n",
" xlab(\"package\")\n",
" \n"
],
"outputs": [],
"metadata": {
"id": "R0nw719lwkHE"
}
},
{
"cell_type": "markdown",
"source": [
"Puiku! Kaip matote, linijinės regresijos modelis nelabai gerai apibendrina ryšį tarp pakuotės ir jos atitinkamos kainos.\n",
"\n",
"🎃 Sveikiname, jūs ką tik sukūrėte modelį, kuris gali padėti prognozuoti kelių moliūgų rūšių kainą. Jūsų šventinis moliūgų sodas bus nuostabus. Tačiau tikriausiai galite sukurti dar geresnį modelį!\n",
"\n",
"## 5. Sukurkite polinominės regresijos modelį\n",
"\n",
"<p >\n",
" <img src=\"../../images/linear-polynomial.png\"\n",
" width=\"800\"/>\n",
" <figcaption>Infografikas: Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"<!--![Infografikas: Dasani Madipalli](../../../../../../translated_images/linear-polynomial.5523c7cb6576ccab0fecbd0e3505986eb2d191d9378e785f82befcf3a578a6e7.lt.png){width=\"800\"}-->\n"
],
"metadata": {
"id": "HOCqJXLTwtWI"
}
},
{
"cell_type": "markdown",
"source": [
"Kartais mūsų duomenys gali neturėti tiesinio ryšio, tačiau vis tiek norime prognozuoti rezultatą. Polinominė regresija gali padėti mums atlikti prognozes sudėtingesniems netiesiniams ryšiams.\n",
"\n",
"Pavyzdžiui, paimkime ryšį tarp pakuotės ir kainos mūsų moliūgų duomenų rinkinyje. Nors kartais tarp kintamųjų yra tiesinis ryšys kuo didesnis moliūgas pagal tūrį, tuo didesnė kaina kartais šių ryšių negalima pavaizduoti kaip plokštumos ar tiesės.\n",
"\n",
"> ✅ Štai [keletas papildomų pavyzdžių](https://online.stat.psu.edu/stat501/lesson/9/9.8) duomenų, kuriems galima taikyti polinominę regresiją\n",
">\n",
"> Dar kartą pažvelkite į ryšį tarp veislės ir kainos ankstesniame grafike. Ar šis sklaidos grafikas atrodo taip, kad jį būtinai reikėtų analizuoti tiesine linija? Galbūt ne. Tokiu atveju galite išbandyti polinominę regresiją.\n",
">\n",
"> ✅ Polinomai yra matematinės išraiškos, kurios gali susidėti iš vieno ar daugiau kintamųjų ir koeficientų\n",
"\n",
"#### Treniruokite polinominės regresijos modelį naudodami mokymo rinkinį\n",
"\n",
"Polinominė regresija sukuria *lenktą liniją*, kad geriau atitiktų netiesinius duomenis.\n",
"\n",
"Pažiūrėkime, ar polinominis modelis geriau atliks prognozes. Sekime panašią procedūrą, kaip darėme anksčiau:\n",
"\n",
"- Sukurkite receptą, kuris nurodo išankstinio apdorojimo veiksmus, kuriuos reikia atlikti su mūsų duomenimis, kad jie būtų paruošti modeliavimui, t. y.: kintamųjų kodavimas ir polinomų skaičiavimas laipsniu *n*\n",
"\n",
"- Sukurkite modelio specifikaciją\n",
"\n",
"- Sujunkite receptą ir modelio specifikaciją į darbo eigą\n",
"\n",
"- Sukurkite modelį, pritaikydami darbo eigą\n",
"\n",
"- Įvertinkite, kaip gerai modelis veikia su testiniais duomenimis\n",
"\n",
"Pradėkime!\n"
],
"metadata": {
"id": "VcEIpRV9wzYr"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Specify a recipe\r\n",
"poly_pumpkins_recipe <-\r\n",
" recipe(price ~ package, data = pumpkins_train) %>%\r\n",
" step_integer(all_predictors(), zero_based = TRUE) %>% \r\n",
" step_poly(all_predictors(), degree = 4)\r\n",
"\r\n",
"\r\n",
"# Create a model specification\r\n",
"poly_spec <- linear_reg() %>% \r\n",
" set_engine(\"lm\") %>% \r\n",
" set_mode(\"regression\")\r\n",
"\r\n",
"\r\n",
"# Bundle recipe and model spec into a workflow\r\n",
"poly_wf <- workflow() %>% \r\n",
" add_recipe(poly_pumpkins_recipe) %>% \r\n",
" add_model(poly_spec)\r\n",
"\r\n",
"\r\n",
"# Create a model\r\n",
"poly_wf_fit <- poly_wf %>% \r\n",
" fit(data = pumpkins_train)\r\n",
"\r\n",
"\r\n",
"# Print learned model coefficients\r\n",
"poly_wf_fit\r\n",
"\r\n",
" "
],
"outputs": [],
"metadata": {
"id": "63n_YyRXw3CC"
}
},
{
"cell_type": "markdown",
"source": [
"#### Įvertinkite modelio našumą\n",
"\n",
"👏👏Jūs sukūrėte polinominį modelį, dabar atlikime prognozes su testavimo rinkiniu!\n"
],
"metadata": {
"id": "-LHZtztSxDP0"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Make price predictions on test data\r\n",
"poly_results <- poly_wf_fit %>% predict(new_data = pumpkins_test) %>% \r\n",
" bind_cols(pumpkins_test %>% select(c(package, price))) %>% \r\n",
" relocate(.pred, .after = last_col())\r\n",
"\r\n",
"\r\n",
"# Print the results\r\n",
"poly_results %>% \r\n",
" slice_head(n = 10)"
],
"outputs": [],
"metadata": {
"id": "YUFpQ_dKxJGx"
}
},
{
"cell_type": "markdown",
"source": [
"Woo-hoo, įvertinkime, kaip modelis pasirodė test_set rinkinyje, naudodami `yardstick::metrics()`.\n"
],
"metadata": {
"id": "qxdyj86bxNGZ"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"metrics(data = poly_results, truth = price, estimate = .pred)"
],
"outputs": [],
"metadata": {
"id": "8AW5ltkBxXDm"
}
},
{
"cell_type": "markdown",
"source": [
"🤩🤩 Daug geresnis našumas.\n",
"\n",
"`rmse` sumažėjo nuo maždaug 7 iki maždaug 3, tai rodo mažesnę klaidą tarp tikrosios kainos ir prognozuotos kainos. Tai galima *apytiksliai* interpretuoti kaip vidutiniškai neteisingos prognozės klaidą, kuri yra apie 3 USD. `rsq` padidėjo nuo maždaug 0.4 iki 0.8.\n",
"\n",
"Visi šie rodikliai rodo, kad polinominis modelis veikia daug geriau nei linijinis modelis. Puikus darbas!\n",
"\n",
"Pažiūrėkime, ar galime tai vizualizuoti!\n"
],
"metadata": {
"id": "6gLHNZDwxYaS"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Bind encoded package column to the results\r\n",
"poly_results <- poly_results %>% \r\n",
" bind_cols(package_encode %>% \r\n",
" rename(package_integer = package)) %>% \r\n",
" relocate(package_integer, .after = package)\r\n",
"\r\n",
"\r\n",
"# Print new results data frame\r\n",
"poly_results %>% \r\n",
" slice_head(n = 5)\r\n",
"\r\n",
"\r\n",
"# Make a scatter plot\r\n",
"poly_results %>% \r\n",
" ggplot(mapping = aes(x = package_integer, y = price)) +\r\n",
" geom_point(size = 1.6) +\r\n",
" # Overlay a line of best fit\r\n",
" geom_line(aes(y = .pred), color = \"midnightblue\", size = 1.2) +\r\n",
" xlab(\"package\")\r\n"
],
"outputs": [],
"metadata": {
"id": "A83U16frxdF1"
}
},
{
"cell_type": "markdown",
"source": [
"Galite matyti kreivę, kuri geriau atitinka jūsų duomenis! 🤩\n",
"\n",
"Galite padaryti ją dar lygesnę, perduodami polinominę formulę į `geom_smooth`, kaip čia:\n"
],
"metadata": {
"id": "4U-7aHOVxlGU"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Make a scatter plot\r\n",
"poly_results %>% \r\n",
" ggplot(mapping = aes(x = package_integer, y = price)) +\r\n",
" geom_point(size = 1.6) +\r\n",
" # Overlay a line of best fit\r\n",
" geom_smooth(method = lm, formula = y ~ poly(x, degree = 4), color = \"midnightblue\", size = 1.2, se = FALSE) +\r\n",
" xlab(\"package\")"
],
"outputs": [],
"metadata": {
"id": "5vzNT0Uexm-w"
}
},
{
"cell_type": "markdown",
"source": [
"Kaip sklandi kreivė!🤩\n",
"\n",
"Štai kaip galite atlikti naują prognozę:\n"
],
"metadata": {
"id": "v9u-wwyLxq4G"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Make a hypothetical data frame\r\n",
"hypo_tibble <- tibble(package = \"bushel baskets\")\r\n",
"\r\n",
"# Make predictions using linear model\r\n",
"lm_pred <- lm_wf_fit %>% predict(new_data = hypo_tibble)\r\n",
"\r\n",
"# Make predictions using polynomial model\r\n",
"poly_pred <- poly_wf_fit %>% predict(new_data = hypo_tibble)\r\n",
"\r\n",
"# Return predictions in a list\r\n",
"list(\"linear model prediction\" = lm_pred, \r\n",
" \"polynomial model prediction\" = poly_pred)\r\n"
],
"outputs": [],
"metadata": {
"id": "jRPSyfQGxuQv"
}
},
{
"cell_type": "markdown",
"source": [
"`Polinominio modelio` prognozė atrodo logiška, atsižvelgiant į `price` ir `package` sklaidos diagramas! Ir, jei tai yra geresnis modelis nei ankstesnis, žiūrint į tuos pačius duomenis, turite suplanuoti biudžetą brangesniems moliūgams!\n",
"\n",
"🏆 Puikiai padirbėta! Vienoje pamokoje sukūrėte du regresijos modelius. Paskutinėje regresijos dalyje išmoksite apie logistinės regresijos metodą, skirtą kategorijoms nustatyti.\n",
"\n",
"## **🚀Iššūkis**\n",
"\n",
"Išbandykite kelis skirtingus kintamuosius šiame užrašų knygelėje ir pažiūrėkite, kaip koreliacija atitinka modelio tikslumą.\n",
"\n",
"## [**Po paskaitos testas**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/14/)\n",
"\n",
"## **Apžvalga ir savarankiškas mokymasis**\n",
"\n",
"Šioje pamokoje išmokome apie linijinę regresiją. Yra ir kitų svarbių regresijos tipų. Perskaitykite apie Stepwise, Ridge, Lasso ir Elasticnet metodus. Geras kursas, norint sužinoti daugiau, yra [Stanfordo statistinio mokymosi kursas](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning).\n",
"\n",
"Jei norite sužinoti daugiau apie nuostabią Tidymodels sistemą, peržiūrėkite šiuos išteklius:\n",
"\n",
"- Tidymodels svetainė: [Pradėkite naudotis Tidymodels](https://www.tidymodels.org/start/)\n",
"\n",
"- Max Kuhn ir Julia Silge, [*Tidy Modeling with R*](https://www.tmwr.org/)*.*\n",
"\n",
"###### **AČIŪ:**\n",
"\n",
"[Allison Horst](https://twitter.com/allison_horst?lang=en) už nuostabius iliustracijas, kurios padaro R labiau prieinamą ir įdomų. Daugiau iliustracijų rasite jos [galerijoje](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM).\n"
],
"metadata": {
"id": "8zOLOWqMxzk5"
}
},
{
"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 stengiamės užtikrinti tikslumą, 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. Kritinei informacijai rekomenduojama naudoti profesionalų žmogaus vertimą. Mes neprisiimame atsakomybės už nesusipratimus ar klaidingus interpretavimus, atsiradusius dėl šio vertimo naudojimo.\n"
]
}
]
}