朝イチの定例、ダッシュボードは“昨日より改善”と示すのに、CSは「そんな実感ない」と首をかしげる——よく見ると、肝心のイベントが0件。誰も悪くないのに、議論は迷子になる。
結論:データ品質は「欠損・重複・異常」を検知したら、迷わず止める→直す→再開の順で運用すること。止血の速さがPdMの意思決定を守ります。
1. データ品質とは(ねらい→やること→失敗と直し方)
ねらいは、チームが同じ数字を同じ意味で読み、5分で判定できる状態を守ること。やることは①欠損 ②重複 ③異常の3種を最優先で監視・対処すること。失敗は、完全なDWHや複雑な監視から始めてしまうこと。直すなら、まずはAha/TTV/翌日活性に直結するイベントだけに絞って品質を担保します。
価値と短期運用の全体像は課題解決型PdM 完全ガイド/価値提供型PdMの設計図でつながります。
2. 3つの不良を“先行指標”で定義する
品質は一般論にすると曖昧になります。PdMは先行3指標(Aha/TTV/D1)に紐づけて定義しましょう。
- 欠損(Missing):Aha(
save_success)や翌日直行(resume_opened)が集計日に0件。 - 重複(Duplicate):同一ユーザーの連続
save_successを複数回カウント。 - 異常(Outlier/Invalid):TTVが負の値、P95が極端に跳ねる、プロパティが未定義。
計測の並べ方はKPI設計と運用ガイド(Aha→TTV→翌日活性)に合わせると迷いません。
3. ガードレール(擬似コード):“止める→直す→再開”
会議を守る一番のコツは、基準をコードで共有しておくこと。下記はそのまま仕様に貼れます。
guard required_events = ["save_success","resume_opened"]
guard min_daily = 1 # どちらかが0なら停止
guard dup_window_sec = 30 # 連続成功は30秒内を1件に集約
guard ttv_valid = ttv >= 0 && ttv <= 24h
on daily_check():
if count(event in required_events where date=today)==0:
pause_aggregation("必須イベント欠損")
notify("#release-data","欠損のため停止")
return
dedupe("save_success", within=dup_window_sec)
if not all(ttv_valid):
exclude_invalid("TTV外れ値/負値")
flag("quality_warning")
on resume():
backfill_missing() # 欠損の補填
annotate("施行日", today)
resume_aggregation()
4. 監視の設計:毎日4枚+品質カード1枚
見るものを増やすほど判断は鈍ります。先行3指標+新規比率の“毎日4枚”に、品質カードを1枚だけ追加します。
#ダッシュボード(毎日)
1) Aha達成率(event=save_success)
2) TTV P50/P95(first_open→save_success)
3) 翌日活性(resume_opened直行率)
4) 新規比率
#品質カード(毎日)
・必須イベント件数(save_success/resume_opened)
・重複除外件数(day, user, session)
・TTV外れ値除外件数(負値/閾値超過)
・施行日(定義変更や補填の注記)
5. 直し方パターン辞典(そのまま運用)
発生頻度が高い順に“手当て”を置いておきます。現場ではここだけ使えば回ります。
- 欠損:収集停止・タグ外れ・キュー詰まり。
→ 対処:集計を一時停止→該当日の欠損をバックフィル→施行日注記。 - 重複:UIの連打・リトライで多重送信。
→ 対処:セッション内30秒デデュープ→再計算→差分の影響幅を告知。 - 異常:タイムゾーン不整合・時計ズレ・負値。
→ 対処:負値/±24h超は除外→TTVの計算に施行日を適用。
6. チェックSQL/疑似クエリ(コピペ可・概念)
実環境の方言に合わせて置換すれば、そのまま使えます。考え方の骨格だけ掴んでください。
-- 必須イベントの欠損
SELECT date, sum(event='save_success') AS aha, sum(event='resume_opened') AS d1
FROM events WHERE date = CURRENT_DATE GROUP BY date;
-- 連続成功のデデュープ(30秒以内)
SELECT user_id, session_id, MIN(timestamp) AS ts
FROM events
WHERE event='save_success'
GROUP BY user_id, session_id, TIMESTAMP_BUCKET(timestamp, INTERVAL 30 SECOND);
-- TTVの負値/外れ値除外
SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY ttv_sec) AS ttv_p50
FROM (
SELECT TIMESTAMPDIFF(SECOND, first_open, save_success) AS ttv_sec
FROM pairs
WHERE ttv_sec BETWEEN 0 AND 86400
);
7. PRD断片&RACI(品質の“持ち主”を明確に)
品質は“誰の仕事か”が曖昧だと続きません。PRDに1枚で持ち主と基準を固定します。
【PRD断片】
非スコープ:定義のない数値/品質カードなしのグラフは会議に持ち込まない
基準:必須イベント=save_success/resume_opened。30秒デデュープ/負値除外は必須
評価(KR):Aha +5pp/TTV P50 −2分/翌日活性 +4pp(旧比)
撤退条件:Aha +3pp未満 × TTV悪化 → 旧版へ戻す(施行日注記)
【RACI】
Owner(R):PdMリード
Steward(A):データ担当(品質カード/施行日更新)
Custodian(C):エンジニア(計測修復/再送)
Consumer(I):CS/Biz(影響共有)
8. 会議10分台本&Slack定型文(読み上げで終了)
説明会をやめて判定会に。差分→品質→入替を言い切ります。Slackは告知テンプレを固定しましょう。
【会議10分台本】
[00-02] 先週差分:Aha +pp/TTV −分/翌日活性 +pp
[02-04] 品質カード:欠損0/デデュープX件/外れ値Y件/施行日
[04-07] 入替:撤退/継続/新規(PRD断片へ反映)
[07-10] リスク:法務/信頼性/計測基盤は別レーン
【Slack(#release-data)】
品質更新:save_success 連続成功の30秒デデュープ適用。施行=2025-09-01。
影響:Aha −1.1pp 見込み(過去比較は施行日で分割)。
運用:ダッシュボード/PRD反映済。今週KR=Aha +5pp/TTV −2分/D1 +4pp。
9. 7日ロードマップ(ゼロから導入)
- Day1:必須イベント(Aha/D1)を確認、品質カードに数式を記載。
- Day2:30秒デデュープとTTV外れ値除外のロジックを実装。
- Day3:監視ジョブ(欠損/外れ値)→Slack通知を接続。
- Day4:施行日注記の運用をドキュメント化、グラフに縦線を表示。
- Day5:PRD断片/RACIを1枚化、関係者にレビュー。
- Day6:試験的な欠損/重複の発生を仮想再現→復旧訓練。
- Day7:会議台本で初回レビュー→入替と学習を5行ログに記録。
10. 今日から使うチェックリスト(30秒)
□ 必須イベント(save_success/resume_opened)が0なら集計停止できる
□ 30秒デデュープとTTV外れ値除外が実装済み
□ 品質カード(欠損/重複/外れ値/施行日)が毎日見られる
□ 施行日でグラフを分割(巻き戻り防止)
□ PRD断片とRACIが配布済み(誰が直すかが明確)
FAQ(見えるブロック)
- Q. 欠損が出たまま運用を続けてもいい?
- A. いいえ。先行指標が読めなくなるので、一時停止→補填→施行日注記→再開の順で必ず対処します。
- Q. デデュープの窓は30秒が正解?
- A. 目安です。連打やリトライの実情に合わせて±15秒で調整し、施行日に紐づけて管理します。
- Q. 品質改善で数値が下がるのが怖いです。
- A. 正しい下がりは信頼の上がり。施行日でグラフ分割し、“差分で読む文化”に切り替えましょう。
品質運用テンプレ(PDF)
ガードレール擬似コード/チェックSQL/品質カードの型/会議台本/Slack定型文を1ファイルに。
PdM初心者のための仕事大全【保存版】 /
PdMキャリア戦略:ゼロイチ〜スケールの実務
特典:PdMスキルテンプレート集(PDF)/キャリア戦略シート(PDF)


コメント