Comencem carregant els paquets d’R que utilitzarem:

library(dplyr)
library(readr)
library(gtsummary)

El conjunt de dades hitters

El conjunt hitters conté onze característiques de diferents jugadors de beisbol de les lligues professionals. El nom de les columnes són:

  • PlayerName: Nom del jugador.
  • Salary: Salari en començar la lliga el 1987.
  • AtBat: Nombre de vegades batejant el 1986.
  • Hits: Nombre de batades el 1986.
  • CAtBat: Nombre de vegades batejant al llarg de la carrera.
  • CHits: Nombre de batejades al llarg de la carrera.
  • HmRun: Nombre de batades fora del camp 1986.
  • CHmRun: Nombre de batades fora del camp al llarg de la carrera.
  • Years: Nombre d’anys a les lligues professionals.
  • League: Lliga professional que es juga (‘A’ americana, ‘N’ nacional) al final del 1986.
  • Division: Divisió que es juga (‘E’ est, ‘W’ oest) al final del 1986.

Nosaltres treballarem amb una mostra de la base de 100 observacions.

hitters = read_tsv('hitters_mostra.tsv')

Comprovem que hàgim correctament les dades:

glimpse(hitters)
## Rows: 100
## Columns: 11
## $ PlayerName <chr> "-Alan Ashby", "-Alvin Davis", "-Andre Dawson", "-Andres Ga…
## $ Salary     <dbl> 475.000, 480.000, 500.000, 91.500, 750.000, 70.000, 100.000…
## $ AtBat      <dbl> 315, 479, 496, 321, 594, 185, 298, 323, 401, 574, 202, 418,…
## $ Hits       <dbl> 81, 130, 141, 87, 169, 37, 73, 81, 92, 159, 53, 113, 60, 43…
## $ CAtBat     <dbl> 3449, 1624, 5628, 396, 4408, 214, 509, 341, 5206, 4631, 187…
## $ CHits      <dbl> 835, 457, 1575, 101, 1133, 42, 108, 86, 1332, 1300, 467, 39…
## $ HmRun      <dbl> 7, 18, 20, 10, 4, 1, 0, 6, 17, 21, 4, 13, 0, 7, 20, 2, 8, 1…
## $ CHmRun     <dbl> 69, 63, 225, 12, 19, 1, 0, 6, 253, 90, 15, 41, 4, 36, 177, …
## $ Years      <dbl> 14, 3, 11, 2, 11, 2, 3, 2, 13, 10, 9, 4, 6, 13, 15, 5, 8, 1…
## $ League     <chr> "N", "A", "N", "N", "A", "N", "A", "N", "A", "A", "N", "N",…
## $ Division   <chr> "W", "W", "E", "E", "W", "E", "W", "W", "E", "E", "W", "E",…

Taula descriptiva

Descriu, excepte el nom, totes les variables del teu conjunt de dades. Mostra les característiques en una taula. Per les variables numèriques cal que la descriptiva contingui una mesura de centralitat i una mesura de variabilitat. Per les variables categòriques cal mostrar les freqüències absolutes i relatives. Per crear la taula descriptiva pots ajudar-te del paquet gtsummary, amb el que pots crear taules en una gran varietat de formats.

Es mostra la descriptiva de les variables del conjunt de dades. Les variables numèriques (Salary,AtBat,Hits,CAtBat,CHits,HmRun,CHmRun,Years) mostrem la mitjana i la desviació estàndard. Les variables categòriques (League,Division) mostrem la freqüència absoluta i relativa. Utilitzarem l’eina summarise.

