阿佐ヶ谷ダイニングキッチン 再来店率レポート

shop_id: 92 | 再来店率を中心とした顧客リテンション分析

データ期間: 2025-12 〜 2026-04 レポート作成日: 2026-05-01

累計顧客数

1,524人
モバイルオーダー利用者

再来店者数

320人
2日以上来店した顧客

全期間再来店率

21.0%
再来店者 / 累計顧客

アクティブ常連(Gold+Silver)

74人
直近30日に2回以上来店

月別 新規顧客の再来店率推移

各月に初回来店した顧客のうち、その後再来店した割合。初回来店月が新しいほど再来店の猶予期間が短いため、率が低くなる傾向があります。

初回来店月 新規顧客数 再来店者数 再来店率
2025-12 15 8
53.33%
2026-01 464 159
34.27%
2026-02 325 59
18.15%
2026-03 395 69
17.47%
2026-04 320 25
7.81%

分析ポイント

2026年1月の新規顧客(464名)は再来店率34.27%と高水準。サービス開始直後のコアユーザー獲得に成功しています。2月以降は再来店率が18%前後で安定傾向にあり、継続的なリピーター施策が効果を発揮する余地があります。

来店回数分布

来店回数顧客数割合
1回1,20479.0%
2回15710.3%
3回724.72%
4-5回392.56%
6-10回362.36%
11回以上161.05%

再来店間隔(初回→2回目)

間隔顧客数割合
1週間以内9128.44%
2週間以内4614.38%
1ヶ月以内9028.13%
2ヶ月以内7021.88%
2ヶ月超237.19%

常連ランク分布(基準日: 2026-04-30)

累計来店2回以上のリピーター顧客(320人)のみを対象とした来店頻度分析。初回来店のみで離脱した顧客(1,204人、初回離脱率79.0%)は除外。

ランク顧客数説明
Gold20直近14日に2回以上来店
Silver54直近30日に2回以上来店
Bronze100直近60日に2回以上来店
AtRisk46離脱予備軍(30-60日前に来店、直近なし)
Churned100休眠(60日以上来店なし)

初回離脱率

79.0%
1,204人 / 1,524人

リピーター数

320人
累計2回以上来店

アクティブ率

54.4%
Gold+Silver+Bronze / リピーター

施策提案

リピーター320人のうち、アクティブ(Gold+Silver+Bronze)は174人(54.4%)。AtRisk 46人への再来店促進(クーポン配布等)と、Churned 100人への掘り起こし施策が優先課題です。また、初回離脱率79.0%は高いため、初回来店時の体験向上や次回来店促進(ポイント付与等)が重要です。

月再来店ユーザ推移

前月来店者のうち当月も来店したユーザの月次推移。「再来店新規」は新たに定着した層、「再来店離脱」は定着層からの離脱を表します。

最新月 再来店ユーザ

109人
2026-04

最新月 再来店新規

+61人
新たに定着した層

最新月 再来店離脱

-37人
定着層からの離脱

純増減

+24人
新規 - 離脱

最新月 再来店率

21.2%
再来店ユーザ / 前月来店者

月別データテーブル

来店ユーザ 月再来店ユーザ 再来店率 再来店新規 再来店離脱 純増減
2025-12 15 - - - - -
2026-01 469 5 33.3% +5 -0 +5
2026-02 429 102 21.7% +98 -1 +97
2026-03 515 85 19.8% +33 -50 -17
2026-04 465 109 21.2% +61 -37 +24

月再来店分析

2026年4月は純増減+24人でリピーター基盤が拡大傾向。3月は-17人と離脱が新規を上回りましたが、4月は回復しています。再来店率は19.8〜21.7%で安定推移しており、前月来店者の約5人に1人が翌月も来店する定着パターンが確立されつつあります。

単価セグメント分布

メインメニュー当り単価(= 支払総額 / メイン注文数)に基づく顧客分類。閾値: Main平均 1,096円。この店舗ではside/toppingカテゴリがないため、シンプルな2セグメント分類を適用。

