Comencem carregant els paquets d’R que utilitzarem:
library(dplyr)
library(readr)
library(gtsummary)
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",…
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 (%) |
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:
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
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.
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")
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
CAVG
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
#???????????????????
Treballant amb tota la mostra:
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)
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:
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")
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
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
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.