R

De Cliomatica - Digital History
Tempo di lettura 17 minuti - per Ludovica Binetti& Lorenzo Di Gianvittorio


Le basi di R

A partire dalla fine del secolo scorso, nel campo degli studi storici, ha iniziato a diffondersi la pratica di digitalizzare una grande moltitudine di dati storici, prevalentemente per ragioni di efficienza e di velocità di recupero di questi dati. Una volta in possesso di dati digitalizzati, in realtà, un ulteriore vantaggio è quello di effettuare su di essi analisi di tipo statistico. Uno dei linguaggi che più si è affermato in quest’ultimo campo è R, un termine dal duplice significato. Con esso si può, difatti, indicare sia un linguaggio di programmazione usato per l'analisi statistica e la visualizzazione di dati, che un “ambiente di sviluppo” [1] ovvero una collezione di software che agevolano il lavoro di scrittura del codice sorgente del programmatore [2] . Uno dei vantaggi che questo linguaggio offre allo storico è, ad esempio, la possibilità di salvare in uno script (un file con estensione .R) un blocco di codice che esegue una certa analisi su dei dati di interesse. Questo script, una volta elaborato, potrà essere riutilizzato più e più volte su insiemi di dati differenti, effettuando, eventualmente, dei piccoli accorgimenti a seconda del particolare tipo di analisi che si vuole condurre. Prima di capire, però, come sia possibile accedere ai dati ed effettuare su di essi analisi statistiche, è doveroso, prima, installare e settare l’ambiente di lavoro, nonché prendere confidenza con la sua interfaccia e con la sintassi basilare. Qui di seguito si offrono una serie di indicazioni di carattere generale proprio per accompagnare il lettore in queste prime e delicate fasi. Inoltre, per prendere una maggiore confidenza con la sintassi di R, si suggerisce, nelle fasi iniziali, di non creare degli script ma di eseguire singoli comandi nella console in maniera tale da avere un riscontro diretto dell'output ed individuare con più facilità eventuali errori di battitura o sintassi.

I primi passi: RStudio

R, in quanto linguaggio di programmazione, può essere eseguito o da riga di comando o tramite un'apposita interfaccia, chiamata RStudio, disponibile sia come applicazione desktop che come applicazione web. In questa sede, si farà riferimento all'applicazione desktop scaricabile al presente link. Si nota che, scaricando RStudio, R sarà automaticamente installato nel proprio computer.

Figura 1: Interfaccia grafica di RStudio,

L'interfaccia grafica di RStudio si presenta come in Figura 1. Le potenzialità sono molteplici, ma i principali elementi su cui bisogna porre maggiore attenzione sono:

  • Il riquadro in alto a sinistra, che contiene l'editor. Questo permette non solo di creare degli script ma anche di visualizzare eventuali dati in formato tabulare;
  • Il riquadro in alto a destra, in cui è possibile visualizzare, nella scheda “Environment”, la lista degli oggetti creati, mentre, nella scheda “History”, la cronologia dei comandi eseguiti;
  • Il riquadro in basso a sinistra, che contiene la console. Essa è caratterizzata dalla presenza del simbolo > (chiamato prompt di R), a seguito del quale vengono inseriti i comandi da eseguire;
  • Il riquadro in basso a destra, contenente, infine, diverse schede:
    • “File”: consente di esplorare i file del nostro computer;
    • “Plot”: dà la possibilità di visualizzare i grafici creati;
    • “Packages”: serve per la visualizzazione di pacchetti installati e/o caricati;
    • “Help”: scheda molto utile per ricercare la documentazione di un pacchetto o di singoli comandi.

Impostare la directory di lavoro e caricamento di dati

