---
title: "サービスロボット導入シミュレーション Log#8 | 試算に、ロボットの費用と補助金を足した"
slug: serving-robot-cost-subsidy
date: 2026-10-23
day: 366
meta_description: "配膳ロボットの試算に、ロボットの費用と浮く人件費、補助金の情報を足した。2台を月額で借りると、99条件のうち47条件で店が回る人数は減らない。人件費のほか、人手不足・作業の軽さ・サービスの変化も並べた。"
tags: [サービスロボット導入シミュレーション, 配膳ロボット, 導入費用, 補助金, 省力化投資補助金, 人件費, SimPy, ファミレス]
series: "導入シミュレーション"
---

配膳ロボットを店に入れると、毎月いくらかかって、いくら浮くのか。店の経営者や事業の責任者が真っ先に知りたいのはここです。サイトには、配膳ロボットを入れたらファミレスの入店待ちや料理が届くまでの時間がどう変わるかを計算する試算ページを置いています（ https://pixelstomotors.com/series8 ）。ただ、これまでの試算はお金の話をまったく扱っていませんでした。そこで、ロボットにかかる費用と浮く人件費、使える補助金の情報を足しました。

足してみて分かったのは、ロボットを入れても人が減らない条件が多いことです。**ロボット2台を月額で借りる前提では、試算の99条件のうち47条件で、店が回る最少のスタッフは1人も減りませんでした。** たとえば標準的なファミレス（35卓）の普通の混み具合では、ロボットが0台でも2台でも、店を回すにはスタッフが3人要ります。人件費は浮かず、ロボット2台の月14.4万円がそのままかかります。1人減る残りの52条件でも、浮くのはランチとディナーの混む時間（2時間ずつ）の分だけなので、月14.1万円。ロボット2台の費用とほぼ同じで、差し引きは月−0.3万円でした。混む時間が2時間半ある焼肉の食べ放題だけ、月+3.3万円になりました。

ここで「ロボットは割に合わない」と言い切るのは早いです。店がロボットを入れる理由は、人件費を下げることだけではないからです。同じファミレスで、スタッフ3人のままロボットを2台入れると、スタッフ1人が歩く距離は30%減り、入店待ちは8.6分から4.1分に、料理ができてから客に届くまでは58秒から39秒に縮みます。人が足りない日でも回しやすくなり、歩く量が減り、客を待たせなくなる。そこで、費用の欄には人件費の表と並べて、人数をそのままにしたときの変化の表も置きました。

| やったこと | なぜ | どうなったか |
|---|---|---|
| 費用の試算の形を、頭の中で3回通してから決めた | 最初の素直な案では、言い過ぎた数字が出るため | 「ロボット1台で1人分浮く」とは数えず、試算の結果から「店が回る最少のスタッフ」が何人減るかで数える形にした |
| 費用・人件費・補助金の前提を調べた | 値段や最低賃金は変わるので、調べた日と出典を付けて出すため | 月額は3〜12万円、買うと150〜350万円。時給は2026年度の最低賃金の全国平均1,177円。補助金は省力化投資補助金（カタログ注文型）で、費用の1/2まで |
| 試算ページに「ロボットの費用と、変わること（ひと月）」の欄を足した | 費用を知りたい人に、その場で答えるため | 人件費の表と、人数そのままの表、まとめの一文、前提の切り替え8つ |
| 欄の頭に数字のカード3枚を置き、上の結果から欄への案内を足した | 前提の切り替えが先に並び、結果が画面の下に押し出されていたため | 開いてすぐ「費用・浮く人件費・差し引き」が見える |
| 人件費のほかに良くなることの補足を置いた | ロボットを入れる理由は人件費だけではないため | 人手不足・作業の軽さ・サービス・試算に入れていないことの4つ |
| 英語圏からサイトにどれだけ来ているかを確かめた | 英語での発信を強めるかを決めるため | 検索結果への表示は約2割が海外（英語圏は1割）だが、海外からのクリックは0回。英語の作業は今は始めない |

作業の間、2つの決まりを守りました。ページの基本の見た目は変えないことと、今ある試算の数字は変えないことです。足した部分はすべて追加で、今ある行の書き換えはありません。Unity（店を3Dで建ててロボットを走らせるソフト）で進めているシミュレーションが読むファイルにも、触れていません。

下の図で、店と払い方と浮く時間を切り替えると、ロボットの台数ごとに、費用と浮く人件費がどう並ぶかが見られます。

【図解】LOG366_cost_vs_labor.html

右上の切り替えで「4時間」を選ぶと、1人減ったときに浮く人件費が月28.2万円になり、1人減る店では差し引きがプラスに変わります。人を混む時間だけ減らせるのか、シフト1回分（4時間）減らせるのかで、答えが変わるということです。


## 作業ログ ― この記事で扱う範囲と、守った2つの決まり

対象は、サイトの試算ページ（ https://pixelstomotors.com/sim/serving-robot ）と、シリーズのページ（ https://pixelstomotors.com/series8 ）です。試算そのもの（SimPy で回した結果、16,425条件・各40回の平均）には手を入れず、その結果を読んで費用を計算する欄を、ページの中に足しました。最後の節では、サイト全体に英語圏からどれだけ人が来ているかを、サイトの記録と Google Search Console で確かめています。

作業に入る前に、次の2つを守るよう指示がありました。

> 追加作業にあたってこれだけは守ってください。基本的なデザインは変更しない。今あるサイトのシミュレーションの数値変更などは行わない。

そのため、新しい欄は、今あるページの部品（条件の切り替え、比較の表、まとめの一文、数字のカード、折りたたみ）だけで組みました。見た目を変えたのは足した欄の中だけです。公開前に、変更前（コミット c3ed19d）と比べて、今ある行を1行も消していないことを毎回確かめました（最後の出力は `267 0`。足した行が267、消した行が0）。

この記事では扱わないものがあります。費用の話の前に、海外の店で配膳・案内・下げ膳・清掃のロボットがどう使われているかの映像を見て、運用の形を整理しました。その中身は映像の出どころの都合で載せず、そこから出た「横に広げる候補」だけを次の節に書きます。


## 現場の運用から出た、横に広げる候補（案内・広告ロボットと宴会場）

現場の運用を見て、試算の対象を広げる候補が2つ出ました。

1つめは、広告の画面が付いたロボットです。入口で客を出迎え、席まで案内し、入口に戻って待ちます。広告は入口で待っている間に流れます。試算に入れるなら、案内ロボットとして入れ、広告は案内の合間に流すものとして扱うのがよいと考えました。今の試算では「入店待ち」を、店に来てから案内されて席に着くまでの時間として数えています。案内をロボットが受け持つと、店員の手が空く分だけ、この待ち時間が変わります。今の試算の延長で始められます。広告がどれだけ見られたかは、試算（時間・順番・数）では出せないので、Unity だけで測る値になります。

2つめは、宴会場などのイベントです。ファミレスとは、何を測るかから変わります。客は一斉に来て最初から全員座っているので、入店待ちや「店が回らない」は使えません。測るのは、1品を全卓に出し終わるまでの時間と、最初の卓と最後の卓の差（料理が冷める・待たされる）です。10人の丸テーブルなら1品につき1卓10皿と、運ぶ量も桁違いです。ロボットは卓の近くの拠点まで運び、そこから店員が客に出す形になりやすく、品と品の間には下げ膳が挟まります。

これで、横に広げる候補は次の3つになりました。

| 候補 | 中身 | 状態 |
|---|---|---|
| ファミレスの配膳 | 今の試算。Unity は③⑦の店で一度通すところ | 進行中 |
| 案内・広告ロボット | ファミレスの試算に1項目足す形 | 候補 |
| 宴会場 | 測る数字の決め方から新しく作る | 候補 |

どの構成をいつ足すかは、タイミングを見て決めることにしました。Unity の手順は今のままです。

> unityの方の手順は今は変更必要ないです。
> 今の画像共有はこれからのために記憶しておいてください。タイミングを見てどのような構成を追加していくか考えます。


## Unity の映像を学習に使う案：真似させるだけでは意味が薄く、測る道具にするなら効く

フィジカルAI研究室では、ロボットアームのお手本の動きを集めて、ロボット用のAIに学習させています。この進め方をサービスロボット導入シミュレーションにも使えないか、という問いが出ました。

> unityでシミュレーションしたものを動画撮ったりして、それを学習させることはできますか？（今のフィジカルAI研究所で進めているやり方をサービスロボット導入シュミレーションに適応）またその手法にメリットはありますか？

できますが、Unity の配膳ロボットの動きを撮ってそのまま真似させる使い方には、ほとんど意味がありません。理由は2つあります。Unity のロボットの道順はサイトから渡す決まりで動いているので、それを学習しても同じ決まりがもう一度できるだけで、新しいことは何も分かりません。また、市販の配膳ロボットの走り方はメーカーの地図と経路計画で決まっていて、外から学習したモデルを入れられません。ハードを作らない立ち位置とも合いません。

役に立つのは次の3つの形です。

| 形 | 何をするか | 何に効くか |
|---|---|---|
| 映像から測る道具 | Unity の映像を学習用の画像として大量に作り、通路の混み具合・止まっているロボット・受け渡しの瞬間を見分けるモデルを学習する。それを実店舗の映像にかける | 店で起きていることを自動で数えられる。「測る手段を持つことが推論より先」に沿う |
| 結果をすぐ出す予測モデル | Unity を店の形と条件を変えて何百回も回し、待ち時間と止まる回数を学習する | クライアントごとに組み直さなくても、その場でおおよその答えが出る |
| 卓での受け渡し（将来） | 今は客か店員がやっている最後の受け渡しを腕で行う | 手の動きを学ぶ研究室の手法がそのまま使える |

1つめについて、進め方を頭の中で3回通しました。1回目の素直な案（Unity の映像で学習して実店舗の映像で測る）は、実店舗の映像がまだなく効いているか確かめられないこと、店内の撮影で客の顔が映るので許可とぼかしが要ることで詰まりました。2回目は、人を見つけるのは既製のモデルで足り、新しく学習が要るのはロボットを見分けることと「止まっている」「受け渡し中」の判定だけ、と範囲を絞りました。カメラの位置は、多くの店にすでにある防犯カメラと同じ天井の角を標準にします。3回目は、③の店で学習して⑦の店で測り、Unity が持っている正解（実際に止まった回数）と比べることで、実店舗なしでも確かめられる形にしました。ゴールは「⑦で止まった回数を、正解に対して決めた誤差以内で数えられること」で、ここで一区切りにします。

試すのは、Unity の③⑦を一度通して映像が撮れるようになってからです。


## 費用の試算は、頭の中で3回通してから形を決めた

費用の試算も、作る前に3回通しました。

1回目の素直な案は、ロボットの費用とアルバイト1人分の人件費を比べる形でした。ここで詰まりました。今の試算はランチとディナーの混む時間（ピーク）の2時間だけを見ています。ロボットが入っても、それで1人減らせるとは限らず、待ち時間が短くなるだけのこともあります。「1台で1人分浮く」と出すのは言い過ぎになります。

2回目は、今の試算の数字から出す形にしました。試算はもともと、スタッフ何人なら「店が回らない」かを出せます。「店が回らない」は、席は空いているのに片付けや案内が追いつかず、入店待ちのうちその分が平均10分以上になる状態です。そこで、ロボットの台数ごとに「店が回らない」が出ない最少の人数を探し、ロボットなしとの差（人数）に、浮く時間と時給を掛けて人件費にします。ここで詰まったのは値段の幅です。買うと150〜350万円、月額で借りると月3〜12万円と、幅が広く、保守が月額に入るかどうかも契約で違います。

3回目に、見落としを足しました。1つは補助金です。中小企業省力化投資補助金のカタログ注文型は、配膳ロボットも対象の製品として扱われていて、費用の1/2まで出ます。ただ、条件（販売事業者との共同申請、賃上げなど）があるので、試算では「使う／使わない」の切り替えにとどめました。2つめは時給で、都道府県で違うので選べるようにしました。3つめは、ロボットを使うための人の手間（ロボットに積む・降ろす、立ち往生したロボットを助けに行く）です。これは Unity が測る「止まる回数と長さ」がそのまま使えるので、後から入れることにしました。

決めた形は次のとおりです。

1. 費用の項目（月額／購入、保守、充電、使う年数、補助金、時給、浮く時間、ピークの回数）を画面で切り替えられるようにし、既定の値に出典と調べた日を付ける
2. 台数ごとの「店が回る最少のスタッフ」から、月の人件費の差を出す
3. 月の費用の差と、買う場合は元が取れるまでの月数を、今の待ち時間と並べて出す（費用だけで判断させないため）
4. 後から、Unity で測る立ち往生の時間を「運用の手間」として足す

この形で進めることになりました。

> まずはBを充実させるのは良いですね。導入シュミレーションで経営者や事業責任者が特に知りたいところだと思いますし、補助金情報も同時に付加すれば導入シュミレーションとしてさらによくなると思います。


## 費用の前提と補助金（2026年10月23日に調べた値）

| 項目 | 値 | 出典 |
|---|---|---|
| 買う場合の値段 | 150〜350万円（中央値250万円前後） | お名前.com ビジネス（配膳ロボットの導入費用） |
| 月額で借りる場合 | 月3〜12万円（中央値は6万円台） | 同上 |
| 保守 | リースの月額に含まれず、別に数万円かかる契約がある。試算では「込み・1万円・2万円」から選ぶ（既定1万円は仮置き） | 創業手帳（飲食店の配膳ロボット） |
| 充電の電気代 | 月1,000〜3,000円。試算では1台月2,000円で固定 | 同上 |
| 時給 | 2026年度の最低賃金は全国加重平均で1,177円（9月3日に各都道府県の答申が出そろい、10月1日〜12月2日に順に発効） | 労働政策研究・研修機構 |
| 省力化投資補助金（カタログ注文型） | 補助率1/2以下。上限は従業員5人以下500万円・6〜20人750万円・21人以上1,000万円（2026年3月19日の改定後。大幅な賃上げで上限が上がる）。随時受付で2027年3月末ごろまでの予定。申請には GビズIDプライム（取得に2〜3週間）が要る | 補助金ポータル |
| 配膳ロボットが補助金の対象か | 介護業で申請できる製品の1つとして配膳ロボットが挙がっている（令和8年4月30日） | 厚生労働省 |
| 業務改善助成金 | 店の中で一番低い時給を50円以上上げ、設備投資などをすると費用の3/4〜4/5が出る。令和8年度の申請は、店のある都道府県の最低賃金が発効する前日まで。案内の資料に配膳ロボットの記載はなく、対象かは労働局で確かめる | 厚生労働省（令和8年度 業務改善助成金のご案内） |

出典の住所は次のとおりです。

- https://www.onamae.com/business/article/306061/
- https://sogyotecho.jp/inshokuten-haizenrobot/
- https://www.jil.go.jp/kokunai/blt/backnumber/2026/10/special_03.html
- https://hojyokin-portal.jp/columns/shoryokuka-catalog
- https://www.mhlw.go.jp/content/001696868.pdf
- https://www.mhlw.go.jp/content/11200000/001693381.pdf

既定の値は、時給1,177円・保守1台月1万円・補助金の上限750万円（従業員6〜20人）にしました。どれも「とりあえずそのまま」で決まりました。リースでの導入が補助金の対象になるかは、調べた範囲では分からなかったので、試算では買う場合にだけ補助金を引き、前提の欄に「公募要領で確かめる」と書きました。


## 99条件のうち47条件で、ロボット2台を入れても店が回る人数は減らない

費用の欄と同じ決め方で、全部の店・混み具合・使い方について、ロボット0〜3台の「店が回る最少のスタッフ」と、2台を月額で借りたときの月の差し引きを出しました（作業ログの最後に、計算のコードと99行の出力を全量で載せています）。前提は、1台月6万円・保守月1万円・充電月2,000円・時給1,177円・ピークの間だけ人が浮く・1日2回・30日です。

| 2台を入れたときの店が回る最少のスタッフ | 条件の数 | 月の差し引き |
|---|---|---|
| 減らない | 47 | −14.4万円 |
| 1人減る（ピーク2時間の店） | 43 | −0.3万円 |
| 1人減る（ピーク2時間半の焼肉食べ放題） | 9 | +3.3万円 |

2台入れて2人減る条件はありませんでした。1人減ったときに浮くのは、2時間 × 1日2回 × 30日 × 1,177円 ＝ 月14.1万円です。2台の費用は（6万＋1万＋0.2万）× 2 ＝ 月14.4万円なので、ほぼ同じ額になります。

買う場合は事情が変わります。大型店（60卓）の混雑した日では、ロボットなしで8人要るところが、2台入れると7人で回ります。1台250万円で2台買い、補助金で半分の250万円が出ると、初めに払うのは250万円。5年で割って保守と充電を足すと月6.6万円で、浮く人件費月14.1万円との差し引きは月+7.6万円、初めの250万円は約22か月で取り戻せる計算になりました。


## 人件費が浮かない結果を、そのまま出すかどうか

標準ファミレス・普通の混み具合で人件費が0円と出る結果を、そのまま出してよいかを確かめました。

> 正直な結果だと思いますが、この見せ方（店舗としては人件費を下げる目的もありますが、人手不足の解消やロボット導入によるスタッフの作業軽減、店舗のサービス向上などの目的もあります）

人件費の結果は変えずに残し、人件費以外の目的も同じ欄で見えるようにすることにしました。表示を変えるので、手を入れる前に案を出して確かめています。案は、人数をそのままにしてロボットを入れたときの表を1つ足し、ロボットの費用と並べて、人手不足（スタッフの手がふさがっている割合）、作業の軽さ（スタッフ1人が歩く距離）、サービス（入店待ち・料理が届くまで）を出すものです。数字はすべて今の試算の結果をそのまま読み、新しい計算や前提は足しません。

この表を足しても、Unity のシミュレーションには影響しません。Unity が読むのは、店の形（`public/sim/layouts/`）と、条件と店の回し方の値（`public/sim/serving-robot-params.json`）だけです。今回変えたのは試算のページ（`public/sim/serving-robot.html`）とシリーズのページの説明文（`src/lib/records.ts`）の2つで、書き出し用のコード（`tools/sim_layouts/`）もこのページを参照していないことを確かめました。

人件費が浮かない条件では、まとめの一文が次のように出ます（標準ファミレス・普通・上げ膳だけ・ロボット2台・月額6万円）。

> ロボット2台を入れても、店が回る最少のスタッフは3人のままで、人件費は浮きません。ロボットの費用は月14.4万円で、変わるのは人手不足・作業の軽さ・サービスの方です。スタッフ3人のままなら、手がふさがっている割合は 82% → 76%、1人が歩く距離は30%減り、入店待ちは 8.6分 → 4.1分、料理が届くまでは 58秒 → 39秒 です。

図面のある「② 定番の郊外型」・普通では、スタッフ2人のまま2台入れると、手がふさがっている割合は 65% → 55%、1人が歩く距離は38%減り、入店待ちは 2.7分 → 1.6分、料理が届くまでは 38秒 → 20秒 になります。標準ファミレスより店が小さく、厨房から卓までが近い分、入店待ちはもともと短く、歩く距離の減り方は大きく出ています。

【画像】LOG366_02_same_staff_table.png 人数をそのまま（スタッフ2人）にしてロボットを入れたときの表と、その下のまとめの一文。② 定番の郊外型・普通の例で、2台のとき手がふさがっている割合55%・1人が歩く距離1.23km（−38%）・入店待ち1.6分・料理が届くまで20秒


## 費用の欄を目立たせた：数字のカード3枚、順番の入れ替え、上からの案内、黒地

公開した欄を見て、費用のところをもう少し目立たせたいという指摘がありました。直す前に、今あるページの部品だけを使う案を3つ出しました。

| 案 | 中身 | 決めたこと |
|---|---|---|
| 1 | 欄の頭に、上の結果と同じ大きな数字のカードで「ロボットの費用（月）」「浮く人件費（月）」「差し引き（月）」を置く。順番を「カード → 表 → まとめ → 前提の切り替え」に入れ替える | 採用 |
| 2 | いちばん上の結果のカードの下に「ロボットの費用と変わること（ひと月）は下にあります ↓」の一行を置く。シリーズのページの「観察シートは下にあります ↓」と同じ形 | 採用 |
| 3 | 費用の欄を「ロボットの台数を変えると」のすぐ下に移す | 今ある欄の並び順が変わり、見た目を変えない決まりに触れるので外した |

