【R】 XBRLから財務諸表項目を吸い上げる

# 1. 趣旨
前回: [よく分からないXBRLをざっくり理解したい男たち!!](https://qiita.com/zakkiiii/items/d2dac59eb4447f36f0e6)

これの続きとして、XBRLをデータとしてRで具体的にどう処理するか、やってみました。
結論から言えば、XML文書と全く同じ取り扱いができます。

# 2. 今回の目標
前回の記事で「現金及び預金」の要素名などが分かったところで、今回はその数値情報をRで吸い取ってみたいと思います。

より厳密には、以下の3つの条件に合致するデータを取得します。

- 連結上の
- 当期末の
- 「現金及び預金」計上額


## 2-1. 対象
前回と同じです。公式サンプルを利用します。

[2020年版EDINETタクソノミの公表について：金融庁](https://www.fsa.go.jp/search/20191101.html)

- `3. 公表資料 > (1)EDINETタクソノミ関連 > (h)サンプルインスタンス(ZIP)`をダウンロード・展開。
- `サンプルインスタンス\ダウンロードデータ\02_開示府令-有価証券報告書\S002XXXX\XBRL\PublicDoc\jpcrp030000-asr-001_X99001-000_2020-03-31_01_2020-06-28.xbrl`を分析する。

## 2-2. 復習
XBRL本体（インスタンス）での現金及び預金の記述は、以下の通りです。

```XML:4301行目
  <jppfs_cor:CashAndDeposits contextRef="CurrentYearInstant" unitRef="JPY" decimals="-6">95111000000</jppfs_cor:CashAndDeposits>
```

つまり、この「95111000000」という数値が抽出できれば成功です。


# 3. コード
```R
> library(xml2) 
> xbrl <- read_xml("jpcrp030000-asr-001_X99001-000_2020-03-31_01_2020-06-28.xbrl")
> xml_find_all(xbrl, xpath = '//jppfs_cor:CashAndDeposits[@contextRef = "CurrentYearInstant"]' ) %>% xml_text()
[1] "95111000000"
```

# 4. 解説
## 4-1. xml2パッケージ
XML形式のファイルを操作するためには、`xml2`パッケージが必要になります。
そして**XBRLはXMLの派生形なので、なんとこのパッケージで操作できます**。やったね。

持っていない方は入れておきましょう。

```R
> install.packages("xml2")
> library(xml2)
```

## 4-2. XBRLファイルの読み込み

`xml2`パッケージ内の`read_xml()`関数は、XMLファイルを読み込んでR上で操作・分析できるようにしてくれます。
通常、引数にはXMLファイルが来るところを、今回は**XBRLファイルを引数に設定します**。

```R
> xbrl <- read_xml("jpcrp030000-asr-001_X99001-000_2020-03-31_01_2020-06-28.xbrl")
```
これを`xbrl`オブジェクトとして格納しておきます。

## 4-3. 要素・テキストの抽出
流れは`rvest`パッケージと同じです。
すなわち、**「要素を抽出⇒要素内のテキスト部分だけを抽出」**ということをやればOKです。

参考: [RでQiitaの記事を取得しよう - Qiita]
(https://qiita.com/zakkiiii/items/18b177f332bf90c65fdb#%E7%89%B9%E5%AE%9A%E3%81%AE%E6%83%85%E5%A0%B1%E3%81%AE%E6%8A%BD%E5%87%BA)


### 4-3-1. 要素の抽出

```R
> xml_find_all(xbrl, xpath = '//jppfs_cor:CashAndDeposits[@contextRef = "CurrentYearInstant"]' )
{xml_nodeset (1)}
[1] <jppfs_cor:CashAndDeposits contextRef="CurrentYearInstant" unitRef="JPY" decimals="-6">95111000000</jppfs_cor:CashA ...
```

`xml_find_all()`は、xpathの条件に合致する要素をリスト形式で全部抜き出してくれる関数です。
xpathとは、XBRL文書（**インスタント**といいます）内の要素を参照するときのパスです。

#### 4-3-1-1. xpathの設定
**恐らくこの記事の中で一番難しいのがココです**。
頑張りましょう。

「有価証券報告書の分析」という目的の達成のためだけであれば、xpathに対して深い理解は不要です。
ようは、**xpathとは、「現金及び預金」、「売上高」といった要素が文書全体のどこにあるかを特定するためのパスです**。

#### 4-3-1-2. XBRL上のxpathの雛型

財務諸表項目であれば、基本的にコレで行けると思います。


```R
xpath = '//名前空間:要素名[@contextRef = "年度・期間、連結の特定"]'
```

##### 4-3-1-2-1. 名前空間・要素名
以下の記事を参考に、名前空間と要素名を特定してください。
[よく分からないXBRLをざっくり理解したい男たち!! - Qiita](https://qiita.com/zakkiiii/items/18b177f332bf90c65fdb#3-3-%E7%89%B9%E5%AE%9A%E3%81%AE%E6%83%85%E5%A0%B1%E3%81%AE%E6%8A%BD%E5%87%BA)



例えば、現金であれば`jppfs_cor:CashAndDeposits`、売上高であれば`jppfs_cor:NetSales`になります。
しかし、この後すぐ説明する`contextRef`属性を設定しないと、**色んな「現金及び預金」（前年度のものや単体のもの）が抽出されてしまいます**。

```R
> xml_find_all(xbrl, xpath = '//jppfs_cor:CashAndDeposits')
{xml_nodeset (4)}
[1] <jppfs_cor:CashAndDeposits contextRef="Prior1YearInstant" unitRef="JPY" decimals="-6">78030000000</jppfs_cor:CashAn ...
[2] <jppfs_cor:CashAndDeposits contextRef="CurrentYearInstant" unitRef="JPY" decimals="-6">95111000000</jppfs_cor:CashA ...
[3] <jppfs_cor:CashAndDeposits contextRef="Prior1YearInstant_NonConsolidatedMember" unitRef="JPY" decimals="-6">5462000 ...
[4] <jppfs_cor:CashAndDeposits contextRef="CurrentYearInstant_NonConsolidatedMember" unitRef="JPY" decimals="-6">114130 ...
```

そこで、この中から**さらに絞り込みを行う**ために、抽出する情報を`contextRef`属性で特定します。

##### 4-3-1-2-2. contextRef属性
`contextRef`は、環境を表す属性で、大きく3つの項目[^1]を表現します。

- どの年度の項目か
- ストック項目かフロー項目か
- 連結か単体か

[^1]: 他にも例えばセグメント情報等の場合、セグメントを特定するための項目等が加わりますが、財務諸表の外であること、あまりにも複雑になることから、今回は省略します。

###### 年度・期間の特定
|年度（ストック項目）|期間（フロー項目）|記述法|
|---|---|---|
|当期末|当期|CurrentYear|
|当期首 = 前期末|前期| Prior1Year |
|前期首 = 前々期末|前々期| Prior2Year |

###### ストック / フローの特定
|項目の性質|記述法|
|---|---|
|ストック| Instant |
|フロー|Duration|

なお、キャッシュフロー計算書は基本的にはフロー項目ですが、現金等の期首残高・期末残高はフロー項目に該当するので注意しましょう。

###### 連結 / 単体の特定
|項目の性質|記述法|
|---|---|
|連結| (不要) |
|単体|_NonConsolidatedMember|

#### 4-3-1-3. xml_find_all()・xpathの記述例
以上の雛型と表を参考にしながら、当期末の現金預金残高を特定しましょう。

|環境|欲しい対象|記述法|
|---|---|---|
|年度| 当期末 | CurrentYear |
|ストック / フロー|ストック| Instant |
|連結 / 単体|連結|(不要) |

この記述法を**「年度⇒ストック⇒連結」の順番にスペースなしで繋げます**。

```
@contextRef = "CurrentYearInstant"
```

なお、前年度の単体の売上高（フロー項目）が必要であれば、以下のようになります。

```
@contextRef = "Prior1YearDuration_NonConsolidatedMember"
```

これで`contextRef`の記述が完成しました。
以上を雛型に当てはめれば完成です。

```R
> xml_find_all(xbrl, xpath = '//jppfs_cor:CashAndDeposits[@contextRef = "CurrentYearInstant"]' )
```


#### 4-3-1-4. xml_find_all()の留意点

- **シングルクォーテーションとダブルクォーテーションを必ず使い分けてください**。どちらか一方で書くと、必ずエラーが発生します。
 

### 4-3-2. テキストの抽出

お疲れ様でした。
ここまで来れば簡単です。
`xml_text()`を使うと、要素からテキストを抽出して返してくれます。

```R
> xml_find_all(xbrl, xpath = '//jppfs_cor:CashAndDeposits[@contextRef = "CurrentYearInstant"]' ) %>% xml_text()
[1] "95111000000"
```

# 5. おわりに

~~ストック / フローを環境属性として設定するメリットが全くないと思うのですけど。~~

~~本来、年度と単体 / 連結だけ選べば欲しい情報は十分特定できるはずなんですよ。
「現金及び預金」という要素それ自体がB/S項目として定義されている以上、ストック情報しかないでしょ、と。
現金のフロー情報は別の独立した要素として記録しているのに、何でわざわざストックかフローかを利用者で特定しなければならないのかというね。
偉い人にはそれがわからんのです。~~

それはさておき、XBRLファイルから財務情報を抽出することができました。
こんな感じで、**XBRLファイルはR上でXMLファイルとして扱えますよー**、という。

ここまで行ければ、複数ファイルをまとめて分析できるはずです。
ループ関数とか使えば、XBRLをスクレイピングして根こそぎ分析できるようになると思います。

おしまい。

# 6. 参考文献
<b>外部</b>

- [xml2 Reference manual](https://cran.r-project.org/web/packages/xml2/xml2.pdf)
- [2020年版EDINETタクソノミの公表について：金融庁](https://www.fsa.go.jp/search/20191101.html)


<b>自分の作成した記事</b>

- [RでQiitaの記事をスクレイピングしよう - Qiita](https://qiita.com/zakkiiii/items/18b177f332bf90c65fdb)
- [よく分からないXBRLをざっくり理解したい男たち!! - Qiita](https://qiita.com/zakkiiii/items/d2dac59eb4447f36f0e6)