Che cosa restituisce la seguente istruzione?
x <- c("A", "B", NA, "A")
table(x)
Per default la funzione table esclude i valori mancanti
dal conteggio, senza segnalarlo. Per includerli si usa l'argomento
useNA = "ifany" (conta gli NA solo se
presenti) oppure useNA = "always". La funzione
tabyl di janitor, al contrario, mostra per
default la riga NA e affianca la colonna
valid_percent.
La seconda opzione è la più insidiosa: è il risultato di
table(x, useNA = "ifany"). La terza confonde le frequenze
assolute con quelle relative, che si ottengono con
prop.table(table(x)). La quarta è errata:
table gestisce senza problemi i valori mancanti.
m è una tabella doppia ottenuta con
table(categoria, genere), con la categoria in riga. Che
cosa restituisce prop.table(m, margin = 1)?
In R margin = 1 si riferisce alle righe e
margin = 2 alle colonne. Con margin = 1 ogni
cella viene divisa per il totale della sua riga: si ottengono i profili
riga (in janitor: adorn_percentages("row")).
Senza l'argomento margin, prop.table divide
per il totale generale.
La seconda opzione è la più insidiosa: è il risultato di
prop.table(m, margin = 2). La terza è il risultato di
prop.table(m). La quarta confonde prop.table
con addmargins, che aggiunge i totali di riga e di
colonna.
Qual è una differenza importante tra il risultato di
table(utenti$categoria) e quello di
tabyl(utenti, categoria)?
table è la funzione di R base per le tabelle di
frequenza e restituisce un oggetto di classe table, su cui
si lavora con funzioni come prop.table e
addmargins. tabyl restituisce un oggetto di
classe tabyl che è anche un data.frame:
contiene le frequenze assolute (n) e relative
(percent) e si integra con la pipe e con i verbi del
tidyverse.
La seconda opzione inverte le classi. La terza è la più insidiosa: il
contenuto è simile, ma la struttura dei due oggetti è diversa, e questo
determina quali funzioni si possono usare. La quarta è errata:
tabyl riporta entrambe le frequenze, e table
si combina con prop.table per ottenere quelle relative.
La tabella doppia tab è stata ottenuta con la funzione
tabyl del package janitor e contiene le
seguenti frequenze assolute:
cat n s
a 1 1
b 1 2
Che cosa restituisce la seguente istruzione?
tab |>
adorn_percentages("row") |>
adorn_totals(where = "row")
Le funzioni adorn_*() vengono applicate nell'ordine in
cui compaiono. Qui adorn_percentages("row") trasforma prima
ogni riga nel proprio profilo; adorn_totals aggiunge poi
una riga che somma i valori presenti nella tabella,
cioè proporzioni calcolate su denominatori diversi: 0.5 + 0.333 = 0.833
e 0.5 + 0.667 = 1.167. Le righe dei profili sono corrette, ma la riga
Total non ha alcun significato. Per ottenere in fondo il
profilo riga complessivo bisogna aggiungere i totali
prima di calcolare le percentuali:
tab |> adorn_totals(where = "row") |> adorn_percentages("row").
Le funzioni adorn_*() lavorano su un data frame (come il
risultato di tabyl) o su una lista di data frame: applicate
a un oggetto di classe table, ottenuto con la funzione
table di R base, restituiscono un errore
(adorn_totals() must be called on a data.frame or list of
data.frames).
La seconda opzione è errata: l'ordine sbagliato non produce errori, e
proprio per questo il risultato va controllato. La terza è la più
insidiosa: è ciò che si ottiene con l'ordine corretto delle due
funzioni. La quarta è errata: adorn_percentages trasforma
le frequenze assolute in proporzioni.
In una tabella doppia dei prestiti, con la categoria dell'utente in riga e il genere letterario in colonna, la cella "Studente - Ragazzi" vale 30.2% nei profili riga e 82.4% nei profili colonna. Quale interpretazione è corretta?
Le due percentuali hanno lo stesso numeratore (i prestiti di libri per ragazzi fatti da studenti), ma un denominatore diverso. Nel profilo riga il denominatore è il totale della riga (tutti i prestiti degli studenti); nel profilo colonna è il totale della colonna (tutti i prestiti di libri per ragazzi). Rispondono quindi a due domande diverse.
La seconda opzione è la più insidiosa: inverte i due denominatori. La
terza è errata: la stessa frequenza assoluta dà percentuali diverse a
seconda del denominatore. La quarta descrive le frequenze relative sul
totale generale (adorn_percentages("all")), che sono un
terzo tipo di percentuale.
\(X\) è una variabile casuale
Binomiale con \(n = 10\) prove e
probabilità di successo \(\pi = 0.5\).
Quale quantità calcola l'istruzione
dbinom(3, size = 10, prob = 0.5)?
In R le funzioni per i modelli di probabilità hanno un prefisso
comune: d per la funzione di massa (variabili discrete) o
di densità (variabili continue), p per la funzione di
ripartizione, q per i quantili, r per la
generazione di numeri pseudo-casuali. dbinom(3, 10, 0.5)
restituisce quindi \(P(X = 3) = \binom{10}{3}
0.5^3 \, 0.5^7 \approx 0.117\).
La seconda opzione è la più insidiosa: descrive
pbinom(3, 10, 0.5). La terza descrive la funzione quantile
qbinom, che però prende come primo argomento una
probabilità. La quarta descrive rbinom(3, 10, 0.5).
\(X\) è una variabile casuale Binomiale con \(n = 10\) e \(\pi = 0.5\). Quale istruzione calcola \(P(X \ge 5)\)?
pbinom(x, ...) calcola \(P(X
\le x)\). L'evento complementare di \(\{X \ge 5\}\) è \(\{X \le 4\}\), quindi \(P(X \ge 5) = 1 - P(X \le 4)\), cioè
1 - pbinom(4, 10, 0.5), circa 0.623. Lo stesso risultato si
ottiene con pbinom(4, 10, 0.5, lower.tail = FALSE).
La seconda opzione calcola solo \(P(X = 5)\). La terza è la più insidiosa: calcola \(1 - P(X \le 5) = P(X \ge 6)\), circa 0.377. Per le variabili discrete il valore di confine conta: \(P(X \ge 5)\) e \(P(X > 5)\) sono diverse. La quarta usa la funzione quantile con un argomento (5) che non è una probabilità.
L'istruzione dnorm(0, mean = 0, sd = 0.1) restituisce
circa 3.99. Come va interpretato questo valore?
Per una variabile continua la probabilità di un singolo valore è
nulla: \(P(X = x) = 0\). Le probabilità
corrispondono ad aree sotto la funzione di densità, e si calcolano con
la funzione di ripartizione (pnorm). Il valore della
densità non è una probabilità: con una distribuzione molto concentrata
(qui \(\sigma = 0.1\)) la densità in
prossimità della media supera 1, mentre l'area complessiva sotto la
curva resta uguale a 1.
La seconda opzione è la più insidiosa: applica alla Normale
l'interpretazione di dbinom e dpois, valida
solo per le variabili discrete. La terza è errata: il calcolo è
corretto, ed è l'interpretazione a essere diversa. La quarta descrive
pnorm(0, 0, 0.1), che vale 0.5.
Si vogliono generare 100 valori da una variabile casuale Normale con media 10 e varianza 4, cioè \(X \sim N(10, 4)\). Quale istruzione è corretta?
Le funzioni di R per la Normale (dnorm,
pnorm, qnorm, rnorm) sono
parametrizzate con lo scarto quadratico medio
(sd), non con la varianza. Con varianza 4 bisogna indicare
sd = sqrt(4) = 2.
La seconda opzione passa gli argomenti per posizione in un ordine
sbagliato: genererebbe 10 valori da una Normale con media 4 e scarto
quadratico medio 100. La terza è l'errore più frequente: interpreta il
secondo parametro come varianza, mentre sd = 4 corrisponde
a una varianza di 16. La quarta usa la funzione di densità invece di
quella che genera numeri pseudo-casuali.
\(Z\) è una variabile casuale Normale standard. Quale istruzione calcola \(P(-1.96 < Z < 1.96)\)?
La probabilità che una variabile continua cada in un intervallo è la differenza tra i valori della funzione di ripartizione negli estremi: \(P(a < Z < b) = F(b) - F(a)\). Il risultato è circa 0.95. Per una variabile continua è indifferente che gli estremi siano inclusi o esclusi.
La seconda opzione usa la densità, che non è una probabilità: per la
simmetria della Normale il risultato è 0. La terza è la più insidiosa:
calcola solo \(P(Z < 1.96)\), circa
0.975, includendo anche la coda sinistra. La quarta usa la funzione
quantile con argomenti che non sono probabilità:
qnorm(1.96) restituisce NaN con un
avvertimento.
Che cosa restituisce l'istruzione qnorm(0.975)?
La funzione quantile è l'inversa della funzione di ripartizione:
riceve una probabilità e restituisce il valore che lascia alla sua
sinistra quella probabilità. qnorm(0.975) restituisce circa
1.96, valore che si ritrova negli intervalli di confidenza al 95%. Vale
la relazione pnorm(qnorm(p)) = p.
La seconda opzione è la più insidiosa: è il risultato di
pnorm(0.975), cioè scambia la funzione quantile con la
funzione di ripartizione. La terza descrive dnorm(0.975).
La quarta descrive rnorm, che però richiede un numero
intero di valori da generare.
Il tempo (in minuti) tra due arrivi al banco prestiti è descritto da una variabile casuale Esponenziale con media 4 minuti. Quale istruzione calcola la probabilità di attendere al massimo 4 minuti?
Nell'Esponenziale con parametro \(\lambda\) la media vale \(1/\lambda\). In R il parametro si indica
con l'argomento rate, che corrisponde a \(\lambda\): con media 4 si ha \(\lambda = 1/4 = 0.25\). La probabilità
richiesta è \(P(X \le 4) = 1 - e^{-0.25 \cdot
4} = 1 - e^{-1} \approx 0.632\).
La seconda opzione è la più insidiosa: usa la media al posto del tasso, e descrive quindi un'attesa media di un quarto di minuto (la probabilità risulta praticamente 1). La terza calcola la densità in 4, che non è una probabilità. La quarta calcola la probabilità complementare, cioè di attendere più di 4 minuti.
\(X\) è una variabile casuale di Poisson con \(\lambda = 2.5\). Quale delle seguenti istruzioni non calcola \(P(X > 3)\)?
\(P(X > 3) = 1 - P(X \le 3)\),
circa 0.242. Le opzioni che non sono la risposta
corretta lo calcolano tutte: 1 - ppois(3, 2.5)
direttamente; ppois(3, 2.5, lower.tail = FALSE) restituisce
la coda destra \(P(X > 3)\);
1 - sum(dpois(0:3, 2.5)) sottrae a 1 la somma delle
probabilità dei valori da 0 a 3.
La risposta corretta è l'istruzione che si comporta diversamente:
1 - ppois(2, 2.5) calcola \(P(X
> 2) = P(X \ge 3)\), perché include anche il valore 3. È
l'errore tipico nel passaggio dal \(\ge\) al \(>\) con le variabili discrete.
Il numero di nuove iscrizioni giornaliere in una biblioteca è una
variabile di Poisson con \(\lambda =
2.5\). L'istruzione qpois(0.95, lambda = 2.5)
restituisce 5. Come si interpreta questo valore?
Per una variabile discreta la funzione di ripartizione procede a gradini, e in generale nessun valore \(x\) soddisfa esattamente \(P(X \le x) = 0.95\). Per questo il quantile è definito come il più piccolo \(x\) per cui \(P(X \le x) \ge p\). Qui \(P(X \le 4) \approx 0.891\) e \(P(X \le 5) \approx 0.958\): il quantile è 5.
La seconda opzione non ha relazione con la definizione di quantile. La terza è la più insidiosa: \(P(X \le 5)\) vale circa 0.958, non esattamente 0.95. La quarta confonde la funzione di ripartizione con la funzione di massa: \(P(X = 5) \approx 0.067\).
A che cosa serve l'istruzione set.seed(42) eseguita
prima di rnorm(3)?
I numeri "casuali" generati da R sono pseudo-casuali: sono prodotti
da un algoritmo deterministico a partire da un valore iniziale, il seme.
Fissare il seme con set.seed rende riproducibili le
simulazioni: chiunque esegua lo stesso codice ottiene gli stessi
valori.
La seconda opzione attribuisce al seme un significato che non ha. La
terza è il contrario del vero: il seme rende la sequenza riproducibile
proprio perché è pseudo-casuale. La quarta è la più insidiosa: dopo
set.seed il generatore prosegue lungo la sua sequenza, e
una seconda chiamata di rnorm(3) restituisce valori
diversi; per riottenere gli stessi valori bisogna eseguire di nuovo
set.seed(42).
Che cosa restituisce l'istruzione
rbinom(5, size = 10, prob = 0.5)?
Nelle funzioni r_ il primo argomento indica
quanti valori generare (5); gli argomenti successivi
sono i parametri del modello: per la Binomiale il numero di prove
(size = 10) e la probabilità di successo
(prob = 0.5). Ogni valore generato è un possibile numero di
successi, cioè un intero tra 0 e 10.
La seconda opzione scambia il numero di valori con il numero di
prove. La terza descrive dbinom(5, 10, 0.5). La quarta è la
più insidiosa: descrive estrazioni da una Bernoulli, che si otterrebbero
con size = 1.
Si generano 100000 valori da una variabile di Poisson con \(\lambda = 2.5\) e se ne calcolano la media e la varianza. Quali valori ci si aspetta?
In una variabile di Poisson il parametro \(\lambda\) è sia il valore atteso sia la varianza: \(E(X) = Var(X) = \lambda\). Con un numero elevato di valori generati, media e varianza campionarie sono vicine a 2.5.
La seconda opzione è la più insidiosa: è il legame tra media e varianza dell'Esponenziale (\(E(X) = 1/\lambda\), \(Var(X) = 1/\lambda^2\)), non della Poisson. La terza confonde la varianza con lo scarto quadratico medio. La quarta trascura che media e varianza calcolate su valori simulati variano da una simulazione all'altra e non coincidono esattamente con quelle teoriche.
Nella tabella utenti la colonna eta è
numerica e la colonna categoria è di tipo carattere. Quale
coppia di istruzioni di R base produce grafici adatti alle due
variabili?
L'istogramma (hist) rappresenta la distribuzione di una
variabile quantitativa raggruppandone i valori in classi. Il diagramma a
barre (barplot) rappresenta le frequenze delle modalità di
una variabile qualitativa, e richiede come input le frequenze, cioè il
risultato di table.
La seconda opzione inverte i due grafici: hist richiede
valori numerici e restituisce un errore con una variabile carattere. La
terza è la più insidiosa: il tipo di grafico è giusto, ma
barplot va applicato alle frequenze
(table(utenti$categoria)), non al vettore delle modalità, e
restituisce un errore. La quarta usa plot, che su un
vettore numerico produce un grafico dei valori nell'ordine delle righe,
e applica pie al vettore delle modalità invece che alle
frequenze.
Quale istruzione di R base produce un diagramma a scatola (boxplot) dell'età per ciascuna categoria di utenti, affiancati nello stesso grafico?
Nella sintassi a formula y ~ gruppo la variabile a
sinistra della tilde è quella quantitativa da rappresentare, e quella a
destra definisce i gruppi. Il risultato è un boxplot dell'età per
ciascuna categoria. L'argomento data indica la tabella in
cui cercare le variabili.
La seconda opzione inverte i ruoli delle due variabili. La terza è la
più insidiosa: passando due vettori separati, boxplot
disegna un boxplot per ciascun vettore, e non suddivide l'età per
categoria. La quarta usa hist, che non accetta questa
sintassi.
Che cosa accade eseguendo le istruzioni seguenti?
par(mfrow = c(2, 1))
hist(utenti$eta)
boxplot(utenti$eta, horizontal = TRUE)
La funzione par modifica i parametri grafici.
L'argomento mfrow = c(righe, colonne) divide la finestra in
una griglia, che viene riempita riga per riga dai grafici successivi:
con c(2, 1) l'istogramma occupa la cella in alto e il
boxplot quella in basso. Disponendo i grafici uno sotto l'altro con lo
stesso asse orizzontale, il confronto tra istogramma e boxplot è
immediato. Per tornare alla finestra singola si esegue
par(mfrow = c(1, 1)).
La seconda opzione descrive l'effetto di add = TRUE,
disponibile in alcune funzioni grafiche. La terza è la più insidiosa:
inverte righe e colonne, ed è il risultato di
par(mfrow = c(1, 2)). La quarta descrive il comportamento
di default, che mfrow modifica.
Il vettore tempi contiene 1000 valori generati da una
variabile Esponenziale con \(\lambda =
0.25\). Si vuole confrontare l'istogramma dei valori con la
funzione di densità teorica. Quale sequenza di istruzioni è
corretta?
Per confrontare un istogramma con una funzione di densità, i due
grafici devono essere sulla stessa scala: con freq = FALSE
l'altezza delle barre rappresenta la densità (l'area complessiva delle
barre è 1) e non il conteggio. L'argomento add = TRUE di
curve disegna la curva sopra il grafico già presente.
La seconda opzione è la più insidiosa: l'istogramma è in frequenze assolute (centinaia di valori per classe), mentre la densità non supera 0.25, per cui la curva appare schiacciata sull'asse orizzontale. La terza disegna la curva in un nuovo grafico, che sostituisce l'istogramma. La quarta sovrappone la funzione di ripartizione, che non è confrontabile con l'istogramma.
Si vuole rappresentare la funzione di massa di probabilità di una Binomiale con \(n = 20\) e \(\pi = 0.18\):
x <- 0:20
p <- dbinom(x, size = 20, prob = 0.18)
Quale istruzione produce il grafico più adatto, con una barra verticale sottile in corrispondenza di ciascun valore di \(x\)?
L'argomento type di plot stabilisce come
rappresentare i punti: "p" (il default) disegna i punti,
"l" le linee che li uniscono, "b" entrambi,
"h" delle barre verticali dall'asse orizzontale fino a
ciascun punto. Le barre sottili sono la rappresentazione tradizionale di
una funzione di massa di probabilità: la probabilità è concentrata nei
singoli valori interi.
La seconda opzione disegna l'istogramma delle probabilità, cioè quante probabilità cadono in ciascuna classe di valori, che non ha significato qui. La terza è la più insidiosa: produce un grafico simile, ma unendo i punti con una linea suggerisce erroneamente che la variabile possa assumere anche i valori intermedi. La quarta disegna un boxplot per ciascun valore di \(x\), ognuno basato su un solo numero.
La tabella m è stata ottenuta con
table(categoria, genere), con le 5 categorie in riga e i 2
generi in colonna. Che cosa disegna l'istruzione
barplot(m)?
Quando riceve una matrice (come una tabella doppia),
barplot disegna una barra per ciascuna
colonna, impilando i valori delle righe. Per ottenere
una barra per categoria bisogna trasporre la tabella:
barplot(t(m)). Con l'argomento beside = TRUE
le parti di ciascuna barra vengono disegnate affiancate invece che
impilate.
La seconda opzione è la più insidiosa: è ciò che ci si aspetta
leggendo la tabella per righe, ma si ottiene con
barplot(t(m)). La terza descrive il risultato di
barplot(m, beside = TRUE). La quarta è errata.
L'età degli utenti di una biblioteca ha una distribuzione bimodale: molti utenti tra i 10 e i 25 anni, molti tra i 60 e gli 85, pochi tra i 25 e i 30. Che cosa mostrano un boxplot e un violin plot di questa variabile?
Il boxplot riassume la distribuzione con il minimo, i quartili, il massimo e gli eventuali valori anomali: due distribuzioni con forma molto diversa, una unimodale e una bimodale, possono avere boxplot quasi identici. Il violin plot affianca al boxplot una stima della densità, disegnata in modo simmetrico ai due lati, e rende quindi visibile la forma della distribuzione, compresi i due picchi. Il prezzo è un grafico meno familiare e una forma che dipende dalla stima della densità, poco affidabile con pochi dati.
La seconda opzione è la più insidiosa: è vero che i due grafici condividono i quartili, ma i quartili non bastano a mostrare la forma. La terza attribuisce al boxplot una capacità che non ha. La quarta è errata: entrambi i grafici sono pensati per variabili quantitative.
Si sovrappone a un boxplot dell'età per categoria un grafico beeswarm, che disegna un punto per ciascun utente evitando le sovrapposizioni. In quale situazione questa aggiunta è meno utile?
Il beeswarm mostra ogni singola osservazione: rende visibili la numerosità dei gruppi, la posizione dei valori anomali e la presenza di valori ripetuti. È particolarmente utile con gruppi piccoli, in cui un boxplot calcolato su pochi valori può essere fuorviante. Con moltissime osservazioni, invece, i punti non trovano spazio e lo sciame si allarga oltre il gruppo; in quel caso sono preferibili grafici di sintesi come il boxplot o il violin plot.
La seconda opzione è la più insidiosa perché inverte il ragionamento: proprio con pochi dati il beeswarm è più utile. La terza e la quarta descrivono situazioni in cui il beeswarm è utile.
Hai una tabella con una variabile qualitativa e una quantitativa e vuoi scoprire quali grafici sono adatti a rappresentarle, con i loro pregi, i loro limiti e il codice R per realizzarli. Quale combinazione di portali è la più adatta?
From Data to Viz parte dal tipo di dati (ad esempio "una variabile qualitativa e una numerica") e, attraverso un albero decisionale, propone i grafici adatti, con una sezione dedicata agli errori più comuni. The R Graph Gallery raccoglie centinaia di grafici organizzati per tipo, ciascuno con il codice R che lo produce. Il DataViz Project è un catalogo di tipi di grafico illustrati con immagini, utile per trovare idee ma privo di codice.
La seconda opzione attribuisce al DataViz Project il codice, che invece non fornisce. La terza è la più insidiosa: The R Graph Gallery offre il codice ed è organizzata per tipo di grafico, ma il percorso dal tipo di dati al grafico adatto, con i relativi avvertimenti, è la caratteristica di From Data to Viz. La quarta è errata.
Hai trovato nel DataViz Project l'immagine di un grafico che vorresti usare per i tuoi dati e chiedi a un assistente AI il codice R per realizzarlo. Quale modo di procedere è il più appropriato?
Partire da dati artificiali permette di concentrarsi sulla struttura del codice: quali dati richiede il grafico, in che formato, quali funzioni e argomenti usa. Una volta capito il codice, lo si adatta ai propri dati e si verifica il risultato: un grafico può essere prodotto senza errori e rappresentare comunque valori sbagliati, ad esempio per un'aggregazione errata o per un'etichetta assegnata alla variabile sbagliata.
La seconda opzione rinuncia a ogni controllo, e in molti casi i dati non possono o non devono essere condivisi con un servizio esterno. La terza è la più insidiosa: l'assenza di errori non garantisce che il grafico sia corretto. La quarta è errata: molti assistenti AI accettano immagini come input, e anche una descrizione accurata del grafico può bastare.