ABEJA Tech Blog

中の人の興味のある情報を発信していきます

機械学習におけるEDAって結局何するの?

ABEJAでデータサイエンティストをしている服部です。 「EDAって結局何したらいいの?」っていう声をよく聞く気がするので、無謀にも今回はEDAについて記事を書いてみました。

本記事はABEJAアドベントカレンダー2023 25日目の記事です。

EDAとは

EDAは「Exploratory Data Analysis」の略で「探索的データ分析」と日本語では言います。 データの特性だったりデータから何が言えるかを把握するための分析であり、JohnTukey氏により1960~70年頃に統計学の分野で提唱されたようです。 今では機械学習の分野でも、「まずEDAをしてからモデルを作ろう」と言われる場面をよく見かけ、EDAをすることは当たり前になってきています。

en.wikipedia.org

本記事のモチベーション

EDAに関する情報もたくさん調べると出てきますが、EDAのためのPythonライブラリだったり、可視化の方法について述べられることがほとんどであり、EDAとして実際に何をしたらいいのか?どういう観点でデータを見たらいいのか?ということを述べられていることは少ないように思えます。 そこで、本記事では、あまり他では触れられていないEDAをどう実施していくかについて書きたいと思います。

ただし、EDAのやり方・考え方として、こうやるのが絶対正しい!と呼ばれるものは存在しないと思います。ここではあくまで私個人の考えるEDAについて述べます。なので、変なところがあっても大目に見てください笑

本記事で扱うEDAについて

そもそもEDAという言葉が広範囲で使われるのですが、本記事では以下を満たす範囲のEDAについて扱いたいと思います。

  • 機械学習を扱う前提のEDA
  • 共有目的ではない
  • 序盤と中盤以降のEDA両方

実際には統計寄りで機械学習を使わない前提のEDAであったり、人に見せるためのEDAなどもありますが、ここでは扱いません。

箇条書き3つ目の序盤と中盤以降の話についての補足です。EDAとは何か調べると、「モデルを作る前に最初に行う分析」という意味合いと「モデルの改善などの後フェーズも含めた分析」という意味合い、どちらの説明も出てくると思います。 ここでは後者のより広い範囲のことをEDAとして話を進めます。 ちなみに日本ではあまり耳にしませんがIDA(Initial Data Analysis)という言葉も存在します。このIDAがまさに「モデルを作る前に最初に行う分析」であるとも言えます。

EDAの目的: データとモデルをつなげる

すごく抽象的ですが、EDAの目的はこういうことだと私は考えています。 (今回の記事のスコープでいうと)EDAは、あくまで機械学習のモデルを作るためのプロセスの1つです。 極論、機械学習モデルのモデル設計だったり、前処理だったり、精度だったりに影響しない部分でのデータの理解はあまり意味がありません。 (別観点でサービスの改善に活かせる等の副次的なものは別物として扱います)

そして、機械学習モデルは当然ですがデータ有りきです。データの性質によって使うべきモデルや精度は変わります。 このモデルにとって大事な観点でのデータの性質を理解する、つまりモデルにとってデータの大事な性質を見つけ出し、少しでも近づけて結びつけることが大事だと思います。

例えば、勾配ブースティングのモデルで高い精度を出したいときに、「勾配ブースティングでは特徴量づくりが大事 → まだ特徴量として表現しきれていない変数について他に特徴量が作れないかデータを見てみよう」というように、特徴量という形でデータをよりモデルに近づけるためのEDAをします。

EDAの種類

まず前提として、全てのデータを把握をしきるのは基本難しいです。 テーブルデータで1テーブルのみだとしても、レコード数 x カラム数の分だけ値(数値・文字列)は存在します。10カラム1万レコードだと10万個の値があります。 また、単独のデータとしてだけでなく、データ同士の関係性も含めると無限にパターンは増えていきます。 そしてさらに、複数テーブル・カラムの数も多数・自由記述のカラムが存在などあるとより厳しくなります。

このように、すべて把握出来るわけではないですが、限りある時間の中で効率的にデータを把握したいので、何らかデータを集約したり、統計量を取ったりEDAをします。 この際に無数の情報の中からデータを把握するために、私は2種類の目的のEDAに分けて考えることが多いです。

  • データの概要理解
  • 仮説ベースでの分析

「データの概要理解」とは、そのデータを扱う以上、知っておくべきことを意味します。例えば、テーブルデータにおける複数テーブル間の関係、代表的な統計量だったり、画像データで実際にTarget毎の画像がどんなものか見たり画像サイズを確認するというようなデータの基本理解は、何にせよやるべきことかと思います。 「仮説ベースでの分析」というのは、モデルを作る目的やドメイン知識、過去経験等から、「このデータのAとBは〇〇な関係があるのでは?」と仮説を立てて検証することで、役立つデータ理解をしていくものです。

