Rで統計API
統計APIの試験運用が始まったということで、Rから使ってみたのでメモ。
自治体独自の統計もこの形式に準拠できればいいかも。
次世代統計利用システム
http://statdb.nstac.go.jp/
使ったライブラリは以下の4つ。
library(RCurl) library(rjson) library(XML) library(ggplot2)
統計表検索のための関数。
optionsには、検索パラメータ名と値の組のリストを与える。
appIdはサイトで登録して取得。
getStatList <- function(options){ appId <- "hogehoge" URL <- "http://statdb.nstac.go.jp/rest/1.0/app/getStatsList?" appIdstring <- paste("appId", appId, sep="=") opstring <- paste(names(options), unlist(options), sep="=", collapse="&") result <- xmlToList(getURI(paste(URL, appIdstring, opstring, sep="&"))) data.frame(do.call("rbind",sapply(result$DATALIST_INF, function(x){ if(class(x)=="list") unlist(x) }))) }
データ取得のための関数。
statsDataIdに統計表IDを指定。
optionsには絞り込みのためのパラメータをリストで与える。
getDFfromStatAPI <- function(statsDataId, options=NULL){ appId <- "hogehoge" URL <- "http://statdb.nstac.go.jp/rest/1.0/app/json/getStatsData?" appIdstring <- paste("appId", appId, sep="=") sdstring <- paste("statsDataId", statsDataId, sep="=") opstring <- paste(names(options), unlist(options), sep="=", collapse="&") data.json <- getURI(paste(URL, appIdstring, sdstring, opstring, sep="&")) data.list <- fromJSON(data.json) data <- data.frame( do.call("rbind", data.list$GET_STATS_DATA$STATISTICAL_DATA$DATA_INF$VALUE)) names(data) <- gsub("X.", "", names(data)) names(data)[ncol(data)] <- "X" classinf <- with(data.list$GET_STATS_DATA$STATISTICAL_DATA$CLASS_INF, { classinf <- list() for(i in 1:length(CLASS_OBJ)){ classinf[[CLASS_OBJ[[i]]$`@id`]] <- list() classinf[[CLASS_OBJ[[i]]$`@id`]]$name <- CLASS_OBJ[[i]]$`@name` if(is.null(CLASS_OBJ[[i]]$CLASS$`@code`)){ classinf[[CLASS_OBJ[[i]]$`@id`]]$code <- data.frame( do.call("rbind", CLASS_OBJ[[i]]$CLASS)) } else { classinf[[CLASS_OBJ[[i]]$`@id`]]$code <- data.frame( do.call("cbind", CLASS_OBJ[[i]]$CLASS)) } } classinf }) data.df <- list() for(name in names(classinf)){ data.df[[paste(classinf[[name]]$name,"コード",sep="")]] <- unlist(data[[name]]) data.df[[classinf[[name]]$name]] <- unlist( classinf[[name]]$code$X.name[match(data[[name]], classinf[[name]]$code$X.code)]) } data.df$X <- unlist(data$X) data.df$unit <- unlist(data$unit) as.data.frame(data.df) }
2013年に公開された人口推計(政府統計コード:00200524)を検索。
search.result <- getStatList(list(statsCode="00200524", openYears="2013"))
参考表 年齢(各歳)(統計表ID: 0003080204)
日本人人口(050)、男女(001および002)、0歳から88歳まで(1000番台)
jinsui.df <- getDFfromStatAPI("0003080204", list( cdCat01="050", cdCat02="001,002", cdCat03From="01001", cdCat03To="01999")) jinsui.df$年齢各歳コード <- as.numeric(as.character(jinsui.df$年齢各歳コード)) jinsui.df$X <- as.numeric(as.character(jinsui.df$X))
男女別人口のプロット。
qplot(as.factor(as.numeric(gsub("歳","",年齢各歳))), X, geom="bar", stat="identity", position="dodge",fill=男女別, data=jinsui.df, xlab="年齢", ylab="人口", main="日本人人口 平成24年10月1日現在人口")
出力。