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.

  • False
  • True
  • False
  • False

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.

  • False
  • False
  • False
  • True

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.

  • False
  • False
  • False
  • True

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.

  • False
  • True
  • False
  • False

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.

  • False
  • False
  • False
  • True

\(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).

  • True
  • False
  • False
  • False

\(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à.

  • False
  • False
  • False
  • True

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.

  • True
  • False
  • False
  • False

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.

  • True
  • False
  • False
  • False

\(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.

  • False
  • False
  • True
  • False

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.

  • False
  • False
  • False
  • True

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.

  • True
  • False
  • False
  • False

\(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.

  • True
  • False
  • False
  • False

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\).

  • False
  • False
  • True
  • False

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

  • True
  • False
  • False
  • False

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.

  • False
  • True
  • False
  • False

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.

  • False
  • False
  • False
  • True

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.

  • False
  • True
  • False
  • False

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.

  • False
  • True
  • False
  • False

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.

  • False
  • False
  • False
  • True

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.

  • False
  • True
  • False
  • False

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.

  • False
  • False
  • True
  • False

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.

  • False
  • False
  • True
  • False

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.

  • False
  • False
  • False
  • True

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.

  • False
  • False
  • True
  • False

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.

  • False
  • False
  • False
  • True

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.

  • False
  • True
  • False
  • False