記事一覧に戻る
Tips

エンジニアが新婦のために結婚式にITで全力で貢献しようとした話【連載第13回】2,628件のトランザクションが語る結婚式の物語

52人のゲスト、379枚の写真、156通のメッセージ、2,628件のトランザクション。結婚式カジノの全データをSQLで分析し、設計の正解と反省をデータで証明する。

最終更新:

【第1回】から読む

2,628件のトランザクションが語る結婚式の物語

3ヶ月間のシステム開発。本番2時間半。その間にデータベースに記録されたトランザクションは2,628件

1件1件が、ゲストの行動の記録です。写真を撮った。メッセージを送った。バーでドリンクを受け取った。大予想でチップを乗せた。知らない人にチップを贈った。

数字は嘘をつかない。 設計の正解も、反省も、全てデータの中にある。


🎯 この記事で得られること

  • ✅ 52人のゲストが2時間半で生み出した全データの完全分析
  • ✅ チップ経済の分布と格差──設計は公平だったのか
  • ✅ 大予想のオッズ分布──10.66倍の大穴が的中した試合の全記録
  • ✅ 「データが証明した設計の正解」と「データが突きつけた反省」

📊 全体サマリー

指標
参加者数52人
総トランザクション数2,628件
写真アップロード数379枚(ブロック1枚)
祝福メッセージ数156通
大予想参加者37人(参加率71%)
チップ送金件数31件
バー来店数37回(18人が利用)
スタンプラリー達成者15人

52人のゲストが2時間半で2,628件のトランザクションを生んだ。 1人あたり平均50件以上。30秒に1回、誰かが何かのアクションを起こしていた計算です。


💰 チップ経済の全貌

チップはどこから生まれ、どこに消えたか

┌─ チップ発生源 ──────────────────────────────────┐
│  写真報酬(タグ付け含む)  481,500  ████████████ │
│  いいね報酬(送信者)        97,400  ████        │
│  祝福メッセージ報酬         78,000  ███         │
│  写真アップロード報酬        72,000  ██          │
│  いいね報酬(いいねした人)   51,600  ██          │
│  スタンプラリー報酬          35,000  █           │
│  返信報酬                   29,500  █           │
│  バー報酬                   18,500  █           │
└──────────────────────────────────────────────────┘

┌─ チップ消費先 ──────────────────────────────────┐
│  大予想ベット(返金除く)   409,750  ████████    │
│  チップ送金                 25,502  █           │
└──────────────────────────────────────────────────┘

最大のチップ供給源は「写真報酬」で481,500チップ。 全チップ発行量の過半数を占めます。写真を撮るだけでチップがもらえる設計が、経済のエンジンとして機能しました。

一方、チップの最大消費先は「大予想」。599,300チップがベットされ、うち189,550チップがキャンセルで返金、357,215チップが的中者に配当。純消費は約5万チップで、経済全体のバランスを崩すほどではありませんでした。

最終チップ分布

範囲人数割合
0〜4991人2%
1,000〜1,9997人13%
2,000〜4,9999人17%
5,000〜9,99912人23%
10,000〜49,99919人37%
50,000以上4人8%
統計量
最小0 chips
最大117,651 chips
平均17,038 chips
中央値9,250 chips

中央値と平均値の乖離が目立ちます。平均17,038に対して中央値9,250。上位数名が平均を大きく引き上げていることがわかります。

ただし、最小でも0チップ(1人のみ)。初期チップ1,000から全てを失ったのはたった1人。大多数のゲストは初期チップ以上を最終的に保持しており、「ゲームに参加したら損をする」という状態にはなっていないことがデータで確認できます。


🏆 個人ランキング TOP 10

順位名前最終チップチーム
👑 1位ゲストA117,651GREEN
🥈 2位ゲストB86,973BLUE
🥉 3位ゲストC61,825BLUE
4位ゲストD50,482RED
5位ゲストE46,150RED
6位ゲストF43,717YELLOW
7位ゲストG43,225YELLOW
8位ゲストH36,500BLUE
9位ゲストI29,125BLUE
10位ゲストJ26,350YELLOW

