Priprema za Data Scientist intervju

Pitanja za Data Scientist intervju

20 često postavljanih pitanja za Data Scientist intervju. Data science je tražena oblast koja podatke o proizvodu, korisnicima i poslovanju pretvara u odluke, eksperimente, modele i merljive uvide. Pitanja pokrivaju različite nivoe, a odgovore možete vežbati naglas u našem treneru za intervjue.

Započni Data Scientist AI intervjuKreditna kartica nije potrebna. Dostupna je 1 besplatna sesija.
Vežba tehničkog intervjua na engleskomRežim u kome kandidati kojima engleski nije maternji mogu da vežbaju tehničke intervjue.

Pitanja za početni nivo

1How do you explain foundational metrics like conversion rates or statistical significance to non-technical business stakeholders without using technical jargon?

When communicating foundational metrics to non-technical stakeholders, the key is to translate abstract formulas and statistical mechanics into intuitive user stories, decision confidence, and business risk. For conversion rate, rather than presenting a bare ratio or abstract percentage, frame it around concrete user counts: 'Out of every 100 people who landed on the checkout page, 5 completed a purchase.' This grounds the metric directly in observable customer behavior. For statistical significance, avoid formal null hypothesis terminology like alpha levels or rejection regions. Instead, explain it as confidence that an observed uplift is real rather than random noise or lucky timing. For instance: 'A statistically significant result means we are 95% confident this improvement reflects a genuine change in user behavior rather than random fluke. Rolling this out gives us high confidence of a positive outcome instead of reacting to random noise.'

## Experiment Results: New Checkout Flow
- Baseline Conversion: 5.0% (5 out of 100 visitors buy)
- Variant Conversion: 5.8% (5.8 out of 100 visitors buy, a +16% relative lift)
- Decision Confidence: 96% confidence (p = 0.04)
- Business Takeaway: The risk that this lift was just random chance is under 4%. Rolling this out is estimated to bring +$45k in monthly revenue.
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

2Koja je konceptualna razlika između inner, left, right i full outer spajanja (joins) i kako svaki izbor menja analitičku populaciju i rukovanje NULL vrednostima pri naknadnom računanju metrika?

Inner, left, right i full outer spajanja (joins) određuju koji se zapisi zadržavaju prilikom kombinovanja tabela na osnovu ključeva koji se poklapaju: - Inner Join: Zadržava samo zapise kod kojih postoji poklapanje ključa u obe tabele. - Left (Outer) Join: Zadržava sve zapise iz leve tabele i popunjava kolone iz desne tabele sa NULL kada poklapanje ne postoji. - Right (Outer) Join: Zadržava sve zapise iz desne tabele i popunjava nepoklopljene kolone sa leve strane sa NULL. - Full Outer Join: Zadržava sve zapise iz obe tabele, popunjavajući NULL vrednosti sa bilo koje strane kada poklapanje izostane. Uticaj na analitičku populaciju i naknadne metrike: Izbor spajanja direktno kontroliše analitičku kohortu i imenioce koji se koriste pri izračunavanju metrika. Nenamerni inner join između baze korisnika i tabele sa aktivnostima/transakcijama odbacuje neaktivne korisnike, smanjujući imenilac samo na aktivne korisnike i veštački uvećavajući stope konverzije ili zadržavanja. Nasuprot tome, outer joins zadržavaju punu osnovnu populaciju, ali uvode NULL vrednosti za redove bez poklapanja. Naknadna izračunavanja moraju uzeti u obzir ove NULL vrednosti: standardne SQL (Structured Query Language) agregatne funkcije poput SUM() ili AVG() ignorišu NULL vrednosti, COUNT(kolona) broji unose koji nisu NULL dok COUNT(*) broji sve redove, a aritmetičke operacije nad NULL vrednostima bez upotrebe funkcije coalesce daju NULL.

-- Inner join silently shrinks denominator to purchasers only
SELECT COUNT(o.order_id) * 1.0 / COUNT(u.user_id) AS inner_conv_rate
FROM users u
INNER JOIN orders o ON u.user_id = o.user_id;

-- Left join preserves full user base for accurate metric computation
SELECT COUNT(o.order_id) * 1.0 / COUNT(u.user_id) AS true_conv_rate
FROM users u
LEFT JOIN orders o ON u.user_id = o.user_id;
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

3U produktnom eksperimentisanju, šta randomizacija postiže što jednostavno poređenje stanja pre i posle obično ne može i kako biste objasnili osnovnu uzročnu tvrdnju koju A/B test treba da podrži?

U produktnom eksperimentisanju, jednostavno poređenje stanja pre i posle upoređuje metrike kroz različite vremenske periode, čime se efekat promene funkcionalnosti meša sa spoljnim vremenskim faktorima kao što su sezonalnost, obrasci vezani za dan u nedelji, paralelne marketinške kampanje, makroekonomski trendovi i prirodno sazrevanje ponašanja korisnika. Randomizacija istovremeno raspoređuje kvalifikovane jedinice u eksperimentalnu i kontrolnu grupu, ujednačavajući i posmatrane i neposmatrane ometajuće varijable (confounding variables) u očekivanju. Time se uspostavlja interna validnost. Osnovna uzročna tvrdnja koju A/B test podržava oslanja se na kontrafaktičko zaključivanje: pošto je kontrolna grupa izložena potpuno istim spoljnim uslovima u istom vremenskom prozoru, ona služi kao empirijska procena kontrafaktuelnog stanja — šta bi se desilo sa eksperimentalnom grupom da nije primila novu funkcionalnost. Prema tome, svaka statistički značajna razlika u ishodima može se uzročno pripisati primenjenoj intervenciji.