試算のページは、シリーズのページの中に枠（iframe）で埋め込まれていて、枠は中身の高さぴったりに伸びます。そのため、案2の一行を押しても枠の中ではスクロールできません。押したときに外のページを費用の欄まで送るようにし、スマホの幅で、押す前と後で外のページが 3614px から 6552px まで送られることを確かめました。

人件費が浮かない条件では、3枚目のカードに「人数そのままなら、歩く距離 −30%・入店待ち 8.6分 → 4.1分」のように、変わることを添えます。金額は「0.0万円」「6.0万円」ではなく「0円」「6万円」と出すように直しました。

その後、3枚のカードを黒地・白文字にしてほしいという指示があり、この3枚だけを反転させました。上の結果のカードや表は白地のままです。

公開後の欄の上の部分です。例は、図面のある店の「② 定番の郊外型」（19卓）・普通（19組/時）・上げ膳だけ・ロボット2台です。この店でも、ロボットを0〜3台のどれにしても、店が回る最少のスタッフは2人のままでした。

【画像】LOG366_01_cost_cards.png 試算ページの費用の欄の上の部分。② 定番の郊外型・普通・ロボット2台の例で、黒地のカード3枚に費用14.4万円・浮く人件費0円・差し引き−14.4万円が並び、その下の表ではロボット0〜3台とも店が回る最少のスタッフが2人

前提の切り替え8つは、欄のいちばん下に移しました。その下に、調べた値と出典を入れた折りたたみ「費用の前提と補助金」があり、さらに下はもとからある「どの店で、どの使い方が効くか」の欄です。

【画像】LOG366_04_cost_settings.png 費用の欄の下の部分。「費用の前提を選ぶ」の見出しの下に、払い方・1台の月額・保守・時給・浮く時間・ピークの回数の切り替えが並び、その下に折りたたんだ「費用の前提と補助金」と、もとからある「どの店で、どの使い方が効くか」の欄


## 人件費のほかに、ロボットを入れて良くなることの補足

最後に、費用のところに補足程度で、ロボット導入による良さの説明を足してほしいという指示がありました。まとめの一文のすぐ下に、次の4つを置きました。上の3つは、表の中のどの数字に出ているかを括弧で示しています。

- 人手不足：配膳の往復をロボットが受け持つ分、スタッフの手が空き、人が足りない日でも案内・会計・呼び出しに出やすくなる（2つめの表の「手がふさがっている割合」）
- 作業の軽さ：厨房と客席の往復が減り、歩く距離が短くなる。下げ膳にも使えば、重い皿を運ぶ負担も減る（「1人が歩く距離」）
- サービス：料理が早く届き、入店待ちも縮む。空いた手を、客と話す・様子を見るといった人にしかできない接客に回せる（「入店待ち」「料理が届くまで」）
- 試算に入れていないこと：採用・教育の手間、人が辞めたときの穴の埋めやすさ、スタッフの疲れ方。数字にはしていませんが、店によっては大きい点です

初めは灰色の小さな文字の枠にしていましたが、もう少し目立たせたいという指示で、白地に黒い枠、見出し16px・本文14px、項目名を太字にしました。表への参照は小さい灰色の文字に下げて、本文が先に読めるようにしています。

【画像】LOG366_03_merits_box.png まとめの一文の下に置いた「人件費のほかに、ロボットを入れて良くなること」の枠。白地に黒い枠で、人手不足・作業の軽さ・サービス・試算に入れていないことの4つの項目名が太字。その下に「費用の前提を選ぶ」の切り替えが続く

## 英語圏からの流入：検索結果には海外でも出ているが、海外からのクリックは0回

費用の欄を足したあと、話はサイト全体の発信に移りました。

> 今現行サイトには英語圏からの人はどのくらい流入がありますか？

> 英語での発信強化は必要ですか？

### サイトの記録（/api/ev-stats）では、国は分からない

サイトには、どのページがどれだけ読まれたかを数える仕組み（/api/ev-stats）があります。ただし、見た人を見分けないために、IP アドレスもブラウザの種類も記録していません。国や言語は分からず、手がかりになるのは「どこから来たか」（前のページの住所）だけです。

この表は鍵がないと開けません。鍵は Cloudflare に秘密の値として入れてあり、画面からは読み直せません。そこで、設定したときの文字列を KIOXIA にテキストファイルで置いてもらい、Claude はファイルの中身を開かずに読み込んで表を開く形にしました。チャットに貼ると、会話の記録に鍵が残るためです。

記録を取り始めた2026年10月18日からの数は次のとおりでした（出力は作業ログの最後に全量で載せています）。

| 見たもの | 数 |
|---|---|
| 表示の合計 | 588回（10/12〜18の週 22回、10/19〜25の週 566回） |
| 英語のページの表示 | 16回（約3%）。すべて英語版の4コマ。英語版の記事は上位100ページに入っていない |
| どこから来たか | 直接・不明 457、www.google.com 82、サイト内 39、search.yahoo.co.jp 3、そのほか各1〜2（LinkedIn は1回） |

英語圏だと分かる来た元はありませんでした。google.com は日本からの検索でも同じ住所になるので、国の手がかりにはなりません。

### Google Search Console の国別の数：表示の約2割が海外、クリックは日本だけ

Search Console（Google の検索結果にサイトがどう出たかを見る画面）は登録済みでした。前に作った英語版の検討メモに「未登録」と書いたままになっていて、それを見て「登録から始める」と提案していたので、メモを直しました。

7日間（数が出ているのは10月17〜20日の4日分）の国別の数です。

【画像】LOG366_05_gsc_countries.png Search Console の検索パフォーマンスの国別の表（7日間）。日本はクリック16・表示355、米国は表示37、中国とカナダが6、イギリス5、シンガポールとフランス4、オーストラリア・インド・ドイツ3で、日本以外のクリックはすべて0

| 国 | 表示回数 | 割合 | クリック |
|---|---|---|---|
| 日本 | 355 | 79% | 16 |
| 英語圏（米国37・カナダ6・イギリス5・オーストラリア3） | 51 | 11% | 0 |
| 英語を使う人が多い国（シンガポール4・インド3） | 7 | 2% | 0 |
| そのほか（中国6・フランス4・ドイツ3・残り13か国） | 34 | 8% | 0 |
| 合計 | 447 | | 16 |

【画像】LOG366_06_gsc_summary.png Search Console の検索パフォーマンスのまとめ（7日間）。合計クリック16・合計表示回数447・平均CTR 3.6%・平均掲載順位18で、グラフは10月17日から立ち上がり、18日にクリックが9回まで上がる

海外でも、検索結果にはサイトが出ています。ただ、題名も説明文も日本語なので、目に入っても開かれていないのだと考えています。平均の掲載順位は18位で、検索結果の2ページ目あたりです。

米国の37回を「クエリ」（どんな言葉で検索されたか）と「ページ」（どの記事が出たか）で分けると、中身が見えたのは1回だけでした。「alphanist」という言葉で検索され、/record/alphanist-binary-reward-assembly が出たものです。残りの36回は、Google が中身を見せていません。検索した人が少ない言葉は、誰が何を調べたか分からないよう、表に出さない仕組みです。

### 判断：英語の作業は今は始めず、1か月後に3か月分で見直す

| 理由 | 中身 |
|---|---|
| 今いちばん力を入れている相手が日本の市場 | 代理店・メーカーの日本法人・業界団体・行政。サービスロボット導入シミュレーションも、日本のファミレス・最低賃金・国の補助金が前提で、英語にしても海外では使いにくい |
| 英語の中身を確かめる人がいない | 誤訳した数字や技術用語がそのまま出るおそれがある |
| 大量に訳すと逆効果のおそれ | 短い作業ログをまとめて英語にすると、検索で価値の薄いページと見られやすい |
| 数がまだ少ない | 英語圏の表示は1週間で51回。どの言葉で探されたかも、ほとんど見えない |

ただ、「英語の需要がない」のではなく、「検索結果には出ているが、日本語なので開かれていない」状態だと分かりました。1か月ほどたってから、期間を「3か月」にして国別・クエリ・ページを見直します。英語圏での表示が多い記事があれば、その記事の題名と説明文だけを英語にして、クリックが出るかを試します。英語にするなら、手順を再現できる研究の記録（フィジカルAI研究室・画像認識・R2R2R）からにして、サービスロボット導入シミュレーションは日本語のままにします。



## 試算ページの変更の履歴（コミット）

公開までに7回に分けて main に入れました（時刻は日本時間）。

```
$ git log --reverse --format="%h %ad %s" --date=format:%H:%M c3ed19d..origin/main
a571951 06:48 配膳ロボットの試算に、ロボットの費用と浮く人件費（ひと月）・補助金の情報を足す
943423e 07:03 シリーズ8の試算の説明に、費用も比べられることを一言足す
85ddf15 07:06 費用の欄に、人数をそのままにしてロボットを入れたときの表を足す
2712f98 07:19 費用の欄を目立たせる：頭に数字のカード3枚、表とまとめを先に、前提の切り替えを後に。上の結果から費用の欄への案内を足す
6a72ffe 07:24 費用の欄の頭のカード3枚を黒地・白文字にする
35f69c3 07:28 費用の欄に、人件費のほかにロボットを入れて良くなること（人手不足・作業の軽さ・サービス・試算に入れていないこと）の補足を足す
06675c8 07:31 ロボットを入れて良くなることの補足を目立たせる（白地・黒い枠・文字を大きく・項目名を太字）
```


## 追加したコード（全量）

### シリーズのページの説明文（src/lib/records.ts）

変えたのは1行で、試算の説明に「ロボットの費用と浮く人件費も比べられます（補助金の情報つき）。」を足しました。

