kanmi-perf-revenue 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +196 -186
- package/dist/empirical/ab-testing.d.ts +83 -0
- package/dist/empirical/ab-testing.d.ts.map +1 -0
- package/dist/empirical/ab-testing.js +281 -0
- package/dist/empirical/ab-testing.js.map +1 -0
- package/dist/empirical/alerting.d.ts +85 -0
- package/dist/empirical/alerting.d.ts.map +1 -0
- package/dist/empirical/alerting.js +358 -0
- package/dist/empirical/alerting.js.map +1 -0
- package/dist/empirical/attribution.d.ts +80 -0
- package/dist/empirical/attribution.d.ts.map +1 -0
- package/dist/empirical/attribution.js +305 -0
- package/dist/empirical/attribution.js.map +1 -0
- package/dist/empirical/cohort.d.ts +75 -0
- package/dist/empirical/cohort.d.ts.map +1 -0
- package/dist/empirical/cohort.js +305 -0
- package/dist/empirical/cohort.js.map +1 -0
- package/dist/empirical/conversion-curve.d.ts +7 -10
- package/dist/empirical/conversion-curve.d.ts.map +1 -1
- package/dist/empirical/conversion-curve.js +37 -4
- package/dist/empirical/conversion-curve.js.map +1 -1
- package/dist/empirical/correlation.d.ts +91 -0
- package/dist/empirical/correlation.d.ts.map +1 -0
- package/dist/empirical/correlation.js +461 -0
- package/dist/empirical/correlation.js.map +1 -0
- package/dist/empirical/data-import.d.ts +22 -0
- package/dist/empirical/data-import.d.ts.map +1 -1
- package/dist/empirical/data-import.js +44 -0
- package/dist/empirical/data-import.js.map +1 -1
- package/dist/empirical/datadog-session-query.d.ts +32 -0
- package/dist/empirical/datadog-session-query.d.ts.map +1 -1
- package/dist/empirical/datadog-session-query.js +238 -17
- package/dist/empirical/datadog-session-query.js.map +1 -1
- package/dist/empirical/engagement-analysis.d.ts +112 -0
- package/dist/empirical/engagement-analysis.d.ts.map +1 -0
- package/dist/empirical/engagement-analysis.js +354 -0
- package/dist/empirical/engagement-analysis.js.map +1 -0
- package/dist/empirical/export.d.ts +75 -0
- package/dist/empirical/export.d.ts.map +1 -0
- package/dist/empirical/export.js +392 -0
- package/dist/empirical/export.js.map +1 -0
- package/dist/empirical/forecasting.d.ts +80 -0
- package/dist/empirical/forecasting.d.ts.map +1 -0
- package/dist/empirical/forecasting.js +287 -0
- package/dist/empirical/forecasting.js.map +1 -0
- package/dist/empirical/funnel.d.ts +66 -0
- package/dist/empirical/funnel.d.ts.map +1 -0
- package/dist/empirical/funnel.js +293 -0
- package/dist/empirical/funnel.js.map +1 -0
- package/dist/empirical/history.d.ts +198 -0
- package/dist/empirical/history.d.ts.map +1 -0
- package/dist/empirical/history.js +396 -0
- package/dist/empirical/history.js.map +1 -0
- package/dist/empirical/index.d.ts +39 -16
- package/dist/empirical/index.d.ts.map +1 -1
- package/dist/empirical/index.js +95 -13
- package/dist/empirical/index.js.map +1 -1
- package/dist/empirical/interactions.d.ts +89 -0
- package/dist/empirical/interactions.d.ts.map +1 -0
- package/dist/empirical/interactions.js +346 -0
- package/dist/empirical/interactions.js.map +1 -0
- package/dist/empirical/opportunity-calculator.d.ts +6 -18
- package/dist/empirical/opportunity-calculator.d.ts.map +1 -1
- package/dist/empirical/opportunity-calculator.js +19 -1
- package/dist/empirical/opportunity-calculator.js.map +1 -1
- package/dist/empirical/report.d.ts +3 -11
- package/dist/empirical/report.d.ts.map +1 -1
- package/dist/empirical/report.js +11 -7
- package/dist/empirical/report.js.map +1 -1
- package/dist/empirical/roi-calculator.d.ts +104 -0
- package/dist/empirical/roi-calculator.d.ts.map +1 -0
- package/dist/empirical/roi-calculator.js +403 -0
- package/dist/empirical/roi-calculator.js.map +1 -0
- package/dist/empirical/seasonality.d.ts +80 -0
- package/dist/empirical/seasonality.d.ts.map +1 -0
- package/dist/empirical/seasonality.js +340 -0
- package/dist/empirical/seasonality.js.map +1 -0
- package/dist/empirical/segmentation.d.ts +135 -0
- package/dist/empirical/segmentation.d.ts.map +1 -0
- package/dist/empirical/segmentation.js +379 -0
- package/dist/empirical/segmentation.js.map +1 -0
- package/dist/empirical/statistics.d.ts +118 -0
- package/dist/empirical/statistics.d.ts.map +1 -0
- package/dist/empirical/statistics.js +344 -0
- package/dist/empirical/statistics.js.map +1 -0
- package/dist/empirical/sweet-spot.d.ts +81 -0
- package/dist/empirical/sweet-spot.d.ts.map +1 -0
- package/dist/empirical/sweet-spot.js +198 -0
- package/dist/empirical/sweet-spot.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cohort Analysis
|
|
3
|
+
*
|
|
4
|
+
* Track same users over time to understand:
|
|
5
|
+
* - How does performance affect repeat purchases?
|
|
6
|
+
* - Do users with good first-experience return more?
|
|
7
|
+
* - Lifetime value by performance cohort
|
|
8
|
+
*
|
|
9
|
+
* @author Kanmi Obasa <i@kanmiobasa.com>
|
|
10
|
+
*/
|
|
11
|
+
// =============================================================================
|
|
12
|
+
// PERFORMANCE COHORT ANALYSIS
|
|
13
|
+
// =============================================================================
|
|
14
|
+
/**
|
|
15
|
+
* Analyze users by performance cohort.
|
|
16
|
+
*/
|
|
17
|
+
export function analyzePerformanceCohorts(sessions, metric = 'lcp') {
|
|
18
|
+
// Group sessions by user
|
|
19
|
+
const userSessions = groupByUser(sessions);
|
|
20
|
+
// Define cohorts
|
|
21
|
+
const cohortDefinitions = getCohortDefinitions(metric);
|
|
22
|
+
const cohorts = [];
|
|
23
|
+
for (const def of cohortDefinitions) {
|
|
24
|
+
const usersInCohort = new Map();
|
|
25
|
+
// Find users whose FIRST session falls in this performance range
|
|
26
|
+
for (const [userId, userSessionList] of userSessions) {
|
|
27
|
+
if (userSessionList.length === 0)
|
|
28
|
+
continue;
|
|
29
|
+
// Sort by timestamp to find first session
|
|
30
|
+
const sorted = [...userSessionList].sort((a, b) => (a.timestamp || '').localeCompare(b.timestamp || ''));
|
|
31
|
+
const firstSession = sorted[0];
|
|
32
|
+
const metricValue = getMetricValue(firstSession, metric);
|
|
33
|
+
if (metricValue !== null && metricValue >= def.min && metricValue < def.max) {
|
|
34
|
+
usersInCohort.set(userId, userSessionList);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (usersInCohort.size === 0)
|
|
38
|
+
continue;
|
|
39
|
+
// Calculate cohort metrics
|
|
40
|
+
let totalSessions = 0;
|
|
41
|
+
let firstSessionConversions = 0;
|
|
42
|
+
let repeatPurchases = 0;
|
|
43
|
+
let totalRevenue = 0;
|
|
44
|
+
let purchaseCount = 0;
|
|
45
|
+
for (const [_userId, userSessionList] of usersInCohort) {
|
|
46
|
+
totalSessions += userSessionList.length;
|
|
47
|
+
const sorted = [...userSessionList].sort((a, b) => (a.timestamp || '').localeCompare(b.timestamp || ''));
|
|
48
|
+
// First session conversion
|
|
49
|
+
if (sorted[0].has_purchase) {
|
|
50
|
+
firstSessionConversions++;
|
|
51
|
+
purchaseCount++;
|
|
52
|
+
totalRevenue += sorted[0].purchase_value;
|
|
53
|
+
}
|
|
54
|
+
// Repeat purchases (any subsequent conversion)
|
|
55
|
+
const repeatConversions = sorted.slice(1).filter(s => s.has_purchase);
|
|
56
|
+
if (repeatConversions.length > 0) {
|
|
57
|
+
repeatPurchases++;
|
|
58
|
+
purchaseCount += repeatConversions.length;
|
|
59
|
+
totalRevenue += repeatConversions.reduce((sum, s) => sum + s.purchase_value, 0);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const uniqueUsers = usersInCohort.size;
|
|
63
|
+
const aov = purchaseCount > 0 ? totalRevenue / purchaseCount : 0;
|
|
64
|
+
const ltv = uniqueUsers > 0 ? totalRevenue / uniqueUsers : 0;
|
|
65
|
+
cohorts.push({
|
|
66
|
+
cohortId: def.id,
|
|
67
|
+
description: def.description,
|
|
68
|
+
range: { min: def.min, max: def.max },
|
|
69
|
+
uniqueUsers,
|
|
70
|
+
totalSessions,
|
|
71
|
+
avgSessionsPerUser: uniqueUsers > 0 ? totalSessions / uniqueUsers : 0,
|
|
72
|
+
firstSessionCvr: uniqueUsers > 0 ? firstSessionConversions / uniqueUsers : 0,
|
|
73
|
+
repeatPurchaseRate: uniqueUsers > 0 ? repeatPurchases / uniqueUsers : 0,
|
|
74
|
+
aov,
|
|
75
|
+
ltv,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
// Generate insights
|
|
79
|
+
const insights = [];
|
|
80
|
+
const recommendations = [];
|
|
81
|
+
if (cohorts.length >= 2) {
|
|
82
|
+
const best = cohorts.reduce((a, b) => a.ltv > b.ltv ? a : b);
|
|
83
|
+
const worst = cohorts.reduce((a, b) => a.ltv < b.ltv ? a : b);
|
|
84
|
+
if (best.ltv > worst.ltv * 1.2 && best.uniqueUsers >= 10 && worst.uniqueUsers >= 10) {
|
|
85
|
+
insights.push(`Users with ${best.description} have ${((best.ltv / worst.ltv - 1) * 100).toFixed(0)}% higher LTV than ${worst.description}`);
|
|
86
|
+
}
|
|
87
|
+
const goodCohort = cohorts.find(c => c.cohortId === 'good');
|
|
88
|
+
const poorCohort = cohorts.find(c => c.cohortId === 'poor');
|
|
89
|
+
if (goodCohort && poorCohort) {
|
|
90
|
+
if (goodCohort.repeatPurchaseRate > poorCohort.repeatPurchaseRate * 1.2) {
|
|
91
|
+
insights.push(`Good performance users are ${((goodCohort.repeatPurchaseRate / poorCohort.repeatPurchaseRate - 1) * 100).toFixed(0)}% more likely to make repeat purchases`);
|
|
92
|
+
recommendations.push('Improving first-session performance increases customer lifetime value');
|
|
93
|
+
}
|
|
94
|
+
if (goodCohort.avgSessionsPerUser > poorCohort.avgSessionsPerUser * 1.1) {
|
|
95
|
+
insights.push(`Good performance users return ${((goodCohort.avgSessionsPerUser / poorCohort.avgSessionsPerUser - 1) * 100).toFixed(0)}% more often`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
type: 'performance',
|
|
101
|
+
performanceCohorts: cohorts,
|
|
102
|
+
insights,
|
|
103
|
+
recommendations,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Analyze users by acquisition time cohort.
|
|
108
|
+
*/
|
|
109
|
+
export function analyzeTimeCohorts(sessions) {
|
|
110
|
+
// Group sessions by user
|
|
111
|
+
const userSessions = groupByUser(sessions);
|
|
112
|
+
// Determine acquisition week for each user
|
|
113
|
+
const userAcquisition = new Map();
|
|
114
|
+
for (const [userId, userSessionList] of userSessions) {
|
|
115
|
+
const sorted = [...userSessionList].sort((a, b) => (a.timestamp || '').localeCompare(b.timestamp || ''));
|
|
116
|
+
const firstSession = sorted[0];
|
|
117
|
+
const acquisitionWeek = getWeekId(new Date(firstSession.timestamp || Date.now()));
|
|
118
|
+
userAcquisition.set(userId, {
|
|
119
|
+
week: acquisitionWeek,
|
|
120
|
+
sessions: userSessionList,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
// Group by acquisition week
|
|
124
|
+
const weeklyUsers = new Map();
|
|
125
|
+
for (const [userId, data] of userAcquisition) {
|
|
126
|
+
if (!weeklyUsers.has(data.week)) {
|
|
127
|
+
weeklyUsers.set(data.week, new Map());
|
|
128
|
+
}
|
|
129
|
+
weeklyUsers.get(data.week).set(userId, data.sessions);
|
|
130
|
+
}
|
|
131
|
+
// Build cohort analysis
|
|
132
|
+
const timeCohorts = [];
|
|
133
|
+
const sortedWeeks = Array.from(weeklyUsers.keys()).sort();
|
|
134
|
+
for (const weekId of sortedWeeks) {
|
|
135
|
+
const usersThisWeek = weeklyUsers.get(weekId);
|
|
136
|
+
const newUsers = usersThisWeek.size;
|
|
137
|
+
let week0Conversions = 0;
|
|
138
|
+
let week1Conversions = 0;
|
|
139
|
+
let week2Conversions = 0;
|
|
140
|
+
let week3PlusConversions = 0;
|
|
141
|
+
for (const [_userId, userSessionList] of usersThisWeek) {
|
|
142
|
+
for (const session of userSessionList) {
|
|
143
|
+
if (!session.has_purchase)
|
|
144
|
+
continue;
|
|
145
|
+
const sessionWeek = getWeekId(new Date(session.timestamp || Date.now()));
|
|
146
|
+
const weekDiff = getWeekDiff(weekId, sessionWeek);
|
|
147
|
+
if (weekDiff === 0)
|
|
148
|
+
week0Conversions++;
|
|
149
|
+
else if (weekDiff === 1)
|
|
150
|
+
week1Conversions++;
|
|
151
|
+
else if (weekDiff === 2)
|
|
152
|
+
week2Conversions++;
|
|
153
|
+
else
|
|
154
|
+
week3PlusConversions++;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
const totalConversions = week0Conversions + week1Conversions + week2Conversions + week3PlusConversions;
|
|
158
|
+
const returnedUsers = new Set();
|
|
159
|
+
for (const [userId, userSessionList] of usersThisWeek) {
|
|
160
|
+
const hasLaterSession = userSessionList.some(s => {
|
|
161
|
+
const sessionWeek = getWeekId(new Date(s.timestamp || Date.now()));
|
|
162
|
+
return getWeekDiff(weekId, sessionWeek) > 0;
|
|
163
|
+
});
|
|
164
|
+
if (hasLaterSession) {
|
|
165
|
+
returnedUsers.add(userId);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
timeCohorts.push({
|
|
169
|
+
weekId,
|
|
170
|
+
newUsers,
|
|
171
|
+
week0Conversions,
|
|
172
|
+
week1Conversions,
|
|
173
|
+
week2Conversions,
|
|
174
|
+
week3PlusConversions,
|
|
175
|
+
totalConversions,
|
|
176
|
+
retentionRate: newUsers > 0 ? returnedUsers.size / newUsers : 0,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
// Generate insights
|
|
180
|
+
const insights = [];
|
|
181
|
+
const recommendations = [];
|
|
182
|
+
if (timeCohorts.length >= 3) {
|
|
183
|
+
const avgRetention = timeCohorts.reduce((sum, c) => sum + c.retentionRate, 0) / timeCohorts.length;
|
|
184
|
+
insights.push(`Average week-over-week retention: ${(avgRetention * 100).toFixed(1)}%`);
|
|
185
|
+
const recentCohorts = timeCohorts.slice(-3);
|
|
186
|
+
const recentAvg = recentCohorts.reduce((sum, c) => sum + c.retentionRate, 0) / recentCohorts.length;
|
|
187
|
+
if (recentAvg > avgRetention * 1.1) {
|
|
188
|
+
insights.push('Retention trending upward in recent cohorts');
|
|
189
|
+
}
|
|
190
|
+
else if (recentAvg < avgRetention * 0.9) {
|
|
191
|
+
insights.push('Retention trending downward - investigate recent changes');
|
|
192
|
+
recommendations.push('Review recent performance changes that may affect user retention');
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return {
|
|
196
|
+
type: 'time',
|
|
197
|
+
timeCohorts,
|
|
198
|
+
insights,
|
|
199
|
+
recommendations,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
// =============================================================================
|
|
203
|
+
// REPORT GENERATION
|
|
204
|
+
// =============================================================================
|
|
205
|
+
/**
|
|
206
|
+
* Generate markdown report for cohort analysis.
|
|
207
|
+
*/
|
|
208
|
+
export function generateCohortMarkdown(analysis) {
|
|
209
|
+
const lines = [];
|
|
210
|
+
lines.push('## Cohort Analysis');
|
|
211
|
+
lines.push('');
|
|
212
|
+
if (analysis.performanceCohorts) {
|
|
213
|
+
lines.push('### Performance Cohorts');
|
|
214
|
+
lines.push('');
|
|
215
|
+
lines.push('Users grouped by their first-session performance.');
|
|
216
|
+
lines.push('');
|
|
217
|
+
lines.push('| Cohort | Users | Sessions/User | First CVR | Repeat Rate | LTV |');
|
|
218
|
+
lines.push('|--------|-------|---------------|-----------|-------------|-----|');
|
|
219
|
+
for (const cohort of analysis.performanceCohorts) {
|
|
220
|
+
lines.push(`| ${cohort.description} | ${cohort.uniqueUsers.toLocaleString()} | ${cohort.avgSessionsPerUser.toFixed(2)} | ${(cohort.firstSessionCvr * 100).toFixed(2)}% | ${(cohort.repeatPurchaseRate * 100).toFixed(2)}% | $${cohort.ltv.toFixed(2)} |`);
|
|
221
|
+
}
|
|
222
|
+
lines.push('');
|
|
223
|
+
}
|
|
224
|
+
if (analysis.timeCohorts && analysis.timeCohorts.length > 0) {
|
|
225
|
+
lines.push('### Time Cohorts');
|
|
226
|
+
lines.push('');
|
|
227
|
+
lines.push('Users grouped by acquisition week.');
|
|
228
|
+
lines.push('');
|
|
229
|
+
lines.push('| Week | New Users | Week 0 | Week 1 | Week 2 | Week 3+ | Retention |');
|
|
230
|
+
lines.push('|------|-----------|--------|--------|--------|---------|-----------|');
|
|
231
|
+
for (const cohort of analysis.timeCohorts.slice(-10)) {
|
|
232
|
+
lines.push(`| ${cohort.weekId} | ${cohort.newUsers} | ${cohort.week0Conversions} | ${cohort.week1Conversions} | ${cohort.week2Conversions} | ${cohort.week3PlusConversions} | ${(cohort.retentionRate * 100).toFixed(1)}% |`);
|
|
233
|
+
}
|
|
234
|
+
lines.push('');
|
|
235
|
+
}
|
|
236
|
+
if (analysis.insights.length > 0) {
|
|
237
|
+
lines.push('### Insights');
|
|
238
|
+
lines.push('');
|
|
239
|
+
for (const insight of analysis.insights) {
|
|
240
|
+
lines.push(`- ${insight}`);
|
|
241
|
+
}
|
|
242
|
+
lines.push('');
|
|
243
|
+
}
|
|
244
|
+
if (analysis.recommendations.length > 0) {
|
|
245
|
+
lines.push('### Recommendations');
|
|
246
|
+
lines.push('');
|
|
247
|
+
for (const rec of analysis.recommendations) {
|
|
248
|
+
lines.push(`- ${rec}`);
|
|
249
|
+
}
|
|
250
|
+
lines.push('');
|
|
251
|
+
}
|
|
252
|
+
return lines.join('\n');
|
|
253
|
+
}
|
|
254
|
+
// =============================================================================
|
|
255
|
+
// HELPERS
|
|
256
|
+
// =============================================================================
|
|
257
|
+
function groupByUser(sessions) {
|
|
258
|
+
const result = new Map();
|
|
259
|
+
for (const session of sessions) {
|
|
260
|
+
const userId = session.user_id || session.session_id;
|
|
261
|
+
if (!result.has(userId)) {
|
|
262
|
+
result.set(userId, []);
|
|
263
|
+
}
|
|
264
|
+
result.get(userId).push(session);
|
|
265
|
+
}
|
|
266
|
+
return result;
|
|
267
|
+
}
|
|
268
|
+
function getMetricValue(session, metric) {
|
|
269
|
+
switch (metric) {
|
|
270
|
+
case 'lcp': return session.lcp_ms;
|
|
271
|
+
case 'inp': return session.inp_ms;
|
|
272
|
+
case 'cls': return session.cls;
|
|
273
|
+
case 'fcp': return session.fcp_ms;
|
|
274
|
+
case 'ttfb': return session.ttfb_ms;
|
|
275
|
+
default: return null;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
function getCohortDefinitions(metric) {
|
|
279
|
+
const thresholds = {
|
|
280
|
+
lcp: { good: 2500, poor: 4000 },
|
|
281
|
+
inp: { good: 200, poor: 500 },
|
|
282
|
+
cls: { good: 0.1, poor: 0.25 },
|
|
283
|
+
fcp: { good: 1800, poor: 3000 },
|
|
284
|
+
ttfb: { good: 800, poor: 1800 },
|
|
285
|
+
};
|
|
286
|
+
const t = thresholds[metric] || thresholds.lcp;
|
|
287
|
+
return [
|
|
288
|
+
{ id: 'good', description: `Good ${metric.toUpperCase()}`, min: 0, max: t.good },
|
|
289
|
+
{ id: 'needs_improvement', description: `Needs Improvement ${metric.toUpperCase()}`, min: t.good, max: t.poor },
|
|
290
|
+
{ id: 'poor', description: `Poor ${metric.toUpperCase()}`, min: t.poor, max: Infinity },
|
|
291
|
+
];
|
|
292
|
+
}
|
|
293
|
+
function getWeekId(date) {
|
|
294
|
+
const year = date.getFullYear();
|
|
295
|
+
const startOfYear = new Date(year, 0, 1);
|
|
296
|
+
const days = Math.floor((date.getTime() - startOfYear.getTime()) / (24 * 60 * 60 * 1000));
|
|
297
|
+
const week = Math.ceil((days + 1) / 7);
|
|
298
|
+
return `${year}-W${week.toString().padStart(2, '0')}`;
|
|
299
|
+
}
|
|
300
|
+
function getWeekDiff(week1, week2) {
|
|
301
|
+
const [year1, w1] = week1.split('-W').map(Number);
|
|
302
|
+
const [year2, w2] = week2.split('-W').map(Number);
|
|
303
|
+
return (year2 - year1) * 52 + (w2 - w1);
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=cohort.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cohort.js","sourceRoot":"","sources":["../../src/empirical/cohort.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,8 +29,8 @@ export interface ConversionBucket {
|
|
|
29
29
|
confidence: 'high' | 'medium' | 'low';
|
|
30
30
|
}
|
|
31
31
|
export interface ConversionCurve {
|
|
32
|
-
/** The metric being measured
|
|
33
|
-
metric:
|
|
32
|
+
/** The metric being measured */
|
|
33
|
+
metric: PerformanceMetric;
|
|
34
34
|
/** Buckets from fastest to slowest */
|
|
35
35
|
buckets: ConversionBucket[];
|
|
36
36
|
/** Summary statistics */
|
|
@@ -45,7 +45,7 @@ export interface ConversionCurve {
|
|
|
45
45
|
/** Relative CVR drop from fast to slow (e.g., 0.35 = 35% lower) */
|
|
46
46
|
relative_cvr_drop: number;
|
|
47
47
|
};
|
|
48
|
-
/**
|
|
48
|
+
/** Performance thresholds for reference */
|
|
49
49
|
thresholds: {
|
|
50
50
|
good: number;
|
|
51
51
|
needs_improvement: number;
|
|
@@ -59,21 +59,18 @@ export interface CurveBuilderConfig {
|
|
|
59
59
|
/** Minimum sessions per bucket for medium confidence. Default: 30 */
|
|
60
60
|
minSessionsMediumConfidence?: number;
|
|
61
61
|
}
|
|
62
|
+
export type PerformanceMetric = 'lcp' | 'fcp' | 'inp' | 'cls' | 'ttfb' | 'tti' | 'onload' | 'page_size';
|
|
62
63
|
/**
|
|
63
64
|
* Build an empirical conversion curve from session data.
|
|
64
65
|
*
|
|
65
66
|
* This is the key function: it takes raw session data and produces
|
|
66
67
|
* a measured CVR at each performance bucket.
|
|
67
68
|
*/
|
|
68
|
-
export declare function buildConversionCurve(sessions: SessionData[], metric:
|
|
69
|
+
export declare function buildConversionCurve(sessions: SessionData[], metric: PerformanceMetric, config?: CurveBuilderConfig): ConversionCurve;
|
|
69
70
|
/**
|
|
70
|
-
* Build curves for all
|
|
71
|
+
* Build curves for all performance metrics at once.
|
|
71
72
|
*/
|
|
72
|
-
export declare function buildAllCurves(sessions: SessionData[], config?: CurveBuilderConfig):
|
|
73
|
-
lcp: ConversionCurve;
|
|
74
|
-
inp: ConversionCurve;
|
|
75
|
-
cls: ConversionCurve;
|
|
76
|
-
};
|
|
73
|
+
export declare function buildAllCurves(sessions: SessionData[], config?: CurveBuilderConfig): Record<PerformanceMetric, ConversionCurve>;
|
|
77
74
|
/**
|
|
78
75
|
* Build curves segmented by device or page type.
|
|
79
76
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversion-curve.d.ts","sourceRoot":"","sources":["../../src/empirical/conversion-curve.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAM9D,MAAM,WAAW,gBAAgB;IAC/B,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,eAAe,EAAE,MAAM,CAAC;IACxB,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,oDAAoD;IACpD,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CACvC;AAED,MAAM,WAAW,eAAe;IAC9B,
|
|
1
|
+
{"version":3,"file":"conversion-curve.d.ts","sourceRoot":"","sources":["../../src/empirical/conversion-curve.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAM9D,MAAM,WAAW,gBAAgB;IAC/B,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,eAAe,EAAE,MAAM,CAAC;IACxB,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,oDAAoD;IACpD,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CACvC;AAED,MAAM,WAAW,eAAe;IAC9B,gCAAgC;IAChC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,sCAAsC;IACtC,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,yBAAyB;IACzB,OAAO,EAAE;QACP,cAAc,EAAE,MAAM,CAAC;QACvB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,mDAAmD;QACnD,SAAS,EAAE,MAAM,CAAC;QAClB,mEAAmE;QACnE,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,2CAA2C;IAC3C,UAAU,EAAE;QACV,IAAI,EAAE,MAAM,CAAC;QACb,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,8DAA8D;IAC9D,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,oEAAoE;IACpE,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,qEAAqE;IACrE,2BAA2B,CAAC,EAAE,MAAM,CAAC;CACtC;AAiBD,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,WAAW,CAAC;AAMxG;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,WAAW,EAAE,EACvB,MAAM,EAAE,iBAAiB,EACzB,MAAM,GAAE,kBAAuB,GAC9B,eAAe,CA0GjB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,WAAW,EAAE,EACvB,MAAM,GAAE,kBAAuB,GAC9B,MAAM,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAW5C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,WAAW,EAAE,EACvB,SAAS,EAAE,QAAQ,GAAG,WAAW,EACjC,MAAM,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,EAC7B,MAAM,GAAE,kBAAuB,GAC9B,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAiB9B;AAMD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,eAAe,GAAG;IAC3D,MAAM,EAAE,gBAAgB,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,IAAI,CA0CP;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAS3E"}
|
|
@@ -10,10 +10,15 @@
|
|
|
10
10
|
// =============================================================================
|
|
11
11
|
// CWV THRESHOLDS
|
|
12
12
|
// =============================================================================
|
|
13
|
-
const
|
|
13
|
+
const PERF_THRESHOLDS = {
|
|
14
14
|
lcp: { good: 2500, needsImprovement: 4000 },
|
|
15
|
+
fcp: { good: 1800, needsImprovement: 3000 },
|
|
15
16
|
inp: { good: 200, needsImprovement: 500 },
|
|
16
17
|
cls: { good: 0.1, needsImprovement: 0.25 },
|
|
18
|
+
ttfb: { good: 800, needsImprovement: 1800 },
|
|
19
|
+
tti: { good: 3800, needsImprovement: 7300 },
|
|
20
|
+
onload: { good: 3000, needsImprovement: 6000 },
|
|
21
|
+
page_size: { good: 3000, needsImprovement: 6000 }, // KB - 3MB good, 6MB needs improvement
|
|
17
22
|
};
|
|
18
23
|
// =============================================================================
|
|
19
24
|
// CURVE BUILDER
|
|
@@ -107,19 +112,24 @@ export function buildConversionCurve(sessions, metric, config = {}) {
|
|
|
107
112
|
relative_cvr_drop: relativeCvrDrop,
|
|
108
113
|
},
|
|
109
114
|
thresholds: {
|
|
110
|
-
good:
|
|
111
|
-
needs_improvement:
|
|
115
|
+
good: PERF_THRESHOLDS[metric].good,
|
|
116
|
+
needs_improvement: PERF_THRESHOLDS[metric].needsImprovement,
|
|
112
117
|
},
|
|
113
118
|
};
|
|
114
119
|
}
|
|
115
120
|
/**
|
|
116
|
-
* Build curves for all
|
|
121
|
+
* Build curves for all performance metrics at once.
|
|
117
122
|
*/
|
|
118
123
|
export function buildAllCurves(sessions, config = {}) {
|
|
119
124
|
return {
|
|
120
125
|
lcp: buildConversionCurve(sessions, 'lcp', config),
|
|
126
|
+
fcp: buildConversionCurve(sessions, 'fcp', config),
|
|
121
127
|
inp: buildConversionCurve(sessions, 'inp', config),
|
|
122
128
|
cls: buildConversionCurve(sessions, 'cls', config),
|
|
129
|
+
ttfb: buildConversionCurve(sessions, 'ttfb', config),
|
|
130
|
+
tti: buildConversionCurve(sessions, 'tti', config),
|
|
131
|
+
onload: buildConversionCurve(sessions, 'onload', config),
|
|
132
|
+
page_size: buildConversionCurve(sessions, 'page_size', config),
|
|
123
133
|
};
|
|
124
134
|
}
|
|
125
135
|
/**
|
|
@@ -200,10 +210,20 @@ function getMetricExtractor(metric) {
|
|
|
200
210
|
switch (metric) {
|
|
201
211
|
case 'lcp':
|
|
202
212
|
return (s) => s.lcp_ms;
|
|
213
|
+
case 'fcp':
|
|
214
|
+
return (s) => s.fcp_ms;
|
|
203
215
|
case 'inp':
|
|
204
216
|
return (s) => s.inp_ms;
|
|
205
217
|
case 'cls':
|
|
206
218
|
return (s) => (s.cls !== null ? s.cls * 1000 : null); // Scale CLS to ms-like for bucketing
|
|
219
|
+
case 'ttfb':
|
|
220
|
+
return (s) => s.ttfb_ms;
|
|
221
|
+
case 'tti':
|
|
222
|
+
return (s) => s.tti_ms;
|
|
223
|
+
case 'onload':
|
|
224
|
+
return (s) => s.onload_ms;
|
|
225
|
+
case 'page_size':
|
|
226
|
+
return (s) => s.page_size_kb;
|
|
207
227
|
}
|
|
208
228
|
}
|
|
209
229
|
function getDefaultBoundaries(metric) {
|
|
@@ -211,11 +231,24 @@ function getDefaultBoundaries(metric) {
|
|
|
211
231
|
case 'lcp':
|
|
212
232
|
// CWV thresholds + finer granularity
|
|
213
233
|
return [1000, 1500, 2000, 2500, 3000, 3500, 4000, 5000, 6000];
|
|
234
|
+
case 'fcp':
|
|
235
|
+
// FCP thresholds (good < 1.8s, needs improvement < 3s)
|
|
236
|
+
return [500, 1000, 1500, 1800, 2200, 2600, 3000, 4000];
|
|
214
237
|
case 'inp':
|
|
215
238
|
return [50, 100, 150, 200, 300, 400, 500, 750];
|
|
216
239
|
case 'cls':
|
|
217
240
|
// CLS scaled by 1000 (so 0.1 = 100, 0.25 = 250)
|
|
218
241
|
return [25, 50, 75, 100, 150, 200, 250, 350];
|
|
242
|
+
case 'ttfb':
|
|
243
|
+
return [200, 400, 600, 800, 1000, 1500, 2000, 3000];
|
|
244
|
+
case 'tti':
|
|
245
|
+
// TTI thresholds (good < 3.8s, needs improvement < 7.3s)
|
|
246
|
+
return [2000, 3000, 3800, 5000, 6000, 7300, 9000, 12000];
|
|
247
|
+
case 'onload':
|
|
248
|
+
return [1500, 2000, 2500, 3000, 4000, 5000, 6000, 8000];
|
|
249
|
+
case 'page_size':
|
|
250
|
+
// Page size in KB (up to 10MB+)
|
|
251
|
+
return [1000, 2000, 3000, 4000, 5000, 6000, 8000, 10000];
|
|
219
252
|
}
|
|
220
253
|
}
|
|
221
254
|
function findBucket(value, boundaries) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversion-curve.js","sourceRoot":"","sources":["../../src/empirical/conversion-curve.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"conversion-curve.js","sourceRoot":"","sources":["../../src/empirical/conversion-curve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Correlation Analysis
|
|
3
|
+
*
|
|
4
|
+
* Analyzes correlations between performance metrics and conversions:
|
|
5
|
+
* - Point-biserial correlation (continuous metric vs binary conversion)
|
|
6
|
+
* - Inter-metric correlations (how metrics relate to each other)
|
|
7
|
+
* - Feature importance ranking
|
|
8
|
+
*
|
|
9
|
+
* @author Kanmi Obasa <i@kanmiobasa.com>
|
|
10
|
+
*/
|
|
11
|
+
import type { SessionData } from './datadog-session-query.js';
|
|
12
|
+
import type { PerformanceMetric } from './conversion-curve.js';
|
|
13
|
+
export interface CorrelationResult {
|
|
14
|
+
/** Metric being correlated */
|
|
15
|
+
metric: string;
|
|
16
|
+
/** Correlation coefficient (-1 to 1) */
|
|
17
|
+
correlation: number;
|
|
18
|
+
/** P-value for significance test */
|
|
19
|
+
p_value: number;
|
|
20
|
+
/** Is the correlation significant? */
|
|
21
|
+
is_significant: boolean;
|
|
22
|
+
/** Direction of correlation */
|
|
23
|
+
direction: 'positive' | 'negative' | 'none';
|
|
24
|
+
/** Interpretation */
|
|
25
|
+
interpretation: string;
|
|
26
|
+
}
|
|
27
|
+
export interface CorrelationMatrix {
|
|
28
|
+
/** Row/column labels */
|
|
29
|
+
metrics: string[];
|
|
30
|
+
/** Correlation values (metrics.length x metrics.length) */
|
|
31
|
+
values: number[][];
|
|
32
|
+
}
|
|
33
|
+
export interface MetricImportance {
|
|
34
|
+
/** Metric name */
|
|
35
|
+
metric: string;
|
|
36
|
+
/** Importance score (0-1) based on correlation with conversion */
|
|
37
|
+
importance: number;
|
|
38
|
+
/** Rank (1 = most important) */
|
|
39
|
+
rank: number;
|
|
40
|
+
/** Direction of impact */
|
|
41
|
+
direction: 'negative' | 'positive';
|
|
42
|
+
/** Insight */
|
|
43
|
+
insight: string;
|
|
44
|
+
}
|
|
45
|
+
export interface CorrelationReport {
|
|
46
|
+
/** Correlations with conversion outcome */
|
|
47
|
+
conversion_correlations: CorrelationResult[];
|
|
48
|
+
/** Inter-metric correlation matrix */
|
|
49
|
+
metric_correlations: CorrelationMatrix;
|
|
50
|
+
/** Metrics ranked by importance */
|
|
51
|
+
importance_ranking: MetricImportance[];
|
|
52
|
+
/** Summary insights */
|
|
53
|
+
summary: {
|
|
54
|
+
most_impactful_metric: string;
|
|
55
|
+
strongest_correlation: number;
|
|
56
|
+
key_insight: string;
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Calculate point-biserial correlation between a continuous variable and binary outcome.
|
|
61
|
+
* Used for metric-conversion correlations.
|
|
62
|
+
*/
|
|
63
|
+
export declare function pointBiserialCorrelation(continuousValues: number[], binaryOutcomes: boolean[]): {
|
|
64
|
+
correlation: number;
|
|
65
|
+
pValue: number;
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Calculate Pearson correlation between two continuous variables.
|
|
69
|
+
*/
|
|
70
|
+
export declare function pearsonCorrelation(x: number[], y: number[]): number;
|
|
71
|
+
/**
|
|
72
|
+
* Calculate correlations between a metric and conversion outcome.
|
|
73
|
+
*/
|
|
74
|
+
export declare function calculateMetricConversionCorrelation(sessions: SessionData[], metric: PerformanceMetric, eventName?: string): CorrelationResult;
|
|
75
|
+
/**
|
|
76
|
+
* Calculate correlation matrix between all metrics.
|
|
77
|
+
*/
|
|
78
|
+
export declare function calculateMetricCorrelationMatrix(sessions: SessionData[]): CorrelationMatrix;
|
|
79
|
+
/**
|
|
80
|
+
* Calculate metric importance ranking based on correlation with conversions.
|
|
81
|
+
*/
|
|
82
|
+
export declare function calculateMetricImportance(sessions: SessionData[], eventName?: string): MetricImportance[];
|
|
83
|
+
/**
|
|
84
|
+
* Generate a complete correlation report.
|
|
85
|
+
*/
|
|
86
|
+
export declare function generateCorrelationReport(sessions: SessionData[], eventName?: string): CorrelationReport;
|
|
87
|
+
/**
|
|
88
|
+
* Generate markdown report for correlation analysis.
|
|
89
|
+
*/
|
|
90
|
+
export declare function generateCorrelationMarkdown(report: CorrelationReport): string;
|
|
91
|
+
//# sourceMappingURL=correlation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"correlation.d.ts","sourceRoot":"","sources":["../../src/empirical/correlation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAM/D,MAAM,WAAW,iBAAiB;IAChC,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,cAAc,EAAE,OAAO,CAAC;IACxB,+BAA+B;IAC/B,SAAS,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;IAC5C,qBAAqB;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,wBAAwB;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,2DAA2D;IAC3D,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,kBAAkB;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,UAAU,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,SAAS,EAAE,UAAU,GAAG,UAAU,CAAC;IACnC,cAAc;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,2CAA2C;IAC3C,uBAAuB,EAAE,iBAAiB,EAAE,CAAC;IAC7C,sCAAsC;IACtC,mBAAmB,EAAE,iBAAiB,CAAC;IACvC,mCAAmC;IACnC,kBAAkB,EAAE,gBAAgB,EAAE,CAAC;IACvC,uBAAuB;IACvB,OAAO,EAAE;QACP,qBAAqB,EAAE,MAAM,CAAC;QAC9B,qBAAqB,EAAE,MAAM,CAAC;QAC9B,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAMD;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,gBAAgB,EAAE,MAAM,EAAE,EAC1B,cAAc,EAAE,OAAO,EAAE,GACxB;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAkDzC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAyBnE;AAED;;GAEG;AACH,wBAAgB,oCAAoC,CAClD,QAAQ,EAAE,WAAW,EAAE,EACvB,MAAM,EAAE,iBAAiB,EACzB,SAAS,GAAE,MAAmB,GAC7B,iBAAiB,CA6CnB;AAED;;GAEG;AACH,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,WAAW,EAAE,GACtB,iBAAiB,CAwCnB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,WAAW,EAAE,EACvB,SAAS,GAAE,MAAmB,GAC7B,gBAAgB,EAAE,CAqCpB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,WAAW,EAAE,EACvB,SAAS,GAAE,MAAmB,GAC7B,iBAAiB,CAuCnB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAiF7E"}
|