Forberedelse til kodeintervjuer · leksjon

Tildeling og måltall i A/B-tester

Koble eksperimenttildeling til resultater og beregne måltall per variant.

Leksjon 3 av 413 trinn

Tildeling og måltall i A/B-tester er en gratis leksjon i Forberedelse til kodeintervjuer på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Forberedelse til kodeintervjuer, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Forberedelse til kodeintervjuer inneholder totalt 4 leksjoner.

Hva et A/B-testspørsmål tester

A/B-testspørsmål undersøker om De kan koble eksperimenttildelingen riktig til utfallene og beregne et ryddig måltall per variant.

Fellen ligger nesten alltid i koblingen: å telle utfall for brukere som aldri var inkludert, eller å telle brukere dobbelt fordi de ble tildelt to ganger. Få tildelingskoblingen riktig, så blir beregningen av måltallene enkel.

De to tabellene De får

Forvent en tildelingstabell og en utfallstabell:

  • assignments(user_id, variant, assigned_at) der variant er 'control' eller 'treatment'.
  • orders(user_id, order_id, amount, created_at) eller en generell hendelsestabell.

Tildelingen er fasiten for hvem som deltar i eksperimentet. Utfall teller bare hvis brukeren finnes i tildelingstabellen.

CREATE TABLE assignments (
  user_id     INT,
  variant     VARCHAR(20),
  assigned_at TIMESTAMP
);

CREATE TABLE orders (
  user_id    INT,
  order_id   INT,
  amount     NUMERIC,
  created_at TIMESTAMP
);

Start med tildelingen, og bruk LEFT JOIN mot utfall

Hovedregelen er: ta utgangspunkt i tildelingstabellen og bruk LEFT JOIN mot utfall. Da beholder De brukere som ble inkludert, men aldri konverterte, noe De trenger for en korrekt nevner.

En INNER JOIN ville i stillhet fjernet brukere som ikke konverterte og dermed blåst opp konverteringsraten.

SELECT
  a.user_id,
  a.variant,
  o.order_id
FROM assignments a
LEFT JOIN orders o
  ON o.user_id = a.user_id;

Tell konvertering per variant

Konverteringsrate = konverterte brukere / tildelte brukere, per variant. Tell unike konverterte i telleren og alle tildelte brukere i nevneren.

Bruk COUNT(DISTINCT ...) på bruker-ID-en i ordrene, slik at en bruker med tre ordrer fortsatt teller som én konvertert bruker.

SELECT
  a.variant,
  COUNT(DISTINCT a.user_id)                              AS assigned,
  COUNT(DISTINCT o.user_id)                              AS converters,
  ROUND(100.0 * COUNT(DISTINCT o.user_id)
              / COUNT(DISTINCT a.user_id), 2)            AS conv_rate_pct
FROM assignments a
LEFT JOIN orders o ON o.user_id = a.user_id
GROUP BY a.variant;

Fellen med dobbel tildeling

Hva om en bruker vises to ganger i tildelingene, én gang i hver variant? Koblingen teller nå brukeren på begge sider, og eksperimentet blir kontaminert.

Intervjuere legger ofte inn dette som en felle. Beskytt Dem mot den: dedupliser tildelingen slik at hver bruker får én variant, vanligvis den første tildelingen, før De kobler tabellene sammen.

WITH dedup AS (
  SELECT user_id, variant,
    ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY assigned_at) AS rn
  FROM assignments
)
SELECT user_id, variant
FROM dedup
WHERE rn = 1;

Tell bare utfall etter tildeling

En ordre som ble lagt inn før brukeren ble tildelt, kan ikke skyldes eksperimentet. Legg inn en tidsbetingelse: utfallet må ha skjedd samtidig med eller etter assigned_at.

Plasser denne betingelsen i ON-leddet i LEFT JOIN, slik at brukere som ikke konverterte, fortsatt beholdes.

SELECT
  a.variant,
  COUNT(DISTINCT a.user_id) AS assigned,
  COUNT(DISTINCT o.user_id) AS converters
FROM assignments a
LEFT JOIN orders o
  ON o.user_id = a.user_id
 AND o.created_at >= a.assigned_at
GROUP BY a.variant;

ON kontra WHERE i utfallskoblingen

Dette er et garantert oppfølgingsspørsmål. Hvis De flytter o.created_at >= a.assigned_at til WHERE, gjør De LEFT JOIN om til en inner join: rader der brukeren aldri bestilte, har o.created_at = NULL, predikatet blir UNKNOWN, og radene forsvinner.

Behold betingelser som filtrerer utfall, i ON, slik at brukere som ikke konverterte, fortsatt inngår i nevneren.

Inntektsmåltall per variant

I tillegg til konvertering spør intervjuere om inntekt per bruker (ARPU) og inntekt per konvertert bruker. Summer beløpet, og del deretter på riktig nevner.

ARPU beregnes ved å dele på alle tildelte brukere, mens inntekt per konvertert bruker bare deles på brukere som bestilte. Vær tydelig på hvilket måltall virksomheten ønsker.

SELECT
  a.variant,
  COUNT(DISTINCT a.user_id)                               AS assigned,
  COALESCE(SUM(o.amount), 0)                              AS revenue,
  ROUND(COALESCE(SUM(o.amount), 0)
        / COUNT(DISTINCT a.user_id), 2)                   AS arpu
