Professional Documents
Culture Documents
SOL Ex Voluntari 1 2023
SOL Ex Voluntari 1 2023
Contents
Part A: D’excel a R 2
Part E: Relació entre l’alçada, allargada del colze al dit i talla de sabates 19
8 Distribució de la talla de sabates segons el gènere . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
9 Relacions entre alçada, distància del colze al dit i talla de sabates . . . . . . . . . . . . . . . . . . 20
1
Part A: D’excel a R
Borrem els objects i definim el directori on treballarem.
rm(list=ls())
setwd("~/UPC/beca/ex_voluntari_1")
## # A tibble: 3 x 9
## neix genere pes alt colze peu transport temps apps
## <dttm> <chr> <dbl> <dbl> <dbl> <dbl> <chr> <dbl> <chr>
## 1 2003-12-28 00:00:00 Noi 70 182 40 43 En tren (rodal~ 70 Inst~
## 2 2003-05-05 00:00:00 Noia 57 172 43 41 En bus/metro/t~ 20 What~
## 3 2002-08-10 00:00:00 Noi 75 182 45 44 A peu (excluss~ 75 Inst~
Codificarem genere com a factor ja que només té tres possibles eleccions. En canvi les variables apps i
transport corresponen a preguntes de múltiple elecció. Per tant aquestes dues últimes variables podrien
arribar a tenir, per n opcions seleccionables, fins a tantes categories com:
n n
X n! X n
=
i=0
i!(n − i)! i=0
i
Llavors transport, que té 6 categories diferents, seria una variable amb 63 factors i apps en tindria 511 per
delimitar totes les possibles combinacions entre les seves 9 categories. De moment no modificarem apps ni
transport.
df$genere <- factor(df$genere)
2
Part B: Estudiant l’índex de massa corporal (IMC)
En aquest apartat utilitzarem les variables alçada i pes per calcular l’IMC. És convenient fer-ne una exploració
preliminar per identificar possibles errors de en les respostes de l’enquesta. Comencem pel pes: pes
summary(df$pes)
Crida l’atenció el màxim de 175kg, però no és necessàriament incorrecte. Potser si ens fixem en l’observació
completa esbrinarem informació rellevant.
df[which.max(df$pes),]
## # A tibble: 1 x 9
## neix genere pes alt colze peu transport temps apps
## <dttm> <fct> <dbl> <dbl> <dbl> <dbl> <chr> <dbl> <chr>
## 1 2004-05-27 00:00:00 Noi 175 176 43 43 En bici, En bu~ 15 Inst~
Es tracta d’un noi de 18 anys que fa 176cm d’alt i utilitza la bici per venir a la FEE. Entenem que 175kg és
una dada errònia i l’ometrem per aquest apartat.
De nou, trobem una alçada improbable: 1.73cm. En aquest cas sembla que es va donar l’alçada en metres
enlloc de centímetres: Cambiem-ho al df.
df[which.min(df$alt), "alt"] <- df[which.min(df$alt), "alt"] * 100
Sovint, utilitzar una taula que només contingui les variables que utilitzarem simplifica la feina. En aquest
cas utilitzarem alt, pes i genere. No inclourem l’observació amb un pes incorrecte, però la mantenim al df
original.
df2 <- df %>% select(alt, pes, genere) %>% .[-which.max(df$pes),]
3
2 (a) Distribució de les alçades estratificades per gènere
Podem començar donant un cop d’ull als estadístics resum habituals. Sembla que la distribució de l’alçada
dels nois està centrada més a la dreta que la de les noies mentre que la dispersió aparentment és la mateixa.
Aquests resultats coincideixen amb el que esperaríem: Els nois són lleugerament més alts que les noies (en
termes generals) i la variabilitat és similar.
tabular( (genere + 1) ~ (n=1) + Format(digits = 3) *
(alt)*(mean + median + sd + min + max), data = df2 )
alt
genere n mean median sd min max
Noi 23 179.09 178.00 5.98 171.00 192.00
Noia 17 167.47 168.00 5.99 159.00 180.00
All 40 174.15 174.50 8.29 159.00 192.00
Una manera de fer-nos una primera idea de la forma d’una distribució és dibuixant-la. Tracem la funció de
densitat empírica de la variable alt estratificada per genere en color blau per les noies i vermell per les noies.
També ho fem per l’alçada de tots els estudiants, sense estratificar en negre.
ggplot(df2, aes(x = alt)) +
geom_density(alpha = 2, colour = "black", fill = "black") +
geom_density(alpha = .7, aes(fill = genere)) +
labs( x = "Alçada en centímetres", y = "",
title ="Densitat d'alçada estratificada per gènere")
0.06
0.04 genere
Noi
Noia
0.02
0.00
160 170 180 190
Alçada en centímetres
L’interpretació del gràfic coincideix amb la de la taula d’estadístics: Dispersió similar i localització més
a la dreta pels nois. El conjunt d’observacions (en negre) s’apropa més a la simetria que no pas les v.a
estratificades. Segurament aquesta assimetria és deguda a la mida mostral.
4
2 (b) Normalitat de l’alçada
Ara ens preguntem si les dades provenen d’una distribució normal. A vista del gràfic anterior sospitem que
aquest és el cas. A més la naturalesa de les dades convida a pensar que són normals. Si no estem convençuts,
podem traçar un parell de gràfics més: Un boxplot i un histograma.
# boxplot
ggplot(df2, aes(x = alt)) +
geom_boxplot() + easy_remove_axes("y") +
labs( x = "", y = "", title ="Boxplot de l'alçada")
Boxplot de l'alçada
# histograma
ggplot(df2, aes(x = alt)) +
geom_histogram(aes(y = ..density..), bins = 8, fill = "darkgreen", col = "white") +
geom_density(col="red",lwd=1.5) + easy_remove_axes("y") +
labs( x = "Alçada en centímetres", y = "", title ="Histograma de la variable alçada")
5
Els gràfics resultants són compatibles amb la normalitat. Tant el boxplot com l’histograma mostren certa
simetria, pero no són del tot convincents. Un enfocament més formal és realitzar un prova d’hipòtesis. En
aquest cas escollim la prova de Shapiro-Wilk. Una prova de normalitat alternatiu és el de Anderson Darling
shapiro.test(df2$alt)
##
## Shapiro-Wilk normality test
##
## data: df2$alt
## W = 0.98053, p-value = 0.7093
Per interpretar qualsevol prova d’hipòtesis és molt important saber què estem comprovant. Més endavant
en l’assignatura tractarem les proves d’hipòtesis (tema 4) i les proves de normalitat (tema 6). Per tant els
conceptes del següent paràgraf encara no s’han comentat a classe. Preneu-los com un “tastet” per si us pica
la curiositat.
L’hipòtesi nul·la de la prova és H0 : X ∼ N (µ, σ 2 ). Si aquesta és certa, coneixem la distribució que segueix
l’estadístic de constrast: θn ∼ F |H0 . Llavors escollim arbitràriament un nivell de confiança lligat a α (error
de tipus I: mantenir H0 quan hauríem de rebutjar-la per H1 : X ≁ N (µ, σ 2 ). Finalment comparem θn amb
els valors crítics que deixen un àrea d’α sota la funció de densitat d’F.
Ara, volem contrastar el mateix estratificant alt per genere. Comencem dibuixant un boxplot per cada
genere. En aquest cas és més complicat veure-hi la simetria habitual de la llei normal. De totes formes, es
podria argumentar que això és degut a la reduïda mida mostral. Per tant, necessitem més que l’interpretació
gràfica per extreure conclusions: Fem una prova de normalitat per cada grup.
# boxplot pels nois
ggplot(filter(df2, genere == "Noi"), aes(x = alt)) +
geom_boxplot() + easy_remove_axes("y") +
labs( x = "", y = "", title ="Boxplot de l'alçada dels nois")
6
Histograma de l'alçada dels nois
##
## Shapiro-Wilk normality test
##
## data: .
## W = 0.93557, p-value = 0.1443
# boxplot per les noies
ggplot(filter(df2, genere == "Noia"), aes(x = alt)) +
geom_boxplot() + easy_remove_axes("y") +
labs( x = "", y = "", title ="Boxplot de l'alçada de les noies")
7
labs( x = "Alçada en centímetres", y = "", title ="Histograma de l'alçada de les noies")
##
## Shapiro-Wilk normality test
##
## data: .
## W = 0.95425, p-value = 0.5271
8
3 (a) Càlcul de l’índex de massa corporal (IMC)
Seguidament, crearem una variable per l’índex de massa corporal(IMC):
pes
IMC = (alçada mesurada en metres i pes en kg)
alçada2
Com que abans hem tractat amb les possibles anomalies en les variables alt i pes, esperem que els IMC
estiguin dins del rang habitual.
df2 <- df2 %>% mutate(imc = pes/((.01*alt)**2) ); summary(df2$imc)
imc
genere n mean median sd min max
Noi 23 22.26 22.64 2.27 17.96 26.12
Noia 17 20.57 19.13 2.80 18.07 28.70
All 40 21.54 21.46 2.61 17.96 28.70
Observem que la distribució de l’IMC entre nois i noies és similar. No obstant, sembla que en termes generals
els nois de la classe d’Inferència tenen un IMC lleugerament més alt que les noies. També s’observa una
dispersió una mica més accentuada en el grup de noies. En referència a la simetria, fixem-nos en la relació
entre mitjana i mediana: Si aquestes difereixen hi ha un indici d’assimetria. En el cas de les noies la diferència
és més accentuada. Com que la mediana és “bastant” menor a la mitjana, sospitem que hi ha assimetria
positiva o cap a la dreta en la distribució de l’IMC del grup de noies. Val a dir que al tenir una mostra de 17
noies, cal fer aquests judicis amb molt de compte.
Freqüentment resulta més intuitiu acompanyar l’explicació amb un gràfic visual que amb l’interpretació
d’estadístics. Dibuixem uns boxplots, histogrames i les densitats empíriques.
ggplot(df2, aes(x = imc, fill = genere)) +
geom_boxplot() +
labs( x = "IMC", y = "", title = "Boxplot de l'IMC estratificat per gènere")
9
Boxplot de l'IMC estratificat per gènere
0.2
genere
0.0 Noi
Noia
−0.2
genere
Noi
Noia
Els gràfics coincideixen amb l’interpretació anterior. El centre de gravetat de la distribució dels nois es troba
per sobre del de les noies. Per les noies, la distància des de la mitjana fins al percentil 75 és major que fins al
25. L’oposat succeeix amb els nois, tot i que és menys accentuat. Notem una observació prou allunyada de la
resta en el grup de les noies: El pes d’aquesta en els estadístics és important ja que la mida mostal és reduïda.
10
Densitat de l'IMC estratificat per gènere
0.20
0.15
genere
0.10 Noi
Noia
0.05
0.00
17.5 20.0 22.5 25.0 27.5
IMC
Aquí es veu amb més claredat la diferència de localització de l’IMC entre noies i nois. També és més senzill
adonar-se de l’assimetria. L’interpretació conicideix amb l’anterior. Noteu com el gràfic de la densitat
conjunta és bimodal, com podríem esperar donades les distribucions que la conformen. A continuació ens
podríem preguntar si és habitual un IMC més alt en homes que en dones, quantificar-lo, per què és així. . .
11
3 (c) Classificacions d’obesitat
Seguidament, contarem les observacions d’IMC que hi ha en cada intèrval de classificacions d’obesitat. Per
exemple, prenem la de l’UE, que coincideix amb la dels EEUU. Existeix una classificació més detallada amb
un suport arbitrari IM C ≥ 30, no s’utilitza perquè a priori no sembla necessària.
• Desnutrit: IM C ≤ 18.5
• Adequat: IM C ∈ (18.5, 25]
• Sobrepès: IM C ∈ (25, 30)
• Obesitat: IM C ≥ 30
Creeem una variable factor que especifiqui en quin tram de la classificació es troba cada observació:
df2$obesitat <- factor(ifelse(df2$imc < 18.5, "desnutrit",
ifelse(df2$imc >= 18.5 & df2$imc <= 25, "adequat",
ifelse(df2$imc >= 25 & df2$imc < 30, "sobrepes", "obes")))
)
12
Part C: Una mica més teòric
4 (a-b) Distribució de les mitjanes i variàncies mostrals de les alçades
A l’apartat 2b) hem comprovat la normalitat de les dades. Per tant podem aplicar el teorema de Fisher:
iid σ2
X ∼ N (µ, σ 2 ) ⇒ X n ∼ N (µ, )
n
Pn
Per altra banda, si estem interessats en la distribució de la variància mostral Sn2 = 1
n−1 i=1 (Xi − X n )2 .
iid (n − 1)Sn2
X ∼ N (µ, σ 2 ) ⇒ ∼ χ2n−1
σ2
Mostra tamany 15
0.4
Mostra tamany 30
Densitat
0.2
0.0
Alçades (cm)
13
També fem una ullada a les gràfiques de χ214 i χ229 .
curve(dchisq(x, df = 14), col = "green", lwd = 4,
xlim = c(0,50), ylim = c(0,0.18),
xlab = "Variància mostral", ylab = "Densitat")
Mostra tamany 15
0.00 0.05 0.10 0.15
Mostra tamany 30
Densitat
0 10 20 30 40 50
Variància mostral
14
Part D: Transport fins la FEE
5 Tractabilitat de la variable transport
Abans hem comentat la gran quantitat de combinacions de transport possible, per això proposem el següent.
Crear una taula adicional on guardem l’informació sobre df$transport: Hi haurà una columna per cada
mitjà de transport que els estudiants utilitzen i una fila per cada resposta. De manera que el creuament de la
columna tipus_transport i la fila transport_persona identificarà si l’enquestat utilitza aquell determinat
mitjà de transport o no amb un 1 o un 0. Però, com sabem qui és qui? Doncs crearem un identificador: id,
que és una seqüència d’enters que distingeix unívocament cada fila. Per tant, podem relacionar l’informació
d’ambdues taules a través d’id.
# creem l'identificador
df <- cbind(id = seq(1,nrow(df)), df)
Escriurem una funció que donat un vector v i una llista de candidats fact, retorna una seqüència d’1 i 0
r que evalua si v conté un determinat candidat de fact o no. És a dir, s’evalua l’expressió lògica fact[i]
%in% v per cada element de fact i en conseqüència r. L’ordre d’identificació de l’output r correspon amb el
de fact. Així que aplicant aquesta funció f a tots els elements de la llista transport_persona obtindrem
les files de la nova taula prèviament descrita. Només faltarà afegir la clau id, que manté el mateix ordre en
tot moment.
f <- function(v, fact){
r <- c ()
for(i in fact){
if(i %in% v){
r <- c(r, 1)
}else{
r <- c(r, 0)
}
}
return(r)
}
Aplicarem la funció a la llista de transports que utilitza cada persona utilitzant com a fact els diferents tipus
de transport utilitzats.
M <- lapply(transport_persona, FUN = f , fact = tipus_transport)
M <- matrix(data = unlist(M), ncol = length(tipus_transport), byrow = T) %>% cbind(df$id,.)
colnames(M) <- c("id", "Rodalies", "BMT", "Caminant", "Cotxe", "Moto", "Bici")
head(M, 3) #BMT == bus metro o tramvia
15
• Quants mitjans de transport utilitza l’estudiant promig?
rowSums(M[,-1]) %>% mean() %>% round(digits = 3)
## [1] 1.244
• Quina proporció d’estudiants utilitza cada mitjà de transport?
colSums(M[,-1])/nrow(M)
30
25
20
15
10
0
Rodalies BMT Caminant Cotxe Moto Bici
16
6 Distribució del temps fins la FEE en transport públic
El temps normalment es considera una variable no negativa. Per tant si escollim una distribució normal no
ens assegurem d’incorporar aquesta informació ja que la llei normal assigna probabilitats positives a valors
negatius. Alguns exemples de distribucions de probabilitat amb suport positiu són:
λx e−λ
• X ∼ P oisson(λ > 0) ⇒ f (x) = x! x∈N
2
x−µ)
• X ∼ Lognormal(µ ∈ R, σ > 0) ⇒ f (x) =
2 1
√
xσ 2π
exp(− (ln 2σ 2 ) x ∈ R+
La Poisson té suport discret i la Lognormal continu. Podem considerar les observacions de temps com a
nombre de minuts (discrets) o quantitat de temps (continu). Per altra banda, si afirmem que les dades
provenen d’una determinada distribució estem assumint que totes les observacions provenen del mateix procés
generador. És possible que la distribució de temps fins a la FEE sigui diferent segons el mitjà de transport
utilitzat. Ens fixarem en la distribució de temps entre estudiants que utilitzen transport públic.
id_tpub <- M[M[,"BMT"] == 1 | M[,"Rodalies"] == 1,][,1]
df3 <- filter(df, id %in% id_tpub)
Fem un histograma i una prova de normalitat que ens ajudi a identificar la distribució:
ggplot(filter(df, id %in% id_tpub), aes(x = temps)) +
geom_histogram(aes( y = ..density.. ), binwidth = 15, col = "white", fill = "darkgreen") +
scale_x_continuous(breaks = seq(0, max(df$temps), by = 15)) +
geom_density(col = "red", lwd = 1.5) + easy_remove_y_axis() +
labs( x = "Minuts", title = "Temps fins la FEE en transport públic")
15 30 45 60 75 90 105 120
Minuts
df %>% filter(id %in% id_tpub) %>% select(temps) %>% unlist() %>% shapiro.test()
##
## Shapiro-Wilk normality test
##
## data: .
## W = 0.93101, p-value = 0.02998
El següent pas seria contrastar si les nostres dades provenen d’altres distribucions conegudes. Per fer-ho
podem estimar els paràmetres d’aquestes distribucions candidates per després fer una prova i comprovar si
realment s’hi ajusten suficientment bé.
17
7 Normalitat del temps fins la FEE
Acabem de rebutjar l’hipòtesi de que temps segueixi una distribució normal per aquells estudiants que vénen
a la FEE en transport públic. Hem arribat a aquesta conclusió a partir de considerar la naturalesa de les
dades, interpretar una representació gràfica de les dades i realitzar una prova Shapiro-Wilk. Ara, volem
contrastar la mateixa hipòtesi, però sense estratificar la v.a segons tipus de transport utilitzat. A priori,
emprant els mateixos arguments basats en què és allò que representen les dades esperem resultats similars.
Comprovem-ho amb un gràfic i una prova d’hipòtesi:
ggplot(df, aes(x = temps)) +
geom_histogram(aes( y = ..density.. ), binwidth = 15, col = "white", fill = "darkgreen") +
scale_x_continuous(breaks = seq(0, max(df$temps), by = 15)) +
geom_density(col = "red", lwd = 1.5) + easy_remove_y_axis() +
labs( x = "Minuts", title = "Temps fins la FEE en transport públic")
15 30 45 60 75 90 105 120
Minuts
De nou, no s’aprecia cap simetria d’acord amb el que esperàvem. Contrastem-ho formalment:
shapiro.test(df$temps)
##
## Shapiro-Wilk normality test
##
## data: df$temps
## W = 0.9062, p-value = 0.002541
Podem concloure que la variable temps no segueix una distribució normal. Si volem filar més prim, és possible
que temps segueixi diferents distribucions segons el mitjà de transport que s’utilitzi, així que tant això com
la distància desde casa fins la FEE serien dades que enriquirien l’anàlisi.
18
Part E: Relació entre l’alçada, allargada del colze al dit i talla de
sabates
8 Distribució de la talla de sabates segons el gènere
Volem veure com es distribueix la talla de sabates en funció del gènere. Fixem-nos en la taula d’estadístics
resum:
tabular( (genere + 1) ~ (n=1) + Format(digits = 3) *
(peu)*(mean + median + sd + min + max), data = df )
peu
genere n mean median sd min max
Noi 24 43.50 43.00 1.82 41.00 48.00
Noia 17 39.24 39.00 1.60 37.00 43.00
All 41 41.73 42.00 2.73 37.00 48.00
Com podríem esperer, en general els nois tenen una talla de sabates més gran que les noies. No tenim prou
informació per afirmar que la dispersió sigui diferent.
ggplot(df, aes(peu, genere)) +
geom_violin(aes(fill = genere), adjust = .5) +
labs( x = "Talla de sabata", y = "",
title ="Violinplot de la talla de sabata estratificada per gènere") +
easy_remove_axes(which = "y")
genere
Noi
Noia
39 42 45 48
Talla de sabata
En aquests violinplots es veu clarament que les observacions pels nois es troben més a la dreta que les de les
noies. Per les noies, s’intueix una distribució més propera a la normalitat: Sembla més simètrica tot i que la
cua esquerra sigui més curta i gruixuda que la de la dreta. En canvi la distribució pels nois és més abrupta,
té diferents modes.
19
9 Relacions entre alçada, distància del colze al dit i talla de sabates
Fem un gràfic de tipus scatterplot que creua la distància del colze al dit amb l’alçada total. La talla de
sabates serà proporcional al tamany de cada punt i el color del punt indicarà el gènere. En general, esperem
que la correlació entre les tres variables sigui positiva. Contra més distància del colze al dit més alts i major
talla de sabates.
# ajustem una línia al núvol de punts (regressió per mínims quadrats ordinaris)
reg <- lm(df$alt ~ df$colze); reg
##
## Call:
## lm(formula = df$alt ~ df$colze)
##
## Coefficients:
## (Intercept) df$colze
## 148.6671 0.5875
Sembla que la variable colze és bona a l’hora d’explicar alt, de fet tenen una correlació positiva tal com
esperàvem.
ggplot(df, aes(x = colze, y = alt)) +
geom_point( aes(size = peu, colour = genere)) +
geom_abline(intercept = reg$coefficients[1], slope = reg$coefficients[2]) +
labs( x = "Distància del colze al dit cor", y = "Alçada",
title = "Scatterplot: Alçada, distància del colze al dit i talla de sabates")
190 peu
37.5
40.0
180 42.5
Alçada
45.0
47.5
170
genere
Noi
Noia
160
30 40 50 60 70 80
Distància del colze al dit cor
Sembla que contra més amunt i a la dreta anem més grans són els punts, el que suggereix una relació positiva
entre les tres variables. Val a dir quela talla de sabates sembla ser més afectada per l’alçada que no pas per
la distància del colze al dir.
20
Part F: Ús de les apps
10 Exploració lliure
Primerament, tractarem les dades de la variable apps de la mateixa manera que hem fet amb transport.
appsperson <- strsplit(df$apps, split = ", ")
## [1] 3.756
També estem interessats en si el nombre d’apps utilitzades canvia en funció del temps necessari pr arribar a
la FEE. Fem una regressió lineal bàsica i un scatterplot.
reg2 <- lm(rowSums(M2[,-1])~df$temps); reg2
##
## Call:
## lm(formula = rowSums(M2[, -1]) ~ df$temps)
##
## Coefficients:
## (Intercept) df$temps
## 3.29913 0.01058
21
En aquesta primera inspecció, el temps fins arribar a la FEE no sembla una variable significativa a l’hora
d’explicar el nombre d’apps que utilitza cada alumne.
df4 <- data.frame( napps = rowSums(M2[,-1]), temps = df$temps)
50 100
Temps fins la FEE
Gràficament tampoc s’aprecia cap relació, per tant no trobem que el temps que necessiten els alumnes per
arribar a la FEE estigui lligat al nombre d’apps que utilitzen. Per tant, els trajectes llargs no necessàriament
impliquen que s’utilitzi més el mòbil. Entenent per ús del mòbil nombre d’aplicacions utilitzades (definició
poc rigurosa)
22