+++ title = “Lanciare Una Query Sdmx Sui Server Istat: Parte 4 di Leggere La Statistica Ufficiale Con R” description = “Esploriamo meglio lo standard SDMX per lo scambio di dati e metadati statistici, velocizziamo la raccolta delle informazioni!” author = “Giampaolo Montaletti” date = 2018-06-30T19:31:37+02:00 tags = [“R”, “Istat”, “rsdmx”] draft = true +++
Come abbiamo visto nelle puntate precedenti1 i comandi del package RSDMX2 consentono di scaricare interi dataset dai server ISTAT3. Sono gli stessi dati presenti sul servizio Informazione statistica di Istat 4.
Oggi cerco di spiegare come lanciare una query sui server SDMX di ISTAT. Lo scopo è:
library(rsdmx)
library(dplyr)
dataflows <- readSDMX(providerId = "ISTAT", resource = "dataflow")
istatFlows <- as.data.frame(dataflows)
istatT <- istatFlows[1:5, c("id", "dsdRef", "Name.it")]
knitr::kable(istatT)
id | dsdRef | Name.it |
---|---|---|
12_60 | DCCV_CONSACQUA | Distribuzione di acqua potabile |
149_327 | DCSC_RETRCONTR1O | Orario contrattuale annuo lordo, netto, ferie e altre ore di riduzione |
22_315 | DCIS_POPORESBIL1 | Popolazione residente - bilancio |
97_366 | DCCN_PROTSOC | Conti della Protezione sociale (milioni di euro) |
101_22 | DCSP_FITOSANITARI | Fitosanitari |
Tasso di disoccupazione
dato che conosco il suo codice 151_914
(dalle puntate precedenti):id_flusso <- istatFlows[istatFlows$id %in% c("151_914"), c("dsdRef")]
rsdmx
:dsd <- readSDMX(providerId = "ISTAT", resource = "datastructure", resourceId=id_flusso)
La nostra dsd è un oggetto S4. Una classe S4 è una struttura dati contenente diversi attributi (denominati slots) di tipo predeterminato. Gli oggetti S4 possono avere una struttura ricorsiva. Dato che questo non è un corso di programmazione ad oggetti, per saperne di più sulle classi S4 potete leggere gli ottimi paper che ho messo in nota5.
Ai nostri scopi ci basti sapere che si tratta di un albero che possiamo espandere e che contiene altri oggetti, sapendo che determinate informazioni sono sempre nello stesso nodo. Quindi possiamo cercarle con istruzioni strutturate.
Ogni misura (valore aggregato) è descritta da alcune proprietà, come l’unità di misura, la frequenza temporale e l’aggregazione geografica. In SDMX queste misure sono chiamate dimensioni e rappresentano le equivalenti dimensioni dei cubi di dati del data warehouse dove l’informazione è mantenuta6.
Ci serve sapere quante e quali dimensioni ha il nostro flusso dati e in che ordine si presentano. Sta scritto nel DSD.
Se chiediamo a R:
slotNames(dsd)
## [1] "organisationSchemes" "concepts" "codelists"
## [4] "datastructures" "xmlObj" "schema"
## [7] "header" "footer"
otteniamo la lista degli slot: le dimensioni sono dentro lo slot "datastructures"
.
Con queste istruzioni ricaviamo le dimensioni e le riportiamo in una tabella:
datastructures <- slot(dsd, "datastructures")
components <- slot(slot(datastructures, "datastructures")[[1]], "Components")
dimensioni <- as.data.frame(components)
dimensioni <- dimensioni %>%
filter(component == "Dimension") %>%
select(component, conceptRef, codelist)
knitr::kable(dimensioni)
component | conceptRef | codelist |
---|---|---|
Dimension | FREQ | CL_FREQ |
Dimension | CITTADINANZA | CL_CITTADINANZA |
Dimension | DURATA_DISOCCUPAZ | CL_DURATA |
Dimension | CLASSE_ETA | CL_ETA1 |
Dimension | ITTER107 | CL_ITTER107 |
Dimension | SESSO | CL_SEXISTAT1 |
Dimension | TIPO_DATO | CL_TIPO_DATO_FOL |
Dimension | TITOLO_STUDIO | CL_TITOLO_STUDIO |
Ok, ci sono 8 dimensioni in questo flusso dati. Vediamo anche i nomi delle codelist, vale a dire le liste dei codici che descrivono le variabili e contengono le label.
Estraiamo la lista dei codici per la frequenza CL_FREQ
:
cl <- as.data.frame(slot(dsd, "codelists"), codelistId = "CL_FREQ")
cl <- cl %>%
select(id, label.it)
knitr::kable(cl)
id | label.it |
---|---|
A | annuale |
B | business (non supportato) |
D | giornaliero |
E | event (non supportato) |
H | semestrale |
M | mensile |
Q | trimestrale |
W | settimanale |
e anche per la cittadinanza CL_CITTADINANZA
:
cl <- as.data.frame(slot(dsd, "codelists"), codelistId = "CL_CITTADINANZA")
cl <- cl %>%
select(id, label.it)
knitr::kable(cl)
id | label.it |
---|---|
ITL | italiano-a |
FRG | straniero-a |
EU27 | di paese dell’Unione europea a 27 |
TOTAL | totale |
APO | apolide |
FRGAPO | straniero-a/apolide |
EXTEU27 | di paese extra Unione europea a 27 paesi |
Con il nostro rsdmx possiamo comporre una query come questa:
sdmx.data <- readSDMX(providerId = "ISTAT",
resource = "data",
flowRef = "151_914",
key = list("A",
"ITL+FRG",
NULL,
NULL,
NULL,
NULL,
NULL,
NULL),
start = 2017,
end = 2018,
dsd = F)
## -> Fetching 'http://sdmx.istat.it/SDMXWS/rest/data/151_914/A.ITL+FRG....../all/?startPeriod=2017&endPeriod=2018'
Spieghiamola: con il pezzo di istruzione key = list("A", "ITL+FRG", NULL, NULL, NULL, NULL, NULL, NULL)
ho chiesto di avere solo i dati annuali per gli italiani e gli stranieri "ITL+FRG"
, lasciando invariate le altre dimensioni (6 NULL
e le prime 2 dimensioni = 8 dimensioni). Ho anche stabilito il periodo di inizio start = 2017
e di fine dei dati che mi interessano end = 2018
e alla fine NON ho chiesto il dsd dsd = F
, ho già scaricato il DSD prima. Nota: ho usato l’ordine della tabella che ho trovato nello slot “datastructures”.
Con questre istruzioni associamo i dati al loro dsd che abbiamo scaricato prima:
sdmx.data <- setDSD(sdmx.data, dsd)
disoccupazione <- as.data.frame(sdmx.data, labels = T)
knitr::kable(head(disoccupazione))
ITTER107 | ITTER107_label.en | ITTER107_label.it | TIPO_DATO | TIPO_DATO_label.en | TIPO_DATO_label.it | SESSO | SESSO_label.en | SESSO_label.it | CLASSE_ETA | CLASSE_ETA_label.en | CLASSE_ETA_label.it | TITOLO_STUDIO | TITOLO_STUDIO_label.en | TITOLO_STUDIO_label.it | CITTADINANZA | CITTADINANZA_label.en | CITTADINANZA_label.it | DURATA_DISOCCUPAZ | DURATA_DISOCCUPAZ_label.en | DURATA_DISOCCUPAZ_label.it | FREQ | FREQ_label.en | FREQ_label.it | obsTime | obsValue |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
IT | Italy | Italia | UNEM_R | unemployment rate | tasso di disoccupazione | 1 | males | maschi | Y_GE15 | 15 years and over | 15 anni e più | 11 | tertiary (university, doctoral and specialization courses) | laurea e post-laurea | FRG | foreign | straniero-a | TOTAL | total | totale | A | annual | annuale | 2017 | 8.97655 |
IT | Italy | Italia | UNEM_R | unemployment rate | tasso di disoccupazione | 1 | males | maschi | Y_GE15 | 15 years and over | 15 anni e più | 3 | primary school certificate, no educational degree | licenza di scuola elementare, nessun titolo di studio | FRG | foreign | straniero-a | TOTAL | total | totale | A | annual | annuale | 2017 | 15.92737 |
IT | Italy | Italia | UNEM_R | unemployment rate | tasso di disoccupazione | 1 | males | maschi | Y_GE15 | 15 years and over | 15 anni e più | 4 | lower secondary school certificate | licenza di scuola media | FRG | foreign | straniero-a | TOTAL | total | totale | A | annual | annuale | 2017 | 12.73334 |
IT | Italy | Italia | UNEM_R | unemployment rate | tasso di disoccupazione | 1 | males | maschi | Y_GE15 | 15 years and over | 15 anni e più | 7 | upper and post secondary | diploma | FRG | foreign | straniero-a | TOTAL | total | totale | A | annual | annuale | 2017 | 12.14967 |
IT | Italy | Italia | UNEM_R | unemployment rate | tasso di disoccupazione | 1 | males | maschi | Y_GE15 | 15 years and over | 15 anni e più | 99 | total | totale | FRG | foreign | straniero-a | TOTAL | total | totale | A | annual | annuale | 2017 | 12.60663 |
IT | Italy | Italia | UNEM_R | unemployment rate | tasso di disoccupazione | 2 | females | femmine | Y_GE15 | 15 years and over | 15 anni e più | 11 | tertiary (university, doctoral and specialization courses) | laurea e post-laurea | FRG | foreign | straniero-a | TOTAL | total | totale | A | annual | annuale | 2017 | 13.50486 |
e ottengo il mio dataframe che comprende le labels!
Si, è molto più veloce! Usate le query per scaricare solo quello che vi serve e tenete le DSD salvate sul vostro pc. Spero che l’intero standard SDMX risulti più chiaro. Buon lavoro!
https://datalab.updog.co/2018/06/09/2018-06-09-leggere-la-statistica-pubblica-con-r/↩
https://datalab.updog.co/2018/06/16/2018-06-16-statistica-pubblica-e-r-parte-2/↩
https://datalab.updog.co/2018/06/24/2018-06-24-leggere-la-statistica-ufficiale-con-r-cosa-fare-quando-il-server-sdmx-di-istat-non-funziona/↩
ringrazio sentitamente gli autori che hanno messo a disposizione tanta conoscenza e tanta chiarezza: https://alpha.dmi.unict.it/~alaimos/uploads/2013-2014/da-2013-14-introduction-to-r.pdf http://people.idsia.ch/~azzimonti/ProgrammazioneAvanzataInR.pdf http://adv-r.had.co.nz/OO-essentials.html#s4↩
per maggiori dettagli sullo standard vedi: http://ec.europa.eu/eurostat/web/sdmx-web-services/data-struct-def↩