```diff
diff --git a/src/lib/records.ts b/src/lib/records.ts
index 04376d9..d77fbbb 100644
--- a/src/lib/records.ts
+++ b/src/lib/records.ts
@@ -52,7 +52,7 @@ export const SERIES_PAGES: Record<string, { series: string; title: string; pageT
   series8: { series: '導入シミュレーション', title: 'Service Robot Simulation | サービスロボット導入シミュレーション', pageTitle: 'Series8 | サービスロボット導入シミュレーション', limit: 12,
     intro: '配膳・清掃・搬送など、店や施設で動くサービスロボットを入れたら何が変わるかを、導入前に試算する記録です。時間・順番・数は SimPy で、ぶつかる・こぼれるといった空間と動きは Unity で扱います。前提の数字は公開事例と観察から置き、結果とコードは全量で公開しています。',
     sim: { src: '/sim/serving-robot.html', title: '配膳ロボット、何台入れたら店は変わる？',
-      note: '店を選び、人数・台数・ロボットの使い方を切り替えると、ピーク時の入店待ちや料理が届くまでの時間が変わります。標準ファミレスは、店の形（平面図）から選ぶこともできます。1つの条件を40回回した平均で、数字はすべて仮の前提による試算です（試作 v2.4・16,425条件）。',
+      note: '店を選び、人数・台数・ロボットの使い方を切り替えると、ピーク時の入店待ちや料理が届くまでの時間が変わります。標準ファミレスは、店の形（平面図）から選ぶこともできます。ロボットの費用と浮く人件費も比べられます（補助金の情報つき）。1つの条件を40回回した平均で、数字はすべて仮の前提による試算です（試作 v2.4・16,425条件）。',
       obs: { src: '/sim/serving-robot-observation.html', title: '試算の仮の数字を、店で数える観察シート', label: '観察シートを開く ↗',
         note: '配膳ロボットが通路で何回止まるかは、公開データが見つかりませんでした。店で片手で押して数えるための記録シートの例です。押した記録はこのブラウザの中にだけ保存され、どこにも送られません。',
         points: ['ロボットの出発・卓に着いた・止まった・戻ったを押すと、1往復の時間と止まった割合が出る', '止まった場所と原因を選べる。選択肢は記録する人の立場（客席から・店のスタッフ・導入や保守の担当）で切り替わる', '地図やルートを変える前と後の観察を並べて比べられる'] },
```

### 試算のページ（public/sim/serving-robot.html）に足した行

変更前（コミット c3ed19d）からの差分を、足した行だけの形（`git diff -U0`）で全量載せます。消した行はありません。足した場所は6か所で、上から順に、上の結果から費用の欄への案内、費用の欄の HTML、`render()` から費用の欄を描く呼び出し、費用の計算と描画の JavaScript、最初に切り替えを作る呼び出し、案内を押したときに外のページを送る処理です。

