analytics-product について
イベント計測やファネル、コホート、リテンション、実験、プロダクト指標を扱う分析スキルです。測定期間や同意の明確化を重視し、例示値をベンチマークとして扱わないよう促します。
主な機能
- 01イベント分類と計測の指針
- 02ファネルとコホート分析
- 03リテンションと North Star 指標
- 04PostHog のフィーチャーフラグ例
- 05A/B テスト設計と有意性
活用シーン
- 01計測前のプロダクトイベント定義
- 02コンバージョンファネルの離脱調査
- 03コホートリテンションの算出
- 04A/B テストの計画と評価
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ sickn33/ agentic-awesome-skills --skill analytics-productインストール後、Claude Code で/analytics-productを入力して読み込まれたか確認します。
詳細
ANALYTICS-PRODUCT — データで意思決定する
概要
プロダクト分析 — PostHog、Mixpanel、イベント、ファネル、コホート、リテンション、ノーススター指標、OKR、プロダクトダッシュボード。有効化する対象: イベントトラッキングの設定、コンバージョンファネルの作成、コホート分析、リテンション、DAU/MAU、フィーチャーフラグ、A/B テスト、ノーススター指標、OKR、プロダクトダッシュボード。
このスキルを使用する場面
- アクティベーションイベントを定義する場合、ファネルの落ち込みを調査する場合、または分母とウィンドウを明示してリテンションを計算する場合に使用します。
- 計測を実装する前に、プロダクトの意思決定、データソース、適用される同意、タイムゾーン、分析単位を記録してください。
このスキルを使用しない場合
- タスクがプロダクト分析に関係しない場合
- よりシンプルで具体的なツールでリクエストを処理できる場合
- ユーザーがドメイン専門知識を伴わない汎用的な支援を必要としている場合
仕組み
[objeto]_[verbo_passado]
Correto: user_signed_up, conversation_started, upgrade_completed
Errado: signup, click, conversion
Analytics-Product — データで意思決定する
"神を信じる。それ以外の者は全員データを持参せよ。" — W. Edwards Deming
例示: アシスタントのイベント
AURI_EVENTS = {
# Aquisicao
"user_signed_up": {"props": ["source", "medium", "campaign"]},
"onboarding_started": {"props": ["step_count"]},
"onboarding_completed": {"props": ["time_to_complete", "steps_skipped"]},
# Ativacao
"first_conversation": {"props": ["intent", "response_time"]},
"aha_moment_reached": {"props": ["trigger", "session_number"]},
"feature_discovered": {"props": ["feature_name", "discovery_method"]},
# Retencao
"conversation_started": {"props": ["intent", "user_tier", "device"]},
"conversation_completed":{"props": ["messages_count", "duration", "rating"]},
"session_started": {"props": ["days_since_last", "platform"]},
# Receita
"upgrade_viewed": {"props": ["trigger", "current_tier"]},
"upgrade_started": {"props": ["target_tier", "trigger"]},
"upgrade_completed": {"props": ["tier", "plan", "revenue"]},
"subscription_canceled": {"props": ["reason", "tier", "tenure_days"]},
"payment_failed": {"props": ["attempt_count", "error_code"]},
}
Posthog の実装 (Python)
from posthog import Posthog
import os
posthog = Posthog(
project_api_key=os.environ["POSTHOG_API_KEY"],
host=os.environ.get("POSTHOG_HOST", "https://app.posthog.com")
)
def track(user_id: str, event: str, properties: dict = None):
posthog.capture(
distinct_id=user_id,
event=event,
properties=properties or {}
)
def identify(user_id: str, traits: dict):
posthog.identify(
distinct_id=user_id,
properties=traits
)
## Uso:
track("user_123", "conversation_started", {
"intent": "business_advice",
"device": "alexa",
"user_tier": "pro"
})
例示的なアクティベーションファネル (仮の数値)
Visita landing page (100%)
| [meta: 40%]
Clicou "Experimentar" (40%)
| [meta: 70%]
Completou cadastro (28%)
| [meta: 60%]
Fez primeira conversa (17%) <- AHA MOMENT
| [meta: 50%]
Voltou no dia seguinte (8.5%)
| [meta: 40%]
Usou 3+ dias na semana (3.4%)
| [meta: 20%]
Converteu para Pro (0.7%)
ファネルの最適化
Para cada drop-off > benchmark:
1. Identificar: onde exatamente o usuario sai?
2. Entender: por que? (session recordings, surveys)
3. Hipotese: qual mudanca poderia melhorar?
4. Testar: A/B test com amostra estatisticamente significante
5. Medir: janela e amostra predefinidas, efeito com intervalo, qualidade e guardrails
Nao encerrar cedo por um p-value favoravel; investigar SRM e perdas de tracking
6. Aprender: mesmo se falhar, entende-se o usuario melhor
コホート分析 (週次リテンション)
def calculate_cohort_retention(events_df):
"""
events_df: DataFrame com colunas [user_id, event_date, event_name]
Retorna: matriz de retencao [cohort_week x week_number]
"""
import pandas as pd
first_session = events_df[events_df.event_name == "session_started"] \
.groupby("user_id")["event_date"].min() \
.dt.to_period("W")
sessions = events_df[events_df.event_name == "session_started"].copy()
sessions["cohort"] = sessions["user_id"].map(first_session)
sessions["weeks_since"] = (
sessions["event_date"].dt.to_period("W") - sessions["cohort"]
).apply(lambda x: x.n)
cohort_data = sessions.groupby(["cohort", "weeks_since"])["user_id"].nunique()
cohort_sizes = cohort_data.unstack().iloc[:, 0]
retention = cohort_data.unstack().divide(cohort_sizes, axis=0) * 100
return retention
例示的なリテンションの範囲 (市場のベンチマークではありません)
これらの数値には外部の出典や検証がありません。形式の例としてのみ使用し、比較可能で成熟したコホートから観測されたベースラインに置き換えてください。
| 週 | 範囲 A | 範囲 B | 範囲 C | 範囲 D |
|---|---|---|---|---|
| W1 | <20% | 20-35% | 35-50% | >50% |
| W4 | <10% | 10-20% | 20-30% | >30% |
| W8 | <5% | 5-12% | 12-20% | >20% |
例示的なノーススターの仮説
Framework:
1. O que cria valor real para o usuario? -> Conversas que geram insight/acao
2. Hipotese a validar: usuarios com 3+ conversas/semana recebem valor recorrente
3. Como medir? -> "Weekly Active Conversationalists" (WAC)
North Star: WAC (Weekly Active Conversationalists)
Definicao: Usuarios com >= 3 conversas na semana que duraram >= 2 minutos
Meta Ano 1: 10.000 WAC
Meta Ano 2: 100.000 WAC
ノーススターダッシュボード
スケッチ: db.query と calculate_wow_growth をプロジェクトに合わせて調整してください。明示的なウィンドウ境界と同じタイムゾーンを使用し、集計結果ではユーザーごとに 1 行ではなく、条件を満たすユーザーをカウントしてください。
def calculate_north_star(db, window_start, window_end):
wac = db.query("""
SELECT COUNT(*) as wac
FROM (
SELECT user_id
FROM conversations
WHERE created_at >= :window_start AND created_at < :window_end
AND duration_seconds >= 120
GROUP BY user_id
HAVING COUNT(*) >= 3
) AS qualifying_users
""", {"window_start": window_start, "window_end": window_end}).scalar()
return {
"wac": wac,
"wow_growth": calculate_wow_growth(db, "wac"),
"target": 10000,
"progress": f"{wac/10000*100:.1f}%"
}
Posthog によるフィーチャーフラグ
インストールされているバージョンの API を使用してください。現在の SDK は evaluate_flags を提供しています。古いバージョンでは、feature_enabled の順序は (feature, user_id) でした。エラー時または値が存在しない場合は、安全な制御フローを維持してください。詳細は公式 Python ドキュメントを参照してください。プロジェクトの承認と同意ルールの前に、イベントや識別情報を送信しないでください。
def is_feature_enabled(user_id: str, feature: str) -> bool:
flags = posthog.evaluate_flags(user_id)
return flags.is_enabled(feature) is True
if is_feature_enabled(user_id, "new-onboarding-v2"):
show_new_onboarding()
else:
show_old_onboarding()
統計的有意差計算ツール
from scipy import stats
def ab_test_significance(
control_conversions: int,
control_visitors: int,
variant_conversions: int,
variant_visitors: int,
confidence: float = 0.95
) -> dict:
counts = (control_conversions, control_visitors, variant_conversions, variant_visitors)
if any(type(value) is not int or value < 0 for value in counts):
raise ValueError("Contagens devem ser inteiros nao negativos")
if not (0 < control_visitors and 0 < variant_visitors
and control_conversions <= control_visitors
and variant_conversions <= variant_visitors and 0 < confidence < 1):
raise ValueError("Denominadores, conversoes ou confianca invalidos")
control_rate = control_conversions / control_visitors
variant_rate = variant_conversions / variant_visitors
lift = (variant_rate - control_rate) / control_rate * 100 if control_rate else None
table = [
[control_conversions, control_visitors - control_conversions],
[variant_conversions, variant_visitors - variant_conversions]
]
if any(sum(row) == 0 for row in zip(*table)):
return {"status": "insufficient-variation", "recommendation": "No automatic decision"}
_, p_value, _, expected = stats.chi2_contingency(table)
if (expected < 5).any():
return {"status": "sparse-counts", "recommendation": "Use a pre-specified exact method"}
significant = p_value < (1 - confidence)
return {
"control_rate": f"{control_rate*100:.2f}%",
"variant_rate": f"{variant_rate*100:.2f}%",
"lift": f"{lift:+.1f}%" if lift is not None else None,
"p_value": round(p_value, 4),
"significant": significant,
"absolute_difference_pp": (variant_rate - control_rate) * 100,
"recommendation": "Review pre-specified effect, uncertainty and guardrails; no automatic deploy"
}
6. プロンプトの提案 (クライアントにコマンドをインストールしません)
| コマンド | アクション |
|---|---|
/event-taxonomy | イベントのタクソノミーを定義する |
/funnel-analysis | コンバージョンファネルを分析する |
/cohort-retention | コホートごとのリテンションを計算する |
/north-star | ノーススター指標を定義または見直す |
/ab-test | A/B テストの有意差を計算する |
/dashboard-setup | プロダクトダッシュボードを作成する |
/okr-template | プロダクト向け OKR のテンプレート |
検証可能な例
合成入力: 閉じたウィンドウ内で、ユーザー A は 120 秒の会話を 3 件、B は 2 件、C は 60 秒の会話を 4 件持っています。期待される WAC の結果は 1 であり、値 1 を持つ複数の行ではありません。リテンションでは、コホートのサイズと観測可能な経過期間を報告してください。まだ終了していない週は、リテンションがゼロであることを意味しません。
実験では、テストを計算する前に、ランダム化単位、主要指標、ウィンドウ、最小効果、停止ルール、ガードレールを記録してください。有意差の例は、無効な分母と疎なカウントを棄却します。これはロールアウトの意思決定メカニズムではありません。
制限事項
- 上記の目標、範囲、アシスタントイベントは仮定のものであり、ベンチマークやユーザーの行動を証明するものではありません。
- コホートの抜粋は、すでに正規化されたタイムスタンプと完全なデータを前提としています。未成熟な週はマスクする必要があり、ユーザーのいないコホートをゼロで除算してはいけません。
- 単独の p 値はプロダクトの価値を測るものではなく、バイアスを排除するものでも、信頼区間や実験デザインの代わりになるものでもありません。
- SDK は外部サービスにデータを送信する可能性があります。トラッキングを有効化する前に、プロパティを最小限に抑え、会話テキストを避け、同意、データレジデンシー、保持期間を検証してください。
- データベースとインターフェースの例はプロジェクトのアダプターに依存しており、完成したアプリケーションを表すものではありません。