準備

今回利用するパッケージを読み込む。

library('XML')
library('rlist')
library('httr')
library('stringr')
library('dplyr')
library('tidyr')
library('readxl')

データの整理

dplyr

基本的な使い方については、 Introduction to dplyr (by RStudio)TAの宋さんが書いた解説cheat sheet (PDF) などがあるので参照されたい。

tidyr

Introducing tidyr (RStudio Blog)cheat sheet (PDF)、あるいはネット上に沢山あるブログポスト(例えば コレ) を参照されたい。

JSON (JavaScript Object Notation)

再現性を確保するため、あるいは共同研究を促進するために、汎用性の高い形式でデータセットを保存すべきである。授業では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) を用いたデータの取得

API とは?

API とは Application Programming Interface の略で、ソフトウェア間でコミュニケーションをとる仕組み(仕様)である。 これを使えば、他人が作ったソフト(プログラム)から出力(データなど)を受け取り、それを自分のソフト(Rなど)で利用することができる。

詳しくは、

5分でわかるネットシリーズ (10):巨人の力を使っちゃえ!Web APIを使えば、あなたの夢も一発で実現WEB APIの使い方とは?挑戦したらすごく楽しい!を参照されたい。

異なるAPI はそれぞれ異なる仕様に基づいているので、自分が利用するAPIのマニュアルを読む必要がある。よく利用されるAPIについては、インターネット上で解説や使用例を見つけることができるので、それらも併せて読みながら利用すればよい。

e-stat のAPI機能を利用する

政府統計の総合窓口 e-Stat で提供されているAPI を利用してデータを取得してみよう。

e-Stat のAPI仕様 を見ると、 XML、JSON、JSONP形式がサポートされており、HTTPメソッドとしてGET が使える。 ここでは、JSON を利用することにする。 JSON形式でリクエストできるのは、

  1. 統計表情報取得
  2. メタ情報取得
  3. 統計データ取得
  4. データセット登録
  5. データセット参照
  6. データカタログ情報取得

である。それぞれのリクエストに使うURL は仕様書を参照されたい。

APIを仕様するために、e-Statの利用登録を行い、アプリケーションIDを取得しよう。 アプリケーションIDを取得するためには、アプリケーションの名称とURLを入力する必要がある。 入力後、右側の「発行」ボタンをクリックするとアプリケーションID (appId) が発行される。

まず、このID を入力する(コードを公開するときは、IDが見えないようにすること)。

# 自分で取得したIDを入れる
estat_id <- '取得したアプリケーションID'

e-stat のAPIを用いてデータを手に入れるためには、以下のステップを踏む。

  1. 統計表情報取得で、キーワード検索を行い、欲しいデータを探す
  2. 欲しいデータを含む統計表を選ぶ
  3. メタ情報を取得する
  4. メタ情報を使ってデータの絞り込みを行う
  5. 絞り込んだデータを取得する

以下、この流れに沿って解説する。

統計表情報の取得

まず、キーワード検索によって関連がありそうな統計表情報を取得する。 例として、「授業料」というキーワードを使う。 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年 私立大学授業料   福岡県
## ..    ...   ...   ...    ...    ...            ...      ...

e-Stat の使うときの注意

PDF でしか手に入らない情報が多い

選挙のデータを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

片仮名が半角???

ビールの価格を調べようと思い、検索キーワード ‘ビール’ を使って検索を進めて行くと、物価調査データが残らなかった。しかし、手作業でデータを探して中身を確認したところ、ビールの価格が掲載されていた。問題はおそらく「ビール」の表記の仕方で、データセットの中ではなんと半角カタカナが使われていた。なんとも言えない結果である。

参考