```diff
diff --git a/public/sim/serving-robot.html b/public/sim/serving-robot.html
index 547448c..6b69a93 100644
--- a/public/sim/serving-robot.html
+++ b/public/sim/serving-robot.html
@@ -241,0 +242,2 @@ footer { color: var(--ink-3); font-size: 11px; }
+        <style>.cost-jump { display: inline-block; margin-top: 12px; font-size: 14px; font-weight: 500; color: var(--ink); text-decoration: underline; text-underline-offset: 3px; }</style>
+        <a class="cost-jump" id="cost-jump" href="#cost" data-ev="費用の欄へ移る">ロボットの費用と変わること（ひと月）は下にあります ↓</a>
@@ -280,0 +283,77 @@ footer { color: var(--ink-3); font-size: 11px; }
+      <section id="cost" style="scroll-margin-top:16px">
+        <h2>ロボットの費用と、変わること（ひと月）</h2>
+        <p class="sub" id="cost-sub"></p>
+        <style>#cost-kpis .kpi, html.embed #cost-kpis .kpi { background: var(--ink); color: #fff; } #cost-kpis .kpi .k { color: #b8b8b4; } #cost-kpis .kpi .v small { color: #d0d0cc; } #cost-kpis .kpi .h { color: #b8b8b4; }</style>
+        <div class="kpis" id="cost-kpis" style="margin-bottom:8px"></div>
+        <div class="compare">
+          <style>.compare h3.ch { margin: 0; font-size: 13px; font-weight: 600; } .compare p.ch-sub { margin: -10px 0 0; font-size: 12px; color: var(--ink-3); }</style>
+          <h3 class="ch">人件費：店が回る最少のスタッフは何人減るか</h3>
+          <div class="tablewrap"><table class="ctable" id="costtable"></table></div>
+          <h3 class="ch" id="cost2-h"></h3>
+          <p class="ch-sub">人手不足：スタッフの手がふさがっている割合（9割を超えると呼び出しに出られない）／作業の軽さ：スタッフ1人が歩く距離／サービス：入店待ちと、料理ができてから届くまで</p>
+          <div class="tablewrap"><table class="ctable" id="costtable2"></table></div>
+          <p class="verdict" id="cost-verdict"></p>
+          <style>.merits { margin: 0; padding: 18px 20px; background: var(--panel); border: 1.5px solid var(--ink); border-radius: 8px; color: var(--ink); }
+            .merits b.mh { display: block; font-size: 16px; font-weight: 600; }
+            .merits ul { margin: 10px 0 0; padding-left: 1.2em; display: grid; gap: 8px; font-size: 14px; line-height: 1.7; }
+            .merits li b { font-weight: 600; } .merits li span { color: var(--ink-3); font-size: 12px; }</style>
+          <div class="merits">
+            <b class="mh">人件費のほかに、ロボットを入れて良くなること</b>
+            <ul>
+              <li><b>人手不足</b>：配膳の往復をロボットが受け持つ分、スタッフの手が空き、人が足りない日でも案内・会計・呼び出しに出やすくなる<span>（2つめの表の「手がふさがっている割合」）</span></li>
+              <li><b>作業の軽さ</b>：厨房と客席の往復が減り、歩く距離が短くなる。下げ膳にも使えば、重い皿を運ぶ負担も減る<span>（「1人が歩く距離」）</span></li>
+              <li><b>サービス</b>：料理が早く届き、入店待ちも縮む。空いた手を、客と話す・様子を見るといった人にしかできない接客に回せる<span>（「入店待ち」「料理が届くまで」）</span></li>
+              <li><b>試算に入れていないこと</b>：採用・教育の手間、人が辞めたときの穴の埋めやすさ、スタッフの疲れ方。数字にはしていませんが、店によっては大きい点です</li>
+            </ul>
+          </div>
+          <span class="step">費用の前提を選ぶ</span>
+          <div class="pickers">
+            <fieldset class="ctl">
+              <legend>ロボットの払い方</legend>
+              <div class="seg" id="seg-cpay"></div>
+            </fieldset>
+            <fieldset class="ctl">
+              <legend id="cprice-legend">1台の値段</legend>
+              <div class="seg" id="seg-cprice"></div>
+              <p class="note" id="cprice-note"></p>
+            </fieldset>
+            <fieldset class="ctl">
+              <legend>保守（1台・月）</legend>
+              <div class="seg" id="seg-cmaint"></div>
+              <p class="note">修理・点検の契約。月額に含まれる契約もあります。</p>
+            </fieldset>
+            <fieldset class="ctl" id="ctl-cyears">
+              <legend>使う年数</legend>
+              <div class="seg" id="seg-cyears"></div>
+              <p class="note">買った値段を、使う月数で割ってひと月の費用にします。</p>
+            </fieldset>
+            <fieldset class="ctl" id="ctl-csub">
+              <legend>補助金</legend>
+              <div class="seg" id="seg-csub"></div>
+              <p class="note">中小企業省力化投資補助金（カタログ注文型）。買う値段の1/2まで。下の「費用の前提と補助金」に条件があります。</p>
+            </fieldset>
+            <fieldset class="ctl">
+              <legend>スタッフの時給（円）</legend>
+              <div class="seg" id="seg-cwage"></div>
+              <p class="note">1,177円は、2026年度の最低賃金の全国平均（答申）です。</p>
+            </fieldset>
+            <fieldset class="ctl">
+              <legend>1人減らすと浮く時間（ピーク1回）</legend>
+              <div class="seg" id="seg-chours"></div>
+              <p class="note">「ピークの間」は2〜2.5時間です。ピークの間だけ人を減らせるとは限らず、シフトは数時間単位で組むことが多いため、4時間も選べます。</p>
+            </fieldset>
+            <fieldset class="ctl">
+              <legend>ピークの回数</legend>
+              <div class="seg" id="seg-cpeaks"></div>
+              <p class="note">ひと月は30日で数えます。</p>
+            </fieldset>
+          </div>
+        </div>
+        <details style="margin-top:8px">
+          <summary>費用の前提と補助金（2026年10月に調べた値）</summary>
+          <ul id="cost-assume"></ul>
+          <p class="notmodeled">この費用の試算は、上の試算の結果（店が回るかどうか）をそのまま使っています。上の試算の数字は変えていません。人件費は「店が回る最少のスタッフ」がロボットで何人減るかだけから出していて、人手不足・作業の軽さ・サービスの変化は、2つめの表に試算の結果をそのまま並べていて、お金には直していません。</p>
+          <p class="notmodeled">まだ入れていないもの：地図づくり・設定・スタッフへの説明にかかる初めの費用、故障で止まっている間の手間、電気代以外の消耗品、補助金の申請の手間と通るかどうか、税金（買ったときの減価償却の扱い）。</p>
+        </details>
+      </section>
+
@@ -573,0 +653 @@ function render() {
+  renderCost();
@@ -670,0 +751,178 @@ function renderAssume() {
+// ロボットの費用と、浮く人件費（2026-10-23 追加）。上の試算の結果（店が回るか）をそのまま使い、数字は変えない
+// 人件費の差：ロボット n 台で「店が回る最少のスタッフ」が、ロボットなしより何人減るか × 浮く時間 × 時給
+const COST = {
+  pay: "rent", price: { rent: 60000, buy: 2500000 }, maint: 10000, years: 5, sub: false,
+  wage: 1177, hours: "peak", peaks: 2,
+};
+const COST_DAYS = 30;          // ひと月の営業日
+const COST_CHARGE = 2000;      // 充電の電気代（1台・月）。公開されている目安 1,000〜3,000円の真ん中
+const COST_SHIFT_H = 4;        // 「シフト1回分」で浮くと数える時間
+const SUB_RATE = 0.5, SUB_CAP = 7500000; // 省力化投資補助金（カタログ注文型）：1/2以下・従業員6〜20人の上限750万円
+const PRICE_OPTS = {
+  rent: [30000, 60000, 100000],
+  buy: [1500000, 2500000, 3500000],
+};
+const man = v => {
+  if (Math.round(v / 1000) === 0) return "0円";
+  const a = Math.abs(v) / 10000, r = Math.round(a * 10) / 10, t = a >= 100 ? Math.round(a).toLocaleString("ja-JP") : (Number.isInteger(r) ? String(r) : r.toFixed(1));
+  return `${v < 0 ? "−" : ""}${t}万円`;
+};
+// 左の条件のままで、ロボット n 台のとき店が回る最少のスタッフ（選べる人数の範囲で探す）
+function minStaff(n) {
+  const s = S(), arr = arrN();
+  for (const st of s.staff_all) {
+    const r = find(state.store, st, n, arr, state.mode);
+    if (r && !unstable(r)) return { st, r };
+  }
+  return null;
+}
+function robotCost(n) {
+  const p = COST.price[COST.pay];
+  const run = n * (COST.maint + COST_CHARGE);
+  if (COST.pay === "rent") return { month: n * p + run, run, first: 0, subsidy: 0 };
+  const total = n * p, subsidy = COST.sub ? Math.min(total * SUB_RATE, SUB_CAP) : 0;
+  const first = total - subsidy;
+  return { month: first / (COST.years * 12) + run, run, first, subsidy };
+}
+function hoursSaved() { return COST.hours === "peak" ? S().peak_min / 60 : COST_SHIFT_H; }
+function buildCost() {
+  const yen = v => v.toLocaleString("ja-JP");
+  seg("seg-cpay", "cpay", [{ v: "rent", l: "月額で借りる" }, { v: "buy", l: "買う" }], () => COST.pay, v => { COST.pay = v; buildCost(); });
+  const po = PRICE_OPTS[COST.pay];
+  seg("seg-cprice", "cprice", po.map(v => ({ v, l: `${v / 10000}<small>万円</small>` })), () => COST.price[COST.pay], v => COST.price[COST.pay] = v);
+  document.getElementById("cprice-legend").textContent = COST.pay === "rent" ? "1台の月額" : "1台の値段";
+  document.getElementById("cprice-note").textContent = COST.pay === "rent"
+    ? "レンタル・リースの相場は月3〜12万円（中央値は6万円台）。"
+    : "買う場合の相場は150〜350万円（中央値は250万円前後）。";
+  seg("seg-cmaint", "cmaint", [{ v: 0, l: "込み" }, { v: 10000, l: "1<small>万円</small>" }, { v: 20000, l: "2<small>万円</small>" }], () => COST.maint, v => COST.maint = v);
+  seg("seg-cyears", "cyears", [3, 5, 7].map(v => ({ v, l: `${v}<small>年</small>` })), () => COST.years, v => COST.years = v);
+  seg("seg-csub", "csub", [{ v: false, l: "使わない" }, { v: true, l: "使う" }], () => COST.sub, v => COST.sub = v);
+  document.getElementById("ctl-cyears").hidden = COST.pay !== "buy";
+  document.getElementById("ctl-csub").hidden = COST.pay !== "buy";
+  seg("seg-cwage", "cwage", [1100, 1177, 1300, 1500].map(v => ({ v, l: yen(v) })), () => COST.wage, v => COST.wage = v);
+  seg("seg-chours", "chours", [{ v: "peak", l: "ピークの間" }, { v: "shift", l: `${COST_SHIFT_H}時間` }], () => COST.hours, v => COST.hours = v);
+  seg("seg-cpeaks", "cpeaks", [{ v: 1, l: "1日1回" }, { v: 2, l: "1日2回" }], () => COST.peaks, v => COST.peaks = v);
+}
+function renderCost() {
+  const s = S(), arr = arrN();
+  const h = hoursSaved(), perPerson = h * COST.peaks * COST_DAYS * COST.wage;
+  document.getElementById("cost-sub").textContent =
+    `${s.label}・${CROWD[state.crowd]}（${arr}組/時）・${MODE_SHORT[state.mode]}・${state.trays === 1 ? "1卓ずつ" : "最大3卓"}は、左の条件と同じです。` +
+    `ロボットの台数ごとに、店が回る最少のスタッフが何人減るか（人件費）と、人数をそのままにしたときの人手不足・作業の軽さ・サービスの変化を、ロボットの費用と並べます。`;
+  const maxR = Math.max(3, state.robots);
+  const base = minStaff(0);
+  const rows = ROBOTS_ALL.filter(n => n <= maxR).map(n => {
+    const m = minStaff(n), c = robotCost(n);
+    const saved = base && m ? base.st - m.st : null;
+    const labor = saved === null ? null : saved * perPerson;
+    return { n, m, c, saved, labor, net: labor === null ? null : labor - c.month };
+  });
+  const nets = rows.filter(x => x.n > 0 && x.net !== null).map(x => x.net);
+  const bestNet = nets.length ? Math.max(...nets) : null;
+  const head = `<thead><tr><th>ロボット</th><th>店が回る最少のスタッフ</th><th>そのときの入店待ち</th><th>ロボットの費用</th><th>浮く人件費</th><th>差し引き</th></tr></thead>`;
+  const body = rows.map(x => {
+    const cur = x.n === state.robots ? " cur" : "";
+    if (!x.m) return `<tr><td class="${cur.trim()}">${x.n}台</td><td class="n${cur}" colspan="5">選べる人数（${s.staff_all[0]}〜${s.staff_all[s.staff_all.length - 1]}人）では店が回りません</td></tr>`;
+    const first = COST.pay === "buy" && x.n > 0
+      ? `<span class="sm">初めに ${man(x.c.first)}${x.c.subsidy ? `（補助 ${man(x.c.subsidy)}）` : ""}</span>` : "";
+    const lab = x.n === 0 ? "基準" : x.saved > 0 ? `${man(x.labor)}<span class="sm">${x.saved}人分</span>` : x.saved === 0 ? `0円<span class="sm">人数は同じ</span>` : `${man(x.labor)}<span class="sm">${-x.saved}人増える</span>`;
+    const net = x.n === 0 ? "—" : man(x.net);
+    return `<tr><td class="${cur.trim()}">${x.n}台</td><td class="n${cur}">${x.m.st}人</td><td class="n${cur}">${plainMin(x.m.r.entry_wait_mean)}</td>`
+      + `<td class="n${cur}">${x.n === 0 ? "0円" : man(x.c.month)}${first}</td><td class="n${cur}">${lab}</td>`
+      + `<td class="n${cur}${x.n > 0 && x.net === bestNet ? " best" : ""}">${net}</td></tr>`;
+  }).join("");
+  document.getElementById("costtable").innerHTML = head + `<tbody>${body}</tbody>`;
+
+  // 人数をそのままにしてロボットを入れたとき（左のスタッフ数）：人手不足・作業の軽さ・サービス
+  const staff = state.staff;
+  document.getElementById("cost2-h").textContent = `人数をそのまま（スタッフ${staff}人）にしてロボットを入れたとき`;
+  const same = ROBOTS_ALL.filter(n => n <= maxR).map(n => ({ n, r: find(state.store, staff, n, arr, state.mode), c: robotCost(n) }));
+  const r0 = same[0].r;
+  const diff = (a, b) => { const d = a ? b / a - 1 : 0; return Math.abs(d) < 0.005 ? "" : `<span class="sm">${d < 0 ? "−" : "+"}${Math.abs(Math.round(d * 100))}%</span>`; };
+  const head2 = `<thead><tr><th>ロボット</th><th>ロボットの費用</th><th>手がふさがっている割合</th><th>1人が歩く距離</th><th>入店待ち</th><th>料理が届くまで</th></tr></thead>`;
+  const body2 = same.map(({ n, r, c }) => {
+    if (!r) return "";
+    const cur = n === state.robots ? " cur" : "";
+    return `<tr><td class="${cur.trim()}">${n}台</td><td class="n${cur}">${n === 0 ? "0円" : man(c.month)}</td>`
+      + `<td class="n${cur}">${plainPct(r.staff_util)}</td><td class="n${cur}">${r.walk_km_per_staff.toFixed(2)}km${n ? diff(r0.walk_km_per_staff, r.walk_km_per_staff) : ""}</td>`
+      + `<td class="n${cur}">${seatCell(r)}</td><td class="n${cur}">${plainSec(r.dish_wait_mean)}</td></tr>`;
+  }).join("");
+  document.getElementById("costtable2").innerHTML = head2 + `<tbody>${body2}</tbody>`;
+
+  // 左で選んでいる台数についての一文
+  const n = state.robots, x = rows.find(y => y.n === n);
+  let v;
+  if (!base) v = `ロボットなしでは、選べる人数の範囲で店が回らないので、減らせる人数を比べられません。左の混み具合を下げると比べられます。`;
+  else if (n === 0) v = `左でロボットを1台以上選ぶと、その台数の費用と、浮く人件費をここにまとめます。ロボットなしで店が回る最少のスタッフは${base.st}人です。`;
+  else if (!x || !x.m) v = `ロボット${n}台でも、選べる人数の範囲では店が回りません。`;
+  else {
+    const wait = `入店待ちは ${plainMin(base.r.entry_wait_mean)} → ${plainMin(x.m.r.entry_wait_mean)}`;
+    const cost = COST.pay === "rent" ? `ロボットの費用は月${man(x.c.month)}` : `ロボットの費用は、初めに${man(x.c.first)}${x.c.subsidy ? `（補助金${man(x.c.subsidy)}を引いた額）` : ""}、${COST.years}年で割ると月${man(x.c.month)}`;
+    if (x.saved > 0) {
+      const back = COST.pay === "buy" && x.labor > x.c.run ? `。初めに払う額は、およそ${Math.ceil(x.c.first / (x.labor - x.c.run))}か月で取り戻せる計算です` : "";
+      v = `ロボット${n}台なら、店が回る最少のスタッフは${base.st}人 → ${x.m.st}人です（${wait}）。浮く人件費は月${man(x.labor)}、${cost}で、差し引き月${man(x.net)}${back}。`
+        + (x.net < 0 ? `人件費だけでは元が取れないので、待ち時間や料理が届く早さの良さ（上の表）と合わせて判断する形になります。` : "");
+    } else if (x.saved === 0) {
+      const sr = same.find(y => y.n === n), a0 = r0, b0 = sr && sr.r;
+      const walk = b0 ? Math.round((1 - b0.walk_km_per_staff / a0.walk_km_per_staff) * 100) : 0;
+      const gains = b0 ? `スタッフ${staff}人のままなら、手がふさがっている割合は ${plainPct(a0.staff_util)} → ${plainPct(b0.staff_util)}、1人が歩く距離は${walk >= 0 ? `${walk}%減り` : `${-walk}%増え`}、入店待ちは ${plainMin(a0.entry_wait_mean)} → ${plainMin(b0.entry_wait_mean)}、料理が届くまでは ${plainSec(a0.dish_wait_mean)} → ${plainSec(b0.dish_wait_mean)} です。` : "";
+      v = `ロボット${n}台を入れても、店が回る最少のスタッフは${base.st}人のままで、人件費は浮きません。${cost}で、変わるのは人手不足・作業の軽さ・サービスの方です。` + gains;
+    } else {
+      v = `ロボット${n}台では、店が回る最少のスタッフがかえって増えます（${base.st}人 → ${x.m.st}人）。`;
+    }
+    if (n >= 5) v += ROBOT_NOTE;
+  }
+  document.getElementById("cost-verdict").textContent = v;
+
+  // 欄の頭のカード3枚（左で選んでいる台数。0台なら2台で見せる）
+  const kn = state.robots || 2, kx = rows.find(y => y.n === kn), ks = same.find(y => y.n === kn);
+  const of0 = state.robots === 0 ? "（0台を選んでいるので2台で）" : "";
+  let cards;
+  if (!kx) cards = [];
+  else {
+    const c = kx.c;
+    const costH = COST.pay === "rent"
+      ? `1台 月${man(COST.price.rent)}＋保守・充電 × ${kn}台`
+      : `初めに${man(c.first)}${c.subsidy ? `（補助金${man(c.subsidy)}を引いた額）` : ""}を${COST.years}年で割り、保守・充電を足した額`;
+    const labV = !base || !kx.m ? "—" : man(Math.max(kx.labor, 0)).replace(/^0万円$/, "0円");
+    const labH = !base ? "ロボットなしで店が回らないので比べられない"
+      : !kx.m ? "選べる人数では店が回らない"
+      : kx.saved > 0 ? `店が回る最少のスタッフ ${base.st}人 → ${kx.m.st}人（${kx.saved}人分）`
+      : `店が回る最少のスタッフは${base.st}人のまま`;
+    const walk = ks && ks.r ? Math.round((1 - ks.r.walk_km_per_staff / r0.walk_km_per_staff) * 100) : null;
+    const netV = kx.net === null ? "—" : man(kx.net);
+    const netH = kx.net === null ? ""
+      : kx.saved > 0 && COST.pay === "buy" && kx.labor > c.run ? `初めに払う額は、およそ${Math.ceil(c.first / (kx.labor - c.run))}か月で取り戻せる`
+      : kx.saved > 0 ? "浮く人件費 − ロボットの費用"
+      : ks && ks.r ? `人数そのままなら、歩く距離 ${walk >= 0 ? "−" : "+"}${Math.abs(walk)}%・入店待ち ${plainMin(r0.entry_wait_mean)} → ${plainMin(ks.r.entry_wait_mean)}` : "";
+    const yen = v => v.replace("万円", "<small>万円</small>").replace(/^0円$/, "0<small>円</small>");
+    cards = [
+      { k: `ロボット${kn}台の費用（月）${of0}`, v: yen(man(c.month)), h: costH },
+      { k: "浮く人件費（月）", v: labV === "—" ? "—" : yen(labV), h: labH },
+      { k: "差し引き（月）", v: netV === "—" ? "—" : yen(netV), h: netH },
+    ];
+  }
+  document.getElementById("cost-kpis").innerHTML = cards.map(x => `<div class="kpi"><span class="k">${x.k}</span><span class="v">${x.v}</span><span class="h">${x.h}</span></div>`).join("");
+
+  const a = [
+    ["人件費の差の出し方", `左の条件（店・混み具合・使い方・運び方）のまま、ロボット0〜${maxR}台それぞれで「店が回らない」が出ない最少のスタッフを、上の試算の結果から探す。ロボットなしより減った人数 × 浮く時間 × ピークの回数 × ${COST_DAYS}日 × 時給`],
+    ["浮く時間", `「ピークの間」は、この店のピーク${s.peak_min}分。「4時間」はシフト1回分。いまの設定では、1人あたり月${man(perPerson)}`],
+    ["時給", "社会保険料・交通費などの上乗せは入れていない。2026年度の最低賃金は全国加重平均で1,177円（9月3日に各都道府県の答申が出そろった。10月1日〜12月2日に順に発効）"],
+    ["ロボットの値段の相場", "買う場合は150〜350万円（中央値250万円前後）、レンタル・リースは月3〜12万円（中央値は6万円台）"],
+    ["保守・充電", `リースの月額に保守が含まれず、別に数万円かかる契約がある。保守の金額は仮置きで、込み・1万円・2万円から選ぶ。充電の電気代は1台月${COST_CHARGE.toLocaleString("ja-JP")}円で固定（目安は月1,000〜3,000円）`],
+    ["買う場合のひと月の費用", "（買った値段 − 補助金）÷ 使う月数 ＋ 保守 ＋ 充電。残った価値（売るときの値段）は入れていない"],
+    ["補助金（中小企業省力化投資補助金・カタログ注文型）", `カタログに載った製品を販売事業者と一緒に申請する。補助率は1/2以下。上限は従業員5人以下 500万円・6〜20人 750万円・21人以上 1,000万円（大幅な賃上げをすると上限が上がる。2026年3月19日の改定後）。この試算では買う場合にだけ1/2を引き、上限は750万円で計算する。随時受付で2027年3月末ごろまでの予定（予算がなくなると早く終わることがある）。申請には GビズIDプライム（取得に2〜3週間）が要る。配膳ロボットは対象の製品として扱われている。リースでの導入が対象になるかは、公募要領で確かめる`],
+    ["そのほかの支援", "業務改善助成金（厚生労働省）：店の中で一番低い時給を50円以上上げ、設備投資などをすると費用の3/4〜4/5が出る。令和8年度の申請は、店のある都道府県の最低賃金が発効する前日まで。配膳ロボットが対象になるかは労働局で確かめる"],
+  ];
+  const src = [
+    ["配膳ロボットの導入費用の相場（お名前.com ビジネス）", "https://www.onamae.com/business/article/306061/"],
+    ["配膳ロボットのリース・保守・充電の費用（創業手帳）", "https://sogyotecho.jp/inshokuten-haizenrobot/"],
+    ["2026年度の地域別最低賃金（労働政策研究・研修機構）", "https://www.jil.go.jp/kokunai/blt/backnumber/2026/10/special_03.html"],
+    ["省力化投資補助金 カタログ注文型（補助金ポータル）", "https://hojyokin-portal.jp/columns/shoryokuka-catalog"],
+    ["省力化補助金の介護業での活用（厚生労働省・令和8年4月30日）", "https://www.mhlw.go.jp/content/001696868.pdf"],
+    ["令和8年度 業務改善助成金のご案内（厚生労働省）", "https://www.mhlw.go.jp/content/11200000/001693381.pdf"],
+  ];
+  document.getElementById("cost-assume").innerHTML = a.map(([k, t]) => `<li>${k}：${t}</li>`).join("")
+    + `<li>出典：${src.map(([t, u]) => `<a href="${u}" target="_blank" rel="noopener">${t}</a>`).join("、")}</li>`;
+}
+
@@ -673,0 +932 @@ buildControls();
+buildCost();
@@ -674,0 +934,8 @@ render();
+document.getElementById("cost-jump").addEventListener("click", e => {
+  const t = document.getElementById("cost");
+  let f = null; try { f = window.frameElement; } catch (_) {}
+  if (!f) return;
+  e.preventDefault();
+  const pw = window.parent;
+  pw.scrollTo({ top: f.getBoundingClientRect().top + pw.scrollY + t.getBoundingClientRect().top - 96, behavior: "smooth" });
+});
```

