L’objectiu d’aquesta PAC1 és la iniciació a l’anà lisi i el tractament estadÃstic d’un conjunt de dades.
Al llarg de la prà ctica es faran servir diferents conjunts de dades, alguns provinents de fonts externes i altres propis de l’entorn RStudio. En particular, caldrà disposar d’accedir als següents conjunts de dades:
Conjunt de dades UScereal del paquet MASS de R que treballa amb informació nutricional i de mà rqueting sobre cereals nord-americans.
El lloc web https://www.kaggle.com/ disposa de conjunts de dades (datasets) de lliure accés i descà rrega, amb la validació prèvia de l’usuari. En aquesta PAC1 treballarem amb les dades d’una enquesta dels Estats Units sobre ús de drogues i salut: https://www.kaggle.com/datasets/tunguz/drug-use-by-age. Adjunt a l’enunciat, el fitxer drug-use-by-age.csv està disponible.
Conjunt de dades sobre anys de vida saludable en néixer d’Eurostat: https://ec.europa.eu/eurostat/databrowser/view/tps00150/default/table?lang=en&category=t_hlth.t_hlth_state. Adjunt a l’enunciat, el fitxer healthy-life-years.xlsx està disponible.
L’objectiu és conèixer la sintaxi a R per importar i exportar diferents tipus de fitxers de dades i com visualitzar-los des de RStudio, aixà com accedir a conjunts de dades de diferents fonts i entorns. Aquesta primera part correspon al pas inicial d’un estudi d’anà lisi de dades, iniciant pel treball de preparació del propi conjunt de dades.
1.1. Importeu les dades del fitxer drug-use-by-age.csv. Deseu aquestes dades en un data frame anomenat drug_use i mostreu els 5 primers i últims registres del conjunt de dades.
summary(cars)
## speed dist
## Min. : 4.0 Min. : 2.00
## 1st Qu.:12.0 1st Qu.: 26.00
## Median :15.0 Median : 36.00
## Mean :15.4 Mean : 42.98
## 3rd Qu.:19.0 3rd Qu.: 56.00
## Max. :25.0 Max. :120.00
library(readr)
# Importar les dades
drug_use <- read_csv("drug-use-by-age.csv")
## Rows: 17 Columns: 28
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (7): age, cocaine-frequency, crack-frequency, heroin-frequency, inhalan...
## dbl (21): n, alcohol-use, alcohol-frequency, marijuana-use, marijuana-freque...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Mostrar els 5 primers registres
head(drug_use, 5)
## # A tibble: 5 × 28
## age n `alcohol-use` `alcohol-frequency` `marijuana-use`
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 12 2798 3.9 3 1.1
## 2 13 2757 8.5 6 3.4
## 3 14 2792 18.1 5 8.7
## 4 15 2956 29.2 6 14.5
## 5 16 3058 40.1 10 22.5
## # ℹ 23 more variables: `marijuana-frequency` <dbl>, `cocaine-use` <dbl>,
## # `cocaine-frequency` <chr>, `crack-use` <dbl>, `crack-frequency` <chr>,
## # `heroin-use` <dbl>, `heroin-frequency` <chr>, `hallucinogen-use` <dbl>,
## # `hallucinogen-frequency` <dbl>, `inhalant-use` <dbl>,
## # `inhalant-frequency` <chr>, `pain-releiver-use` <dbl>,
## # `pain-releiver-frequency` <dbl>, `oxycontin-use` <dbl>,
## # `oxycontin-frequency` <chr>, `tranquilizer-use` <dbl>, …
# Mostrar els 5 últims registres
tail(drug_use, 5)
## # A tibble: 5 × 28
## age n `alcohol-use` `alcohol-frequency` `marijuana-use`
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 26-29 2628 80.7 52 20.8
## 2 30-34 2864 77.5 52 16.4
## 3 35-49 7391 75 52 10.4
## 4 50-64 3923 67.2 52 7.3
## 5 65+ 2448 49.3 52 1.2
## # ℹ 23 more variables: `marijuana-frequency` <dbl>, `cocaine-use` <dbl>,
## # `cocaine-frequency` <chr>, `crack-use` <dbl>, `crack-frequency` <chr>,
## # `heroin-use` <dbl>, `heroin-frequency` <chr>, `hallucinogen-use` <dbl>,
## # `hallucinogen-frequency` <dbl>, `inhalant-use` <dbl>,
## # `inhalant-frequency` <chr>, `pain-releiver-use` <dbl>,
## # `pain-releiver-frequency` <dbl>, `oxycontin-use` <dbl>,
## # `oxycontin-frequency` <chr>, `tranquilizer-use` <dbl>, …
# Mostrar els 5 primers i els 5 últims registres alhora
rbind(head(drug_use, 5), tail(drug_use, 5))
## # A tibble: 10 × 28
## age n `alcohol-use` `alcohol-frequency` `marijuana-use`
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 12 2798 3.9 3 1.1
## 2 13 2757 8.5 6 3.4
## 3 14 2792 18.1 5 8.7
## 4 15 2956 29.2 6 14.5
## 5 16 3058 40.1 10 22.5
## 6 26-29 2628 80.7 52 20.8
## 7 30-34 2864 77.5 52 16.4
## 8 35-49 7391 75 52 10.4
## 9 50-64 3923 67.2 52 7.3
## 10 65+ 2448 49.3 52 1.2
## # ℹ 23 more variables: `marijuana-frequency` <dbl>, `cocaine-use` <dbl>,
## # `cocaine-frequency` <chr>, `crack-use` <dbl>, `crack-frequency` <chr>,
## # `heroin-use` <dbl>, `heroin-frequency` <chr>, `hallucinogen-use` <dbl>,
## # `hallucinogen-frequency` <dbl>, `inhalant-use` <dbl>,
## # `inhalant-frequency` <chr>, `pain-releiver-use` <dbl>,
## # `pain-releiver-frequency` <dbl>, `oxycontin-use` <dbl>,
## # `oxycontin-frequency` <chr>, `tranquilizer-use` <dbl>, …
1.2. A partir del conjunt dades definit, drug_use, descriviu les caracterÃstiques del conjunt de dades com el nom de les variables, el tipus de dades, la mida de la mostra, i prospecció de valors nuls. A més, valoreu quin tipus d’estudi, grà fics, etc… podreu fer en funció del tipus de variables.
# 1. Identificar el nom de les variables
colnames(drug_use)
## [1] "age" "n"
## [3] "alcohol-use" "alcohol-frequency"
## [5] "marijuana-use" "marijuana-frequency"
## [7] "cocaine-use" "cocaine-frequency"
## [9] "crack-use" "crack-frequency"
## [11] "heroin-use" "heroin-frequency"
## [13] "hallucinogen-use" "hallucinogen-frequency"
## [15] "inhalant-use" "inhalant-frequency"
## [17] "pain-releiver-use" "pain-releiver-frequency"
## [19] "oxycontin-use" "oxycontin-frequency"
## [21] "tranquilizer-use" "tranquilizer-frequency"
## [23] "stimulant-use" "stimulant-frequency"
## [25] "meth-use" "meth-frequency"
## [27] "sedative-use" "sedative-frequency"
# 2. Identificar el tipus de dades de cada variable
str(drug_use)
## spc_tbl_ [17 × 28] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ age : chr [1:17] "12" "13" "14" "15" ...
## $ n : num [1:17] 2798 2757 2792 2956 3058 ...
## $ alcohol-use : num [1:17] 3.9 8.5 18.1 29.2 40.1 49.3 58.7 64.6 69.7 83.2 ...
## $ alcohol-frequency : num [1:17] 3 6 5 6 10 13 24 36 48 52 ...
## $ marijuana-use : num [1:17] 1.1 3.4 8.7 14.5 22.5 28 33.7 33.4 34 33 ...
## $ marijuana-frequency : num [1:17] 4 15 24 25 30 36 52 60 60 52 ...
## $ cocaine-use : num [1:17] 0.1 0.1 0.1 0.5 1 2 3.2 4.1 4.9 4.8 ...
## $ cocaine-frequency : chr [1:17] "5.0" "1.0" "5.5" "4.0" ...
## $ crack-use : num [1:17] 0 0 0 0.1 0 0.1 0.4 0.5 0.6 0.5 ...
## $ crack-frequency : chr [1:17] "-" "3.0" "-" "9.5" ...
## $ heroin-use : num [1:17] 0.1 0 0.1 0.2 0.1 0.1 0.4 0.5 0.9 0.6 ...
## $ heroin-frequency : chr [1:17] "35.5" "-" "2.0" "1.0" ...
## $ hallucinogen-use : num [1:17] 0.2 0.6 1.6 2.1 3.4 4.8 7 8.6 7.4 6.3 ...
## $ hallucinogen-frequency : num [1:17] 52 6 3 4 3 3 4 3 2 4 ...
## $ inhalant-use : num [1:17] 1.6 2.5 2.6 2.5 3 2 1.8 1.4 1.5 1.4 ...
## $ inhalant-frequency : chr [1:17] "19.0" "12.0" "5.0" "5.5" ...
## $ pain-releiver-use : num [1:17] 2 2.4 3.9 5.5 6.2 8.5 9.2 9.4 10 9 ...
## $ pain-releiver-frequency: num [1:17] 36 14 12 10 7 9 12 12 10 15 ...
## $ oxycontin-use : num [1:17] 0.1 0.1 0.4 0.8 1.1 1.4 1.7 1.5 1.7 1.3 ...
## $ oxycontin-frequency : chr [1:17] "24.5" "41.0" "4.5" "3.0" ...
## $ tranquilizer-use : num [1:17] 0.2 0.3 0.9 2 2.4 3.5 4.9 4.2 5.4 3.9 ...
## $ tranquilizer-frequency : num [1:17] 52 25.5 5 4.5 11 7 12 4.5 10 7 ...
## $ stimulant-use : num [1:17] 0.2 0.3 0.8 1.5 1.8 2.8 3 3.3 4 4.1 ...
## $ stimulant-frequency : num [1:17] 2 4 12 6 9.5 9 8 6 12 10 ...
## $ meth-use : num [1:17] 0 0.1 0.1 0.3 0.3 0.6 0.5 0.4 0.9 0.6 ...
## $ meth-frequency : chr [1:17] "-" "5.0" "24.0" "10.5" ...
## $ sedative-use : num [1:17] 0.2 0.1 0.2 0.4 0.2 0.5 0.4 0.3 0.5 0.3 ...
## $ sedative-frequency : num [1:17] 13 19 16.5 30 3 6.5 10 6 4 9 ...
## - attr(*, "spec")=
## .. cols(
## .. age = col_character(),
## .. n = col_double(),
## .. `alcohol-use` = col_double(),
## .. `alcohol-frequency` = col_double(),
## .. `marijuana-use` = col_double(),
## .. `marijuana-frequency` = col_double(),
## .. `cocaine-use` = col_double(),
## .. `cocaine-frequency` = col_character(),
## .. `crack-use` = col_double(),
## .. `crack-frequency` = col_character(),
## .. `heroin-use` = col_double(),
## .. `heroin-frequency` = col_character(),
## .. `hallucinogen-use` = col_double(),
## .. `hallucinogen-frequency` = col_double(),
## .. `inhalant-use` = col_double(),
## .. `inhalant-frequency` = col_character(),
## .. `pain-releiver-use` = col_double(),
## .. `pain-releiver-frequency` = col_double(),
## .. `oxycontin-use` = col_double(),
## .. `oxycontin-frequency` = col_character(),
## .. `tranquilizer-use` = col_double(),
## .. `tranquilizer-frequency` = col_double(),
## .. `stimulant-use` = col_double(),
## .. `stimulant-frequency` = col_double(),
## .. `meth-use` = col_double(),
## .. `meth-frequency` = col_character(),
## .. `sedative-use` = col_double(),
## .. `sedative-frequency` = col_double()
## .. )
## - attr(*, "problems")=<externalptr>
# 3. Comprovar la mida de la mostra (n files i n col)
dim(drug_use)
## [1] 17 28
# 4. Comprovar valors nuls
drug_use[drug_use == "-"] <- NA # Substituir "-" per NA en tot el data frame
sum(is.na(drug_use)) # Nombre total de valors nuls
## [1] 9
colSums(is.na(drug_use)) # Nombre de valors nuls per columna
## age n alcohol-use
## 0 0 0
## alcohol-frequency marijuana-use marijuana-frequency
## 0 0 0
## cocaine-use cocaine-frequency crack-use
## 0 1 0
## crack-frequency heroin-use heroin-frequency
## 3 0 1
## hallucinogen-use hallucinogen-frequency inhalant-use
## 0 0 0
## inhalant-frequency pain-releiver-use pain-releiver-frequency
## 1 0 0
## oxycontin-use oxycontin-frequency tranquilizer-use
## 0 1 0
## tranquilizer-frequency stimulant-use stimulant-frequency
## 0 0 0
## meth-use meth-frequency sedative-use
## 0 2 0
## sedative-frequency
## 0
En funció de les variables que tenim, podem fer:
-> Histogrammes i boxplots: Distribució de consum.
-> Grà fics de lÃnies: Evolució per edat.
-> Grà fics de dispersió i correlació: Relació entre substà ncies.
-> Grà fics de barres: Comparació de consum per edat.
A partir del conjunt de dades UScereal del paquet MASS, es demana:
2.1. Mostreu la informació més rellevant de l’estructura d’aquest conjunt de dades. Suggeriu i justifiqueu alguna acció a realitzar sobre aquest conjunt de dades (transformació o categorització d’alguna de les variables, eliminació d’algun tipus de dades, …).
library(MASS)
##
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
##
## select
# Veure les primeres files del conjunt de dades
head(UScereal)
## mfr calories protein fat sodium fibre
## 100% Bran N 212.1212 12.121212 3.030303 393.9394 30.303030
## All-Bran K 212.1212 12.121212 3.030303 787.8788 27.272727
## All-Bran with Extra Fiber K 100.0000 8.000000 0.000000 280.0000 28.000000
## Apple Cinnamon Cheerios G 146.6667 2.666667 2.666667 240.0000 2.000000
## Apple Jacks K 110.0000 2.000000 0.000000 125.0000 1.000000
## Basic 4 G 173.3333 4.000000 2.666667 280.0000 2.666667
## carbo sugars shelf potassium vitamins
## 100% Bran 15.15152 18.18182 3 848.48485 enriched
## All-Bran 21.21212 15.15151 3 969.69697 enriched
## All-Bran with Extra Fiber 16.00000 0.00000 3 660.00000 enriched
## Apple Cinnamon Cheerios 14.00000 13.33333 1 93.33333 enriched
## Apple Jacks 11.00000 14.00000 2 30.00000 enriched
## Basic 4 24.00000 10.66667 3 133.33333 enriched
str(UScereal)
## 'data.frame': 65 obs. of 11 variables:
## $ mfr : Factor w/ 6 levels "G","K","N","P",..: 3 2 2 1 2 1 6 4 5 1 ...
## $ calories : num 212 212 100 147 110 ...
## $ protein : num 12.12 12.12 8 2.67 2 ...
## $ fat : num 3.03 3.03 0 2.67 0 ...
## $ sodium : num 394 788 280 240 125 ...
## $ fibre : num 30.3 27.3 28 2 1 ...
## $ carbo : num 15.2 21.2 16 14 11 ...
## $ sugars : num 18.2 15.2 0 13.3 14 ...
## $ shelf : int 3 3 3 1 2 3 1 3 2 1 ...
## $ potassium: num 848.5 969.7 660 93.3 30 ...
## $ vitamins : Factor w/ 3 levels "100%","enriched",..: 2 2 2 2 2 2 2 2 2 2 ...
UScereal conté informació sobre cereals de diferents marques amb les seguents variables:
- Numeriques (int/numeric): calories, protein, fat, sodium, fiber, carbo, sugars, shelf, potassium, vitamins
- Factor (categòriques): mfr (fabricant del cereal), shelf (nivell de prestatge)
Accions a realitzar:
1. Transformació de variables
Convertir shelf en un factor per representar millor la posició del cereal al supermercat.
UScereal$shelf <- as.factor(UScereal$shelf)
Normalitzar les variables calories, fat, sugars, etc., si volem fer anà lisis comparatius.
UScereal$calories <- scale(UScereal$calories)
2. Eliminació de variables innecessà ries: Si no volem utilitzar vitamins (ja que està codificada en categories) podem eliminar-la.
UScereal <- subset(UScereal, select = -vitamins)
3. Tractament de valors nuls
# Substituir els valors "-" per NA en tot el dataset
UScereal[UScereal == "-"] <- NA
colSums(is.na(UScereal)) # Comprovem si hi ha valors NA
## mfr protein fat sodium fibre carbo sugars
## 0 0 0 0 0 0 0 0
## shelf potassium
## 0 0
En aquest cas no hi ha valors nuls, per tant, no realitzarem cap més acció.
2.2. Exporteu el data frame a un fitxer en format *.csv especificant la ubicació del fitxer.
Recordeu que per accedir al conjunt de dades esmentat, cal instal·lar el paquet MASS.
write.csv(UScereal, file = "/Users/joancarrerasdz/Library/Mobile Documents/com~apple~CloudDocs/Master/Programari per al anà lisi de dades/Repte_1/PAC_1/UScereal.csv", row.names = FALSE)
3.1. Seleccioneu un paquet de R i un conjunt de dades especÃfics. Justifiqueu l’elecció del dataset corresponent (temà tica, diversitat de tipus de variables, tipus d’estudis a realitzar, …).
Paquet escollit: ggplot2 Dataset escollit: mpg
mpg conté dades sobre el consum de combustible de diferents cotxes, útil per anà lisis ambientals i de rendiment.
Inclou variables numèriques (cty, hwy, displ, etc.) i categòriques (manufacturer, class, etc.), permetent diferents tipus d’anà lisi.
Es poden fer estudis de correlació, comparacions entre fabricants i tipus de vehicles, i visualitzacions interessants.
library(ggplot2)
data(mpg)
3.2. Mostreu i descriviu la informació més rellevant de l’estructura del dataset escollit.
head(mpg)
## # A tibble: 6 × 11
## manufacturer model displ year cyl trans drv cty hwy fl class
## <chr> <chr> <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr>
## 1 audi a4 1.8 1999 4 auto(l5) f 18 29 p compa…
## 2 audi a4 1.8 1999 4 manual(m5) f 21 29 p compa…
## 3 audi a4 2 2008 4 manual(m6) f 20 31 p compa…
## 4 audi a4 2 2008 4 auto(av) f 21 30 p compa…
## 5 audi a4 2.8 1999 6 auto(l5) f 16 26 p compa…
## 6 audi a4 2.8 1999 6 manual(m5) f 18 26 p compa…
Variables clau:
- Numèriques: displ (cilindrada), cty (consum ciutat), hwy (consum carretera)
- Categòriguqes: manufactutrer (fabricant), class (tipus de vehicle), drv (tipus de tracció)
colSums(is.na(mpg)) #comprovació de valors nuls
## manufacturer model displ year cyl trans
## 0 0 0 0 0 0
## drv cty hwy fl class
## 0 0 0 0 0
3.3. Creeu una nova variable i transformeu una altra variable. Justifiqueu els canvis realitzats.
mpg$consum_mitja <- (mpg$cty + mpg$hwy) / 2
mpg$drv <- factor(mpg$drv,
levels = c("f", "r", "4"),
labels = c("traccio_davantera", "traccio_posterior", "traccio_total"))
- Nova variable: consum_mitja -> mitjana entre els dos tipus de consums (cty i hwy). Permet tenir una única mètrica de consum total.
- Transformació: es converteix drv en factors mes descriptius. És més entenedor per als usuaris.
3.4. Creeu dos data frames, guardant cadascun en un fitxer.
mpg_fwd <- subset(mpg, drv == "traccio_davantera")
mpg_rwd <- subset(mpg, drv == "traccio_posterior")
mpg_twd <- subset(mpg, drv == "traccio_total")
write.csv(mpg_fwd, file = "mpg_fwd.csv", row.names = FALSE)
write.csv(mpg_rwd, file = "mpg_rwd.csv", row.names = FALSE)
write.csv(mpg_twd, file = "mpg_twd.csv", row.names = FALSE)
3.5. Combineu de nou els dos fitxers anteriors.
mpg_fwd_loaded <- read.csv("mpg_fwd.csv")
mpg_rwd_loaded <- read.csv("mpg_rwd.csv")
mpg_twd_loaded <- read.csv("mpg_twd.csv")
mpg_combined <- rbind(mpg_fwd_loaded, mpg_rwd_loaded, mpg_twd_loaded)
mpg_combined <- mpg_combined[order(mpg_combined$manufacturer, mpg_combined$model), ]
rownames(mpg_combined) <- NULL
mpg_combined <- as_tibble(mpg_combined)
mpg_combined$drv <- factor(mpg_combined$drv,
levels = levels(mpg$drv))
identical(mpg, mpg_combined) # Ha de retornar TRUE si s'ha fusionat correctament.
## [1] TRUE
L’objectiu d’aquesta secció és obtenir informació sobre un conjunt determinat de dades realitzant operacions i consultes diverses.
4.1. [1 punt] Importeu les dades del fitxer healthy-life-years.xlsx. Deseu aquestes dades en un data frame anomenat years. Mostreu el nombre de valors perduts per columna. Deseu el nombre de valors perduts per fila en una variable.
library(readxl)
years <- read_excel("/Users/joancarrerasdz/Library/Mobile Documents/com~apple~CloudDocs/Master/Programari per al anàlisi de dades/Repte_1/PAC_1/healthy-life-years.xlsx")
head(years)
## # A tibble: 6 × 13
## TIME `2011` `2012` `2013` `2014` `2015` `2016` `2017` `2018` `2019` `2020`
## <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
## 1 GEO (La… <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 2 Europea… 61.4 61.3 61 61.3 62.8 64 63.9 64 64.59… 64
## 3 Euro ar… : : : : : : : : : :
## 4 Euro ar… : : : : : : : : : :
## 5 Belgium 63.5 64.59… 63.9 64.09… 64.2 63.7 63.7 63.4 62.4 63.8
## 6 Bulgaria 64 63.9 64.5 64 63.2 65.7 64.5 65.8 66.3 65.59…
## # ℹ 2 more variables: `2021` <chr>, `2022` <chr>
# Valors perduts per columna
years[years == ":"] <- NA
years[, -1] <- lapply(years[, -1], as.numeric)
missing_per_column <- colSums(is.na(years))
print(missing_per_column)
## TIME 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022
## 0 9 10 10 9 9 9 9 9 11 11 12 11
# Valors perduts per fila
missing_per_row <- rowSums(is.na(years))
4.2. [0.5 punts] Calculeu la mitjana aritmètica d’anys de vida saludable amb dades del 2011, descartant les dades que falten.
mean_2011 <- mean(years$"2011", na.rm = TRUE)
print(mean_2011)
## [1] 62.14062
4.3. [0.5 punts] Definiu una variable, max_years, que deseu el valor mà xim per a cada paÃs, descartant les dades faltants.
# Eliminar files on totes les columnas (excepte la primera) son NA
years_copia <- years[rowSums(is.na(years[, -1])) < ncol(years[, -1]), ]
max_years <- apply(years_copia[ , -1], 1, max, na.rm = TRUE) # S'exclou la primera columna (Paisos)
4.4. [1 punt] Definiu un data frame, years2, que mostri les dades per als paisos que compleixin 2 condicions: (i) tenen menys de 2 dades faltants i (ii) el seu valor de max_years és estrictament superior a la mitjana aritmètica de max_years (calculada considerant tots els paisos amb almenys un valor no faltant).
# Calcular la mitjana de max_years sense NA
mean_max_years <- mean(max_years, na.rm = TRUE)
# Filtrar paisos amb menys de 2 valors nuls i max_years superior a la mitjana
years2 <- years[missing_per_row < 2 & max_years > mean_max_years, ]
## Warning in missing_per_row < 2 & max_years > mean_max_years: longer object
## length is not a multiple of shorter object length
[4.5. 0.5 punts Definiu una matriu, years_matrix, que mostri les columnes 2011 i 2022. Quan és convenient utilitzar una matriu en lloc d’un data frame?
years_matrix <- as.matrix(years[, c("2011", "2022")])
És convenient utilitzar una matriu en comptes d’un data frame quan: - Totes les dades son numèriques i volem fer cà lculs eficients. - Necessitem operacions matricials (apply(), colMeans(), etc). - Una funció exigeix un objecte de tipus matrix.
L’objectiu és estudiar els conceptes relacionats amb estadÃstica descriptiva i realitzar diferents tipus de grà fics amb R.
5.1. [0.5 punts] A partir del conjunt de dades drug_use, calculeu les estadÃstiques descriptives més rellevants i comenteu els resultats.
summary(drug_use)
## age n alcohol-use alcohol-frequency
## Length:17 Min. :2223 Min. : 3.90 Min. : 3.00
## Class :character 1st Qu.:2469 1st Qu.:40.10 1st Qu.:10.00
## Mode :character Median :2798 Median :64.60 Median :48.00
## Mean :3251 Mean :55.43 Mean :33.35
## 3rd Qu.:3058 3rd Qu.:77.50 3rd Qu.:52.00
## Max. :7391 Max. :84.20 Max. :52.00
## marijuana-use marijuana-frequency cocaine-use cocaine-frequency
## Min. : 1.10 Min. : 4.00 Min. :0.000 Length:17
## 1st Qu.: 8.70 1st Qu.:30.00 1st Qu.:0.500 Class :character
## Median :20.80 Median :52.00 Median :2.000 Mode :character
## Mean :18.92 Mean :42.94 Mean :2.176
## 3rd Qu.:28.40 3rd Qu.:52.00 3rd Qu.:4.000
## Max. :34.00 Max. :72.00 Max. :4.900
## crack-use crack-frequency heroin-use heroin-frequency
## Min. :0.0000 Length:17 Min. :0.0000 Length:17
## 1st Qu.:0.0000 Class :character 1st Qu.:0.1000 Class :character
## Median :0.4000 Mode :character Median :0.2000 Mode :character
## Mean :0.2941 Mean :0.3529
## 3rd Qu.:0.5000 3rd Qu.:0.6000
## Max. :0.6000 Max. :1.1000
## hallucinogen-use hallucinogen-frequency inhalant-use inhalant-frequency
## Min. :0.100 Min. : 2.000 Min. :0.000 Length:17
## 1st Qu.:0.600 1st Qu.: 3.000 1st Qu.:0.600 Class :character
## Median :3.200 Median : 3.000 Median :1.400 Mode :character
## Mean :3.394 Mean : 8.412 Mean :1.388
## 3rd Qu.:5.200 3rd Qu.: 4.000 3rd Qu.:2.000
## Max. :8.600 Max. :52.000 Max. :3.000
## pain-releiver-use pain-releiver-frequency oxycontin-use oxycontin-frequency
## Min. : 0.600 Min. : 7.00 Min. :0.0000 Length:17
## 1st Qu.: 3.900 1st Qu.:12.00 1st Qu.:0.4000 Class :character
## Median : 6.200 Median :12.00 Median :1.1000 Mode :character
## Mean : 6.271 Mean :14.71 Mean :0.9353
## 3rd Qu.: 9.000 3rd Qu.:15.00 3rd Qu.:1.4000
## Max. :10.000 Max. :36.00 Max. :1.7000
## tranquilizer-use tranquilizer-frequency stimulant-use stimulant-frequency
## Min. :0.200 Min. : 4.50 Min. :0.000 Min. : 2.00
## 1st Qu.:1.400 1st Qu.: 6.00 1st Qu.:0.600 1st Qu.: 7.00
## Median :3.500 Median :10.00 Median :1.800 Median : 10.00
## Mean :2.806 Mean :11.74 Mean :1.918 Mean : 31.15
## 3rd Qu.:4.200 3rd Qu.:11.00 3rd Qu.:3.000 3rd Qu.: 12.00
## Max. :5.400 Max. :52.00 Max. :4.100 Max. :364.00
## meth-use meth-frequency sedative-use sedative-frequency
## Min. :0.0000 Length:17 Min. :0.0000 Min. : 3.00
## 1st Qu.:0.2000 Class :character 1st Qu.:0.2000 1st Qu.: 6.50
## Median :0.4000 Mode :character Median :0.3000 Median : 10.00
## Mean :0.3824 Mean :0.2824 Mean : 19.38
## 3rd Qu.:0.6000 3rd Qu.:0.4000 3rd Qu.: 17.50
## Max. :0.9000 Max. :0.5000 Max. :104.00
# També podem calcular estadÃstiques especÃfiques
library(dplyr)
drug_use %>% summarise_all(funs(mean = mean(., na.rm = TRUE), sd = sd(., na.rm = TRUE),
min = min(., na.rm = TRUE), max = max(., na.rm = TRUE)))
## Warning: `funs()` was deprecated in dplyr 0.8.0.
## ℹ Please use a list of either functions or lambdas:
##
## # Simple named list: list(mean = mean, median = median)
##
## # Auto named with `tibble::lst()`: tibble::lst(mean, median)
##
## # Using lambdas list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: There were 8 warnings in `summarise()`.
## The first warning was:
## ℹ In argument: `age_mean = mean(age, na.rm = TRUE)`.
## Caused by warning in `mean.default()`:
## ! argument is not numeric or logical: returning NA
## ℹ Run `dplyr::last_dplyr_warnings()` to see the 7 remaining warnings.
## # A tibble: 1 × 112
## age_mean n_mean `alcohol-use_mean` alcohol-frequency_me…¹ `marijuana-use_mean`
## <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 NA 3251. 55.4 33.4 18.9
## # ℹ abbreviated name: ¹​`alcohol-frequency_mean`
## # ℹ 107 more variables: `marijuana-frequency_mean` <dbl>,
## # `cocaine-use_mean` <dbl>, `cocaine-frequency_mean` <dbl>,
## # `crack-use_mean` <dbl>, `crack-frequency_mean` <dbl>,
## # `heroin-use_mean` <dbl>, `heroin-frequency_mean` <dbl>,
## # `hallucinogen-use_mean` <dbl>, `hallucinogen-frequency_mean` <dbl>,
## # `inhalant-use_mean` <dbl>, `inhalant-frequency_mean` <dbl>, …
# Convertir columnes numèriques
cols_to_numeric <- c("alcohol-use", "marijuana-use", "cocaine-use", "crack-use",
"heroin-use", "hallucinogen-use", "inhalant-use", "pain-releiver-use",
"oxycontin-use", "tranquilizer-use", "stimulant-use", "meth-use",
"sedative-use")
drug_use[cols_to_numeric] <- lapply(drug_use[cols_to_numeric], as.numeric)
# Calcular estadÃstiques descriptives
summary(drug_use[cols_to_numeric])
## alcohol-use marijuana-use cocaine-use crack-use
## Min. : 3.90 Min. : 1.10 Min. :0.000 Min. :0.0000
## 1st Qu.:40.10 1st Qu.: 8.70 1st Qu.:0.500 1st Qu.:0.0000
## Median :64.60 Median :20.80 Median :2.000 Median :0.4000
## Mean :55.43 Mean :18.92 Mean :2.176 Mean :0.2941
## 3rd Qu.:77.50 3rd Qu.:28.40 3rd Qu.:4.000 3rd Qu.:0.5000
## Max. :84.20 Max. :34.00 Max. :4.900 Max. :0.6000
## heroin-use hallucinogen-use inhalant-use pain-releiver-use
## Min. :0.0000 Min. :0.100 Min. :0.000 Min. : 0.600
## 1st Qu.:0.1000 1st Qu.:0.600 1st Qu.:0.600 1st Qu.: 3.900
## Median :0.2000 Median :3.200 Median :1.400 Median : 6.200
## Mean :0.3529 Mean :3.394 Mean :1.388 Mean : 6.271
## 3rd Qu.:0.6000 3rd Qu.:5.200 3rd Qu.:2.000 3rd Qu.: 9.000
## Max. :1.1000 Max. :8.600 Max. :3.000 Max. :10.000
## oxycontin-use tranquilizer-use stimulant-use meth-use
## Min. :0.0000 Min. :0.200 Min. :0.000 Min. :0.0000
## 1st Qu.:0.4000 1st Qu.:1.400 1st Qu.:0.600 1st Qu.:0.2000
## Median :1.1000 Median :3.500 Median :1.800 Median :0.4000
## Mean :0.9353 Mean :2.806 Mean :1.918 Mean :0.3824
## 3rd Qu.:1.4000 3rd Qu.:4.200 3rd Qu.:3.000 3rd Qu.:0.6000
## Max. :1.7000 Max. :5.400 Max. :4.100 Max. :0.9000
## sedative-use
## Min. :0.0000
## 1st Qu.:0.2000
## Median :0.3000
## Mean :0.2824
## 3rd Qu.:0.4000
## Max. :0.5000
# També es poden calcular mesures especÃfiques
drug_use %>% summarise(across(all_of(cols_to_numeric), list(mean = ~mean(. , na.rm = TRUE),
sd = ~sd(. , na.rm = TRUE),
min = ~min(. , na.rm = TRUE),
max = ~max(. , na.rm = TRUE))))
## # A tibble: 1 × 52
## `alcohol-use_mean` `alcohol-use_sd` `alcohol-use_min` `alcohol-use_max`
## <dbl> <dbl> <dbl> <dbl>
## 1 55.4 26.9 3.9 84.2
## # ℹ 48 more variables: `marijuana-use_mean` <dbl>, `marijuana-use_sd` <dbl>,
## # `marijuana-use_min` <dbl>, `marijuana-use_max` <dbl>,
## # `cocaine-use_mean` <dbl>, `cocaine-use_sd` <dbl>, `cocaine-use_min` <dbl>,
## # `cocaine-use_max` <dbl>, `crack-use_mean` <dbl>, `crack-use_sd` <dbl>,
## # `crack-use_min` <dbl>, `crack-use_max` <dbl>, `heroin-use_mean` <dbl>,
## # `heroin-use_sd` <dbl>, `heroin-use_min` <dbl>, `heroin-use_max` <dbl>,
## # `hallucinogen-use_mean` <dbl>, `hallucinogen-use_sd` <dbl>, …
5.2. [0.5 punts] Realitzeu un diagrama de caixes sobre les variables alcohol.use, marijuana.use, i cocaine.use. Quines conclusions es poden extreure?
# Carregar llibreria per a visualització
library(ggplot2)
library(tidyr)
# Reestructurar los datos al formato largo
drug_use_long <- drug_use %>%
gather(key = "Substance", value = "Usage", `alcohol-use`, `marijuana-use`, `cocaine-use`)
# Crear el boxplot para las tres variables
ggplot(drug_use_long, aes(x = Substance, y = Usage, fill = Substance)) +
geom_boxplot(alpha = 0.5) +
labs(title = "Boxplot d'ús de substà ncies", x = "Substà ncia", y = "Ús") +
scale_fill_manual(values = c("blue", "green", "red")) +
theme_minimal()
5.3. [0.5 punts] Realitzeu la matriu de correlació de les variables crack.use, heroin.use, i hallucinogen.use. Quines conclusions es poden extreure?
library(corrplot)
## corrplot 0.95 loaded
cor_matrix <- cor(drug_use[, c("crack-use", "heroin-use", "hallucinogen-use")], use = "complete.obs")
# Mostrar la matriu de correlació
print(cor_matrix)
## crack-use heroin-use hallucinogen-use
## crack-use 1.0000000 0.7507903 0.5562225
## heroin-use 0.7507903 1.0000000 0.6836736
## hallucinogen-use 0.5562225 0.6836736 1.0000000
# Visualització de la matriu amb un mapa de calor
corrplot(cor_matrix, method = "color", type = "upper", tl.col = "black", tl.srt = 45)
- Crack i heroina (Correlació = 0.75): Les persones que consumeixen crack també tenen una alta probabilitat de consrumir heroina.
- Heroina i al·lucinògens (Correlació = 0.68): Les persones que consumeixen heroina també tenen una alta probabilitat de consumir al·lucinògens, pero menor que crack i heroina.
- Crack i al·lucinògens (Correlació = 0.56): Hi ha una certa associació però l’us de les dos substà ncies està menys relacionat.
A partir del conjunt de dades UScereal, mostreu les taules de freqüències relatives i absolutes de les variables mfr i shelf. Representeu també una taula de freqüències relatives creuades i expliqueu quines conclusions es podrien obtenir de la relació entre les dues variables.
head(UScereal)
## mfr calories protein fat sodium fibre
## 100% Bran N 1.00482404 12.121212 3.030303 393.9394 30.303030
## All-Bran K 1.00482404 12.121212 3.030303 787.8788 27.272727
## All-Bran with Extra Fiber K -0.79164835 8.000000 0.000000 280.0000 28.000000
## Apple Cinnamon Cheerios G -0.04392734 2.666667 2.666667 240.0000 2.000000
## Apple Jacks K -0.63142243 2.000000 0.000000 125.0000 1.000000
## Basic 4 G 0.38334167 4.000000 2.666667 280.0000 2.666667
## carbo sugars shelf potassium
## 100% Bran 15.15152 18.18182 3 848.48485
## All-Bran 21.21212 15.15151 3 969.69697
## All-Bran with Extra Fiber 16.00000 0.00000 3 660.00000
## Apple Cinnamon Cheerios 14.00000 13.33333 1 93.33333
## Apple Jacks 11.00000 14.00000 2 30.00000
## Basic 4 24.00000 10.66667 3 133.33333
Taula de frquències absolutes i relatives de mfr i shelf
- Frequències absolutes: Es calculen amb la funció table()
- Frequències relatives: Es calculen dividint la frequència absoluta entre la mida total de la mostra.
Freq. absolutes i relatives de mfr :
# Taula de frequències absolutes de 'mfr'
freq_abs_mfr <- table(UScereal$mfr)
print(freq_abs_mfr)
##
## G K N P Q R
## 22 21 3 9 5 5
# Taula de frequències relatives de 'mfr'
freq_rel_mfr <- prop.table(freq_abs_mfr)
print(freq_rel_mfr)
##
## G K N P Q R
## 0.33846154 0.32307692 0.04615385 0.13846154 0.07692308 0.07692308
Freq. absolutes i relatives de shelf :
# Taula de frequències absolutes de 'shelf'
freq_abs_shelf <- table(UScereal$shelf)
print(freq_abs_shelf)
##
## 1 2 3
## 18 18 29
# Taula de frequències relatives de 'shelf'
freq_rel_shelf <- prop.table(freq_abs_shelf)
print(freq_rel_shelf)
##
## 1 2 3
## 0.2769231 0.2769231 0.4461538
Taula de frequències relatives creuades entre mfr i shelf
# Taula de frequències absolutes creuades entre 'mfr' i 'shelf'
freq_creuada_abs <- table(UScereal$mfr, UScereal$shelf)
print(freq_creuada_abs)
##
## 1 2 3
## G 6 7 9
## K 4 7 10
## N 2 0 1
## P 2 1 6
## Q 0 3 2
## R 4 0 1
# Taula de frequències relatives creuades entre 'mfr' i 'shelf'
freq_creuada_rel <- prop.table(freq_creuada_abs)
print(freq_creuada_rel)
##
## 1 2 3
## G 0.09230769 0.10769231 0.13846154
## K 0.06153846 0.10769231 0.15384615
## N 0.03076923 0.00000000 0.01538462
## P 0.03076923 0.01538462 0.09230769
## Q 0.00000000 0.04615385 0.03076923
## R 0.06153846 0.00000000 0.01538462
# Grà fic de les frequències relatives creuades com a grà fic de barres apilat
barplot(freq_creuada_rel, beside=FALSE, legend=TRUE, main="Frequències relatives creuades: MFR vs Shelf")
# Grà fic de les frequències relatives creuades com a grà fic de barres apilat amb colors
colors <- rainbow(length(freq_creuada_rel)) # Genera una paleta de colores
barplot(freq_creuada_rel, beside=FALSE, legend=TRUE, col=colors, main="Frequències relatives creuades: MFR vs Shelf")
# Heatmap de la taula de frequències relatives creuades
library(ggplot2)
freq_creuada_df <- as.data.frame(freq_creuada_rel)
ggplot(freq_creuada_df, aes(x=Var1, y=Var2, fill=Freq)) +
geom_tile() +
scale_fill_gradient(low="white", high="blue") +
labs(title="Heatmap de frequències relatives creuades: MFR vs Shelf", x="MFR", y="Shelf")
Conclusions:
7.1. [0.5 punts] Definiu un data frame, years_complete, a partir del data frame years, que consideri els paisos sense cap dada faltant. Penseu quin tipus de grà fic seria adequat per representar totes les dades dels primers 10 paisos. Dibuixeu i interpreteu aquest grà fic.
library(reshape2)
##
## Attaching package: 'reshape2'
## The following object is masked from 'package:tidyr':
##
## smiths
years_complete <- na.omit(years)
head(years_complete)
## # A tibble: 6 × 13
## TIME `2011` `2012` `2013` `2014` `2015` `2016` `2017` `2018` `2019` `2020`
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Europea… 61.4 61.3 61 61.3 62.8 64 63.9 64 64.6 64
## 2 Belgium 63.5 64.6 63.9 64.1 64.2 63.7 63.7 63.4 62.4 63.8
## 3 Bulgaria 64 63.9 64.5 64 63.2 65.7 64.5 65.8 66.3 65.6
## 4 Czechia 62.9 63.2 63.3 64.1 63 63.3 61.4 62.7 62 61.6
## 5 Denmark 61.8 61.4 60.5 60.9 59.1 60.3 59.7 60.9 58.9 58
## 6 Germany 58.2 57.6 57.4 56.5 66.4 66.4 66 65.8 66.3 65.7
## # ℹ 2 more variables: `2021` <dbl>, `2022` <dbl>
top_10_countries <- years_complete[2:11, ]
# Convertir el data frame a formato llarg per graficar
years_melted <- melt(top_10_countries, id.vars = "TIME")
ggplot(years_melted, aes(x = variable, y = value, group = TIME, color = TIME)) +
geom_line() +
geom_point() +
theme_minimal() +
labs(title = "Evolució de les dades dels primers 10 paisos",
x = "Any",
y = "Valor",
color = "Pais")
# Grà fic de lÃnies per veure l'evolució de les dades dels 10 primers paisos
matplot(t(top_10_countries), type='l', lty=1, col=rainbow(10),
main="Evolució dels primers 10 paisos",
xlab="Any", ylab="Valor", lwd=2)
## Warning in xy.coords(x, y, xlabel, ylabel, log = log, recycle = TRUE): NAs
## introduced by coercion
## Warning in xy.coords(x, y, xlabel, ylabel, log): NAs introduced by coercion
## Warning in xy.coords(x, y): NAs introduced by coercion
## Warning in xy.coords(x, y): NAs introduced by coercion
## Warning in xy.coords(x, y): NAs introduced by coercion
## Warning in xy.coords(x, y): NAs introduced by coercion
## Warning in xy.coords(x, y): NAs introduced by coercion
## Warning in xy.coords(x, y): NAs introduced by coercion
## Warning in xy.coords(x, y): NAs introduced by coercion
## Warning in xy.coords(x, y): NAs introduced by coercion
## Warning in xy.coords(x, y): NAs introduced by coercion
# Afegir llegenda
legend("topright", legend=rownames(top_10_countries), col=rainbow(10), lty=1)
7.2. [0.5 punts] Realitzeu un histograma de la variable 2022.
ggplot(years_complete, aes(x = `2022`)) +
geom_histogram(binwidth = 5, fill = "blue", color = "black", alpha = 0.7) +
theme_minimal() +
labs(title = "Distribució de la variable 2022",
x = "Valor de 2022",
y = "Frequència")