すぐ行きます」の「すぐ」は何分なのか——曖昧な日本語の感覚を、みんなの分布と比べるサイトを作った
「すぐ行きます」の「すぐ」は、何分ですか
「すぐ行く」と言った人が30分動かない。「たまに行くよ」と言った人の"たまに"が年2回だった。「朝イチでやります」が11時だった。
こういうすれ違いは、たいてい怠慢のせいではなく、同じ単語に入っている数値が人によって違うだけです。でも、その数値はふだん誰も口に出さないので、ズレていること自体に気づけません。
そこで、曖昧な日本語の「自分の中の数値」をスライダー1回で答えて、全回答者の分布のどこに自分がいるかを見られるサイトを作りました。
あいまい線 → https://aimaisen.com
登録なし・無料・スライダーを動かして1回タップで終わります。いまのところ5語です。
- 「すぐ」って、何分?(30秒〜1時間)
- 「朝イチ」って、何時?(朝5時〜昼12時)
- 「たまに」って、月に何回?(4ヶ月に1回〜月20回)
- 「ちょっと待って」って、何分?(10秒〜1時間)
- 「夜ふかし」って、何時から?(夜9時〜深夜3時)
私の「すぐ」は5分で、判定は「ど真ん中のふつう感覚」でした。
結果画面の「リンクをコピー」で出るURLを誰かに送ると、相手が答えた瞬間にふたりの値が並んで「その差、◯分」まで出ます。喧嘩の原因がこれだったと分かるやつです。
着想
色覚で同じことをやっている ismy.blue(「あなたの"青"はどこから?」を全回答者の境界分布と比べるサイト)が面白かったのが出発点です。あれは色でしたが、同じ構造は言葉でも成立するはずだ、と思って作りました。日本語の曖昧語は「すぐ」「ちょっと」「そのうち」と在庫がたくさんあるので、素材として都合が良い。
設計でいちばん悩んだところ: 回答0件のとき何を見せるか
「みんなの分布と比べる」サービスの最大の弱点は、公開直後は"みんな"がいないことです。1人目に「あなたは1人中1位です」を見せた時点でサービスが死にます。
やったこと:
- 語ごとにシード分布(仮の分布)を置いた。正規分布のパラメータを語ごとに手で推定して(例: 「すぐ」の中央値≈5〜10分)、初期の仮想件数として持たせています。
- 実回答が増えるほどシードの影響が自動で薄まる(実データがシードを押しのけていく)設計にしました。
- 実回答が0件の状態では件数表示を「集計反映中」に切り替え、「みんなの回答 0件」を見せないようにしています。
正直に書くと、今この瞬間の分布にはまだシードが混ざっています。回答が積み上がるにつれて「本物の日本人の"すぐ"」に寄っていく、途中の状態です。ここを隠してドヤ顔で「全国調査」と言うのは嫌だったので、記事に書いておきます。
【記事公開時点の回答総数:『すぐ』34件・5語合計95件】
対数軸: 30秒と1時間を1本のスライダーに乗せる
「すぐ」の答えは30秒の人もいれば1時間の人もいます。これを線形スライダーに乗せると、30秒〜5分(=いちばん人が密集する帯)がスライダーの左端5%に潰れて選べません。
なので値域は対数軸で扱い、ヒストグラムのバケットも正規化空間で等間隔48個に切っています(結果として自然に対数ビニングになる)。「朝イチ」「夜ふかし」のような時刻の語は線形のまま。語の定義ファイル1つに scale: "log" | "linear" を持たせて、質問画面・分布・シェア画像・文言すべてがそこから生成されます。語を1つ追加するときに触るのは、この定義配列だけです。
保存しているデータ: 匿名のバケットカウンタだけ
- サインアップなし。メールもCookieでの個人識別もしない
- 保存しているのは**「48個のバケットのどこが何回選ばれたか」というカウンタだけ**。誰がどう答えたかの行は作らない(作らない設計なので、後から個人単位で復元できません)
- 任意の「年代」タップも同じく匿名の集計にのみ加算
- アクセス解析にGA4を使っているので、その分はプライバシーポリシーに明記(https://aimaisen.com/privacy )
「あなたの回答を分析します」系のサービスに個人情報を渡したくない気持ちはよく分かるので、そもそも渡す先が無い構造にしました。
拡散したときにインフラ費が爆発しない設計
個人開発でいちばん怖いのは、当たったときに請求書が来ることです。無料・登録なしのトイなので、バイラル時のコストが暴走しないことを最初から仕様に入れました。
- 回答の書き込みは、件数が閾値を超えたらサンプリングして1/10だけ書き、表示時に10倍換算する(分布の形は保たれる)
- 分布の読み出しはキャッシュ(300秒)。同時アクセスがそのままDBアクセスにならない
- 無料枠を超過するなど異常時は、静的な分布にデグレードして表示を止めない
- シェアカード(動的OG画像)は CDN キャッシュを長めに効かせて、同じURLの再生成を防ぐ
技術スタック
| フレームワーク | Next.js(App Router)+ TypeScript |
| UI | Tailwind CSS |
| 分布ストレージ | Upstash Redis(東京リージョン・バケットカウンタのみ) |
| シェアカード | @vercel/og(satori)による動的OG画像 |
| ホスティング | Vercel(実行リージョンも東京に固定。Redisが東京なので、書き込みごとに太平洋を往復させない) |
| テスト | Vitest 53件(集計・パーセンタイル・サンプリング・デグレード) |
| 外部API | なし(LLM呼び出しゼロ・出力は決定論) |
判定文(「せっかち上位◯%」等)もすべて実測分布からの計算で、生成AIは一切通していません。曖昧語を扱うサービスなので「AIがなんとなく判定」に見えたら価値がゼロになる、と考えたためです。
なお実装はClaude Code のエージェントに委任して進めました(レビュー役のエージェントを別に立てて、リリース可否を判定させる形)。その進め方の詳細はいずれ別記事にします。
これから
- 語を増やす(「そのうち」「ちょっと」「なるはや」「けっこう」あたりは在庫として面白い)
- 年代別・地域別の差の可視化(回答が集まってから)
- 英語版("soon" は日本語の「すぐ」より長い、という仮説を検証したい)
あなたの「すぐ」は何分ですか
30秒で終わります。結果が意外だったら、家族や同僚に投げてみてください。だいたい揉めます。
関連記事
- AI駆動開発で踏んだ地雷集 — 3プロダクト開発で繰り返した7つの失敗
- 3つのWebサービス開発で学んだ「失敗しないロードマップ」の作り方
- 個人開発のCLAUDE.md設計パターン — AIに「指示書」を書く技術
あいまい線の続報(語の追加・分布が固まったときの実データ・英語版)もここに書きます。 X: @jir0_dev