summarise(hitters,
          SalaryAVG = mean(Salary, na.rm=TRUE),
          SalarySD = sd(Salary, na.rm=TRUE),
          AtBatAVG = mean(AtBat, na.rm=TRUE),
          AtBatSD = sd(AtBat, na.rm=TRUE),
          HitsAVG = mean(Hits, na.rm=TRUE),
          HitsSD = sd(Hits, na.rm=TRUE),
          CAtBatAVG = mean(CAtBat, na.rm=TRUE),
          CAtBatSD = sd(CAtBat, na.rm=TRUE),
          CHitsAVG = mean(CHits, na.rm=TRUE),
          CHitsSD = sd(CHits, na.rm=TRUE),
          HmRunAVG = mean(HmRun, na.rm=TRUE),
          HmRunSD = sd(HmRun, na.rm=TRUE),
          YearsAVG = mean(Years, na.rm=TRUE),
          YearsSD = sd(Years, na.rm=TRUE),
          LeagueNABS = sum(League=='N'),
          LeagueNRE = LeagueNABS/nrow(hitters),
          LeagueAABS = sum(League=='A'),
          LeagueARE = LeagueAABS/nrow(hitters),
          DivisionEABS = sum(Division=='E'),
          DivisionERE = DivisionEABS/nrow(hitters),
          DivisionWABS = sum(Division=='W'),
          DivisionWRE = DivisionWABS/nrow(hitters)) %>% t()
##                     [,1]
## SalaryAVG     573.346740
## SalarySD      470.332413
## AtBatAVG      400.180000
## AtBatSD       140.562965
## HitsAVG       106.580000
## HitsSD         42.661974
## CAtBatAVG    2986.620000
## CAtBatSD     2444.286687
## CHitsAVG      806.290000
## CHitsSD       679.524586
## HmRunAVG       12.940000
## HmRunSD         9.030610
## YearsAVG        7.890000
## YearsSD         4.984613
## LeagueNABS     45.000000
## LeagueNRE       0.450000
## LeagueAABS     55.000000
## LeagueARE       0.550000
## DivisionEABS   43.000000
## DivisionERE     0.430000
## DivisionWABS   57.000000
## DivisionWRE     0.570000

Utilitzarem l’eina tbl_summary.

hitters %>%
  select(Salary, AtBat, Hits, CAtBat, CHits, HmRun, CHmRun, Years,League, Division) %>%
  tbl_summary(
    type = list(all_continuous() ~ "continuous2",all_categorical() ~ "categorical"),
    statistic = list(all_continuous() ~ c("{mean} ({sd})"),all_categorical() ~ "{n} ({p}%)")
  )
Characteristic N = 1001
Salary
    Mean (SD) 573 (470)
AtBat
    Mean (SD) 400 (141)
Hits
    Mean (SD) 107 (43)
CAtBat
    Mean (SD) 2,987 (2,444)
CHits
    Mean (SD) 806 (680)
HmRun
    Mean (SD) 13 (9)
CHmRun
    Mean (SD) 88 (95)
Years
    Mean (SD) 7.9 (5.0)
League
    A 55 (55%)
    N 45 (45%)
Division
    E 43 (43%)
    W 57 (57%)
1 n (%)

Sobre el quocient entre el nombre de batades

Primerament, crearàs dues variables que mesuren el rendiment de la batada de cada jugador l’any 1986 i al llarg de la seva carrera:

  1. Crea una nova variable anomenada AVG que contingui el quocient entre el nombre de batades (Hits) i el nombre de vegades que s’ha estat batejant (AtBat).

    Es crea una nova variable AVG que conté la divisió del nombre de batades (Hits) entre el nombre de vegades que s’ha estat batejant (AtBat).

    hitters$AVG <- hitters$Hits/hitters$AtBat
  2. Fes el mateix amb el nombre de batades al llarg de la carrera (CHits) i el nombre de vegades que s’ha estat batejant (CAtBat). Guarda la nova variable com CAVG.

    Es crea una nova variable CAVG que conté la divisió del nombre de batades al llarg de la carrera (CHits) entre el nombre de vegades que s’ha estat batejant (CAtBat).

    hitters$CAVG <- hitters$CHits/hitters$CAtBat

