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月次売上)にもそのまま流用できる。次に長期チャートを足すページではこの関数を再利用する