# Naive Before-After Comparison:
# Effect_estimate = Metric_t1 (Holiday Launch) - Metric_t0 (Pre-Holiday Baseline)
# Problem: Lift is confounded by holiday shopping surge and marketing spend.

# Randomized A/B Test:
# Effect_estimate = E[Metric_Holiday | Treatment] - E[Metric_Holiday | Control]
# Solution: Both arms experience the exact same external shocks simultaneously.
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

4Šta eksplorativna analiza podataka obično ima za cilj da postigne pre formalnog modelovanja ili eksperimentisanja i kako razlikujete EDA (Exploratory Data Analysis) od konfirmatorne analize?

Eksplorativna analiza podataka (EDA - Exploratory Data Analysis) je otvoren proces usmeren na razumevanje osnovne strukture skupa podataka, otkrivanje obrazaca, identifikaciju anomalija ili problema sa kvalitetom podataka, procenu pretpostavki o raspodelama i generisanje hipoteza pre izgradnje formalnih statističkih modela ili sprovođenja eksperimenata. Ključna razlika između EDA i konfirmatorne analize leži u njihovoj nameni i metodologiji: EDA služi za generisanje hipoteza, fleksibilna je i istraživačka — koristi deskriptivnu statistiku, korelacije i vizuelizacije kako bi istražila šta podaci sugerišu bez strogih unapred donetih odluka. Nasuprot tome, konfirmatorna analiza (kao što je testiranje hipoteza ili evaluacija A/B testova) služi za testiranje hipoteza, strukturisana je i inferencijalna — dizajnirana da rigorozno testira unapred definisane, proverljive hipoteze uz kontrolu stopa statističkih grešaka (npr. greška tipa I). Tretiranje nalaza otkrivenih tokom EDA kao potvrđenih zaključaka na istom skupu podataka može dovesti do prekomernog pretraživanja podataka (p-hacking) i preprilagođavanja (overfitting).

import numpy as np
import pandas as pd

# 1. EDA Phase: Open-ended discovery and hypothesis generation
df = pd.DataFrame({'engagement_score': np.random.normal(50, 10, 1000)})
summary = df['engagement_score'].describe()

# 2. Confirmatory Phase: Testing pre-registered hypothesis on fresh test/experiment data
# (e.g., two-sample t-test with fixed significance level alpha = 0.05)
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

5Šta je curenje ciljne promenljive (target leakage) u kontekstu nadgledanog učenja i kako se razlikuje od legitimne jake korelacije između obeležja i labele?

Curenje ciljne promenljive (target leakage) nastaje kada obeležje uključeno u obučavanje modela sadrži informacije o ciljnoj labeli koje legitimno ne bi bile dostupne u fazi zaključivanja (inference time) kada model donosi predikcije u realnom okruženju. Ovo se često dešava kada se podatak o obeležju prikuplja hronološki nakon događaja od interesa ili predstavlja direktnu posledicu samog ishoda (kao što je korišćenje vremenske oznake otkazivanja naloga ili ID-ja povraćaja novca za predviđanje odlaska korisnika). Nasuprot tome, legitimna jaka korelacija odražava stvaran, prethodno postojeći prediktivni ili uzročno-posledični odnos koji je u potpunosti poznat i dostupan pre trenutka predviđanja (kao što je učestalost prijavljivanja korisnika tokom poslednjih 30 dana). Iako će u oba slučaja postojati visoka važnost obeležja ili snažne metrike evaluacije, model sa problemom curenja ciljne promenljive postići će nerealno visoke rezultate validacije van mreže (offline), ali neće funkcionisati u produkciji jer to obeležje ne može biti poznato u fazi zaključivanja.

# Scenario: Predicting whether a user will cancel their subscription (is_churned)

# LEAKY FEATURE:
# 'cancellation_survey_submitted' -> Occurs after the decision to churn has executed.

# LEGITIMATE FEATURE:
# 'login_count_last_30_days' -> Observed strictly before the prediction cut-off date.
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

6Koja je svrha podele podataka na skupove za obuku, validaciju i testiranje, i kako svaka od ovih podela treba da usmerava iterativni razvoj modela?

Podela podataka na skupove za obuku, validaciju i testiranje izoluje prilagođavanje modela, podešavanje hiperparametara i konačnu evaluaciju kako bi se obezbedila generalizacija na neviđenim podacima. - Skup za obuku (Training Set): Koristi se za obučavanje unutrašnjih parametara modela (npr. težine i pomaci u neuronskim mrežama, pragovi grananja u stablima odlučivanja). - Skup za validaciju (Validation Set): Koristi se tokom iterativnog razvoja za izbor modela, podešavanje hiperparametara, selekciju obeležja i uočavanje preprilagođavanja (overfitting). On usmerava odluke o tome koja arhitektura ili konfiguracija modela daje najbolje rezultate bez dodirivanja podataka za konačnu evaluaciju. - Skup za testiranje (Test Set): Služi kao strogo izdvojeni reprezent neviđenih produkcionih podataka. Evaluira se samo jednom na samom kraju projekta kako bi pružio nepristrasnu procenu greške generalizacije. Ponovno podešavanje modela na osnovu rezultata sa test skupa poništava njegovu objektivnost i unosi optimističku pristrasnost.

from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification

X, y = make_classification(n_samples=1000, n_features=10, random_state=42)

# Step 1: Split off final test set (20%)
X_dev, X_test, y_dev, y_test = train_test_split(
    X, y, test_size=0.20, random_state=42, stratify=y
)

