kanmi-perf-revenue 1.0.0 → 1.2.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 +347 -173
- 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-product-analytics.d.ts +192 -0
- package/dist/empirical/datadog-product-analytics.d.ts.map +1 -0
- package/dist/empirical/datadog-product-analytics.js +632 -0
- package/dist/empirical/datadog-product-analytics.js.map +1 -0
- 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 +41 -16
- package/dist/empirical/index.d.ts.map +1 -1
- package/dist/empirical/index.js +96 -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 +2 -2
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Seasonality Analysis
|
|
3
|
+
*
|
|
4
|
+
* Analyzes time-based patterns in performance and conversion data.
|
|
5
|
+
* Accounts for day-of-week, hour-of-day, and weekly trends.
|
|
6
|
+
*
|
|
7
|
+
* Key insights:
|
|
8
|
+
* - When does performance degrade (peak hours)?
|
|
9
|
+
* - When are conversion rates highest/lowest?
|
|
10
|
+
* - How does performance-CVR relationship change by time?
|
|
11
|
+
*
|
|
12
|
+
* @author Kanmi Obasa <i@kanmiobasa.com>
|
|
13
|
+
*/
|
|
14
|
+
import type { SessionData } from './datadog-session-query.js';
|
|
15
|
+
export interface HourlyPattern {
|
|
16
|
+
hour: number;
|
|
17
|
+
sessions: number;
|
|
18
|
+
conversions: number;
|
|
19
|
+
cvr: number;
|
|
20
|
+
avgLcp: number | null;
|
|
21
|
+
avgInp: number | null;
|
|
22
|
+
/** Index: 0=lowest CVR hour, 100=highest CVR hour */
|
|
23
|
+
cvrIndex: number;
|
|
24
|
+
}
|
|
25
|
+
export interface DayOfWeekPattern {
|
|
26
|
+
day: number;
|
|
27
|
+
dayName: string;
|
|
28
|
+
sessions: number;
|
|
29
|
+
conversions: number;
|
|
30
|
+
cvr: number;
|
|
31
|
+
avgLcp: number | null;
|
|
32
|
+
avgInp: number | null;
|
|
33
|
+
cvrIndex: number;
|
|
34
|
+
}
|
|
35
|
+
export interface WeeklyTrend {
|
|
36
|
+
weekNumber: number;
|
|
37
|
+
weekStart: string;
|
|
38
|
+
sessions: number;
|
|
39
|
+
conversions: number;
|
|
40
|
+
cvr: number;
|
|
41
|
+
avgLcp: number | null;
|
|
42
|
+
trend: 'improving' | 'declining' | 'stable';
|
|
43
|
+
}
|
|
44
|
+
export interface SeasonalityReport {
|
|
45
|
+
hourly: HourlyPattern[];
|
|
46
|
+
dayOfWeek: DayOfWeekPattern[];
|
|
47
|
+
weekly: WeeklyTrend[];
|
|
48
|
+
insights: SeasonalInsight[];
|
|
49
|
+
peakHours: number[];
|
|
50
|
+
lowHours: number[];
|
|
51
|
+
bestDays: string[];
|
|
52
|
+
worstDays: string[];
|
|
53
|
+
performanceDegradationHours: number[];
|
|
54
|
+
}
|
|
55
|
+
export interface SeasonalInsight {
|
|
56
|
+
type: 'hourly' | 'daily' | 'weekly' | 'performance';
|
|
57
|
+
severity: 'info' | 'warning' | 'opportunity';
|
|
58
|
+
message: string;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Analyze hourly patterns.
|
|
62
|
+
*/
|
|
63
|
+
export declare function analyzeHourlyPatterns(sessions: SessionData[]): HourlyPattern[];
|
|
64
|
+
/**
|
|
65
|
+
* Analyze day-of-week patterns.
|
|
66
|
+
*/
|
|
67
|
+
export declare function analyzeDayOfWeekPatterns(sessions: SessionData[]): DayOfWeekPattern[];
|
|
68
|
+
/**
|
|
69
|
+
* Analyze weekly trends.
|
|
70
|
+
*/
|
|
71
|
+
export declare function analyzeWeeklyTrends(sessions: SessionData[]): WeeklyTrend[];
|
|
72
|
+
/**
|
|
73
|
+
* Generate full seasonality report.
|
|
74
|
+
*/
|
|
75
|
+
export declare function analyzeSeasonality(sessions: SessionData[]): SeasonalityReport;
|
|
76
|
+
/**
|
|
77
|
+
* Generate markdown report for seasonality analysis.
|
|
78
|
+
*/
|
|
79
|
+
export declare function generateSeasonalityMarkdown(report: SeasonalityReport): string;
|
|
80
|
+
//# sourceMappingURL=seasonality.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seasonality.d.ts","sourceRoot":"","sources":["../../src/empirical/seasonality.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAO9D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,qDAAqD;IACrD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC;CAC7C;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,2BAA2B,EAAE,MAAM,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,aAAa,CAAC;IACpD,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC;CACjB;AAQD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,aAAa,EAAE,CAwD9E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,gBAAgB,EAAE,CAyDpF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CA0D1E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,iBAAiB,CA8F7E;AAMD;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAoE7E"}
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Seasonality Analysis
|
|
3
|
+
*
|
|
4
|
+
* Analyzes time-based patterns in performance and conversion data.
|
|
5
|
+
* Accounts for day-of-week, hour-of-day, and weekly trends.
|
|
6
|
+
*
|
|
7
|
+
* Key insights:
|
|
8
|
+
* - When does performance degrade (peak hours)?
|
|
9
|
+
* - When are conversion rates highest/lowest?
|
|
10
|
+
* - How does performance-CVR relationship change by time?
|
|
11
|
+
*
|
|
12
|
+
* @author Kanmi Obasa <i@kanmiobasa.com>
|
|
13
|
+
*/
|
|
14
|
+
import { calculateConfidenceInterval } from './statistics.js';
|
|
15
|
+
// =============================================================================
|
|
16
|
+
// ANALYSIS FUNCTIONS
|
|
17
|
+
// =============================================================================
|
|
18
|
+
const DAY_NAMES = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
|
|
19
|
+
/**
|
|
20
|
+
* Analyze hourly patterns.
|
|
21
|
+
*/
|
|
22
|
+
export function analyzeHourlyPatterns(sessions) {
|
|
23
|
+
const hourlyData = new Map();
|
|
24
|
+
// Initialize all hours
|
|
25
|
+
for (let h = 0; h < 24; h++) {
|
|
26
|
+
hourlyData.set(h, { sessions: [], conversions: 0 });
|
|
27
|
+
}
|
|
28
|
+
// Bucket sessions by hour
|
|
29
|
+
for (const session of sessions) {
|
|
30
|
+
const hour = session.hour_of_day ?? new Date(session.timestamp || Date.now()).getHours();
|
|
31
|
+
const data = hourlyData.get(hour);
|
|
32
|
+
data.sessions.push(session);
|
|
33
|
+
if (session.has_purchase) {
|
|
34
|
+
data.conversions++;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Calculate patterns
|
|
38
|
+
const patterns = [];
|
|
39
|
+
let minCvr = Infinity;
|
|
40
|
+
let maxCvr = 0;
|
|
41
|
+
for (let hour = 0; hour < 24; hour++) {
|
|
42
|
+
const data = hourlyData.get(hour);
|
|
43
|
+
const sessionCount = data.sessions.length;
|
|
44
|
+
const cvr = sessionCount > 0 ? data.conversions / sessionCount : 0;
|
|
45
|
+
const lcpValues = data.sessions.map((s) => s.lcp_ms).filter((v) => v !== null);
|
|
46
|
+
const inpValues = data.sessions.map((s) => s.inp_ms).filter((v) => v !== null);
|
|
47
|
+
patterns.push({
|
|
48
|
+
hour,
|
|
49
|
+
sessions: sessionCount,
|
|
50
|
+
conversions: data.conversions,
|
|
51
|
+
cvr,
|
|
52
|
+
avgLcp: lcpValues.length > 0 ? lcpValues.reduce((a, b) => a + b, 0) / lcpValues.length : null,
|
|
53
|
+
avgInp: inpValues.length > 0 ? inpValues.reduce((a, b) => a + b, 0) / inpValues.length : null,
|
|
54
|
+
cvrIndex: 0, // Will be set below
|
|
55
|
+
});
|
|
56
|
+
if (sessionCount >= 10) {
|
|
57
|
+
minCvr = Math.min(minCvr, cvr);
|
|
58
|
+
maxCvr = Math.max(maxCvr, cvr);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Calculate CVR index (normalize to 0-100)
|
|
62
|
+
const cvrRange = maxCvr - minCvr;
|
|
63
|
+
for (const pattern of patterns) {
|
|
64
|
+
if (pattern.sessions >= 10 && cvrRange > 0) {
|
|
65
|
+
pattern.cvrIndex = ((pattern.cvr - minCvr) / cvrRange) * 100;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return patterns;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Analyze day-of-week patterns.
|
|
72
|
+
*/
|
|
73
|
+
export function analyzeDayOfWeekPatterns(sessions) {
|
|
74
|
+
const dailyData = new Map();
|
|
75
|
+
// Initialize all days
|
|
76
|
+
for (let d = 0; d < 7; d++) {
|
|
77
|
+
dailyData.set(d, { sessions: [], conversions: 0 });
|
|
78
|
+
}
|
|
79
|
+
// Bucket sessions by day
|
|
80
|
+
for (const session of sessions) {
|
|
81
|
+
const day = session.day_of_week ?? new Date(session.timestamp || Date.now()).getDay();
|
|
82
|
+
const data = dailyData.get(day);
|
|
83
|
+
data.sessions.push(session);
|
|
84
|
+
if (session.has_purchase) {
|
|
85
|
+
data.conversions++;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Calculate patterns
|
|
89
|
+
const patterns = [];
|
|
90
|
+
let minCvr = Infinity;
|
|
91
|
+
let maxCvr = 0;
|
|
92
|
+
for (let day = 0; day < 7; day++) {
|
|
93
|
+
const data = dailyData.get(day);
|
|
94
|
+
const sessionCount = data.sessions.length;
|
|
95
|
+
const cvr = sessionCount > 0 ? data.conversions / sessionCount : 0;
|
|
96
|
+
const lcpValues = data.sessions.map((s) => s.lcp_ms).filter((v) => v !== null);
|
|
97
|
+
const inpValues = data.sessions.map((s) => s.inp_ms).filter((v) => v !== null);
|
|
98
|
+
patterns.push({
|
|
99
|
+
day,
|
|
100
|
+
dayName: DAY_NAMES[day],
|
|
101
|
+
sessions: sessionCount,
|
|
102
|
+
conversions: data.conversions,
|
|
103
|
+
cvr,
|
|
104
|
+
avgLcp: lcpValues.length > 0 ? lcpValues.reduce((a, b) => a + b, 0) / lcpValues.length : null,
|
|
105
|
+
avgInp: inpValues.length > 0 ? inpValues.reduce((a, b) => a + b, 0) / inpValues.length : null,
|
|
106
|
+
cvrIndex: 0,
|
|
107
|
+
});
|
|
108
|
+
if (sessionCount >= 10) {
|
|
109
|
+
minCvr = Math.min(minCvr, cvr);
|
|
110
|
+
maxCvr = Math.max(maxCvr, cvr);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Calculate CVR index
|
|
114
|
+
const cvrRange = maxCvr - minCvr;
|
|
115
|
+
for (const pattern of patterns) {
|
|
116
|
+
if (pattern.sessions >= 10 && cvrRange > 0) {
|
|
117
|
+
pattern.cvrIndex = ((pattern.cvr - minCvr) / cvrRange) * 100;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return patterns;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Analyze weekly trends.
|
|
124
|
+
*/
|
|
125
|
+
export function analyzeWeeklyTrends(sessions) {
|
|
126
|
+
// Group by week
|
|
127
|
+
const weeklyData = new Map();
|
|
128
|
+
for (const session of sessions) {
|
|
129
|
+
const date = new Date(session.timestamp || Date.now());
|
|
130
|
+
const weekStart = getWeekStart(date);
|
|
131
|
+
const weekKey = weekStart.toISOString().split('T')[0];
|
|
132
|
+
if (!weeklyData.has(weekKey)) {
|
|
133
|
+
weeklyData.set(weekKey, { sessions: [], conversions: 0, weekStart });
|
|
134
|
+
}
|
|
135
|
+
const data = weeklyData.get(weekKey);
|
|
136
|
+
data.sessions.push(session);
|
|
137
|
+
if (session.has_purchase) {
|
|
138
|
+
data.conversions++;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// Sort by week
|
|
142
|
+
const sortedWeeks = Array.from(weeklyData.entries()).sort((a, b) => a[0].localeCompare(b[0]));
|
|
143
|
+
// Calculate trends
|
|
144
|
+
const trends = [];
|
|
145
|
+
let prevCvr = null;
|
|
146
|
+
for (let i = 0; i < sortedWeeks.length; i++) {
|
|
147
|
+
const [weekKey, data] = sortedWeeks[i];
|
|
148
|
+
const sessionCount = data.sessions.length;
|
|
149
|
+
const cvr = sessionCount > 0 ? data.conversions / sessionCount : 0;
|
|
150
|
+
const lcpValues = data.sessions.map((s) => s.lcp_ms).filter((v) => v !== null);
|
|
151
|
+
let trend = 'stable';
|
|
152
|
+
if (prevCvr !== null) {
|
|
153
|
+
const change = cvr - prevCvr;
|
|
154
|
+
if (change > 0.005)
|
|
155
|
+
trend = 'improving';
|
|
156
|
+
else if (change < -0.005)
|
|
157
|
+
trend = 'declining';
|
|
158
|
+
}
|
|
159
|
+
trends.push({
|
|
160
|
+
weekNumber: i + 1,
|
|
161
|
+
weekStart: weekKey,
|
|
162
|
+
sessions: sessionCount,
|
|
163
|
+
conversions: data.conversions,
|
|
164
|
+
cvr,
|
|
165
|
+
avgLcp: lcpValues.length > 0 ? lcpValues.reduce((a, b) => a + b, 0) / lcpValues.length : null,
|
|
166
|
+
trend,
|
|
167
|
+
});
|
|
168
|
+
prevCvr = cvr;
|
|
169
|
+
}
|
|
170
|
+
return trends;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Generate full seasonality report.
|
|
174
|
+
*/
|
|
175
|
+
export function analyzeSeasonality(sessions) {
|
|
176
|
+
const hourly = analyzeHourlyPatterns(sessions);
|
|
177
|
+
const dayOfWeek = analyzeDayOfWeekPatterns(sessions);
|
|
178
|
+
const weekly = analyzeWeeklyTrends(sessions);
|
|
179
|
+
const insights = [];
|
|
180
|
+
// Find peak and low hours
|
|
181
|
+
const significantHours = hourly.filter((h) => h.sessions >= 10);
|
|
182
|
+
const sortedByCvr = [...significantHours].sort((a, b) => b.cvr - a.cvr);
|
|
183
|
+
const peakHours = sortedByCvr.slice(0, 3).map((h) => h.hour);
|
|
184
|
+
const lowHours = sortedByCvr.slice(-3).map((h) => h.hour);
|
|
185
|
+
// Find hours where performance degrades
|
|
186
|
+
const avgLcp = calculateAverage(hourly.map((h) => h.avgLcp).filter((v) => v !== null));
|
|
187
|
+
const performanceDegradationHours = hourly
|
|
188
|
+
.filter((h) => h.avgLcp !== null && h.avgLcp > avgLcp * 1.2)
|
|
189
|
+
.map((h) => h.hour);
|
|
190
|
+
// Best/worst days
|
|
191
|
+
const significantDays = dayOfWeek.filter((d) => d.sessions >= 10);
|
|
192
|
+
const sortedDays = [...significantDays].sort((a, b) => b.cvr - a.cvr);
|
|
193
|
+
const bestDays = sortedDays.slice(0, 2).map((d) => d.dayName);
|
|
194
|
+
const worstDays = sortedDays.slice(-2).map((d) => d.dayName);
|
|
195
|
+
// Generate insights
|
|
196
|
+
if (peakHours.length > 0 && lowHours.length > 0) {
|
|
197
|
+
const peakCvr = sortedByCvr[0].cvr;
|
|
198
|
+
const lowCvr = sortedByCvr[sortedByCvr.length - 1].cvr;
|
|
199
|
+
if (peakCvr > lowCvr * 1.3) {
|
|
200
|
+
insights.push({
|
|
201
|
+
type: 'hourly',
|
|
202
|
+
severity: 'opportunity',
|
|
203
|
+
message: `CVR varies ${((peakCvr / lowCvr - 1) * 100).toFixed(0)}% between peak (${formatHour(peakHours[0])}) and low hours (${formatHour(lowHours[0])})`,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
if (performanceDegradationHours.length > 0) {
|
|
208
|
+
insights.push({
|
|
209
|
+
type: 'performance',
|
|
210
|
+
severity: 'warning',
|
|
211
|
+
message: `Performance degrades during: ${performanceDegradationHours.map(formatHour).join(', ')}`,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
if (bestDays.length > 0 && worstDays.length > 0) {
|
|
215
|
+
const bestDayData = sortedDays[0];
|
|
216
|
+
const worstDayData = sortedDays[sortedDays.length - 1];
|
|
217
|
+
// Check if difference is statistically significant
|
|
218
|
+
const ci = calculateConfidenceInterval(bestDayData.conversions, bestDayData.sessions);
|
|
219
|
+
if (bestDayData.cvr > worstDayData.cvr * 1.2) {
|
|
220
|
+
insights.push({
|
|
221
|
+
type: 'daily',
|
|
222
|
+
severity: 'opportunity',
|
|
223
|
+
message: `${bestDays[0]} converts ${((bestDayData.cvr / worstDayData.cvr - 1) * 100).toFixed(0)}% better than ${worstDays[worstDays.length - 1]} (${(ci.lower * 100).toFixed(2)}%-${(ci.upper * 100).toFixed(2)}% CI)`,
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// Weekly trend insight
|
|
228
|
+
if (weekly.length >= 2) {
|
|
229
|
+
const recentWeeks = weekly.slice(-3);
|
|
230
|
+
const improvingCount = recentWeeks.filter((w) => w.trend === 'improving').length;
|
|
231
|
+
const decliningCount = recentWeeks.filter((w) => w.trend === 'declining').length;
|
|
232
|
+
if (improvingCount >= 2) {
|
|
233
|
+
insights.push({
|
|
234
|
+
type: 'weekly',
|
|
235
|
+
severity: 'info',
|
|
236
|
+
message: 'CVR trending upward over recent weeks',
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
else if (decliningCount >= 2) {
|
|
240
|
+
insights.push({
|
|
241
|
+
type: 'weekly',
|
|
242
|
+
severity: 'warning',
|
|
243
|
+
message: 'CVR trending downward over recent weeks - investigate performance changes',
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return {
|
|
248
|
+
hourly,
|
|
249
|
+
dayOfWeek,
|
|
250
|
+
weekly,
|
|
251
|
+
insights,
|
|
252
|
+
peakHours,
|
|
253
|
+
lowHours,
|
|
254
|
+
bestDays,
|
|
255
|
+
worstDays,
|
|
256
|
+
performanceDegradationHours,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
// =============================================================================
|
|
260
|
+
// REPORT GENERATION
|
|
261
|
+
// =============================================================================
|
|
262
|
+
/**
|
|
263
|
+
* Generate markdown report for seasonality analysis.
|
|
264
|
+
*/
|
|
265
|
+
export function generateSeasonalityMarkdown(report) {
|
|
266
|
+
const lines = [];
|
|
267
|
+
lines.push('## Seasonality Analysis');
|
|
268
|
+
lines.push('');
|
|
269
|
+
// Key Insights
|
|
270
|
+
if (report.insights.length > 0) {
|
|
271
|
+
lines.push('### Key Insights');
|
|
272
|
+
lines.push('');
|
|
273
|
+
for (const insight of report.insights) {
|
|
274
|
+
const icon = insight.severity === 'warning' ? '⚠️' : insight.severity === 'opportunity' ? '💡' : 'ℹ️';
|
|
275
|
+
lines.push(`- ${icon} ${insight.message}`);
|
|
276
|
+
}
|
|
277
|
+
lines.push('');
|
|
278
|
+
}
|
|
279
|
+
// Hourly Patterns
|
|
280
|
+
lines.push('### Hourly Patterns');
|
|
281
|
+
lines.push('');
|
|
282
|
+
lines.push('| Hour | Sessions | CVR | LCP | Index |');
|
|
283
|
+
lines.push('|------|----------|-----|-----|-------|');
|
|
284
|
+
for (const hour of report.hourly) {
|
|
285
|
+
const isPeak = report.peakHours.includes(hour.hour);
|
|
286
|
+
const isLow = report.lowHours.includes(hour.hour);
|
|
287
|
+
const marker = isPeak ? ' 🔥' : isLow ? ' ❄️' : '';
|
|
288
|
+
lines.push(`| ${formatHour(hour.hour)}${marker} | ${hour.sessions.toLocaleString()} | ${(hour.cvr * 100).toFixed(2)}% | ${hour.avgLcp ? `${hour.avgLcp.toFixed(0)}ms` : 'N/A'} | ${hour.cvrIndex.toFixed(0)} |`);
|
|
289
|
+
}
|
|
290
|
+
lines.push('');
|
|
291
|
+
// Day of Week
|
|
292
|
+
lines.push('### Day of Week');
|
|
293
|
+
lines.push('');
|
|
294
|
+
lines.push('| Day | Sessions | CVR | LCP | Index |');
|
|
295
|
+
lines.push('|-----|----------|-----|-----|-------|');
|
|
296
|
+
for (const day of report.dayOfWeek) {
|
|
297
|
+
const isBest = report.bestDays.includes(day.dayName);
|
|
298
|
+
const isWorst = report.worstDays.includes(day.dayName);
|
|
299
|
+
const marker = isBest ? ' 🔥' : isWorst ? ' ❄️' : '';
|
|
300
|
+
lines.push(`| ${day.dayName}${marker} | ${day.sessions.toLocaleString()} | ${(day.cvr * 100).toFixed(2)}% | ${day.avgLcp ? `${day.avgLcp.toFixed(0)}ms` : 'N/A'} | ${day.cvrIndex.toFixed(0)} |`);
|
|
301
|
+
}
|
|
302
|
+
lines.push('');
|
|
303
|
+
// Weekly Trends
|
|
304
|
+
if (report.weekly.length > 0) {
|
|
305
|
+
lines.push('### Weekly Trends');
|
|
306
|
+
lines.push('');
|
|
307
|
+
lines.push('| Week | Sessions | CVR | LCP | Trend |');
|
|
308
|
+
lines.push('|------|----------|-----|-----|-------|');
|
|
309
|
+
for (const week of report.weekly) {
|
|
310
|
+
const trendIcon = week.trend === 'improving' ? '📈' : week.trend === 'declining' ? '📉' : '➡️';
|
|
311
|
+
lines.push(`| ${week.weekStart} | ${week.sessions.toLocaleString()} | ${(week.cvr * 100).toFixed(2)}% | ${week.avgLcp ? `${week.avgLcp.toFixed(0)}ms` : 'N/A'} | ${trendIcon} ${week.trend} |`);
|
|
312
|
+
}
|
|
313
|
+
lines.push('');
|
|
314
|
+
}
|
|
315
|
+
return lines.join('\n');
|
|
316
|
+
}
|
|
317
|
+
// =============================================================================
|
|
318
|
+
// HELPERS
|
|
319
|
+
// =============================================================================
|
|
320
|
+
function getWeekStart(date) {
|
|
321
|
+
const d = new Date(date);
|
|
322
|
+
const day = d.getDay();
|
|
323
|
+
const diff = d.getDate() - day;
|
|
324
|
+
return new Date(d.setDate(diff));
|
|
325
|
+
}
|
|
326
|
+
function formatHour(hour) {
|
|
327
|
+
if (hour === 0)
|
|
328
|
+
return '12am';
|
|
329
|
+
if (hour === 12)
|
|
330
|
+
return '12pm';
|
|
331
|
+
if (hour < 12)
|
|
332
|
+
return `${hour}am`;
|
|
333
|
+
return `${hour - 12}pm`;
|
|
334
|
+
}
|
|
335
|
+
function calculateAverage(values) {
|
|
336
|
+
if (values.length === 0)
|
|
337
|
+
return 0;
|
|
338
|
+
return values.reduce((a, b) => a + b, 0) / values.length;
|
|
339
|
+
}
|
|
340
|
+
//# sourceMappingURL=seasonality.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seasonality.js","sourceRoot":"","sources":["../../src/empirical/seasonality.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Segmentation Analysis
|
|
3
|
+
*
|
|
4
|
+
* Analyze conversion rates and performance impact by segment:
|
|
5
|
+
* - Device (mobile, desktop, tablet)
|
|
6
|
+
* - Page type (PDP, PLP, checkout, homepage)
|
|
7
|
+
* - Geography (country, region)
|
|
8
|
+
* - Traffic source (organic, paid, direct, social, etc.)
|
|
9
|
+
* - Custom events (purchase, add_to_cart, signup, lead)
|
|
10
|
+
*
|
|
11
|
+
* @author Kanmi Obasa <i@kanmiobasa.com>
|
|
12
|
+
*/
|
|
13
|
+
import type { SessionData } from './datadog-session-query.js';
|
|
14
|
+
export interface SegmentStats {
|
|
15
|
+
/** Segment name */
|
|
16
|
+
name: string;
|
|
17
|
+
/** Number of sessions */
|
|
18
|
+
sessions: number;
|
|
19
|
+
/** Percentage of total sessions */
|
|
20
|
+
session_pct: number;
|
|
21
|
+
/** Number of conversions */
|
|
22
|
+
conversions: number;
|
|
23
|
+
/** Conversion rate */
|
|
24
|
+
cvr: number;
|
|
25
|
+
/** Total revenue */
|
|
26
|
+
revenue: number;
|
|
27
|
+
/** Average order value */
|
|
28
|
+
aov: number;
|
|
29
|
+
/** Performance metrics (median values) */
|
|
30
|
+
performance: {
|
|
31
|
+
lcp_p50: number | null;
|
|
32
|
+
fcp_p50: number | null;
|
|
33
|
+
inp_p50: number | null;
|
|
34
|
+
cls_p50: number | null;
|
|
35
|
+
ttfb_p50: number | null;
|
|
36
|
+
};
|
|
37
|
+
/** Bounce rate */
|
|
38
|
+
bounce_rate: number;
|
|
39
|
+
/** Average page views */
|
|
40
|
+
avg_page_views: number;
|
|
41
|
+
}
|
|
42
|
+
export interface SegmentComparison {
|
|
43
|
+
/** Segment being compared */
|
|
44
|
+
segment: string;
|
|
45
|
+
/** Base segment (e.g., 'desktop' when comparing mobile) */
|
|
46
|
+
baseline: string;
|
|
47
|
+
/** CVR difference (segment - baseline) */
|
|
48
|
+
cvr_diff: number;
|
|
49
|
+
/** Relative CVR difference ((segment - baseline) / baseline) */
|
|
50
|
+
cvr_relative_diff: number;
|
|
51
|
+
/** Is the difference significant? */
|
|
52
|
+
is_significant: boolean;
|
|
53
|
+
/** Insight text */
|
|
54
|
+
insight: string;
|
|
55
|
+
}
|
|
56
|
+
export interface SegmentationReport {
|
|
57
|
+
/** Analysis by device */
|
|
58
|
+
by_device: {
|
|
59
|
+
segments: SegmentStats[];
|
|
60
|
+
comparisons: SegmentComparison[];
|
|
61
|
+
insight: string;
|
|
62
|
+
};
|
|
63
|
+
/** Analysis by page type */
|
|
64
|
+
by_page_type: {
|
|
65
|
+
segments: SegmentStats[];
|
|
66
|
+
comparisons: SegmentComparison[];
|
|
67
|
+
insight: string;
|
|
68
|
+
};
|
|
69
|
+
/** Analysis by country */
|
|
70
|
+
by_country: {
|
|
71
|
+
segments: SegmentStats[];
|
|
72
|
+
comparisons: SegmentComparison[];
|
|
73
|
+
insight: string;
|
|
74
|
+
};
|
|
75
|
+
/** Analysis by traffic source */
|
|
76
|
+
by_traffic_source: {
|
|
77
|
+
segments: SegmentStats[];
|
|
78
|
+
comparisons: SegmentComparison[];
|
|
79
|
+
insight: string;
|
|
80
|
+
};
|
|
81
|
+
/** Analysis by conversion event type */
|
|
82
|
+
by_event_type: {
|
|
83
|
+
events: EventStats[];
|
|
84
|
+
insight: string;
|
|
85
|
+
};
|
|
86
|
+
/** Summary */
|
|
87
|
+
summary: {
|
|
88
|
+
total_sessions: number;
|
|
89
|
+
highest_cvr_segment: {
|
|
90
|
+
type: string;
|
|
91
|
+
name: string;
|
|
92
|
+
cvr: number;
|
|
93
|
+
};
|
|
94
|
+
lowest_cvr_segment: {
|
|
95
|
+
type: string;
|
|
96
|
+
name: string;
|
|
97
|
+
cvr: number;
|
|
98
|
+
};
|
|
99
|
+
biggest_opportunity: string;
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
export interface EventStats {
|
|
103
|
+
/** Event name */
|
|
104
|
+
name: string;
|
|
105
|
+
/** Number of sessions with this event */
|
|
106
|
+
sessions: number;
|
|
107
|
+
/** Event rate (sessions with event / total sessions) */
|
|
108
|
+
rate: number;
|
|
109
|
+
/** Total value of events */
|
|
110
|
+
total_value: number;
|
|
111
|
+
/** Average value per event */
|
|
112
|
+
avg_value: number;
|
|
113
|
+
}
|
|
114
|
+
export type SegmentType = 'device' | 'page_type' | 'country' | 'traffic_source';
|
|
115
|
+
/**
|
|
116
|
+
* Analyze sessions by a specific segment.
|
|
117
|
+
*/
|
|
118
|
+
export declare function analyzeBySegment(sessions: SessionData[], segmentType: SegmentType, eventName?: string): SegmentStats[];
|
|
119
|
+
/**
|
|
120
|
+
* Compare segments to find significant differences.
|
|
121
|
+
*/
|
|
122
|
+
export declare function compareSegments(stats: SegmentStats[], baselineName?: string): SegmentComparison[];
|
|
123
|
+
/**
|
|
124
|
+
* Analyze conversion events across all sessions.
|
|
125
|
+
*/
|
|
126
|
+
export declare function analyzeEvents(sessions: SessionData[]): EventStats[];
|
|
127
|
+
/**
|
|
128
|
+
* Generate a complete segmentation report.
|
|
129
|
+
*/
|
|
130
|
+
export declare function generateSegmentationReport(sessions: SessionData[], eventName?: string): SegmentationReport;
|
|
131
|
+
/**
|
|
132
|
+
* Generate markdown report for segmentation analysis.
|
|
133
|
+
*/
|
|
134
|
+
export declare function generateSegmentationMarkdown(report: SegmentationReport): string;
|
|
135
|
+
//# sourceMappingURL=segmentation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"segmentation.d.ts","sourceRoot":"","sources":["../../src/empirical/segmentation.ts"],"names":[],"mappings":"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"}
|