### 全部の店・混み具合・使い方で、店が回る最少のスタッフを数えるコード（cost_check.py）

ページの JavaScript（`minStaff`・`robotCost`・`hoursSaved`）と同じ計算を Python で書き直し、ページに入っている試算の結果から、99条件を全部出しました。

```python
"""試算のページ（public/sim/serving-robot.html）に入っている結果から、
費用の欄と同じ決め方で「店が回る最少のスタッフ」と月の差し引きを、全部の店・混み具合・使い方について出す。
ページの JavaScript（minStaff・robotCost・hoursSaved）と同じ計算を Python で書き直したもの。
既定の前提：月額で借りる（1台 月6万円）・保守 月1万円・充電 月2,000円・時給 1,177円・ピークの間・1日2回・30日。
"""
import json, sys

PAGE = sys.argv[1] if len(sys.argv) > 1 else "public/sim/serving-robot.html"
s = open(PAGE, encoding="utf-8").read()
start = s.find("const D = ") + len("const D = ")
D, _ = json.JSONDecoder().raw_decode(s[start:])
rows = [dict(zip(D["k"], r)) for r in D["r"]]
idx = {(r["store"], r["staff"], r["robots"], r["arrivals_per_h"], r["mode"], r["trays"], r["fragile_by"]): r for r in rows}

RENT, MAINT, CHARGE, WAGE, PEAKS, DAYS = 60000, 10000, 2000, 1177, 2, 30
TRAYS, FB = 3, "any"
CROWD = ["空いている", "普通", "混雑"]
MODES = {"serve": "上げ膳だけ", "bus": "下げ膳にも", "patrol": "回収して回る"}


def find(store, staff, n, arr, mode):
    k = (store, staff, 0, arr, "serve", 1, "any") if n == 0 else (store, staff, n, arr, mode, TRAYS, FB)
    return idx.get(k)


def min_staff(store, n, arr, mode):
    for st in D["stores"][store]["staff_all"]:
        r = find(store, st, n, arr, mode)
        if r and r["ng"] == 0:
            return st, r
    return None, None


def man(v):
    return f"{v / 10000:+.1f}万円"


print("店\t混み具合\t使い方\t0台\t1台\t2台\t3台\t2台の差し引き（月）")
for store, sd in D["stores"].items():
    per_person = sd["peak_min"] / 60 * PEAKS * DAYS * WAGE
    for ci, arr in enumerate(sd["arrivals"]):
        for mode, mname in MODES.items():
            ms = [min_staff(store, n, arr, mode)[0] for n in range(4)]
            if ms[0] is None or ms[2] is None:
                net = "—"
            else:
                labor = (ms[0] - ms[2]) * per_person
                cost = 2 * (RENT + MAINT + CHARGE)
                net = man(labor - cost)
            cells = ["回らない" if m is None else f"{m}人" for m in ms]
            print(f"{sd['label']}\t{CROWD[ci]}（{arr}組/時）\t{mname}\t" + "\t".join(cells) + f"\t{net}")
```


