STEP 50:実践プロジェクト1 – 売上減少要因の分析

🎯 STEP 50: 実践プロジェクト1 – 売上減少要因の分析

前年比10%減少した売上の原因を特定し、改善策を提案しよう

📋 このプロジェクトで取り組むこと

  • 売上要素分解(客数×客単価×購買頻度)
  • セグメント別の詳細分析
  • 原因の特定と仮説検証
  • データに基づく改善アクションプラン
  • 経営層へのプレゼンテーション資料作成

難易度: 実践レベル(これまで学んだスキルを総動員)

📊 1. プロジェクトの概要

あなたに与えられたミッション

💼 シチュエーション設定

あなたは中堅ECサイト「SmartMart」のデータ分析チームに所属しています。
ある日、CEOから緊急のタスクが下りてきました。

📢 CEOからの指示:

「今期の売上が前年比10%減少している。
1週間以内に原因を特定し、具体的な改善策を提案してほしい。
来週の経営会議でプレゼンテーションをお願いします。」

このプロジェクトでは、これまで学んだすべてのスキルを総動員して、
「原因特定 → 改善策立案 → プレゼン資料作成」までを一気通貫で行います。

分析の全体像を把握しよう

💡 プロジェクトの流れ(7つのステップ)
STEP 1: 売上を要素に分解する(客数×客単価×頻度)
→ どの要素が減っているかを特定

STEP 2: 顧客セグメント別に分析
→ 新規顧客と既存顧客、どちらが問題か

STEP 3: 新規顧客減少の原因を深掘り
→ Web解析データで原因を特定

STEP 4: 既存顧客の状況を確認
→ RFM分析で顧客の質を評価

STEP 5: 商品カテゴリ別に分析
→ 特定カテゴリの問題かを確認

STEP 6: 競合状況を確認
→ 市場全体の動きと比較

STEP 7: 統計的に因果関係を検証
→ データで「なぜ」を証明
📌 分析の基本姿勢

仮説思考: 「たぶん〜が原因だろう」と仮説を立てる → データで検証
要素分解: 複雑な問題を小さな要素に分ける → 問題箇所を特定
比較分析: 前年と今年、新規と既存など、比較して差分を見る

闇雲にデータを眺めるのではなく、
「仮説 → 検証 → 次の仮説」のサイクルで効率的に分析を進めます。

📈 2. STEP 1: 売上要素の分解

売上の公式を理解する

📌 売上を構成する3つの要素
売上を分析するとき、まず以下の公式に分解します。

売上 = 客数 × 客単価 × 購買頻度

なぜ分解するのか?
「売上が10%下がった」だけでは、何が原因か分かりません。
しかし、要素に分解すると…

・客数が減ったのか?(お客さんが来なくなった)
・客単価が下がったのか?(買う金額が減った)
・購買頻度が減ったのか?(買う回数が減った)

どこに問題があるか、一目で分かるようになります。

Pythonで売上要素を分析するコード

まず、必要なライブラリを読み込みます。

# 必要なライブラリを読み込む
import pandas as pd      # データを表形式で扱うためのライブラリ
import numpy as np       # 数値計算を行うためのライブラリ

# pandas: Excelのような表形式でデータを操作できる
# numpy: 平均、合計、相関係数などの計算に使用

次に、前年と今年の売上要素をデータフレーム(表)にまとめます。

# 売上要素のデータを作成
# pd.DataFrame(): 表形式のデータを作成する関数
sales_breakdown = pd.DataFrame({
    '指標': ['総売上', '客数', '客単価', '年間購買頻度'],
    '前年': [1000, 10000, 10000, 10.0],    # 前年の数値
    '今年': [900, 9000, 10000, 10.0],      # 今年の数値
    '単位': ['百万円', '人', '円', '回/年']
})

# 変化額を計算(今年 - 前年)
sales_breakdown['変化額'] = sales_breakdown['今年'] - sales_breakdown['前年']

