RでEDINETから財務データを入手・分析する~④前処理編1/3~
記事一覧
はじめに
本記事は書類取得編の続きであり、4番目の記事にあたる。本記事で行う作業は、前記事で取得したzipファイルを利用して、labelStringを含むデータを取得することである。
また、本ブログの執筆に際してこちらの記事を参考にさせていただいた。
前処理の前作業
データの整理にあたっては、予めどんな情報が必要であるかというゴールを設定する必要がある。不要な変数を多く含んでいると分析の際に見通しが悪くなり、一つの処理にかかる時間が増え望ましくない。そこで、まず本ブログで抽出する情報を列挙し、その後に前処理のデザインを説明する。
取得情報の整理
以下、変数を列挙する。それぞれの具体的なイメージは導入編で例示した表と見比べられたい。
labelString
- 勘定科目名を表す。本記事で取得する情報である。
fact
- 実際の値を表す。
startDate&endDate
- 期首日及び期末日を表す。
elementId
- 勘定科目に結びついたkeyのようなもの。XBRLに含まれる多種の情報を、このelementIdをkeyとしてjoinしていく。
contextId
- 時制、期間か時点か、メンバーの要素名などを含む。連結財務諸表か否かの判断のために用いる。
roleId
- どの財務諸表に該当するかを表す。例えば、税金等調整前当期純利益はBSとCF計算書にあり、このroleIdを除いた要素が同じである。
前処理のデザイン
全3回に分けて解説する。
1回目たる当記事ではlabelStringを取得する。分析データの年度ごとに必要な作業となる。
2回目では、xbrlファイルからの情報の抽出に必要となる機能を補助関数として定義する。
3回目では、当記事と次の記事の内容を統合した1つの大きな関数を定義する。提出日単位で実行することで、その日のzipファイルを全て分析可能なcsvファイルへと変換できる。
関数の実行について
本記事の関数は、年度ごとに1回行うだけでよい*1。
Rによる実装
手順
流れは以下の通りである。
zipファイルを一つ解凍する。
解凍したデータから、label情報をもつxmlファイルへの(外部)リンクを取り出す。
そのxmlファイルをdata.frameに読込み、文字コードの修正と冗長ラベルの削除を挟んでから、labelString及びelementIdを含む"JGAAP_label_YYYY.csv"をlabelフォルダに保存する。
解凍したファイルを削除する。
手順4に1分程度の時間がかかる。
コード
上記手順に倣った関数を以下に与える。
year <- 2019 path_zipdata <- dir(path_zip, pattern = ".zip", full.names = TRUE) get_label <- function(path_zipdata, year){ zipfile <- path_zipdata[1] unzip(zipfile = zipfile, exdir = path_zip) path_xbrl <- dir(str_c(path_zip, "/XBRL/Publicdoc"), pattern = "\\.xbrl", full.names = T) %>% str_subset("ifrs", negate = TRUE) parsed <- xbrlParse(path_xbrl) schema <- xbrlGetSchemaName(parsed) xbrlFree(parsed) ## path_pubdoc <- dirname(path_xbrl) parsed_Sch <- xbrlParse(str_c(path_pubdoc, "/", schema)) linkbase <- xbrlGetLinkbaseNames(parsed_Sch) xbrlFree(parsed_Sch) linkbase %>% str_subset(pattern = "jppfs") %>% str_subset(pattern = "lab.xml") %>% read_xml() %>% write_xml(file = str_c("Data/label/jppfs_label_", year, ".xml")) path_label <- dir("Data/label", as.character(year), full.names = TRUE) parsed_label <- xbrlParse(path_label) labels <- xbrlProcessLabels(parsed_label) xbrlFree(parsed_label) ## labels %>% as_tibble() %>% mutate_at("labelString", str_conv, encoding = "UTF-8") %>% mutate_if(is.factor, as.character) %>% slice(str_which(.$labelRole, "verbose", negate = T)) %>% slice(str_which(.$labelRole, "2003/role/label$")) %>% select(elementId, labelString) %>% write_excel_csv(path = str_c("Data/label/JGAAP_label_", year, ".csv")) unlink(str_c(path_zip, "/XBRL"), recursive = TRUE) } get_label(path_zipdata, year)
labelフォルダ内に、"jppfs_label_2019.xml"と"JGAAP_label_2019.csv"が保存されていれば成功である。後者の例示が以下である。
elementId | labelString |
---|---|
jppfs_cor_AssetsAbstract | 資産の部 |
jppfs_cor_CurrentAssetsAbstract | 流動資産 |
jppfs_cor_CashAndDeposits | 現金及び預金 |
jppfs_cor_NotesAndAccountsReceivableTrade | 受取手形及び売掛金 |
jppfs_cor_AllowanceForDoubtfulAccountsNotesAndAccountsReceivableTrade | 貸倒引当金 |
jppfs_cor_NotesAndAccountsReceivableTradeNet | 受取手形及び売掛金(純額) |
おわりに
次回の記事では、xbrlファイルからの情報の抽出に必要な機能を補助関数として定義する。
*1:ここでの年度とは、3月決算企業の期末日を想定している。すなわち、2019年3月決算の企業群に対して1回行うだけでよい。ただし、筆者は3月決算企業(提出日が6月の企業)以外に試したことはない。