Skip to content

Instantly share code, notes, and snippets.

@steko
Created October 15, 2012 20:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save steko/3895362 to your computer and use it in GitHub Desktop.
Save steko/3895362 to your computer and use it in GitHub Desktop.
MIUR Open Data: facciamo un bel mesciap? Anche no!

Il MIUR ha iniziato a pubblicare open data sul sistema scolastico italiano. Evviva! Facciamo un mashup e visualizziamo la posizione delle scuole italiane su una mappa interattiva in una app per smartphone?

ANCHE NO.

No, cazzo. Guardiamo i dati. Proviamo a capirci qualcosa. A vedere cosa raccontano.

# 1. Get the data

# Prendi Anagrafica.csv
# dal sito Scuola in chiaro del MIUR

if (file.exists("Anagrafica.zip") == FALSE) {
  download.file("http://archivio.pubblica.istruzione.it/scuola_in_chiaro/open_data/Anagrafe.zip", destfile="Anagrafica.zip")
}

anagraficacsv <- unz(description="Anagrafica.zip", file="Anagrafica.csv")
anagrafica <- read.csv("Anagrafe/Anagrafica.csv", header=TRUE, sep="|")

Intanto scarichiamoli. Notiamo che al MIUR sono dei burloni e hanno deciso di farci perdere 30 secondi netti usando | come separatore dei campi.

# 1. Get the data
# Prendi Anagrafica.csv
# dal sito Scuola in chiaro del MIUR
if (file.exists("Anagrafica.zip") == FALSE) {
download.file("http://archivio.pubblica.istruzione.it/scuola_in_chiaro/open_data/Anagrafe.zip", destfile="Anagrafica.zip")
}
anagraficacsv <- unz(description="Anagrafica.zip", file="Anagrafica.csv")
anagrafica <- read.csv("Anagrafe/Anagrafica.csv", header=TRUE, sep="|")
# Dati ISTAT
# sulla ripartizione delle province nelle regioni
if (file.exists("regioni.zip") == FALSE) {
download.file("http://www.istat.it/it/files/2011/01/Ripartizioni-regioni-province.zip", destfile="regioni.zip")
}
regionicsv <- unz(description="regioni.zip",
file="ripartizioni_regioni_province.csv")
# na.strings va modificato
# per leggere correttamente la provincia di Napoli
# (altrimenti interpretata come valore mancante)
nuts2 <- read.csv(regionicsv,
sep=";",
header=TRUE,
na.strings=character(0),
fileEncoding="latin1")
# 2. Data massaging
# Invece che impelagarci in geocoding
# ricava la provincia della scuola
# dai primi due caratteri
# del codice meccanografico
# (che corrispondono alle province pre 2008),
anagrafica$provincia <- substr(anagrafica$codice_scuola, 1, 2)
# ma Bolzano è divisa tra scuole italiane, ladine e tedesche,
anagrafica$provincia[anagrafica$provincia=="IB"] <- "BZ"
anagrafica$provincia[anagrafica$provincia=="LB"] <- "BZ"
anagrafica$provincia[anagrafica$provincia=="TB"] <- "BZ"
# e due province hanno sigle e codici variati
anagrafica$provincia[anagrafica$provincia=="FO"] <- "FC"
anagrafica$provincia[anagrafica$provincia=="PS"] <- "PU"
# Vanno cancellate le ultime tre righe del file regioni.csv
# (ISTAT, tu quoque! metadati mescolati ai dati!)
len2 <- dim(nuts2)[1]
nuts2 <- nuts2[-(len2-2:len2),]
# le province devono essere in ordine alfabetico
nuts2 <- nuts2[order(nuts2$Sigla.automobilistica),]
# 3. Explore the data
# Calcola la proporzione tra scuole paritarie e scuole statali
# su base provinciale
sk2 <- as.data.frame.matrix(table(anagrafica$provincia, anagrafica$statale))
sk2$tot <- (sk2$PARITARIA + sk2$STATALE)
sk2$prop <- sk2$PARITARIA / (sk2$tot)
# Calcola totali e proporzioni per regioni
sk2$regione <- nuts2[nuts2$Sigla.automobilistica %in% row.names(sk2), 10]
sk2$n1 <- nuts2[nuts2$Sigla.automobilistica %in% row.names(sk2), 2]
reg.tot <- by(sk2$tot, sk2$regione, sum)
reg.par <- by(sk2$PARITARIA, sk2$regione, sum)
reg.nuts1 <- factor(by(sk2$n1, sk2$regione, sample, 1))
reg.df <- data.frame("tot"=c(reg.tot), "par"=c(reg.par), "nuts1"=c(reg.nuts1))
reg.df$nuts1 <- factor(reg.df$nuts1)
reg.df$prop <- reg.df$par / reg.df$tot
# Possible NAs flying around
reg.df <- na.exclude(reg.df)
# 4. Plot!
library(ggplot2)
interc = mean(sk2$prop)
# La Valle d'Aosta è un outlier e viene esclusa dal grafico
ggplot(reg.df[c(1:18,20),], aes(tot, prop, size=tot, colour=nuts1)) +
geom_point() +
geom_abline(intercept = interc, slope = 0) +
scale_colour_brewer(palette="Set1") +
scale_area()
# 5. Initial results
# Regioni grandi, più scuole paritarie
ggplot(reg.df[c(1:18,20),],
aes(tot, prop)) +
stat_smooth(method='lm') +
geom_point()
# Scuole paritarie prevalentemente per l'infanzia
tipscu <- table(anagrafica$des_tipo_scuola, anagrafica$statale)
tipscu.prop <- tipscu[,1] / (tipscu[,1] + tipscu[,2])
# 6. Don't stop here!
# dati demografici da http://demo.istat.it/altridati/indicatori/2011/Tab_6.xls e http://demo.istat.it/pop2011/index1.html
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment