今回利用するパッケージを読み込む。
library('XML')
library('rlist')
library('httr')
library('stringr')
library('dplyr')
library('tidyr')
library('readxl')
基本的な使い方については、 Introduction to dplyr (by RStudio)、TAの宋さんが書いた解説、 cheat sheet (PDF) などがあるので参照されたい。
Introducing tidyr (RStudio Blog) やcheat sheet (PDF)、あるいはネット上に沢山あるブログポスト(例えば コレ) を参照されたい。
再現性を確保するため、あるいは共同研究を促進するために、汎用性の高い形式でデータセットを保存すべきである。授業ではCSV形式で保存することを勧めた。CSV形式が望ましい理由は、基本的にどんなコンピュータのどんな統計分析ソフトでも、CSV形式を扱うことができる点にある。しかし、CSV形式が最も使いやすいわけではない。特に、インターネット上でデータをやりとりするときや、Rと他のプログラミンング言語(例えば、PythonはRと一緒に使われることが多い)の間で同じデータを使う場合、CSV だと少し使いにくいので、代わりにJSON (JavaScript Object Notation) が使われることが多い。
この授業では、そのような形式があるということさえわかっていればよいことにする。 興味があれば、Lindsay Basset. 2015. Introduction to JavaScript Object Notation: A To-the-point Guide to JSON. (O’Reilly) を参照されたい。
API とは Application Programming Interface の略で、ソフトウェア間でコミュニケーションをとる仕組み(仕様)である。 これを使えば、他人が作ったソフト(プログラム)から出力(データなど)を受け取り、それを自分のソフト(Rなど)で利用することができる。
詳しくは、
5分でわかるネットシリーズ (10):巨人の力を使っちゃえ!Web APIを使えば、あなたの夢も一発で実現 や WEB APIの使い方とは?挑戦したらすごく楽しい!を参照されたい。
異なるAPI はそれぞれ異なる仕様に基づいているので、自分が利用するAPIのマニュアルを読む必要がある。よく利用されるAPIについては、インターネット上で解説や使用例を見つけることができるので、それらも併せて読みながら利用すればよい。
政府統計の総合窓口 e-Stat で提供されているAPI を利用してデータを取得してみよう。
e-Stat のAPI仕様 を見ると、 XML、JSON、JSONP形式がサポートされており、HTTPメソッドとしてGET が使える。 ここでは、JSON を利用することにする。 JSON形式でリクエストできるのは、
である。それぞれのリクエストに使うURL は仕様書を参照されたい。
APIを仕様するために、e-Statの利用登録を行い、アプリケーションIDを取得しよう。 アプリケーションIDを取得するためには、アプリケーションの名称とURLを入力する必要がある。 入力後、右側の「発行」ボタンをクリックするとアプリケーションID (appId) が発行される。
まず、このID を入力する(コードを公開するときは、IDが見えないようにすること)。
# 自分で取得したIDを入れる
estat_id <- '取得したアプリケーションID'
e-stat のAPIを用いてデータを手に入れるためには、以下のステップを踏む。
以下、この流れに沿って解説する。
まず、キーワード検索によって関連がありそうな統計表情報を取得する。 例として、「授業料」というキーワードを使う。 HTMLメソッドとしてGET を使うが、ここではhttrパッケージのGET()
関数を使う。 引数 query には、API仕様書で定義されているパラメタをリストにして指定する。ここでは、アプリケーションID (appId) と検索キーワード (searchWord) を指定する。
# e-Stat のURL
base_url = 'http://api.e-stat.go.jp/'
# 検索語を含む統計表を検索する
estat_res <- GET(base_url, path = 'rest/2.0/app/json/getStatsList',
add_headers(`Accept-Encoding` = "gzip"),
query = list(
appId = estat_id,
searchWord = '授業料'
)
)
# 結果の中身を取り出す
estat_content <- content(estat_res)
str(estat_content, mmax.level = 3, list.len = 3)
## List of 1
## $ GET_STATS_LIST:List of 3
## ..$ RESULT :List of 3
## .. ..$ STATUS : int 0
## .. ..$ ERROR_MSG: chr "正常に終了しました。"
## .. ..$ DATE : chr "2016-06-08T13:57:00.090+09:00"
## ..$ PARAMETER :List of 3
## .. ..$ LANG : chr "J"
## .. ..$ SEARCH_WORD: chr "授業料"
## .. ..$ DATA_FORMAT: chr "J"
## ..$ DATALIST_INF:List of 3
## .. ..$ NUMBER : int 344
## .. ..$ RESULT_INF:List of 2
## .. .. ..$ FROM_NUMBER: int 1
## .. .. ..$ TO_NUMBER : int 344
## .. ..$ TABLE_INF :List of 344
## .. .. ..$ :List of 13
## .. .. .. ..$ @id : chr "0003023102"
## .. .. .. ..$ STAT_NAME :List of 2
## .. .. .. .. ..$ @code: chr "00400001"
## .. .. .. .. ..$ $ : chr "学校基本調査"
## .. .. .. ..$ GOV_ORG :List of 2
## .. .. .. .. ..$ @code: chr "00400"
## .. .. .. .. ..$ $ : chr "文部科学省"
## .. .. .. .. [list output truncated]
## .. .. ..$ :List of 13
## .. .. .. ..$ @id : chr "0003024180"
## .. .. .. ..$ STAT_NAME :List of 2
## .. .. .. .. ..$ @code: chr "00400001"
## .. .. .. .. ..$ $ : chr "学校基本調査"
## .. .. .. ..$ GOV_ORG :List of 2
## .. .. .. .. ..$ @code: chr "00400"
## .. .. .. .. ..$ $ : chr "文部科学省"
## .. .. .. .. [list output truncated]
## .. .. ..$ :List of 13
## .. .. .. ..$ @id : chr "0003023103"
## .. .. .. ..$ STAT_NAME :List of 2
## .. .. .. .. ..$ @code: chr "00400001"
## .. .. .. .. ..$ $ : chr "学校基本調査"
## .. .. .. ..$ GOV_ORG :List of 2
## .. .. .. .. ..$ @code: chr "00400"
## .. .. .. .. ..$ $ : chr "文部科学省"
## .. .. .. .. [list output truncated]
## .. .. .. [list output truncated]
この中で、私たちの欲しい情報はTABLE_INFである。
estat_table_inf <- estat_content$GET_STATS_LIST$DATALIST_INF$TABLE_INF
str(estat_table_inf, max.level = 3, list.len = 3)
## List of 344
## $ :List of 13
## ..$ @id : chr "0003023102"
## ..$ STAT_NAME :List of 2
## .. ..$ @code: chr "00400001"
## .. ..$ $ : chr "学校基本調査"
## ..$ GOV_ORG :List of 2
## .. ..$ @code: chr "00400"
## .. ..$ $ : chr "文部科学省"
## .. [list output truncated]
## $ :List of 13
## ..$ @id : chr "0003024180"
## ..$ STAT_NAME :List of 2
## .. ..$ @code: chr "00400001"
## .. ..$ $ : chr "学校基本調査"
## ..$ GOV_ORG :List of 2
## .. ..$ @code: chr "00400"
## .. ..$ $ : chr "文部科学省"
## .. [list output truncated]
## $ :List of 13
## ..$ @id : chr "0003023103"
## ..$ STAT_NAME :List of 2
## .. ..$ @code: chr "00400001"
## .. ..$ $ : chr "学校基本調査"
## ..$ GOV_ORG :List of 2
## .. ..$ @code: chr "00400"
## .. ..$ $ : chr "文部科学省"
## .. [list output truncated]
## [list output truncated]
結果として得た estat_table_inf は、リストの各要素が入れ子構造のリストである。 入れ子構造が複雑で扱いにくので、各要素の階層をなくしてフラットなリストに変換しよう。httr::list.flatten()
を使えば、要素ごとにフラットなリストができる。
flat_estat <- lapply(estat_table_inf, list.flatten)
str(flat_estat, list.len = 3)
## List of 344
## $ :List of 18
## ..$ @id : chr "0003023102"
## ..$ STAT_NAME.@code : chr "00400001"
## ..$ STAT_NAME.$ : chr "学校基本調査"
## .. [list output truncated]
## $ :List of 18
## ..$ @id : chr "0003024180"
## ..$ STAT_NAME.@code : chr "00400001"
## ..$ STAT_NAME.$ : chr "学校基本調査"
## .. [list output truncated]
## $ :List of 18
## ..$ @id : chr "0003023103"
## ..$ STAT_NAME.@code : chr "00400001"
## ..$ STAT_NAME.$ : chr "学校基本調査"
## .. [list output truncated]
## [list output truncated]
結果として得られた flat_estat もリストなので、利便性をを考え、 dplyr::bind_rows()
でデータフレームに変換する。
flat_estat <- flat_estat %>% bind_rows()
## Error in eval(expr, envir, enclos): incompatible type (data index: 5, column: 'SURVEY_DATE', was collecting: integer (dplyr::Collecter_Impl<13>), incompatible with data of type: character
エラーが出た。エラーメッセージを読むと SURVEY_DATE に文字列と整数が混在しているのが問題のようだ。 リストをフラットにするときに、すべて文字列にしてしまおう。
flat_estat <- lapply(
estat_table_inf,
function(x) lapply(list.flatten(x), as.character)
) %>% bind_rows()
str(flat_estat)
## Classes 'tbl_df', 'tbl' and 'data.frame': 344 obs. of 19 variables:
## $ @id : chr "0003023102" "0003024180" "0003023103" "0003024181" ...
## $ STAT_NAME.@code : chr "00400001" "00400001" "00400001" "00400001" ...
## $ STAT_NAME.$ : chr "学校基本調査" "学校基本調査" "学校基本調査" "学校基本調査" ...
## $ GOV_ORG.@code : chr "00400" "00400" "00400" "00400" ...
## $ GOV_ORG.$ : chr "文部科学省" "文部科学省" "文部科学省" "文部科学省" ...
## $ STATISTICS_NAME : chr "学校基本調査 平成21年度 高等教育機関《報告書掲載集計》 学校経費調査(平成20会計年度)" "学校基本調査 平成22年度 高等教育機関《報告書掲載集計》 学校経費調査(平成21会計年度)" "学校基本調査 平成21年度 高等教育機関《報告書掲載集計》 学校経費調査(平成20会計年度)" "学校基本調査 平成22年度 高等教育機関《報告書掲載集計》 学校経費調査(平成21会計年度)" ...
## $ TITLE.@no : chr "111" "111" "111" "111" ...
## $ TITLE.$ : chr "授業料等及び補助金収入(国・公立大学)(単位:千円)" "授業料等及び補助金収入(国・公立大学)(単位:千円)" "授業料等及び補助金収入(国・公立の高等専門学校等)(単位:千円)" "授業料等及び補助金収入(国・公立の高等専門学校等)(単位:千円)" ...
## $ CYCLE : chr "-" "-" "-" "-" ...
## $ SURVEY_DATE : chr "0" "0" "0" "0" ...
## $ OPEN_DATE : chr "2009-12-21" "2010-12-22" "2009-12-21" "2010-12-22" ...
## $ SMALL_AREA : chr "0" "0" "0" "0" ...
## $ MAIN_CATEGORY.@code : chr "12" "12" "12" "12" ...
## $ MAIN_CATEGORY.$ : chr "教育・文化・スポーツ・生活" "教育・文化・スポーツ・生活" "教育・文化・スポーツ・生活" "教育・文化・スポーツ・生活" ...
## $ SUB_CATEGORY.@code : chr "01" "01" "01" "01" ...
## $ SUB_CATEGORY.$ : chr "学校教育" "学校教育" "学校教育" "学校教育" ...
## $ OVERALL_TOTAL_NUMBER: chr "100" "100" "81" "81" ...
## $ UPDATED_DATE : chr "2011-03-22" "2011-03-22" "2011-03-22" "2011-03-22" ...
## $ TITLE : chr NA NA NA NA ...
ここから、対象を2007年の物価データに絞り込んでみよう。
is_price <- flat_estat$STATISTICS_NAME %>% str_detect('物価')
is_2007 <- flat_estat$SURVEY_DATE %>% str_detect('2007')
stat_price_2007 <- flat_estat %>%
filter(is_price == TRUE, is_2007 == TRUE)
対象となる統計表が9個まで絞れた。View(stat_price_2007)
として中身を確認してみる。その結果、id が’0003005935’の統計表を使うことに決めたとしよう。 このID は後で使うので、オブジェクトを作っておこう。
target_id <- '0003005935'
次に、利用する統計表のメタ情報を利用する。ここで得たメタ情報は、後ほどデータの絞り込みに使う。 API仕様 に従い、統計表のIDパラメタを statsDataId で指定する。
estat_meta <- GET(base_url, path = 'rest/2.0/app/json/getMetaInfo',
add_headers(`Accept-Encoding` = "gzip"),
query = list(
appId = estat_id,
statsDataId = target_id
)
)
meta_content <- content(estat_meta)
str(meta_content, max.level = 4, list.len = 3)
## List of 1
## $ GET_META_INFO:List of 3
## ..$ RESULT :List of 3
## .. ..$ STATUS : int 0
## .. ..$ ERROR_MSG: chr "正常に終了しました。"
## .. ..$ DATE : chr "2016-06-08T13:57:00.757+09:00"
## ..$ PARAMETER :List of 3
## .. ..$ LANG : chr "J"
## .. ..$ STATS_DATA_ID: chr "0003005935"
## .. ..$ DATA_FORMAT : chr "J"
## ..$ METADATA_INF:List of 2
## .. ..$ TABLE_INF:List of 13
## .. .. ..$ @id : chr "0003005935"
## .. .. ..$ STAT_NAME :List of 2
## .. .. ..$ GOV_ORG :List of 2
## .. .. .. [list output truncated]
## .. ..$ CLASS_INF:List of 1
## .. .. ..$ CLASS_OBJ:List of 4
## .. .. .. .. [list output truncated]
この結果はリストであるが、必要な情報は CLASS_OBJ に書かれているはずなので、それを取り出す。
class_obj <- meta_content$GET_META_INFO$METADATA_INF$CLASS_INF$CLASS_OBJ
この結果もまたリストである。 私たちに必要なのは、このリストの各要素に含まれる CLASS の内容である。 利便性を考えて、それをデータフレームに変換する。 リストの要素がリストのときは bind_rows()
を使い、そうでないときは、dplyr::as_data_frame()
でデータフレームにする関数を作る。
list_to_df <- function(x) {
if (is.list(x[[1]])) bind_rows(x) else as_data_frame(x)
}
この関数を使ってデータフレームを作る。
class_df <- lapply(class_obj, function(x) list_to_df(x$CLASS))
変数名を @id にする。
(names(class_df) <- sapply(class_obj, function(x) x$'@id'))
## [1] "tab" "cat01" "area" "time"
各変数に対応するのは、次の内容である。
sapply(class_obj, function(x) x$'@name')
## [1] "表章項目" "指数銘柄" "地域1684" "時間軸(年次)"
すなわち、tab が表章項目、cat01 が指数銘柄、area が地域1684、time が時間軸(年次)である。
メタ情報を使って、私たちが調べたい「授業料」という項目が含まれるを見つけよう。 「授業料」という文字列があるとすれば指数銘柄 (cat01) の @name に含まれているはずなので、@name に「授業料」があるかどうか探す。
class_df$cat01 %>% filter(str_detect(`@name`, '授業料'))
## Source: local data frame [6 x 3]
##
## @code @name @level
## (chr) (chr) (chr)
## 1 285 私立中学校授業料 1
## 2 286 公立高校授業料 1
## 3 287 私立高校授業料 1
## 4 288 国立大学授業料 1
## 5 289 私立大学授業料 1
## 6 292 専門学校授業料 1
いくつか見つかった。この中から、対象を大学の授業料に絞り込もう。
tuition <- class_df$cat01 %>%
filter(str_detect(`@name`, '授業料'),
str_detect(`@name`, '大学'))
これらのデータを手に入れたいので、対象となる @code をオブジェクトに保存する。 仕様書に従い、複数のコードはカンマで区切る。
target_cat <- tuition$'@code'
target_cat <- paste(target_cat[1], target_cat[2], sep = ',')
必要なデータがどこにあるかわかったので、実際にデータを取得しよう。 API仕様 には、cat01 パラメタをcdCat01 で指定するよう書かれている。
estat_data <- GET(base_url, path = 'rest/2.0/app/json/getStatsData',
query = list(
appId = estat_id,
statsDataId = target_id,
cdCat01 = target_cat))
data_content <- content(estat_data)
str(data_content, max.level = 4, list.len = 4)
## List of 1
## $ GET_STATS_DATA:List of 3
## ..$ RESULT :List of 3
## .. ..$ STATUS : int 0
## .. ..$ ERROR_MSG: chr "正常に終了しました。"
## .. ..$ DATE : chr "2016-06-08T13:57:01.602+09:00"
## ..$ PARAMETER :List of 6
## .. ..$ LANG : chr "J"
## .. ..$ STATS_DATA_ID : chr "0003005935"
## .. ..$ NARROWING_COND:List of 1
## .. .. ..$ CODE_CAT01_SELECT: chr "288,289"
## .. ..$ DATA_FORMAT : chr "J"
## .. .. [list output truncated]
## ..$ STATISTICAL_DATA:List of 4
## .. ..$ RESULT_INF:List of 3
## .. .. ..$ TOTAL_NUMBER: int 3356
## .. .. ..$ FROM_NUMBER : int 1
## .. .. ..$ TO_NUMBER : int 3356
## .. ..$ TABLE_INF :List of 13
## .. .. ..$ @id : chr "0003005935"
## .. .. ..$ STAT_NAME :List of 2
## .. .. ..$ GOV_ORG :List of 2
## .. .. ..$ STATISTICS_NAME : chr "平成19年全国物価統計調査 全国物価地域差指数編"
## .. .. .. [list output truncated]
## .. ..$ CLASS_INF :List of 1
## .. .. ..$ CLASS_OBJ:List of 4
## .. ..$ DATA_INF :List of 2
## .. .. ..$ NOTE :List of 2
## .. .. ..$ VALUE:List of 3356
## .. .. .. .. [list output truncated]
これまで同様、必要な結果 (VALUE) を取り出し、データフレームに変換する。
value <- data_content$GET_STATS_DATA$STATISTICAL_DATA$DATA_INF$VALUE
df_price <- value %>% bind_rows()
head(df_price)
## Source: local data frame [6 x 6]
##
## @tab @cat01 @area @time @unit $
## (chr) (chr) (chr) (chr) (chr) (chr)
## 1 017 288 00000 2007000000 円 535713.48
## 2 017 288 00012 2007000000 円 535800.00
## 3 017 288 00013 2007000000 円 535724.24
## 4 017 288 00014 2007000000 円 535800.00
## 5 017 288 00015 2007000000 円 535800.00
## 6 017 288 00016 2007000000 円 535604.38
授業料$ の値が文字列 (chr) になっているので、名前をfee に変え、中身を数値に変える。
df_price <- df_price %>%
rename(fee = `$`) %>%
mutate(fee = as.numeric(fee))
このままではデータの内容がわかりにくいので、先ほど取得したメタ情報を付加する。
# data frames for meta info
df_time <- class_df$time %>%
select(`@time` = `@code`, year = `@name`)
df_cat01 <- class_df$cat01 %>%
select(`@cat01` = `@code`, item = `@name`)
df_area <- class_df$area %>%
select(`@area` = `@code`, area = `@name`)
# merge data frames
df_price <- df_price %>%
left_join(df_time, by = '@time') %>%
left_join(df_cat01, by = '@cat01') %>%
left_join(df_area, by = '@area')
head(df_price)
## Source: local data frame [6 x 9]
##
## @tab @cat01 @area @time @unit fee year item
## (chr) (chr) (chr) (chr) (chr) (dbl) (chr) (chr)
## 1 017 288 00000 2007000000 円 535713.5 2007年 国立大学授業料
## 2 017 288 00012 2007000000 円 535800.0 2007年 国立大学授業料
## 3 017 288 00013 2007000000 円 535724.2 2007年 国立大学授業料
## 4 017 288 00014 2007000000 円 535800.0 2007年 国立大学授業料
## 5 017 288 00015 2007000000 円 535800.0 2007年 国立大学授業料
## 6 017 288 00016 2007000000 円 535604.4 2007年 国立大学授業料
## Variables not shown: area (chr)
summary(df_price)
## @tab @cat01 @area
## Length:3356 Length:3356 Length:3356
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
## @time @unit fee year
## Length:3356 Length:3356 Min. :520800 Length:3356
## Class :character Class :character 1st Qu.:535800 Class :character
## Mode :character Mode :character Median :553359 Mode :character
## Mean :605406
## 3rd Qu.:661676
## Max. :962396
## item area
## Length:3356 Length:3356
## Class :character Class :character
## Mode :character Mode :character
##
##
##
このデータフレームの列(変数)のうち、@tab と@time は必要ないので削除する。
df_price <- df_price %>% select(-`@tab`, -`@time`)
特定の地域のデータを表示してみよう
df_price %>% filter(area == '神戸市')
## Source: local data frame [4 x 7]
##
## @cat01 @area @unit fee year item area
## (chr) (chr) (chr) (dbl) (chr) (chr) (chr)
## 1 288 28100 円 535800 2007年 国立大学授業料 神戸市
## 2 288 28910 円 535800 2007年 国立大学授業料 神戸市
## 3 289 28100 円 783932 2007年 私立大学授業料 神戸市
## 4 289 28910 円 783932 2007年 私立大学授業料 神戸市
df_price %>% filter(area == '西宮市')
## Source: local data frame [2 x 7]
##
## @cat01 @area @unit fee year item area
## (chr) (chr) (chr) (dbl) (chr) (chr) (chr)
## 1 288 28204 円 535800 2007年 国立大学授業料 西宮市
## 2 289 28204 円 783932 2007年 私立大学授業料 西宮市
df_price %>% filter(area == '明石市')
## Source: local data frame [2 x 7]
##
## @cat01 @area @unit fee year item area
## (chr) (chr) (chr) (dbl) (chr) (chr) (chr)
## 1 288 28203 円 535800 2007年 国立大学授業料 明石市
## 2 289 28203 円 783932 2007年 私立大学授業料 明石市
(都道府)県ごとにしかデータをとっていないようなので、都道府県を指定する。
df_price %>% filter(area == '兵庫県')
## Source: local data frame [2 x 7]
##
## @cat01 @area @unit fee year item area
## (chr) (chr) (chr) (dbl) (chr) (chr) (chr)
## 1 288 28000 円 535800 2007年 国立大学授業料 兵庫県
## 2 289 28000 円 783932 2007年 私立大学授業料 兵庫県
df_price %>% filter(area == '大阪府')
## Source: local data frame [2 x 7]
##
## @cat01 @area @unit fee year item area
## (chr) (chr) (chr) (dbl) (chr) (chr) (chr)
## 1 288 27000 円 535800 2007年 国立大学授業料 大阪府
## 2 289 27000 円 728678 2007年 私立大学授業料 大阪府
df_price %>% filter(area == '京都府')
## Source: local data frame [2 x 7]
##
## @cat01 @area @unit fee year item area
## (chr) (chr) (chr) (dbl) (chr) (chr) (chr)
## 1 288 26000 円 535800 2007年 国立大学授業料 京都府
## 2 289 26000 円 764789 2007年 私立大学授業料 京都府
df_price %>% filter(area == '北海道')
## Source: local data frame [2 x 7]
##
## @cat01 @area @unit fee year item area
## (chr) (chr) (chr) (dbl) (chr) (chr) (chr)
## 1 288 01000 円 535800 2007年 国立大学授業料 北海道
## 2 289 01000 円 810357 2007年 私立大学授業料 北海道
df_price %>% filter(area == '東京都')
## Source: local data frame [2 x 7]
##
## @cat01 @area @unit fee year item area
## (chr) (chr) (chr) (dbl) (chr) (chr) (chr)
## 1 288 13000 円 535800 2007年 国立大学授業料 東京都
## 2 289 13000 円 707133 2007年 私立大学授業料 東京都
df_price %>% filter(area == '沖縄県')
## Source: local data frame [2 x 7]
##
## @cat01 @area @unit fee year item area
## (chr) (chr) (chr) (dbl) (chr) (chr) (chr)
## 1 288 47000 円 535800 2007年 国立大学授業料 沖縄県
## 2 289 47000 円 641760 2007年 私立大学授業料 沖縄県
(当然ながら?)同年度の国立大学の授業料は定数なので、私立大学だけに注目する。
priv_univ <- df_price %>% filter(`@cat01` == 289)
head(priv_univ)
## Source: local data frame [6 x 7]
##
## @cat01 @area @unit fee year item area
## (chr) (chr) (chr) (dbl) (chr) (chr) (chr)
## 1 289 00000 円 691757.4 2007年 私立大学授業料 全国
## 2 289 00012 円 714682.5 2007年 私立大学授業料 大都市
## 3 289 00013 円 689194.1 2007年 私立大学授業料 中都市
## 4 289 00014 円 670654.0 2007年 私立大学授業料 人口50~100万未満市
## 5 289 00015 円 695575.5 2007年 私立大学授業料 人口30~50万未満市
## 6 289 00016 円 694382.4 2007年 私立大学授業料 人口15~30万未満市
47都道府県のデータセットを作る。
is_pref <- priv_univ$area %>% str_detect('都$|道$|府$|県$')
priv_univ_pref <- priv_univ %>% filter(is_pref == TRUE)
2007年の私立大学の授業料がもっとも高いところと最も低いところはどこだろうか。
priv_univ_pref %>% arrange(desc(fee)) # descending order
## Source: local data frame [47 x 7]
##
## @cat01 @area @unit fee year item area
## (chr) (chr) (chr) (dbl) (chr) (chr) (chr)
## 1 289 44000 円 962396 2007年 私立大学授業料 大分県
## 2 289 01000 円 810357 2007年 私立大学授業料 北海道
## 3 289 28000 円 783932 2007年 私立大学授業料 兵庫県
## 4 289 26000 円 764789 2007年 私立大学授業料 京都府
## 5 289 12000 円 753333 2007年 私立大学授業料 千葉県
## 6 289 34000 円 748522 2007年 私立大学授業料 広島県
## 7 289 27000 円 728678 2007年 私立大学授業料 大阪府
## 8 289 25000 円 727514 2007年 私立大学授業料 滋賀県
## 9 289 23000 円 707821 2007年 私立大学授業料 愛知県
## 10 289 13000 円 707133 2007年 私立大学授業料 東京都
## .. ... ... ... ... ... ... ...
priv_univ_pref %>% arrange(fee) # ascending order
## Source: local data frame [47 x 7]
##
## @cat01 @area @unit fee year item area
## (chr) (chr) (chr) (dbl) (chr) (chr) (chr)
## 1 289 16000 円 570918 2007年 私立大学授業料 富山県
## 2 289 33000 円 576199 2007年 私立大学授業料 岡山県
## 3 289 46000 円 592276 2007年 私立大学授業料 鹿児島県
## 4 289 07000 円 594997 2007年 私立大学授業料 福島県
## 5 289 03000 円 595418 2007年 私立大学授業料 岩手県
## 6 289 43000 円 604187 2007年 私立大学授業料 熊本県
## 7 289 38000 円 612338 2007年 私立大学授業料 愛媛県
## 8 289 22000 円 621227 2007年 私立大学授業料 静岡県
## 9 289 35000 円 624536 2007年 私立大学授業料 山口県
## 10 289 40000 円 627781 2007年 私立大学授業料 福岡県
## .. ... ... ... ... ... ... ...
選挙のデータをAPIで取得してみよう。
まず、先ほどと同じように、JSON形式で取得することを試みる。
estat_election <- GET(base_url, path = 'rest/2.0/app/json/getStatsList',
add_headers(`Accept-Encoding` = "gzip"),
query = list(
appId = estat_id,
searchWord = '選挙'
)
)
election_content <- content(estat_election)
str(election_content)
## List of 1
## $ GET_STATS_LIST:List of 3
## ..$ RESULT :List of 3
## .. ..$ STATUS : int 1
## .. ..$ ERROR_MSG: chr "正常に終了しましたが、該当データはありませんでした。"
## .. ..$ DATE : chr "2016-06-08T13:57:06.902+09:00"
## ..$ PARAMETER :List of 3
## .. ..$ LANG : chr "J"
## .. ..$ SEARCH_WORD: chr "選挙"
## .. ..$ DATA_FORMAT: chr "J"
## ..$ DATALIST_INF:List of 2
## .. ..$ NUMBER : int 0
## .. ..$ RESULT_INF: chr ""
このように、JSON形式では選挙関連のデータは見つからない。
次に、XML形式で試す。
election_key = '選挙'
# create the url to request
xml_url <- paste0(base_url,
'rest/2.0/app/getDataCatalog?appId=', estat_id,
'&searchWord=', election_key)
# get results
res_election <- xmlParse(xml_url)
ここから、API仕様 にしたがって各項目を取り出す。
# extract specific results
# names of the statistics
stat_name <- xpathSApply(res_election,
'//DATA_CATALOG_INF/DATASET/STAT_NAME',
xmlValue)
head(stat_name)
## [1] "選挙人名簿及び在外選挙人名簿登録者数"
## [2] "選挙人名簿及び在外選挙人名簿登録者数"
## [3] "選挙人名簿及び在外選挙人名簿登録者数"
## [4] "選挙人名簿及び在外選挙人名簿登録者数"
## [5] "選挙人名簿及び在外選挙人名簿登録者数"
## [6] "選挙人名簿及び在外選挙人名簿登録者数"
# date of survey
date <- xpathSApply(res_election,
'//DATA_CATALOG_INF/DATASET/TITLE/SURVEY_DATE',
xmlValue)
head(date)
## [1] "200909" "200809" "201104-201203" "201104-201203"
## [5] "201204-201303" "201312"
# catalog title of the data sets
title <- xpathSApply(res_election,
'//DATA_CATALOG_INF/DATASET/TITLE/NAME',
xmlValue)
head(title)
## [1] "平成21年9月2日現在選挙人名簿及び在外選挙人名簿登録者数_2009年9月"
## [2] "平成20年9月2日現在選挙人名簿及び在外選挙人名簿登録者数_2008年9月"
## [3] "平成22年9月2日現在選挙人名簿及び在外選挙人名簿登録者数_2011年度"
## [4] "平成23年9月2日現在選挙人名簿及び在外選挙人名簿登録者数_2011年度"
## [5] "平成24年9月2日現在選挙人名簿及び在外選挙人名簿登録者数_2012年度"
## [6] "平成25年9月2日現在選挙人名簿及び在外選挙人名簿登録者数_2013年12月"
# URL of each data set at e-Stat
landing_page <- xpathSApply(res_election,
'//DATA_CATALOG_INF/DATASET/LANDING_PAGE',
xmlValue)
head(landing_page)
## [1] "http://www.e-stat.go.jp/SG1/estat/GL08020103.do?_toGL08020103_&tclassID=000001028509&cycleCode=0&requestSender=search"
## [2] "http://www.e-stat.go.jp/SG1/estat/GL08020103.do?_toGL08020103_&tclassID=000001028514&cycleCode=0&requestSender=search"
## [3] "http://www.e-stat.go.jp/SG1/estat/GL08020103.do?_toGL08020103_&tclassID=000001034729&cycleCode=0&requestSender=search"
## [4] "http://www.e-stat.go.jp/SG1/estat/GL08020103.do?_toGL08020103_&tclassID=000001036410&cycleCode=0&requestSender=search"
## [5] "http://www.e-stat.go.jp/SG1/estat/GL08020103.do?_toGL08020103_&tclassID=000001046089&cycleCode=0&requestSender=search"
## [6] "http://www.e-stat.go.jp/SG1/estat/GL08020103.do?_toGL08020103_&tclassID=000001051913&cycleCode=0&requestSender=search"
# data format of each data set
format <- xpathSApply(res_election,
'//DATA_CATALOG_INF/RESOURCES/RESOURCE/FORMAT',
xmlValue)
head(format)
## [1] "PDF" "PDF" "XLS" "XLS" "XLS" "XLS"
# URL of data resource
resource_url <- xpathSApply(res_election,
'//DATA_CATALOG_INF/RESOURCES/RESOURCE/URL',
xmlValue)
# the number of data resources
resources <- res_election['//DATA_CATALOG_INF']
n_resources <- sapply(resources,
xpathSApply,
'count(.//RESOURCES/RESOURCE/TITLE/NAME)')
必要なデータが抜きださた(はず)なので、使いやすいように整形する。 その際、要素数が異なる項目があることに注意が必要である。
sapply(list(stat_name, date, title, landing_page, format, resource_url, n_resources), length)
## [1] 43 43 43 43 55 55 43
これは、複数のデータセットを持つ統計表が存在するためである。 これに注意して、次のようにデータを整形する。
counter <- 0
# data list
data_list <- vector('list', length(stat_name))
# list format for each stat
each_list <- list('stat_name' = NULL, 'date' = NULL, 'title' = NULL,
'landing_page' = NULL, 'format' = NULL, 'url' = NULL)
# format
for (i in seq_along(stat_name)) {
each_list[[1]] <- stat_name[i]
each_list[[2]] <- date[i]
each_list[[3]] <- title[i]
each_list[[4]] <- landing_page[i]
if (identical(all.equal(1, n_resources[i]), TRUE)) {
counter <- max(counter, i)
item_count <- counter
couter <- counter + 1
} else {
f_counter <- (counter + n_resources[i] - 1)
item_count <- counter:f_counter
counter <- f_counter + 1
}
each_list[[5]] <- format[item_count]
each_list[[6]] <- resource_url[item_count]
data_list[[i]] <- each_list
}
これで、必要な情報が入ったリストができた。中身を確認してみる。
str(data_list, list.len = 5)
## List of 43
## $ :List of 6
## ..$ stat_name : chr "選挙人名簿及び在外選挙人名簿登録者数"
## ..$ date : chr "200909"
## ..$ title : chr "平成21年9月2日現在選挙人名簿及び在外選挙人名簿登録者数_2009年9月"
## ..$ landing_page: chr "http://www.e-stat.go.jp/SG1/estat/GL08020103.do?_toGL08020103_&tclassID=000001028509&cycleCode=0&requestSender=search"
## ..$ format : chr "PDF"
## .. [list output truncated]
## $ :List of 6
## ..$ stat_name : chr "選挙人名簿及び在外選挙人名簿登録者数"
## ..$ date : chr "200809"
## ..$ title : chr "平成20年9月2日現在選挙人名簿及び在外選挙人名簿登録者数_2008年9月"
## ..$ landing_page: chr "http://www.e-stat.go.jp/SG1/estat/GL08020103.do?_toGL08020103_&tclassID=000001028514&cycleCode=0&requestSender=search"
## ..$ format : chr "PDF"
## .. [list output truncated]
## $ :List of 6
## ..$ stat_name : chr "選挙人名簿及び在外選挙人名簿登録者数"
## ..$ date : chr "201104-201203"
## ..$ title : chr "平成22年9月2日現在選挙人名簿及び在外選挙人名簿登録者数_2011年度"
## ..$ landing_page: chr "http://www.e-stat.go.jp/SG1/estat/GL08020103.do?_toGL08020103_&tclassID=000001034729&cycleCode=0&requestSender=search"
## ..$ format : chr "XLS"
## .. [list output truncated]
## $ :List of 6
## ..$ stat_name : chr "選挙人名簿及び在外選挙人名簿登録者数"
## ..$ date : chr "201104-201203"
## ..$ title : chr "平成23年9月2日現在選挙人名簿及び在外選挙人名簿登録者数_2011年度"
## ..$ landing_page: chr "http://www.e-stat.go.jp/SG1/estat/GL08020103.do?_toGL08020103_&tclassID=000001036410&cycleCode=0&requestSender=search"
## ..$ format : chr "XLS"
## .. [list output truncated]
## $ :List of 6
## ..$ stat_name : chr "選挙人名簿及び在外選挙人名簿登録者数"
## ..$ date : chr "201204-201303"
## ..$ title : chr "平成24年9月2日現在選挙人名簿及び在外選挙人名簿登録者数_2012年度"
## ..$ landing_page: chr "http://www.e-stat.go.jp/SG1/estat/GL08020103.do?_toGL08020103_&tclassID=000001046089&cycleCode=0&requestSender=search"
## ..$ format : chr "XLS"
## .. [list output truncated]
## [list output truncated]
data_list[[1]]
## $stat_name
## [1] "選挙人名簿及び在外選挙人名簿登録者数"
##
## $date
## [1] "200909"
##
## $title
## [1] "平成21年9月2日現在選挙人名簿及び在外選挙人名簿登録者数_2009年9月"
##
## $landing_page
## [1] "http://www.e-stat.go.jp/SG1/estat/GL08020103.do?_toGL08020103_&tclassID=000001028509&cycleCode=0&requestSender=search"
##
## $format
## [1] "PDF"
##
## $url
## [1] "http://www.e-stat.go.jp/SG1/estat/GL08020103.do?_pdfDownload_&fileId=000003887539&releaseCount=1"
どのような形式のデータが提供されているだろうか。
unique(format)
## [1] "PDF" "XLS" "CSV"
PDF、XLS、CSVがあることがわかる。PDFはそのままでは使いにくいので、XLSとCSVのデータに対象を限定しよう。
n_data <- length(format)
dummy <- rep(NA, n_data)
estat_df <- data.frame(stat_name = dummy,
data = dummy,
title = dummy,
landing_page = dummy,
format = dummy,
url = dummy)
counter <- 1
for (i in seq_along(data_list)) {
stat <- data_list[[i]]
J <- length(stat$format)
if (J == 1) {
estat_df[counter, ] <- unlist(stat)
counter <- counter + 1
} else {
for (j in 1:J) {
res <- c(stat$stat_name, stat$date, stat$title,
stat$landing_page, stat$format[j], stat$url[j])
estat_df[counter, ] <- res
counter <- counter + 1
}
}
}
target_data <- estat_df %>% filter(format == 'CSV' | format == 'XLS')
nrow(target_data)
## [1] 39
これで、「選挙」に関連したデータのうち、XLS形式またはCSV形式で手に入るもののリストができた。 衆院選と参院選に関するデータはなくなってしまった。。。
この中に欲しいデータがある場合、例えば平成25年の「選挙人名簿及び在外選挙人名簿登録者数」に関するデータが欲しいなら、URL を指定してダウンロードすればよい。Excel 形式データの読み込みには、readxl::read_excel()
を使う。
download.file(target_data$url[4], destfile = 'election-roster2013.xls')
roster <- read_excel('election-roster2013.xls')
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 01 00 00 00 00 00 00 06 3b 00 00 00 00 42 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0a 00 00 00 00 00 00 06 3b 01 00 00 00 45 00 00 00 08 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0b 00 00 00 00 00 00 06 3b 02 00 00 00 48 00 00 00 17 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0d 00 00 00 00 00 00 06 3b 03 00 00 00 40 00 00 00 0a 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0e 00 00 00 00 00 00 06 3b 04 00 00 00 36 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0f 00 00 00 00 00 00 06 3b 05 00 00 00 35 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 10 00 00 00 00 00 00 06 3b 06 00 00 00 42 00 00 00 0a 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 02 00 00 00 00 00 00 06 3b 07 00 00 00 2b 00 00 00 0b 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 03 00 00 00 00 00 00 06 3b 08 00 00 00 37 00 00 00 08 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 04 00 00 00 00 00 00 06 3b 09 00 00 00 36 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 05 00 00 00 00 00 00 06 3b 0a 00 00 00 2a 00 00 00 0b 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 06 00 00 00 00 00 00 06 3b 0b 00 00 00 37 00 00 00 08 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 07 00 00 00 00 00 00 06 3b 0c 00 00 00 36 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 08 00 00 00 00 00 00 06 3b 0d 00 00 00 2c 00 00 00 0d 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 09 00 00 00 00 00 00 06 3b 0e 00 00 00 45 00 00 00 08 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 01 00 00 00 00 00 00 06 3b 00 00 00 00 42 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0a 00 00 00 00 00 00 06 3b 01 00 00 00 45 00 00 00 08 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0b 00 00 00 00 00 00 06 3b 02 00 00 00 48 00 00 00 17 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0d 00 00 00 00 00 00 06 3b 03 00 00 00 40 00 00 00 0a 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0e 00 00 00 00 00 00 06 3b 04 00 00 00 36 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0f 00 00 00 00 00 00 06 3b 05 00 00 00 35 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 10 00 00 00 00 00 00 06 3b 06 00 00 00 42 00 00 00 0a 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 02 00 00 00 00 00 00 06 3b 07 00 00 00 2b 00 00 00 0b 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 03 00 00 00 00 00 00 06 3b 08 00 00 00 37 00 00 00 08 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 04 00 00 00 00 00 00 06 3b 09 00 00 00 36 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 05 00 00 00 00 00 00 06 3b 0a 00 00 00 2a 00 00 00 0b 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 06 00 00 00 00 00 00 06 3b 0b 00 00 00 37 00 00 00 08 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 07 00 00 00 00 00 00 06 3b 0c 00 00 00 36 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 08 00 00 00 00 00 00 06 3b 0d 00 00 00 2c 00 00 00 0d 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 09 00 00 00 00 00 00 06 3b 0e 00 00 00 45 00 00 00 08 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 01 00 00 00 00 00 00 06 3b 00 00 00 00 42 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0a 00 00 00 00 00 00 06 3b 01 00 00 00 45 00 00 00 08 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0b 00 00 00 00 00 00 06 3b 02 00 00 00 48 00 00 00 17 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0d 00 00 00 00 00 00 06 3b 03 00 00 00 40 00 00 00 0a 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0e 00 00 00 00 00 00 06 3b 04 00 00 00 36 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0f 00 00 00 00 00 00 06 3b 05 00 00 00 35 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 10 00 00 00 00 00 00 06 3b 06 00 00 00 42 00 00 00 0a 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 02 00 00 00 00 00 00 06 3b 07 00 00 00 2b 00 00 00 0b 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 03 00 00 00 00 00 00 06 3b 08 00 00 00 37 00 00 00 08 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 04 00 00 00 00 00 00 06 3b 09 00 00 00 36 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 05 00 00 00 00 00 00 06 3b 0a 00 00 00 2a 00 00 00 0b 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 06 00 00 00 00 00 00 06 3b 0b 00 00 00 37 00 00 00 08 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 07 00 00 00 00 00 00 06 3b 0c 00 00 00 36 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 08 00 00 00 00 00 00 06 3b 0d 00 00 00 2c 00 00 00 0d 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 09 00 00 00 00 00 00 06 3b 0e 00 00 00 45 00 00 00 08 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 01 00 00 00 00 00 00 06 3b 00 00 00 00 42 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0a 00 00 00 00 00 00 06 3b 01 00 00 00 45 00 00 00 08 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0b 00 00 00 00 00 00 06 3b 02 00 00 00 48 00 00 00 17 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0d 00 00 00 00 00 00 06 3b 03 00 00 00 40 00 00 00 0a 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0e 00 00 00 00 00 00 06 3b 04 00 00 00 36 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0f 00 00 00 00 00 00 06 3b 05 00 00 00 35 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 10 00 00 00 00 00 00 06 3b 06 00 00 00 42 00 00 00 0a 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 02 00 00 00 00 00 00 06 3b 07 00 00 00 2b 00 00 00 0b 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 03 00 00 00 00 00 00 06 3b 08 00 00 00 37 00 00 00 08 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 04 00 00 00 00 00 00 06 3b 09 00 00 00 36 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 05 00 00 00 00 00 00 06 3b 0a 00 00 00 2a 00 00 00 0b 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 06 00 00 00 00 00 00 06 3b 0b 00 00 00 37 00 00 00 08 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 07 00 00 00 00 00 00 06 3b 0c 00 00 00 36 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 08 00 00 00 00 00 00 06 3b 0d 00 00 00 2c 00 00 00 0d 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 09 00 00 00 00 00 00 06 3b 0e 00 00 00 45 00 00 00 08 00
head(roster)
## Source: local data frame [6 x 6]
##
##
## (chr) (chr) (chr) (chr) (chr) (chr)
## 1 NA NA NA NA NA NA
## 2 NA NA NA NA NA NA
## 3 NA NA NA NA NA NA
## 4 NA NA NA NA NA NA
## 5 NA NA NA 平成25年12月26日 NA NA
## 6 NA NA NA NA NA NA
明らかに何かがおかしい。ダウンロードしたファイルをLibreOffice Calc またはMS Excelで開いてみよう。 何がわかる?
読み込み方法を少し改善する。
roster <- read_excel('election-roster2013.xls', sheet = 1, skip = 11)
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 01 00 00 00 00 00 00 06 3b 00 00 00 00 42 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0a 00 00 00 00 00 00 06 3b 01 00 00 00 45 00 00 00 08 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0b 00 00 00 00 00 00 06 3b 02 00 00 00 48 00 00 00 17 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0d 00 00 00 00 00 00 06 3b 03 00 00 00 40 00 00 00 0a 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0e 00 00 00 00 00 00 06 3b 04 00 00 00 36 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0f 00 00 00 00 00 00 06 3b 05 00 00 00 35 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 10 00 00 00 00 00 00 06 3b 06 00 00 00 42 00 00 00 0a 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 02 00 00 00 00 00 00 06 3b 07 00 00 00 2b 00 00 00 0b 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 03 00 00 00 00 00 00 06 3b 08 00 00 00 37 00 00 00 08 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 04 00 00 00 00 00 00 06 3b 09 00 00 00 36 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 05 00 00 00 00 00 00 06 3b 0a 00 00 00 2a 00 00 00 0b 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 06 00 00 00 00 00 00 06 3b 0b 00 00 00 37 00 00 00 08 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 07 00 00 00 00 00 00 06 3b 0c 00 00 00 36 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 08 00 00 00 00 00 00 06 3b 0d 00 00 00 2c 00 00 00 0d 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 09 00 00 00 00 00 00 06 3b 0e 00 00 00 45 00 00 00 08 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 01 00 00 00 00 00 00 06 3b 00 00 00 00 42 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0a 00 00 00 00 00 00 06 3b 01 00 00 00 45 00 00 00 08 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0b 00 00 00 00 00 00 06 3b 02 00 00 00 48 00 00 00 17 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0d 00 00 00 00 00 00 06 3b 03 00 00 00 40 00 00 00 0a 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0e 00 00 00 00 00 00 06 3b 04 00 00 00 36 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0f 00 00 00 00 00 00 06 3b 05 00 00 00 35 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 10 00 00 00 00 00 00 06 3b 06 00 00 00 42 00 00 00 0a 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 02 00 00 00 00 00 00 06 3b 07 00 00 00 2b 00 00 00 0b 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 03 00 00 00 00 00 00 06 3b 08 00 00 00 37 00 00 00 08 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 04 00 00 00 00 00 00 06 3b 09 00 00 00 36 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 05 00 00 00 00 00 00 06 3b 0a 00 00 00 2a 00 00 00 0b 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 06 00 00 00 00 00 00 06 3b 0b 00 00 00 37 00 00 00 08 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 07 00 00 00 00 00 00 06 3b 0c 00 00 00 36 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 08 00 00 00 00 00 00 06 3b 0d 00 00 00 2c 00 00 00 0d 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 09 00 00 00 00 00 00 06 3b 0e 00 00 00 45 00 00 00 08 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 01 00 00 00 00 00 00 06 3b 00 00 00 00 42 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0a 00 00 00 00 00 00 06 3b 01 00 00 00 45 00 00 00 08 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0b 00 00 00 00 00 00 06 3b 02 00 00 00 48 00 00 00 17 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0d 00 00 00 00 00 00 06 3b 03 00 00 00 40 00 00 00 0a 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0e 00 00 00 00 00 00 06 3b 04 00 00 00 36 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0f 00 00 00 00 00 00 06 3b 05 00 00 00 35 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 10 00 00 00 00 00 00 06 3b 06 00 00 00 42 00 00 00 0a 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 02 00 00 00 00 00 00 06 3b 07 00 00 00 2b 00 00 00 0b 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 03 00 00 00 00 00 00 06 3b 08 00 00 00 37 00 00 00 08 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 04 00 00 00 00 00 00 06 3b 09 00 00 00 36 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 05 00 00 00 00 00 00 06 3b 0a 00 00 00 2a 00 00 00 0b 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 06 00 00 00 00 00 00 06 3b 0b 00 00 00 37 00 00 00 08 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 07 00 00 00 00 00 00 06 3b 0c 00 00 00 36 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 08 00 00 00 00 00 00 06 3b 0d 00 00 00 2c 00 00 00 0d 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 09 00 00 00 00 00 00 06 3b 0e 00 00 00 45 00 00 00 08 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 01 00 00 00 00 00 00 06 3b 00 00 00 00 42 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0a 00 00 00 00 00 00 06 3b 01 00 00 00 45 00 00 00 08 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0b 00 00 00 00 00 00 06 3b 02 00 00 00 48 00 00 00 17 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0d 00 00 00 00 00 00 06 3b 03 00 00 00 40 00 00 00 0a 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0e 00 00 00 00 00 00 06 3b 04 00 00 00 36 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 0f 00 00 00 00 00 00 06 3b 05 00 00 00 35 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 10 00 00 00 00 00 00 06 3b 06 00 00 00 42 00 00 00 0a 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 02 00 00 00 00 00 00 06 3b 07 00 00 00 2b 00 00 00 0b 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 03 00 00 00 00 00 00 06 3b 08 00 00 00 37 00 00 00 08 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 04 00 00 00 00 00 00 06 3b 09 00 00 00 36 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 05 00 00 00 00 00 00 06 3b 0a 00 00 00 2a 00 00 00 0b 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 06 00 00 00 00 00 00 06 3b 0b 00 00 00 37 00 00 00 08 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 07 00 00 00 00 00 00 06 3b 0c 00 00 00 36 00 00 00 05 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 08 00 00 00 00 00 00 06 3b 0d 00 00 00 2c 00 00 00 0d 00
## DEFINEDNAME: 20 00 00 01 0b 00 00 00 09 00 00 00 00 00 00 06 3b 0e 00 00 00 45 00 00 00 08 00
head(roster)
## Source: local data frame [6 x 6]
##
## 区 分 選挙人名簿登録者数 在外選挙人名簿登録者数 計 上位 下位
## (chr) (dbl) (dbl) (dbl) (dbl) (dbl)
## 1 北海道 4570424 2757 4573181 NA NA
## 2 青 森 1139259 495 1139754 NA NA
## 3 岩 手 1086031 635 1086666 NA NA
## 4 宮 城 1903600 1194 1904794 NA NA
## 5 秋 田 905338 454 905792 NA NA
## 6 山 形 950859 647 951506 NA NA
ビールの価格を調べようと思い、検索キーワード ‘ビール’ を使って検索を進めて行くと、物価調査データが残らなかった。しかし、手作業でデータを探して中身を確認したところ、ビールの価格が掲載されていた。問題はおそらく「ビール」の表記の仕方で、データセットの中ではなんと半角カタカナが使われていた。なんとも言えない結果である。