memory-makersの統計情報セクションに、日本の機械受注「電子計算機等」を追加した。スクリーンショットで「これ取れるらしい」とぶん投げた一言から始まり、最終的に「過去10年の長期チャート+12ヶ月移動平均」まで作って終わった。途中で「分割できるなら最初から分割しといて」と頼んだら、Claude Codeが2017年6月の表章変更を掘り当ててきて「合算でしか取れません」と返してきた小さな発見もあった。

きっかけ:「これは半導体製造装置の需要動向で合ってる?」

memory-makersの統計情報セクションに、内閣府のスクリーンショットを貼り付けて「この電子計算機等の受注額っていうのは取れるらしいんで、これちょっと頑張って取ってみてもらえませんか。これは半導体製造装置の需要動向で合ってるんですか?」と投げた。日経平均株価のような汎用指標は要らない、半導体まわりに効く統計だけ欲しい、という方針はずっと前から固めている。

最初に気になったのは「半導体製造装置の需要動向で合ってるのか?」の方だった。電子計算機等という名前から、PCサーバーの受注額っぽい印象を受ける。半導体製造装置の動向としてここを引いてしまうと、見当違いの数字でページを汚すことになる。

調査:内閣府の原典に答えが書いてあった

計画モードに入り、Claude Codeを内閣府の原典に派遣して定義を引かせた。返ってきた答えは予想を裏切るものだった。

内閣府の機械受注統計では「電子計算機等=電子計算機+半導体製造装置の合計」と明記されている

つまり「半導体製造装置の需要動向か?」はほぼ正解(合算系列)だった。サーバー系の電子計算機が乗っかっている分のノイズはあるが、半導体製造装置の月次受注額を追う代理変数として使える。これで採用が決まった。

計画→Codexレビュー→実装

期間は2024-01〜で確定。~/.claude/rules/plan-codex-review.md のルールに従い、ExitPlanMode前にCodex(GPT-5)でレビューさせた。瑣末な点へのクソリプは事前に封じておいたので、致命的な指摘はゼロ。計画をそのまま実装に流した。

実装は統計情報セクションのカード追加と、個別ページの新設。テスト17,296件pass、devサーバーで表示確認まで済ませてコミット候補に積んだ。

追加リクエスト:「過去10年分も欲しい。電子計算機と半導体製造装置は分割できる?」

完成報告を出した直後、ユーザーから注文が来た。

  • 2024-01〜の月次チャートはそのまま残してOK
  • その下に過去10年分の長期チャートも追加してほしい
  • 電子計算機と半導体製造装置を分割できるなら、最初から分割しといて
  • 「あるいは積み上げ棒でいいんじゃないですか」

長期チャートは単純に系列を伸ばすだけで作れる。問題は分割の方だった。

2017年6月の表章変更で分割は作れないと判明

Claude Codeを内閣府の原典に再度派遣して、別掲データの所在を調べさせた。返ってきたのは別の発見だった。

2017年5月までは「電子計算機」と「半導体製造装置」が別掲だった。2017年6月実績の表章変更以降は合算の「電子計算機等」でしか公表されていない

つまり「分けてほしい」「積み上げ棒でいい」のどちらも、内閣府の公表データ側に存在しない。半導体製造装置単独の月次が欲しい場合は、SEAJ(日本半導体製造装置協会)の日本製装置販売高という別統計を引く必要がある。

ユーザーに事実を伝えたら「2017年以降ないんだ。あれ?以前は別形だったんだ。じゃあ、これでやるしかないんですね。OK」と返ってきた。事実が壁になったときは、合算で諦めるのが正解だった。

12ヶ月移動平均で長期トレンドを浮かせた

分割が作れない代わりに、長期チャートには12ヶ月移動平均を重ねた。月次原系列はガタガタ動くため、10年スパンでは何が起きているか見えにくい。移動平均を重ねることで、半導体製造装置の発注サイクル(典型的には1.5〜2年)の山と谷が浮かび上がる。

movingAverage 純粋関数を app/utils/ に追加した。副作用なし・引数だけで結果が決まる純粋関数なので、Vitestで境界値ケース(窓幅0、データ長未満、欠損値)まで含めてテスト可能。長期チャートコンポーネント側は、原系列と移動平均の2系列を重ねて描画するだけのシェルに留めた。

// 12ヶ月移動平均(核心のみ)
export const movingAverage = (values: number[], window: number): (number | null)[] =>
  values.map((_, i) =>
    i + 1 < window
      ? null
      : values.slice(i + 1 - window, i + 1).reduce((a, b) => a + b, 0) / window
  )

テーブルは長くなりすぎるので27行にスライスして表示。更新コマンドの記述も123ヶ月対応に書き換えた。

最終形

  • 既存の2024-01〜の月次チャート(前年同月比つき)はそのまま残す
  • その下に過去10年(2016-01〜・123ヶ月)の長期チャートを別途追加
  • 長期チャートは原系列+12ヶ月移動平均の2系列重ね描画
  • テーブルは直近27行のみ表示
  • 更新コマンドは内閣府の公表ファイルから123ヶ月分を一括で取得・反映

コミットは 8fefd953 feat(memory-makers): 日本 機械受注「電子計算機等」の統計カード・ページを追加。9ファイル・+1,034行。同時並行で進んでいた tokibo 関連の未コミット変更には触らず、機械受注関連だけを選んで切り出した。

学び

  • 「半導体製造装置の動向が欲しい」という目的に対して、内閣府の機械受注統計は合算系列でしか取れない。代替として SEAJ の日本製装置販売高が候補になる
  • 2017年6月の表章変更で分割値が消えたこと、これは原典を引かないと気づかない。ユーザーが「分割して」と言ったときに、過去データがあるかどうかを必ず確認する手順を入れて正解だった
  • 12ヶ月移動平均は、月次の細かい動きを潰しつつ循環を浮かせるのに効く。長期チャートには標準で積むことにする
  • 純粋関数(movingAverage)をutilsに切り出しておくと、他の月次データ(韓国半導体輸出、台湾ODM月次売上)にもそのまま流用できる。次に長期チャートを足すページではこの関数を再利用する