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/da/2-Regression/2-Data/solution/R/lesson_2-R.ipynb

674 lines
24 KiB

{
"nbformat": 4,
"nbformat_minor": 2,
"metadata": {
"colab": {
"name": "lesson_2-R.ipynb",
"provenance": [],
"collapsed_sections": [],
"toc_visible": true
},
"kernelspec": {
"name": "ir",
"display_name": "R"
},
"language_info": {
"name": "R"
},
"coopTranslator": {
"original_hash": "f3c335f9940cfd76528b3ef918b9b342",
"translation_date": "2025-09-04T07:15:50+00:00",
"source_file": "2-Regression/2-Data/solution/R/lesson_2-R.ipynb",
"language_code": "da"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"# Byg en regressionsmodel: forbered og visualiser data\n",
"\n",
"## **Lineær regression for græskar - Lektion 2**\n",
"#### Introduktion\n",
"\n",
"Nu hvor du har de nødvendige værktøjer til at begynde at bygge maskinlæringsmodeller med Tidymodels og Tidyverse, er du klar til at begynde at stille spørgsmål til dine data. Når du arbejder med data og anvender ML-løsninger, er det meget vigtigt at forstå, hvordan man stiller de rigtige spørgsmål for korrekt at udnytte potentialet i dit datasæt.\n",
"\n",
"I denne lektion vil du lære:\n",
"\n",
"- Hvordan du forbereder dine data til modelbygning.\n",
"\n",
"- Hvordan du bruger `ggplot2` til datavisualisering.\n",
"\n",
"Det spørgsmål, du ønsker besvaret, vil afgøre, hvilken type ML-algoritmer du skal anvende. Og kvaliteten af det svar, du får tilbage, vil i høj grad afhænge af karakteren af dine data.\n",
"\n",
"Lad os se dette ved at arbejde igennem en praktisk øvelse.\n",
"\n",
"\n",
"<p >\n",
" <img src=\"../../images/unruly_data.jpg\"\n",
" width=\"700\"/>\n",
" <figcaption>Kunstværk af @allison_horst</figcaption>\n",
"\n",
"\n",
"<!--![Kunstværk af \\@allison_horst](../../../../../../2-Regression/2-Data/images/unruly_data.jpg)<br>Kunstværk af \\@allison_horst-->\n"
],
"metadata": {
"id": "Pg5aexcOPqAZ"
}
},
{
"cell_type": "markdown",
"source": [
"## 1. Importering af græskardata og tilkaldelse af Tidyverse\n",
"\n",
"Vi skal bruge følgende pakker for at skære og analysere denne lektion:\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) er en [samling af R-pakker](https://www.tidyverse.org/packages), der er designet til at gøre datavidenskab hurtigere, nemmere og sjovere!\n",
"\n",
"Du kan installere dem med følgende kommando:\n",
"\n",
"`install.packages(c(\"tidyverse\"))`\n",
"\n",
"Scriptet nedenfor tjekker, om du har de nødvendige pakker til at gennemføre dette modul, og installerer dem for dig, hvis nogle mangler.\n"
],
"metadata": {
"id": "dc5WhyVdXAjR"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n",
"pacman::p_load(tidyverse)"
],
"outputs": [],
"metadata": {
"id": "GqPYUZgfXOBt"
}
},
{
"cell_type": "markdown",
"source": [
"Nu skal vi fyre op for nogle pakker og indlæse [data](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv), der er leveret til denne lektion!\n"
],
"metadata": {
"id": "kvjDTPDSXRr2"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Load the core Tidyverse packages\n",
"library(tidyverse)\n",
"\n",
"# Import the pumpkins data\n",
"pumpkins <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/2-Regression/data/US-pumpkins.csv\")\n",
"\n",
"\n",
"# Get a glimpse and dimensions of the data\n",
"glimpse(pumpkins)\n",
"\n",
"\n",
"# Print the first 50 rows of the data set\n",
"pumpkins %>% \n",
" slice_head(n =50)"
],
"outputs": [],
"metadata": {
"id": "VMri-t2zXqgD"
}
},
{
"cell_type": "markdown",
"source": [
"En hurtig `glimpse()` viser straks, at der er tomme felter og en blanding af strenge (`chr`) og numeriske data (`dbl`). `Date` er af typen karakter, og der er også en mærkelig kolonne kaldet `Package`, hvor dataene er en blanding af `sacks`, `bins` og andre værdier. Dataene er faktisk lidt af en rodebunke 😤.\n",
"\n",
"Det er faktisk ikke særlig almindeligt at få foræret et datasæt, der er helt klar til brug for at skabe en ML-model direkte. Men bare rolig, i denne lektion vil du lære, hvordan du forbereder et råt datasæt ved hjælp af standard R-biblioteker 🧑‍🔧. Du vil også lære forskellige teknikker til at visualisere data. 📈📊\n",
"<br>\n",
"\n",
"> En genopfriskning: Pipe-operatoren (`%>%`) udfører operationer i logisk rækkefølge ved at sende et objekt videre ind i en funktion eller et kald. Du kan tænke på pipe-operatoren som at sige \"og så\" i din kode.\n"
],
"metadata": {
"id": "REWcIv9yX29v"
}
},
{
"cell_type": "markdown",
"source": [
"## 2. Kontroller for manglende data\n",
"\n",
"En af de mest almindelige udfordringer, som dataforskere skal håndtere, er ufuldstændige eller manglende data. R repræsenterer manglende eller ukendte værdier med en speciel sentinelværdi: `NA` (Not Available).\n",
"\n",
"Så hvordan kan vi finde ud af, om dataframen indeholder manglende værdier?\n",
"<br>\n",
"- En direkte metode ville være at bruge base R-funktionen `anyNA`, som returnerer de logiske objekter `TRUE` eller `FALSE`.\n"
],
"metadata": {
"id": "Zxfb3AM5YbUe"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"pumpkins %>% \n",
" anyNA()"
],
"outputs": [],
"metadata": {
"id": "G--DQutAYltj"
}
},
{
"cell_type": "markdown",
"source": [
"Fantastisk, det ser ud til, at der mangler nogle data! Det er et godt sted at starte.\n",
"\n",
"- En anden måde ville være at bruge funktionen `is.na()`, som angiver, hvilke individuelle kolonneelementer der mangler, med en logisk `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, fik jobbet gjort, men med en stor dataramme som denne ville det være ineffektivt og praktisk talt umuligt at gennemgå alle rækker og kolonner individuelt😴.\n",
"\n",
"- En mere intuitiv måde ville være at beregne summen af de manglende værdier for hver kolonne:\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": [
"Meget bedre! Der mangler data, men måske vil det ikke have betydning for opgaven. Lad os se, hvad yderligere analyse bringer frem.\n",
"\n",
"> Sammen med de fantastiske sæt af pakker og funktioner har R en meget god dokumentation. For eksempel kan du bruge `help(colSums)` eller `?colSums` for at finde ud af mere om funktionen.\n"
],
"metadata": {
"id": "9gv-crB6ZD1Y"
}
},
{
"cell_type": "markdown",
"source": [
"## 3. Dplyr: En grammatik for datamanipulation\n",
"\n",
"<p >\n",
" <img src=\"../../images/dplyr_wrangling.png\"\n",
" width=\"569\"/>\n",
" <figcaption>Kunstværk af @allison_horst</figcaption>\n",
"\n",
"\n",
"<!--![Kunstværk af \\@allison_horst](../../../../../../2-Regression/2-Data/images/dplyr_wrangling.png)<br/>Kunstværk af \\@allison_horst-->\n"
],
"metadata": {
"id": "o4jLY5-VZO2C"
}
},
{
"cell_type": "markdown",
"source": [
"[`dplyr`](https://dplyr.tidyverse.org/), en pakke i Tidyverse, er en grammatik for datamanipulation, der tilbyder et konsistent sæt af verber, som hjælper dig med at løse de mest almindelige udfordringer inden for datamanipulation. I denne sektion vil vi udforske nogle af dplyrs verber! \n",
"<br>\n"
],
"metadata": {
"id": "i5o33MQBZWWw"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::select()\n",
"\n",
"`select()` er en funktion i pakken `dplyr`, som hjælper dig med at vælge kolonner, du vil beholde eller udelade.\n",
"\n",
"For at gøre din data frame lettere at arbejde med, kan du fjerne flere af dens kolonner ved hjælp af `select()` og kun beholde de kolonner, du har brug for.\n",
"\n",
"For eksempel vil vores analyse i denne øvelse involvere kolonnerne `Package`, `Low Price`, `High Price` og `Date`. Lad os vælge disse kolonner.\n"
],
"metadata": {
"id": "x3VGMAGBZiUr"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Select desired columns\n",
"pumpkins <- pumpkins %>% \n",
" select(Package, `Low Price`, `High Price`, Date)\n",
"\n",
"\n",
"# Print data set\n",
"pumpkins %>% \n",
" slice_head(n = 5)"
],
"outputs": [],
"metadata": {
"id": "F_FgxQnVZnM0"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::mutate()\n",
"\n",
"`mutate()` er en funktion i pakken `dplyr`, som hjælper dig med at oprette eller ændre kolonner, samtidig med at de eksisterende kolonner bevares.\n",
"\n",
"Den generelle struktur for `mutate` er:\n",
"\n",
"`data %>% mutate(new_column_name = what_it_contains)`\n",
"\n",
"Lad os prøve `mutate` af ved at bruge `Date`-kolonnen og udføre følgende operationer:\n",
"\n",
"1. Konverter datoerne (som i øjeblikket er af typen karakter) til et månedsformat (disse er amerikanske datoer, så formatet er `MM/DD/YYYY`).\n",
"\n",
"2. Uddrag måneden fra datoerne til en ny kolonne.\n",
"\n",
"I R gør pakken [lubridate](https://lubridate.tidyverse.org/) det nemmere at arbejde med dato-tidsdata. Så lad os bruge `dplyr::mutate()`, `lubridate::mdy()`, `lubridate::month()` og se, hvordan vi kan opnå ovenstående mål. Vi kan fjerne `Date`-kolonnen, da vi ikke får brug for den igen i de efterfølgende operationer.\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",
"Lad os nu oprette en ny kolonne `Price`, som repræsenterer gennemsnitsprisen på et græskar. For at udfylde den nye Price-kolonne tager vi gennemsnittet af kolonnerne `Low Price` og `High Price`. \n",
"<br>\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",
"\"Men vent lige!\", vil du sige efter at have skimmet hele datasættet med `View(pumpkins)`, \"Der er noget mærkeligt her!\"🤔\n",
"\n",
"Hvis du kigger på kolonnen `Package`, bliver græskar solgt i mange forskellige konfigurationer. Nogle sælges i mål af `1 1/9 bushel`, nogle i `1/2 bushel`, nogle per græskar, nogle per pund, og nogle i store kasser med varierende bredder.\n",
"\n",
"Lad os verificere dette:\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": [
"Fantastisk!👏\n",
"\n",
"Græskar ser ud til at være meget svære at veje konsekvent, så lad os filtrere dem ved kun at vælge græskar med strengen *bushel* i `Package`-kolonnen og lægge dette i en ny data frame `new_pumpkins`. \n",
"<br>\n"
],
"metadata": {
"id": "7sMjiVujaZxY"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::filter() og stringr::str_detect()\n",
"\n",
"[`dplyr::filter()`](https://dplyr.tidyverse.org/reference/filter.html): opretter et datasæt, der kun indeholder **rækker**, som opfylder dine betingelser, i dette tilfælde græskar med teksten *bushel* i kolonnen `Package`.\n",
"\n",
"[stringr::str_detect()](https://stringr.tidyverse.org/reference/str_detect.html): registrerer tilstedeværelsen eller fraværet af et mønster i en tekst.\n",
"\n",
"Pakken [`stringr`](https://github.com/tidyverse/stringr) tilbyder simple funktioner til almindelige tekstoperationer.\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": [
"Du kan se, at vi har indsnævret det til omkring 415 rækker med data, der indeholder græskar i store mængder.🤩 \n",
"<br>\n"
],
"metadata": {
"id": "VrDwF031avlR"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::case_when()\n",
"\n",
"**Men vent! Der er én ting mere, du skal gøre**\n",
"\n",
"Lagde du mærke til, at mængden af bushels varierer fra række til række? Du skal normalisere prissætningen, så du viser prisen per bushel og ikke per 1 1/9 eller 1/2 bushel. Det er tid til at lave lidt matematik for at standardisere det.\n",
"\n",
"Vi bruger funktionen [`case_when()`](https://dplyr.tidyverse.org/reference/case_when.html) til at *mutere* kolonnen Price afhængigt af nogle betingelser. `case_when` giver dig mulighed for at vektorisere flere `if_else()`-udsagn.\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": [
"Nu kan vi analysere prisen pr. enhed baseret på deres bushel-mål. Hele denne undersøgelse af bushels af græskar viser dog, hvor `vigtigt` det er at `forstå naturen af dine data`!\n",
"\n",
"> ✅ Ifølge [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308) afhænger en bushels vægt af typen af afgrøde, da det er en volumenmåling. \"En bushel tomater, for eksempel, skal veje 56 pund... Blade og grønt fylder mere med mindre vægt, så en bushel spinat vejer kun 20 pund.\" Det er alt sammen ret kompliceret! Lad os undlade at lave en bushel-til-pund-konvertering og i stedet prissætte efter bushel. Hele denne undersøgelse af bushels af græskar viser dog, hvor vigtigt det er at forstå naturen af dine data!\n",
">\n",
"> ✅ Lagde du mærke til, at græskar solgt pr. halv-bushel er meget dyre? Kan du finde ud af hvorfor? Hint: små græskar er langt dyrere end store, sandsynligvis fordi der er så mange flere af dem pr. bushel, givet den ubrugte plads, som ét stort, hult tærtegræskar optager.\n"
],
"metadata": {
"id": "pS2GNPagbSdb"
}
},
{
"cell_type": "markdown",
"source": [
"Vigtigt, lad os også flytte kolonnen \"Month\" til den første position, altså **før** kolonnen \"Package\".\n",
"\n",
"`dplyr::relocate()` bruges til at ændre kolonnepositioner.\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": [
"Godt klaret!👌 Du har nu et rent og ryddeligt datasæt, som du kan bruge til at bygge din nye regressionsmodel! \n",
"<br>\n"
],
"metadata": {
"id": "y8TJ0Za_bn5Y"
}
},
{
"cell_type": "markdown",
"source": [
"## 4. Datavisualisering med ggplot2\n",
"\n",
"<p >\n",
" <img src=\"../../images/data-visualization.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Infografik af Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"<!--![Infografik af Dasani Madipalli](../../../../../../2-Regression/2-Data/images/data-visualization.png){width=\"600\"}-->\n",
"\n",
"Der er et *klogt* ordsprog, der lyder sådan her:\n",
"\n",
"> \"Den simple graf har bragt mere information til dataanalytikerens sind end noget andet værktøj.\" --- John Tukey\n",
"\n",
"En del af dataforskerens rolle er at demonstrere kvaliteten og karakteren af de data, de arbejder med. For at gøre dette skaber de ofte interessante visualiseringer, eller grafer, diagrammer og plots, der viser forskellige aspekter af dataene. På denne måde kan de visuelt vise relationer og mangler, som ellers kan være svære at opdage.\n",
"\n",
"Visualiseringer kan også hjælpe med at afgøre, hvilken maskinlæringsteknik der er mest passende for dataene. Et spredningsdiagram, der ser ud til at følge en linje, indikerer for eksempel, at dataene er en god kandidat til en lineær regressionsøvelse.\n",
"\n",
"R tilbyder flere systemer til at lave grafer, men [`ggplot2`](https://ggplot2.tidyverse.org/index.html) er en af de mest elegante og alsidige. `ggplot2` giver dig mulighed for at sammensætte grafer ved at **kombinere uafhængige komponenter**.\n",
"\n",
"Lad os starte med et simpelt spredningsdiagram for kolonnerne Price og Month.\n",
"\n",
"I dette tilfælde starter vi med [`ggplot()`](https://ggplot2.tidyverse.org/reference/ggplot.html), angiver et datasæt og æstetisk mapping (med [`aes()`](https://ggplot2.tidyverse.org/reference/aes.html)) og tilføjer derefter lag (som [`geom_point()`](https://ggplot2.tidyverse.org/reference/geom_point.html)) for spredningsdiagrammer.\n"
],
"metadata": {
"id": "mYSH6-EtbvNa"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Set a theme for the plots\n",
"theme_set(theme_light())\n",
"\n",
"# Create a scatter plot\n",
"p <- ggplot(data = new_pumpkins, aes(x = Price, y = Month))\n",
"p + geom_point()"
],
"outputs": [],
"metadata": {
"id": "g2YjnGeOcLo4"
}
},
{
"cell_type": "markdown",
"source": [
"Er dette et nyttigt plot 🤷? Er der noget ved det, der overrasker dig?\n",
"\n",
"Det er ikke specielt nyttigt, da det blot viser dine data som en spredning af punkter i en given måned. \n",
"<br>\n"
],
"metadata": {
"id": "Ml7SDCLQcPvE"
}
},
{
"cell_type": "markdown",
"source": [
"### **Hvordan gør vi det nyttigt?**\n",
"\n",
"For at få grafer til at vise nyttige data, skal du normalt gruppere dataene på en eller anden måde. For eksempel i vores tilfælde vil det at finde gennemsnitsprisen på græskar for hver måned give mere indsigt i de underliggende mønstre i vores data. Dette leder os til endnu en **dplyr** gennemgang:\n",
"\n",
"#### `dplyr::group_by() %>% summarize()`\n",
"\n",
"Grupperet aggregering i R kan nemt beregnes ved hjælp af\n",
"\n",
"`dplyr::group_by() %>% summarize()`\n",
"\n",
"- `dplyr::group_by()` ændrer analyseenheden fra det komplette datasæt til individuelle grupper, såsom pr. måned.\n",
"\n",
"- `dplyr::summarize()` opretter en ny data frame med én kolonne for hver grupperingsvariabel og én kolonne for hver af de opsummeringsstatistikker, du har angivet.\n",
"\n",
"For eksempel kan vi bruge `dplyr::group_by() %>% summarize()` til at gruppere græskarrene i grupper baseret på **Month**-kolonnen og derefter finde **gennemsnitsprisen** for hver måned.\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": [
"Kort og godt!✨\n",
"\n",
"Kategoriske funktioner som måneder repræsenteres bedst ved hjælp af et søjlediagram 📊. De lag, der bruges til søjlediagrammer, er `geom_bar()` og `geom_col()`. Se `?geom_bar` for at lære mere.\n",
"\n",
"Lad os lave et!\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": [
"🤩🤩Dette er en mere nyttig datavisualisering! Det ser ud til at indikere, at den højeste pris for græskar forekommer i september og oktober. Stemmer det overens med dine forventninger? Hvorfor eller hvorfor ikke?\n",
"\n",
"Tillykke med at have afsluttet den anden lektion 👏! Du forberedte dine data til modelbygning og opdagede derefter flere indsigter ved hjælp af visualiseringer!\n"
],
"metadata": {
"id": "zDm0VOzzcuzR"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Ansvarsfraskrivelse**: \nDette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på at sikre nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.\n"
]
}
]
}