大量のデータに溺れない方法を監査的視点で考える


はじめに
- 
この記事は、[Supershipグループ Advent Calendar 2020](https://qiita.com/advent-calendar/2020/supership "Supershipグループ Advent Calendar 2020")の18日目の記事です。

自己紹介
-
Supership プロダクト開発本部に所属しており、データサイエンスをかじったりPMをやったりしています。
Supershipに入るまではアカデミック〜ビジネスまで色んなデータを扱ってきました。
簡単な経歴としては、
①生体信号の分析をする人→②監査法人でデータ監査する人→③SaaSでビジネスアナリティクスする人→④Supership
一言にデータといえども色んなデータがあるなとしみじみ思います。

何の記事？
-
いろいろな業界でデータを扱って学んだことは、データの再現性、透明性、検算ってとっても大事だということです。
そこで、自分自身のデータの扱い方を変えるきっかけとなった監査法人でのデータの扱い方について書こうと思います。

前置き
-
####1. 大量のデータとの戦い
データサイエンスにおいて扱うデータ量は膨大なのが当たり前だと思います。
なかなか全容の掴めない大量のデータに溺れてしまいそうになる日々ではないでしょうか。
正直な話、一旦解析を始めると、ロジックの精度向上やscriptの効率性などを考える優先度が高くなり、その他の部分は疎かになってしまいがちだと思います。
その他の部分とは具体的に、データの正確性や網羅性の確認のことを指します。
もっと正直に具体的に大袈裟に言うと、最終的な結果以外どうでもよくなってないかということです。

データを解析する立場としては、たくさんの理論を積み重ね、検証を繰り返し、自信のある処理を行っています。
それでもデータは私達を簡単に裏切ってエラーを出したり、こっそりエラーになっていたり、そもそも間違ったデータを提供されていたりもすることも往々にしてあると思います。
いくら理論的には素晴らしくてもデータがおかしかったら元も子もないのではないでしょうか。
後の祭りとなる前に、そんな状況を作らないようにしないといけないと思っています。（何度もお祭り経験済み）

####2. 監査法人でのデータ分析
監査におけるデータとは主に財務諸表に係るデータ、つまり仕訳データなどお金に関するデータを扱います。
また、監査法人という立場上データの扱いにおいて、特に正確性、網羅性、実在性などが重視され、検算すること、データに再現性があることが当然のように求められます。
このような業界での経験からデータの確からしさを担保することの重要性や、それを確認するための考え方が身につきました。
その経験が現在の業務において大量のデータを扱う際に非常に役立っています。

####3. 紹介する内容
少し昔の記憶を辿ること、会計の話がキーではないことから、会計論的に誤っている部分もあるかと思いますが、温かく見守っていただければ幸いです。

会計監査とはB/S（貸借対照表）やP/L（損益計算書）、T/B（試算表）が正しいことを前提に手続きが進められます。
しかし、B/SやP/L、T/Bが絶対に正しいことは誰にもわかりません。
もちろんそれらの書類の作成元であるシステムの監査を行うことで、ある程度の担保はしているもののそれでは不十分と考えられています。
したがって、B/SやP/L、T/Bが正しいことを証明するために、監査ではその会社の1年間のすべての取引データ（G/L：総勘定元帳）から検算を行います。
要は一番細かい粒度のデータから最終的なデータを再現できるかの確認を行うのです。

確認方法紹介
-
（なるべく会計の話にならないに気をつけたものの、会計の話にはなっているので意味不明だったら飛ばしてください）
#### ①前提となる会計のお話
- 仕訳の貸借は一致する
- 期末残高 = 期首残高 + 期中のお金の動き（期中の合計Dr - 期中の合計Cr)
    - Dr : 借方（デビット）
    - Cr : 貸方（クレジット）
    - 期首残高の信頼性は前年度の監査において担保済み

#### ②流れ
以下のような流れで再現していきます。
①【ざっくり確認】検証に使用するG/Lデータが、ちゃんと欲しいデータであるか確認する
②【ミクロ視点確認】全取引データの仕訳単位で貸借が一致することを確認する
③【マクロ視点確認】勘定科目ごとに全取引データから期末残高を再現できることを確認する

会計っぽくてよくわからないと思うので、例えばトトロのパズルを完成させたいとすると上記の工程は、
①買ったのがトトロのパズルなのか確認する（ラピュタのパズル買ってないよね？）
②買ったパズルのピースを数える（ちゃんと1000ピースあるの？）
③パズルを完成させて、完成予想図と比較してみる（同じ絵になったかな？）
あまりうまく例えられていない気がしますが、なんとなくこんなイメージです（すみません）。

