売上、来店客数、設備の稼働ログ。
日々たまっていく時系列のデータには、必ずと言っていいほど「歯抜け」があります。
システムの連携エラー、機器の停止、担当者の入力忘れ。
この歯抜けを「どう扱うか」で、予測の当たり外れが大きく変わります。
今回は、ある製造・流通の会社で起きた「欠損を捨てたら、年末商戦まで消えた」という出来事を通して、時系列データの欠損だけが持つ性質を説明します。
出発点――予測が、毎年12月に外れる

連携エラーで、2週間分が空いた

製造・流通業のB社では、店舗のPOSデータと設備のセンサーデータを使って、需要予測と稼働分析に取り組んでいました。
あるとき、システムの連携エラーで、複数店舗の日次売上が12月の2週間分、まるごと記録されていないことが分かりました。
過去数年分を見直すと、同じような歯抜けが、機器の停止やメンテナンスのたびに散らばっています。
欠損のある期間を、まるごと除外した

担当者の判断は、慎重なものでした。
「歯抜けのある期間は信用できない。欠損を含む週は、まるごと学習データから外そう」
不確かなデータを使うより、確かなデータだけで予測モデルを作る。
筋の通った判断に見えます。
年末の山を、モデルは知らなかった

ところが、できあがった予測モデルは、毎年12月になると大きく外れました。
実績は年末に向けて跳ね上がるのに、予測はなだらかなまま。
理由は単純でした。
除外した2週間は、年末商戦の真っただ中でした。
歯抜けの期間を捨てたことで、「12月には売上が跳ね上がる」という一番大事なパターンが、学習データから消えていたのです。
モデルは、知らないものを予測できません。
理屈――時系列の欠損は「位置」に意味がある

行を消すと、前後のつながりも消える

顧客一覧のような表では、欠損のある行を消しても、残りの行は独立しています。
100人のうち10人を除いても、残り90人のデータは無傷です。
時系列は違います。
1日1日が、前の日と次の日につながっています。
季節の山、右肩上がりのトレンド、週末の周期。どれも「並び」の中にしか存在しません。
途中を切り取ると、その並びが途切れます。
時系列の欠損は、「何個欠けたか」より「どこが欠けたか」が問題になる。
これが、表の欠損との最大の違いです。
埋め方は「そのデータが本来どう動くか」で決める

消せないなら、埋めることになります。
埋め方は大きく2つです。
1つは、直前の値をそのまま引き伸ばす。在庫数や設定温度のように、「変わるまでは同じ」性質のデータに向きます。
もう1つは、前後の値をなだらかに結ぶ。売上や気温のように、連続的に動くデータに向きます。
どちらが正しいかは、手法ではなくデータの性質が決めます。
在庫数を前後で結べば、ありもしない中間の在庫が生まれます。
売上を直前の値で引き伸ばせば、平日の売上が週末まで続く不自然な線になります。
落とし穴――「後ろの値」は、未来の情報

予測の検証で、成績が良く見えすぎる

埋めるときに、1つだけ注意があります。
「前後の値をなだらかに結ぶ」は、穴の「後ろ」の値を使っています。
過去のデータを整えるだけなら問題ありません。
しかし予測モデルの検証では、話が変わります。
検証とは、「その時点で手に入る情報だけで、先を当てられたか」を確かめる作業です。
穴を未来の値で埋めてあると、モデルはこっそり未来を覗いた状態で検証されます。
成績は良く見えます。そして、実際に運用すると、その成績は出ません。
B社ではこう直した

B社では、歯抜けの期間を除外するのをやめ、データの性質に合わせて埋め直しました。
売上は前後をなだらかに結び、年末の2週間のような大きな穴は、前年の同じ時期の形を参考にしました。
センサーの稼働状態は、直前の値を引き伸ばしました。
あわせて、「この期間は埋めた値である」という印を1列残しました。
予測の検証では、その時点より後ろの値は使わない、というルールを徹底しました。
結果、学習データを減らさずに済み、12月の予測は実績の山を追えるようになりました。
今回のまとめ

時系列の欠損は、表の欠損とは性質が違います。
行を消すと、前後のつながり(たとえば、季節性やトレンド)まで消えます。
埋め方は、直前の値を引き伸ばすか、前後をなだらかに結ぶか。手法ではなく、データが本来どう動くかで決めます。
そして、後ろの値で埋めるのは未来を覗くことだと意識する。予測の検証では特に注意が要ります。
報告を受ける側が確認すべきは、2点です。
- 「欠損のある期間は、消したのか埋めたのか」
- 「予測の検証で、未来の情報を使っていないか」
この2つに答えられる報告なら、12月に外れる予測を事前に防げます。
よくある質問
Q. 時系列データの欠損は、なぜ削除してはいけないのですか?
時系列では、1日1日が前後とつながっているからです。
欠損のある期間を削除すると、その期間に含まれていた季節性やトレンドまで学習データから消えます。
年末商戦の期間を削除すれば、「12月に売上が跳ね上がる」というパターンをモデルは学べず、毎年その時期に予測が外れます。
Q. 時系列の欠損値は、どうやって埋めればよいですか?
データの性質で決めます。
在庫数や設定温度のように「変わるまでは同じ」データは、直前の値をそのまま引き伸ばします。
売上や気温のように連続的に動くデータは、前後の値をなだらかに結びます。
大きな穴は、前年の同じ時期のパターンを参考にします。どの方法でも、「埋めた期間」を示す印を1列残しておきます。
Q. 欠損値の補完で「未来の情報を使う」とは、どういうことですか?
穴の「後ろ」にある値を使って埋めることです。前後の値をなだらかに結ぶ方法は、これに当たります。
過去のデータを整えるだけなら問題ありませんが、予測モデルの検証では、その時点で知り得ない情報を使ったことになります。
検証の成績が実力より良く見え、実運用でその成績が出ない、という事態を招きます。
Q. 歯抜けの時系列データについて、分析報告で何を確認すればよいですか?
2点です。
- 1つ目は、欠損のある期間を消したのか埋めたのか、埋めたならどんな方法か。
- 2つ目は、予測の検証で、その時点より後ろの値を使っていないか。
この2つが報告に書かれていれば、季節性の欠落やリークによる過大評価を防げます。