KING OF CASINOは117,651チップ。2位との差は30,678チップ。 圧倒的な首位です。

注目すべきはチームの分布。TOP 10に4チーム全てが入っており、特定チームの独占ではない。これはチーム分けのバランシング(少ない方のチームに自動割り当て)が機能した証拠です。


🔮 大予想(みんなで大予想)全記録

全試合結果

試合名プール結果最終オッズステータス
今日の天気は?37,899晴れ1.50xfinished
プロポーズ再現度(1回目)190,550cancelled(全額返金)
プロポーズ再現度(2回目)389,25025%10.66xfinished

プロポーズ再現度:2回やった理由

1回目はキャンセルされています。190,550チップが動いていたのに、なぜキャンセルしたのか。

実は1回目は、新郎のプロポーズ再現中に会場が盛り上がりすぎて判定がうやむやになってしまった。新婦の判定が曖昧だったため、公平性を期してやり直しを決断。190,550チップを全額返金し、2回目を実施しました。

第8回で実装した cancel_coliseum_match RPC(全額返金機能)が、まさにこの場面で活躍。「もしもの保険」は使う日が来る。

2回目:10.66倍の大穴が的中

2回目の「プロポーズ再現度」は、本イベント最大の試合になりました。

プール総額389,250チップ。 52人中46人がベットした脅威の参加率。

選択肢人数ベット額構成比
100% 完全再現12人147,75038%
75%9人105,54927%
50%7人39,65010%
25%(的中)11人133,85034%
0% 真っ赤なウソ7人143,60137%

結果:25%(再現度25%)。オッズ10.66倍。

「25%」を選んだ11人は、ベット額の10.66倍を獲得。1,000チップを乗せていた人は10,660チップに。

「0% 真っ赤なウソ」に143,601チップを乗せていた7人は全額を失った。ここでKING OF CASINOの座が大きく動いたはずです。

「今日の天気は?」の1人

「今日の天気は?」の結果も面白い。晴れに30人が28,800チップを乗せる中、雨に100チップを乗せた勇者が1人。結果は晴れ。最低オッズ1.5倍が適用されました。

この1人が誰なのかはデータからわかりますが、本人の名誉のためにここでは伏せます。


📷 写真データ:379枚の記録

数字の意味

指標
総アップロード数379枚
有効写真378枚
ブロック(AI検出)1枚
参加者1人あたり約7.3枚

379枚は、2時間半で割ると1分あたり2.5枚。 常に誰かがシャッターを切っている状態です。

ブロックされた写真はわずか1枚。AWS Rekognition DetectModerationLabelsによる不正画像検出が過剰にならなかった証拠です。第10回で「削除ではなくブロックフラグ」の設計判断をした意味がここで裏付けられます。

写真報酬の内訳

写真関連のトランザクションを分解すると:

報酬種別件数合計
photo_reward(タグ付け報酬)963件481,500
photo_upload(アップロード報酬)144件72,000

タグ付け報酬が963件。 144枚のアップロードに対して963件のタグ付けが発生しているということは、1枚あたり平均6.7人がタグ付けされている。顔認識システムが機能し、「自分が写っている写真」を検出してチップを配布する仕組みが大量のトランザクションを生みました。


💌 156通のメッセージ

カテゴリ別分布

カテゴリ件数割合
💐 お祝い69通44%
❓ 質問48通31%
💡 アドバイス39通25%

3カテゴリがほぼ均等に使われた。 「お祝い」が最多なのは当然として、「質問」が31%を占めたのは設計として嬉しい結果です。

第9回で「『おめでとう』以外に何を書けばいいかわからない人のために質問カテゴリを用意した」と書きましたが、実際に全体の3割がこのカテゴリを利用。カテゴリによる行動誘導が機能したことをデータが証明しています。

