Google Colabで閾値分析を行うための仮想データ生成から分析の手順を以下に示します。
Piecewise Regression(分割回帰)を使い、広告費用と売上の関係で費用対効果が変化するポイントを特定する流れです。
以下のPythonコードをGoogle Colabでコピー&ペーストして実行してください。
仮想データ生成と可視化
まずは日本語対応のmatplotライブラリをインポートするためのコードを実行。
!pip install japanize-matplotlib
次に必要なライブラリをインポートします。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from scipy.optimize import curve_fit
import japanize_matplotlib
ここから仮想データをランダムシードを使って用意し、データフレームに当てはめて散布図を作成します。
# ランダムシード設定
np.random.seed(42)
# 広告費用(仮想データ生成)
ad_costs = np.linspace(0, 100, 200) # 広告費用:0~100の範囲
sales = np.piecewise(ad_costs, [ad_costs < 50, ad_costs >= 50],
[lambda x: 5*x + np.random.normal(0, 10, len(x)),
lambda x: 250 + 2*(x-50) + np.random.normal(0, 10, len(x))])
# DataFrameにまとめる
data = pd.DataFrame({'広告費用': ad_costs, '売上': sales})
# 散布図で確認
plt.figure(figsize=(8, 5))
plt.scatter(data['広告費用'], data['売上'], label="データ", alpha=0.7)
plt.xlabel("広告費用")
plt.ylabel("売上")
plt.title("広告費用と売上の散布図")
plt.legend()
plt.show()
閾値分析(Piecewise Regressionの実装)
以下のコードで、閾値(転換点)を特定し、分割回帰を行います。
from scipy.optimize import curve_fit
# 分割回帰の関数を定義
def piecewise_linear(x, x0, k1, b1, k2, b2):
return np.where(x < x0, k1 * x + b1, k2 * (x - x0) + k1 * x0 + b1)
# 初期値の設定
initial_guess = [50, 5, 0, 2, 250]
# 分割回帰モデルをフィッティング
params, pcov = curve_fit(piecewise_linear, data['広告費用'], data['売上'], p0=initial_guess)
# フィッティング結果
x0, k1, b1, k2, b2 = params
print(f"閾値(転換点): {x0:.2f}")
print(f"傾き1: {k1:.2f}, 切片1: {b1:.2f}")
print(f"傾き2: {k2:.2f}, 切片2: {b2:.2f}")
# フィッティングされたモデルをプロット
plt.figure(figsize=(8, 5))
plt.scatter(data['広告費用'], data['売上'], label="データ", alpha=0.7)
plt.plot(data['広告費用'], piecewise_linear(data['広告費用'], *params), color="red", label="分割回帰モデル")
plt.axvline(x=x0, color="green", linestyle="--", label=f"閾値: {x0:.2f}")
plt.xlabel("広告費用")
plt.ylabel("売上")
plt.title("広告費用と売上の分割回帰モデル")
plt.legend()
plt.show()
ROIの分析と最適化
広告費用が閾値を超えた場合のROI変化を分析できます。
# ROI計算
data['予測売上'] = piecewise_linear(data['広告費用'], *params)
data['ROI'] = (data['予測売上'] - data['広告費用']) / data['広告費用']
# ROIプロット
plt.figure(figsize=(8, 5))
plt.plot(data['広告費用'], data['ROI'], label="ROI", color="purple")
plt.axvline(x=x0, color="green", linestyle="--", label=f"閾値: {x0:.2f}")
plt.xlabel("広告費用")
plt.ylabel("ROI")
plt.title("広告費用とROIの関係")
plt.legend()
plt.show()
広告費用と売上の閾値分析:考察
1. 分析結果の概要
- 広告費用と売上の関係を分割回帰モデルを用いて分析した結果、広告費用に**閾値(転換点)**が存在することが確認されました。
- 閾値: 広告費用が約 50 のポイントを境に、売上増加の傾向が変化しました。
- 広告費用が50未満では、売上が費用に比例して大きく増加する傾向があり、費用対効果が非常に高い状態。
- 広告費用が50以上では、売上増加のペースが緩やかになり、費用対効果が低下する傾向が見られました。
2. ROIの変化
- 広告費用のROI(費用対効果)を計算した結果、ROIは広告費用が閾値付近(約50)で最大化され、その後は徐々に低下していくことが確認されました。
- 閾値以上の広告費用では、費用の増加に対して売上の増加が鈍化するため、ROIが低下してしまう可能性が高いと考えられます。
3. 考えられる要因
- ターゲットリーチの飽和: 広告費用が増加するにつれて、ターゲット層の新規リーチが減少し、既存顧客への広告が繰り返されている可能性があります。
- 広告クリエイティブの効果限界: 広告のデザインやメッセージが単一である場合、一定以上の広告接触頻度では効果が薄れる(広告疲労)ことが考えられます。
- 競合の影響: 閾値以上の広告費用を投入しても、競合他社の影響により市場シェアを大きく伸ばせない状況が考えられます。
4. 実務への提案
以下の提案を実行することで、広告費用の効率化や売上向上が期待されます:
- 広告費用の最適化
- 広告費用は閾値(約50)前後で維持することで、費用対効果の最大化を図る。
- 閾値を超える投資を行う場合は、追加の広告戦略を導入してROIを改善する必要がある。
- ターゲティングの精緻化
- 閾値を超えた費用でもROIを維持するために、広告ターゲットを精緻化する(例: 新規顧客層へのリーチ強化)。
- データセグメンテーションを行い、広告をパーソナライズすることで、効果的な訴求を行う。
- クリエイティブの改善
- 広告のクリエイティブやメッセージを定期的に更新し、広告疲労を防ぐ。
- A/Bテストを実施して、効果的なデザインやメッセージを特定する。
- チャネルの多様化
- 閾値を超える広告費用の一部を他の広告チャネル(例: SNS広告、リスティング広告)に分散させる。
- 異なるチャネルでのパフォーマンスを比較・分析し、効果的なチャネルを特定する。
5. 今後の展望
今回の分析では、広告費用と売上の閾値が明確化され、最適な広告予算の水準が特定されました。今後は以下のような追加の分析を行うことで、さらに広告戦略を洗練させることが可能です:
競合分析: 他社の広告投資や市場動向を把握し、自社の戦略に活用。
時系列分析: 季節要因やキャンペーン期間中の効果を考慮した売上予測を実施。
CPI/CPA(単価)の計算: 広告効果を詳細に評価し、単位当たりの顧客獲得コストを削減する。