{ "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-08-29T15:02:45+00:00", "source_file": "2-Regression/2-Data/solution/R/lesson_2-R.ipynb", "language_code": "tl" } }, "cells": [ { "cell_type": "markdown", "source": [ "# Bumuo ng isang regression model: ihanda at i-visualize ang data\n", "\n", "## **Linear Regression para sa mga Kalabasa - Aralin 2**\n", "#### Panimula\n", "\n", "Ngayon na mayroon ka nang mga kasangkapan na kailangan mo upang simulan ang pagbuo ng mga modelo ng machine learning gamit ang Tidymodels at Tidyverse, handa ka nang magsimulang magtanong tungkol sa iyong data. Habang nagtatrabaho ka sa data at nag-aaplay ng mga solusyon sa ML, napakahalaga na maunawaan kung paano magtanong ng tamang tanong upang ma-unlock nang maayos ang potensyal ng iyong dataset.\n", "\n", "Sa araling ito, matututuhan mo:\n", "\n", "- Paano ihanda ang iyong data para sa pagbuo ng modelo.\n", "\n", "- Paano gamitin ang `ggplot2` para sa pag-visualize ng data.\n", "\n", "Ang tanong na nais mong masagot ang magpapasiya kung anong uri ng mga algorithm ng ML ang iyong gagamitin. At ang kalidad ng sagot na makukuha mo ay lubos na nakadepende sa kalikasan ng iyong data.\n", "\n", "Tingnan natin ito sa pamamagitan ng isang praktikal na ehersisyo.\n", "\n", "
\n",
" \n",
"
\n",
"\n",
"> Paalala: Ang pipe operator (`%>%`) ay nagsasagawa ng mga operasyon sa lohikal na pagkakasunod-sunod sa pamamagitan ng pagpapasa ng isang object sa isang function o call expression. Maaari mong isipin ang pipe operator bilang nagsasabi ng \"at pagkatapos\" sa iyong code.\n"
],
"metadata": {
"id": "REWcIv9yX29v"
}
},
{
"cell_type": "markdown",
"source": [
"## 2. Suriin ang nawawalang datos\n",
"\n",
"Isa sa mga pinakakaraniwang isyu na kailangang harapin ng mga data scientist ay ang hindi kumpleto o nawawalang datos. Ang R ay kumakatawan sa nawawala, o hindi kilalang mga halaga, gamit ang espesyal na sentinel value: `NA` (Not Available).\n",
"\n",
"Paano natin malalaman kung ang data frame ay may nawawalang mga halaga?\n",
"
\n",
"- Isang direktang paraan ay ang paggamit ng base R function na `anyNA` na nagbabalik ng mga logical na bagay na `TRUE` o `FALSE`.\n"
],
"metadata": {
"id": "Zxfb3AM5YbUe"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"pumpkins %>% \n",
" anyNA()"
],
"outputs": [],
"metadata": {
"id": "G--DQutAYltj"
}
},
{
"cell_type": "markdown",
"source": [
"Mukhang may kulang na datos! Magandang simula ito.\n",
"\n",
"- Isa pang paraan ay ang paggamit ng function na `is.na()` na nagpapakita kung aling mga elemento sa bawat column ang nawawala gamit ang lohikal na `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": [
"Okay, natapos na ang trabaho pero sa ganitong kalaking data frame, magiging hindi epektibo at halos imposibleng suriin ang lahat ng mga row at column nang paisa-isaπ΄.\n",
"\n",
"- Isang mas madaling paraan ay ang pag-compute ng kabuuan ng mga nawawalang halaga para sa bawat column:\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": [
"Mas mabuti! May kulang na datos, pero baka hindi ito mahalaga para sa kasalukuyang gawain. Tingnan natin kung ano ang maidudulot ng karagdagang pagsusuri.\n",
"\n",
"> Kasama ng mga kahanga-hangang set ng mga package at function, ang R ay may napakagandang dokumentasyon. Halimbawa, gamitin ang `help(colSums)` o `?colSums` para malaman ang higit pa tungkol sa function.\n"
],
"metadata": {
"id": "9gv-crB6ZD1Y"
}
},
{
"cell_type": "markdown",
"source": [
"## 3. Dplyr: Isang Gramatika ng Manipulasyon ng Datos\n",
"\n",
"
\n",
" \n",
"
\n"
],
"metadata": {
"id": "i5o33MQBZWWw"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::select()\n",
"\n",
"Ang `select()` ay isang function sa package na `dplyr` na tumutulong sa iyo na pumili ng mga column na itatago o aalisin.\n",
"\n",
"Upang gawing mas madali ang pagtrabaho sa iyong data frame, alisin ang ilang mga column nito gamit ang `select()`, at itago lamang ang mga column na kailangan mo.\n",
"\n",
"Halimbawa, sa ehersisyong ito, ang ating pagsusuri ay maglalaman ng mga column na `Package`, `Low Price`, `High Price` at `Date`. Piliin natin ang mga column na ito.\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",
"Ang `mutate()` ay isang function sa package na `dplyr` na tumutulong sa iyo na lumikha o magbago ng mga column, habang pinapanatili ang mga umiiral na column.\n",
"\n",
"Ang pangkalahatang istruktura ng `mutate` ay:\n",
"\n",
"`data %>% mutate(new_column_name = what_it_contains)`\n",
"\n",
"Subukan nating gamitin ang `mutate` gamit ang column na `Date` sa pamamagitan ng pagsasagawa ng mga sumusunod na operasyon:\n",
"\n",
"1. I-convert ang mga petsa (na kasalukuyang nasa uri na character) sa format ng buwan (ang mga ito ay US dates, kaya ang format ay `MM/DD/YYYY`).\n",
"\n",
"2. Kunin ang buwan mula sa mga petsa at ilagay ito sa isang bagong column.\n",
"\n",
"Sa R, ang package na [lubridate](https://lubridate.tidyverse.org/) ay nagpapadali sa pagproseso ng Date-time data. Kaya, gamitin natin ang `dplyr::mutate()`, `lubridate::mdy()`, `lubridate::month()` at tingnan kung paano makakamit ang mga nabanggit na layunin. Maaari nating tanggalin ang column na `Date` dahil hindi na natin ito kakailanganin sa mga susunod na operasyon.\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": [
"Woohoo! π€©\n",
"\n",
"Ngayon, gumawa tayo ng bagong column na `Price`, na kumakatawan sa karaniwang presyo ng kalabasa. Kunin natin ang average ng mga column na `Low Price` at `High Price` para punan ang bagong column na 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": [
"Yeees!πͺ\n",
"\n",
"\"Pero teka!\", sasabihin mo pagkatapos mong silipin ang buong data set gamit ang `View(pumpkins)`, \"May kakaiba dito!\"π€\n",
"\n",
"Kung titingnan mo ang `Package` na kolum, ang mga kalabasa ay ibinebenta sa iba't ibang mga sukat. Ang ilan ay ibinebenta sa sukat na `1 1/9 bushel`, ang ilan naman sa `1/2 bushel`, ang iba ay per kalabasa, per pound, at ang iba naman ay nasa malalaking kahon na may iba't ibang lapad.\n",
"\n",
"Suriin natin ito:\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": [
"Ang galing!π\n",
"\n",
"Mukhang mahirap talagang timbangin nang pare-pareho ang mga kalabasa, kaya't mag-filter tayo sa pamamagitan ng pagpili lamang ng mga kalabasa na may string *bushel* sa `Package` column at ilagay ito sa bagong data frame na `new_pumpkins`.\n"
],
"metadata": {
"id": "7sMjiVujaZxY"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::filter() at stringr::str_detect()\n",
"\n",
"[`dplyr::filter()`](https://dplyr.tidyverse.org/reference/filter.html): gumagawa ng subset ng data na naglalaman lamang ng **mga row** na tumutugon sa iyong mga kondisyon, sa kasong ito, mga kalabasa na may string na *bushel* sa `Package` column.\n",
"\n",
"[stringr::str_detect()](https://stringr.tidyverse.org/reference/str_detect.html): tumutukoy kung mayroong o wala ang isang pattern sa isang string.\n",
"\n",
"Ang [`stringr`](https://github.com/tidyverse/stringr) package ay nagbibigay ng simpleng mga function para sa karaniwang mga operasyon sa string.\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": [
"Makikita mo na napaliit na natin sa humigit-kumulang 415 na mga hilera ng datos na naglalaman ng mga kalabasa kada bushel.π€©\n"
],
"metadata": {
"id": "VrDwF031avlR"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::case_when()\n",
"\n",
"**Pero teka! May isa pang bagay na kailangang gawin**\n",
"\n",
"Napansin mo ba na ang dami ng bushel ay nag-iiba sa bawat row? Kailangan mong gawing normal ang pagpepresyo upang maipakita ang presyo kada bushel, hindi kada 1 1/9 o 1/2 bushel. Panahon na para mag-compute upang ma-standardize ito.\n",
"\n",
"Gagamitin natin ang function [`case_when()`](https://dplyr.tidyverse.org/reference/case_when.html) upang *i-mutate* ang column na Price batay sa ilang kondisyon. Ang `case_when` ay nagbibigay-daan sa iyo na mag-vectorize ng maraming `if_else()` na pahayag.\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": [
"Ngayon, maaari nating suriin ang presyo bawat yunit batay sa kanilang sukat sa bushel. Ang lahat ng pag-aaral na ito tungkol sa bushel ng kalabasa, gayunpaman, ay nagpapakita kung gaano kahalaga ang `maunawaan ang kalikasan ng iyong datos`!\n",
"\n",
"> β
Ayon sa [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308), ang timbang ng isang bushel ay nakadepende sa uri ng produkto, dahil ito ay isang sukat ng dami. \"Ang isang bushel ng kamatis, halimbawa, ay dapat tumimbang ng 56 pounds... Ang mga dahon at gulay ay kumukuha ng mas maraming espasyo ngunit mas magaan, kaya ang isang bushel ng spinach ay 20 pounds lamang.\" Medyo komplikado ito! Huwag na nating alalahanin ang paggawa ng conversion mula bushel patungong pounds, at sa halip ay magpresyo batay sa bushel. Ang lahat ng pag-aaral na ito tungkol sa bushel ng kalabasa, gayunpaman, ay nagpapakita kung gaano kahalaga ang maunawaan ang kalikasan ng iyong datos!\n",
">\n",
"> β
Napansin mo ba na ang mga kalabasa na ibinebenta sa kalahating bushel ay napakamahal? Kaya mo bang alamin kung bakit? Pahiwatig: ang maliliit na kalabasa ay mas mahal kaysa sa malalaki, marahil dahil mas marami ang mga ito bawat bushel, dahil sa espasyong hindi nagagamit na kinukuha ng isang malaking guwang na pie pumpkin.\n"
],
"metadata": {
"id": "pS2GNPagbSdb"
}
},
{
"cell_type": "markdown",
"source": [
"Ngayon, sa huli, para sa kasiyahan ng pakikipagsapalaran πββοΈ, ilipat natin ang column na Buwan sa unang posisyon, ibig sabihin, `bago` ang column na `Package`.\n",
"\n",
"Ginagamit ang `dplyr::relocate()` upang baguhin ang posisyon ng mga column.\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": [
"Magaling!π Mayroon ka na ngayong malinis at maayos na dataset na maaari mong gamitin para bumuo ng bago mong regression model!\n"
],
"metadata": {
"id": "y8TJ0Za_bn5Y"
}
},
{
"cell_type": "markdown",
"source": [
"## 4. Pagpapakita ng Datos gamit ang ggplot2\n",
"\n",
"
\n",
" \n",
"
\n"
],
"metadata": {
"id": "Ml7SDCLQcPvE"
}
},
{
"cell_type": "markdown",
"source": [
"### **Paano natin ito magagamit nang maayos?**\n",
"\n",
"Para makapagpakita ng kapaki-pakinabang na datos sa mga chart, kadalasan kailangan mong i-grupo ang datos sa isang paraan. Halimbawa, sa ating sitwasyon, ang pagkuha ng average na presyo ng kalabasa bawat buwan ay magbibigay ng mas malinaw na pananaw sa mga nakatagong pattern sa ating datos. Ito ay nagdadala sa atin sa isa pang **dplyr** na pamamaraan:\n",
"\n",
"#### `dplyr::group_by() %>% summarize()`\n",
"\n",
"Ang pinagsama-samang datos sa R ay madaling makalkula gamit ang\n",
"\n",
"`dplyr::group_by() %>% summarize()`\n",
"\n",
"- Ang `dplyr::group_by()` ay binabago ang unit ng pagsusuri mula sa buong dataset patungo sa mga indibidwal na grupo tulad ng bawat buwan.\n",
"\n",
"- Ang `dplyr::summarize()` ay lumilikha ng bagong data frame na may isang column para sa bawat variable ng grupo at isang column para sa bawat istatistikang buod na iyong tinukoy.\n",
"\n",
"Halimbawa, maaari nating gamitin ang `dplyr::group_by() %>% summarize()` upang i-grupo ang mga kalabasa batay sa **Month** na column at pagkatapos ay hanapin ang **mean price** para sa bawat buwan.\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": [
"Maikli!β¨\n",
"\n",
"Ang mga kategoryang tampok tulad ng mga buwan ay mas mainam na ipakita gamit ang isang bar plot π. Ang mga layer na responsable para sa mga bar chart ay `geom_bar()` at `geom_col()`. Tingnan ang `?geom_bar` para malaman ang higit pa.\n",
"\n",
"Gumawa tayo ng isa!\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": [
"π€©π€©Mas kapaki-pakinabang ang visualisasyong ito ng datos! Mukhang ipinapakita nito na ang pinakamataas na presyo ng kalabasa ay nangyayari tuwing Setyembre at Oktubre. Tugma ba ito sa inaasahan mo? Bakit o bakit hindi?\n",
"\n",
"Binabati kita sa pagtatapos ng ikalawang aralin π! Inihanda mo ang iyong datos para sa paggawa ng modelo, pagkatapos ay natuklasan ang mas maraming kaalaman gamit ang mga visualisasyon!\n"
],
"metadata": {
"id": "zDm0VOzzcuzR"
}
},
{
"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 orihinal na 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 maaaring magmula sa paggamit ng pagsasaling ito.\n"
]
}
]
}