いいね・返信の連鎖

アクション件数報酬合計
いいね(いいねした人への報酬)516件51,600
いいね(送信者への報酬)487件97,400
返信報酬59件29,500

いいねが516件。 156通のメッセージに対して516回のいいねが付いている。1通あたり平均3.3回のいいね。メッセージが「送りっぱなし」ではなく、双方向のコミュニケーションとして機能していたことがわかります。


🎫 スタンプラリーと交流の証跡

スタンプラリーの達成状況

指標
スタンプ報酬トランザクション70件
ユニーク達成者15人(52人中29%)
報酬合計35,000 chips

P2P送金(対戦・交流)

指標
送金件数31件
ユニーク送金者13人
ユニーク受取者15人
送金ボリューム25,502 chips

チップ送金を行ったのは13人。 52人中25%。正直、もっと多くのゲストにP2P送金を使ってほしかった。ここは改善点として後述します。


🏅 チーム対抗戦の結果

チーム人数平均チップ合計チップ
🟡 YELLOW10人20,806208,058
🟢 GREEN10人20,750207,501
🔴 RED10人14,718147,182
🔵 BLUE22人14,692323,224

YELLOWとGREENがほぼ同率首位。 差はわずか56チップ(0.3%)。

注目すべきはBLUEの人数。22人と他チームの2倍以上。チーム自動割り当て(少ない方のチームに配置)が設計通りに機能しなかったケースがあったことを示唆しています。にもかかわらず、合計チップでは最多(323,224)──人数の力は偉大です。


🍺 バーの分析

指標
総来店数37回
ユニーク利用者18人(52人中35%)
1人あたり平均2.1回

バーを利用したのは18人(35%)。 残りの65%はバーを利用していない。バーNFCの設置場所が目立たなかったか、ルール説明が不十分だったか──いずれにせよ、チップ獲得手段として十分に認知されていなかった可能性があります。


📊 所属別の格差

所属人数平均チップ
グループA9人33,307
グループB2人22,500
グループC6人19,912
グループD7人16,321
グループE3人13,422
グループF7人12,921
グループG6人12,320
親族9人3,778

親族グループの平均チップが3,778と突出して低い。 他のグループと3〜9倍の差があります。

これは年齢層の違いが大きい。親族にはスマホ操作に不慣れな世代が含まれており、写真アップロードやメッセージ送信の操作が難しかったと推測されます。

ここが最大の反省点です。 全員が楽しめるシステムを目指していたのに、デジタルデバイドを考慮しきれていなかった。親族向けには、より簡単な参加方法(例:受付係が代理で写真をアップロードする仕組み)を用意すべきでした。


🎓 データが証明した設計の正解

1. 写真報酬がチップ経済のエンジンになった

チップ発行量の過半数が写真関連。「写真を撮る → チップがもらえる → ランキングが上がる」のループが自己強化的に回った。

2. カテゴリ制メッセージが行動を分散させた

お祝い44%、質問31%、アドバイス25%。ほぼ均等な分布は、カテゴリ設計が「おめでとう」一辺倒を防いだことを示しています。

3. 大予想のキャンセル機能が本番で活躍した

「もしも」のために実装した cancel_coliseum_match。190,550チップの全額返金を、本番で実際に使いました。保険は使う日が来る。

4. 最低オッズ保証が体験を守った

「今日の天気」のような一方的な試合でも、1.5倍保証で的中者にリターンが出る。数学的な正確さより体験を優先した設計判断が正しかったことをデータが裏付けます。

🔧 データが突きつけた反省

1. P2P送金の利用率が低い(25%)

チップ送金は13人しか使っていない。NFCチップをタッチして送金する体験は面白いが、そもそも「対戦する」文化が2時間半では浸透しきらなかった

2. バー利用率の低さ(35%)

バーNFCの存在を知らないゲストが多かった可能性。設置場所の視認性か、ルール説明の網羅性に課題があった。

3. 親族のデジタルデバイド