無数の情報から、「データの概要理解」でざっくりデータを理解し、残りは「仮説ベース」でデータとモデルをつなげるために必要な部分についてフォーカスして理解するイメージです。

データの概要理解

データの基本理解としてよくあげられるものとしては以下のようなものがあります。

  • データ種別・テーブル同士の関係
  • データ量
    • レコード数・カラム数、テキストの長さ、画像サイズ等
  • カラムの意味
  • どんなデータが入っているか?
    • 実際にどんな画像か、テーブルにどんなデータが入っているか
  • 生成過程を知る

    • 画像の撮像環境、正解データのアノテーション方法、テーブルデータの各カラムの生成過程(例: 生年月日カラムがあったときにユーザが登録時にフリー入力したもの、登録後の変更はされない)
  • データの分布を見る

    • 連続値のヒストグラム
    • 離散値・カテゴリデータのユニーク数や値ごとの頻度
  • 外れ値
  • 欠損値

このあたりは、EDA用のライブラリ・ツールなども多く出ていて、それを活用するのも手かもしれません。

sweetvizpandas profilingなどが有名ですね。

ここは一つ一つについては基本的に多くの本や記事などに書かれているため、細かな説明は省略します。

仮説を元にしたEDA

私はEDAで特に大事なのはこちらだと考えています。 当然基本的な理解も大事ですが、それ以上にそのデータ特有の何かに気づき、そこに合わせてタスクの設計をしたり前処理・モデルの工夫をするということが大事です。 そして人によって差が出やすい部分でもあるかと思います。

では仮説を元にといってもどこから仮説を立てるのか?ということでいくつか代表的な仮説の立て方を挙げてみます。

ドメイン知識から仮説を見つけてEDA

対象データや事業のドメインから、データに対しての仮説を探します。 例えば、GPSの位置情報をデータとして扱いそこから何かを予測する機械学習モデルを作っているとします。 GPSの緯度経度に計測誤差が発生することや都市部ほど計測誤差が大きくなるというドメイン知識を持っていたとします。 (ドメイン知識と呼べるほどのものではないかもしれませんが。。)

そうすると、位置情報を扱うときに、都市部と郊外それぞれでどれくらい誤差があるんだろう? もし誤差の程度が違うのであれば、前処理として場所によってノイズ除去のパラメータや方法を変えたり、ノイズ量も可変パラメータとして扱うほうがモデルの精度も上がるのでは?と仮説を立てられます。 そして、都市部と郊外での計測地点を比べてみるといったEDAを行います。

データの観察から仮説を見つけてEDA

データを観察する中で仮説を探します。

データ観察自体どうやってするの?それ自体がEDAじゃん!というツッコミもあるかもですが、ここでの観察はランダムにサンプルした生データとかでもよいです。

例えば、ある店舗グループのPOSデータ(購買情報)を使ってユーザの属性を予測する機械学習モデルを作るとしましょう。 ここでランダムにピックアップしたユーザのPOSデータから、ユーザがどういうものを買っているかを見るとします。 すると、カップ麺を毎回3種類以上買っているのに気づきました。

なぜ3種類以上カップ麺を買うのだろう? →もしかして、3種類以上買うと割引されるのではないか?そして、この割引を狙うユーザというのは、セールや割引に興味があるユーザなのでは? という仮説を立てられるかもしれません。

そして、

  • 3種類以上買った場合に割引されているかを確認
  • 割引されるのはカップ麺だけなのか、他にもあるかを確認
  • まとめ買いで割引されているユーザの割合を属性ごとに確認

といったEDAをすることが出来るかもしれません。

ユーザID 商品名 個数
AAA カップラーメンX 味噌味 1
AAA カップラーメンX しょうゆ味 1
AAA ABEJAヌードル 塩味 1
AAA 白菜 1
.... ... ....

経験・知識から仮説を見つけてEDA

過去の分析の経験から、仮説を立てる方法です。 ドメイン知識とほぼ同じことかもしれません。

例えば、レビュー文書を分類する機械学習モデルを作ろうとする時、過去に似たようなテキストデータを扱った時の経験からいくつか仮説を立てられるかもしれません。

  • 日本語だけでなく外国語も一定の割合存在しているのでは? => テキストデータの日本語割合を確認する
  • 同じテキストをコピーするユーザがいるのでは? => テキストの重複率を確認する
  • 画像や強調などのHTMLタグが入っているのでは? => HTMLタグを含んでいるテキストがあるか確認する

といったEDAが可能になります。

目的から仮説を見つけてEDA

機械学習を使ってやりたいこと、利用目的から逆算して仮説を見つけます。

