渋谷駅前で働くデータサイエンティストのブログ

元祖「六本木で働くデータサイエンティスト」です / 道玄坂→銀座→東京→六本木→渋谷駅前

深刻な不具合のあるデータ分析は、大抵の場合データも実装コードも見るまでもなくそれと分かってしまう

しばらく前に、こんなことを嘯いたら思いの外反応が伸びたのでした。

日本社会にデータサイエンスが本格的に普及するようになって10年強が経ち、空前のDXブームで猫も杓子もデータ活用を喧伝するようになって5年ほどが経ちますが、それでもなお「専門家から見れば中身を調べるまでもなく深刻な不具合のあるデータ分析」が行われていて、挙げ句の果てにその結果や成果物が大手を振って歩いているというケースはチラホラ散見されます。


そこで今回の記事では、ケーススタディ的にそういった「データも実装コードも見るまでもなく深刻な不具合のあるデータ分析だと分かってしまった」事例を幾つか取り上げてみようと思います。その上で、それらの根底に共通する課題を探ってみることとします。

「四半期ごとに良さげな特徴量を追加していったんだけど……」

役員会で出入りのコンサルにマーケティング施策などを説明変数とする需要予測モデルを作らせて、その変数ごとの回帰係数の正負や大小に基づいて予算の割り振りを決めていた。四半期ごとにモデル精度に貢献しそうな変数を加えていっていたらR^2 > 0.95という高精度にまで至ったが、ある時からそれが当たらなくなって何をしても業績が伸びなくなった

これはもう「四半期ごとにモデル精度に貢献しそうな変数を加えていっていた」というのを聞いた時点で過学習を起こしているはず」と分からなければいけないパターンですね。その変数が実際にモデル精度に貢献しようがしまいが(何ならただのホワイトノイズであっても)、変数を増やしていけば「学習データへの当てはまり」は幾らでも良くなります。しかしながら、それは学習データのノイズにまで当てはまるようになってしまっているだけで、未知データへの当てはまり(汎化性能)が良いことを保証しません。



お馴染みのこの2つの図が表す通りで、過学習に陥った統計モデルは学習データへの当てはまりばかりが良くなる一方でテストデータへの当てはまりは悪くなり、回帰係数の推定値にもバイアスが乗って正しくない結果を返します。このような需要予測モデルが返す回帰係数に従ってマーケティング施策を決めても、それが当たらないのは無理もないことだと思われます*1。そしてさらに悪いことに、そういう誤りを平気で放置し続ける現場では交差検証も行っていないケースが少なくありません*2。まさしく過学習がどんどん進んでいくだけ、というわけです。


過学習についてはこのブログでも散々取り上げているので皆様すっかりお馴染みかと思いますが*3、2025年現在になっても「意図せず過学習を起こしている」ケースは未だに後を絶たないように見受けられます。ちょっと俄かには信じ難い話ですが、近年のDXブームで気軽にマーケティングなどの経営指標データが手に入るようになったことで、気軽に回帰分析を初めとした統計分析が行われるようになった一方で、汎化性能など統計的学習モデルにとって必須の注意事項の数々を知らない人々がそれらの分析を取り仕切るようになった結果として、上記のような事態が散見されるようです。


特に、説明変数が訳もわからず漫然と増やされ続ける理由として「お偉いさんが『あれも入れろ』『これも入れろ』と言って聞かないから」というケースは、冗談でも何でもなくあらゆる現場で一度は耳にするというタチのものです。それらお偉いさんが入れろと要求した変数が入っていない分析レポートは役員会で受け付けられない、などというホラーは珍しくなかったりします。


前々からの僕の持論として「データ分析は『やる』側だけでなく『やらせる』側も勉強しなければならない」というのがあるんですが、まさにそれが当てはまる好例だと思います。


「MMMで得られた推定値がどう見てもおかしいんだけど……」

ある企業のマーケティング部門ではMMM (Media / Marketing Mix Modeling)を実施して広告マーケティング予算の戦略的割り振りを決めているが、何回やっても継続的に実施している施策ばかりが低く評価され、年1回のキャンペーンで大々的に打っているTVCMなどの施策ばかりが高く評価されるので、分析担当は皆首を傾げている。何故そうなるのだろうか

これは「年1回のキャンペーンで大々的に打っている〇〇などの施策ばかり」というのを聞いた時点で、即座に「多重共線性がありそうだ」と疑うべきパターンです。同様のシチュエーションを、ズバリその通りにシミュレーションしたのがお馴染みの下の図です。


年数回、あるキャンペーン時期にだけ大部分の施策をまとめてドカンと打つ一方で、ほんの1-2個の試作だけ細々と一年中継続している、というのを模したデータセットです。そこで、例えば単純な線形回帰モデルを当てはめてみると、下の図のような結果になります。


物の見事に、キャンペーン期間にだけ打っている施策の回帰係数はどれも高く出る一方で、継続的に打っている施策の回帰係数は異常に低く出てしまっています。で、多重共線性の指標であるVIFを算出してみると、これまた物の見事に前者の施策ではどれも20-50と「7以下ぐらいが適正とされる」一般的基準を大幅に超えています。これでは多重共線性が強過ぎて、まともな分析結果が得られるわけがありません。まともな分析がしたかったら、少なくともそれぞれの施策を打つタイミングを適度にばらけさせて、ある程度平準化させる必要があります。