La primissima cosa da fare ogni qual volta viene aperto RStudio è settare la working directory che sarà visualizzata nella sezione in basso a destra. La directory è ciò che consente al programmatore di recuperare i file (di solito file . txt o .csv), all'interno dei quali sono contenuti i propri dati. Una delle più grandi utilità di R per uno storico è, difatti, la possibilità di avere un modo per analizzare grandi quantità di dati storici che spesso vengono digitalizzati e salvati in formati tabellari. Questi dati potranno essere importati nell’ambiente di lavoro tramite un opportuno comando read.table() che li inserisce all’interno di un dataframe. All’interno di questo comando è importante specificare nell’ordine indicato:

  • Nome del file dal quale si vogliono importare i dati;
  • La presenza o meno di intestazioni al dataframe;
  • Il separatore utilizzato;
  • Il numero della colonna che contiene i nomi delle righe oppure un vettore contenente tali nomi.

Un esempio si riporta qui di seguito:

InR2.png

Altri parametri specificabili nella funzione possono essere consultati al presente link.

Variabili e funzioni di statistica descrittiva

Una delle cose certamente più utili quando si programma in R è quello di creare variabili (o “oggetti”). Ad ogni variabile deve essere assegnato un nome secondo delle linee guida consultabili qui. Per creare una variabile, è necessario scrivere, nella riga di comando, i seguenti elementi nell'ordine indicato:

  • Nome da assegnare all'entità;
  • Comando di assegnazione < –;
  • Contenuto.

Si noterà che, dopo l’assegnamento, il nome dell'entità, con il relativo contenuto, comparirà nella “Environment” in alto a destra. Il vantaggio di creare oggetti è, difatti, quello di poterli richiamare e riutilizzare in seguito. Ad esempio, se si volessero analizzare alcuni dati relativi al numero di telefoni (espresso in migliaia) [3] presenti in diverse regioni del mondo dall’anno 1951 al 1961, li si potrebbe inserire in un oggetto al fine di richiamarli più agevolmente in seguito. Per accedere ai dati di cui sopra si è detto, è possibile usare la funzione data() che permette di recuperare una serie di dataset che l’ambiente di R offre: nel nostro caso, il dataset da recuperare ha il nome di “World Phones”. Pertanto scrivendo > data ("WorldPhones") nella riga di comando si noterà la creazione di un oggetto nella scheda del working environment (vedi Figura 5).

Figura 2: visualizzazione dell'oggetto creato nell'Environment

Si noterà, anche, che cliccando su di esso, si aprirà nell’editor la tabella contenente i dati come in Figura 6.

Figura 3: visualizzazione della tabella dei dati nell'Editor

A questo punto, quello che si è ottenuto, altro non è che un dataframe sul quale è possibile lavorare per ottenere risposte a diverse domande. Per esempio, qual è la media di numeri di telefono che si possedevano in un certo anno nelle diverse regioni del mondo? Qual è la regione del mondo con più numeri di telefono in un certo anno? Prima di questo, però, si prenda familiarità con alcune semplici funzioni che permettono di calcolare media o mediana e trovare il valore minimo e massimo all’interno del dataset numerico. Rispettivamente si avrà: mean(), median(), min() e max() a cui basterà aggiungere, entro le parentesi, il nome del dataframe. Una funzione molto utile per ottenere un prospetto di questi valori per l’intero dataset è summary().

InR5.png

