Prova d’avaluació continua 1 (PAC1)

PAC 1: ENUNCIAT

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:

  1. Conjunt de dades UScereal del paquet MASS de R que treballa amb informació nutricional i de màrqueting sobre cereals nord-americans.

  2. 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.

  3. 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.

Secció 1. Importació, exportació i gestió de dades [3 punts]

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.

Exercici 1 [1 punt]

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.

Exercici 2 [1 punt]

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)

Exercici 3. Exploració de l’entorn Rstudio i paquets associats [1 punt]

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

Secció 2: Anàlisis bàsic del conjunt de dades [3.5 punts]

L’objectiu d’aquesta secció és obtenir informació sobre un conjunt determinat de dades realitzant operacions i consultes diverses.

Exercici 4

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.

Secció 3: Estadística descriptiva i gràfics [3.5 punts]

L’objectiu és estudiar els conceptes relacionats amb estadística descriptiva i realitzar diferents tipus de gràfics amb R.

Exercici 5

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>, …
  • L’ús d’alcohol és el més alt, amb una mitjana del 55.4%
  • La marihuana és la segona substància més consumida amb una mitjana del 18.92%
  • L’ús de al·lucinògens i calmants del dolor son moderadament alts. Amb una mitja de 3.4% i 6.3 respectivament.
  • L’ús de cocaina, inhalants, calmants, estimulants, meth i sedants és molt més baix (>3%)

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.

Exercici 6 [1 punt]

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:

  • La major part dels careals es col·loquen a la estanteria 3
  • Els fabricants més grans (G i K) tenen una distribució força equilibrada, però amb predomini a la estanteria 3.
  • El fabricant P col·loca la major part dels seus productes a la prestatgeria 3 (66.67%).
  • R concentra el 80% dels seus productes a la prestatgeria 1.
  • Q concentra el 60% dels seus productes a la prestatgeria 2.

Exercici 7

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")