# Step 2: Split remaining development data into train (75% of dev = 60% total) and validation (25% of dev = 20% total)
X_train, X_val, y_train, y_val = train_test_split(
    X_dev, y_dev, test_size=0.25, random_state=42, stratify=y_dev
)

print(f"Train size: {len(X_train)}, Val size: {len(X_val)}, Test size: {len(X_test)}")
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

7Koja je razlika između nadgledanog i nenadgledanog učenja, i kako dostupnost oznaka i poslovni ciljevi određuju koju paradigmu treba izabrati?

Algoritmi nadgledanog učenja uče matematičko preslikavanje sa ulaznih obeležja (X) na poznate ciljne oznake (y) koristeći označene istorijske podatke kako bi predvideli ishode za nove, neviđene opservacije. Nenadgledano učenje analizira skupove podataka koji sadrže samo obeležja (X) kako bi otkrilo intrinzične strukture, prirodna grupisanja (klasterovanje) ili redukovane reprezentacije bez unapred definisanih ciljnih oznaka. Izbor između ove dve paradigme zavisi od dostupnosti oznaka i poslovnih ciljeva: ako verodostojne oznake (ground-truth) postoje ili ih je izvodljivo prikupiti, a poslovni cilj je ciljano predviđanje (npr. detekcija prevara, predviđanje odlaska korisnika, prognoza cena), nadgledano učenje je odgovarajući izbor. Ako verodostojne oznake ne postoje, ako je njihovo pribavljanje previše skupo ili je cilj otvoreno istraživanje podataka (npr. segmentacija korisnika, detekcija anomalija bez poznatih oznaka), bira se nenadgledano učenje.

import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.cluster import KMeans

X = np.array([[10, 2], [12, 3], [1, 8], [2, 9]])
y = np.array([0, 0, 1, 1])

# Supervised: Learns mapping X -> y
clf = LogisticRegression().fit(X, y)

# Unsupervised: Discovers clusters directly from X
kmeans = KMeans(n_clusters=2, random_state=42, n_init=10).fit(X)
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

8Šta je North Star metrika i kako se razlikuje efektivna North Star metrika od metrike taštine (vanity metric) prilikom procene uspešnosti proizvoda?

North Star metrika (NSM – North Star Metric) je primarna metrika koja najbolje odražava suštinsku vrednost koju proizvod pruža svojim korisnicima, istovremeno podstičući održive poslovne rezultate (na primer, „broj rezervisanih noćenja” za Airbnb ili „nedeljni broj aktivnih sati strimovanja” za muzičku platformu). Ona usklađuje proizvodne timove oko dugoročne vrednosti za korisnike umesto oko površinskog rasta. Razlika između efektivne North Star metrike i metrike taštine ogleda se u sledećem: 1. Usklađenost sa vrednošću: Efektivna North Star metrika odražava stvarnu korist za korisnika i aktivan angažman, dok metrika taštine meri površinski obim (kao što je ukupan broj registrovanih korisnika, kumulativna preuzimanja aplikacije ili sirovi pregledi stranica) koji može rasti čak i kada korisnici odmah napuste proizvod (churn). 2. Primenjivost i korelacija: Efektivna North Star metrika je u korelaciji sa zadržavanjem korisnika (retention), zdravljem proizvoda i monetizacijom, i direktno reaguje na poboljšanja u kvalitetu proizvoda. Metrike taštine često se ne mogu povezati sa stvarnim zadržavanjem ili poslovnim zdravljem i podložne su veštačkom i površinskom uvećanju.

Platform: Vacation Rental App
Vanity Metric: Cumulative app downloads (increases continuously even if 95% of users uninstall immediately).
North Star Metric: Nights booked per active user (reflects actual value exchange between guests and hosts).
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

9Koja je praktična razlika između pomeranja podataka (data drift) i pomeranja koncepta (concept drift) i zašto je njihova ispravna kategorizacija ključna za održavanje modela nakon puštanja u rad?

Pomeranje podataka (data drift, često nazvano covariate shift) nastaje kada se statistička raspodela ulaznih atributa P(X) menja tokom vremena, dok uslovna zavisnost između ulaza i ciljne promenljive P(Y|X) ostaje nepromenjena. Nasuprot tome, pomeranje koncepta (concept drift) nastaje kada se promeni suštinska veza između ulaza i ciljne promenljive P(Y|X), što znači da identične vrednosti atributa sada odgovaraju drugačijem ponašanju ili ishodima ciljne promenljive. Njihova ispravna kategorizacija je ključna za održavanje modela nakon puštanja u rad jer se pristupi njihovom rešavanju suštinski razlikuju. Kod pomeranja podataka, istorijski obrasci ostaju validni; održavanje se fokusira na proširivanje pokrivenosti trening skupa novim regionima atributa, ažuriranje pretprocesiranja ili primenu ponovnog ponderisanja uzoraka (sample re-weighting). Kod pomeranja koncepta, istorijske labele više ne odražavaju trenutno pravo stanje; održavanje zahteva prikupljanje novih označenih podataka, odbacivanje zastarelih istorijskih primera i ponovno treniranje ili redizajniranje modela.

# Data Drift (Covariate Shift):
# User demographics or devices change (P(X) shifts),
# but genuine vs fraudulent transaction patterns remain identical (P(Y|X) unchanged).

# Concept Drift:
# Fraudsters adapt tactics to mimic normal shopping patterns;
# identical feature inputs now have a higher probability of fraud (P(Y|X) shifts).
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

10Koja je razlika između parametra populacije i statistike uzorka i kako varijabilnost uzorkovanja utiče na interpretaciju metrika?

