効果検証タスクはガチっとした実験デザインを行う必要があるので、諸条件に沿って検討していくと分析アプローチはおのずと絞られてきます。一方、探索的データ分析や何らかの自動化を目的とした機械学習タスクでは、試行錯誤の過程でさまざまな分析手法を試すことになります。
ここで、解くべき問題が難しいときや曖昧性が高い場合、「うまくいく手法を探そう」と考えると上手くいかないことがあります。
私が駆け出しデータサイエンティストだったころ、この壁によくあたっていました。事例や教科書を調べて使えそうな手法をリストアップして試しても、なかなか目標点に到達できないという状態が続きました。先輩や上司と会話しても、「XXXは試した?」「YYYの文献を読んでみたら」というアドバイスが続き、試すことが増えるばかりで足踏みしているように感じたものです。考えなしに試すだけで生産的でなかったなと今では思います。
定番の分析アプローチがワークしないときは、問題とデータをよく観察し、問題設定そのものじっくり考える必要があります。特効薬はなく、状況に即したアプローチを考えることが大切です。
このようなとき、複数の分析手法を組み合わせることで問題を解決できる場合があります。また、組み合わせる手法は必ずしも最先端の手法である必要はなく、昔からよく使われている手法の組み合わせが効くこともあります。
機械学習タスクの場合
例えば、異常検知の文脈で離職予測タスクに取り組むことを想定してみましょう。この場合、ざっと考えただけで以下のような手法を適用できそうだと想像できます。
- 教師あり学習アプローチ: 分類問題として解く。
- 確率分布によるアプローチ: 多変量分布の外れ値問題として解く。
- 予測アプローチ: 回帰モデルの予測値からの逸脱度を測る問題として解く。
- 距離・密度に基づくアプローチ: 距離または密度の逸脱度を測る問題として解く。
どのアプローチを選択するか考えるのも大変ですが、それぞれのアプローチで利用できる分析手法が山のようにあるのも悩みどころです。それぞれ思いつく手法をあげてみます。
- 教師あり学習アプローチ: XGBoost, LightGBM, SVM, DNN, Lasso, 他統計モデル
- 確率分布アプローチ: 正規分布, ポアソン分布, カーネル密度推定
- 予測アプローチ: 線形モデル, 時系列モデル, 階層モデル, その他非線形モデル
- 距離・密度に基づくアプローチ: k-NN, LOF
異常検知は目的、データ、コンテキストによってアプローチが変わってきます。つまり、個別性が非常に高い問題領域ですので、事例で語られる手法をそのままスライドしてきても上手くいかないことが多いです。したがって、これらの手法をあれこれ試すことになります。
しかし、先ほど述べたように「うまくいく手法を探そう」という作戦がワークしないことがあります。このようなときには、データとその発生メカニズムをよく観察することが肝要です。例えば、データ観察によって以下のような点に気づくかもしれません。
- データ発生のメカニズムが複数のフェーズに分かれていそうだ。
- ある量的変数は絶対的なものでなく、母集団平均からの相対値で特徴づけられそうだ。
- ある量的変数は特定のグループ平均からの相対値で特徴づけられそうだ。
- 正常状態のパターンが複数存在していそうだ。(隠れ構造があるかもしれない)
- 捉えたい異常を示すシグナルが、まれに発生する別のイベントでマスクされていそうだ。
仮にこのようなことが分かった場合、おそらくひとつの異常検知手法を適用するだけでは上手くいかないでしょう。複数の手法を組み合わせてアプローチすることになるはずです。
あくまで机上の想定になりますが、1の場合はモデルのスタッキング、2や3は特徴量設計の工夫やモデル分割、4は教師なし学習手法を絡めるかモデル分割、5になるとユニークなアプローチを考えるべきかもしれません。
組み合わせというとKaggleで使うようなカリカリとしたチューニングをイメージする方もいるかもしれませんが、必ずしもそうではありません。過去に取り組んだ異常検知タスクでは、以下のようなアプローチをとったことがありました。人事以外の例を含んでいますが、組み合わせた手法は教科書に載っているような定番の技術です。
- 単一系列に対するバースト検知 → ポアソン分布を用いた外れ値検出
- k-meansによるグルーピング → マルチクラス分類モデルを使った逸脱推定
- 類似度推定による集約 → マハラノビス距離による推定
- 属性に基づくデータ分割 → 量的変数の正規化 → 判別モデルによる推定
探索タスクの場合
問題発見フェーズやデータ分析の初期段階では、データの構造に対して理解を深めることが大切です。一般的に探索的データ分析と呼ばれるものですね。
探索的データ分析では、初手として基本統計量やデータ可視化(グラフ)を用いてデータを観察していくことになりますが、データ項目同士の複雑な関係を捉えるときには、統計解析や機械学習手法を使う必要がでてきます。
例として、従業員一人ひとりのスキルを複数項目で評価したデータがあったとしましょう。各項目は量的変数であり、従業員同士で比較できるような値であるとします。こうしたスキルを基礎値として、組織戦力を計量した上で、パフォーマンスなどとの関連を考察するタスクを考えてみましょう。
このとき、スキル項目が高々数項目であれば、それぞれの統計量や分布を確認しながら分析を進めていくことができるかもしれません。しかし、スキル項目が数十項目にも渡る場合はそうもいきません。関心のある他の変数(例えばパフォーマンス)と関連のあるスキル項目を効率よく探索する必要もありますが、それ以前にそもそもスキル項目が全体としてどのような構造になっているか把握しておかなくてはならないからです。例えば、基礎情報として以下のようなことが気になります。
- 各変数に特徴的な偏りがあるかないか。
- 職種や組織によって、違いや特徴があるか。
- 個体同士で相対比較ができるものか、それとも層別に見るべきか。
- 隠れた構造はないか。
残念ながら、このような問いに一発で答えてくれる分析手法はありません。グループ集計、クロス集計、グラフ、次元削減、クラスタリングなどの手法を組み合わせながら、その特徴を探っていくことになります。具体的には、私は次のような方法を試したことがあります。
- 人事属性でグループ集計やクロス集計をしてヒートマップで観察する。
- 主成分分析(PCA)で次元を削減し、いくつかの主成分を用いて散布図を描いてみる。
- 主成分分析(PCA)や非負値行列因子分解(NMF)の結果を比較しながら解釈してみる。
- UMAPで2次元に圧縮して、クラスタリングをかけてみる。
また、他の変数との関連を探る場合には、LassoやElastic Netのような罰則付き線形モデルで記述したり、Treeや一般化加法モデルで非線形な関係を記述したりしながら、考察を深めていきます。このとき、データ観察を十分に行い、母集団全体の特徴を頭に入れておくと気づきを得やすくなります。
枯れた技術を組み合わせて問題を解く
近年、ディープラーニング(DNN)を用いたアプローチが全盛期を迎えています。もし、取り組んでいる問題がそれで解けるなら問題ありません。しかし、実問題は必ずしも学習に必要なデータ量がなく、場合によってはラベル誤りやノイズとなる特徴量を含んでいるものです。また、計算リソースにコストをかけられない場合もあるでしょう。
このようなときは、データと問題を十分吟味した上で、手に馴染んだ古典的な手法を組み合わせてみるのも一案です。枯れた技術の組み合わせともいえます。私もPCA、NMF、k-means、Lasso、重回帰、tf-idf、コサイン類似度など教科書に登場する手法をよく利用しています。
こうした技術のよいところは、応用事例が豊富で挙動がよく知られており、自分の経験値も高まっていることです。つまり、手に馴染んでいるということですね。実践的に少しずつ手に馴染む手法を積み上げていくことで、データアナリストとしてレベルアップすることができるはずです。
分析手法をうまく組み合わせてタスクをこなすコツは、問題やデータを注意深く捉えることにつきます。いくら分析手法をたくさん暗記したところで、実問題に応用できなければ価値を出せません。応用力を高めるために、ドメイン知識を積み上げ、クライアントと十分に会話をしながら、データを根気よく観察しましょう。