## 実行したコマンドと出力

### 全部の店・混み具合・使い方の結果（cost_check.py の出力・99行）

```
$ python3 cost_check.py public/sim/serving-robot.html
```

```
店	混み具合	使い方	0台	1台	2台	3台	2台の差し引き（月）
小型店	空いている（15組/時）	上げ膳だけ	1人	1人	1人	1人	-14.4万円
小型店	空いている（15組/時）	下げ膳にも	1人	1人	1人	1人	-14.4万円
小型店	空いている（15組/時）	回収して回る	1人	1人	1人	1人	-14.4万円
小型店	普通（22組/時）	上げ膳だけ	2人	2人	2人	2人	-14.4万円
小型店	普通（22組/時）	下げ膳にも	2人	2人	2人	2人	-14.4万円
小型店	普通（22組/時）	回収して回る	2人	2人	2人	2人	-14.4万円
小型店	混雑（30組/時）	上げ膳だけ	2人	2人	2人	2人	-14.4万円
小型店	混雑（30組/時）	下げ膳にも	2人	2人	2人	2人	-14.4万円
小型店	混雑（30組/時）	回収して回る	2人	2人	2人	2人	-14.4万円
標準ファミレス	空いている（25組/時）	上げ膳だけ	2人	2人	2人	2人	-14.4万円
標準ファミレス	空いている（25組/時）	下げ膳にも	2人	2人	2人	2人	-14.4万円
標準ファミレス	空いている（25組/時）	回収して回る	2人	2人	2人	2人	-14.4万円
標準ファミレス	普通（35組/時）	上げ膳だけ	3人	3人	3人	3人	-14.4万円
標準ファミレス	普通（35組/時）	下げ膳にも	3人	3人	3人	3人	-14.4万円
標準ファミレス	普通（35組/時）	回収して回る	3人	3人	3人	2人	-14.4万円
標準ファミレス	混雑（45組/時）	上げ膳だけ	4人	4人	3人	3人	-0.3万円
標準ファミレス	混雑（45組/時）	下げ膳にも	4人	4人	3人	3人	-0.3万円
標準ファミレス	混雑（45組/時）	回収して回る	4人	4人	3人	3人	-0.3万円
大型店	空いている（45組/時）	上げ膳だけ	4人	4人	3人	3人	-0.3万円
大型店	空いている（45組/時）	下げ膳にも	4人	4人	4人	3人	-14.4万円
大型店	空いている（45組/時）	回収して回る	4人	4人	4人	3人	-14.4万円
大型店	普通（60組/時）	上げ膳だけ	6人	6人	5人	5人	-0.3万円
大型店	普通（60組/時）	下げ膳にも	6人	6人	5人	5人	-0.3万円
大型店	普通（60組/時）	回収して回る	6人	6人	5人	5人	-0.3万円
大型店	混雑（75組/時）	上げ膳だけ	8人	7人	7人	7人	-0.3万円
大型店	混雑（75組/時）	下げ膳にも	8人	7人	7人	7人	-0.3万円
大型店	混雑（75組/時）	回収して回る	8人	7人	7人	6人	-0.3万円
洗い場が遠い店	空いている（16組/時）	上げ膳だけ	2人	1人	1人	1人	-0.3万円
洗い場が遠い店	空いている（16組/時）	下げ膳にも	2人	1人	1人	1人	-0.3万円
洗い場が遠い店	空いている（16組/時）	回収して回る	2人	1人	1人	1人	-0.3万円
洗い場が遠い店	普通（22組/時）	上げ膳だけ	3人	2人	2人	2人	-0.3万円
洗い場が遠い店	普通（22組/時）	下げ膳にも	3人	2人	2人	2人	-0.3万円
洗い場が遠い店	普通（22組/時）	回収して回る	3人	2人	2人	2人	-0.3万円
洗い場が遠い店	混雑（28組/時）	上げ膳だけ	4人	3人	3人	3人	-0.3万円
洗い場が遠い店	混雑（28組/時）	下げ膳にも	4人	3人	3人	2人	-0.3万円
洗い場が遠い店	混雑（28組/時）	回収して回る	4人	3人	3人	2人	-0.3万円
焼肉食べ放題	空いている（14組/時）	上げ膳だけ	2人	1人	1人	1人	+3.3万円
焼肉食べ放題	空いている（14組/時）	下げ膳にも	2人	1人	1人	1人	+3.3万円
焼肉食べ放題	空いている（14組/時）	回収して回る	2人	1人	1人	1人	+3.3万円
焼肉食べ放題	普通（20組/時）	上げ膳だけ	3人	3人	2人	2人	+3.3万円
焼肉食べ放題	普通（20組/時）	下げ膳にも	3人	3人	2人	2人	+3.3万円
焼肉食べ放題	普通（20組/時）	回収して回る	3人	3人	2人	2人	+3.3万円
焼肉食べ放題	混雑（26組/時）	上げ膳だけ	4人	3人	3人	3人	+3.3万円
焼肉食べ放題	混雑（26組/時）	下げ膳にも	4人	3人	3人	3人	+3.3万円
焼肉食べ放題	混雑（26組/時）	回収して回る	4人	3人	3人	2人	+3.3万円
標準ファミレス（② 定番の郊外型）	空いている（14組/時）	上げ膳だけ	1人	1人	1人	1人	-14.4万円
標準ファミレス（② 定番の郊外型）	空いている（14組/時）	下げ膳にも	1人	1人	1人	1人	-14.4万円
標準ファミレス（② 定番の郊外型）	空いている（14組/時）	回収して回る	1人	1人	1人	1人	-14.4万円
標準ファミレス（② 定番の郊外型）	普通（19組/時）	上げ膳だけ	2人	2人	2人	2人	-14.4万円
標準ファミレス（② 定番の郊外型）	普通（19組/時）	下げ膳にも	2人	2人	2人	2人	-14.4万円
標準ファミレス（② 定番の郊外型）	普通（19組/時）	回収して回る	2人	1人	1人	1人	-0.3万円
標準ファミレス（② 定番の郊外型）	混雑（24組/時）	上げ膳だけ	2人	2人	2人	2人	-14.4万円
標準ファミレス（② 定番の郊外型）	混雑（24組/時）	下げ膳にも	2人	2人	2人	2人	-14.4万円
標準ファミレス（② 定番の郊外型）	混雑（24組/時）	回収して回る	2人	2人	2人	2人	-14.4万円
標準ファミレス（③ 効率重視・入口が角）	空いている（30組/時）	上げ膳だけ	2人	2人	2人	2人	-14.4万円
標準ファミレス（③ 効率重視・入口が角）	空いている（30組/時）	下げ膳にも	2人	2人	2人	2人	-14.4万円
標準ファミレス（③ 効率重視・入口が角）	空いている（30組/時）	回収して回る	2人	2人	2人	2人	-14.4万円
標準ファミレス（③ 効率重視・入口が角）	普通（42組/時）	上げ膳だけ	4人	3人	3人	3人	-0.3万円
標準ファミレス（③ 効率重視・入口が角）	普通（42組/時）	下げ膳にも	4人	3人	3人	3人	-0.3万円
標準ファミレス（③ 効率重視・入口が角）	普通（42組/時）	回収して回る	4人	3人	3人	3人	-0.3万円
標準ファミレス（③ 効率重視・入口が角）	混雑（54組/時）	上げ膳だけ	4人	4人	4人	4人	-14.4万円
標準ファミレス（③ 効率重視・入口が角）	混雑（54組/時）	下げ膳にも	4人	4人	4人	4人	-14.4万円
標準ファミレス（③ 効率重視・入口が角）	混雑（54組/時）	回収して回る	4人	4人	4人	3人	-14.4万円
標準ファミレス（④ 効率重視・小さめの店）	空いている（20組/時）	上げ膳だけ	2人	1人	1人	1人	-0.3万円
標準ファミレス（④ 効率重視・小さめの店）	空いている（20組/時）	下げ膳にも	2人	1人	1人	1人	-0.3万円
標準ファミレス（④ 効率重視・小さめの店）	空いている（20組/時）	回収して回る	2人	1人	1人	1人	-0.3万円
標準ファミレス（④ 効率重視・小さめの店）	普通（28組/時）	上げ膳だけ	2人	2人	2人	2人	-14.4万円
標準ファミレス（④ 効率重視・小さめの店）	普通（28組/時）	下げ膳にも	2人	2人	2人	2人	-14.4万円
標準ファミレス（④ 効率重視・小さめの店）	普通（28組/時）	回収して回る	2人	2人	2人	2人	-14.4万円
標準ファミレス（④ 効率重視・小さめの店）	混雑（36組/時）	上げ膳だけ	3人	3人	3人	2人	-14.4万円
標準ファミレス（④ 効率重視・小さめの店）	混雑（36組/時）	下げ膳にも	3人	3人	2人	2人	-0.3万円
標準ファミレス（④ 効率重視・小さめの店）	混雑（36組/時）	回収して回る	3人	2人	2人	2人	-0.3万円
標準ファミレス（⑤ ゆったり・入口が正面）	空いている（33組/時）	上げ膳だけ	3人	2人	2人	2人	-0.3万円
標準ファミレス（⑤ ゆったり・入口が正面）	空いている（33組/時）	下げ膳にも	3人	2人	2人	2人	-0.3万円
標準ファミレス（⑤ ゆったり・入口が正面）	空いている（33組/時）	回収して回る	3人	2人	2人	2人	-0.3万円
標準ファミレス（⑤ ゆったり・入口が正面）	普通（46組/時）	上げ膳だけ	4人	4人	3人	4人	-0.3万円
標準ファミレス（⑤ ゆったり・入口が正面）	普通（46組/時）	下げ膳にも	4人	4人	3人	3人	-0.3万円
標準ファミレス（⑤ ゆったり・入口が正面）	普通（46組/時）	回収して回る	4人	4人	3人	3人	-0.3万円
標準ファミレス（⑤ ゆったり・入口が正面）	混雑（59組/時）	上げ膳だけ	5人	5人	4人	4人	-0.3万円
標準ファミレス（⑤ ゆったり・入口が正面）	混雑（59組/時）	下げ膳にも	5人	5人	4人	4人	-0.3万円
標準ファミレス（⑤ ゆったり・入口が正面）	混雑（59組/時）	回収して回る	5人	5人	4人	4人	-0.3万円
標準ファミレス（⑥ ゆったり・入口が横）	空いている（27組/時）	上げ膳だけ	2人	2人	2人	2人	-14.4万円
標準ファミレス（⑥ ゆったり・入口が横）	空いている（27組/時）	下げ膳にも	2人	2人	2人	2人	-14.4万円
標準ファミレス（⑥ ゆったり・入口が横）	空いている（27組/時）	回収して回る	2人	2人	2人	2人	-14.4万円
標準ファミレス（⑥ ゆったり・入口が横）	普通（38組/時）	上げ膳だけ	3人	3人	3人	3人	-14.4万円
標準ファミレス（⑥ ゆったり・入口が横）	普通（38組/時）	下げ膳にも	3人	3人	3人	3人	-14.4万円
標準ファミレス（⑥ ゆったり・入口が横）	普通（38組/時）	回収して回る	3人	3人	3人	2人	-14.4万円
標準ファミレス（⑥ ゆったり・入口が横）	混雑（49組/時）	上げ膳だけ	4人	4人	3人	3人	-0.3万円
標準ファミレス（⑥ ゆったり・入口が横）	混雑（49組/時）	下げ膳にも	4人	4人	3人	3人	-0.3万円
標準ファミレス（⑥ ゆったり・入口が横）	混雑（49組/時）	回収して回る	4人	4人	3人	3人	-0.3万円
標準ファミレス（⑦ ③の通路を80cmに）	空いている（30組/時）	上げ膳だけ	2人	2人	2人	2人	-14.4万円
標準ファミレス（⑦ ③の通路を80cmに）	空いている（30組/時）	下げ膳にも	2人	2人	2人	2人	-14.4万円
標準ファミレス（⑦ ③の通路を80cmに）	空いている（30組/時）	回収して回る	2人	2人	2人	2人	-14.4万円
標準ファミレス（⑦ ③の通路を80cmに）	普通（42組/時）	上げ膳だけ	4人	3人	3人	3人	-0.3万円
標準ファミレス（⑦ ③の通路を80cmに）	普通（42組/時）	下げ膳にも	4人	3人	3人	3人	-0.3万円
標準ファミレス（⑦ ③の通路を80cmに）	普通（42組/時）	回収して回る	4人	3人	3人	3人	-0.3万円
標準ファミレス（⑦ ③の通路を80cmに）	混雑（54組/時）	上げ膳だけ	4人	4人	4人	4人	-14.4万円
標準ファミレス（⑦ ③の通路を80cmに）	混雑（54組/時）	下げ膳にも	4人	4人	4人	4人	-14.4万円
標準ファミレス（⑦ ③の通路を80cmに）	混雑（54組/時）	回収して回る	4人	4人	4人	3人	-14.4万円
```