#### ③各工程で行うこと
#####工程①【ざっくり確認】検証に使用するG/Lデータが、ちゃんと欲しいデータであるか確認する
- **やること**：単純に欲しいデータがすべてもらえているか確認する
- **方法**：全データを月別に件数と金額を集計し、1年間のトレンドから著しく外れる月がないか確認を行う
- **目的**：実は3月1日〜3月15日のデータだけDBから抜き漏れて欠損してました。  というような状況で検証をしても、ゴールにたどり着けなくて困るから。

#####工程②【ミクロ視点確認】全取引データの仕訳単位で貸借が一致することを確認する
- **使う法則**：仕訳は貸借が一致する
- **やること**：仕訳ごとに貸借が一致することを確認する。
- **方法**：一番細かい状態の取引データを、仕訳ごとに集計する。仕訳ごとに貸借の金額が一致するかどうか、Dr - Cr = 0になることを確認する。
- **目的**：一つ一つの取引が正しい形（貸借一致）で記録されていることの確認。

#####工程③【マクロ視点確認】勘定科目ごとに全取引データから期末残高を再現できることを確認する
- **使う法則**：期末残高 = 期首残高 + 期中のお金の動き（期中のDr. - 期中のCr.)
- **やること**：期末残高を一番細かいデータから再現する。
- **前知識**：T/B（試算表）には勘定科目毎に期首残高、Dr、Cr、期末残高が記載されていて、データの状況は以下の通り  
    - 期首残高：前年度の監査において正確性が担保されている
    - Dr：取引データから算出可能
    - Cr：取引データから算出可能
    - 期末残高：合っているか確認したい金額
- **方法**：取引データを仕訳ごとに集計し、それを更に集計して勘定科目ごとのDr（再現Dr）、Cr（再現Cr）の金額を算出する。
そこから再現した期末残高 = 期首残高 + 再現Dr - 再現Cr = T/B記載の期末残高が成立することを確認する。
- **目的**：一番細かい元データからちゃんと最終形のデータが再現できることでデータの信頼性を担保する。

####④紹介した内容のまとめ
以上の工程①〜③を行うことで、膨大な量の元データの正確性、網羅性が担保され信頼性の高いデータであることを確認できます。
監査では考え得る限りの理論値を作り、1つのデータ内での確認、複数データを組み合わせての確認など、あらゆる手を尽くして地道に証明していきます。何種類もの理論値を作り、すべての整合性が取れることを確認して初めて検算が完了します。
（正直最初はなんて面倒な検算をやたらめったらするんだと思って憂鬱でした…）

####⑤データサイエンスに活かすとしたら
たとえば大量のデータを集計したり、色々なロジックを経てX（X = A * α + B * β）という値を算出したとします。
最終的になアウトプットとしてXしか見えない場合、解析者以外が見ると大量のデータから出てきたただ1つのXという値は得体の知れない物体となる可能性があると思います。
その場合Xの透明性は、AもαもBもβも明確であれば検算可能だし、説明や証明もスムーズに行えます。
Xの算出式がもっと複雑になったとしても、データの変形遷移とその変形に使ったパラメータさえあれば簡単に再現可能です。


まとめ
-
だいぶマニアックで汎用性の乏しい事例の紹介になってしまいました。
そして、紹介した手法をそのままデータサイエンス領域に転用するのはあまり現実的ではないかも知れません。
しかし、これらの経験からデータを扱う上で持っておくべき感覚として

- データの再現性を大事にする
- 多面的にデータを捉える
- ブラックボックスは作らない
- データは基本的に疑う  

これらの感覚はどんな場面でも重要であると感じています。
データサイエンティストが扱うデータはいわゆるビッグデータで、全容を簡単に把握することが難しいと思います。
どんなエラーやイレギュラーが含まれているのかすぐには判断つかないのではないでしょうか。
それでも上記のような考えの元、面倒でも大変でも中間データの確認や保存を意識的に行うことで、何か起きても傷が浅いうちにリカバリしやすくなると思います。
また、クライアントワークをしている以上、大量のデータの中で迷子にならず、誰もが納得できるデータで検証することが大事なのではないかと思います。
小生意気に色々書きましたが、私自身がこの考え方を忘れないように業務に励んでいきたいと思います！


最後に
-
Supershipではプロダクト開発やサービス開発に関わる人を絶賛募集しております。
ご興味がある方は以下リンクよりご確認ください。
[Supership株式会社 採用サイト](https://supership.jp/recruit/ "Supership株式会社 採用サイト")
是非ともよろしくお願いします。