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による実装

手順

流れは以下の通りである。

  1. zipファイルを一つ解凍する。

  2. 解凍したデータから、label情報をもつxmlファイルへの(外部)リンクを取り出す。

  3. 日本語のlabel情報をもつxmlファイルを"jppfs_label_YYYY.xml"として保存する。

  4. そのxmlファイルをdata.frameに読込み、文字コードの修正と冗長ラベルの削除を挟んでから、labelString及びelementIdを含む"JGAAP_label_YYYY.csv"をlabelフォルダに保存する。

  5. 解凍したファイルを削除する。

手順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月の企業)以外に試したことはない。