4 財務データの加工,集計,及び可視化

2024-05-01


1 財務データの読み込み(教科書第4.2節)

1.1 readrread_csv()関数を用いたデータの読み込み

[1] 7920
# A tibble: 6 × 11
   year firm_ID industry_ID sales    OX   NFE     X     OA     FA    OL     FO
  <dbl>   <dbl>       <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl>  <dbl> <dbl>  <dbl>
1  2015       1           1 5261.  437.  NA    287. 13006.  3543. 4373.  2481.
2  2016       1           1 5949.  564.  50.7  513. 13866.  4642. 4534.  3960.
3  2017       1           1 6505.  691.  29.5  662. 13953.  7744. 5111.  6159.
4  2018       1           1 6846.  751.  86.5  665. 18818.  7285. 5137. 10124.
5  2019       1           1 7572.  959. 298.   660. 18190   9735. 5488. 11362.
6  2020       1           1 7538.  778. -65.5  844. 20463. 10274. 5371. 13772.

1.2 read_csv()関数の特徴

  1. データの読み込みがより高速であり,かつ,型推論が柔軟である.
  2. 読み込んだデータをデータフレームではなく,その改良版であるtibbleで返す.
  • データフレームには,列名の空白を勝手に.(ピリオド)に変換したり,うっかりprint()関数で表示すると膨大な行数全てを表示してしまったりと,様々な不都合な側面があり,tibbleはそれらを改良したものである1
  1. 列名を勝手に(X.1, X.2, X.3などのように)変換しない.
  2. 文字列を勝手にファクター型扱いしない.

1.3 read_csv()関数の型推論の柔軟性

'data.frame':   21 obs. of  3 variables:
 $ date : chr  "2020-04-01" "2020-04-02" "2020-04-03" "2020-04-06" ...
 $ firm1: num  -0.03948 0.00598 0.05579 0.04193 -0.02019 ...
 $ firm2: num  0.07696 -0.00725 -0.0173 0.00217 0.07555 ...
