1.解決したい課題
ライブ配信プラットフォームでは、視聴者個別の入退場時刻を取得できない場合が多い。配信者が知れる情報は通常以下に限られる:
- 同時接続数の時系列カーブ(誰が居るかは分からない)
- 誰がいつコメントしたかの履歴
この制約下で「配信が長くなるにつれて、初期視聴者がどれだけ離脱したか」を測りたい。同接カーブの減衰だけでは「新規流入と離脱が相殺されて減らない」ケースを見落とす。コメント履歴に基づく per-user 維持率の計測が必要である。
2.手法の概要
配信全体の時間軸を N 等分のセグメントに区切る(既定 N = 4)。各セグメントについて、そこでコメントしたユーザーの集合 Ui を作る。最初のセグメントの集合 U0 を base set とする。
各セグメントの生存率を以下で定義する:
これにより、初期にコメントしていたユーザーがどの段階でどれだけコメント参加を続けているかが分かる。
3.アルゴリズム詳細
3-1. 入力データ
{ capturedAt: 1714532400000, userId: "u-12345" }
3-2. ステップ
- 有効なコメント(capturedAt が正の数 + userId が空でない)のみ抽出
- capturedAt 昇順にソート
- first / last を取得し、span = max(1, last − first) で N 等分
- 各コメントを bin = floor((at − first) / segSpan) のセグメントに振り分け、
Set<userId>に追加 - U0 を base として、各 Ui との交差を取る
- retentionPct = present / baseUserCount × 100 を 0.1% 刻みで丸める
4.参考実装(JavaScript / 純粋関数)
export function buildCommenterSurvivalCurve(comments, opts = {}) {
const segmentCount = opts.segmentCount > 0
? Math.floor(opts.segmentCount) : 4;
const valid = [];
for (const c of comments || []) {
if (!c?.capturedAt || !Number.isFinite(c.capturedAt)) continue;
const uid = String(c.userId ?? '').trim();
if (!uid) continue;
valid.push({ at: c.capturedAt, uid });
}
if (!valid.length) return { baseUserCount: 0, segments: [] };
valid.sort((a, b) => a.at - b.at);
const firstAt = valid[0].at;
const lastAt = valid[valid.length - 1].at;
const segSpan = Math.max(1, lastAt - firstAt) / segmentCount;
const segUsers = Array.from({ length: segmentCount }, () => new Set());
for (const v of valid) {
let idx = Math.floor((v.at - firstAt) / segSpan);
if (idx >= segmentCount) idx = segmentCount - 1;
segUsers[idx].add(v.uid);
}
const base = segUsers[0];
const baseUserCount = base.size;
const segments = segUsers.map((users, i) => {
let present = 0;
for (const u of base) if (users.has(u)) present += 1;
return {
segmentIndex: i,
presentCount: present,
retentionPct: baseUserCount > 0
? Math.round((present / baseUserCount) * 1000) / 10 : 0
};
});
return { baseUserCount, segments };
}
5.なぜこの設計なのか
5-1. なぜ「最初のセグメント」を base にするのか
配信開始 ~ 序盤にコメントしたユーザーは「視聴を意図的に開始した能動的視聴者」であり、最も信頼できる "母集団" である。途中流入のユーザーは流入時刻のばらつきが大きく、生存曲線の base にすると曲線の解釈が困難になる。
5-2. なぜコメント参加で測るのか
個別の入退場ログが取れない以上、視聴維持を直接測れない。コメントは「能動的に参加し続けている」シグナルなので、視聴維持の下限の代替指標として有効である(実際の視聴者は出力されたコメンターよりも多い)。
5-3. なぜ N=4 が既定か
30 分 ~ 数時間の配信を 4 分割すると、序盤・中盤前半・中盤後半・終盤にちょうど対応する。さらに細かくすると 1 セグメントあたりの観測コメ数が減って統計ノイズが増える。多くの実用ケースで N=4 が解釈と精度のバランスが良い。
6.既知の限界と拡張可能性
- 「コメントしないが視聴している」ユーザーは捕捉できない: 生存率は実際の視聴維持率より低い値になる。
- セグメント境界依存: ちょうど境界をまたぐタイミングでコメントが減るとノイズ的に見える。
- 拡張: per-segment 新規流入数を併記して、生存曲線と入れ替わりの両側を可視化できる。
- 拡張: 複数 base 比較(最初のセグメントの新規/常連/高頻度コメンター別の生存率)。
7.関連する既知技術(先行技術)
7-1. Kaplan-Meier Estimator (1958)
医学統計の生存曲線。打ち切り(censoring)を扱える点が本手法より高度だが、ライブ配信のコメント維持には打ち切りの概念が薄く、より単純な交差集合計算で実用十分。本手法は KM 推定量の離散セグメント版に相当する。
7-2. Cohort Retention Analysis
SaaS / ゲーム業界で広く使われる「コホート別維持率」分析。「日次・月次の新規ユーザーがその後の各時点で何 % アクティブか」を行列で示す。本手法はそれをライブ配信の1 配信内の時間軸に応用した特殊形である。
7-3. ライブ配信プラットフォームの維持率指標
YouTube Studio や Twitch Analytics には「平均視聴時間」「視聴者維持率グラフ」等の指標があるが、それらはプラットフォーム側の閲覧ログに依存する。サードパーティ拡張機能が公開コメント情報のみから維持率を推定する公知の実装例は、本記事執筆時点で著者は確認していない。
8.本記事の位置づけ・ライセンス
本記事は、Chrome 拡張機能『君斗りんくの追憶のきらめき』内で 2026 年 4 月 30 日(バージョン 0.1.23)に投入された commenterSurvivalCurve.js モジュールの設計思想と実装を、2026 年 5 月 1 日付で公開するものである。
参考実装は MIT、本記事文章は CC BY 4.0 のもとで自由に複製・引用可。
https://tsuioku-no-kirameki.com/articles/commenter-survival-curve.html