しかしながら、世の中「商戦期には大々的に広告やマーケティング施策を投下するがそれ以外の時期はほぼ何もしていない」という企業は本当にゴマンとあり、さらに言えば「たかが施策の効果検証ごときのために商戦期の施策を減らして閑散期に施策を打つなんて機会損失&無駄遣いを許容できるわけがない」というところが大半なんですね。残念なお話です。


なお、バリエーションとしてこんなケースもあります。

ある企業ではMMMで推定できる広告ごとの遅延効果*4・飽和効果*5を広告投下タイミングや予算割り振りを決めるために重視しているが、広告の種類によっては肌感覚と全く異なる結果を返す上に、データセットの期間を変えるとてんでバラバラに結果が変わってしまう。どうしたら良いか

これもシミュレーションすると分かりますが、やはり多重共線性の強いデータセットだと起こり得る現象です*6。MMMというか回帰分析を行っていて、なおかつ「予測」ではなく何かしらの「説明」にその回帰分析を用いるのであれば*7、多重共線性を可能な限り解消させる必要があります。


「きちんとトレンド項を入れたはずの状態空間モデルの挙動がおかしくて……」

ある企業では需要予測モデルに状態空間モデルを用いているが、きちんとトレンド項を入れたはずなのに学習データに対するMAPEは0.1%ぐらいである一方で、テストデータに対するMAPEは40%ぐらいにも膨れ上がっていて、どうも過学習しているようである。説明変数も用いるモデルだが、変数はそれほど多くないし、多重共線性の問題もない。何故なのだろうか

これはやったことのある人でないと分からないかもしれない話ですが、「きちんとトレンド項を入れたはずなのに過学習している」という時点でピンと来るべきは「トレンド項の与え方が不適切」だという可能性ですね。


トレンド項といっても考え方は色々あるんですが、「一階差分トレンド」は分かりやすく概念的にもそれっぽいので、うっかり使ってしまう人は少なくないようです。状態空間モデルではこれで実際に「トレンド」を表現するので仕方ない気もしますが……。

 trend_{n} = trend_{n - 1} + N(0, s_t)
 cum_{trend, n} = cum_{trend, n - 1} + N(0, s_c)

しかし、この一階差分トレンドを適用すると下の図のような結果になりがちです。

赤線が真値で紫破線がトレンド推定値ですが、ぴったり真値に追従するようにジグザグとoverfitした挙動を示しています。それもそのはず、これはただのランダムウォークを時系列データに適合させているだけで、多くの人が想像するような「トレンド」ではないと思われます。


これに対して、流儀は色々ありますが例えば「傾き*8がばらつく」という考え方に基づいて以下のように表せるローカル線形トレンドや二階差分トレンドは、「長期的なうねり」としてのトレンドをある程度表現力高く捉えることができます。

 trend_{n} - trend_{n - 1} = trend_{n - 1} - trend_{n -2} + N(0, s_t)
 cum_{trend, n} = cum_{trend, n - 1} + N(0, s_c)

昔の記事から引っ張り出してきた例ですが、大体こんな感じのトレンドを抽出できるはずです。一口にトレンドといっても様々な表現が可能であり、そのチョイスによって分析結果が大きく変わり得るということは知っておいて損はないでしょう。


コメントなど


ちょっと前のことですが、Querieで以下のような問答があったのでした。

勿論機械学習、それこそ昨今ならLLMとか生成AIといった辺りの話であれば、これに限らない「困った大間違い」は色々あり得るのでしょうが、今回は今現在の僕の守備範囲ではないということで言及を避けたのでした。


ただ、冒頭にも述べたようにオーソドックスなマーケティング分析の類であっても、DXブームの拡大に伴って実施ケースが増えてきており、それに伴って「やる側」だけでなく「やらせる側」の理解が試されるシーンもまた増えてきているように感じています。


で、その代表例を挙げてみたらやっぱり過学習」「多重共線性」が双璧をなしているんですね。理由は単純で、それらはデータを用意してくる以前の段階から既に発生しているというタイプの、いわば「メタ」な不具合だからだと思われます。そういうメタな不具合だからこそ、どれほど完璧にデータを揃えてコードを書いて分析を実装しようと、分析結果に不具合が出てしまう……なればこそメタな段階で解決しておくべき問題なのですが、それは現場のデータ分析職だけではどうにもならなかったりします*9。けれども見る人が見れば、データも実装コードも見るまでもなく分かってしまうほど単純だったりする。根深い問題ですね。


そんなわけで、今回の記事で取り上げた事例はこのブログではもはや毎度お馴染みを通り越してマンネリの域に達しつつあるものばかりですが、時流に合わせていま一度「メタな不具合」への課題意識を強調してみた次第です。こういう「数式やコードでは表現しきれないメタな本質」だけを集めた本とかがあればいいなぁ……と思っているところですが、きっとどこかからそういう本が出るものと期待しております*10

*1:Human in the loopという形で実質的に予測を行っているのと同じことになるため

*2:「お偉いさんが交差検証の意義を理解できないからやっていない」というケースをかつて聞いたことがあります

*3:過学習(過剰適合)のはなし - 渋谷駅前で働くデータサイエンティストのブログ

*4:Adstock

*5:Response curve

*6:定量に多重共線性のバイアスがかかるのは回帰係数だけではないということ

*7:多重共線性のはなし - 渋谷駅前で働くデータサイエンティストのブログ

*8:差分

*9:なのでCXOの方々とかに訴え出る必要があったりする

*10:これはフリではありませんよ???