Questa mostrerà, per ogni regione, una serie di informazioni. Per esempio il numero massimo di telefoni in Africa, tra il 1951 e il 1961 è stato 2005, quello minimo 89. Oppure si potrà velocemente comparare i valori e vedere, ad esempio che la regione con la media più alta di telefoni nell’intervallo di tempo considerato è stata il Nord America. Per accedere, invece, a singole righe, colonne o valori di un dataframe è possibile usare una notazione particolare: all’interno di parentesi quadre si dovranno specificare 2 numeri separati da una virgola, il primo indicante il numero di riga e il secondo il numero di colonna. Si ricordi che, in R, il conteggio di righe e colonne parta da 1 e non da 0 (come si è soliti contare nel mondo dell'informatica).

Qui di seguito si riportano degli esempi:

  • Accesso alla 3ª riga

InR6.png

  • Accesso alla 5ª colonna

InR7.png

  • Accesso al valore della 3ª riga nella 5ª colonna

InR8.png

Se si tratta di valori di particolare interesse, questi potranno, oltretutto, essere salvati in delle variabili tramite il comando di assegnamento. Per esempio, se fossimo interessati a conservare l’informazione del numero massimo di telefoni in Nord America tra il 1951 e il 1962 si potrebbe fare come segue:

InR9.png

Nella variabile maxNAmer sarà dunque salvato un numero corrispondente al valore massimo selezionato dalla colonna 1 del dataframe. L’unico accorgimento da avere quando si richiamano i nomi di oggetti e variabili è di scrivere correttamente il loro nome anche in termini di minuscole e maiuscole in quanto R è case-sensitive. Se a un certo livello dell’analisi ci si accorge, invece, che una data informazione non è più necessaria, è possibile usare il comando remove rm() per rimuoverla, specificando entro parentesi quadre il suo nome. Altro utile comando è ls() che fornisce la lista di tutti gli oggetti salvati nell’environment. Per una maggiore comprensibilità del codice, si consiglia di assegnare nomi significativi agli oggetti che si creano in maniera tale da sapere sempre quale tipo di informazione contengono.

Vettori

Un vettore è una sequenza ordinata di elementi dello stesso tipo. Uno dei modi per costruire un vettore è l'uso della funzione c() che sta per combine e di cui si mostrerà un esempio di utilizzo più avanti. Qui, invece, si vedrà come costruire un vettore numerico a partire dal dataset WorldPhones, salvandone un’intera riga o colonna:

InR10.png

Nella variabile phones1957 abbiamo salvato tutti i dati relativi all’anno 1957 (ovvero quelli contenuti nella riga 3 dalla colonna 1 alla 6), a cui è possibile accedere singolarmente specificando entro parentesi quadre l’indice della posizione. Il vantaggio di far questo risiede nella possibilità di accedere agevolmente alla riga corrispondente all’anno ‘57 per poter calcolare, ad esempio, la somma di tutti i telefoni, ottenendo il numero complessivo di numeri nel mondo nell’anno in questione.

InR11.png

Ripetendo l’operazione per tutte le righe del dataframe originale, sarebbe, ad esempio, possibile cercare di scoprire se il numero di telefoni nel corso degli anni è incrementato, rimasto stabile o diminuito. Una volta ottenuti questi valori, si potrebbero, addirittura disegnare in un grafico per avere una conferma visuale dei risultati ottenuti, come vedremo nella sezione successiva.

Grafici

Un'altra delle molteplici potenzialità di R è la possibilità di creare in maniera semplice dei grafici, dei quali è possibile modificare l'aspetto secondo il proprio gusto. Ad esempio, una volta che si ha accesso alle componenti di un dataframe, come visto poco sopra, sarà possibile plottare i valori di variabili categoriche e/o numeriche in grafici che consentiranno di esplorare in maniera molto semplice fenomeni che caratterizzano il dataframe. Le principali tipologie di grafici sono le seguenti ed è possibile visualizzarne le relative funzioni nella Tabella 1:

  • Barplot: grafico per visualizzare la distribuzione di una variabile categorica discreta. La funzione prende in input l'output della funzione table(), una funzione che ha un comportamento diverso a seconda del numero di parametri che riceve in input. Nel nostro caso, prendendo in input un solo vettore (ovvero una sola variabile numerica), restituirà la distribuzione di frequenza.
  • Istogramma: consente di visualizzare la distribuzione di una variabile categorica continua.
  • Scatterplot (grafico a dispersione): si usa per vedere la correlazione di due variabili numeriche (analisi di regressione).
  • Mosaicplot: grafico usato per lo studio della correlazione tra due variabili categoriche. Prende in input table() oppure una speciale notazione chiamata "formula" in cui i nomi delle due variabili sono separati da una tilde.
  • Spineplot: per vedere la correlazione tra una variabile numerica e una categorica;
  • Boxplot: la funzione prende in input una variabile (numerica o categorica). In entrambi i casi, serve per visualizzarne alcuni valori statistici (quartili, mediana, valore massimo e minimo, outliers...).
InR12.png

Per alcuni esempi d’uso si consulti la pagina del W3Schools o Geeks for geeks.

Riprendendo l’esempio fatto nella precedente sezione, proviamo a vedere l’andamento del numero di telefoni in tutte le regioni del mondo dal 1951 al 1961. Dopo aver memorizzato le informazioni relative a ogni anno (ovvero a ogni riga nel dataframe), in maniera analoga a come fatto sopra con il vettore phones1957, si costruisca un nuovo vettore nella seguente maniera:

InR13.png

Il vettore phones51_61 conterrà valori indicanti la somma dei numeri di telefono nel mondo per ogni anno (che, come si vede, sono passati alla funzione c()). Plottando un simile vettore in un grafico, si potrà, dunque, avere un riscontro diretto del loro incremento nel corso del periodo considerato. Per ottenere un diagramma a barre come quello mostrato in Figura 7 si dovrà, invece, scrivere:

InR14.png

Dove names.arg prende in input un vettore di stringhe contenente il nome di ogni barra, cex.axis definisce la grandezza delle etichette numeriche negli assi e cex.names definisce, invece, rispettivamente la grandezza delle etichette testuali assegnate a ogni barra[4].

Figura 7

Applicare dei filtri

R dà, inoltre, la possibilità di contare un certo numero di occorrenze che soddisfano una particolare condizione. Uno storico, ad esempio, potrebbe essere interessato a contare il numero di regioni del mondo che, nel 1959, avevano un numero di telefoni minore a 10.000. Innanzitutto, per ricercare un informazione di tal genere, sarà necessario selezionare la colonna di interesse (ovvero la n° 5) e applicare il filtro “ < 10000”. Così facendo si otterrebbe quanto segue:

InR16.png

Per ottenere il conteggio delle regioni che soddisfano un certo criterio, una funzione molto semplice (e spesso utilizzata) è table() che restituisce una tabella di contingenza in cui si riportano le frequenze assolute di tutti i possibili valori.

InR17.png

Dalla tabella si scopre, dunque, che il numero di regioni che soddisfano le condizioni di cui sopra sono 5. Ovviamente i filtri di ricerca che è possibile applicare sono infiniti: per esempio, la stessa informazione potrebbe essere ricercata all’interno dell’intero dataframe come mostrato qui sotto:

InR18.png

Nonostante ciò, le potenzialità di R permettono allo storico di trovare sempre un modo per estrapolare le informazioni di cui necessita, semplicemente scomponendo un problema in piccoli sotto-problemi e mettendo assieme i pochi, ma indispensabili, elementi di cui si è parlato in questo breve e introduttivo tutorial.


Bibliografia e sitografia

  1. Di solito un ambiente di sviluppo è costituito dai seguenti elementi: editor, per la scrittura delle istruzioni; compilatore; debugger, uno strumento per l'individuazione di errori che impediscono la fase di compilazione o di esecuzione; browser, per la gestione dei file.
  2. Per definizione consulta anche W3school.
  3. Cfr. RDocumentation.
  4. Cfr. RDocumentation (RDocumentation s.d.).



Citazione di questo articolo
Come citare: BINETTI, Ludovica & Di Gianvittorio, Lorenzo. "R". In: CLIOMATICA - Portale di Storia Digitale e ricerca. Disponibile in: http://lhs.unb.br/cliomatica/index.php/R. il giorno: 29/06/2024.






Informare errori in questa pagina