Parametar populacije je fiksna, obično nepoznata numerička karakteristika čitave populacije (kao što je stvarna srednja vrednost populacije μ ili proporcija p). Statistika uzorka je numerički sažetak izračunat iz uočenih podataka uzorka (kao što je srednja vrednost uzorka x̄ ili proporcija uzorka p̂), koji se koristi za procenu nepoznatog parametra. Varijabilnost uzorkovanja se odnosi na prirodnu varijaciju statistika uzorka u različitim slučajnim uzorcima izvučenim iz iste populacije. Zbog varijabilnosti uzorkovanja, svaka pojedinačna metrika uzorka podleže slučajnoj grešci i retko se u potpunosti poklapa sa stvarnim parametrom populacije. Prilikom interpretacije metrika, zanemarivanje ove varijabilnosti dovodi do pogrešnog tumačenja šuma kao stvarne promene. Analitičari moraju kvantifikovati nesigurnost procene koristeći standardne greške, intervale poverenja ili testiranje hipoteza pre nego što zaključe da je uočena razlika stvarna.

import numpy as np

# True population parameter (mean = 50, standard deviation = 10)
pop_mean = 50.0
pop_std = 10.0

# Draw multiple independent samples of size n=30
np.random.seed(42)
sample_means = [np.mean(np.random.normal(pop_mean, pop_std, size=30)) for _ in range(5)]

for i, sm in enumerate(sample_means, 1):
    print(f"Sample {i} Mean (Statistic): {sm:.2f} | Error: {sm - pop_mean:+.2f}")
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

Pitanja za srednji nivo

11Zainteresovana strana postavlja dvosmisleno pitanje poput „Da li funkcionalnost Y radi?“. Kako to pitanje preoblikujete u merljiv analitički okvir spreman za donošenje odluka?

Kada zainteresovana strana postavi pitanje „Da li funkcionalnost Y radi?“, najpre dekonstruišem pitanje do njegove suštinske namere: Koji problem je funkcionalnost Y trebalo da reši, kome je namenjena i koja će odluka biti doneta na osnovu odgovora (npr. dalje unapređenje, proširenje ili gašenje)? Nakon toga uspostavljam višeslojni okvir merenja koji se sastoji od sledećih elemenata: 1. Usvajanje i angažovanje (Adoption and Engagement): Da li ciljni korisnici otkrivaju i koriste funkcionalnost na očekivani način? 2. Direktna vrednost / Uspešnost zadatka: Da li korisnici uspešno završavaju ključni radni tok koji ova funkcionalnost omogućava? 3. Poslovni uticaj na krajnje rezultate: Da li usvajanje funkcionalnosti korelira sa ključnim poslovnim metrikama ili ih direktno podstiče (npr. zadržavanje korisnika, konverzija, prihod)? 4. Kontrolna ograničenja (Guardrails): Da li je funkcionalnost izazvala neželjene negativne nuspojave (npr. povećano kašnjenje, više tiketa korisničke podrške, kanibalizaciju drugih opcija)? Na kraju, pre sprovođenja same analize, sa zainteresovanom stranom unapred definišem pragove odlučivanja i kriterijume evaluacije, čime se osigurava usklađenost oko toga šta predstavlja uspeh i sprečava naknadno menjanje kriterijuma.

Feature: Quick Checkout Button

1. Primary Decision: Keep & expand vs. Redesign vs. Deprecate
2. Evaluation Metrics:
   - Adoption: % of checkout sessions clicking the quick button (Target: >= 15%)
   - Funnel Completion: Checkout completion rate given button click (Target: >= 75%)
   - Business Metric: Overall cart conversion lift (Target: +1.5% in A/B test)
   - Guardrail: Support tickets for accidental purchases (Threshold: < 0.2% increase)
3. Pre-agreed Action Plan:
   - If Target Met: Roll out to 100% and promote to mobile app.
   - If Adoption Low but Completion High: Retain, optimize UI discovery.
   - If Guardrail Exceeded: Halt rollout, add confirmation step.
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

12Prilikom pripreme i obrade dataseta sa znatnim brojem nedostajućih vrednosti, kako odlučujete između analize kompletnih slučajeva, jednostavne imputacije, indikatorskih zastavica za nedostajuće vrednosti i imputacije zasnovane na modelu?

Izbor strategije za nedostajuće podatke prvenstveno zavisi od mehanizma nedostajanja (MCAR, MAR, MNAR), udela nedostajućih podataka, krajnjeg cilja upotrebe (statističko zaključivanje naspram prediktivnog modelovanja) i rizika od pristrasnosti: 1. **Analiza kompletnih slučajeva (uklanjanje redova):** Prikladna je samo kada podaci nedostaju potpuno slučajno (MCAR — Missing Completely at Random) i udeo nedostajućih podataka je mali (npr. <5%). Ako podaci nedostaju slučajno (MAR — Missing at Random) ili neslučajno (MNAR — Missing Not at Random), uklanjanje redova unosi ozbiljnu pristrasnost selekcije i odbacuje dragocenu statističku snagu uzorka. 2. **Jednostavna imputacija (srednja vrednost / medijana / modus):** Brza je i praktična za osnovne prediktivne modele, ali opasna za statističku analizu jer veštački smanjuje varijansu feature-a, uvećava test statistike i narušava strukturu kovarijanse. 3. **Indikatorske zastavice za nedostajanje (imputacija + binarna zastavica):** Idealno za prediktivno modelovanje (posebno algoritme zasnovane na stablima) i situacije u kojima je samo nedostajanje informativno (MNAR, kao što su izostavljena opciona polja). Zadržava signal o nedostajanju bez narušavanja validnih numeričkih distribucija. 4. **Imputacija zasnovana na modelu (KNN, MICE, Iterative Imputer):** Preporučuje se kada su podaci MAR, korelacije među promenljivama jake i kada je ključno očuvati multivarijantne odnose ili standardne greške parametara (npr. kod regresionog zaključivanja). Kompromisi su računska složenost, dodatni troškovi implementacije u produkcionim pipeline-ovima i potencijalno curenje podataka ako se model ne uklapa striktno na trening podskupovima.

from sklearn.impute import SimpleImputer
import pandas as pd

df = pd.DataFrame({'income': [50000, None, 75000, None, 120000]})

# Impute median while tracking missingness pattern
imputer = SimpleImputer(strategy='median', add_indicator=True)
imputed_data = imputer.fit_transform(df)
# Returns: [income_imputed, income_is_missing]
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

13Produktni tim poredi korisnike koji su samoinicijativno aktivirali novu funkcionalnost (opt-in) sa onima koji nisu, pri čemu primećuje 20% veću stopu zadržavanja (retention rate). Kako biste dijagnostikovali pristrasnost selekcije i zbunjujuće faktore, i kako biste redizajnirali evaluaciju?

Poređenje korisnika koji su se samoinicijativno prijavili (opt-in) sa onima koji nisu pati od pristrasnosti samoselekcije i zbunjujućih faktora (confounding). Korisnici koji aktivno odluče da usvoje novu funkcionalnost obično imaju veću početnu nameru, angažovanje ili tehničku pismenost. Kao rezultat toga, uočena razlika od 20% u zadržavanju meša stvarni kauzalni efekat funkcionalnosti sa prethodno postojećom motivacijom korisnika. Dijagnostikovanje pristrasnosti: 1. Poređenje kovarijata pre tretmana: Uporedite početne atribute između opt-in i non-opt-in kohorti pre uvođenja funkcionalnosti (npr. istorijska aktivnost, prethodno zadržavanje, dužina korišćenja naloga, učestalost transakcija, raspodela uređaja). Značajne razlike potvrđuju postojanje zbunjujućih faktora. 2. Provera prethodnih trendova i placebo testovi: Ocenite da li su opt-in korisnici već pokazivali veće zadržavanje ili angažovanje u periodima pre lansiranja nove funkcionalnosti. Redizajniranje evaluacije: - Randomizovani eksperiment (zlatni standard): Primenite dizajn sa randomizovanim podsticanjem (Randomized Encouragement Design ili randomizovano postepeno uvođenje). Svi kvalifikovani korisnici se nasumično raspoređuju u tretiranu grupu (Treatment – ponuđena im je funkcionalnost / obaveštenje) i kontrolnu grupu (Control – nije ponuđena). Analizirajte koristeći Intention-to-Treat (ITT) za ukupan efekat ponude, i instrumentalne promenljive / dvostepene najmanje kvadrate (2SLS) koristeći dodelu grupi kao instrument za procenu lokalnog prosečnog efekta tretmana (LATE) na aktivne korisnike koji su usvojili funkciju. - Kvazieksperimentalni pristupi (ako randomizacija nije moguća): Koristite uparivanje na osnovu sklonosti (Propensity Score Matching – PSM), metod razlike u razlikama (Difference-in-Differences – DiD) ili sintetičku kontrolu (Synthetic Control) kako biste prilagodili opservabilne početne zbunjujuće faktore i paralelne prethodno postojeće trendove.

import statsmodels.formula.api as smf
import pandas as pd

# df columns: ['user_id', 'post_period', 'opted_in', 'retained']
# Interaction term captures causal lift above baseline group differences
model = smf.ols('retained ~ opted_in + post_period + opted_in:post_period', data=df).fit()
print(model.summary().tables[1])
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

14Kako biste definisali kohortne preseke za analizu aktivacije ili zadržavanja korisnika (retention) kako poređenja ne bi bila narušena promenama u strukturi korisnika ili nepotpunim sazrevanjem kohorti?

Da biste definisali kohortne preseke koji izbegavaju promene u strukturi korisnika (mix shifts) i nepotpuno sazrevanje kohorti (maturity truncation): 1. **Standardizujte vremenske prozore po stažu korisnika**: Uskladite kohorte prema relativnom stažu (npr. dan 0, dan 7, dan 30 nakon registracije/aktivacije) umesto prema kalendarskim datumima, kako bi poređenja kroz životni ciklus bila ravnopravna. 2. **Obradite nepotpuno sazrevanje kohorti (desno cenzurisanje)**: Analizirajte isključivo kohorte koje su u potpunosti prošle čitav prozor posmatranja. Izuzmite ili eksplicitno označite nedavne kohorte koje još uvek nisu imale dovoljno vremena da dostignu posmatranu prekretnicu. 3. **Ublažite promene u strukturi korisnika**: Segmentirajte kohorte prema uticajnim dimenzijama (kao što su kanal akvizicije, platforma, zemlja ili namera korisnika). Ako prikazujete zbirne pokazatelje, primenite standardizaciju ili poststratifikaciono ponderisanje tako da promene u udelu različitih kanala akvizicije ne iskrive uočeni trend zadržavanja korisnika.