FROM assignments a
LEFT JOIN orders o
  ON o.user_id = a.user_id
 AND o.created_at >= a.assigned_at
GROUP BY a.variant;

Mønsteret med aggregering på to nivåer

Når et måltall er «gjennomsnittlig antall ordrer per bruker», må De ikke beregne det i én omgang; da blander De detaljnivået for brukere og ordrer. Aggreger til brukernivå først, og beregn deretter gjennomsnittet på tvers av brukerne.

Dette mønsteret – per bruker først og deretter per variant – bruker riktig detaljnivå og er et vanlig skille i tekniske intervjuer.

WITH per_user AS (
  SELECT a.variant, a.user_id,
    COUNT(o.order_id) AS orders_cnt
  FROM assignments a
  LEFT JOIN orders o
    ON o.user_id = a.user_id
   AND o.created_at >= a.assigned_at
  GROUP BY a.variant, a.user_id
)
SELECT variant, ROUND(AVG(orders_cnt), 3) AS avg_orders_per_user
FROM per_user
GROUP BY variant;

En komplett, etterprøvbar spørring

Kombiner alt: dedupliser til den første tildelingen, ta utgangspunkt i tildelingen, legg tidsbetingelsen for utfall i ON, og rapporter konvertering og ARPU per variant. Forklar hver kontrollbetingelse mens De skriver den.

WITH enrolled AS (
  SELECT user_id, variant, assigned_at
  FROM (
    SELECT user_id, variant, assigned_at,
      ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY assigned_at) AS rn
    FROM assignments
  ) x WHERE rn = 1
)
SELECT
  e.variant,
  COUNT(DISTINCT e.user_id)                            AS assigned,
  COUNT(DISTINCT o.user_id)                            AS converters,
  ROUND(100.0 * COUNT(DISTINCT o.user_id)
              / COUNT(DISTINCT e.user_id), 2)          AS conv_pct,
  ROUND(COALESCE(SUM(o.amount),0)
        / COUNT(DISTINCT e.user_id), 2)                AS arpu
FROM enrolled e
LEFT JOIN orders o
  ON o.user_id = e.user_id
 AND o.created_at >= e.assigned_at
GROUP BY e.variant;

Sannhetssjekker intervjuere forventer

Valider eksperimentoppsettet før De oppgir resultater:

  • Er variantstørrelsene omtrent balanserte? En fordeling på 90/10 når 50/50 var forventet, tyder på en feil.
  • Endte noen brukere opp i begge variantene? Tell brukere med mer enn én unik variant.
  • Finnes det tildelinger uten et mulig utfallsvindu, fordi brukeren ble tildelt etter dataenes skjæringstidspunkt?

Hvis De tilbyr disse sjekkene uten å bli spurt, viser det analytisk modenhet.

SELECT user_id, COUNT(DISTINCT variant) AS variant_count
FROM assignments
GROUP BY user_id
HAVING COUNT(DISTINCT variant) > 1;

Hurtigsjekk

De beregner konvertering per variant ved å bruke LEFT JOIN fra ordrer til tildelinger, men plasserer o.created_at >= a.assigned_at i WHERE-leddet. Hva skjer?

Oppsummering: A/B-testtildeling og måltall

De har nå en etterprøvbar fremgangsmåte for eksperimentanalyse:

  • Behandle tildelingen som fasiten, og bruk LEFT JOIN mot utfall.
  • Dedupliser slik at hver bruker får én variant (første tildeling).
  • Legg tidsbetingelsen for utfall i ON-leddet, aldri i WHERE, slik at brukere som ikke konverterte, beholdes.
  • Velg riktig nevner for konvertering, ARPU og inntekt per konvertert bruker.
  • Aggreger til brukernivå først når De skal beregne gjennomsnitt per bruker.
  • Kjør sannhetssjekker av fordelingsbalansen og tildeling til flere varianter.

Neste steg: gjøre disse måltallene per variant om til lift, signifikans og guardrail-måltall.

Gratis å komme i gang

Lær deg Forberedelse til kodeintervjuer med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
90
Leksjoner
360

Ofte stilte spørsmål

Er leksjonen «Tildeling og måltall i A/B-tester» gratis?

Ja – hele teksten i «Tildeling og måltall i A/B-tester» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Forberedelse til kodeintervjuer-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Forberedelse til kodeintervjuer inneholder totalt 4 leksjoner.

Hva lærer jeg i «Tildeling og måltall i A/B-tester»?

Koble eksperimenttildeling til resultater og beregne måltall per variant. Du øver på Forberedelse til kodeintervjuer med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Forberedelse til kodeintervjuer?

Ingen tidligere erfaring er nødvendig. Forberedelse til kodeintervjuer på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «Tildeling og måltall i A/B-tester»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Forberedelse til kodeintervjuer-leksjonen?

Ja. Alle Forberedelse til kodeintervjuer-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Bygge en trakt med flere trinn
  2. Hendelser i riktig rekkefølge og tidsvinduer
  3. Tildeling og måltall i A/B-tester
  4. Løft, signifikans og kontrollgrenser i SQL
← Tilbake til Forberedelse til kodeintervjuer