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日現在人口")

出力。

f:id:nonki1974:20130614221130j:plain