spc_tbl_ [21 × 3] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ date : Date[1:21], format: "2020-04-01" "2020-04-02" ...
 $ firm1: num [1:21] -0.03948 0.00598 0.05579 0.04193 -0.02019 ...
 $ firm2: num [1:21] 0.07696 -0.00725 -0.0173 0.00217 0.07555 ...
 - attr(*, "spec")=
  .. cols(
  ..   date = col_date(format = ""),
  ..   firm1 = col_double(),
  ..   firm2 = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 
  • read_csv()関数で読み込んだdate列が日付型 (Date)になっていることが確認できる.他方,基本パッケージのread.csv()関数で読み込むと,この列は文字型 (chr)と認識されていたので,read_csv()関数の方がより正確に型推論できていることが分かる.

1.4 ファクター型への変換

[1] "numeric"
[1] "numeric"
  • firm_ID列とindustry_ID列は,いずれもカテゴリカル変数にも関わらず,数値型 (numeric)になっている.
  • そこで,as.factor()関数を使ってきちんとファクター型に変換しておこう.

1.5 (続)ファクター型への変換

# A tibble: 6 × 11
   year firm_ID industry_ID sales    OX   NFE     X     OA     FA    OL     FO
  <dbl> <fct>   <fct>       <dbl> <dbl> <dbl> <dbl>  <dbl>  <dbl> <dbl>  <dbl>
1  2015 1       1           5261.  437.  NA    287. 13006.  3543. 4373.  2481.
2  2016 1       1           5949.  564.  50.7  513. 13866.  4642. 4534.  3960.
3  2017 1       1           6505.  691.  29.5  662. 13953.  7744. 5111.  6159.
4  2018 1       1           6846.  751.  86.5  665. 18818.  7285. 5137. 10124.
5  2019 1       1           7572.  959. 298.   660. 18190   9735. 5488. 11362.
6  2020 1       1           7538.  778. -65.5  844. 20463. 10274. 5371. 13772.
  • # A tibble:6 x 11以下を見てみると,各変数の下にはそれぞれの変数のデータ型が記述されており,firm_IDindustry_IDの下にある<fct>は,factor(ファクター)型を意味する.それ以外の列の<dbl>double(倍精度浮動小数点数)型を意味し,実数を表すのに用いられる数値型の一種である.

2 探索的データ分析(教科書第4.3節)

2.1 データセットの概要確認

  • 初見のデータセットを扱う場合,データ分析を本格的に始める前にまずはその概要を大まかに掴む必要がある.その作業を一般に探索的データ分析 (exploratory data analysis)と言い,データの特徴や構造を理解することを目的とする.
  • 一口に探索的データ分析と言っても,データの性質に応じて様々な方法が考えられるが,まずは手始めにsummary()関数を用いてみよう.

2.2 (続)データセットの概要確認

      year         firm_ID      industry_ID       sales        
 Min.   :2015   1      :   6   3      :1760   Min.   :    205  
 1st Qu.:2016   2      :   6   10     :1702   1st Qu.:  16103  
 Median :2018   3      :   6   7      :1334   Median :  40431  
 Mean   :2018   4      :   6   1      :1143   Mean   : 166007  
 3rd Qu.:2019   5      :   6   9      : 667   3rd Qu.: 118314  
 Max.   :2020   7      :   6   8      : 429   Max.   :3496433  
                (Other):7884   (Other): 885                    
       OX                 NFE                  X                   OA         
 Min.   :-353606.7   Min.   :-285383.9   Min.   :-357624.8   Min.   :    217  
 1st Qu.:    399.3   1st Qu.:    -66.4   1st Qu.:    383.3   1st Qu.:  12560  
 Median :   1602.9   Median :     -1.2   Median :   1586.1   Median :  30799  
 Mean   :   7968.9   Mean   :     64.0   Mean   :   7904.9   Mean   : 152273  
 3rd Qu.:   5260.5   3rd Qu.:     41.4   3rd Qu.:   5204.6   3rd Qu.:  93469  
 Max.   : 398034.5   Max.   : 331035.3   Max.   : 572588.7   Max.   :7987936  
                     NA's   :1                                                
       FA                 OL                FO         
 Min.   :     288   Min.   :     35   Min.   :     44  
 1st Qu.:    6835   1st Qu.:   3965   1st Qu.:   3757  
 Median :   19095   Median :  10868   Median :  11125  
 Mean   :   80185   Mean   :  50261   Mean   :  70681  
 3rd Qu.:   52118   3rd Qu.:  33111   3rd Qu.:  35446  
 Max.   :29250611   Max.   :2817975   Max.   :7026924  
                                                       
  • summary()関数は,数値型(整数型や倍精度浮動小数点数型)が代入された場合,各データセットに含まれる各変数の平均や中央値,分位点を返す.
  • ファクター型に対しては,要素数が多いカテゴリーを上から順に表示する.

2.3 欠損データの処理

[1] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE
  • ここで登場したTRUEFALSEは,通称論理型 (logical)と呼ばれるデータ型である.その特徴は,TRUEFALSEの二つのみで構成される点にある.この二つを算術関数の引数として用いると,TRUEが1,FALSEが0と解釈されるので,sum()関数の引数にcomplete.cases(financial_data)を代入することで,欠損が無い観測値数を数え上げてくれる.
[1] 7919

2.4 (続)欠損データの処理

  • 欠損データの処理について,最も単純な方法は,欠損値が含まれる観測データを削除してしまうことである.
  • tidyrに含まれるdrop_na()関数は,第二引数を省略した場合,入力されたデータフレームに対し,欠損値が存在しない行のみを抽出して返す.
# A tibble: 6 × 11
   year firm_ID industry_ID sales    OX   NFE     X     OA     FA    OL     FO
  <dbl> <fct>   <fct>       <dbl> <dbl> <dbl> <dbl>  <dbl>  <dbl> <dbl>  <dbl>
1  2015 1       1           5261.  437.  NA    287. 13006.  3543. 4373.  2481.
2  2016 1       1           5949.  564.  50.7  513. 13866.  4642. 4534.  3960.
3  2017 1       1           6505.  691.  29.5  662. 13953.  7744. 5111.  6159.
4  2018 1       1           6846.  751.  86.5  665. 18818.  7285. 5137. 10124.
5  2019 1       1           7572.  959. 298.   660. 18190   9735. 5488. 11362.
6  2020 1       1           7538.  778. -65.5  844. 20463. 10274. 5371. 13772.
# A tibble: 6 × 11
   year firm_ID industry_ID sales    OX    NFE     X     OA     FA    OL     FO
  <dbl> <fct>   <fct>       <dbl> <dbl>  <dbl> <dbl>  <dbl>  <dbl> <dbl>  <dbl>
1  2016 1       1           5949. 564.   50.7  513.  13866.  4642. 4534.  3960.
2  2017 1       1           6505. 691.   29.5  662.  13953.  7744. 5111.  6159.
3  2018 1       1           6846. 751.   86.5  665.  18818.  7285. 5137. 10124.
4  2019 1       1           7572. 959.  298.   660.  18190   9735. 5488. 11362.
5  2020 1       1           7538. 778.  -65.5  844.  20463. 10274. 5371. 13772.
6  2015 2       1           3506.  45.8   5.75  40.1  2978.  2258. 1840.  2341.

3 データの加工から可視化まで(教科書第4.4節)

3.1 dplyrのパイプ演算子の使い方

目標

  • 2015 年度のデータのみを抽出して,売上高の自然対数をヒストグラムで描画してみよう.

  • パイプ演算子%>%は,左側で処理されたデータフレームを,右側の関数の第一引数として受け渡す役割を果たす.

3.2 実際の使用例

  • パイプ演算子%>%の入力は,Rstudio上で以下のショートカットキーを利用すると便利である.
    • Macの場合: ⌘ + Shift + m
    • Windowsの場合: Ctrl + Shift + m
# A tibble: 1,265 × 11
    year firm_ID industry_ID  sales      OX     NFE       X     OA     FA     OL
   <dbl> <fct>   <fct>        <dbl>   <dbl>   <dbl>   <dbl>  <dbl>  <dbl>  <dbl>
 1  2015 2       1           3.51e3    45.8    5.75    40.1 2.98e3  2258. 1.84e3
 2  2015 3       1           4.41e5 -8246.   188.   -8435.  6.98e4 63530. 3.13e4
 3  2015 4       1           3.97e4   440.    -3.50   444.  1.66e4 15754  4.98e3
 4  2015 5       1           4.21e5 11191.  -863.   12054.  2.17e5 97301. 1.11e5
 5  2015 6       1           2.61e4 -2404.   102.   -2506.  8.65e3  5145. 2.89e3
 6  2015 7       1           3.90e4   282.   -41.1    323.  1.92e4 11663. 4.44e3
 7  2015 9       1           4.71e4   360.     4.52   356.  2.04e4  3322. 5.02e3
 8  2015 10      1           3.66e4   739.    58.2    681.  2.35e4  6356. 6.64e3
 9  2015 11      1           4.12e5 15742.   -35.6  15778.  1.46e5 79968. 6.16e4
10  2015 12      1           4.03e3    17.4  -11.9     29.3 1.34e3   786. 6.38e2
# ℹ 1,255 more rows
# ℹ 1 more variable: FO <dbl>

3.3 抽出後,更に列選択して別名で保存

  • 抽出後にfirm_IDyearsalesの三列を選択し,こうして出来上がった新たなデータフレームをfinancial_data_2015として定義しよう.
# A tibble: 6 × 3
  firm_ID  year   sales
  <fct>   <dbl>   <dbl>
1 2        2015   3506.
2 3        2015 440790.
3 4        2015  39725.
4 5        2015 420762.
5 6        2015  26111.
6 7        2015  38979.

3.4 2015年度のデータを抽出して一気に可視化まで処理

  • わざわざfinancial_data_2015を作らなくても,目標を達成するだけであれば,filter()関数を適用した後のデータをggplot()関数に引き渡してあげれば良い.

3.5 ヒストグラムを描画し,体裁を整える

  1. ヒストグラムの描画
  2. x軸の位置を調整
  • ggplot2でヒストグラムを描くには,geom_histogram()関数を用いる.
  • aes()引数には,\(x\)軸の値としてlog(sales)を指定する.
  • scale_y_continuous(expand = c(0,0))はヒストグラムが\(x\)軸にぴったりくっ付くよう調整する役割を果たす.

4 mutate()関数を使って新たな列の追加(教科書第4.6節)

4.1 会計上の株主のリターン \(=\) ROE

4.2 ROEの計算方法

\[ \begin{align} ROE_{t} = \frac{X_{t}}{\mathit{BE}_{t-1}} \label{eq:ch04_ROE} \end{align} \]

  • ここで分子の\(X_{t}\)\(t\)期の当期純利益を指し,分母の\(\mathit{BE}_{t-1}\)\(t\)期首(別の言い方をすると\(t-1\)期末)の株主資本を指す.
  • 分母の\(\mathit{BE}\)は一期前の値を取っていることに注意しよう.
  • これは,ROEを期首時点の株主の投資額(期首の株主資本)に対する期中の投資の成果(期中の当期純利益)と解釈するためである.
  • こうして計算されたROEは,一期間における会計上の株主のリターンを表す.

4.3 ここでの目標

目標

  • 目標1: financial_data\(t\)期末の株主資本BE列を追加する.
  • 目標2: 次に,financial_data\(t-1\)期末の株主資本を表すlagged_BE列を追加する.
  • 目標3: financial_dataROE列を追加
  • 目標4: こうして計算されたROEをヒストグラムに可視化する.

4.4 目標1: BE列の追加

  • dplyrでは新しい列を追加するのにmutate()関数を用いる.

4.5 目標2: lagged_BE列の追加

4.6 先のコードの概要

  • 2行目: 以下の処理により作成されるデータフレームをfinancial_dataに上書き.
  • 3行目: group_by()関数を用いて,firm_IDに基づくグループ化情報を付与
  • 4行目: mutate()関数内でlag()関数を使うことで,lagged_BE列を作成し,そこに一期前のBEを格納.
  • 5行目: ungroup()関数を用い,不要になったグループ化情報を消去.これを忘れると,変数にグループ化情報が付与されたままになって,その後の処理も意図せずグループごとに行われてしまうので注意しよう.

4.7 目標3: ROE列を追加

  • 最後にmutate()関数を使って,ROE列を追加しよう.

4.8 実践上はパイプ演算子を繋げて書く

4.9 目標4: ROEのヒストグラム

  • 最終目標として,ggplot2を利用し,ROEをヒストグラムにより描画しよう.

  • geom_histogram()関数のbreaks引数により\(x\)軸の範囲とビン幅を調整している.
  • seq()関数は等差数列を作成するための関数であり,第一引数に始点,第二引数に終点,第三引数に等差数列の差分を取る(教科書84頁)
  • ここでは-0.2から0.4までのROEを描画することを考え,ビン幅に相当する等差数列の差分は0.01としてみよう.

5 集計作業(教科書第4.7.1節の応用)

5.1 summarize関数の使い方

目標

  • ROEが計算可能な観測値のみを抽出し,年度ごとにROEの平均値を求めよ.
# A tibble: 5 × 2
   year mean_ROE
  <dbl>    <dbl>
1  2016   0.0738
2  2017   0.0761
3  2018   0.0779
4  2019   0.0804
5  2020   0.0802

5.2 先のコードの概要

  • 3行目: tidyrに含まれるdrop_na()関数は,第二引数で指定した変数(この場合であればROE列)に欠損値が存在しない行のみを抽出して返す(教科書152頁)
  • 4行目: group_by()関数を用いて,年度yearに基づいてグループ化.
  • 5行目: そしてsummarize()関数を用いて,各グループ(年度)ごとに平均ROEを計算し,mean_ROE列に保存する.
    • (注意点)summarize()関数を適用することにより,グループ化は解除されるため,ungroup()の追加は不要である.ただし,summarize()関数は1つのグループしか解除しないため,複数の変数でグループ化した場合は,最後にungroup()関数を挿入する必要がある.

5.3 平均値計算から可視化までを一度に処理

5.4 練習問題

Exercise 1

  • firm_ID350の企業の売上高を折れ線グラフで表示せよ.ただし,\(y\)軸は売上高sales\(x\)軸は年度year を取ることとする.

Exercise 2

  • 最終年度のROEに関して20%分位点を求め,ROE_first_quintileという変数に保存せよ.
    • (ヒント) 分位点を求めるにはquantile()関数を用いる.この関数は第一引数にデータセット,第二引数に求めたい分位点の値をパーセントでなく小数表示で代入する.また,データセットに欠損値が含まれている場合,na.rm = TRUE を追加する必要がある.na.rmはremove NA values の略を意味する.
  • 最終年度の ROEがROE_first_quintileより小さい企業は何社あるか答えよ.ただし,ROEが欠損している企業はカウントしないこと.