例えば、長期的に安定した精度を出して運用することでpayする時系列を扱う機械学習モデルを作るとしましょう。

この時長期に渡り安定した精度を出す必要がありますが、時期によって精度や傾向にブレがあると使えないのではないか?と考えることが出来ます。

そして、「目的変数の時系列での分布の変化を確認する」「モデル作成時にValidation期間を長めにとり期間による精度の変化を確認する」などを実施することが考えられます。 (後者はEDAではないかもしれませんが)

ミクロとマクロ

個人的にはこの両方の視点で見ることも大事だと思います。

マクロに見る

一般的なEDAとしてはマクロに見ることのほうが多いと思います。 いわゆる何らかの条件での統計値・集約値・分布を見るケースですね。

大量のデータがあることを前提にすると、全部の値を見ることはできないので集約した値を見ることはある意味当然の流れではありますね。

もう少し分解していくと、マクロに見るケースも1つの系列データだけを見るケース、2つ以上の系列データを見るケースなどで見方は変わることが多いと思います。

1つの系列データで代表的なところでいうと、量的データの場合は統計値(平均、分散、合計、最小・最大値等)や分布の可視化、質的データ(カテゴリ変数など)の場合はユニーク数、度数分布などがあります。

2つの系列データではパターンが多いですが、片方が時間軸であれば時系列での変化のプロット、カテゴリ毎の量的データの統計値、量的データ同士の場合は散布図・相関係数の確認などがあります。

3つ以上の場合は色分けをしたり、左右に2つの縦軸を設けたり、、ただ、あまり多くの系列を同時に可視化しても、解釈自体が難しくなったりもします。

注意すべき点としては、統計値は対象データのほんの一つの側面しか表していないことです。 例えば、とある集団のユーザ情報を表すテーブルに「収入」というカラムがあったときに平均値を見ると500万円だったとして、

  • 実は殆どが300万円以下で一部の高収入ユーザが平均を上げていた
  • デフォルト値として500が入っている影響で、やたらと500という値のレコードが多いだけだった
  • 100万円以下と500万円前後に2つの山が出来ていた(収入を年収と解釈する人と月収と解釈する人の入力が混ざっていた)

と色んなケースがありますが、統計値だけでは気づくのが難しく、分布を見ることが大事なケースが多々あります。

ミクロに見る

次にミクロにデータを見ることについてです。

もう少し具体的に言うと、個別のデータを見ていくということです。 例えばユーザごとの行動ログを一つずつ見ていくようなイメージです。

個別にデータを見ていくことで、統計量や全体の分布のようなマクロな情報では見つからないような発見・仮説につながることもあります。

例えば、ECサイトのレコメンドモデルを作る際に、個別ユーザの行動ログを見るとします。あるユーザが何度もカテゴリを跨いだ商品を見ている事がわかりその商品を見てみると、あるキャラクターのグッズばかり見ていることが分かりました。これより、「ジャンルが異なっていてもキャラクターのような共通項がある商品同士でレコメンドすることが有効なのでは?」という仮説を立てて、他にも同様の傾向があるかを更に調べたり、商品名をベクトル化したものを特徴量としたレコメンドモデルを作るといった方法をとれるかもしれません。

また個別のデータを見ていく際も、「ランダムに見ていく」「特定のケースのデータを見に行く(例: 行動ログの多いユーザを見る、モデルの予測が大きく外れているユーザを見る)」などいくつかの方法があります。

注意すべき点としては、見れるデータ量は限られているのと、あくまで見ているデータが一部であり、それが他のデータでも同様の仮説が立てられるのかは分からない(再度マクロに見たり必要がある)ことです。 例えば、あるユーザの行動をもとにした特徴量を作ってもそれが該当するユーザが全体の0.01%しかおらずほぼ効果がないみたいなこともありえます。 あくまで仮説のきっかけとして考えたほうが良いのかなと思います。

まとめ

EDAでどうデータを見ていくかについて個人的な考えを書きました。 色んな観点をダラダラ書いてしまいましたが、一言でいうと「考えながら見る」に尽きるかなと個人的には思っています。 今回はデータの見る観点の話が中心でしたが、他にも可視化の方法や、どういうライブラリを使うと効率的にEDAが出来るか等EDAだけでもテーマは色々ありそうです。

大事に思うポイントや進め方は人によって違うかと思いますが、もし参考になれば幸いです。

最後に

We Are Hiring! ABEJAは、テクノロジーの社会実装に取り組んでいます。 技術はもちろん、技術をどのようにして社会やビジネスに組み込んでいくかを考えるのが好きな方は、下記採用ページからエントリーください! (新卒の方のエントリーもお待ちしております)

careers.abejainc.com