# 変化率を計算((今年 - 前年) / 前年 × 100)
sales_breakdown['変化率%'] = (
    (sales_breakdown['今年'] - sales_breakdown['前年']) 
    / sales_breakdown['前年'] * 100
).round(1)  # round(1): 小数点第1位で四捨五入

作成したデータを確認します。

# 結果を表示
print("=" * 60)
print("【STEP 1: 売上要素の分解】")
print("=" * 60)
print()
print(sales_breakdown.to_string(index=False))
# to_string(index=False): 行番号なしで表を文字列として出力

実行結果の解釈

📊 分析結果
指標 前年 今年 変化率
総売上 1,000百万円 900百万円 -10.0%
客数 10,000人 9,000人 -10.0%
客単価 10,000円 10,000円 0.0%
購買頻度 10回/年 10回/年 0.0%
✅ STEP 1の結論
発見したこと:
・売上が10%減少
客数が10%減少 ← これが主要因!
・客単価は変化なし
・購買頻度も変化なし

次のアクション:
客数の減少をさらに深掘りする
→ 新規顧客が減ったのか?既存顧客が離れたのか?

📈 3. STEP 2: 顧客セグメント別分析

新規顧客と既存顧客に分けて分析

📌 なぜセグメント別に分析するのか?
「客数が1,000人減った」と言っても…

パターンA: 新規顧客が1,000人減った
→ 新規獲得施策に問題あり(広告、集客など)

パターンB: 既存顧客が1,000人離れた
→ 顧客維持に問題あり(サービス品質、競合など)

原因によって打つべき対策がまったく違います。
だから「誰が」減ったのかを特定する必要があります。

セグメント別データの作成と分析

# 新規顧客と既存顧客のデータを作成
customer_segments = pd.DataFrame({
    'セグメント': ['新規顧客', '既存顧客', '合計'],
    '前年_客数': [3000, 7000, 10000],      # 前年の客数
    '今年_客数': [2100, 6900, 9000],       # 今年の客数
    '前年_売上': [150, 850, 1000],         # 前年の売上(百万円)
    '今年_売上': [105, 795, 900]           # 今年の売上(百万円)
})

# 客数の変化率を計算
customer_segments['客数変化率%'] = (
    (customer_segments['今年_客数'] - customer_segments['前年_客数']) 
    / customer_segments['前年_客数'] * 100
).round(1)

# 売上の変化率を計算
customer_segments['売上変化率%'] = (
    (customer_segments['今年_売上'] - customer_segments['前年_売上']) 
    / customer_segments['前年_売上'] * 100
).round(1)

# 結果を表示
print("=" * 60)
print("【STEP 2: 顧客セグメント別分析】")
print("=" * 60)
print()
print(customer_segments.to_string(index=False))

売上減少の内訳を計算

# 売上減少の内訳を計算
total_decline = -100  # 総売上減少額(百万円)

# 新規顧客による売上減少
new_customer_impact = 105 - 150  # 今年 - 前年 = -45百万円

# 既存顧客による売上減少
existing_customer_impact = 795 - 850  # 今年 - 前年 = -55百万円

# 寄与度(全体に占める割合)を計算
print()
print("【売上減少の内訳】")
print(f"  新規顧客の減少: {new_customer_impact}百万円")
print(f"    → 全体の {new_customer_impact/total_decline*100:.0f}% を占める")
print()
print(f"  既存顧客の減少: {existing_customer_impact}百万円")
print(f"    → 全体の {existing_customer_impact/total_decline*100:.0f}% を占める")

実行結果の解釈

📊 分析結果
セグメント 客数変化 売上変化 寄与度
新規顧客 -30% -45百万円 45%
既存顧客 -1.4% -55百万円 55%
✅ STEP 2の結論
重要な発見:
新規顧客が30%減少(最大の問題!)
・既存顧客は1.4%の微減(比較的安定)

示唆:
新規顧客獲得に大きな問題が発生している。
既存顧客も微減しているが、影響は新規ほど深刻ではない。

次のアクション:
新規顧客が30%も減った原因を特定する
→ 広告?ウェブサイト?競合?

