📋 このステップで学ぶこと
- マーケティングレポートとは何か、なぜ重要なのか
- レポートの基本構成と対象者別の内容調整
- 主要なマーケティングKPI(ROI、CVR、CACなど)
- Before/After比較による効果測定の可視化
- 説得力のあるストーリーテリングの技術
- PDFレポートの自動生成(matplotlib, reportlab)
- データに基づく具体的な提案の書き方
📊 1. マーケティングレポートとは
マーケティングレポートの定義と目的
マーケティングレポートとは、施策の効果を測定し、次のアクションを提案するためのドキュメントです。単なるデータの羅列ではなく、「何が起きたか」「なぜ起きたか」「次に何をすべきか」を明確に伝えます。
優れたマーケティングレポートは、経営判断を支援し、チームの次のアクションを導き、成功と失敗の学びを組織に蓄積する役割を果たします。
💡 身近な例で考えてみよう
マーケティングレポートは、家計簿に似ています:
家計簿:「今月は食費が5万円だった。先月より1万円増えた。外食が多かったから。来月は自炊を増やそう」
マーケティングレポート:「今月の広告費は100万円だった。売上は300万円増えた。動画広告が効果的だった。来月は動画広告を増やそう」
どちらも「結果→原因→改善策」の流れで、次のアクションに繋げています。
マーケティングレポートの4つの目的
🎯 マーケティングレポートの目的
| 目的 |
内容 |
具体例 |
| 1. 効果測定 |
投資対効果(ROI)の検証、KPI達成度の確認 |
「広告費100万円で売上300万円増、ROI 200%」 |
| 2. 意思決定支援 |
継続・中止・改善の判断材料を提供 |
「ROIが高いので予算増額を推奨」 |
| 3. 関係者への報告 |
経営層、チーム、クライアントへの成果共有 |
「経営会議用のエグゼクティブサマリー」 |
| 4. ナレッジ蓄積 |
成功パターンの記録、失敗からの学び |
「動画広告が静止画より2倍効果的だった」 |
対象者別のレポート内容
レポートの読者によって、含めるべき内容と詳細度が異なります。経営層には大きな数字とシンプルなグラフ、担当者には詳細な分析が求められます。
【対象者別のレポート内容】
■ 経営層向け(エグゼクティブサマリー)
・1ページに収める(忙しいため詳細は見ない)
・ROI、売上への貢献を大きく表示
・シンプルなグラフ(棒グラフ、KPIカード)
・「続けるべきか、やめるべきか」が分かる内容
例: 「ROI 250%。売上500万円増。継続を推奨。」
■ マーケティングチーム向け
・詳細なKPI分析(訪問者数、CVR、CACなど)
・チャネル別パフォーマンス比較
・A/Bテストの結果
・次回施策の具体的な提案
例: 「Instagramが最も効果的。動画広告のCTRは静止画の2倍。」
■ クライアント向け(代理店の場合)
・成果の可視化(Before/After)
・競合比較(差別化ポイント)
・継続の価値提案
・ROIの透明な報告
例: 「御社のCVRは業界平均の1.5倍。さらなる成長の余地あり。」
レポートの基本構成
📋 マーケティングレポートの6つのセクション
| セクション |
内容 |
ページ数目安 |
| 1. エグゼクティブサマリー |
要約、主要成果、結論 |
1ページ |
| 2. 施策概要 |
目的、期間、予算、ターゲット |
1ページ |
| 3. 結果 |
KPI達成度、Before/After比較 |
2-3ページ |
| 4. 分析 |
成功要因、課題、チャネル別分析 |
2-3ページ |
| 5. 提案 |
次のアクション、予算配分案 |
1-2ページ |
| 6. 付録 |
詳細データ、方法論、用語集 |
必要に応じて |
🎯 2. 施策効果測定の方法
主要なマーケティングKPI
KPI(Key Performance Indicator)とは、施策の効果を測定するための主要な指標です。目的に応じて適切なKPIを選び、継続的に測定・改善していきます。
📊 デジタルマーケティングの主要KPI
| カテゴリ |
KPI |
計算方法・説明 |
| トラフィック |
訪問者数、PV、直帰率 |
サイトにどれだけ人が来たか |
| エンゲージメント |
CTR(クリック率)、いいね数 |
CTR = クリック数 ÷ 表示回数 × 100 |
| コンバージョン |
CVR(コンバージョン率) |
CVR = CV数 ÷ 訪問者数 × 100 |
| コスト |
CAC(顧客獲得コスト) |
CAC = 広告費 ÷ 新規顧客数 |
| 収益性 |
ROI(投資対効果) |
ROI = (売上 – コスト) ÷ コスト × 100 |
| 顧客価値 |
LTV(顧客生涯価値) |
LTV = 平均購入額 × 購入回数 × 継続期間 |
【ROI(投資対効果)の計算例】
■ ROIの計算式
ROI = (売上 – 施策コスト) ÷ 施策コスト × 100
■ 計算例
広告費: 100万円
売上増加: 300万円
ROI = (300 – 100) ÷ 100 × 100 = 200%
■ ROIの解釈
・ROI 100%: 投資額と同じ利益(損益分岐点)
・ROI 200%: 投資額の2倍の利益(1万円投資で2万円の利益)
・ROI 0%未満: 赤字(投資回収できていない)
■ 目安
・一般的に ROI 100%以上で「成功」
・デジタル広告では ROI 200-300%が優良
・業界平均と比較して判断するのが重要
Before/After比較の可視化
施策の効果を最も分かりやすく伝えるのがBefore/After比較です。施策前と施策後の数値を並べて表示することで、改善効果が一目で分かります。
# Before/After比較グラフの作成
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 日本語フォント設定(Google Colab用)
plt.rcParams[‘font.family’] = ‘DejaVu Sans’
# サンプルデータ: SNS広告キャンペーンの結果
data = {
‘指標’: [‘訪問者数’, ‘CV数’, ‘CVR(%)’, ‘売上(万円)’],
‘Before’: [10000, 50, 0.5, 500], # 施策前
‘After’: [15000, 120, 0.8, 1200], # 施策後
‘目標’: [14000, 100, 0.7, 1000] # 目標値
}
df = pd.DataFrame(data)
# 達成率と増加率を計算
df[‘達成率(%)’] = (df[‘After’] / df[‘目標’] * 100).round(1)
df[‘増加率(%)’] = ((df[‘After’] – df[‘Before’]) / df[‘Before’] * 100).round(1)
# 4つの指標を2×2のグリッドで表示
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
for i, metric in enumerate(df[‘指標’]):
row = i // 2 # 行番号(0または1)
col = i % 2 # 列番号(0または1)
ax = axes[row, col]
# データを取得
before = df.loc[i, ‘Before’]
after = df.loc[i, ‘After’]
target = df.loc[i, ‘目標’]
increase = df.loc[i, ‘増加率(%)’]
# 棒グラフを描画
x = [‘Before’, ‘After’, ‘Target’]
y = [before, after, target]
colors = [‘#E74C3C’, ‘#2ECC71’, ‘#3498DB’] # 赤、緑、青
bars = ax.bar(x, y, color=colors, alpha=0.7, edgecolor=’black’, linewidth=2)
# 棒の上に数値を表示
for bar, val in zip(bars, y):
height = bar.get_height()
ax.text(bar.get_x() + bar.get_width()/2., height,
f'{val:,.0f}’,
ha=’center’, va=’bottom’, fontsize=12, fontweight=’bold’)
# 増加率を表示
ax.text(0.5, max(y) * 0.85, f’+{increase}%’,
ha=’center’, fontsize=14, fontweight=’bold’,
bbox=dict(boxstyle=’round’, facecolor=’yellow’, alpha=0.7))
ax.set_title(metric, fontsize=14, fontweight=’bold’)
ax.set_ylabel(‘Value’, fontsize=12)
ax.grid(axis=’y’, alpha=0.3)
plt.suptitle(‘SNS Campaign: Before/After Comparison’,
fontsize=18, fontweight=’bold’, y=0.995)
plt.tight_layout()
plt.show()
# サマリーを表示
print(“\n【施策効果サマリー】”)
print(df.to_string(index=False))
【実行結果】
4つの指標(訪問者数、CV数、CVR、売上)のBefore/After比較グラフが表示されます。
【施策効果サマリー】
指標 Before After 目標 達成率(%) 増加率(%)
訪問者数 10000 15000 14000 107.1 50.0
CV数 50 120 100 120.0 140.0
CVR(%) 0.5 0.8 0.7 114.3 60.0
売上(万円) 500 1200 1000 120.0 140.0
コードの解説
📝 Before/Afterグラフのコード解説
| コード |
何をしているか |
なぜ使うのか |
plt.subplots(2, 2) |
2行×2列のグリッドを作成 |
4つの指標を一覧で比較するため |
i // 2, i % 2 |
インデックスから行・列番号を計算 |
ループで各グラフの位置を決めるため |
ax.bar(x, y, color=colors) |
棒グラフを描画 |
Before/After/目標を視覚的に比較 |
ax.text(..., bbox=dict(...)) |
背景付きのテキストを表示 |
増加率を目立たせるため |
f'{val:,.0f}' |
数値を3桁区切りで表示 |
大きな数値を読みやすくするため |
ROI推移の可視化(Plotly)
月別のROI推移を可視化し、広告費と売上の関係を明確にします。Plotlyを使うとインタラクティブなグラフが作成できます。
# 月別のROI推移グラフ(Plotly)
import plotly.graph_objects as go
import numpy as np
# 月別データ
months = [‘1月’, ‘2月’, ‘3月’, ‘4月’, ‘5月’, ‘6月’]
ad_cost = [50, 55, 60, 65, 70, 75] # 広告費(万円)
revenue = [150, 180, 210, 260, 280, 320] # 売上(万円)
# ROIを計算
roi = [((r – c) / c * 100) for r, c in zip(revenue, ad_cost)]
# グラフ作成
fig = go.Figure()
# 広告費(棒グラフ・赤)
fig.add_trace(go.Bar(
x=months,
y=ad_cost,
name=’広告費’,
marker_color=’#E74C3C’,
yaxis=’y’
))
# 売上(棒グラフ・緑)
fig.add_trace(go.Bar(
x=months,
y=revenue,
name=’売上’,
marker_color=’#2ECC71′,
yaxis=’y’
))
# ROI(折れ線グラフ・青、右軸)
fig.add_trace(go.Scatter(
x=months,
y=roi,
name=’ROI’,
mode=’lines+markers’,
line=dict(color=’#3498DB’, width=3),
marker=dict(size=12),
yaxis=’y2′
))
# レイアウト設定
fig.update_layout(
title=’月別 広告費・売上・ROI 推移‘,
xaxis_title=’月’,
yaxis_title=’金額(万円)’,
yaxis2=dict(
title=’ROI(%)’,
overlaying=’y’,
side=’right’,
showgrid=False
),
height=500,
hovermode=’x unified’,
legend=dict(x=0.01, y=0.99, bgcolor=’rgba(255,255,255,0.8)’),
barmode=’group’
)
fig.show()
# サマリーを表示
print(f”\n【ROI分析サマリー】”)
print(f”平均ROI: {np.mean(roi):.1f}%”)
print(f”累計広告費: {sum(ad_cost)}万円”)
print(f”累計売上: {sum(revenue)}万円”)
print(f”累計利益: {sum(revenue) – sum(ad_cost)}万円”)
【実行結果】
インタラクティブなグラフが表示されます。
– 赤い棒: 広告費(月ごとに増加)
– 緑の棒: 売上(月ごとに増加)
– 青い線: ROI(右軸、200%→326%と改善傾向)
【ROI分析サマリー】
平均ROI: 266.7%
累計広告費: 375万円
累計売上: 1,400万円
累計利益: 1,025万円
📖 3. ストーリーテリング
説得力のあるストーリー構成
データをただ並べるのではなく、ストーリーとして伝えることで、説得力が大幅に増します。読み手が「なるほど」と納得し、次のアクションに繋がる構成を意識しましょう。
【ストーリー構成の7ステップ】
■ STEP 1: 背景(Why)- なぜこの施策を行ったか
┌──────────────────────────┐
│ 新商品発売に伴い、認知度向上を │
│ 目的としてSNS広告を実施しました。│
│ │
│ 【課題】 │
│ ・既存顧客層の高齢化 │
│ ・若年層へのリーチ不足 │
└──────────────────────────┘
■ STEP 2: 施策内容(What)- 何をしたか
┌──────────────────────────┐
│ Instagram & Facebook広告 │
│ 期間: 2024年4-6月(3ヶ月) │
│ 予算: 200万円 │
│ ターゲット: 20-35歳女性 │
└──────────────────────────┘
■ STEP 3: 結果(Result)- 何が起きたか
┌──────────────────────────┐
│ 📊 主要KPI達成状況 │
│ ✓ 訪問者数: +50%(目標比107%)│
│ ✓ CV数: +140%(目標比120%) │
│ ✓ ROI: 250% │
│ │
│ [グラフ: Before/After比較] │
└──────────────────────────┘
■ STEP 4: 成功要因(Why it worked)- なぜ成功したか
┌──────────────────────────┐
│ 1. ターゲティングの精度 │
│ → 20代女性に絞り込み │
│ │
│ 2. クリエイティブの工夫 │
│ → 動画広告が静止画の2倍効果│
│ │
│ 3. 継続的な最適化 │
│ → 週次でPDCAを回した │
└──────────────────────────┘
■ STEP 5: 課題と改善点(Challenge)- 何が問題だったか
┌──────────────────────────┐
│ ⚠️ 課題 │
│ ・CPAが月末に上昇傾向 │
│ ・30代後半への訴求が弱い │
│ │
│ 💡 改善案 │
│ ・入札戦略の見直し │
│ ・クリエイティブの多様化 │
└──────────────────────────┘
■ STEP 6: 次のアクション(Next Step)- 何をすべきか
┌──────────────────────────┐
│ 【提案】 │
│ 1. 予算を1.5倍(300万円)に増額│
│ → ROI 250%を考慮 │
│ │
│ 2. ターゲット層を拡大 │
│ → 30-40歳も追加 │
│ │
│ 3. YouTube広告も開始 │
│ → 動画が効果的だったため │
└──────────────────────────┘
■ STEP 7: まとめ(Summary)- 結論
┌──────────────────────────┐
│ SNS広告キャンペーンは大成功! │
│ ROI 250%を達成し、若年層への │
│ リーチも拡大しました。 │
│ 継続・拡大を強く推奨します。 │
└──────────────────────────┘
ストーリーボード形式のレポート
9つのグラフを1枚にまとめて、ストーリーの流れを視覚化します。
# ストーリーボード形式のレポート
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure(figsize=(16, 12))
# 1. 背景:既存顧客の年齢構成(課題の可視化)
ax1 = plt.subplot(3, 3, 1)
age_groups = [’10s’, ’20s’, ’30s’, ’40s’, ’50s’, ’60s+’]
current_customers = [5, 15, 25, 30, 20, 5]
ax1.bar(age_groups, current_customers, color=’#E74C3C’, alpha=0.7)
ax1.set_title(‘Background: Age Distribution’, fontweight=’bold’)
ax1.set_ylabel(‘Ratio (%)’)
ax1.axhline(y=16.7, color=’green’, linestyle=’–‘, label=’Ideal’)
ax1.legend()
ax1.text(1.5, 28, ‘Young users\nare few!’, fontsize=10,
bbox=dict(boxstyle=’round’, facecolor=’yellow’))
# 2. 施策:月別予算
ax2 = plt.subplot(3, 3, 2)
months = [‘Apr’, ‘May’, ‘Jun’]
budget = [60, 70, 70]
ax2.bar(months, budget, color=’#3498DB’)
ax2.set_title(‘Campaign: Monthly Budget’, fontweight=’bold’)
ax2.set_ylabel(‘Budget (10K JPY)’)
ax2.text(1, 55, f’Total\n{sum(budget)}’, ha=’center’,
fontsize=14, fontweight=’bold’,
bbox=dict(boxstyle=’round’, facecolor=’lightblue’))
# 3. 結果:訪問者数Before/After
ax3 = plt.subplot(3, 3, 3)
categories = [‘Before’, ‘After’]
visitors = [10000, 15000]
colors = [‘#E74C3C’, ‘#2ECC71’]
bars = ax3.bar(categories, visitors, color=colors, alpha=0.7)
ax3.set_title(‘Result: Visitors +50%’, fontweight=’bold’)
ax3.set_ylabel(‘Visitors’)
for bar, val in zip(bars, visitors):
ax3.text(bar.get_x() + bar.get_width()/2, val,
f'{val:,}’, ha=’center’, va=’bottom’, fontsize=12)
# 4. 結果:CV数Before/After
ax4 = plt.subplot(3, 3, 4)
cv = [50, 120]
bars = ax4.bar(categories, cv, color=colors, alpha=0.7)
ax4.set_title(‘Result: CV +140%’, fontweight=’bold’)
ax4.set_ylabel(‘Conversions’)
for bar, val in zip(bars, cv):
ax4.text(bar.get_x() + bar.get_width()/2, val,
f'{val}’, ha=’center’, va=’bottom’, fontsize=12)
# 5. 結果:ROI推移
ax5 = plt.subplot(3, 3, 5)
roi_trend = [200, 250, 300]
ax5.plot(months, roi_trend, marker=’o’, linewidth=3,
markersize=12, color=’#2ECC71′)
ax5.set_title(‘Result: ROI Trend (Improving)’, fontweight=’bold’)
ax5.set_ylabel(‘ROI (%)’)
ax5.grid(axis=’y’, alpha=0.3)
ax5.axhline(y=200, color=’red’, linestyle=’–‘, label=’Target 200%’)
ax5.legend()
# 6. 成功要因:年齢別リーチ改善
ax6 = plt.subplot(3, 3, 6)
new_reach = [10, 35, 25, 20, 8, 2]
ax6.bar(age_groups, new_reach, color=’#2ECC71′, alpha=0.7)
ax6.set_title(‘Success: New Age Distribution’, fontweight=’bold’)
ax6.set_ylabel(‘Ratio (%)’)
ax6.text(1, 33, ‘Young users\nincreased!’, fontsize=10,
bbox=dict(boxstyle=’round’, facecolor=’lightgreen’))
# 7. 分析:チャネル別パフォーマンス
ax7 = plt.subplot(3, 3, 7)
channels = [‘Instagram’, ‘Facebook’, ‘Twitter’]
performance = [150, 80, 30]
ax7.barh(channels, performance, color=[‘#E74C3C’, ‘#3498DB’, ‘#00acee’])
ax7.set_title(‘Analysis: CV by Channel’, fontweight=’bold’)
ax7.set_xlabel(‘Conversions’)
# 8. 課題:CPA上昇傾向
ax8 = plt.subplot(3, 3, 8)
weeks = [‘W1’, ‘W2’, ‘W3’, ‘W4′]
cpa = [15000, 14000, 16000, 18000]
ax8.plot(weeks, cpa, marker=’o’, linewidth=2, color=’#E74C3C’)
ax8.set_title(‘Challenge: CPA Rising’, fontweight=’bold’)
ax8.set_ylabel(‘CPA (JPY)’)
ax8.axhline(y=15000, color=’green’, linestyle=’–‘, label=’Target’)
ax8.legend()
ax8.text(2, 17500, ‘Needs\nimprovement’, fontsize=9,
bbox=dict(boxstyle=’round’, facecolor=’pink’))
# 9. 提案:予算増額
ax9 = plt.subplot(3, 3, 9)
proposals = [‘Current’, ‘Proposed’]
budgets = [200, 300]
bars = ax9.bar(proposals, budgets, color=[‘#3498DB’, ‘#2ECC71’], alpha=0.7)
ax9.set_title(‘Proposal: Budget x1.5′, fontweight=’bold’)
ax9.set_ylabel(‘Budget (10K JPY)’)
for bar, val in zip(bars, budgets):
ax9.text(bar.get_x() + bar.get_width()/2, val,
f'{val}’, ha=’center’, va=’bottom’, fontsize=12)
ax9.text(0.5, 240, ‘ROI 250%\n→ Increase OK!’, ha=’center’,
bbox=dict(boxstyle=’round’, facecolor=’yellow’))
plt.suptitle(‘SNS Campaign Report – Storyboard’,
fontsize=20, fontweight=’bold’, y=0.995)
plt.tight_layout()
plt.show()
print(“\nストーリーボード形式で、”)
print(“背景→施策→結果→分析→提案の流れを可視化しました!”)
【実行結果】
9つのグラフが3×3のグリッドで表示されます:
1行目(背景・施策・結果1)
2行目(結果2・結果3・成功要因)
3行目(分析・課題・提案)
ストーリーの流れが視覚的に理解できるレイアウトです。
📄 4. PDFレポート自動生成
なぜPDF自動生成が重要か
定期的なレポート作成は時間がかかります。Pythonで自動生成すれば、毎月のレポート作成を数分で完了でき、人為的ミスも防げます。
🛠️ PDF生成ツールの比較
| ツール |
特徴 |
おすすめ用途 |
| matplotlib (PdfPages) |
グラフをそのままPDF化、簡単 |
グラフ中心のレポート |
| reportlab |
テキスト・表・画像を自由配置 |
本格的なビジネスレポート |
| FPDF |
シンプルで軽量 |
シンプルなPDF生成 |
| WeasyPrint |
HTMLをPDFに変換 |
Webデザインを活かしたPDF |
matplotlibでPDF出力
最も手軽な方法は、matplotlibのPdfPagesを使うことです。作成したグラフをそのままPDFに保存できます。
# matplotlibでPDFレポートを生成
from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt
import pandas as pd
def create_marketing_report():
“””マーケティングレポートをPDFで生成する関数”””
# PDFファイル名
pdf_filename = ‘marketing_report_2024.pdf’
# PdfPagesでPDFを作成
with PdfPages(pdf_filename) as pdf:
# ========== ページ1: タイトルページ ==========
fig = plt.figure(figsize=(11, 8.5)) # レターサイズ
ax = fig.add_subplot(111)
ax.axis(‘off’) # 軸を非表示
# タイトル
ax.text(0.5, 0.7, ‘SNS Campaign’,
ha=’center’, fontsize=36, fontweight=’bold’,
transform=ax.transAxes)
ax.text(0.5, 0.6, ‘Performance Report’,
ha=’center’, fontsize=32, fontweight=’bold’,
transform=ax.transAxes)
# 期間と作成日
ax.text(0.5, 0.45, ‘Period: April – June 2024′,
ha=’center’, fontsize=18,
transform=ax.transAxes)
ax.text(0.5, 0.4, ‘Created: July 1, 2024′,
ha=’center’, fontsize=16,
transform=ax.transAxes)
# 会社名
ax.text(0.5, 0.2, ‘ABC Corporation’,
ha=’center’, fontsize=20,
transform=ax.transAxes)
ax.text(0.5, 0.15, ‘Marketing Department’,
ha=’center’, fontsize=16,
transform=ax.transAxes)
pdf.savefig(fig, bbox_inches=’tight’)
plt.close()
# ========== ページ2: エグゼクティブサマリー ==========
fig, ax = plt.subplots(figsize=(11, 8.5))
ax.axis(‘off’)
summary_text = “””
【Executive Summary】
1. Campaign Overview
– Platforms: Instagram & Facebook
– Duration: 3 months (Apr-Jun 2024)
– Budget: 2,000,000 JPY
– Target: Women 20-35
2. Key Results
✓ Visitors: +50% (Target: 107%)
✓ Conversions: +140% (Target: 120%)
✓ ROI: 250% (Target: 200%)
✓ Revenue Contribution: 5,000,000 JPY
3. Success Factors
– Precise targeting (20s women)
– Effective video creatives
– Weekly optimization
4. Recommendations
– Increase budget to 3,000,000 JPY (1.5x)
– Expand target to 30-40 age group
– Start YouTube advertising
【Conclusion】
The campaign exceeded expectations with 250% ROI.
We strongly recommend continuation and expansion.
“””
ax.text(0.05, 0.95, summary_text,
va=’top’, fontsize=11, family=’monospace’,
transform=ax.transAxes)
pdf.savefig(fig, bbox_inches=’tight’)
plt.close()
# ========== ページ3: Before/After比較 ==========
fig, axes = plt.subplots(2, 2, figsize=(11, 8.5))
metrics = [‘Visitors’, ‘Conversions’, ‘CVR (%)’, ‘Revenue (10K)’]
before = [10000, 50, 0.5, 500]
after = [15000, 120, 0.8, 1200]
for i, (metric, b, a) in enumerate(zip(metrics, before, after)):
row, col = i // 2, i % 2
ax = axes[row, col]
x = [‘Before’, ‘After’]
y = [b, a]
colors = [‘#E74C3C’, ‘#2ECC71′]
bars = ax.bar(x, y, color=colors, alpha=0.7)
ax.set_title(metric, fontsize=14, fontweight=’bold’)
# 増加率を計算して表示
increase = ((a – b) / b * 100)
ax.text(0.5, max(y) * 0.85, f’+{increase:.0f}%’,
ha=’center’, fontsize=12, fontweight=’bold’,
bbox=dict(boxstyle=’round’, facecolor=’yellow’))
plt.suptitle(‘Before/After Comparison’, fontsize=16, fontweight=’bold’)
plt.tight_layout()
pdf.savefig(fig, bbox_inches=’tight’)
plt.close()
# PDF情報を設定
d = pdf.infodict()
d[‘Title’] = ‘SNS Campaign Report’
d[‘Author’] = ‘Marketing Department’
d[‘Subject’] = ‘Q2 2024 Campaign Results’
d[‘Keywords’] = ‘SNS, ROI, Marketing’
d[‘CreationDate’] = pd.Timestamp.now()
print(f”\n✓ PDFレポートを作成しました: {pdf_filename}”)
print(” このファイルを経営陣や関係者に共有できます!”)
# 実行
create_marketing_report()
【実行結果】
✓ PDFレポートを作成しました: marketing_report_2024.pdf
このファイルを経営陣や関係者に共有できます!
【生成されるPDFの内容】
– ページ1: タイトルページ(キャンペーン名、期間、会社名)
– ページ2: エグゼクティブサマリー(概要、結果、提案)
– ページ3: Before/After比較グラフ(4つの指標)
コードの解説
📝 PDF生成のコード解説
| コード |
何をしているか |
なぜ使うのか |
with PdfPages(filename) as pdf: |
PDFファイルを開く |
複数ページを1つのPDFにまとめるため |
pdf.savefig(fig) |
現在のグラフをPDFに追加 |
各ページのグラフを保存するため |
plt.close() |
グラフを閉じる |
メモリを解放し、次のページを作成するため |
ax.axis('off') |
軸を非表示にする |
テキストのみのページを作成するため |
pdf.infodict() |
PDFのメタ情報を設定 |
タイトル、作成者などを記録するため |
💡 5. データに基づく提案
効果的な提案の3要素
レポートの最も重要な部分は提案です。データを分析して終わりではなく、「次に何をすべきか」を具体的に示すことで、レポートの価値が大きく高まります。
【効果的な提案の3要素】
■ 1. 現状分析(What)- 何が起きているか
「ROI 250%を達成し、目標を大きく上回りました」
→ 事実をシンプルに述べる
■ 2. 根拠(Why)- なぜそう言えるか
「広告費1万円あたり2.5万円の売上が発生しており、
投資対効果が非常に高い状況です」
→ データで裏付ける
■ 3. 具体的アクション(How)- 何をすべきか
「予算を200万円から300万円に増額することで、
追加で250万円の売上が見込めます。
実施時期は7月から9月の3ヶ月間を推奨します。」
→ 具体的な数字、時期、期間まで示す
【悪い提案例】
❌ 「広告を続けるべきです」
→ 抽象的、根拠なし、具体性がない
【良い提案例】
✓ 「ROI 250%を達成しているため、
予算を1.5倍(300万円)に増額することを提案します。
これにより、追加で250万円の売上と50万円の利益が見込まれます。
実施時期は7月から開始し、9月までの3ヶ月間継続することを推奨します。」
→ 具体的、数字の根拠あり、実施時期まで明確
提案の優先順位付け
🎯 提案の優先順位(Must / Should / Could)
| 優先度 |
意味 |
提案例 |
| Must(必須) |
今すぐ実行すべき |
予算増額(ROIが高いため)、CPA改善策の実施 |
| Should(推奨) |
できれば実行すべき |
ターゲット層の拡大、クリエイティブの多様化 |
| Could(検討) |
余裕があれば検討 |
YouTube広告の追加、インフルエンサー起用 |
シナリオ分析の可視化
複数の選択肢(シナリオ)を比較して、最適な提案を示します。
# シナリオ分析の可視化
import plotly.graph_objects as go
from plotly.subplots import make_subplots
# 3つのシナリオを定義
scenarios = [‘現状維持’, ‘提案A\n(予算1.5倍)’, ‘提案B\n(予算2倍)’]
budgets = [200, 300, 400] # 予算(万円)
expected_sales = [500, 750, 1000] # 予想売上(万円)
expected_profit = [300, 450, 600] # 予想利益(万円)
roi = [250, 250, 250] # ROI(%)は同じと仮定
# 2つのグラフを横に並べる
fig = make_subplots(
rows=1, cols=2,
subplot_titles=[‘予算と売上の比較’, ‘ROI(投資対効果)’],
specs=[[{“type”: “bar”}, {“type”: “scatter”}]]
)
# 左: 予算と売上の棒グラフ
fig.add_trace(go.Bar(
x=scenarios,
y=budgets,
name=’広告予算’,
marker_color=’#E74C3C’,
text=budgets,
textposition=’outside’
), row=1, col=1)
fig.add_trace(go.Bar(
x=scenarios,
y=expected_sales,
name=’予想売上’,
marker_color=’#2ECC71′,
text=expected_sales,
textposition=’outside’
), row=1, col=1)
# 右: ROIの折れ線グラフ
fig.add_trace(go.Scatter(
x=scenarios,
y=roi,
mode=’lines+markers+text’,
name=’ROI(%)’,
line=dict(color=’#3498DB’, width=3),
marker=dict(size=15),
text=[f'{r}%’ for r in roi],
textposition=’top center’
), row=1, col=2)
# レイアウト設定
fig.update_layout(
title_text=’予算増額シナリオ分析‘,
height=500,
showlegend=True
)
fig.update_yaxes(title_text=’金額(万円)’, row=1, col=1)
fig.update_yaxes(title_text=’ROI(%)’, range=[0, 300], row=1, col=2)
fig.show()
# 提案を表示
print(“\n【提案】”)
print(“=” * 50)
print(“提案A(予算1.5倍: 300万円)を推奨します。”)
print(“-” * 50)
print(f”・追加投資: +100万円”)
print(f”・追加売上: +250万円(予想)”)
print(f”・追加利益: +150万円(予想)”)
print(f”・ROI: 250%を維持”)
print(“=” * 50)
print(“\n理由: ROIを維持しながら、リスクを抑えた成長が可能。”)
print(“提案Bは効果が高いが、リスクも大きいため、”)
print(“まずは提案Aで効果を確認後、段階的に拡大を推奨。”)
【実行結果】
2つのグラフが表示されます:
– 左: 予算と売上の棒グラフ(3つのシナリオ比較)
– 右: ROIの折れ線グラフ(全シナリオで250%維持)
【提案】
==================================================
提案A(予算1.5倍: 300万円)を推奨します。
————————————————–
・追加投資: +100万円
・追加売上: +250万円(予想)
・追加利益: +150万円(予想)
・ROI: 250%を維持
==================================================
理由: ROIを維持しながら、リスクを抑えた成長が可能。
📝 STEP 40 のまとめ
✅ このステップで学んだこと
| トピック |
重要ポイント |
| マーケティングレポート |
施策効果の測定と次のアクション提案 |
| 主要KPI |
ROI、CVR、CAC、LTVなどを目的に応じて選択 |
| Before/After比較 |
効果を一目で分かるように可視化 |
| ストーリーテリング |
背景→施策→結果→分析→提案の流れ |
| PDF自動生成 |
PdfPagesで定期レポートを効率化 |
| データ提案 |
現状分析+根拠+具体的アクション |
💡 最重要ポイント
マーケティングレポートは、単なるデータの羅列ではなく、ストーリーとして伝えることが重要です。
背景→施策→結果→分析→提案の流れで構成し、数字で裏付けた具体的な提案を行いましょう。
常に「So What?(だから何?)」を意識し、データからアクションに繋がる洞察を導き出すことが、優れたマーケターの条件です!
📝 実践演習
演習 1
基礎
架空のキャンペーン(例: メールマーケティング)のBefore/After比較グラフを作成してください。
【解答コード】
import matplotlib.pyplot as plt
import pandas as pd
# メールマーケティングのデータ
data = {
‘指標’: [‘開封率(%)’, ‘クリック率(%)’, ‘CV数’],
‘Before’: [20, 2.5, 10],
‘After’: [35, 4.2, 25]
}
df = pd.DataFrame(data)
df[‘増加率(%)’] = ((df[‘After’] – df[‘Before’]) / df[‘Before’] * 100).round(1)
# グラフ作成
fig, axes = plt.subplots(1, 3, figsize=(12, 4))
for i, metric in enumerate(df[‘指標’]):
ax = axes[i]
before = df.loc[i, ‘Before’]
after = df.loc[i, ‘After’]
bars = ax.bar([‘Before’, ‘After’], [before, after],
color=[‘#E74C3C’, ‘#2ECC71′], alpha=0.7)
ax.set_title(metric, fontweight=’bold’)
# 増加率を表示
increase = df.loc[i, ‘増加率(%)’]
ax.text(0.5, max(before, after) * 0.85, f’+{increase}%’,
ha=’center’, fontweight=’bold’,
bbox=dict(boxstyle=’round’, facecolor=’yellow’))
plt.suptitle(‘Email Marketing: Before/After’, fontweight=’bold’)
plt.tight_layout()
plt.show()
演習 2
応用
ROIの計算と可視化を行い、予算増額の提案を作成してください。投資額100万円、売上350万円の場合。
【解答コード】
# ROI計算
広告費 = 100 # 万円
売上 = 350 # 万円
利益 = 売上 – 広告費
ROI = (利益 / 広告費) * 100
print(f”【ROI分析】”)
print(f”広告費: {広告費}万円”)
print(f”売上: {売上}万円”)
print(f”利益: {利益}万円”)
print(f”ROI: {ROI}%”)
# 提案
print(“\n【提案】”)
if ROI > 200:
新予算 = 広告費 * 1.5
予想売上 = 売上 * 1.5
予想利益 = 予想売上 – 新予算
print(f”ROIが{ROI}%と非常に高いため、予算増額を推奨します。”)
print(f”・現在の予算: {広告費}万円 → 提案: {新予算}万円”)
print(f”・予想売上: {予想売上}万円”)
print(f”・予想利益: {予想利益}万円”)
elif ROI > 100:
print(f”ROI {ROI}%は良好です。現状維持を推奨します。”)
else:
print(f”ROI {ROI}%は改善が必要です。施策の見直しを推奨します。”)
演習 3
発展
完全なマーケティングレポート(ストーリー構成 + グラフ + 提案)をPDFで作成してください。
【レポート構成の例】
【PDFレポートの構成】
ページ1: タイトルページ
– キャンペーン名
– 期間
– 作成者
ページ2: エグゼクティブサマリー
– 施策概要(1段落)
– 主要成果(箇条書き)
– 結論と提案(1段落)
ページ3: 背景と課題
– 既存顧客の年齢構成グラフ
– 課題の説明
ページ4: 施策概要
– 期間、予算、ターゲット
– 使用チャネル
ページ5: 結果(Before/After)
– 4つのKPIの比較グラフ
ページ6: 詳細分析
– ROI推移
– チャネル別パフォーマンス
ページ7: 成功要因と課題
– 成功要因の説明
– 課題と改善点
ページ8: 提案
– シナリオ分析グラフ
– 具体的なアクション
ページ9: 付録
– 詳細データ表
– 用語集
【コード】
本文のcreate_marketing_report()関数を拡張して、
各ページを追加していきます。
❓ よくある質問
Q1: ROIが低い(または赤字の)施策はどう報告すべきですか?
正直に報告し、学びを強調しましょう。失敗も重要なデータです。
報告例:「ROI 50%で目標未達でしたが、以下の学びがありました。①動画広告より静止画の方が効果的だった ②30代より20代の反応が良かった。次回は△△を改善して再挑戦します。」
失敗を隠すより、失敗から得た洞察と改善策を明確に示すことが、信頼につながります。
Q2: レポートの最適な頻度は?
施策の種類と変化のスピードによります。
週次レポート:デジタル広告、SNS運用など変化が速いもの
月次レポート:一般的なマーケティング施策、SEO
四半期レポート:大型キャンペーン、ブランド施策
年次レポート:年間戦略の振り返り
ただし、異常値(急激な変化やトラブル)が見つかった場合は、頻度に関わらず即座に報告しましょう。
Q3: 技術的な詳細はどこまで書くべきですか?
対象者に合わせて調整しましょう。
経営層向け:結果と提案のみ。技術的詳細は不要。1ページで完結。
マーケティングチーム向け:詳細な分析、A/Bテスト結果、最適化の経緯を含める。
技術チーム向け:実装詳細、トラッキング設定、データ収集方法を含める。
技術的詳細は「付録」にまとめ、本編はシンプルに保つのがおすすめです。
Q4: レポートで最も重要なページはどこですか?
エグゼクティブサマリー(1ページ目)と提案です。
忙しい経営層は最初の1ページしか読まないこともあります。そのため、エグゼクティブサマリーに「何が起きたか」「成功/失敗」「次に何をすべきか」を凝縮して書くことが重要です。
また、提案がないレポートは「報告」で終わってしまいます。「だから何をすべきか」を具体的に示すことで、レポートの価値が大きく高まります。
artnasekai
#artnasekai #学習メモ