Voldríem aplicar una transformació a la variable AVG, de manera que puguem assumir que la nova variable és normal. Per ordre de preferència, voldríem: 1. No transformar la variable, 2. Fer una transformació logarítmica, 3. Fer una transformació exponencial.

  1. Segons l’ordre de preferència establert, quina transformació aplicaries a la teva variable? Mostra visualment les tres opcions, i els contrastos plantejats per donar suport a la transformació proposada.

    #H0: ÉS NORMAL 
    #H1: NO ÉS NORMAL
    
    # Comprovar la normalitat amb el test de Shapiro-Wilk
    shapiro.test(hitters$AVG)
    ## 
    ##  Shapiro-Wilk normality test
    ## 
    ## data:  hitters$AVG
    ## W = 0.97534, p-value = 0.05741
    # Si el p-valor és inferior a 0.05, llavors la variable no és normal i es pot aplicar una transformació.
    #En aquest cas el p-valor és superior a 0.05, podem assumir que és normal.
    
    # Mostrar Sense Transformaió
    hist(hitters$AVG, main="Sense Transformaió", xlab="AVG")

    # Transformació logarítmica
    hitters$log_AVG <- log(hitters$AVG)
    
    # Comprovar de nou la normalitat
    shapiro.test(hitters$log_AVG)
    ## 
    ##  Shapiro-Wilk normality test
    ## 
    ## data:  hitters$log_AVG
    ## W = 0.9847, p-value = 0.302
    # Mostrar amb Transformaió Logaritmica
    hist(hitters$log_AVG, main="Transformaió Logaritmica", xlab="log_AVG")

    # Si encara no és normal, es pot provar una transformació exponencial
    hitters$exp_AVG <- exp(hitters$AVG)
    
    # Comprovar de nou la normalitat
    shapiro.test(hitters$exp_AVG)
    ## 
    ##  Shapiro-Wilk normality test
    ## 
    ## data:  hitters$exp_AVG
    ## W = 0.97015, p-value = 0.02271
    # Mostrar amb Transformaió Exponencial
    hist(hitters$exp_AVG, main="Transformaió Exponencial", xlab="exp_AVG")

  2. Treballant amb les variables AVG i CAVG sense transformar, creus que el rendiment mitjà en la batada de l’any 1986 ha empitjorat el rendiment mitjà observat al llarg de la carrera dels jugadors?

    # Calcula la mitjana de AVG a l'any 1986 i CAVG 
    mean(hitters$AVG)
    ## [1] 0.2626342
    mean(hitters$CAVG)
    ## [1] 0.2614057
    #El rendiment mitjà en la batada de l'any 1986 no ha empitjorat el rendiment mitjà observat al llarg de la carrera dels jugadors

Sobre la relació entre el salari i la variable CAVG

  1. Crea una taula que contingui els 15 jugadors amb salaris més alts i els 15 jugadors amb salaris més baixos del teu conjunt de dades. Creus que el rendiment de la batada al llarg de la carrera (CAVG) dels jugadors més ben pagats és diferent que la dels jugadors amb salaris més baixos?

    maxSalary <- head(arrange(hitters,desc(hitters$Salary)), 15)
    mean(maxSalary$CAVG)
    ## [1] 0.2853058
    minSalary <- tail(arrange(hitters,desc(hitters$Salary)), 15)
    mean(minSalary$CAVG)
    ## [1] 0.2395947
    #???????????????????

Sobre la relació entre les diferents lligues envers l’AVG

Treballant amb tota la mostra:

  1. Crea una variable AVG_median que indiqui si un jugador té el valor de la variable AVG per sobre la mediana de la mostra.

    hitters$AVG_median <- hitters$AVG>median(hitters$AVG)
  2. Crea una segona variable League_Division que contingui la informació de la variable League i Division conjuntament. Aquesta nova variable haurà de contenir quatre categories.

    hitters$League_Division  <- paste(hitters$League,hitters$Division,sep="")