セグメント 顧客数 顧客比率 売上合計 売上貢献率 平均単価
Minnow 586 43.38% 1,132,800円 39.31% 991円
Whale 765 56.62% 1,749,230円 60.69% 1,357円

セグメント分析

Whale(高単価)顧客が56.62%を占め、売上の60.69%を貢献しています。定食+サブメニュー注文など、セット購入を促進する施策がWhale比率向上に効果的です。Minnow顧客へのアップセル(サイドメニュー推奨)も検討価値があります。

メインメニュー当り単価分布

顧客ごとの単価を100円刻みでヒストグラム化。最頻価格帯と分布の偏りを把握し、価格戦略の参考にします。

単価帯顧客数構成比
800〜899円100.74%
900〜999円35726.42%
1,000〜1,099円22016.28%
1,100〜1,199円23317.25%
1,200〜1,299円28421.02%
1,300〜1,399円705.18%
単価帯顧客数構成比
1,400〜1,499円413.03%
1,500〜1,599円322.37%
1,600〜1,699円191.41%
1,700〜1,799円141.04%
1,800〜1,899円161.18%
1,900円以上554.07%

価格分布分析

最頻価格帯は900〜999円(26.42%)で、定食単品注文が多いと推測されます。1,200〜1,299円帯も21.02%と多く、定食+サイド1品の組み合わせと思われます。1,300円以上の高単価帯への誘導(ドリンクセット推奨など)で客単価向上が見込めます。

初回注文メニュー別 再来店率(Top15)

初回来店時に注文したメインメニュー別の再来店率(n>=10のみ表示)。再来店率の高いメニューは「また来たい」と思わせる満足度が高い可能性があります。

メニュー名 初回注文者数 再来店者数 再来店率
レバ丼 14 7
50.00%
からあげ定食 211 67
31.75%
生姜丼 18 5
27.78%
レバニラ定食 89 24
26.97%
とんこつラーメン 白セット 56 15
26.79%
チキンコンボ定食 39 10
25.64%
生姜焼き定食 220 52
23.64%
ナポリタン 31 7
22.58%
オムライス 117 23
19.66%
とんこつラーメン 白 28 5
17.86%
味噌丼 18 3
16.67%
豚味噌焼き定食 105 17
16.19%
阿佐ヶ谷丼 165 25
15.15%
ダブルチキンカツ定食 41 6
14.63%
ねぎ塩唐揚げ定食 33 4
12.12%

メニュー分析

「レバ丼」が再来店率50%と突出して高く、「からあげ定食」は注文者数211名で再来店率31.75%と人気・リテンション共に優秀です。一方、看板メニューと思われる「阿佐ヶ谷丼」は注文者165名ながら再来店率15.15%と改善余地があります。

SQLクエリ

1. 基本サマリー(再来店率)

-- 阿佐ヶ谷ダイニングキッチン(shop_id=92)の再来店率サマリー WITH visit_dates AS ( SELECT DISTINCT user_id, DATE(TIMESTAMP(created_at), "Asia/Tokyo") AS visit_date FROM aledata.mobileorder.product_orders WHERE shop_id = 92 AND status = 5 AND deleted_at IS NULL ), user_visits AS ( SELECT user_id, COUNT(DISTINCT visit_date) AS visit_days FROM visit_dates GROUP BY user_id ) SELECT COUNT(*) AS total_customers, SUM(CASE WHEN visit_days >= 2 THEN 1 ELSE 0 END) AS revisitors, ROUND(SAFE_DIVIDE(SUM(CASE WHEN visit_days >= 2 THEN 1 ELSE 0 END), COUNT(*)) * 100, 2) AS retention_rate FROM user_visits

2. 月別再来店率推移

-- 月別 新規顧客の再来店率推移 WITH visit_dates AS ( SELECT DISTINCT user_id, DATE(TIMESTAMP(created_at), "Asia/Tokyo") AS visit_date FROM aledata.mobileorder.product_orders WHERE shop_id = 92 AND status = 5 AND deleted_at IS NULL ), first_visits AS ( SELECT user_id, MIN(visit_date) AS first_visit_date FROM visit_dates GROUP BY user_id ), user_visit_counts AS ( SELECT user_id, COUNT(DISTINCT visit_date) AS total_visit_days FROM visit_dates GROUP BY user_id ), combined AS ( SELECT FORMAT_DATE('%Y-%m', fv.first_visit_date) AS first_visit_month, fv.user_id, CASE WHEN uvc.total_visit_days >= 2 THEN 1 ELSE 0 END AS is_revisitor FROM first_visits fv JOIN user_visit_counts uvc ON fv.user_id = uvc.user_id ) SELECT first_visit_month, COUNT(*) AS new_customers, SUM(is_revisitor) AS revisitors, ROUND(SAFE_DIVIDE(SUM(is_revisitor), COUNT(*)) * 100, 2) AS retention_rate FROM combined GROUP BY first_visit_month ORDER BY first_visit_month

3. 常連ランク分布(リピーターのみ)

-- 常連ランク分類(リピーター: 累計2回以上のみ対象) WITH visit_dates AS ( SELECT DISTINCT user_id, DATE(TIMESTAMP(created_at), "Asia/Tokyo") AS visit_date FROM aledata.mobileorder.product_orders WHERE shop_id = 92 AND status = 5 AND deleted_at IS NULL ), user_visit_summary AS ( SELECT user_id, COUNT(DISTINCT visit_date) AS total_visits, COUNTIF(visit_date BETWEEN DATE_SUB(DATE '2026-04-30', INTERVAL 13 DAY) AND DATE '2026-04-30') AS visits_14d, COUNTIF(visit_date BETWEEN DATE_SUB(DATE '2026-04-30', INTERVAL 29 DAY) AND DATE '2026-04-30') AS visits_30d, COUNTIF(visit_date BETWEEN DATE_SUB(DATE '2026-04-30', INTERVAL 59 DAY) AND DATE '2026-04-30') AS visits_60d, COUNTIF(visit_date BETWEEN DATE_SUB(DATE '2026-04-30', INTERVAL 59 DAY) AND DATE_SUB(DATE '2026-04-30', INTERVAL 30 DAY)) AS visits_30_60d FROM visit_dates GROUP BY user_id ), -- リピーター(累計2回以上)のみを対象 repeaters AS ( SELECT * FROM user_visit_summary WHERE total_visits >= 2 ) SELECT CASE WHEN visits_14d >= 2 THEN 'Gold' WHEN visits_30d >= 2 THEN 'Silver' WHEN visits_60d >= 2 THEN 'Bronze' WHEN visits_30_60d >= 1 AND visits_30d = 0 THEN 'AtRisk' ELSE 'Churned' END AS loyalty_rank, COUNT(*) AS customer_count FROM repeaters GROUP BY loyalty_rank

4. 単価セグメント分布

-- 単価セグメント(Minnow/Whale)分布 WITH valid_details AS ( SELECT po.user_id, pod.price, p.report_category FROM aledata.mobileorder.product_order_details pod JOIN aledata.mobileorder.product_orders po ON pod.product_order_id = po.id JOIN aledata.mobileorder.products p ON pod.product_id = p.id WHERE po.shop_id = 92 AND po.status = 5 AND po.deleted_at IS NULL AND pod.status = 5 AND pod.deleted_at IS NULL ), price_avgs AS ( SELECT AVG(CASE WHEN report_category = 'main' THEN price END) AS main_avg FROM valid_details ), user_stats AS ( SELECT user_id, SUM(price) AS total_spent, COUNTIF(report_category = 'main') AS main_count FROM valid_details GROUP BY user_id HAVING main_count > 0 ), user_segments AS ( SELECT us.*, ROUND(us.total_spent / us.main_count, 0) AS unit_price, CASE WHEN us.total_spent / us.main_count < pa.main_avg THEN 'Minnow' ELSE 'Whale' END AS segment FROM user_stats us CROSS JOIN price_avgs pa ) SELECT segment, COUNT(*) AS customer_count, ROUND(SAFE_DIVIDE(COUNT(*), SUM(COUNT(*)) OVER()) * 100, 2) AS customer_ratio, SUM(total_spent) AS total_sales, ROUND(SAFE_DIVIDE(SUM(total_spent), SUM(SUM(total_spent)) OVER()) * 100, 2) AS sales_ratio, ROUND(AVG(unit_price), 0) AS avg_unit_price FROM user_segments GROUP BY segment