📈 4. STEP 3: 新規顧客減少の原因分析

仮説を立てる

📌 新規顧客が減った原因として考えられること
いきなりデータを見るのではなく、まず仮説を立てます。

仮説1: マーケティング予算(広告費)を削減した?
仮説2: 競合が攻勢をかけている?
仮説3: ウェブサイトに問題がある?
仮説4: 商品ラインナップに問題がある?

これらの仮説をデータで検証していきます。

Web解析データで検証

# Web解析データを作成
# 新規顧客獲得に関連する指標を比較

web_analytics = pd.DataFrame({
    '指標': [
        'サイト訪問者数',
        'コンバージョン率(CVR)',
        '新規顧客数',
        '広告費',
        '顧客獲得コスト(CPA)'
    ],
    '前年': [300000, 1.0, 3000, 60, 20000],
    '今年': [210000, 1.0, 2100, 42, 20000],
    '単位': ['人', '%', '人', '百万円', '円']
})

# 変化率を計算
web_analytics['変化率%'] = (
    (web_analytics['今年'] - web_analytics['前年']) 
    / web_analytics['前年'] * 100
).round(1)

# 結果を表示
print("=" * 60)
print("【STEP 3: Web解析データによる原因分析】")
print("=" * 60)
print()
print(web_analytics.to_string(index=False))

因果関係を数式で検証

# 新規顧客数の計算式を検証
# 新規顧客数 = サイト訪問者数 × コンバージョン率

print()
print("【因果関係の検証】")
print()
print("新規顧客数 = サイト訪問者数 × CVR")
print()

# 前年の検算
visitors_ly = 300000
cvr_ly = 0.01  # 1.0% = 0.01
customers_ly = visitors_ly * cvr_ly
print(f"前年: {visitors_ly:,} × {cvr_ly:.1%} = {customers_ly:,.0f}人 ✓")

# 今年の検算
visitors_ty = 210000
cvr_ty = 0.01  # 1.0% = 0.01
customers_ty = visitors_ty * cvr_ty
print(f"今年: {visitors_ty:,} × {cvr_ty:.1%} = {customers_ty:,.0f}人 ✓")
print()

print("【結論】")
print("コンバージョン率(CVR)は変わっていない → サイトの問題ではない")
print("サイト訪問者数が30%減少 → これが新規顧客減少の直接原因")
print()
print("では、なぜサイト訪問者が減ったのか?")
print("→ 広告費を30%削減したから!")

実行結果の解釈

📊 分析結果
指標 前年 今年 変化率
広告費 60百万円 42百万円 -30%
サイト訪問者数 300,000人 210,000人 -30%
CVR 1.0% 1.0% 0%
CPA 20,000円 20,000円 0%
✅ STEP 3の結論:原因が特定できた!
因果関係のチェーン:

広告費30%削減

サイト訪問者30%減少

新規顧客30%減少

売上45百万円減少

重要な発見:
・CVR(コンバージョン率)は維持されている → サイトには問題なし
・CPA(顧客獲得コスト)も変化なし → 広告効率は維持
広告費削減が売上減少の根本原因

📈 5. STEP 7: 統計的に因果関係を検証

なぜ統計的検証が必要か

📌 「感覚」ではなく「データ」で証明する
経営層に提案するとき、「広告費を減らしたから売上が減った」と言うだけでは不十分です。

経営層からの想定質問:
「本当に広告費と売上は関係しているの?」
「たまたま同じタイミングで減っただけでは?」
「統計的な根拠はあるの?」

これらの質問に答えるために、
相関分析回帰分析で因果関係を統計的に証明します。

相関分析と回帰分析のコード

まず、scipyライブラリを使って統計分析を行います。

# 統計分析に必要なライブラリを読み込む
from scipy import stats  # 統計検定を行うためのライブラリ

# 月次の広告費と新規顧客数のデータ(12ヶ月分)
# 広告費を段階的に削減した経緯をシミュレート
ad_spend = np.array([60, 58, 55, 50, 45, 42, 42, 42, 42, 42, 42, 42])  # 百万円
new_customers = np.array([250, 245, 230, 210, 190, 175, 175, 175, 175, 175, 175, 175])  # 人

相関係数を計算します。相関係数は「2つの変数がどれだけ関連しているか」を-1〜+1の数値で表します。

# 相関係数を計算
# np.corrcoef(): 2つの配列の相関係数を計算
# 戻り値は2x2の行列で、[0,1]が相関係数
correlation = np.corrcoef(ad_spend, new_customers)[0, 1]

print("【相関分析】")
print(f"広告費と新規顧客数の相関係数: {correlation:.3f}")
print()

# 相関係数の解釈
if correlation >= 0.7:
    print("→ 非常に強い正の相関(広告費が増えると新規顧客も増える)")
elif correlation >= 0.4:
    print("→ 中程度の正の相関")
else:
    print("→ 弱い相関")

次に、回帰分析を行います。回帰分析は「広告費が1単位増えると、新規顧客が何人増えるか」を定量化します。

# 回帰分析を実行
# stats.linregress(): 単回帰分析を行う関数
# 戻り値: slope(傾き), intercept(切片), r_value(相関係数), 
#         p_value(有意確率), std_err(標準誤差)

slope, intercept, r_value, p_value, std_err = stats.linregress(ad_spend, new_customers)

print("【回帰分析】")
print(f"回帰式: 新規顧客数 = {intercept:.1f} + {slope:.2f} × 広告費")
print()
print(f"傾き(slope): {slope:.2f}")
print("→ 広告費を1百万円増やすと、新規顧客が約4人増える")
print()
print(f"決定係数(R²): {r_value**2:.3f}")
print("→ 新規顧客数の変動の96%が広告費で説明できる")
print()
print(f"p値: {p_value:.6f}")
print("→ p値 < 0.001 なので、統計的に非常に有意")

統計用語の解説

📚 統計用語をビジネス言葉に翻訳
統計用語 ビジネス言葉での説明
相関係数 0.98 広告費と新規顧客数はほぼ完全に連動している
決定係数 R² = 0.96 新規顧客数の変動の96%が広告費で説明できる
p値 < 0.001 この関係が偶然である確率は0.1%未満(99.9%確実)
傾き = 4.2 広告費1百万円増 → 新規顧客約4人増
✅ 統計的検証の結論
経営層への説明:

「広告費と新規顧客数には明確な因果関係が存在します。
統計的に99.9%の確率で確実と言えます。
広告費を元の水準に戻せば、新規顧客数も回復します。」

データで裏付け:
✓ 相関係数 0.98(非常に強い相関)
✓ 決定係数 R² = 0.96(96%説明可能)
✓ p値 < 0.001(統計的に有意)

💡 6. 改善アクションプランの策定

データに基づく3つの施策

📌 施策立案の基本原則
分析で終わらせない。必ず「だから何をすべきか」を提案する。

良い施策の条件:
・データに基づいている(感覚ではない)
・実行可能である(現実的な予算・期間)
・効果が測定できる(KPIが明確)
・ROIが計算できる(投資対効果が明確)

【施策1】広告予算の復活と最適化

📋 施策1の詳細
現状と課題:
・広告費を30%削減(60M円→42M円)
・結果、新規顧客が30%減少
・売上への影響: -45M円

提案内容:
広告費を前年水準(60M円)に戻す

予算配分案:
・Google広告: 25M円(効率的なキーワードに集中)
・SNS広告: 20M円(Instagram、TikTok強化)
・アフィリエイト: 10M円(成果報酬型)
・リターゲティング: 5M円(離脱ユーザー呼び戻し)
合計: 60M円

期待効果の計算:
・追加投資: 18M円(42M → 60M円)
・サイト訪問者: 210K → 300K(+43%)
・新規顧客: 2,100人 → 3,000人(+43%)
・売上回復: +45M円
ROI: (45M - 18M) / 18M = 150%

【施策2】既存顧客のロイヤルティプログラム強化

📋 施策2の詳細
現状と課題:
・既存顧客の客単価が5.1%減少
・特に一般セグメントの減少が大きい(-6.3%)
・売上への影響: -49.5M円

提案内容:
購買頻度と購買額を増やす仕組みを構築

具体策:
1. ポイントプログラム改革
 ・購買額に応じて1-5%還元
 ・VIP: 5%、ロイヤル: 3%、一般: 1%

2. 定期購入プランの導入
 ・月額制で送料無料+10%OFF
 ・食品・日用品カテゴリから開始

3. パーソナライズドレコメンド
 ・AIで購買履歴から提案

投資額: 15M円
期待効果: 売上回復+36M円
ROI: (36M - 15M) / 15M = 140%

施策のまとめと優先順位

📊 施策比較表
施策 投資額 期待効果 ROI 優先度
①広告予算復活 18M円 +45M円 150%
②ロイヤルティ強化 15M円 +36M円 140%
合計 33M円 +81M円 145%
✅ 改善アクションの結論
投資33M円で売上81M円回復

・現状売上: 900M円
・施策1効果: +45M円
・施策2効果: +36M円
合計: 981M円(前年比 -1.9%まで回復)

ペイバック期間: 4.9ヶ月
半年以内に投資回収が可能

📊 7. 経営層へのプレゼンテーション

エグゼクティブサマリー(1枚で伝える)

📄 経営会議用 エグゼクティブサマリー
【結論・推奨事項】
広告予算の復活とロイヤルティプログラム強化を推奨。
投資33M円で売上81M円回復、ROI 145%。
6ヶ月以内に前年水準への回復が可能。


【現状分析】
今期売上は前年比10%減少(1,000M円→900M円)。
主要因は新規顧客の30%減少(-45M円の影響)。


【根本原因】
・広告費30%削減(60M円→42M円)が原因
・サイト訪問者30%減少(300K→210K)
統計的検証: 相関係数0.98、p値<0.001


【改善施策】
施策1: 広告予算復活(投資18M、効果+45M、ROI 150%)
施策2: ロイヤルティ強化(投資15M、効果+36M、ROI 140%)


【Next Steps】
◆ 今週中: 経営会議で承認
◆ 来週: 施策1(広告)開始
◆ 来月: 施策2(システム)開発着手
◆ 6ヶ月後: 効果検証・最終評価

プレゼンテーションの構成(15分版)

📌 15分プレゼンの構成
【起】オープニング(2分)
・タイトル: 「売上10%減少の原因分析と回復戦略」
・衝撃的な事実: 「毎月830万円の機会損失」

【承】問題提起(3分)
・売上推移のグラフ
・売上要素の分解結果
・新規顧客30%減少という発見

【転】解決策(7分)
・根本原因の特定(広告費削減)
・統計的検証(相関・回帰分析)
・改善施策1・2の詳細
・財務インパクトとROI

【結】クロージング(3分)
・実施スケジュール
・まとめ(3つのポイント)
・Call to Action: 「今週中の承認をお願いします」

📝 STEP 50 のまとめ

✅ このプロジェクトで学んだこと
  • 体系的分析: 売上要素分解→セグメント分析→原因特定
  • 仮説思考: 仮説を立て、データで検証するサイクル
  • 統計的検証: 相関分析、回帰分析で因果関係を証明
  • 実践的施策: データに基づいた具体的なアクションプラン
  • ROI試算: すべての施策で投資対効果を定量化
  • プレゼン: 経営層が意思決定できる形式で提示
💡 プロジェクト成功のポイント
1. 仮説思考で効率化
闇雲にデータを眺めない。「たぶん〜が原因」と仮説を立て、検証する。

2. 要素分解で構造化
複雑な問題を小さな要素に分ける。「売上=客数×客単価×頻度」

3. 統計で因果関係を証明
「感覚」ではなく「数字」で説得。p値、相関係数を活用。

