{ "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-08-29T14:48:26+00:00", "source_file": "2-Regression/3-Linear/solution/R/lesson_3-R.ipynb", "language_code": "tl" } }, "cells": [ { "cell_type": "markdown", "source": [], "metadata": { "id": "EgQw8osnsUV-" } }, { "cell_type": "markdown", "source": [ "## Linear at Polynomial Regression para sa Pagpepresyo ng Kalabasa - Aralin 3\n", "

\n", " \n", "

Infographic ni Dasani Madipalli
\n", "\n", "\n", "\n", "\n", "#### Panimula\n", "\n", "Sa ngayon, napag-aralan mo na kung ano ang regression gamit ang sample data mula sa dataset ng pagpepresyo ng kalabasa na gagamitin natin sa buong araling ito. Na-visualize mo rin ito gamit ang `ggplot2`.๐Ÿ’ช\n", "\n", "Ngayon, handa ka nang mas lumalim sa regression para sa ML. Sa araling ito, matutunan mo ang tungkol sa dalawang uri ng regression: *basic linear regression* at *polynomial regression*, kasama ang ilang matematika na nasa likod ng mga teknik na ito.\n", "\n", "> Sa buong kurikulum na ito, inaasahan namin ang minimal na kaalaman sa matematika, at layunin naming gawing mas accessible ito para sa mga estudyanteng galing sa ibang larangan, kaya't magbantay para sa mga tala, ๐Ÿงฎ callouts, diagram, at iba pang mga kasangkapan sa pag-aaral upang makatulong sa pag-unawa.\n", "\n", "#### Paghahanda\n", "\n", "Bilang paalala, niloload mo ang data na ito upang makapagtanong tungkol dito.\n", "\n", "- Kailan ang pinakamagandang oras para bumili ng kalabasa?\n", "\n", "- Anong presyo ang maaasahan ko para sa isang case ng miniature na kalabasa?\n", "\n", "- Dapat ko bang bilhin ang mga ito sa half-bushel baskets o sa 1 1/9 bushel box? Patuloy tayong maghukay sa data na ito.\n", "\n", "Sa nakaraang aralin, gumawa ka ng `tibble` (isang modernong muling pag-iisip ng data frame) at pinunan ito ng bahagi ng orihinal na dataset, na-standardize ang pagpepresyo batay sa bushel. Sa paggawa nito, gayunpaman, nakakuha ka lamang ng humigit-kumulang 400 data points at para lamang sa mga buwan ng taglagas. Marahil makakakuha tayo ng mas detalyado tungkol sa kalikasan ng data sa pamamagitan ng mas malinis na pagproseso nito? Tingnan natin... ๐Ÿ•ต๏ธโ€โ™€๏ธ\n", "\n", "Para sa gawaing ito, kakailanganin natin ang mga sumusunod na packages:\n", "\n", "- `tidyverse`: Ang [tidyverse](https://www.tidyverse.org/) ay isang [koleksyon ng mga R packages](https://www.tidyverse.org/packages) na idinisenyo upang gawing mas mabilis, mas madali, at mas masaya ang data science!\n", "\n", "- `tidymodels`: Ang [tidymodels](https://www.tidymodels.org/) framework ay isang [koleksyon ng mga packages](https://www.tidymodels.org/packages/) para sa modeling at machine learning.\n", "\n", "- `janitor`: Ang [janitor package](https://github.com/sfirke/janitor) ay nagbibigay ng simpleng mga tool para sa pagsusuri at paglilinis ng maruming data.\n", "\n", "- `corrplot`: Ang [corrplot package](https://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html) ay nagbibigay ng visual exploratory tool sa correlation matrix na sumusuporta sa awtomatikong pag-aayos ng mga variable upang makatulong sa pagtuklas ng mga nakatagong pattern sa pagitan ng mga variable.\n", "\n", "Maaaring i-install ang mga ito gamit ang:\n", "\n", "`install.packages(c(\"tidyverse\", \"tidymodels\", \"janitor\", \"corrplot\"))`\n", "\n", "Ang script sa ibaba ay nagche-check kung mayroon ka ng mga packages na kinakailangan upang makumpleto ang module na ito at ini-install ang mga ito para sa iyo kung sakaling kulang.\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": [ "Ilalagay natin ang mga kahanga-hangang package na ito at gagawin silang magagamit sa kasalukuyang R session. (Ito ay para sa simpleng ilustrasyon, `pacman::p_load()` ay ginawa na ito para sa iyo)\n", "\n", "## 1. Isang linya ng linear regression\n", "\n", "Tulad ng natutunan mo sa Lesson 1, ang layunin ng isang linear regression exercise ay makapag-plot ng *linya* *ng* *pinakamagandang tugma* upang:\n", "\n", "- **Ipakita ang relasyon ng mga variable**. Ipakita ang ugnayan sa pagitan ng mga variable.\n", "\n", "- **Gumawa ng mga prediksyon**. Gumawa ng tumpak na prediksyon kung saan mahuhulog ang isang bagong data point kaugnay ng linya.\n", "\n", "Upang iguhit ang ganitong uri ng linya, gumagamit tayo ng isang estadistikal na teknik na tinatawag na **Least-Squares Regression**. Ang terminong `least-squares` ay nangangahulugan na ang lahat ng data points na nakapaligid sa regression line ay pinapangkat at pagkatapos ay ina-add. Sa ideal na sitwasyon, ang huling kabuuan ay dapat na kasing liit hangga't maaari, dahil gusto natin ng mababang bilang ng mga error, o `least-squares`. Kaya, ang linya ng pinakamagandang tugma ay ang linya na nagbibigay sa atin ng pinakamababang halaga para sa kabuuan ng mga squared errors - kaya tinawag itong *least squares regression*.\n", "\n", "Ginagawa natin ito dahil gusto nating magmodelo ng linya na may pinakamaliit na kabuuang distansya mula sa lahat ng ating data points. Pinapangkat din natin ang mga termino bago i-add dahil mas mahalaga sa atin ang magnitude kaysa sa direksyon nito.\n", "\n", "> **๐Ÿงฎ Ipakita ang matematika**\n", ">\n", "> Ang linyang ito, na tinatawag na *linya ng pinakamagandang tugma* ay maaaring ipahayag sa pamamagitan ng [isang equation](https://en.wikipedia.org/wiki/Simple_linear_regression):\n", ">\n", "> Y = a + bX\n", ">\n", "> Ang `X` ay ang '`explanatory variable` o `predictor`'. Ang `Y` ay ang '`dependent variable` o `outcome`'. Ang slope ng linya ay `b` at ang `a` ay ang y-intercept, na tumutukoy sa halaga ng `Y` kapag `X = 0`.\n", ">\n", "\n", "> ![](../../../../../../2-Regression/3-Linear/solution/images/slope.png \"slope = $y/x$\")\n", " Infographic ni Jen Looper\n", ">\n", "> Una, kalkulahin ang slope `b`.\n", ">\n", "> Sa madaling salita, at tumutukoy sa orihinal na tanong ng data ng kalabasa: \"hulaan ang presyo ng kalabasa kada bushel ayon sa buwan\", ang `X` ay tumutukoy sa presyo at ang `Y` ay tumutukoy sa buwan ng pagbebenta.\n", ">\n", "> ![](../../../../../../translated_images/calculation.989aa7822020d9d0ba9fc781f1ab5192f3421be86ebb88026528aef33c37b0d8.tl.png)\n", " Infographic ni Jen Looper\n", "> \n", "> Kalkulahin ang halaga ng Y. Kung nagbabayad ka ng humigit-kumulang \\$4, malamang Abril na!\n", ">\n", "> Ang matematika na nagkakalkula ng linya ay dapat ipakita ang slope ng linya, na nakadepende rin sa intercept, o kung saan nakalagay ang `Y` kapag `X = 0`.\n", ">\n", "> Maaari mong obserbahan ang paraan ng pagkalkula para sa mga halagang ito sa [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html) na website. Bisitahin din ang [Least-squares calculator](https://www.mathsisfun.com/data/least-squares-calculator.html) upang makita kung paano naaapektuhan ng mga halaga ng numero ang linya.\n", "\n", "Hindi naman nakakatakot, di ba? ๐Ÿค“\n", "\n", "#### Korrelasyon\n", "\n", "Isa pang terminong dapat maunawaan ay ang **Correlation Coefficient** sa pagitan ng mga X at Y na variable. Gamit ang scatterplot, mabilis mong makikita ang coefficient na ito. Ang plot na may mga datapoints na maayos na nakahanay ay may mataas na korrelasyon, ngunit ang plot na may datapoints na kalat-kalat sa pagitan ng X at Y ay may mababang korrelasyon.\n", "\n", "Ang isang mahusay na linear regression model ay ang isa na may mataas (mas malapit sa 1 kaysa 0) na Correlation Coefficient gamit ang Least-Squares Regression method na may linya ng regression.\n" ], "metadata": { "id": "cdX5FRpvsoP5" } }, { "cell_type": "markdown", "source": [ "## **2. Isang sayaw kasama ang datos: paggawa ng data frame na gagamitin para sa pagmomodelo**\n", "\n", "

\n", " \n", "

Sining ni @allison_horst
\n", "\n", "\n", "\n" ], "metadata": { "id": "WdUKXk7Bs8-V" } }, { "cell_type": "markdown", "source": [ "Mag-load ng mga kinakailangang library at dataset. I-convert ang data sa isang data frame na naglalaman ng subset ng data:\n", "\n", "- Kunin lamang ang mga kalabasa na may presyo batay sa bushel\n", "\n", "- I-convert ang petsa sa buwan\n", "\n", "- Kalkulahin ang presyo bilang average ng mataas at mababang presyo\n", "\n", "- I-convert ang presyo upang ipakita ang pagpepresyo batay sa dami ng bushel\n", "\n", "> Tinalakay natin ang mga hakbang na ito sa [nakaraang aralin](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": [ "Sa diwa ng purong pakikipagsapalaran, tuklasin natin ang [`janitor package`](../../../../../../2-Regression/3-Linear/solution/R/github.com/sfirke/janitor) na nagbibigay ng mga simpleng function para sa pagsusuri at paglilinis ng maruming datos. Halimbawa, tingnan natin ang mga pangalan ng column para sa ating datos:\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": [ "๐Ÿค” Kaya pa nating pagbutihin. Gawin nating `friendR` ang mga pangalan ng column sa pamamagitan ng pag-convert ng mga ito sa [snake_case](https://en.wikipedia.org/wiki/Snake_case) na convention gamit ang `janitor::clean_names`. Para malaman ang higit pa tungkol sa function na ito: `?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": [ "Maraming salamat, tidyR ๐Ÿงน! Ngayon, sumayaw tayo kasama ang data gamit ang `dplyr` tulad ng sa nakaraang aralin! ๐Ÿ’ƒ\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": [ "Magaling!๐Ÿ‘Œ Ngayon ay mayroon ka nang malinis at maayos na data set na maaari mong gamitin para bumuo ng bago mong regression model!\n", "\n", "Gusto mo bang gumawa ng scatter plot?\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": [ "Ang scatter plot ay nagpapaalala sa atin na mayroon lamang tayong datos ng buwan mula Agosto hanggang Disyembre. Malamang kailangan natin ng mas maraming datos upang makagawa ng mga konklusyon sa isang linear na paraan.\n", "\n", "Balikan natin ang ating modelling data:\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": [ "Paano kung gusto nating hulaan ang `price` ng isang kalabasa batay sa mga column na `city` o `package` na may uri na character? O mas simple pa, paano kaya natin mahahanap ang correlation (na nangangailangan ng parehong input na numeric) sa pagitan ng, halimbawa, `package` at `price`? ๐Ÿคท๐Ÿคท\n", "\n", "Mas mahusay gumana ang mga machine learning model kapag ang mga feature ay nasa numeric na anyo kaysa sa text values, kaya karaniwan mong kailangang i-convert ang mga categorical feature sa numeric na representasyon.\n", "\n", "Ibig sabihin nito, kailangan nating maghanap ng paraan upang i-reformat ang ating mga predictor upang mas madali itong magamit ng isang modelo nang epektibo, isang proseso na tinatawag na `feature engineering`.\n" ], "metadata": { "id": "7hsHoxsStyjJ" } }, { "cell_type": "markdown", "source": [ "## 3. Pagpoproseso ng datos para sa pagmomodelo gamit ang recipes ๐Ÿ‘ฉโ€๐Ÿณ๐Ÿ‘จโ€๐Ÿณ\n", "\n", "Ang mga aktibidad na nagre-reformat ng mga halaga ng predictor upang mas maging madali itong magamit ng isang modelo ay tinatawag na `feature engineering`.\n", "\n", "Iba't ibang modelo ang may iba't ibang pangangailangan sa preprocessing. Halimbawa, ang least squares ay nangangailangan ng `encoding categorical variables` tulad ng buwan, variety, at city_name. Ito ay simpleng proseso ng `pagsasalin` ng isang column na may `categorical values` sa isa o higit pang `numeric columns` na pumapalit sa orihinal.\n", "\n", "Halimbawa, isipin na ang iyong datos ay may sumusunod na categorical feature:\n", "\n", "| lungsod |\n", "|:----------:|\n", "| Denver |\n", "| Nairobi |\n", "| Tokyo |\n", "\n", "Maaari mong gamitin ang *ordinal encoding* upang palitan ang bawat kategorya ng natatanging integer value, tulad nito:\n", "\n", "| lungsod |\n", "|:-------:|\n", "| 0 |\n", "| 1 |\n", "| 2 |\n", "\n", "At iyan ang gagawin natin sa ating datos!\n", "\n", "Sa seksyong ito, susuriin natin ang isa pang kamangha-manghang package mula sa Tidymodels: [recipes](https://tidymodels.github.io/recipes/) - na idinisenyo upang tulungan kang i-preprocess ang iyong datos **bago** i-train ang iyong modelo. Sa pinakapundasyon nito, ang recipe ay isang object na nagtatakda kung anong mga hakbang ang dapat gawin sa isang data set upang maihanda ito para sa pagmomodelo.\n", "\n", "Ngayon, gumawa tayo ng recipe na naghahanda sa ating datos para sa pagmomodelo sa pamamagitan ng pagpapalit ng natatanging integer para sa lahat ng obserbasyon sa mga predictor columns:\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": [ "Ang galing! ๐Ÿ‘ Kakagawa lang natin ng ating unang recipe na tumutukoy sa isang resulta (price) at ang mga kaukulang predictors nito, at lahat ng predictor columns ay dapat i-encode bilang isang set ng mga integer ๐Ÿ™Œ! Tara't himayin natin ito nang mabilis:\n", "\n", "- Ang tawag sa `recipe()` gamit ang isang formula ay nagsasabi sa recipe ng *mga papel* ng mga variable gamit ang `new_pumpkins` na data bilang reference. Halimbawa, ang column na `price` ay naitalaga bilang isang `outcome` habang ang iba pang mga column ay naitalaga bilang mga `predictor`.\n", "\n", "- Ang `step_integer(all_predictors(), zero_based = TRUE)` ay tumutukoy na lahat ng predictors ay dapat ma-convert sa isang set ng mga integer na ang pagbilang ay magsisimula sa 0.\n", "\n", "Sigurado kaming iniisip mo na: \"Ang astig nito!! Pero paano kung kailangan kong tiyakin na ang mga recipe ay gumagana nang eksakto ayon sa inaasahan ko? ๐Ÿค”\"\n", "\n", "Napakagandang tanong niyan! Ganito kasi, kapag na-define mo na ang iyong recipe, maaari mong tantyahin ang mga parameter na kinakailangan upang ma-preprocess ang data, at pagkatapos ay kunin ang na-proseso nang data. Karaniwan, hindi mo kailangang gawin ito kapag gumagamit ka ng Tidymodels (makikita natin ang normal na paraan sa ilang sandali-\\> `workflows`), pero maaaring maging kapaki-pakinabang ito kung gusto mong magsagawa ng sanity check para tiyakin na ang mga recipe ay gumagana ayon sa iyong inaasahan.\n", "\n", "Para diyan, kakailanganin mo ng dalawa pang pandiwa: `prep()` at `bake()` at gaya ng dati, ang ating mga kaibigang R mula kay [`Allison Horst`](https://github.com/allisonhorst/stats-illustrations) ay tutulong sa iyo upang mas maunawaan ito!\n", "\n", "

\n", " \n", "

Artwork ni @allison_horst
\n", "\n", "\n", "\n" ], "metadata": { "id": "KEiO0v7kuC9O" } }, { "cell_type": "markdown", "source": [ "[`prep()`](https://recipes.tidymodels.org/reference/prep.html): tinatantiya ang mga kinakailangang parameter mula sa isang training set na maaaring gamitin sa ibang mga data set. Halimbawa, para sa isang partikular na predictor column, aling obserbasyon ang itatalaga bilang integer 0 o 1 o 2 at iba pa.\n", "\n", "[`bake()`](https://recipes.tidymodels.org/reference/bake.html): ginagamit ang isang prepped recipe at ina-apply ang mga operasyon sa anumang data set.\n", "\n", "Sa madaling salita, mag-prep at bake tayo ng ating mga recipe upang masigurado na sa likod ng proseso, ang mga predictor column ay unang ie-encode bago mag-fit ng isang modelo.\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": [ "Woo-hoo!๐Ÿฅณ Ang na-proseso na datos na `baked_pumpkins` ay may lahat ng mga predictor nito na naka-encode, na nagpapatunay na ang mga hakbang sa preprocessing na itinakda bilang ating recipe ay gumagana nang maayos. Mas mahirap itong basahin para sa iyo, ngunit mas madaling maintindihan ng Tidymodels! Maglaan ng oras upang alamin kung aling obserbasyon ang na-map sa isang kaukulang integer.\n", "\n", "Mahalaga ring banggitin na ang `baked_pumpkins` ay isang data frame na maaari nating gamitin para sa mga kalkulasyon.\n", "\n", "Halimbawa, subukan nating hanapin ang magandang ugnayan sa pagitan ng dalawang punto ng iyong datos upang posibleng makabuo ng isang mahusay na predictive model. Gagamitin natin ang function na `cor()` para dito. I-type ang `?cor()` upang malaman ang higit pa tungkol sa function.\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": [ "Tulad ng inaasahan, mahina ang ugnayan sa pagitan ng Lungsod at Presyo. Gayunpaman, mas may kaunting mas magandang ugnayan sa pagitan ng Package at ng Presyo nito. May lohika ito, tama ba? Karaniwan, mas malaki ang kahon ng produkto, mas mataas ang presyo.\n", "\n", "Habang nandito na rin tayo, subukan din nating i-visualize ang isang correlation matrix ng lahat ng mga column gamit ang `corrplot` package.\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": [ "๐Ÿคฉ๐Ÿคฉ Mas maganda.\n", "\n", "Isang magandang tanong na maaaring itanong tungkol sa datos na ito ay: '`Anong presyo ang maaasahan ko para sa isang partikular na pumpkin package?`' Tara't simulan na natin!\n", "\n", "> Tandaan: Kapag **`bake()`** mo ang inihandang recipe na **`pumpkins_prep`** gamit ang **`new_data = NULL`**, makukuha mo ang naprosesong (i.e. encoded) training data. Kung mayroon kang ibang data set, halimbawa isang test set, at nais mong makita kung paano ito ipo-proseso ng recipe, kailangan mo lang i-bake ang **`pumpkins_prep`** gamit ang **`new_data = test_set`**\n", "\n", "## 4. Gumawa ng linear regression model\n", "\n", "

\n", " \n", "

Infographic ni Dasani Madipalli
\n", "\n", "\n", "\n" ], "metadata": { "id": "YqXjLuWavNxW" } }, { "cell_type": "markdown", "source": [ "Ngayon na nakagawa na tayo ng recipe at nakumpirma na ang data ay maayos na ma-preprocess, oras na para bumuo ng regression model upang sagutin ang tanong: `Ano ang inaasahang presyo ng isang partikular na pumpkin package?`\n", "\n", "#### Mag-train ng linear regression model gamit ang training set\n", "\n", "Tulad ng maaaring napansin mo, ang column na *price* ang `outcome` variable habang ang column na *package* ang `predictor` variable.\n", "\n", "Para magawa ito, hahatiin muna natin ang data kung saan 80% ay mapupunta sa training set at 20% sa test set. Pagkatapos, magde-define tayo ng recipe na mag-e-encode sa predictor column bilang isang set ng integers, at magtatayo ng model specification. Hindi natin i-prep at i-bake ang ating recipe dahil alam na natin na maayos nitong ma-preprocess ang data tulad ng inaasahan.\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": [ "Magaling! Ngayon na mayroon na tayong recipe at model specification, kailangan nating maghanap ng paraan para pagsamahin ang mga ito sa isang object na unang magpoproseso ng data (prep+bake sa likod ng eksena), i-fit ang model sa preprocessed na data, at magbigay-daan din para sa mga posibleng post-processing na aktibidad. Paano 'yan para sa kapayapaan ng isip mo!๐Ÿคฉ\n", "\n", "Sa Tidymodels, ang maginhawang object na ito ay tinatawag na [`workflow`](https://workflows.tidymodels.org/) at maginhawang naglalaman ng iyong mga modeling components! Ito ang tinatawag nating *pipelines* sa *Python*.\n", "\n", "Kaya't pagsamahin na natin ang lahat sa isang 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": [ "Kasama na rin, ang isang workflow ay maaaring iangkop o sanayin sa halos parehong paraan tulad ng isang modelo.\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": [ "Mula sa output ng modelo, makikita natin ang mga coefficients na natutunan sa panahon ng training. Kinakatawan ng mga ito ang coefficients ng linya ng pinakamahusay na akma na nagbibigay sa atin ng pinakamababang kabuuang error sa pagitan ng aktwal at hinulaang variable.\n", "\n", "#### Suriin ang performance ng modelo gamit ang test set\n", "\n", "Panahon na para makita kung paano nag-perform ang modelo ๐Ÿ“! Paano natin ito gagawin?\n", "\n", "Ngayon na na-train na natin ang modelo, magagamit natin ito upang gumawa ng mga prediksyon para sa `test_set` gamit ang `parsnip::predict()`. Pagkatapos, maikukumpara natin ang mga prediksyon na ito sa aktwal na mga halaga ng label upang masuri kung gaano kahusay (o hindi!) gumagana ang modelo.\n", "\n", "Magsimula tayo sa paggawa ng mga prediksyon para sa test set at pagkatapos ay i-bind ang mga column sa test set.\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": [ "Oo, nakapagsanay ka na ng isang modelo at nagamit ito para gumawa ng mga prediksyon! ๐Ÿ”ฎ Maganda ba ito? Suriin natin ang performance ng modelo!\n", "\n", "Sa Tidymodels, ginagawa natin ito gamit ang `yardstick::metrics()`! Para sa linear regression, mag-focus tayo sa mga sumusunod na metrics:\n", "\n", "- `Root Mean Square Error (RMSE)`: Ang square root ng [MSE](https://en.wikipedia.org/wiki/Mean_squared_error). Nagbibigay ito ng isang absolute na sukatan sa parehong unit ng label (sa kasong ito, ang presyo ng kalabasa). Mas maliit ang halaga, mas maganda ang modelo (sa simpleng paliwanag, ito ang average na halaga kung gaano kalayo ang mga prediksyon mula sa aktwal na presyo!).\n", "\n", "- `Coefficient of Determination (karaniwang kilala bilang R-squared o R2)`: Isang relative na sukatan kung saan mas mataas ang halaga, mas maganda ang pagkakaangkop ng modelo. Sa esensya, ipinapakita ng metric na ito kung gaano karaming bahagi ng variance sa pagitan ng mga prediksyon at aktwal na halaga ng label ang kayang ipaliwanag ng modelo.\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": [ "Narito ang performance ng modelo. Tingnan natin kung makakakuha tayo ng mas malinaw na indikasyon sa pamamagitan ng pag-visualize ng scatter plot ng package at presyo, pagkatapos ay gamitin ang mga prediksyon upang mag-overlay ng linya ng pinakamahusay na akma.\n", "\n", "Ibig sabihin nito, kailangan nating ihanda at i-proseso ang test set upang ma-encode ang package column, pagkatapos ay pagsamahin ito sa mga prediksyon na ginawa ng ating modelo.\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": [ "Mahusay! Tulad ng nakikita mo, ang linear regression model ay hindi masyadong mahusay sa pag-generalize ng relasyon sa pagitan ng isang pakete at ng kaukulang presyo nito.\n", "\n", "๐ŸŽƒ Binabati kita, nakagawa ka ng isang modelong makakatulong sa pag-predict ng presyo ng ilang uri ng kalabasa. Ang iyong pumpkin patch para sa holiday ay magiging maganda. Pero malamang na makakagawa ka pa ng mas mahusay na modelo!\n", "\n", "## 5. Gumawa ng polynomial regression model\n", "\n", "

\n", " \n", "

Infographic ni Dasani Madipalli
\n", "\n", "\n", "\n" ], "metadata": { "id": "HOCqJXLTwtWI" } }, { "cell_type": "markdown", "source": [ "Minsan, ang ating datos ay maaaring walang linear na relasyon, ngunit nais pa rin nating mag-predict ng resulta. Ang polynomial regression ay makakatulong sa atin na gumawa ng prediksyon para sa mas kumplikadong non-linear na relasyon.\n", "\n", "Halimbawa, tingnan ang relasyon sa pagitan ng package at presyo sa ating data set ng kalabasa. Bagamat minsan may linear na relasyon sa pagitan ng mga variable - mas malaki ang kalabasa sa volume, mas mataas ang presyo - minsan ang mga relasyong ito ay hindi maaaring i-plot bilang isang eroplano o tuwid na linya.\n", "\n", "> โœ… Narito ang [ilang karagdagang halimbawa](https://online.stat.psu.edu/stat501/lesson/9/9.8) ng datos na maaaring gumamit ng polynomial regression\n", ">\n", "> Tingnan muli ang relasyon sa pagitan ng Variety at Price sa nakaraang plot. Mukha bang ang scatterplot na ito ay dapat talagang suriin gamit ang tuwid na linya? Marahil hindi. Sa ganitong kaso, maaari mong subukan ang polynomial regression.\n", ">\n", "> โœ… Ang mga polynomial ay mga matematikal na ekspresyon na maaaring binubuo ng isa o higit pang mga variable at coefficients\n", "\n", "#### Mag-train ng polynomial regression model gamit ang training set\n", "\n", "Ang polynomial regression ay lumilikha ng *kurbadong linya* upang mas maayos na mag-fit sa nonlinear na datos.\n", "\n", "Tingnan natin kung ang isang polynomial model ay mas mahusay sa paggawa ng prediksyon. Susundin natin ang halos parehong proseso tulad ng ginawa natin dati:\n", "\n", "- Gumawa ng recipe na nagtatakda ng mga hakbang sa preprocessing na dapat isagawa sa ating datos upang maihanda ito para sa pagmo-modelo, halimbawa: pag-encode ng mga predictors at pagkalkula ng mga polynomial ng degree *n*\n", "\n", "- Bumuo ng model specification\n", "\n", "- I-bundle ang recipe at model specification sa isang workflow\n", "\n", "- Gumawa ng model sa pamamagitan ng pag-fit sa workflow\n", "\n", "- Suriin kung gaano kahusay ang performance ng model sa test data\n", "\n", "Simulan na natin!\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": [ "#### Suriin ang pagganap ng modelo\n", "\n", "๐Ÿ‘๐Ÿ‘ Nakagawa ka ng isang polynomial na modelo, ngayon gumawa tayo ng mga prediksyon sa test set!\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, suriin natin kung paano nag-perform ang modelo sa test_set gamit ang `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": [ "๐Ÿคฉ๐Ÿคฉ Mas mahusay na pagganap.\n", "\n", "Ang `rmse` ay bumaba mula sa humigit-kumulang 7 patungo sa humigit-kumulang 3, na nagpapahiwatig ng mas mababang error sa pagitan ng aktwal na presyo at ng tinatayang presyo. Maaari mo itong *maluwag* na ipakahulugan na sa karaniwan, ang maling mga prediksyon ay nagkakamali ng humigit-kumulang \\$3. Ang `rsq` ay tumaas mula sa humigit-kumulang 0.4 patungo sa 0.8.\n", "\n", "Lahat ng mga sukatan na ito ay nagpapakita na ang polynomial model ay mas mahusay ang pagganap kumpara sa linear model. Magaling!\n", "\n", "Tingnan natin kung maaari natin itong maipakita sa biswal!\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": [ "Makikita mo ang isang kurbang linya na mas akma sa iyong datos! ๐Ÿคฉ\n", "\n", "Mas mapapakinis mo pa ito sa pamamagitan ng pagpapasa ng isang polynomial na formula sa `geom_smooth` tulad nito:\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": [ "Parang isang makinis na kurba!๐Ÿคฉ\n", "\n", "Narito kung paano ka gagawa ng bagong prediksyon:\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": [ "Ang `polynomial model` na prediksyon ay may katuturan, base sa scatter plots ng `price` at `package`! At, kung mas maganda ang modelong ito kaysa sa nauna, base sa parehong datos, kailangan mong maglaan ng budget para sa mas mahal na mga kalabasa!\n", "\n", "๐Ÿ† Magaling! Nakagawa ka ng dalawang regression models sa isang aralin. Sa huling bahagi ng regression, matututo ka tungkol sa logistic regression para matukoy ang mga kategorya.\n", "\n", "## **๐Ÿš€Hamunin**\n", "\n", "Subukan ang iba't ibang variables sa notebook na ito upang makita kung paano nauugnay ang correlation sa accuracy ng modelo.\n", "\n", "## [**Post-lecture quiz**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/14/)\n", "\n", "## **Review at Pag-aaral ng Sarili**\n", "\n", "Sa araling ito, natutunan natin ang tungkol sa Linear Regression. Mayroon pang ibang mahahalagang uri ng Regression. Basahin ang tungkol sa Stepwise, Ridge, Lasso, at Elasticnet techniques. Isang magandang kurso na maaaring pag-aralan upang matuto pa ay ang [Stanford Statistical Learning course](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning).\n", "\n", "Kung nais mong matuto pa kung paano gamitin ang kamangha-manghang Tidymodels framework, pakitingnan ang mga sumusunod na resources:\n", "\n", "- Website ng Tidymodels: [Simulan ang paggamit ng Tidymodels](https://www.tidymodels.org/start/)\n", "\n", "- Max Kuhn at Julia Silge, [*Tidy Modeling with R*](https://www.tmwr.org/)*.*\n", "\n", "###### **SALAMAT SA:**\n", "\n", "[Allison Horst](https://twitter.com/allison_horst?lang=en) para sa paglikha ng mga kamangha-manghang ilustrasyon na ginagawang mas welcoming at engaging ang R. Makikita ang higit pang mga ilustrasyon sa kanyang [gallery](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**Paunawa**: \nAng dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, pakitandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na dulot ng paggamit ng pagsasaling ito.\n" ] } ] }