Amb les variables creades:

  1. Descriu numèricament i gràficament les variables AVG_median i League_Division per separat i conjuntament.

    ##??????
    summarise(hitters,
              AVG_medianAVG = mean(AVG_median, na.rm=TRUE),
              AVG_medianSD = sd(AVG_median, na.rm=TRUE))
    ## # A tibble: 1 × 2
    ##   AVG_medianAVG AVG_medianSD
    ##           <dbl>        <dbl>
    ## 1           0.5        0.503
    summarise(hitters,
              NE_ABS = sum(League_Division=='NE'),
              NE_RE = NE_ABS/nrow(hitters),
              NW_ABS = sum(League_Division=='NW'),
              NW_RE = NW_ABS/nrow(hitters),
              AE_ABS = sum(League_Division=='AE'),
              AE_RE = AE_ABS/nrow(hitters),
              AW_ABS = sum(League_Division=='AW'),
              AW_RE = AW_ABS/nrow(hitters))
    ## # A tibble: 1 × 8
    ##   NE_ABS NE_RE NW_ABS NW_RE AE_ABS AE_RE AW_ABS AW_RE
    ##    <int> <dbl>  <int> <dbl>  <int> <dbl>  <int> <dbl>
    ## 1     16  0.16     29  0.29     27  0.27     28  0.28
    summarise(hitters,
              AVG_medianAVG = mean(AVG_median, na.rm=TRUE),
              AVG_medianSD = sd(AVG_median, na.rm=TRUE),
              NE_ABS = sum(League_Division=='NE'),
              NE_RE = NE_ABS/nrow(hitters),
              NW_ABS = sum(League_Division=='NW'),
              NW_RE = NW_ABS/nrow(hitters),
              AE_ABS = sum(League_Division=='AE'),
              AE_RE = AE_ABS/nrow(hitters),
              AW_ABS = sum(League_Division=='AW'),
              AW_RE = AW_ABS/nrow(hitters))
    ## # A tibble: 1 × 10
    ##   AVG_medianAVG AVG_medianSD NE_ABS NE_RE NW_ABS NW_RE AE_ABS AE_RE AW_ABS AW_RE
    ##           <dbl>        <dbl>  <int> <dbl>  <int> <dbl>  <int> <dbl>  <int> <dbl>
    ## 1           0.5        0.503     16  0.16     29  0.29     27  0.27     28  0.28
    # Gràfic de AVG_median
    barplot(table(hitters$AVG_median), main = "Barra de AVG_median", xlab = "AVG_median")

    # Gràfic de League_Division
    barplot(table(hitters$League_Division), main = "Barra de League_Division", xlab = "League_Division")

  2. Creus que la mitjana de variable AVG és diferent respecte la variable League_Division?

    NE <- filter(hitters,League_Division=='NE')
    mean(NE$AVG, na.rm=TRUE)
    ## [1] 0.2581327
    NW <- filter(hitters,League_Division=='NW')
    mean(NW$AVG, na.rm=TRUE)
    ## [1] 0.2604187
    AE <- filter(hitters,League_Division=='AE')
    mean(AE$AVG, na.rm=TRUE)
    ## [1] 0.2645728
    AW <- filter(hitters,League_Division=='AW')
    mean(AW$AVG, na.rm=TRUE)
    ## [1] 0.2656318
  3. Creus que la variable AVG_median depèn de la variable League_Division?

    lm(hitters$AVG_median ~ hitters$League_Division)
    ## 
    ## Call:
    ## lm(formula = hitters$AVG_median ~ hitters$League_Division)
    ## 
    ## Coefficients:
    ##               (Intercept)  hitters$League_DivisionAW  
    ##                   0.51852                    0.08862  
    ## hitters$League_DivisionNE  hitters$League_DivisionNW  
    ##                  -0.08102                   -0.10473

Sobre la predicció del salari d’un jugador

Hem construït un model per predir el salari mitjà dels jugadors fent servir les variables: Years, AVG, CAVG,HmRun, CHmRun, League i Division. Per seleccionar les variables hem fet servir el mètode de selecció automàtica backward-forward implementat a la funció step() d’R valorant cada model amb el criteri AIC.

  1. Quines són les variables seleccionades per aquest mètode de selecció?, i l’AIC del model obtingut?
  2. Fent servir alguna transformació de les 7 variables, proposa un nou model que millori l’AIC del model obtingut a l’apartat anterior.
  3. Argumenta si es compleixen les assumpcions del model obtingut.