4. アクション志向
分析で終わらない。必ず「だから何をすべきか」を提案。

5. 経営層の視点で
結論ファースト。ROIを明示。リスクも正直に伝える。

📝 練習問題

課題 1 発展

このプロジェクトをさらに深掘りしてください。

追加分析課題:
1. 競合A社が広告を強化した時期を特定し、当社への影響を定量化
2. 商品カテゴリ別の新規顧客獲得効率(CPA)を分析
3. 施策実施後のシミュレーション(楽観・標準・悲観)

これらの追加分析を行い、より詳細な改善提案を作成してください。
【分析アプローチのヒント】
1. 競合分析の深掘り
・月次の市場シェアデータを時系列で並べる
・競合A社のシェア急増時期を特定
・同時期の当社の新規顧客数減少を確認
・相関係数を計算(競合シェア vs 当社新規)

2. カテゴリ別CPA分析
・カテゴリ別の広告費を算出
・カテゴリ別の新規顧客数を算出
・CPA = 広告費 / 新規顧客数
・CPAが低い(効率的)カテゴリに集中投資

3. シナリオシミュレーション
・楽観シナリオ: 施策が120%の効果
・標準シナリオ: 施策が100%の効果
・悲観シナリオ: 施策が80%の効果
・各シナリオでROIとペイバックを計算
課題 2 発展

15分間のプレゼンテーション資料を作成してください。

要件:
・スライド15枚程度
・ストーリーアーク(起承転結)に従う
・グラフと数字で裏付ける
・経営層が意思決定できる内容
・想定質問と回答を5つ準備

PowerPointまたはGoogleスライドで実際に資料を作成してください。
【プレゼンテーション構成案】
スライド1: タイトル
「売上10%減少の原因分析と回復戦略」

スライド2: 衝撃的な事実
「今期、毎月830万円の売上機会を失っています」

スライド3-5: 問題提起
・売上推移グラフ
・売上要素の分解
・新規顧客30%減少

スライド6-8: 原因分析
・Web解析データ
・相関分析結果
・因果関係の証明

スライド9-12: 改善施策
・施策1の詳細
・施策2の詳細
・財務インパクト
・シナリオ分析

スライド13-15: クロージング
・スケジュール
・まとめ
・Call to Action

❓ よくある質問

Q1: このような分析は実務でどれくらいの期間で行いますか?
通常1-2週間、緊急時は3-5日です。

理想的なスケジュール(1週間):
Day 1-2: データ収集と整理
Day 3-4: 分析(要素分解、セグメント、原因特定)
Day 5: 改善策立案とROI試算
Day 6: プレゼン資料作成
Day 7: リハーサルと最終調整

時間短縮のコツ:
・データは日頃から整備しておく
・分析テンプレートを用意
・仮説思考で優先順位をつける
・完璧を目指さず80%で判断
Q2: データが不足している場合はどうしますか?
仮説ベースで分析し、追加調査を提案します。

データ不足時の対処法:
1. 利用可能なデータで仮説を立てる
 「広告費と売上の詳細は不明だが、時期的に関連がありそう」

2. 代理指標を使う
 直接データがない → 間接的な指標で代替
 例: 顧客満足度データがない → リピート率で代替

3. 制約を明示する
 「現時点のデータでは〜」「追加調査が必要」
 → 正直に伝えることが信頼につながる
Q3: 施策が失敗したらどうしますか?
事前にモニタリング体制を整え、即座に軌道修正します。

失敗を防ぐ仕組み:
1. パイロット運用
 いきなり全体展開しない。小規模でテスト。

2. 週次モニタリング
 KPIを毎週チェック。異常値は即座に調査。

3. 撤退基準の設定
 「3ヶ月でROI 50%未達なら見直し」など明確な基準を事前に決める。

4. プランBの準備
 代替案を常に用意。柔軟に切り替える。

失敗は恥ではなく、学習の機会!
早期発見、早期対処が鍵です。
📝

学習メモ

ビジネスデータ分析・意思決定 - Step 50

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE