Download as pdf or txt
Download as pdf or txt
You are on page 1of 22

Solució exercici voluntari 1

Consultes sobre la solució enferrofa@gmail.com

Contents
Part A: D’excel a R 2

Part B: Estudiant l’índex de massa corporal (IMC) 3


2 (a) Distribució de les alçades estratificades per gènere . . . . . . . . . . . . . . . . . . . . . . . . 4
2 (b) Normalitat de l’alçada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3 (a) Càlcul de l’índex de massa corporal (IMC) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3 (b) Exploració inicial de l’IMC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3 (c) Classificacions d’obesitat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

Part C: Una mica més teòric 13


4 (a-b) Distribució de les mitjanes i variàncies mostrals de les alçades . . . . . . . . . . . . . . . . 13
4 (c) Efecte del canvi de mida mostral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

Part D: Transport fins la FEE 15


5 Tractabilitat de la variable transport . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
6 Distribució del temps fins la FEE en transport públic . . . . . . . . . . . . . . . . . . . . . . . . 17
7 Normalitat del temps fins la FEE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

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

Part F: Ús de les apps 21


10 Exploració lliure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

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

Afegim les llibreries que anem utilitzant.


library(readxl) # llegir excel
library(tables) # taules
library(ggplot2) # gràfics
library(cowplot) # gràfics
library(ggeasy) # gràfics
library(dplyr) # manipulació de dades

Importem, renombrem les variables i fem una ullada.


df <- read_xlsx( path = "data.xlsx", sheet = 1, col_names = T)
colnames(df) <- c("neix", "genere","pes", "alt", "colze", "peu", "transport", "temps", "apps")
head(df, 3)

## # 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~

cat("La mida mostral és:", nrow(df))

## La mida mostral és: 41

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)

## Min. 1st Qu. Median Mean 3rd Qu. Max.


## 47.00 57.00 67.00 68.32 75.00 175.00

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.

Ara, ens fixem en la variable alçada: alt


summary(df$alt)

## Min. 1st Qu. Median Mean 3rd Qu. Max.


## 1.73 168.00 175.00 170.02 180.00 192.00

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),]

Sembla que ho tenim tot preparat per començar l’apartat.


summary(df2)

## alt pes genere


## Min. :159.0 Min. :47.00 Noi :23
## 1st Qu.:168.0 1st Qu.:56.50 Noia:17
## Median :174.5 Median :66.50
## Mean :174.2 Mean :65.65
## 3rd Qu.:180.0 3rd Qu.:74.25
## Max. :192.0 Max. :93.00

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

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

160 170 180 190

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

Histograma de la variable alçada

160 170 180 190


Alçada en centímetres

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

Boxplot de l'alçada dels nois

170 175 180 185 190

# histograma pels nois


ggplot(filter(df2, genere == "Noi"), 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 l'alçada dels nois")

6
Histograma de l'alçada dels nois

170 175 180 185 190


Alçada en centímetres

df2 %>% filter(genere == "Noi") %>%


select(alt) %>% unlist() %>% shapiro.test()

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

Boxplot de l'alçada de les noies

160 165 170 175 180

# histograma per les noies


ggplot(filter(df2, genere == "Noia"), 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") +

7
labs( x = "Alçada en centímetres", y = "", title ="Histograma de l'alçada de les noies")

Histograma de l'alçada de les noies

160 165 170 175 180


Alçada en centímetres

df2 %>% filter(genere == "Noia") %>%


select(alt) %>% unlist() %>% shapiro.test()

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

## Min. 1st Qu. Median Mean 3rd Qu. Max.


## 17.96 18.97 21.46 21.54 23.23 28.70

3 (b) Exploració inicial de l’IMC


A l’hora d’analitzar qualsevol cosa és molt important familiaritzar-nos amb el tema. Així podrem interpretar
i entendre què signifiquen els números, per la seva conexió al món real. En aquest cas, una suggerència
és l’article que teniu al campus virtual: Healthy for Life. Aquest parla de l’obesitat infantil en minories
dels EEUU. És interessant com connecta les dades als mètodes de mostratge i al l’utilitat real. Comenta
algunes característiques del IMC i també parla de temes més avançats com el tractament de missings o l’ús
de Mixture models.
En aquest cas farem una breu descriptiva: Estem interessats en veure quina localització i dispersió té l’IMC,
així com la simetria i el pes de les cues.
Comencem generant una taula amb estadístics resum on distingim per genere:
tabular( (genere + 1) ~ (n=1) + Format(digits = 3) *
(imc)*(mean + median + sd + min + max), data = df2 )

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

17.5 20.0 22.5 25.0 27.5


IMC

ggplot(df2, aes(x = imc)) +


geom_histogram(aes(y = ..density.., fill = genere), bins = 8, col = "white") +
geom_density(col="black",lwd=1.5) + easy_remove_axes("y") +
labs(x = "IMC", title = "Histograma de l'IMC estratificat per gènere")

Histograma de l'IMC estratificat per gènere

genere
Noi
Noia

17.5 20.0 22.5 25.0 27.5 30.0


IMC

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.

ggplot(df2, aes(x = imc)) +


geom_density(colour = "black", fill = "black") +
geom_density(aes (x = imc, fill = genere), alpha = .7) +
labs( x = "IMC", y = "", title ="Densitat de l'IMC estratificat per gènere")

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

Ara, ens preguntem quina és la proporació de nois i noies a cada categoria.


for(g in levels(df2$genere)){
k <- sum(df2$genere == g)
for(c in levels(df2$obesitat)){
r <- sum(df2$genere == g & df2$obesitat == c)/k
cat("La proporció de", g, "classificats com a", c, "és", round(r, digits = 4), "\n")
}
}; rm(g, k, c)

## La proporció de Noi classificats com a adequat és 0.7826


## La proporció de Noi classificats com a desnutrit és 0.087
## La proporció de Noi classificats com a sobrepes és 0.1304
## La proporció de Noia classificats com a adequat és 0.7647
## La proporció de Noia classificats com a desnutrit és 0.1765
## La proporció de Noia classificats com a sobrepes és 0.0588

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

4 (c) Efecte del canvi de mida mostral


Presentem una gràfica de la distribució de X n amb n = 15 i n = 30.
mu <- mean(df$alt); sig <- sd(df$alt)

curve(dnorm(x, mu, sig/sqrt(15)), col = "green", lwd = 4,


xlim = c(mu-3.5*sig/sqrt(15), mu+3.5*sig/sqrt(15)),
ylim = c(0, .5), xlab = "Alçades (cm)", ylab = "Densitat")

curve(dnorm(x, mu, sig/sqrt(30)), col = "purple", lwd = 4,


xlim = c(mu-3.5*sig/sqrt(30), mu+3.5*sig/sqrt(30)),
ylim = c(0, .5), add = T)

legend("topright",col = c("green", "purple"), pch = 16,


bty = "n", legend = c("Mostra tamany 15","Mostra tamany 30"))
title("Distribució de la mitjana mostral")

Distribució de la mitjana mostral

Mostra tamany 15
0.4

Mostra tamany 30
Densitat

0.2
0.0

170 175 180

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

curve(dchisq(x, df = 29), col = "purple", lwd = 4,


xlim = c(0,50), ylim = c(0,0.18),
xlab = "Variància mostral", ylab = "Densitat", add = T)

legend("topright", col =c ("green", "purple"), pch = 16,


bty = "n", legend = c("Mostra tamany 15", "Mostra tamany 30"))

title("Distribució de la variància mostral")

Distribució de la variància mostral

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)

# list amb el vector de transports de cada estudiant


transport_persona <- strsplit(df$transport, split = ", ")

# vector amb tots els transports que els enquestats utilitzen


tipus_transport <- transport_persona %>% unlist() %>% unique(); tipus_transport

## [1] "En tren (rodalies)" "En bus/metro/tramvia" "A peu (exclussivament)"


## [4] "En cotxe" "En moto" "En bici"

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

## id Rodalies BMT Caminant Cotxe Moto Bici


## [1,] 1 1 1 0 0 0 0
## [2,] 2 0 1 0 0 0 0
## [3,] 3 0 1 1 0 0 0

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)

## Rodalies BMT Caminant Cotxe Moto Bici


## 0.19512195 0.78048780 0.12195122 0.04878049 0.04878049 0.04878049
Podem dibuixar un diagrama de barres del nombre d’estudiants que utilitzen cada tipus de transport per
arribar a la FEE:
par(cex = 1)
barplot(colSums(M[,-1]),
main = "Quants estudiants utilitzen cada mitjà de transport?", las = 1)

Quants estudiants utilitzen cada mitjà de transport?

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

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

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

Violinplot de la talla de sabata estratificada per gènere

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

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

# vector amb tots els transports que els enquestats utilitzen


tipusapps <- appsperson %>% unlist() %>% unique()

# matriu anàloga a la de la variable transports, ara per la variable apps


M2 <- lapply(appsperson, FUN = f , fact = tipusapps)
M2 <- matrix(data = unlist(M2), ncol = length(tipusapps), byrow = T) %>% cbind(df$id,.)
colnames(M2) <- c("id",tipusapps); head(M2, 3)

## id Instagram Twitter WhatsApp Altres BeReal TikTok Telegram Facebook


## [1,] 1 1 1 1 1 0 0 0 0
## [2,] 2 0 0 1 0 0 0 0 0
## [3,] 3 1 0 1 1 0 0 0 0
• Quina proporció d’estudiants utilitza cada app?
round(colSums(M2[,-1])/nrow(M2), digits = 3)

## Instagram Twitter WhatsApp Altres BeReal TikTok Telegram Facebook


## 0.878 0.512 1.000 0.268 0.415 0.512 0.146 0.024

• Quants mitjans de transport utilitza l’estudiant promig?


rowSums(M2[,-1]) %>% mean() %>% round(digits = 3)

## [1] 3.756

• Quines són les tres combinacions d’apps més comuns?


df$apps %>% factor() %>% summary() %>% sort(decreasing = T) %>% .[1:3]

## TikTok, Instagram, Twitter, BeReal, WhatsApp


## 7
## Instagram, WhatsApp
## 4
## TikTok, Instagram, Twitter, WhatsApp
## 4

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)

ggplot(df4, aes(x = temps, y = napps)) +


geom_point() +
geom_abline(intercept = reg2$coefficients[1], slope = reg2$coefficients[2]) +
labs( x = "Temps fins la FEE", y = "Nombre d'apps utilitzades",
title = "Contra més es tardi fins la FEE més apps s'utilitzen?")

Contra més es tardi fins la FEE més apps s'utilitzen?


6
Nombre d'apps utilitzades

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

You might also like