平均チップ3,778は、システムを十分に使えていないことを意味する。年齢層を問わず楽しめる設計には至らなかった。

4. BLUEチームの人数偏り(22人 vs 10人)

チーム自動割り当てが想定通りに機能しなかったケースがある。途中参加や再登録による偏りの可能性。


イベントシステムのデータ分析SQL

ゲームタイプ別トランザクション集計

SELECT game_type,
  COUNT(*) as count,
  SUM(amount) as total_amount,
  AVG(amount)::int as avg_amount
FROM transactions
GROUP BY game_type
ORDER BY count DESC;

チップ分布のヒストグラム

SELECT
  CASE
    WHEN current_chips < 500 THEN '0-499'
    WHEN current_chips < 2000 THEN '1,000-1,999'
    WHEN current_chips < 5000 THEN '2,000-4,999'
    WHEN current_chips < 10000 THEN '5,000-9,999'
    WHEN current_chips < 50000 THEN '10,000-49,999'
    ELSE '50,000+'
  END as range,
  COUNT(*) as count
FROM profiles
WHERE team_color IS NOT NULL
GROUP BY 1 ORDER BY MIN(current_chips);

大予想のオッズ分布分析

SELECT m.title, b.option_id,
  COUNT(*) as bettors,
  SUM(b.amount) as total_bet,
  ROUND(SUM(b.amount) * 100.0 / m.total_pool, 1) as pct
FROM coliseum_bets b
JOIN coliseum_matches m ON b.match_id = m.id
WHERE m.status = 'finished'
GROUP BY m.title, b.option_id, m.total_pool
ORDER BY m.title, b.option_id;

チーム別平均チップ

SELECT team_color,
  COUNT(*) as members,
  AVG(current_chips)::int as avg_chips,
  SUM(current_chips) as total_chips
FROM profiles
WHERE team_color IS NOT NULL
GROUP BY team_color
ORDER BY avg_chips DESC;

所属別格差分析

SELECT affiliation,
  COUNT(*) as members,
  AVG(current_chips)::int as avg_chips
FROM profiles
WHERE team_color IS NOT NULL
GROUP BY affiliation
ORDER BY avg_chips DESC;

🙏 おわりに:数字の向こうにある体験

2,628件のトランザクション。1件ずつ見れば、ただのINSERT文です。

でもその1件1件が、誰かが写真を撮った瞬間であり、誰かがメッセージを書いた瞬間であり、誰かが大予想の結果に歓声を上げた瞬間です。

データ分析で見えるのは「何が起きたか」。でも本当に大切なのは「なぜ起きたか」──52人のゲストがスマホを手に取り、写真を撮り、メッセージを書き、チップを乗せた動機です。

その動機を設計したのがこの連載の11回分。そしてその結果が、この2,628行のデータ。

数字は嘘をつかない。でも、数字の向こうには、数字では測れない体験がある。


🔜 次回予告

データで振り返った結婚式カジノ。最終回では、もう一度やるなら何を変えるかを率直に語ります。

技術選定の振り返り、設計判断の反省、そして同じことをやりたいエンジニアへのアドバイス。

次回(最終回):「やり直すなら何を変えるか」


この記事が面白いと思ったら、ぜひシェアをお願いします!

あなたのシェアが、同じような「面白いことやりたいエンジニア」に届くかもしれません。

AD — Secure Auto Lab
技術でビジネスを加速する

開発パートナーをお探しですか?

AI統合・業務自動化・セキュアなシステム構築。情報処理安全確保支援士 × プロジェクトマネージャのフルスタック開発。企画からリリースまで一貫対応。

AI統合 業務自動化 セキュリティ PM
情報処理安全確保支援士 (RISS) プロジェクトマネージャ (PM)

この記事をシェア

著者を支援

tinou

情報処理安全確保支援士とPMの資格を使ってITコンサルタントとして働く傍ら、自宅で自動化とセキュリティを研究しているエンジニア