반사실 기준선

Counterfactual baseline

캠페인이 없었을 때의 결과를 추정해 실제와 비교합니다.

···
html
<div class="cf"><div class="title">ACTUAL VS NO-CAMPAIGN <b id="diff">+0</b></div><svg viewBox="0 0 400 160" preserveAspectRatio="none" aria-label="Actual sales above estimated baseline"><path id="area" fill="var(--accent)" opacity=".22"></path><path id="actual" fill="none" stroke="var(--accent)" stroke-width="5"></path><path d="M15 126 L95 113 L175 102 L255 89 L335 77 L390 66" fill="none" stroke="var(--muted)" stroke-width="3" stroke-dasharray="8 6"></path></svg><div class="legend"><span>● ACTUAL</span><span>┄ ESTIMATED BASELINE</span></div></div>
css
.cf{width:min(87%,600px);font:850 clamp(10px,max(2vmin,1vw),14px)/1.2 sans-serif}.title,.legend{display:flex;justify-content:space-between;gap:10px}.title{border-bottom:2px solid var(--fg);padding-bottom:9px}.title b{color:var(--accent)}svg{display:block;width:100%;height:clamp(95px,25vmin,185px);margin-top:clamp(8px,2vmin,16px)}.legend{border-top:1px solid var(--line);padding-top:8px;font-size:clamp(10px,max(1.5vmin,1vw),12px);color:var(--muted)}.legend span:first-child{color:var(--accent)}
js
let up=false;function draw(){const base=[126,113,102,89,77,66],x=[15,95,175,255,335,390],actual=base.map((v,i)=>v-(up?i*9:0));document.querySelector('#actual').setAttribute('d',x.map((v,i)=>(i?'L':'M')+v+' '+actual[i]).join(' '));document.querySelector('#area').setAttribute('d',x.map((v,i)=>(i?'L':'M')+v+' '+actual[i]).join(' ')+' '+x.slice().reverse().map((v,j)=>'L'+v+' '+base[base.length-1-j]).join(' ')+' Z');document.querySelector('#diff').textContent=up?'+45 INDEX':'+0'}draw();setInterval(()=>{up=!up;draw()},1700);

반사실 기준선은 캠페인을 하지 않았으면 어떤 결과가 나왔을지를 뜻합니다. 그 세계를 직접 관측할 수 없으므로 통제군, 지역 실험, 시계열 모형 등으로 추정합니다.

데모는 실제 결과선과 추정 기준선 사이를 색으로 채웁니다. 모든 실제 매출을 광고 성과로 잡지 않고 두 선의 차이를 살펴보는 방식입니다.

기준선이 틀리면 증분 추정도 틀립니다. 계절성, 가격 변경, 다른 프로모션 같은 교란 요인을 설계 단계에서 확인하세요.

언제 쓰나

캠페인 전후 매출 차이를 인과 효과로 해석하기 전에 기준선을 세울 때 씁니다.

페이지로 열기 ↗