5. 月再来店ユーザ推移(R-19)

-- 月再来店ユーザ・新規・離脱の推移 WITH monthly_visitors AS ( SELECT DISTINCT po.shop_id, po.user_id, FORMAT_DATE('%Y-%m', DATE(TIMESTAMP(po.created_at), "Asia/Tokyo")) AS visit_month FROM aledata.mobileorder.product_orders po WHERE po.shop_id = 92 AND po.status = 5 AND po.deleted_at IS NULL ), -- 月別来店者数 monthly_totals AS ( SELECT visit_month AS month, COUNT(DISTINCT user_id) AS total_users FROM monthly_visitors GROUP BY visit_month ), -- 月再来店ユーザ: N-1月に来店 かつ N月に来店 returning_users AS ( SELECT cur.visit_month AS month, COUNT(DISTINCT cur.user_id) AS returning_users FROM monthly_visitors cur JOIN monthly_visitors prev ON cur.user_id = prev.user_id AND cur.shop_id = prev.shop_id AND prev.visit_month = FORMAT_DATE('%Y-%m', DATE_SUB(PARSE_DATE('%Y-%m', cur.visit_month), INTERVAL 1 MONTH)) GROUP BY cur.visit_month ), -- 月再来店新規: N-2月に来店なし, N-1月に来店, N月にも来店 new_returning AS ( SELECT cur.visit_month AS month, COUNT(DISTINCT cur.user_id) AS new_returning_users FROM monthly_visitors cur JOIN monthly_visitors prev ON cur.user_id = prev.user_id AND cur.shop_id = prev.shop_id AND prev.visit_month = FORMAT_DATE('%Y-%m', DATE_SUB(PARSE_DATE('%Y-%m', cur.visit_month), INTERVAL 1 MONTH)) LEFT JOIN monthly_visitors prev2 ON cur.user_id = prev2.user_id AND cur.shop_id = prev2.shop_id AND prev2.visit_month = FORMAT_DATE('%Y-%m', DATE_SUB(PARSE_DATE('%Y-%m', cur.visit_month), INTERVAL 2 MONTH)) WHERE prev2.user_id IS NULL GROUP BY cur.visit_month ), -- 月再来店離脱: N-2月に来店, N-1月に来店, N月に来店なし churned AS ( SELECT FORMAT_DATE('%Y-%m', DATE_ADD(PARSE_DATE('%Y-%m', prev.visit_month), INTERVAL 1 MONTH)) AS month, COUNT(DISTINCT prev.user_id) AS churned_users FROM monthly_visitors prev JOIN monthly_visitors prev2 ON prev.user_id = prev2.user_id AND prev.shop_id = prev2.shop_id AND prev2.visit_month = FORMAT_DATE('%Y-%m', DATE_SUB(PARSE_DATE('%Y-%m', prev.visit_month), INTERVAL 1 MONTH)) LEFT JOIN monthly_visitors cur ON prev.user_id = cur.user_id AND prev.shop_id = cur.shop_id AND cur.visit_month = FORMAT_DATE('%Y-%m', DATE_ADD(PARSE_DATE('%Y-%m', prev.visit_month), INTERVAL 1 MONTH)) WHERE cur.user_id IS NULL GROUP BY prev.visit_month ) SELECT t.month, t.total_users AS total, COALESCE(r.returning_users, 0) AS returning, COALESCE(n.new_returning_users, 0) AS new_ret, COALESCE(c.churned_users, 0) AS churned FROM monthly_totals t LEFT JOIN returning_users r ON t.month = r.month LEFT JOIN new_returning n ON t.month = n.month LEFT JOIN churned c ON t.month = c.month ORDER BY t.month

6. メインメニュー当り単価分布

-- 単価分布(100円刻みヒストグラム) WITH valid_details AS ( SELECT po.user_id, pod.price, p.report_category FROM aledata.mobileorder.product_order_details pod JOIN aledata.mobileorder.product_orders po ON pod.product_order_id = po.id JOIN aledata.mobileorder.products p ON pod.product_id = p.id WHERE po.shop_id = 92 AND po.status = 5 AND po.deleted_at IS NULL AND pod.status = 5 AND pod.deleted_at IS NULL ), user_stats AS ( SELECT user_id, SUM(price) AS total_spent, COUNTIF(report_category = 'main') AS main_count FROM valid_details GROUP BY user_id HAVING main_count > 0 ), user_unit_prices AS ( SELECT user_id, ROUND(total_spent / main_count, 0) AS unit_price FROM user_stats ), bucketed AS ( SELECT CAST(FLOOR(unit_price / 100) * 100 AS INT64) AS bucket_start FROM user_unit_prices ) SELECT CONCAT(CAST(bucket_start AS STRING), '~', CAST(bucket_start + 99 AS STRING), '円') AS price_range, COUNT(*) AS customer_count, ROUND(SAFE_DIVIDE(COUNT(*), SUM(COUNT(*)) OVER()) * 100, 2) AS ratio FROM bucketed GROUP BY bucket_start ORDER BY bucket_start

SQL説明(このレポートが調べていること)

定義

  • 来店回数: 来店した日数(同一日の複数注文は1来店としてカウント)
  • 再来店: 2日目以降の来店(同一日内の2回目注文は再来店ではない)
  • 再来店率: 2回以上来店した顧客数 / 総顧客数 x 100

常連ランク定義(リピーターのみ対象)

  • 対象: 累計来店日数2回以上のリピーター顧客のみ
  • Gold: 直近14日間に2回以上来店
  • Silver: 直近30日間に2回以上来店(Gold除く)
  • Bronze: 直近60日間に2回以上来店(Gold・Silver除く)
  • AtRisk(離脱予備軍): 30-60日前に来店あり、直近30日に来店なし
  • Churned(休眠): 直近60日間に来店なし
  • 初回離脱率: 累計1回のみの顧客数 / 全顧客数(リピーター化の効果測定用)

月再来店ユーザ定義(R-19)

  • 月再来店ユーザ: N-1月に来店し、N月にも来店したユーザ
  • 月再来店新規: N-2月に来店なし、N-1月に来店、N月にも来店(新たに定着)
  • 月再来店離脱: N-2月とN-1月に連続来店したが、N月に来店なし(定着層からの離脱)
  • 純増減: 再来店新規 - 再来店離脱(プラスならリピーター基盤拡大)
  • 再来店率: 月再来店ユーザ / 前月来店者数

単価セグメント定義

  • メインメニュー当り単価: 顧客の決済総額 / メインメニュー注文数
  • Minnow: 単価 < Main平均(1,096円)
  • Whale: 単価 ≥ Main平均(1,096円)
  • ※この店舗ではside/toppingカテゴリがないため、Dolphinセグメントは適用外

分析の目的

顧客のリテンション状況を多角的に把握し、再来店施策の立案に活用します。月別推移でトレンドを、来店回数分布でロイヤリティ構造を、メニュー別再来店率で商品力を、単価セグメントでアップセル余地を評価します。