WITH user_cohorts AS (
    SELECT 
        user_id,
        DATE_TRUNC('week', signup_time) AS cohort_week,
        signup_time,
        acquisition_channel
    FROM users
    -- Exclude cohorts that have not reached 7 full days of maturity
    WHERE signup_time <= CURRENT_DATE - INTERVAL '7 days'
),
user_activity AS (
    SELECT DISTINCT 
        c.user_id,
        c.cohort_week,
        c.acquisition_channel,
        1 AS retained_d7
    FROM user_cohorts c
    JOIN events e ON c.user_id = e.user_id
    WHERE e.event_time >= c.signup_time + INTERVAL '7 days'
      AND e.event_time < c.signup_time + INTERVAL '8 days'
)
SELECT 
    c.cohort_week,
    c.acquisition_channel,
    COUNT(c.user_id) AS cohort_size,
    COUNT(a.user_id) AS d7_active_users,
    ROUND(100.0 * COUNT(a.user_id) / COUNT(c.user_id), 2) AS d7_retention_pct
FROM user_cohorts c
LEFT JOIN user_activity a ON c.user_id = a.user_id
GROUP BY 1, 2
ORDER BY 1 DESC, 2;
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

15Tokom evaluacije, vaš model postiže neuobičajeno visoku metriku, poput AUC (Area Under the Curve) vrednosti od 0.99, ali performanse naglo opadaju u testiranju u senci. Kako sistematski izolujete i proveravate curenje ciljne promenljive?

Kada model postigne nerealno visoku metriku van mreže (npr. AUC od 0.99) koja naglo opadne tokom testiranja u senci uživo, curenje ciljne promenljive je primarni sumnjivac. Sistematski tok izolacije i verifikacije obuhvata: 1. Značajnost i atribucija obeležja: Izračunajte SHAP vrednosti, značajnost dobitka ili permutacionu značajnost kako biste identifikovali potencijalna obeležja sa dominantnom prediktivnom moći. 2. Modeli sa jednim obeležjem i studije ablacije: Trenirajte jednostavne modele sa jednim obeležjem (npr. plitka stabla odlučivanja ili logističku regresiju) na pojedinačnim sumnjivim obeležjima. Ako jedno obeležje postiže skoro savršenu klasifikaciju, verovatno propušta ciljnu promenljivu. Sukcesivno uklanjajte sumnjiva obeležja i merite pad performansi van mreže. 3. Provera vremenskog porekla i vremenskih oznaka: Proverite tačne vremenske oznake kreiranja/ažuriranja obeležja u odnosu na graničnu vremensku oznaku predikcije. Proverite da li je vrednost obeležja mogla biti poznata tek nakon što se ciljni događaj desio (npr. `cancellation_reason` ili `refund_status` popunjeni tek nakon otkazivanja ili povraćaja novca). 4. Verifikacija toka i inženjeringa podataka: Pregledajte izvorni data pipeline i logiku menjanja tabela (npr. promenljive tabele ažurirane na licu mesta naspram nepromenljivih zapisa koji se samo dodaju) kako biste proverili kada se polja popunjavaju.

from sklearn.metrics import roc_auc_score
from sklearn.tree import DecisionTreeClassifier

leakage_candidates = {}
for col in X_train.columns:
    clf = DecisionTreeClassifier(max_depth=2)
    clf.fit(X_train[[col]], y_train)
    preds = clf.predict_proba(X_test[[col]])[:, 1]
    auc = roc_auc_score(y_test, preds)
    if auc > 0.85:
        leakage_candidates[col] = auc

print("Candidate Leaky Features:", leakage_candidates)
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

16Kako birate između standardne K-Fold, Stratified K-Fold i Group K-Fold unakrsne validacije (cross-validation) prilikom evaluacije strukturiranih podataka iz realnog sveta?

Izbor između standardne K-Fold, Stratified K-Fold i Group K-Fold unakrsne validacije zavisi od raspodele ciljne promenljive i međusobne nezavisnosti redova: 1. Standardni K-Fold: Nasumično deli podatke na K jednakih podskupova (folds). Pretpostavlja da su opservacije nezavisne i identično raspodeljene (IID) i tipično se koristi za kontinualne regresione ciljne promenljive ili dobro balansirane skupove podataka (datasets). 2. Stratifikovani K-Fold (Stratified K-Fold): Obezbeđuje da svaki podskup zadrži isti procenat klasa ciljne promenljive kao i celokupan skup podataka. Ključan je za zadatke klasifikacije, posebno kod neuravnoteženih klasa (class imbalance), kako bi se izbeglo da podskupovi sadrže premalo ili nimalo uzoraka manjinske klase. 3. Grupni K-Fold (Group K-Fold): Obezbeđuje da se zasebne grupe/entiteti (npr. `user_id`, `patient_id`, `device_id`) ne pojavljuju istovremeno i u podskupu za obučavanje i u podskupu za validaciju. Kada više opservacija potiče od istog entiteta, standardno deljenje izaziva ozbiljno curenje podataka (data leakage) jer model pamti specifične osobine entiteta umesto da uči generalizovane obrasce. Group K-Fold procenjuje koliko se dobro model generalizuje na potpuno neviđene entitete.

from sklearn.model_selection import KFold, StratifiedKFold, GroupKFold, StratifiedGroupKFold

# Standard IID Regression:
cv_kfold = KFold(n_splits=5, shuffle=True, random_state=42)

# Imbalanced Classification (IID samples):
cv_strat = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)

# Grouped entities (e.g., repeated patient visits):
cv_group = GroupKFold(n_splits=5)

# Grouped entities with target imbalance:
cv_strat_group = StratifiedGroupKFold(n_splits=5)
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

17Kako birate između logističke regresije, stabala odlučivanja sa pojačavanjem gradijenta i nelinearnih neuronskih arhitektura za klasifikaciju tabelarnih podataka u uslovima ograničenja kašnjenja i pomeraja podataka?

Izbor između logističke regresije (LR), stabala odlučivanja sa pojačavanjem gradijenta (GBDT) i neuronskih mreža (NN) za klasifikaciju tabelarnih podataka podrazumeva balansiranje između prediktivne moći, dozvoljenog kašnjenja pri inferenciji, mogućnosti objašnjenja modela i otpornosti na pomeraj podataka (data drift). 1. Logistička regresija se ističe u okruženjima sa izuzetno niskim kašnjenjem (<1-5ms p99) i visoko ograničenim računarskim resursima. Pošto je njeno izračunavanje običan skalarni proizvod, izuzetno je brza i robusna. Pod pomerajem kovarijata ili raspodelom obeležja van opsega trening podataka (out-of-distribution), linearni modeli ekstrapoliraju monotono, što može biti predvidivo ili opasno u zavisnosti od regularizacije nagiba, ali retko daju nestabilno ponašanje u obliku stepenastih funkcija. Ipak, LR zahteva obiman ručni inženjering obeležja (interakcije, nelinearna podela u intervale) da bi parirala nelinearnim arhitekturama. 2. GBDT (npr. XGBoost, LightGBM, CatBoost) predstavljaju podrazumevani industrijski standard za tabelarne podatke. Oni izvorno prepoznaju složene nelinearne interakcije i efikasno obrađuju mešovite tipove podataka i nedostajuće vrednosti. U pogledu kašnjenja, optimizovani GBDT modeli (ili kompajlirani putem Treelite/ONNX) lako dostižu SLA ispod 10ms. Pri pomeraju podataka, GBDT ne mogu da ekstrapoliraju izvan granica uočenih tokom obuke (zadržavajući predikcije na krajnjim listovima), što pruža ugrađeni mehanizam zaštite od ekstremnih ekstrapolacija, ali nosi rizik od zastarelih stepenastih predikcija ako se raspodela obeležja značajno promeni. 3. Neuronske arhitekture (npr. FT-Transformer, TabNet, MLP) imaju prednost kada su tabelarni podaci multimodalni (kombinovani sa tekstom, embedding-om ili slikama) ili u scenarijima kontinualnog učenja na mreži (online learning). Međutim, čisto tabelarne neuronske mreže obično imaju veća kašnjenja pri inferenciji (zahtevaju množenje matrica kroz slojeve ili GPU akceleraciju), zahtevnije su za treniranje i veoma su osetljive na neskalirane ulaze i pomeraj kovarijata. U praksi: Započnite sa GBDT modelom kao snažnom osnovom za performanse; ako je obavezno kašnjenje u mikrosekundama ili jednostavna mogućnost objašnjenja, primenite LR; koristite neuronske mreže primarno za multimodalne arhitekture ili prenos embedding-a.

decision_matrix = {
    "Logistic Regression": {"Latency": "<1ms (Ultra-low)", "Drift Behavior": "Linear extrapolation", "Tabular Baseline": "Moderate (needs feature engineering)"},
    "GBDT (XGB/LightGBM)": {"Latency": "1-15ms (Fast)",      "Drift Behavior": "Leaf clamping (no extrapolation)", "Tabular Baseline": "State of the Art"},
    "Tabular Neural Net":  {"Latency": "10-50ms+ (Higher)",    "Drift Behavior": "Nonlinear extrapolation", "Tabular Baseline": "Competitive / High tuning cost"}
}
for model, traits in decision_matrix.items():
    print(f"{model}: Latency={traits['Latency']}, Tabular Perf={traits['Tabular Baseline']}")
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

Pitanja za napredni nivo

18Rukovodstvo mora da odluči da li da pokrene veliku funkcionalnost na nacionalnom nivou u uslovima neizvesnosti, uključujući mešovite regionalne rezultate eksperimentisanja i fiksne vremenske okvire za lansiranje. Kako projektujete okvir za strateške preporuke?

Da biste projektovali stratešku preporuku pod nejasnim regionalnim rezultatima eksperimentisanja i fiksnim vremenskim okvirima za lansiranje, trebalo bi da odvojite odluku od binarne „go/no-go” dileme. Prvo, raščlanite zbirne rezultate na heterogene efekte tretmana kroz tržišne segmente, kohorte korisnika i radna okruženja kako biste izolovali gde funkcionalnost uspeva, gde stagnira, a gde nanosi štetu. Drugo, osmislite strategiju postepenog uvođenja sa zaštitom od rizika (kao što su regionalno fazno uvođenje ili canary distribucije) koja daje prioritet segmentima sa visokom pouzdanošću, istovremeno izolujući rizik od ekstremno negativnih ishoda. Treće, uspostavite eksplicitne, unapred definisane zaštitne metrike (guardrail metrics) i automatizovane mehanizme prekida (circuit breakers) / pragove za vraćanje unazad (rollback) kako biste ograničili najgori mogući pad. Na kraju, komunikaciju sa rukovodstvom uokvirite oko očekivane vrednosti, asimetričnog rizika od gubitka u odnosu na komercijalni trošak propuštanja fiksnog vremenskog okvira, i operativnih planova za prilagođavanje u hodu.

| Rollout Tier | Target Markets | Launch Exposure | Guardrail Circuit-Breaker | Expected Value / Risk Profile |
|---|---|---|---|---|
| Tier 1: Immediate Launch | Cohorts with stat-sig positive lift (e.g., Regions A, C) | 100% | Rollback if 48h conversion drops > 1.5% | High upside; verified market fit |
| Tier 2: Phased Staging | High-variance / neutral cohorts (e.g., Region B) | 10% -> 25% -> 50% over 14 days | Hold expansion if CSAT drops > 2.0% | Moderate upside; bounded downside |
| Tier 3: Hold & Re-test | Stat-sig negative cohorts (e.g., Region D) | 0% (Holdout / internal testing) | Launch blocked until root-cause resolution | Eliminates primary churn risk |
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

19Kako biste projektovali centralizovani semantički sloj u okviru skladišta podataka na nivou preduzeća kako biste osigurali dosledne definicije poslovnih metrika između različitih analitičkih timova?

Projektovanje centralizovanog semantičkog sloja u skladištu podataka preduzeća zahteva uspostavljanje deklarativnog sloja definicije metrika zasnovanog na kodu (kao što su MetricFlow/dbt Semantic Layer, Cube ili LookML) koji odvaja poslovnu logiku od fizičkog skladištenja i alata za krajnju potrošnju podataka (BI platforme, Python/R beležnice, API-ji). Osnovna arhitektura definiše entitete, dimenzije, mere i izvedene metrike u repozitorijumima sa kontrolom verzija (Git) kako bi se obezbedio jedinstven izvor istine i osigurala doslednost metrika među timovima. Da bi se podržala višekorisnička arhitektura (multi-tenancy) i upravljanje između različitih poslovnih jedinica, treba primeniti federativni model upravljanja: osnovni poslovni KPI-jevi (npr. ARR, aktivni korisnici) u vlasništvu su centralnog tima za upravljanje podacima, dok metrike specifične za pojedinačne domene vode decentralizovani domenski timovi kroz izolovane semantičke modele uz CI/CD validaciju. Semantički sloj zatim izlaže standardizovane interfejse za upite (SQL, GraphQL, REST) sa objedinjenom kontrolom pristupa zasnovanom na ulogama i keširanjem/predagregacijom radi očuvanja performansi i doslednosti.

semantic_model:
  name: orders
  node_relation:
    alias: fct_orders
  dimensions:
    - name: order_date
      type: time
      type_params:
        time_granularity: day
    - name: country
      type: categorical
  measures:
    - name: total_revenue
      expr: revenue_usd
      agg: sum
    - name: distinct_buyers
      expr: user_id
      agg: count_distinct

metrics:
  - name: average_order_value
    description: "Governed metric for AOV across all BI tools"
    type: ratio
    type_params:
      numerator: total_revenue
      denominator: distinct_buyers
Pokušajte da odgovorite na ovo pitanje sa AI trenerom

20Na dvostranom tržištu (kao što su platforme za deljenje vožnje ili e-trgovina), kako biste osmislili eksperiment za procenu izmene algoritma za uparivanje, uzimajući u obzir kanibalizaciju ponude i potražnje i prostorno-vremensku interferenciju?

Na dvostranim tržištima, procena algoritama za uparivanje pomoću standardnog A/B testiranja na nivou korisnika narušava pretpostavku stabilne vrednosti tretmana jedinice (SUTVA). Kada jedinice u tretmanu troše oskudne deljene resurse (poput vozača ili zaliha), one kanibalizuju kontrolne jedinice, što dovodi do veštačkog pada performansi kontrolne grupe i nerealno uvećanih efekata tretmana usled promena tržišne ravnoteže. Za rešavanje prostorne i vremenske interferencije koristimo dve primarne eksperimentalne arhitekture: randomizaciju zasnovanu na klasterima i eksperimente sa naizmeničnim prebacivanjem (switchback). U prostornoj klasterskoj randomizaciji, geografska tržišta ili izolovane podoblasti (npr. diskretna gradska područja ili heksagonalne prostorne ćelije podeljene grafom) se randomizuju u tretman ili kontrolu. Ovo izoluje direktne interakcije ponude i potražnje, mada zahteva metode poput sintetičke kontrole ili razlike u razlikama (difference-in-differences) za kontrolu heterogenosti među tržištima. U switchback (vremenski podeljenim) eksperimentima, čitava izolovana tržišta naizmenično prelaze između algoritama tretmana i kontrole u diskretnim vremenskim prozorima (npr. smenjivanje na svakih 1–2 sata). Switchback eksperimenti održavaju zajednički balans ponude i potražnje unutar svakog prozora, ali uvode vremensku pristrasnost prenosa uticaja (carryover bias). Da bi se ovaj efekat ublažio, uvode se prelazni baferi ili periodi ispiranja (washout) između prozora (odbacivanjem porudžbina tokom promena stanja) i biraju se dužine prozora koje su dovoljno duge da apsorbuju repozicioniranje ponude, a dovoljno kratke da zadrže statističku snagu. Analiza mora uzeti u obzir serijski korelisane greške vremenskih serija klasterisanjem standardnih grešaka na nivou vremenskog bloka/tržišta ili korišćenjem uopštenih jednačina procene (GEE) / Newey-West procenitelja varijanse.

import pandas as pd
import numpy as np

def generate_switchback_schedule(n_days=14, window_minutes=60, washout_minutes=15):
    total_windows = int((n_days * 24 * 60) / window_minutes)
    np.random.seed(42)
    treatments = np.random.binomial(1, 0.5, size=total_windows)
    schedule = []
    for i, trt in enumerate(treatments):
        start_min = i * window_minutes
        eval_start_min = start_min + washout_minutes
        end_min = (i + 1) * window_minutes
        schedule.append({
            'window_id': i,
            'treatment': trt,
            'start_min': start_min,
            'eval_start_min': eval_start_min,
            'end_min': end_min
        })
    return pd.DataFrame(schedule)
Pokušajte da odgovorite na ovo pitanje sa AI trenerom