### 条件の数え上げ

```
$ awk -F'\t' 'NR>1{n++; if($8=="-14.4万円")z++; else if($8=="-0.3万円")a++; else if($8=="+3.3万円")b++} END{print n, "減らない",z, "1人減(-0.3)",a, "焼肉+3.3",b}' cost_check.txt
99 減らない 47 1人減(-0.3) 43 焼肉+3.3 9
```

### 費用の欄の表示を、ヘッドレスのブラウザで確かめた出力

最初に足した版（コミット a571951）で、条件を切り替えて表示した結果です。上が大型店・混雑・2台を買って補助金あり、下が洗い場が遠い店・普通・2台を買う（補助金なし）です。

```
errors []
ロボット2台なら、店が回る最少のスタッフは8人 → 7人です（入店待ちは 12.0分 → 11.3分）。浮く人件費は月14.1万円、ロボットの費用は、初めに250万円（補助金250万円を引いた額）、5年で割ると月6.6万円で、差し引き月7.6万円。初めに払う額は、およそ22か月で取り戻せる計算です。
ロボット	店が回る最少のスタッフ	そのときの入店待ち	ロボットの費用	浮く人件費	差し引き
0台	8人	12.0分	0円	基準	—
1台	7人	13.6分	3.3万円
初めに 125万円（補助 125万円）
	14.1万円
1人分
	10.8万円
2台	7人	11.3分	6.6万円
初めに 250万円（補助 250万円）
	14.1万円
1人分
	7.6万円
3台	7人	9.4分	9.9万円
初めに 375万円（補助 375万円）
	14.1万円
1人分
	4.3万円
errors []
ロボット2台なら、店が回る最少のスタッフは3人 → 2人です（入店待ちは 2.9分 → 4.9分）。浮く人件費は月14.1万円、ロボットの費用は、初めに500万円、5年で割ると月10.7万円で、差し引き月3.4万円。初めに払う額は、およそ43か月で取り戻せる計算です。
ロボット	店が回る最少のスタッフ	そのときの入店待ち	ロボットの費用	浮く人件費	差し引き
0台	3人	2.9分	0円	基準	—
1台	2人	7.0分	5.4万円
初めに 250万円
	14.1万円
1人分
	8.8万円
2台	2人	4.9分	10.7万円
初めに 500万円
	14.1万円
1人分
	3.4万円
3台	2人	5.1分	16.1万円
初めに 750万円
	14.1万円
1人分
	−2万円
```

人数そのままの表を足した版（コミット 85ddf15）で、標準ファミレス・普通（PC 幅）と、大型店・混雑・2台を買って補助金あり（スマホ幅・埋め込み）を表示した結果です。

```
/tmp/claude-0/-home-claude/8a8c5399-248d-5aac-8a09-e92eaeff0054/scratchpad/cost2_family.png errors []
ロボット2台を入れても、店が回る最少のスタッフは3人のままで、人件費は浮きません。ロボットの費用は月14.4万円で、変わるのは人手不足・作業の軽さ・サービスの方です。スタッフ3人のままなら、手がふさがっている割合は 82% → 76%、1人が歩く距離は30%減り、入店待ちは 8.6分 → 4.1分、料理が届くまでは 58秒 → 39秒 です。
ロボット	ロボットの費用	手がふさがっている割合	1人が歩く距離	入店待ち	料理が届くまで
0台	0円	82%	3.88km	8.6分	58秒
1台	7.2万円	77%	3.09km
−20%
	4.7分	48秒
2台	14.4万円	76%	2.73km
−30%
	4.1分	39秒
3台	21.6万円	74%	2.48km
−36%
	3.0分	33秒
/tmp/claude-0/-home-claude/8a8c5399-248d-5aac-8a09-e92eaeff0054/scratchpad/cost2_mobile_large.png errors []
ロボット2台なら、店が回る最少のスタッフは8人 → 7人です（入店待ちは 12.0分 → 11.3分）。浮く人件費は月14.1万円、ロボットの費用は、初めに250万円（補助金250万円を引いた額）、5年で割ると月6.6万円で、差し引き月7.6万円。初めに払う額は、およそ22か月で取り戻せる計算です。
ロボット	ロボットの費用	手がふさがっている割合	1人が歩く距離	入店待ち	料理が届くまで
0台	0円	93%	7.80km	36.8分
店が回らない
	1分18秒
1台	3.3万円	91%	6.57km
−16%
	28.7分
店が回らない
	1分08秒
2台	6.6万円	90%	6.00km
−23%
	26.1分
店が回らない
	1分00秒
3台	9.8万円	88%	5.45km
−30%
	22.2分
店が回らない
	55秒
```

大型店・混雑で、スタッフを真ん中の5人のままにすると、ロボットを3台入れても「店が回らない」のままです。1つめの表（店が回る最少のスタッフ）では7人で回るので、2つの表は別の問いに答えています。

数字のカード3枚を足した版（コミット 2712f98）で、PC 幅の単独ページと、シリーズのページに埋め込んだスマホ幅の表示を確かめた出力です。最後の行は、案内の一行を押したときの外のページのスクロール位置（px）です。

```
pc errors []
ロボット2台の費用（月）
14.4万円
1台 月6万円＋保守・充電 × 2台
浮く人件費（月）
0円
店が回る最少のスタッフは3人のまま
差し引き（月）
−14.4万円
人数そのままなら、歩く距離 −30%・入店待ち 8.6分 → 4.1分
--- 大型店・混雑・買う・補助金
ロボット2台の費用（月）
6.6万円
初めに250万円（補助金250万円を引いた額）を5年で割り、保守・充電を足した額
浮く人件費（月）
14.1万円
店が回る最少のスタッフ 8人 → 7人（1人分）
差し引き（月）
7.6万円
初めに払う額は、およそ22か月で取り戻せる
series errors [] scroll 3614 -> 6552
```

### サイトの記録（/api/ev-stats）の取り出し

鍵は KIOXIA のファイルから変数に読み込み、画面には出していません。

```
$ K=$(tr -d ' \r\n\t' < p2m_stats_key.txt)
$ curl -sS -o ev.json -w "%{http_code} %{size_download}\n" -H "Authorization: Bearer $K" "https://pixelstomotors.com/api/ev-stats?format=json"
200 25585
```

週ごとの表示（byWeek）

```
2026-10-19 〜 10-25	566
2026-10-12 〜 10-18	22
```

どこから来たか（referrers・全量）

```
（直接・不明）	457
www.google.com	82
（サイト内）	39
search.yahoo.co.jp	3
app.raindrop.io	2
gemini.google.com	1
pixelstomotors.github.io	1
www.city.oga.akita.jp	1
websearch.excite.co.jp	1
com.linkedin.android	1
```

英語のページ（byPage のうち /en・english・末尾 -en のもの・全量）

```
/manga-archive-en	2
/english-4-koma/ep106	2
/english-4-koma/ep25	2
/english-4-koma/ep17	2
/english-4-koma/ep65	2
/english-4-koma/ep07	2
/english-4-koma/ep31	2
/english-4-koma/ep62	1
/english-4-koma/ep64	1
```


### ビルドと、変更前からの差分の行数

```
$ npm run build 2>&1 | tail -1
07:31:11 [build] Complete!
$ git diff c3ed19d --numstat -- public/sim/serving-robot.html
267	0	public/sim/serving-robot.html
```

### 公開後の確認

```
$ curl -sSL "https://pixelstomotors.com/sim/serving-robot?v=$(date +%s)" | grep -c 'class="merits"'
1
$ curl -sS "https://pixelstomotors.com/series8?v=$(date +%s)" | grep -c "費用と浮く人件費も比べられます"
1
```
