<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>BLUEBERRY</title>
    <link>https://code77.tistory.com/</link>
    <description>개발 또는 기획 또는 마케팅</description>
    <language>ko</language>
    <pubDate>Sun, 21 Jun 2026 09:12:07 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Aramir</managingEditor>
    <image>
      <title>BLUEBERRY</title>
      <url>https://tistory1.daumcdn.net/tistory/4394523/attach/caf481f101e7411daba82981cb9addce</url>
      <link>https://code77.tistory.com</link>
    </image>
    <item>
      <title>RAG 재순위(re-ranking) &amp;mdash; cross-encoder로 검색 정밀도를 한 단계 올리기</title>
      <link>https://code77.tistory.com/130</link>
      <description>&lt;article class=&quot;tistory-mirror-post&quot; data-source-slug=&quot;rag-reranking-cross-encoder&quot;&gt;
&lt;p class=&quot;tistory-description&quot; data-ke-size=&quot;size16&quot;&gt;벡터 검색이 가져온 Top 50을 LLM에 그대로 넘기면 정밀도가 깨집니다. cross-encoder 재순위가 그 50개를 다시 정렬해 Top 5만 LLM에 넘기면 답변 품질이 한 단계 올라갑니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG 챗봇 답변이 자주 빗나간다면, 모델&amp;middot;프롬프트보다 검색 단계가 약할 가능성이 큽니다. 벡터 검색은 빠르지만 의미 매칭의 정밀도가 부족합니다. cross-encoder 재순위(re-ranking)는 1단계 검색의 Top 50을 다시 정렬해 정말 관련 있는 Top 5를 LLM에 넘깁니다. 한 단계 추가로 답변 품질이 눈에 띄게 올라갑니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마케터가 이 글을 읽어야 하는 이유&lt;/b&gt;: RAG 챗봇이 운영에 들어가 있다면, 답변 품질의 절반이 검색 단계에서 결정됩니다. 모델 교체보다 비용 효율적인 개선이 재순위 단계 추가입니다. 비용 약간 증가에 정밀도 큰 폭 상승. 사내 챗봇 신뢰도가 흔들리는 자리라면 가장 먼저 시도할 카드입니다.&lt;/p&gt;
&lt;figure class=&quot;tistory-figure&quot; style=&quot;margin: 28px 0; text-align: center;&quot;&gt;&lt;img style=&quot;max-width: 100%; height: auto; border-radius: 10px;&quot; src=&quot;https://blog.trysitely.com/img/rag-reranking-cross-encoder-hero.png&quot; alt=&quot;벡터 검색이 빠르게 50개를 가져오고 cross-encoder가 그 50개를 다시 정렬해 Top 5만 LLM에 넘기는 2단계 흐름&quot; /&gt;
&lt;figcaption style=&quot;margin-top: 10px; color: #5b6474; font-size: 0.92em; line-height: 1.6;&quot;&gt;빠른 1차 검색 + 정밀한 2차 재순위. 비용은 작게, 품질은 크게.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 왜 1차 검색만으로 부족한가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;벡터 검색(bi-encoder 기반)은 사용자 질문과 문서를 각각 독립적으로 임베딩한 뒤 코사인 유사도로 비교합니다. 이 구조는 빠르지만 한 가지 약점이 있습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;질문과 문서가 서로 직접 비교되지 않고, 미리 만든 임베딩으로만 비교된다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 단어라도 문맥이 다르면 의미가 다릅니다. &quot;Meta 캠페인 ROAS&quot;가 페이스북 광고를 의미하는지 메타분석을 의미하는지의 구분이 1차 검색에서는 약합니다. 그래서 Top 5가 깨끗하지 않고 무관한 문서가 자주 섞입니다.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;검색 단계&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;입력&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;비교 방식&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;정밀도&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;속도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1차 (벡터)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;질문 임베딩&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;미리 만든 문서 임베딩과 코사인&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;중간&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;매우 빠름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;2차 (cross-encoder)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;질문 + 문서 쌍&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;매번 함께 입력해 점수 출력&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;매우 높음&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;느림&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cross-encoder는 정밀하지만 모든 문서에 적용하면 너무 느립니다. 그래서 1차 검색으로 Top 50을 빠르게 가져온 뒤 그 50개에만 cross-encoder를 적용하는 2단계 흐름이 표준이 되었습니다.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--note&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;이 글의 전제&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;독자가 RAG 챗봇&amp;middot;임베딩&amp;middot;벡터 검색이라는 단어를 일상으로 쓴다고 가정합니다. 코드를 직접 짠 적은 없어도 OK이고, 검색 단계가 답변 품질에 영향을 준다는 직관은 받아들인다고 가정합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Cross-encoder의 한 줄 직관&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cross-encoder는 질문과 문서를 한 번에 모델에 넣어 &quot;얼마나 관련 있는가&quot;의 점수를 직접 출력합니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력: [질문] [SEP] [문서] &amp;rarr; 출력: 관련도 점수 (0~1)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bi-encoder처럼 임베딩을 미리 만들어 둘 수 없습니다. 매 쿼리마다 50개 문서 각각에 대해 모델 forward를 돌려야 합니다. 그래서 느림. 대신 두 텍스트의 모든 토큰이 attention으로 직접 연결되니 의미 매칭의 정밀도가 폭발적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수식 직관:&lt;/p&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;score&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0359em;&quot; class=&quot;mord mathnormal&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;margin-right: 0.1667em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;CrossEncoder&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;([&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0359em;&quot; class=&quot;mord mathnormal&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.1667em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;])&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bi-encoder는 &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mop&quot;&gt;cos&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;embed&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0359em;&quot; class=&quot;mord mathnormal&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;margin-right: 0.1667em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;embed&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;로 두 임베딩의 코사인을 계산하지만, cross-encoder는 두 텍스트를 함께 모델에 넣어 단일 점수를 출력합니다. 토큰끼리 직접 attention하니 미묘한 문맥 차이를 잡아냅니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 2단계 검색의 표준 흐름&lt;/h2&gt;
&lt;pre class=&quot;lsl&quot;&gt;&lt;code&gt;사용자 질문
    │
    ▼
1차 검색 (bi-encoder + vector DB)
  &amp;rarr; Top 50 문서를 매우 빠르게 (수십 ms)
    │
    ▼
2차 재순위 (cross-encoder)
  &amp;rarr; Top 50을 정밀 점수로 정렬
  &amp;rarr; 상위 Top 5만 살림 (수백 ms)
    │
    ▼
Top 5를 LLM 프롬프트에 컨텍스트로 삽입
    │
    ▼
LLM이 답변 생성
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 단계의 책임이 분명해지고, 시스템 전체의 정밀도가 올라갑니다. 비용은 cross-encoder 50번 호출 = 수백 ms 지연 + 약간의 GPU/API 비용. 품질 개선이 비용을 항상 정당화한다는 게 RAG 운영 표준이 되어가는 이유입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 코드 한 묶음 &amp;mdash; sentence-transformers cross-encoder&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 글에 박는 유일한 코드입니다.&lt;/p&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;from sentence_transformers import CrossEncoder

# 1. cross-encoder 모델 로드 (한 번만)
reranker = CrossEncoder(&quot;BAAI/bge-reranker-base&quot;)

# 2. 1차 검색 결과 (벡터 DB가 빠르게 가져온 Top 50)
query = &quot;Meta 광고 ROAS 분기별 평균은?&quot;
candidates = [
    &quot;2024 Q3 Meta 광고 ROAS 평균은 4.2였습니다...&quot;,
    &quot;메타분석에서 평균 효과크기는 0.35로...&quot;,
    &quot;TikTok ROAS는 평균 3.1, Meta는 4.2...&quot;,
    # ... 47개 더
]

# 3. cross-encoder로 (질문, 문서) 쌍을 점수화
pairs = [(query, doc) for doc in candidates]
scores = reranker.predict(pairs)
# scores: [0.92, 0.18, 0.85, ...]

# 4. 점수 기준 정렬 후 Top 5만 살림
ranked = sorted(zip(scores, candidates), reverse=True)[:5]
top_5 = [doc for _, doc in ranked]
print(top_5)
# 1차 검색에서 메타분석 문서가 섞여 있었지만 cross-encoder가 점수 0.18로 떨궈냄.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;50개 문서에 대해 각각 점수를 계산하니 수백 ms 지연이 추가됩니다. 그러나 잘못 섞여 들어왔던 메타분석 문서가 0.18 점수로 떨어져 Top 5에서 빠지고, 정확한 광고 ROAS 문서들이 살아 LLM 컨텍스트로 들어갑니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 모델 선택 &amp;mdash; 어떤 cross-encoder를 쓸까&lt;/h2&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;모델&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;크기&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;한국어 지원&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;추론 속도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;cross-encoder/ms-marco-MiniLM-L-6-v2&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;작음 (22M)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;약함&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;가장 빠름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;cross-encoder/ms-marco-MiniLM-L-12-v2&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;중간 (33M)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;약함&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;빠름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;BAAI/bge-reranker-base&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;중간 (278M)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;강함 (multilingual)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;중간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;BAAI/bge-reranker-large&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;큼 (560M)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;매우 강함&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;느림&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Cohere Rerank API&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;매니지드&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;강함&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;빠름 (클라우드)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한국어 RAG에는 &lt;code&gt;BAAI/bge-reranker-base&lt;/code&gt; 이상을 권장합니다. 영어 전용 모델은 한국어 매칭이 약함. 매니지드 솔루션이 필요하면 Cohere Rerank API.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5-1. Cohere Rerank API의 자리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 호출 한 번으로 100개 문서 재순위. 자체 호스팅 부담 없음. 비용은 1000번 검색당 약 $1-2. 챗봇 검색 트래픽이 일일 수만 건 이하면 합리적.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--tip&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;모델 선택 트레이드오프&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 &lt;code&gt;BAAI/bge-reranker-base&lt;/code&gt; 또는 Cohere Rerank로 시작. 정밀도 부족 시 large 모델로 업그레이드. 큰 모델일수록 GPU 비용&amp;middot;지연이 비례적으로 증가하니, 골든셋 평가에서 구체적 정밀도 차이를 확인 후 결정.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 1차 검색의 K값 &amp;mdash; Top 몇 개를 재순위에 넘기나&lt;/h2&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;K (1차 결과 수)&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;효과&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;비용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;정밀도 한도 (재순위가 살릴 수 있는 게 적음)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;매우 낮음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;50&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;표준 &amp;mdash; 대부분 자리에 적합&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;적당&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;100&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;높은 recall, cross-encoder 100번 호출&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;높음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;200+&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;거의 모든 후보 검토, 비용 폭발&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;매우 높음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;K=50이 표준이 되어가고 있습니다. 정밀도와 비용의 균형이 가장 좋은 자리. 매우 큰 코퍼스(수백만 문서)에서는 K=100이 안전.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 평가 &amp;mdash; 재순위가 정말 도움이 됐나&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재순위 단계 추가가 의미 있는지 측정하려면 RAG 평가 지표를 함께 봐야 합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7-1. Context Relevance와 Recall&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.trysitely.com/posts/rag-evaluation/&quot;&gt;RAG 평가&lt;/a&gt;에서 다룬 4가지 지표 중 Context Relevance와 Context Recall이 재순위 효과를 직접 반영합니다. 재순위 ON/OFF를 토글해 같은 골든셋에서 두 지표를 비교.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;시나리오&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;Context Relevance&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;Context Recall&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;Faithfulness&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;재순위 OFF (Top 5 직접)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;0.78&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;0.85&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;0.81&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;재순위 ON (Top 50 &amp;rarr; Top 5)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;0.91&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;0.88&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;0.93&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Context Relevance가 0.78 &amp;rarr; 0.91로 큰 폭 상승. Faithfulness도 0.81 &amp;rarr; 0.93. 재순위 단계가 답변 품질 전반에 영향을 미친다는 게 정량적으로 확인됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7-2. 응답 시간의 트레이드오프&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재순위 단계 추가는 약 200-500ms 지연을 만듭니다. 사용자가 인식할 만한 지연이 아니지만 챗봇 응답이 이미 느린 자리(p95 5초+)에서는 추가 부담이 됩니다.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--warn&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;재순위가 의미 없는 자리&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코퍼스가 매우 작거나(수백 문서) 1차 검색 정밀도가 이미 매우 높은 자리에서는 재순위 효과가 미미할 수 있습니다. 도입 전에 골든셋으로 ON/OFF 비교를 한 번 돌려보고 결정.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 운영 흐름의 안정화&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8-1. 캐싱&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 (질문, 문서) 쌍에 대해 점수를 캐시해두면 반복 질문 시 cross-encoder 호출이 줄어듭니다. 챗봇 트래픽의 20-40%가 같은 질문 패턴이라 캐시 히트율이 높음.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8-2. 배치 처리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cross-encoder는 배치 처리가 강합니다. 50개 쌍을 한 배치로 묶어 한 번에 forward하면 개별 호출보다 5-10배 빠름. PyTorch DataLoader 같은 표준 패턴 활용.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8-3. 모니터링 알림&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재순위 점수의 분포를 매주 추적합니다. 갑자기 모든 점수가 낮아지면(예: 평균 0.3 이하) 임베딩 모델&amp;middot;코퍼스 변화 의심.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 마치며 &amp;mdash; RAG 품질 개선의 가장 비용 효율적인 자리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG 챗봇 품질 개선에 큰 비용을 쓰기 전에 cross-encoder 재순위 단계를 한 번 시도해보는 게 가장 비용 효율적인 카드입니다. 모델 교체&amp;middot;프롬프트 튜닝보다 적은 비용으로 Context Relevance&amp;middot;Faithfulness가 큰 폭 상승하는 케이스가 흔합니다. 운영 중인 챗봇이 자주 빗나간다면 이 단계 추가를 분기 로드맵에 박아두세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 분기에 한 번만 시도해 볼 만한 것은 골든셋 50개에 대해 재순위 ON/OFF 비교를 한 번 돌려 정밀도 차이를 정량화하는 흐름입니다. 차이가 크면 즉시 운영 도입, 작으면 다른 단계로.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;다음에 읽을 글&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.trysitely.com/posts/rag-evaluation/&quot;&gt;RAG 평가&lt;/a&gt; &amp;mdash; 재순위 효과를 측정하는 4가지 지표&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.trysitely.com/posts/embedding-ops/&quot;&gt;임베딩 운영&lt;/a&gt; &amp;mdash; 1차 검색 임베딩 모델 관리&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.trysitely.com/posts/rag-cost-latency/&quot;&gt;RAG 비용&amp;middot;latency&lt;/a&gt; &amp;mdash; 재순위 추가 시 latency 트레이드오프&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;Sentence-BERT&quot; (Reimers &amp;amp; Gurevych, 2019): &lt;a href=&quot;https://arxiv.org/abs/1908.10084&quot;&gt;https://arxiv.org/abs/1908.10084&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;BAAI BGE Reranker: &lt;a href=&quot;https://huggingface.co/BAAI/bge-reranker-base&quot;&gt;https://huggingface.co/BAAI/bge-reranker-base&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Cohere, &quot;Rerank API&quot;: &lt;a href=&quot;https://docs.cohere.com/docs/rerank&quot;&gt;https://docs.cohere.com/docs/rerank&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&quot;MS MARCO passage ranking benchmark&quot;: &lt;a href=&quot;https://microsoft.github.io/msmarco/&quot;&gt;https://microsoft.github.io/msmarco/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&quot;Pretrained Transformers for Text Ranking&quot; (Lin et al., 2021): &lt;a href=&quot;https://arxiv.org/abs/2010.06467&quot;&gt;https://arxiv.org/abs/2010.06467&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/article&gt;</description>
      <category>AI&amp;middot;LLM</category>
      <category>cross-encoder</category>
      <category>precision</category>
      <category>Rag</category>
      <category>reranking</category>
      <category>Retrieval</category>
      <author>Aramir</author>
      <guid isPermaLink="true">https://code77.tistory.com/130</guid>
      <comments>https://code77.tistory.com/130#entry130comment</comments>
      <pubDate>Sun, 17 May 2026 09:17:55 +0900</pubDate>
    </item>
    <item>
      <title>Prophet과 CausalImpact &amp;mdash; 시계열 예측과 캠페인 인과 효과</title>
      <link>https://code77.tistory.com/129</link>
      <description>&lt;article class=&quot;tistory-mirror-post&quot; data-source-slug=&quot;prophet-causalimpact&quot;&gt;
&lt;p class=&quot;tistory-description&quot; data-ke-size=&quot;size16&quot;&gt;Prophet은 시즌&amp;middot;트렌드를 자동 분리해 예측을 단순화하고, CausalImpact는 그 예측을 baseline으로 캠페인 효과를 추정합니다. 마케팅 자리의 두 도구 결합 사용 패턴.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캠페인 시작 후 매출이 +20% 올랐다면 그게 캠페인 효과인지 시즌&amp;middot;트렌드 효과인지 구분이 어렵습니다. CausalImpact는 캠페인이 없었을 때의 매출 예측(counterfactual)을 baseline으로 잡고, 실제 매출과의 차이를 캠페인 효과로 추정합니다. baseline 예측에 Prophet 같은 state-space 모델이 자주 들어갑니다. 두 도구의 결합이 마케팅 인과 분석의 표준 패턴 중 하나입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마케터가 이 글을 읽어야 하는 이유&lt;/b&gt;: 분기 캠페인의 효과를 보고할 때 &quot;전년 동기 대비 +20%&quot;는 시즌&amp;middot;트렌드 효과가 섞여 있어 정직하지 않습니다. CausalImpact가 시즌&amp;middot;트렌드를 분리한 baseline을 만들어주면, 캠페인의 진짜 효과를 회의에서 데이터로 답할 수 있습니다.&lt;/p&gt;
&lt;figure class=&quot;tistory-figure&quot; style=&quot;margin: 28px 0; text-align: center;&quot;&gt;&lt;img style=&quot;max-width: 100%; height: auto; border-radius: 10px;&quot; src=&quot;https://blog.trysitely.com/img/prophet-causalimpact-hero.png&quot; alt=&quot;Prophet baseline 예측선 위에 캠페인 시작 시점부터 실제값이 갈라지는 그래프&quot; /&gt;
&lt;figcaption style=&quot;margin-top: 10px; color: #5b6474; font-size: 0.92em; line-height: 1.6;&quot;&gt;baseline = 캠페인이 없었을 때의 예측. 실제와의 차이가 캠페인 효과의 정직한 추정.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Prophet의 한 줄 직관&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Facebook이 만든 시계열 예측 라이브러리. 매끄러운 트렌드 + 주기적 시즌 + 휴일 효과로 시계열을 분해.&lt;/p&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0359em;&quot; class=&quot;mord mathnormal&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0359em;&quot; class=&quot;mord mathnormal&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.5806em; vertical-align: -0.15em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;&amp;epsilon;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.2806em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: 0em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0359em;&quot; class=&quot;mord mathnormal&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: 트렌드 (선형 또는 logistic)&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: 시즌 (주기적 푸리에 항)&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: 휴일 효과&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.5806em; vertical-align: -0.15em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;&amp;epsilon;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.2806em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: 0em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: 잔차 노이즈&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동으로 트렌드&amp;middot;시즌&amp;middot;휴일을 분리해 예측. 마케팅 시계열(매출&amp;middot;전환&amp;middot;CTR) 자리에 자연스럽게 적용.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--note&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;이 글의 전제&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;독자가 시계열 예측이라는 단어는 들어본 적 있고, 회귀의 직관 정도는 받아들인다고 가정합니다. 코드를 직접 짠 적은 없어도 됩니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. CausalImpact의 한 줄 직관&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Google이 만든 인과 분석 라이브러리. Bayesian state-space 모델로 처리 전 데이터를 학습한 뒤 처리 후 시점의 baseline을 예측. 실제값과 baseline의 차이가 인과 효과.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처리 후 시점의 &quot;캠페인이 없었다면 어땠을까&quot;를 데이터로 추정.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;단계&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;작업&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1. 학습&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;처리 전 데이터로 baseline 모델 학습&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;2. 예측&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;처리 후 baseline 예측 (counterfactual)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;3. 차이&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;실제값 - baseline = 인과 효과&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;4. 신뢰구간&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Bayesian posterior에서 직접&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처리 전 충분한 데이터(보통 6주+)가 있으면 정직한 baseline 가능.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 두 도구의 결합 &amp;mdash; Prophet &amp;rarr; CausalImpact 백엔드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CausalImpact의 기본 baseline 모델은 BSTS(Bayesian Structural Time Series). Prophet으로 baseline 예측한 뒤 CausalImpact 식으로 처리 효과 추정하는 패턴이 유연.&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;처리 전 시계열
     │
     ▼
Prophet (트렌드 + 시즌 분리)
     │
     ▼
처리 후 baseline 예측 (Prophet의 yhat)
     │
     ▼
실제 처리 후 - baseline = 캠페인 효과
     │
     ▼
Bootstrap 95% CI
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Prophet의 강점(트렌드&amp;middot;시즌 자동 분리) + CausalImpact의 강점(인과 효과 추정 + 신뢰구간)을 결합.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 마케팅 자리의 적용&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-1. 분기 캠페인 효과&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분기 시작에 큰 캠페인 시작. 그 시점 이후 매출의 캠페인 기여를 baseline 차이로 추정.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-2. 신규 광고 채널 도입&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새 채널 광고 시작한 시점부터의 매출 lift 추정. 채널 도입이 무작위 배정이 아니라 RDD&amp;middot;DiD 적용 어려움. CausalImpact가 표준.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-3. 가격 변경의 영향&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상품 가격 인상&amp;middot;할인 시작 후 판매량 변화. 자연 실험으로 효과 추정.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-4. 이벤트&amp;middot;시즌 이상치 탐지&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블랙프라이데이 같은 이벤트의 매출 lift를 baseline 대비로 측정.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;자리&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;처리 시점&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;baseline 데이터&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;분기 캠페인&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;캠페인 시작일&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;처리 전 8-12주&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;신규 채널&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;채널 도입일&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;처리 전 6주+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;가격 변경&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;변경일&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;처리 전 8주+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;이벤트 lift&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;이벤트일&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;작년 동기간&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 코드 한 묶음 &amp;mdash; Prophet + CausalImpact&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 글에 박는 유일한 코드입니다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/article&gt;</description>
      <category>통계&amp;middot;ML</category>
      <category>causal-impact</category>
      <category>forecasting</category>
      <category>prophet</category>
      <category>state-space</category>
      <category>time-series</category>
      <author>Aramir</author>
      <guid isPermaLink="true">https://code77.tistory.com/129</guid>
      <comments>https://code77.tistory.com/129#entry129comment</comments>
      <pubDate>Sun, 17 May 2026 09:17:05 +0900</pubDate>
    </item>
    <item>
      <title>Propensity score matching &amp;mdash; 무작위 배정이 안 되는 자리에서 인과 효과 추정</title>
      <link>https://code77.tistory.com/128</link>
      <description>&lt;article class=&quot;tistory-mirror-post&quot; data-source-slug=&quot;propensity-score-matching&quot;&gt;
&lt;p class=&quot;tistory-description&quot; data-ke-size=&quot;size16&quot;&gt;광고를 본 사람과 안 본 사람을 그냥 비교하면 자가 선택 편향이 큽니다. PSM은 두 그룹을 비슷한 특성으로 매칭해 비교가 가능한 짝을 만듭니다. 마케팅 자리에 적용하는 PSM 워크플로.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;광고 본 사람들의 구매율 8%, 안 본 사람들 구매율 3% &amp;mdash; 광고가 5%p 끌어올렸다.&quot; 이 단순 비교의 함정은 분명합니다. 광고를 본 사람들이 원래 더 관심 있었던 사람일 가능성이 큽니다(자가 선택 편향). 무작위 배정 lift 실험을 못 돌리는 자리에서 자주 마주칩니다. propensity score matching(PSM)은 이 편향을 줄여 인과 효과를 추정하는 표준 도구입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마케터가 이 글을 읽어야 하는 이유&lt;/b&gt;: 광고 노출과 전환의 단순 비교는 ROAS 보고에 자주 들어가지만 인과 효과는 거의 항상 과대 추정됩니다. PSM의 직관과 한계를 알면, 회의에서 &quot;이 숫자가 인과인가 상관인가&quot;를 정직하게 분리할 수 있습니다.&lt;/p&gt;
&lt;figure class=&quot;tistory-figure&quot; style=&quot;margin: 28px 0; text-align: center;&quot;&gt;&lt;img style=&quot;max-width: 100%; height: auto; border-radius: 10px;&quot; src=&quot;https://blog.trysitely.com/img/propensity-score-matching-hero.png&quot; alt=&quot;노출 그룹과 비노출 그룹을 사용자 특성으로 매칭해 비슷한 짝을 만들고 전환율을 비교하는 PSM 다이어그램&quot; /&gt;
&lt;figcaption style=&quot;margin-top: 10px; color: #5b6474; font-size: 0.92em; line-height: 1.6;&quot;&gt;비슷한 특성을 가진 사람끼리 짝짓고 그 짝의 행동 차이로 인과 효과를 본다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 자가 선택 편향과 PSM의 직관&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;광고 노출은 무작위가 아닙니다. 플랫폼이 &quot;광고에 반응할 가능성이 높은 사람&quot;에 더 많이 노출시킵니다. 그래서 노출 그룹은 비노출 그룹보다 원래 구매 의향이 높은 사람들로 구성됩니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노출 그룹의 구매율 - 비노출 그룹의 구매율 = 광고 효과 + 자가 선택 편향&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PSM은 이 편향을 줄이는 한 가지 도구입니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노출 그룹의 각 사람마다 &quot;비슷한 특성을 가진&quot; 비노출 그룹 사람을 짝지어, 그 짝끼리만 비교한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비슷하다는 기준이 propensity score &amp;mdash; &quot;이 사람이 노출될 확률&quot;의 추정치. 같은 propensity score를 가진 두 사람은 노출에 대한 사전 성향이 같으니 비교가 정직합니다.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--note&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;이 글의 전제&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;독자가 A/B 테스트&amp;middot;인과추론이라는 단어를 일상으로 쓰고, 회귀&amp;middot;로지스틱이라는 단어 정도는 들어봤다고 가정합니다. 코드를 직접 짠 적은 없어도 됩니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Propensity score의 정의&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 사람이 노출 그룹에 들어갈 확률을 그 사람의 특성으로 예측한 값.&lt;/p&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0785em;&quot; class=&quot;mord mathnormal&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mop&quot;&gt;Pr&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord hangul_fallback&quot;&gt;노출&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;∣&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0785em;&quot; class=&quot;mord mathnormal&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6833em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0785em;&quot; class=&quot;mord mathnormal&quot;&gt;X&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;는 사용자 특성(연령, 성별, 과거 구매, 페이지 방문 등). 로지스틱 회귀가 표준 추정 모델.&lt;/p&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0785em;&quot; class=&quot;mord mathnormal&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 2.2574em; vertical-align: -0.936em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 1.3214em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.314em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mop&quot;&gt;exp&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&amp;minus;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.0528em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;beta;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3011em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.0528em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&amp;minus;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.0528em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;beta;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3011em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.0528em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.0785em;&quot; class=&quot;mord mathnormal&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3011em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.0785em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&amp;minus;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&amp;minus;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.0528em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;beta;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3361em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.0528em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span style=&quot;margin-right: 0.0315em;&quot; class=&quot;mord mathnormal mtight&quot;&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.0785em;&quot; class=&quot;mord mathnormal&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3361em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.0785em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span style=&quot;margin-right: 0.0315em;&quot; class=&quot;mord mathnormal mtight&quot;&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3.23em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;border-bottom-width: 0.04em;&quot; class=&quot;frac-line&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3.677em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.936em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 모델로 모든 사람의 propensity score를 계산. 그 값이 비슷한 노출&amp;middot;비노출 사람을 짝지어 비교.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. PSM 워크플로 &amp;mdash; 5단계&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1. 1단계: 특성 변수 선택&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노출과 결과(전환) 둘 다에 영향을 주는 변수들을 모음. 흔한 자리:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인구통계 &amp;mdash; 연령, 성별, 지역&lt;/li&gt;
&lt;li&gt;과거 행동 &amp;mdash; 방문 빈도, 마지막 구매일, 평균 구매액&lt;/li&gt;
&lt;li&gt;사용자 세그먼트 &amp;mdash; 신규 vs 기존, 카테고리 선호&lt;/li&gt;
&lt;li&gt;디바이스&amp;middot;매체 &amp;mdash; 모바일 vs 데스크톱, 유입 채널&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 단계가 가장 중요합니다. 빠뜨린 confounder가 있으면 매칭의 효력이 약해집니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-2. 2단계: propensity score 추정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로지스틱 회귀 또는 GBM으로 노출 여부를 예측하는 모델 학습. 모든 사람의 propensity score 계산.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-3. 3단계: 매칭&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 노출 그룹 사람마다 propensity score가 비슷한 비노출 사람을 1명(또는 N명) 짝지음. 매칭 알고리즘:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Nearest neighbor &amp;mdash; 가장 가까운 1명 매칭&lt;/li&gt;
&lt;li&gt;Caliper &amp;mdash; score 차이가 임계값 이내인 경우만 매칭&lt;/li&gt;
&lt;li&gt;Stratification &amp;mdash; score 구간으로 나눠 구간별 비교&lt;/li&gt;
&lt;li&gt;Kernel matching &amp;mdash; 가중치로 여러 사람을 결합&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-4. 4단계: balance 점검&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매칭 후 두 그룹의 특성 분포가 정말 비슷해졌는지 확인. 표준화된 평균 차이(SMD) &amp;lt; 0.1이면 균형 OK.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-5. 5단계: 효과 추정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매칭된 짝의 결과 차이의 평균이 추정 인과 효과(ATT, Average Treatment effect on the Treated).&lt;/p&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6833em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;ATT&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 2.7159em; vertical-align: -1.3944em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 1.3214em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.314em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.109em;&quot; class=&quot;mord mathnormal&quot;&gt;N&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3283em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.109em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span style=&quot;margin-right: 0.1389em;&quot; class=&quot;mord mathnormal mtight&quot;&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3.23em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;border-bottom-width: 0.04em;&quot; class=&quot;frac-line&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3.677em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.836em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.1667em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mop op-limits&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 1.05em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -1.8557em; margin-left: 0em;&quot;&gt;&lt;span style=&quot;height: 3.05em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;mrel mtight&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span style=&quot;margin-right: 0.1389em;&quot; class=&quot;mord mathnormal mtight&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3281em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.357em; margin-left: -0.1389em; margin-right: 0.0714em;&quot;&gt;&lt;span style=&quot;height: 2.5em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size3 size1 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.143em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mrel mtight&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3.05em;&quot;&gt;&lt;span style=&quot;height: 3.05em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span&gt;&lt;span class=&quot;mop op-symbol large-op&quot;&gt;&amp;sum;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 1.3944em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mord mathnormal&quot;&gt;Y&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3117em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.2222em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&amp;minus;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1.1052em; vertical-align: -0.3552em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mord mathnormal&quot;&gt;Y&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3448em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.5198em; margin-left: -0.2222em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;matched&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3552em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;단계&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;도구&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1. 변수 선택&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;도메인 지식 + EDA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;2. propensity 추정&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;로지스틱 회귀&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;3. 매칭&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Nearest neighbor (1:1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;4. balance&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;SMD, KS 검정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;5. 효과&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;ATT&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 코드 한 묶음 &amp;mdash; Python으로 PSM&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 글에 박는 유일한 코드입니다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/article&gt;</description>
      <category>통계&amp;middot;ML</category>
      <category>causal-inference</category>
      <category>incrementality</category>
      <category>matching</category>
      <category>observational</category>
      <category>PSM</category>
      <author>Aramir</author>
      <guid isPermaLink="true">https://code77.tistory.com/128</guid>
      <comments>https://code77.tistory.com/128#entry128comment</comments>
      <pubDate>Sun, 17 May 2026 09:16:15 +0900</pubDate>
    </item>
    <item>
      <title>Prompt caching 운영 경제학 &amp;mdash; 같은 프롬프트를 1000번 보낼 때 비용을 90% 줄이는 법</title>
      <link>https://code77.tistory.com/127</link>
      <description>&lt;article class=&quot;tistory-mirror-post&quot; data-source-slug=&quot;prompt-caching-1000-90&quot;&gt;
&lt;p class=&quot;tistory-description&quot; data-ke-size=&quot;size16&quot;&gt;시스템 프롬프트&amp;middot;페르소나&amp;middot;문서가 호출마다 동일하다면 그 부분을 캐시할 수 있습니다. Anthropic&amp;middot;OpenAI의 prompt caching 작동 원리와 마케팅 자동화의 비용을 90% 깎는 운영 패턴.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;광고 카피 양산을 LLM에 자동화한 뒤 첫 달 청구서를 받으면 자주 놀랍니다. 같은 페르소나&amp;middot;같은 브랜드 가이드를 매번 보내는데 그 부분이 매번 입력 토큰으로 잡혀 비용을 만듭니다. prompt caching은 이 반복되는 부분을 캐시 영역으로 표시해, 두 번째 호출부터는 그 부분을 캐시 토큰(가격 1/10)으로 처리합니다. 마케팅 자동화의 운영 비용을 90% 가까이 깎을 수 있는 단순하고 강력한 도구입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마케터가 이 글을 읽어야 하는 이유&lt;/b&gt;: LLM을 자동화에 끼워 넣을수록 비용은 호출 수 &amp;times; 입력 토큰으로 빠르게 커집니다. 같은 페르소나를 1000번 보내고 있다면, 그게 1000번의 입력 토큰 비용입니다. caching 한 줄로 999번을 캐시 토큰으로 돌리면 비용이 거의 1/10. 작은 변경 하나로 LLM 자동화의 ROI가 완전히 달라집니다.&lt;/p&gt;
&lt;figure class=&quot;tistory-figure&quot; style=&quot;margin: 28px 0; text-align: center;&quot;&gt;&lt;img style=&quot;max-width: 100%; height: auto; border-radius: 10px;&quot; src=&quot;https://blog.trysitely.com/img/prompt-caching-1000-90-hero.png&quot; alt=&quot;시스템 프롬프트와 문서가 캐시 영역으로 표시되어 두 번째 호출부터 캐시 히트로 처리되는 다이어그램&quot; /&gt;
&lt;figcaption style=&quot;margin-top: 10px; color: #5b6474; font-size: 0.92em; line-height: 1.6;&quot;&gt;반복되는 부분을 캐시로 표시하면 그 부분의 비용이 1/10. 자동화의 운영 경제학이 완전히 달라진다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 왜 비용 90% 절감이 가능한가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM API 비용은 일반적으로 입력 토큰 + 출력 토큰의 합으로 청구됩니다. 마케팅 자동화에서는 입력 토큰이 비용의 80% 이상을 차지하는 경우가 흔합니다. 그 입력 토큰의 대부분은 매번 동일한 시스템 프롬프트&amp;middot;페르소나&amp;middot;브랜드 가이드&amp;middot;예시(few-shot)입니다.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;호출 영역&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;토큰 수&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;매 호출마다 동일?&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;캐시 가능?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;시스템 프롬프트&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;500&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;동일&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;브랜드 페르소나&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;300&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;동일&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;제품 정보&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;200&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;동일&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Few-shot 예시&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1500&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;동일&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;사용자 입력&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;50&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;매번 다름&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;출력&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;200&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;매번 다름&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&amp;mdash;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;총 입력 2550 토큰 중 캐시 가능 영역이 2500 (98%). 사용자 입력은 50 토큰뿐. caching이 적용되면 첫 호출은 그대로 비용이 들지만, 두 번째 호출부터 2500 토큰 영역이 캐시 히트로 처리되어 1/10 가격이 됩니다.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--note&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;이 글의 전제&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM API를 자동화에 한 번이라도 써본 마케터&amp;middot;운영자를 가정합니다. 토큰&amp;middot;입력&amp;middot;출력 같은 단어는 일상으로 쓴다고 가정합니다. 비용 청구서를 한 번이라도 보고 &quot;왜 이렇게 나오지&quot;라고 한 적 있다면 이 글이 직접적입니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Anthropic&amp;middot;OpenAI의 caching 작동 원리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 주요 제공사가 caching을 구현하는 방식은 비슷하지만 디테일이 다릅니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1. Anthropic Claude &amp;mdash; 명시적 cache_control&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude는 messages 안에 &lt;code&gt;cache_control: {&quot;type&quot;: &quot;ephemeral&quot;}&lt;/code&gt;을 명시적으로 박아 표시합니다. 캐시 경계를 직접 지정합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;캐시 영역 표시: 메시지 또는 도구 정의 안에 &lt;code&gt;cache_control&lt;/code&gt; 추가&lt;/li&gt;
&lt;li&gt;캐시 TTL: 5분(기본) 또는 1시간(프리미엄)&lt;/li&gt;
&lt;li&gt;캐시 히트 비용: 입력 토큰의 약 10%&lt;/li&gt;
&lt;li&gt;캐시 쓰기 비용: 입력 토큰의 약 125% (첫 호출에서 쓰는 비용)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직관: 첫 호출에서 약간 더 비싸게 캐시를 쓰고, 그 다음부터 1/10 가격으로 읽음. 5분 안에 5번만 같은 캐시를 써도 본전 회수.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2. OpenAI &amp;mdash; 자동 prefix caching&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenAI는 명시적 표시 없이 자동으로 prefix를 캐시합니다. 같은 시작 부분을 가진 요청이 들어오면 자동으로 hit.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;캐시 표시 불필요&lt;/li&gt;
&lt;li&gt;캐시 TTL: 5-10분&lt;/li&gt;
&lt;li&gt;캐시 히트 비용: 입력 토큰의 약 50%&lt;/li&gt;
&lt;li&gt;캐시 쓰기 비용: 추가 비용 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직관: 자동이라 편하지만 캐시 효율은 Claude보다 낮음(50% vs 10%). 대량 자동화에서는 Claude의 명시적 caching이 비용 측면 우위.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;Anthropic&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;OpenAI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;표시 방법&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;명시적 cache_control&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;자동 prefix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;캐시 히트 가격&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;입력의 10%&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;입력의 50%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;캐시 쓰기 추가 비용&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;125% (첫 호출)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;캐시 TTL&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;5분 / 1시간&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;5-10분&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 캐시 히트율을 높이는 프롬프트 구조 룰&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;caching은 prefix 매칭이라 프롬프트 구조가 중요합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1. 변하지 않는 부분을 앞으로&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 프롬프트&amp;middot;페르소나&amp;middot;문서는 messages의 앞쪽에 고정. 사용자 입력은 항상 끝쪽. 같은 시작 부분을 공유하는 호출들이 캐시를 효율적으로 공유합니다.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;좋은 구조&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;나쁜 구조&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;[시스템] [페르소나] [문서] [사용자 입력]&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;[사용자 입력] [페르소나] [문서] [시스템]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;[시스템] [예시1] [예시2] [사용자 입력]&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;[사용자 입력] [동적 컨텍스트] [예시]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;prefix 한 토큰이 다르면 그 뒤로 캐시 미스. 변하지 않는 부분 앞쪽 배치는 단순하지만 가장 강력한 룰.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-2. 동적 부분을 한 곳에 모으기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타임스탬프&amp;middot;세션 ID 같은 동적 값을 시스템 프롬프트에 흩뿌리지 마세요. 그 값들 때문에 시스템 프롬프트의 prefix 매칭이 깨집니다. 동적 값은 사용자 메시지 끝쪽으로 모으거나 별도 메타 헤더로 분리.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-3. Few-shot 예시 순서 고정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 작업을 위한 few-shot 예시를 매번 다른 순서로 섞지 마세요. 같은 순서로 고정하면 그 부분이 캐시됩니다. 다양성을 위해 예시를 무작위로 섞고 싶으면 batch 단위로 같은 순서를 유지하고 batch가 끝날 때 새 순서로 갱신하는 패턴.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--tip&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;캐시 친화적 프롬프트 템플릿&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마케팅 자동화 프롬프트의 표준 골격: [브랜드 가이드 (캐시)] &amp;rarr; [제품 정보 (캐시)] &amp;rarr; [Few-shot 예시 (캐시)] &amp;rarr; [동적 컨텍스트 (선택)] &amp;rarr; [사용자 입력 (매번 다름)]. 이 순서만 지켜도 첫 80%가 캐시 가능.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 마케팅 자동화의 캐시 ROI 계산&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐시가 비용에 어떻게 영향을 미치는지 구체적으로 보겠습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-1. 캐시 없을 때&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;호출 1회: 입력 2500 토큰 &amp;times; &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;3/1&lt;/span&gt;&lt;span style=&quot;margin-right: 0.109em;&quot; class=&quot;mord mathnormal&quot;&gt;M&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;0.0075&lt;/li&gt;
&lt;li&gt;1000회/일: $7.5/일&lt;/li&gt;
&lt;li&gt;한 달: $225&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-2. 캐시 있을 때 (Anthropic 기준)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;첫 호출: 2500 &amp;times; &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;3/1&lt;/span&gt;&lt;span style=&quot;margin-right: 0.109em;&quot; class=&quot;mord mathnormal&quot;&gt;M&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&amp;times;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6444em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;1.25&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;0.0094 (캐시 쓰기)&lt;/li&gt;
&lt;li&gt;두 번째 호출부터: 2500 &amp;times; &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;3/1&lt;/span&gt;&lt;span style=&quot;margin-right: 0.109em;&quot; class=&quot;mord mathnormal&quot;&gt;M&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&amp;times;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6444em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;0.10&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;0.00075 (캐시 히트)&lt;/li&gt;
&lt;li&gt;1000회/일: &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.7278em; vertical-align: -0.0833em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;0.0094&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;999&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&amp;times;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;0.00075) = $0.76/일&lt;/li&gt;
&lt;li&gt;한 달: $22.8&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;월 &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6444em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;225&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;&amp;rarr;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;22.8, 약 90% 절감. 자동화 호출 수가 많을수록 절감 효과는 더 큼.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-3. 손익분기 &amp;mdash; 몇 번 호출하면 본전?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 호출의 추가 비용(&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.7278em; vertical-align: -0.0833em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;0.0094&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&amp;minus;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;0.0075 = &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;0.0019&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mord hangul_fallback&quot;&gt;이두번째부터의절감&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;0.0075 - &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6444em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;0.00075&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;0.00675)을 회수하려면 호출 0.3회면 충분. 사실상 즉시 본전. 5분 안에 두 번째 호출이 일어나기만 하면 무조건 이득.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;일일 호출 수&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;월 비용 (캐시 없음)&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;월 비용 (캐시 있음)&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;절감&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;100&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$22.5&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$2.6&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;88%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1000&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$225&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$22.8&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;90%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;10000&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$2,250&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$228&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;90%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;100000&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$22,500&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$2,280&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;90%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동화 규모가 클수록 절감액이 크고 캐시 ROI가 폭발합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 코드 한 묶음 &amp;mdash; Anthropic cache_control&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 글에 박는 유일한 코드입니다. Claude의 명시적 caching 패턴.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/article&gt;</description>
      <category>AI&amp;middot;LLM</category>
      <category>cost-optimization</category>
      <category>LLM</category>
      <category>marketing-ai</category>
      <category>prompt-caching</category>
      <category>token-economics</category>
      <author>Aramir</author>
      <guid isPermaLink="true">https://code77.tistory.com/127</guid>
      <comments>https://code77.tistory.com/127#entry127comment</comments>
      <pubDate>Sun, 17 May 2026 09:15:22 +0900</pubDate>
    </item>
    <item>
      <title>Power analysis와 MDE &amp;mdash; 실험 시작 전에 표본&amp;middot;기간을 정직하게 잡는 법</title>
      <link>https://code77.tistory.com/126</link>
      <description>&lt;article class=&quot;tistory-mirror-post&quot; data-source-slug=&quot;power-analysis-mde&quot;&gt;
&lt;p class=&quot;tistory-description&quot; data-ke-size=&quot;size16&quot;&gt;A/B 시작 전 &quot;표본 얼마나 모아야?&quot;의 답이 power analysis. 검출력 80%로 검출 가능한 최소 효과(MDE)를 미리 계산해 실험 기간&amp;middot;해석 한도를 명확히 잡는 흐름.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A/B 실험을 시작하기 전 &quot;표본 얼마나 모으면 돼?&quot;라는 질문에 답하지 못하면, 결과 단계에서 &quot;p-value 0.07이라 결론 못 냄&quot;이 흔히 나옵니다. Power analysis는 그 질문에 답하는 표준 도구이고, MDE(Minimum Detectable Effect) 개념이 결정의 핵심입니다. 실험 시작 전 한 번의 계산이 실험 운영의 절반을 정직하게 만듭니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마케터가 이 글을 읽어야 하는 이유&lt;/b&gt;: 실험 결과 회의에서 &quot;결론 보류&quot;가 자주 나오는 자리는 사실 실험 시작 전의 power analysis 부족이 원인입니다. 검출력&amp;middot;MDE를 미리 계산하면 &quot;이 실험은 +3%p 이상 효과만 검출 가능하다&quot;는 한도를 알고 시작할 수 있습니다.&lt;/p&gt;
&lt;figure class=&quot;tistory-figure&quot; style=&quot;margin: 28px 0; text-align: center;&quot;&gt;&lt;img style=&quot;max-width: 100%; height: auto; border-radius: 10px;&quot; src=&quot;https://blog.trysitely.com/img/power-analysis-mde-hero.png&quot; alt=&quot;표본 크기 N에 대한 검출 가능 효과 MDE 곡선과 검출력 80% 영역을 시각화한 다이어그램&quot; /&gt;
&lt;figcaption style=&quot;margin-top: 10px; color: #5b6474; font-size: 0.92em; line-height: 1.6;&quot;&gt;N이 커질수록 MDE가 작아진다. 그 곡선 위에서 실험 디자인이 결정된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 4개 변수의 관계&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A/B 실험의 통계적 결정은 4개 변수가 서로 묶여 있습니다.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;변수&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;의미&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6833em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.109em;&quot; class=&quot;mord mathnormal&quot;&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;표본 크기 (그룹당)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6944em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0379em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;delta;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;효과 크기 (MDE)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.4306em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0037em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;alpha;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;양측 유의수준 (보통 0.05)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.7278em; vertical-align: -0.0833em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&amp;minus;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.8889em; vertical-align: -0.1944em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0528em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;beta;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;검출력 (보통 0.80)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 4개 중 3개를 정하면 나머지 1개가 결정됩니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N과 &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.4306em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0037em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;alpha;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.7278em; vertical-align: -0.0833em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&amp;minus;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.8889em; vertical-align: -0.1944em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0528em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;beta;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;를 정하면 &amp;rarr; MDE가 결정 (이만큼 작은 효과까지 검출 가능) &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6944em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0379em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;delta;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.4306em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0037em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;alpha;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.7278em; vertical-align: -0.0833em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&amp;minus;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.8889em; vertical-align: -0.1944em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0528em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;beta;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;를 정하면 &amp;rarr; 필요한 N이 결정&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마케팅 자리에서 가장 자주 마주치는 건 두 번째 &amp;mdash; &quot;이만큼 효과면 의미 있을 것 같으니 표본 얼마나 모을까?&quot;.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--note&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;이 글의 전제&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A/B 테스트&amp;middot;신뢰구간&amp;middot;검출력 같은 단어를 일상으로 쓴다고 가정합니다. 코드를 직접 짠 적은 없어도 됩니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 표본 크기 공식&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이항 비율(전환율) 비교의 표준 공식.&lt;/p&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6833em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.109em;&quot; class=&quot;mord mathnormal&quot;&gt;N&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 2.2453em; vertical-align: -0.686em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 1.5593em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.314em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.0379em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;delta;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.7401em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.989em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3.23em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;border-bottom-width: 0.04em;&quot; class=&quot;frac-line&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3.7452em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.044em;&quot; class=&quot;mord mathnormal&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3448em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.5198em; margin-left: -0.044em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span style=&quot;margin-right: 0.0037em;&quot; class=&quot;mord mathnormal mtight&quot;&gt;&amp;alpha;&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;/2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3552em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.044em;&quot; class=&quot;mord mathnormal&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3361em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.044em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span style=&quot;margin-right: 0.0528em;&quot; class=&quot;mord mathnormal mtight&quot;&gt;&amp;beta;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.2861em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.8141em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -3.063em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&amp;sdot;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&amp;minus;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.686em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.625em; vertical-align: -0.1944em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: baseline 전환율&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6944em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0379em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;delta;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: 검출하고자 하는 절대 효과 크기&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.7858em; vertical-align: -0.3552em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.044em;&quot; class=&quot;mord mathnormal&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3448em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.5198em; margin-left: -0.044em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span style=&quot;margin-right: 0.0037em;&quot; class=&quot;mord mathnormal mtight&quot;&gt;&amp;alpha;&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;/2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3552em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6444em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;1.96&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; (양측 5%)&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.7167em; vertical-align: -0.2861em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.044em;&quot; class=&quot;mord mathnormal&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3361em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.044em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span style=&quot;margin-right: 0.0528em;&quot; class=&quot;mord mathnormal mtight&quot;&gt;&amp;beta;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.2861em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6444em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;0.84&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; (검출력 80%)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시: baseline 전환율 5%, 효과 1%p (5% &amp;rarr; 6%) 검출.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.625em; vertical-align: -0.1944em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6444em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;0.055&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6944em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0379em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;delta;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6444em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;0.01&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6833em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.109em;&quot; class=&quot;mord mathnormal&quot;&gt;N&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1.4539em; vertical-align: -0.345em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 1.1089em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.655em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;0.0&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.7463em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.786em; margin-right: 0.0714em;&quot;&gt;&lt;span style=&quot;height: 2.5em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size3 size1 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3.23em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;border-bottom-width: 0.04em;&quot; class=&quot;frac-line&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3.485em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;1.96&lt;/span&gt;&lt;span class=&quot;mbin mtight&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;0.84&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.8913em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.931em; margin-right: 0.0714em;&quot;&gt;&lt;span style=&quot;height: 2.5em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size3 size1 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mbin mtight&quot;&gt;&amp;sdot;&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;mbin mtight&quot;&gt;&amp;sdot;&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;0.055&lt;/span&gt;&lt;span class=&quot;mbin mtight&quot;&gt;&amp;sdot;&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;0.945&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.345em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;&amp;asymp;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6444em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;8136&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 그룹 8,136명, 총 16,272명. 효과 크기를 절반(0.5%p)으로 잡으면 표본은 4배(32,500+).&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. MDE &amp;mdash; 표본 거꾸로 풀기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표본이 정해져 있을 때 거꾸로 검출 가능한 최소 효과를 풉니다.&lt;/p&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6833em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;MDE&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1.1052em; vertical-align: -0.3552em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.044em;&quot; class=&quot;mord mathnormal&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3448em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.5198em; margin-left: -0.044em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span style=&quot;margin-right: 0.0037em;&quot; class=&quot;mord mathnormal mtight&quot;&gt;&amp;alpha;&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;/2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3552em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1.0361em; vertical-align: -0.2861em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.044em;&quot; class=&quot;mord mathnormal&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3361em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.044em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span style=&quot;margin-right: 0.0528em;&quot; class=&quot;mord mathnormal mtight&quot;&gt;&amp;beta;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.2861em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&amp;sdot;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 2.44em; vertical-align: -0.7356em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord sqrt&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 1.7044em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -4.4em;&quot; class=&quot;svg-align&quot;&gt;&lt;span style=&quot;height: 4.4em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;padding-left: 1em;&quot; class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 1.427em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.314em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.109em;&quot; class=&quot;mord mathnormal&quot;&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3.23em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;border-bottom-width: 0.04em;&quot; class=&quot;frac-line&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3.677em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&amp;minus;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.686em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3.6644em;&quot;&gt;&lt;span style=&quot;height: 4.4em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;min-width: 1.02em; height: 2.48em;&quot; class=&quot;hide-tail&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.7356em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시: 그룹당 5,000명, baseline 5%.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MDE &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.4831em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;&amp;asymp;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6444em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;2.8&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&amp;sdot;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1.24em; vertical-align: -0.305em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord sqrt&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.935em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -3.2em;&quot; class=&quot;svg-align&quot;&gt;&lt;span style=&quot;height: 3.2em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;padding-left: 1em;&quot; class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&amp;sdot;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;0.05&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&amp;sdot;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;0.95/5000&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -2.895em;&quot;&gt;&lt;span style=&quot;height: 3.2em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;min-width: 1.02em; height: 1.28em;&quot; class=&quot;hide-tail&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.305em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;&amp;asymp;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6444em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;0.0122&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;약 1.22%p&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 실험은 +1.22%p 이상의 효과만 통계적으로 검출. +1%p 효과는 결과 보류 위험.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;그룹당 N&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;MDE (baseline 5%)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1,000&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;2.7%p&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;5,000&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1.2%p&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;10,000&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;0.85%p&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;50,000&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;0.38%p&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작은 효과를 잡으려면 표본 폭증. 보통 +1%p 이하 효과를 잡으려면 그룹당 1만+ 필수.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 코드 한 묶음 &amp;mdash; 표본&amp;middot;MDE 계산기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 글에 박는 유일한 코드입니다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/article&gt;</description>
      <category>통계&amp;middot;ML</category>
      <category>ab-testing</category>
      <category>experimentation</category>
      <category>MDE</category>
      <category>power-analysis</category>
      <category>sample-size</category>
      <author>Aramir</author>
      <guid isPermaLink="true">https://code77.tistory.com/126</guid>
      <comments>https://code77.tistory.com/126#entry126comment</comments>
      <pubDate>Sun, 17 May 2026 09:14:39 +0900</pubDate>
    </item>
    <item>
      <title>Multi-agent orchestration &amp;mdash; supervisor&amp;middot;swarm&amp;middot;planner-executor 패턴 비교</title>
      <link>https://code77.tistory.com/125</link>
      <description>&lt;article class=&quot;tistory-mirror-post&quot; data-source-slug=&quot;multi-agent-orchestration&quot;&gt;
&lt;p class=&quot;tistory-description&quot; data-ke-size=&quot;size16&quot;&gt;한 LLM이 모든 일을 다 하면 결과가 흔들립니다. 여러 에이전트가 역할을 나눠 협업하는 multi-agent orchestration의 3가지 표준 패턴과 마케팅 자동화에 적용하는 자리.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;이 캠페인 분석해서 슬랙으로 공유해줘&quot;라고 한 LLM에 시키면 데이터 조회&amp;middot;분석&amp;middot;작성&amp;middot;전송을 모두 하나의 모델이 합니다. 그런데 작업이 길어질수록 모델이 헷갈리고, 한 단계 실패가 전체를 멈춥니다. multi-agent orchestration은 여러 에이전트가 역할을 나눠 협업하는 구조입니다. 3가지 표준 패턴과 마케팅 자동화에 적용하는 자리를 정리합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마케터가 이 글을 읽어야 하는 이유&lt;/b&gt;: LLM 자동화가 한 단계 작업(요약&amp;middot;분류)을 넘어 여러 단계 작업(분석 + 보고 + 전송)으로 가면 단일 모델로는 안정적이지 않습니다. orchestration 패턴을 알면 자동화 설계의 전체 그림이 잡히고, 어느 자리에 어느 패턴이 맞는지가 분명해집니다.&lt;/p&gt;
&lt;figure class=&quot;tistory-figure&quot; style=&quot;margin: 28px 0; text-align: center;&quot;&gt;&lt;img style=&quot;max-width: 100%; height: auto; border-radius: 10px;&quot; src=&quot;https://blog.trysitely.com/img/multi-agent-orchestration-hero.png&quot; alt=&quot;supervisor 패턴, swarm 패턴, planner-executor 패턴 3가지를 좌우 비교한 다이어그램&quot; /&gt;
&lt;figcaption style=&quot;margin-top: 10px; color: #5b6474; font-size: 0.92em; line-height: 1.6;&quot;&gt;중앙 통제냐 자율 협력이냐, 계획-실행 분리냐 &amp;mdash; 자리에 따라 답이 다르다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 단일 에이전트의 한계&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단일 LLM에 복잡한 작업을 맡기면 다음 자리에서 깨집니다.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;문제&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;증상&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;컨텍스트 누적&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;단계가 길어질수록 토큰 제곱 비용 증가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;역할 혼동&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;분석 중인지 보고 작성 중인지 흐려짐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;도구 선택 헷갈림&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;같은 도구를 반복 호출하거나 잘못된 도구 호출&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;한 단계 실패가 전체 멈춤&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;중간에 한 도구가 실패하면 복구 어려움&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;multi-agent는 이 문제를 &quot;역할 분할&quot;로 풉니다. 데이터 조회 에이전트, 분석 에이전트, 작성 에이전트가 각자 역할만 책임지고 다른 에이전트가 결과를 받아 다음 단계.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--note&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;이 글의 전제&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;function calling&amp;middot;tool use에 대한 기초 이해가 있다고 가정합니다(&lt;a href=&quot;https://blog.trysitely.com/posts/function-calling-llm/&quot;&gt;Function calling 글&lt;/a&gt; 참고). 코드를 직접 짠 적 없어도 OK입니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 패턴 1 &amp;mdash; Supervisor (중앙 통제)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 직관적인 패턴. 중앙에 supervisor 에이전트가 있고, 그 supervisor가 여러 worker 에이전트에게 작업을 분배합니다.&lt;/p&gt;
&lt;pre class=&quot;gcode&quot;&gt;&lt;code&gt;사용자 요청
     │
     ▼
┌─ Supervisor 에이전트 ─┐
│ &quot;이 작업을 어느 워커에│
│  맡길지 결정&quot;        │
└────┬─────┬─────┬────┘
     │     │     │
     ▼     ▼     ▼
  워커1  워커2  워커3
 (조회) (분석) (작성)
     │     │     │
     └─────┴─────┘
           │
           ▼
      Supervisor에게 결과 반환
           │
           ▼
      사용자에게 답변
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1. 적합한 자리&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;작업 단계가 명확히 나뉨 (조회 &amp;rarr; 분석 &amp;rarr; 작성)&lt;/li&gt;
&lt;li&gt;워커들이 서로 독립 (한 워커의 결과가 다른 워커에 강하게 의존하지 않음)&lt;/li&gt;
&lt;li&gt;디버깅&amp;middot;모니터링 중요&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2. 한계&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;supervisor가 병목이 됨 (모든 결정이 한 곳을 거침)&lt;/li&gt;
&lt;li&gt;워커 간 직접 협업 어려움&lt;/li&gt;
&lt;li&gt;supervisor 한 번 호출이 비싸 비용 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분의 실무 자리에서 첫 번째로 시도할 패턴. LangGraph의 supervisor architecture가 이 패턴의 표준 구현.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 패턴 2 &amp;mdash; Swarm (자율 협력)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;supervisor 없이 에이전트들이 서로에게 작업을 직접 패스합니다. handoff 기반 구조.&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;사용자 &amp;rarr; 에이전트 A (분류 담당)
              │
              &quot;이건 데이터 조회야&quot; handoff
              │
              ▼
         에이전트 B (조회 담당)
              │
              &quot;분석이 필요해&quot; handoff
              │
              ▼
         에이전트 C (분석 담당)
              │
              ▼
            사용자
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1. 적합한 자리&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;작업 흐름이 동적이고 미리 정해두기 어려움&lt;/li&gt;
&lt;li&gt;에이전트들이 자기 영역을 명확히 알고 자율 결정&lt;/li&gt;
&lt;li&gt;빠른 반응이 중요&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-2. 한계&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;디버깅 어려움 (handoff 흐름이 복잡)&lt;/li&gt;
&lt;li&gt;무한 loop 위험 (A &amp;rarr; B &amp;rarr; A &amp;rarr; B...)&lt;/li&gt;
&lt;li&gt;비용 예측 어려움&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenAI의 Swarm framework, AutoGen의 GroupChat이 이 패턴의 구현. 마케팅 운영보다는 연구&amp;middot;실험적 자리에 더 자주 등장.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 패턴 3 &amp;mdash; Planner-Executor&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;큰 LLM이 계획을 세우고, 작은 LLM이 단계별로 실행합니다. 비용&amp;middot;정확도 둘 다 잡는 하이브리드 패턴.&lt;/p&gt;
&lt;pre class=&quot;lsl&quot;&gt;&lt;code&gt;사용자 요청
     │
     ▼
┌─ Planner (대형 모델, 한 번 호출) ─┐
│ &quot;다음 4단계로 진행:                │
│  1. ROAS 데이터 조회               │
│  2. 변화 추세 분석                 │
│  3. 보고서 초안 작성              │
│  4. 슬랙 전송&quot;                     │
└────────────┬────────────────────┘
             │
             ▼
┌─ Executor (소형 모델, 단계별 호출) ─┐
│ 단계 1 실행 &amp;rarr; 결과 저장             │
│ 단계 2 실행 &amp;rarr; 결과 저장             │
│ 단계 3 실행 &amp;rarr; 결과 저장             │
│ 단계 4 실행 &amp;rarr; 완료                  │
└────────────┬────────────────────┘
             │
             ▼
        사용자에게 답변
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-1. 적합한 자리&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;작업이 중장기적이고 계획이 명확히 잡힘&lt;/li&gt;
&lt;li&gt;비용 통제 중요 (큰 모델은 한 번만 호출)&lt;/li&gt;
&lt;li&gt;단계별 결과를 사용자에게 점진적 보여주는 UX&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-2. 한계&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;planner의 잘못된 계획이 전체에 영향&lt;/li&gt;
&lt;li&gt;동적 변화(예: 중간에 데이터 부족 발견)에 약함&lt;/li&gt;
&lt;li&gt;두 모델 통합 운영 부담&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LangChain의 Plan-and-Execute, OpenAI Assistants API의 일부 패턴이 이 구조. 보고서 자동화&amp;middot;다단계 분석 자리에 적합.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 코드 한 묶음 &amp;mdash; Supervisor 패턴 의사코드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 글에 박는 유일한 코드입니다. 마케팅 보고 자동화의 supervisor 흐름.&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;# 의사코드 &amp;mdash; 핵심 흐름만
SUPERVISOR_PROMPT = &quot;&quot;&quot;다음 워커 중 하나를 선택해 작업을 패스하라:
- data_worker: BigQuery&amp;middot;광고 API 조회
- analysis_worker: 추세&amp;middot;비교 분석
- writer_worker: 보고서 작성
- slack_worker: 슬랙 전송
- finish: 작업 완료&quot;&quot;&quot;

def supervisor_step(messages):
    resp = call_llm(&quot;gpt-5&quot;, messages=messages,
                    system=SUPERVISOR_PROMPT,
                    response_format={&quot;next&quot;: str, &quot;task&quot;: str})
    return resp[&quot;next&quot;], resp[&quot;task&quot;]

WORKERS = {
    &quot;data_worker&quot;: call_data_worker,
    &quot;analysis_worker&quot;: call_analysis_worker,
    &quot;writer_worker&quot;: call_writer_worker,
    &quot;slack_worker&quot;: call_slack_worker,
}

def run_workflow(user_request, max_steps=10):
    messages = [{&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: user_request}]
    for step in range(max_steps):
        next_worker, task = supervisor_step(messages)
        if next_worker == &quot;finish&quot;:
            break
        result = WORKERS[next_worker](task)
        messages.append({&quot;role&quot;: &quot;tool&quot;, &quot;name&quot;: next_worker,
                         &quot;content&quot;: result})
    return messages
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;supervisor가 매 단계마다 다음 워커를 결정하고, 워커가 작업을 실행해 결과를 messages에 추가. 무한 loop 방지 위한 max_steps 필수.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 패턴 선택 결정 트리&lt;/h2&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;자리&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;작업 단계&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;흐름&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;패턴&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;FAQ 챗봇&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1-2단계&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;단순&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;단일 에이전트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;데이터 조회+답변&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;2-4단계&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;정해짐&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Supervisor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;일일 보고 자동화&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;4-6단계&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;정해짐&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Planner-Executor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;사용자 의도에 따라 분기&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;동적&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;가변&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Supervisor 또는 Swarm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;연구&amp;middot;실험&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;매우 동적&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;예측 어려움&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Swarm&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분의 마케팅 자동화는 Supervisor 또는 Planner-Executor가 적합. Swarm은 운영 안정성이 약해 일반 자리에 부적합.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 운영 안정성 &amp;mdash; multi-agent의 함정&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7-1. 무한 loop&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에이전트 간 handoff가 순환할 위험. max_steps&amp;middot;max_handoffs 상한 필수. 보통 10-15 단계 이내로 제한.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7-2. 컨텍스트 누적&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 에이전트가 이전 단계의 모든 컨텍스트를 받으면 토큰이 폭발. 결과 요약&amp;middot;관련 정보만 다음 에이전트에 전달하는 컨텍스트 다이어트.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7-3. 비용 폭주&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 에이전트 호출이 별도 LLM 호출이라 단일 에이전트보다 비용이 5-10배. caching&amp;middot;작은 모델 활용으로 보완. &lt;a href=&quot;https://blog.trysitely.com/posts/llm-token-economics/&quot;&gt;LLM token economics&lt;/a&gt; 참고.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7-4. 디버깅 어려움&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어느 에이전트에서 깨졌는지 추적이 어려움. 단계별 로그&amp;middot;trace ID 필수. LangSmith&amp;middot;Langfuse 같은 도구 활용.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--warn&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;multi-agent 도입 전에 한 번 더 점검&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단일 에이전트로 충분한 자리에 multi-agent를 도입하면 비용&amp;middot;복잡도만 증가. 작업이 정말 여러 단계로 나뉘는지, 단일 모델이 헷갈리는 자리인지 확인 후 도입.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 마케팅 자동화의 적용 자리 4가지&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8-1. 일일 캠페인 보고 자동화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조회(BigQuery) &amp;rarr; 분석(이상치 탐지) &amp;rarr; 작성(자유 산문) &amp;rarr; 전송(Slack). Planner-Executor 패턴이 자연스럽게 맞음.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8-2. 사용자 의도 라우팅 챗봇&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분류(FAQ vs 데이터 조회 vs 액션) &amp;rarr; 적합한 워커로 라우팅. Supervisor 패턴.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8-3. 콘텐츠 작성 + 검수&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작성 에이전트 &amp;rarr; 검수 에이전트 &amp;rarr; 수정 에이전트의 파이프라인. Planner가 큰 흐름 잡고 Executor들이 실행.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8-4. 실시간 알림 분석&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상치 감지 &amp;rarr; 원인 분석 &amp;rarr; 알림 전송. Supervisor가 단계 결정.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 마치며 &amp;mdash; 자동화 설계의 한 단계 위&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM 자동화가 단순 작업을 넘어 운영의 표준 도구로 자리 잡을수록 multi-agent orchestration이 자연스럽게 들어옵니다. supervisor&amp;middot;swarm&amp;middot;planner-executor 3가지 패턴 중 자리에 맞는 한 가지를 골라 도입하면 단일 에이전트의 한계를 넘어설 수 있습니다. 다만 비용&amp;middot;디버깅&amp;middot;loop 방지 같은 운영 안정성 항목을 미리 챙겨야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 분기에 한 번만 시도해 볼 만한 것은 가장 자주 돌리는 단일 에이전트 자동화 한 자리에 supervisor 패턴을 도입해 단계별 디버깅이 쉬워지는지 비교하는 흐름입니다. 작은 자리부터 도입해 운영 감각을 쌓는 게 표준 경로입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;다음에 읽을 글&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.trysitely.com/posts/function-calling-llm/&quot;&gt;Function calling 설계 패턴&lt;/a&gt; &amp;mdash; multi-agent의 기반 도구 호출&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.trysitely.com/posts/ai-agent-evaluation/&quot;&gt;LLM 에이전트 평가&lt;/a&gt; &amp;mdash; multi-agent 시스템 평가 프레임워크&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.trysitely.com/posts/llm-token-economics/&quot;&gt;LLM token economics&lt;/a&gt; &amp;mdash; multi-agent의 단위 경제학&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LangGraph, &quot;Multi-agent supervisor&quot;: &lt;a href=&quot;https://langchain-ai.github.io/langgraph/tutorials/multi_agent/agent_supervisor/&quot;&gt;https://langchain-ai.github.io/langgraph/tutorials/multi_agent/agent_supervisor/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;OpenAI, &quot;Swarm framework&quot;: &lt;a href=&quot;https://github.com/openai/swarm&quot;&gt;https://github.com/openai/swarm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Microsoft AutoGen: &lt;a href=&quot;https://microsoft.github.io/autogen/&quot;&gt;https://microsoft.github.io/autogen/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&quot;Plan-and-Execute&quot; (LangChain): &lt;a href=&quot;https://blog.langchain.dev/planning-agents/&quot;&gt;https://blog.langchain.dev/planning-agents/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&quot;ReAct&quot; (Yao et al., 2022): &lt;a href=&quot;https://arxiv.org/abs/2210.03629&quot;&gt;https://arxiv.org/abs/2210.03629&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/article&gt;</description>
      <category>AI&amp;middot;LLM</category>
      <category>Agent</category>
      <category>automation</category>
      <category>LLM</category>
      <category>Multi-Agent</category>
      <category>orchestration</category>
      <author>Aramir</author>
      <guid isPermaLink="true">https://code77.tistory.com/125</guid>
      <comments>https://code77.tistory.com/125#entry125comment</comments>
      <pubDate>Sat, 16 May 2026 18:22:40 +0900</pubDate>
    </item>
    <item>
      <title>Marketing analytics maturity model &amp;mdash; last-click부터 triangulation까지 5단계</title>
      <link>https://code77.tistory.com/124</link>
      <description>&lt;article class=&quot;tistory-mirror-post&quot; data-source-slug=&quot;marketing-analytics-maturity&quot;&gt;
&lt;p class=&quot;tistory-description&quot; data-ke-size=&quot;size16&quot;&gt;마케팅 측정의 성숙도는 5단계로 나뉩니다. last-click &amp;rarr; multi-touch &amp;rarr; MMM &amp;rarr; lift study &amp;rarr; triangulation. 우리 팀이 어디 있는지 진단하고 다음 단계 로드맵을 잡는 한 가지 모델.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;우리는 어떤 측정을 쓰고 있는가?&quot; 라는 질문에 답하는 5단계 모델이 있습니다. 1단계 last-click부터 5단계 triangulation까지. 우리 팀이 어디 있는지 진단하면 다음 분기 로드맵이 자연스럽게 나옵니다. 단계를 건너뛸 수 없고, 한 단계 위로 올라가는 데 보통 1-2분기가 걸립니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마케터가 이 글을 읽어야 하는 이유&lt;/b&gt;: 측정 도구를 한 번 도입하기는 쉬워도 운영 표준으로 정착시키는 게 어렵습니다. 5단계 모델로 우리 팀의 현재 위치를 객관화하면 다음 단계 투자 우선순위가 명확해지고, 분기 보고에서 &quot;우리는 지금 3단계, 다음 분기 4단계 진입&quot;이라는 구체적 답을 할 수 있습니다.&lt;/p&gt;
&lt;figure class=&quot;tistory-figure&quot; style=&quot;margin: 28px 0; text-align: center;&quot;&gt;&lt;img style=&quot;max-width: 100%; height: auto; border-radius: 10px;&quot; src=&quot;https://blog.trysitely.com/img/marketing-analytics-maturity-hero.png&quot; alt=&quot;last-click &amp;rarr; multi-touch &amp;rarr; MMM &amp;rarr; lift study &amp;rarr; triangulation 5단계 피라미드 다이어그램&quot; /&gt;
&lt;figcaption style=&quot;margin-top: 10px; color: #5b6474; font-size: 0.92em; line-height: 1.6;&quot;&gt;단계는 누적된다. 위 단계는 아래 단계를 대체하지 않고 보완한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 1단계 &amp;mdash; Last-click 어트리뷰션&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 단순한 출발점. 전환 직전 마지막 클릭에 100% 공을 줌.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;측정 단위&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;채널&amp;middot;캠페인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;데이터&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;광고 플랫폼 보고서&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;운영 부담&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;거의 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;함정&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;검색에 과대 평가, 디스플레이&amp;middot;브랜드 광고 과소&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분의 회사 출발점. 광고 플랫폼이 자동으로 제공하는 보고서가 그대로 last-click. 분기 ROAS 보고가 이 단계에 머물면 채널 간 의사결정이 왜곡.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 2단계 &amp;mdash; Multi-touch attribution (MTA)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 터치포인트에 공을 분배. 데이터 기반(linear, time-decay) 또는 모델 기반(Shapley, Markov).&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;측정 단위&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;채널&amp;middot;캠페인&amp;middot;터치포인트 시퀀스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;데이터&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1st-party 사용자 시퀀스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;운영 부담&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;중간 (CDP&amp;middot;cross-device 연결 필요)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;함정&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;쿠키&amp;middot;ATT 한계로 정확도 저하&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;last-click의 단순성을 넘지만 사용자 시퀀스 데이터가 정확해야 함. iOS ATT&amp;middot;쿠키 종료로 MTA의 정확도가 점점 어려워지는 자리. &lt;a href=&quot;https://blog.trysitely.com/posts/shapley-value/&quot;&gt;Shapley value&lt;/a&gt;, &lt;a href=&quot;https://blog.trysitely.com/posts/bayesian-attribution/&quot;&gt;Bayesian attribution&lt;/a&gt; 같은 도구가 표준.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--note&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;이 글의 전제&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;독자가 광고 운영을 일상으로 하고 ROAS&amp;middot;last-click 같은 단어를 쓰는 마케터&amp;middot;분석가를 가정합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 3단계 &amp;mdash; MMM (Marketing Mix Model)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;채널별 시계열 회귀로 광고비와 매출의 관계 모델링. 채널 기여도 추정.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;측정 단위&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;채널&amp;middot;시기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;데이터&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;주 단위 광고비&amp;middot;매출, 외생 변수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;운영 부담&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;큼 (분석가&amp;middot;인프라 필요)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;강점&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;cookieless, 장기 효과&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.trysitely.com/posts/mmm-introduction/&quot;&gt;MMM 입문&lt;/a&gt;, &lt;a href=&quot;https://blog.trysitely.com/posts/mmm-adstock-deep-dive/&quot;&gt;adstock 심화&lt;/a&gt;, &lt;a href=&quot;https://blog.trysitely.com/posts/mmm-saturation-curves/&quot;&gt;saturation&lt;/a&gt;, &lt;a href=&quot;https://blog.trysitely.com/posts/mmm-budget-optimization/&quot;&gt;예산 재배분&lt;/a&gt;에서 다룬 도구들. PyMC-Marketing&amp;middot;Robyn 같은 오픈소스로 진입 장벽이 내려가고 있음.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 4단계 &amp;mdash; Lift study (incrementality)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무작위 배정 + holdout으로 광고의 인과 효과 측정.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;측정 단위&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;캠페인&amp;middot;채널&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;데이터&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;노출/비노출 그룹 비교&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;운영 부담&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;중간 (lift study 도구 사용)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;강점&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;인과 효과 직접 측정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.trysitely.com/posts/brand-lift-study/&quot;&gt;Brand lift study&lt;/a&gt;, &lt;a href=&quot;https://blog.trysitely.com/posts/geo-lift-causal/&quot;&gt;Geo-lift&lt;/a&gt;, &lt;a href=&quot;https://blog.trysitely.com/posts/incrementality-test-design/&quot;&gt;Incrementality 테스트&lt;/a&gt;에서 다룬 도구들. Meta&amp;middot;Google이 자체 lift 도구 제공하지만 외부 검증도 가능.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 5단계 &amp;mdash; Triangulation&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;last-click + MTA + MMM + lift study를 모두 운영하면서 결과를 교차 검증. 한 도구의 한계를 다른 도구로 보완.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;도구&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;강점&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;약점&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Last-click&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;빠름&amp;middot;간단&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;채널 왜곡&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;MTA&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;사용자 시퀀스&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;privacy 한계&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;MMM&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;cookieless&amp;middot;장기&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;단기 캠페인 약함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Lift&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;인과 직접 측정&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;비용&amp;middot;기간&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;triangulation의 핵심 룰: 세 도구의 결과가 서로 일관되어야 신뢰. MMM이 채널 X의 ROAS 4.0이라 하고 lift study가 ROAS 2.5라면 둘 중 하나(또는 둘 다)가 틀림. 그 차이를 분석하는 게 triangulation의 실무.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.trysitely.com/posts/mta-mmm-lift-comparison/&quot;&gt;MTA&amp;middot;MMM&amp;middot;Lift 비교&lt;/a&gt;에서 더 깊이 다룹니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 단계 진단 &amp;mdash; 우리 팀은 어디?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 5질문에 답하면 현재 단계가 거의 정해집니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;ROAS 보고서가 광고 플랫폼 자체 ROAS만으로 채워지는가?&lt;/li&gt;
&lt;li&gt;사용자 시퀀스 데이터(노출 &amp;rarr; 클릭 &amp;rarr; 구매)가 1st-party로 통합되어 있는가?&lt;/li&gt;
&lt;li&gt;MMM 분기 결과가 예산 재배분 회의에 들어가는가?&lt;/li&gt;
&lt;li&gt;lift study가 분기 1회 이상 돌아가는가?&lt;/li&gt;
&lt;li&gt;세 도구의 결과를 한 슬라이드에 두고 비교하는가?&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;질문&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;답&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1만 yes&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1단계&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1+2 yes&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;2단계&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1+2+3 yes&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;3단계&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1+2+3+4 yes&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;4단계&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1+2+3+4+5 yes&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;5단계&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분의 팀이 2-3단계. 4단계 이상은 큰 회사&amp;middot;인프라 갖춘 자리. 단계 건너뛰기 어려움.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 단계 이동의 운영 부담&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 단계 진입에 드는 분기 단위 부담.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;단계 &amp;rarr;&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;인력&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;도구&amp;middot;인프라&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;시간&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1 &amp;rarr; 2&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;분석가 0.5명&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;CDP, GA4&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1-2분기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;2 &amp;rarr; 3&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;분석가 1명&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;PyMC-Marketing, BigQuery&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;2-3분기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;3 &amp;rarr; 4&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;분석가&amp;middot;운영 1명&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Lift study 도구&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1-2분기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;4 &amp;rarr; 5&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;분석가 2명+&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;통합 대시보드&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;2-4분기&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5단계 진입은 인력&amp;middot;인프라 모두 큰 투자. 회사 규모&amp;middot;마케팅 예산이 어느 정도 임계 이상일 때 의미 있음.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 코드 한 묶음 &amp;mdash; triangulation 한 슬라이드 표&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 글에 박는 유일한 코드입니다. 5단계 triangulation 표를 자동으로 생성.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/article&gt;</description>
      <category>Analytics Ops (GA4&amp;middot;GTM)</category>
      <category>Analytics</category>
      <category>attribution</category>
      <category>maturity</category>
      <category>Measurement</category>
      <category>mmm</category>
      <author>Aramir</author>
      <guid isPermaLink="true">https://code77.tistory.com/124</guid>
      <comments>https://code77.tistory.com/124#entry124comment</comments>
      <pubDate>Sat, 16 May 2026 18:21:49 +0900</pubDate>
    </item>
    <item>
      <title>Lookalike audience 운영 &amp;mdash; 시드 품질&amp;middot;확장 비율&amp;middot;평가 사이클</title>
      <link>https://code77.tistory.com/123</link>
      <description>&lt;article class=&quot;tistory-mirror-post&quot; data-source-slug=&quot;lookalike-audience-ops&quot;&gt;
&lt;p class=&quot;tistory-description&quot; data-ke-size=&quot;size16&quot;&gt;Lookalike audience(LAL)는 고가치 시드 사용자와 비슷한 잠재 고객을 광고 플랫폼이 찾아주는 기능입니다. 시드 한 줄로 효율이 두 배 차이 나는 LAL 운영의 표준 룰.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;고가치 고객 1만 명 명단을 Meta에 업로드하면 비슷한 사람을 1000만 명까지 찾아준다.&quot; Lookalike audience(LAL)의 마케팅 마법입니다. 그런데 시드 명단 한 줄을 잘못 잡으면 같은 1000만 명이라도 효율이 두 배 차이 납니다. 시드 품질&amp;middot;확장 비율&amp;middot;평가 사이클의 표준 룰을 정리합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마케터가 이 글을 읽어야 하는 이유&lt;/b&gt;: LAL은 1st-party 데이터를 광고 플랫폼에 활용하는 표준 도구이고, ROAS 개선에 강력한 카드입니다. 하지만 시드 잘못 잡거나 확장 비율 잘못 정하면 효율이 무너집니다. 시드 5가지&amp;middot;확장 룰&amp;middot;평가 표가 분기 운영의 기준이 됩니다.&lt;/p&gt;
&lt;figure class=&quot;tistory-figure&quot; style=&quot;margin: 28px 0; text-align: center;&quot;&gt;&lt;img style=&quot;max-width: 100%; height: auto; border-radius: 10px;&quot; src=&quot;https://blog.trysitely.com/img/lookalike-audience-ops-hero.png&quot; alt=&quot;시드 사용자(작은 점) 주변에 lookalike audience가 1%, 5%, 10% 동심원으로 확장되는 다이어그램&quot; /&gt;
&lt;figcaption style=&quot;margin-top: 10px; color: #5b6474; font-size: 0.92em; line-height: 1.6;&quot;&gt;시드와 가까울수록 정밀, 멀어질수록 reach 큼 &amp;mdash; 그 균형이 LAL 운영의 핵심.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. LAL의 한 줄 직관&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시드(고가치 고객) 사용자의 행동 패턴을 광고 플랫폼이 학습해, 그와 비슷한 잠재 고객을 찾아준다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;플랫폼별 부르는 이름:&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;플랫폼&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;명칭&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Meta&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Lookalike Audience&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Google&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Similar Audience (deprecated) &amp;rarr; Optimized Targeting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;TikTok&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Lookalike&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Naver&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;유사타겟&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Kakao&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;유사타겟&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작동 원리는 비슷합니다. 시드 사용자의 행동&amp;middot;인구통계&amp;middot;관심사 패턴 &amp;rarr; 비슷한 사용자 풀 추정 &amp;rarr; 광고 노출.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 시드 품질이 결정하는 5가지 요소&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 1000만 명 LAL이라도 시드 한 줄로 효율이 결정됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1. 시드 크기&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1,000명 미만: 패턴 추출 어려움, LAL 효율 낮음&lt;/li&gt;
&lt;li&gt;1,000-5,000명: 마지노선&lt;/li&gt;
&lt;li&gt;5,000-50,000명: 표준&lt;/li&gt;
&lt;li&gt;50,000+: 상위 효율, 확장 가능 사용자 풀 큼&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;플랫폼별 권장 최소: Meta 100, Google 1,000, TikTok 1,000. 권장 최소 미달 시 LAL 비활성화.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2. 시드 동질성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시드가 한 가지 행동&amp;middot;세그먼트로 깨끗할수록 LAL 정밀도 상승. &quot;전체 구매자&quot; 시드보다 &quot;Q1 카테고리 A 구매자&quot; 시드가 더 정밀.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-3. 시드 가치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시드 사용자의 평균 가치가 높을수록 LAL이 찾는 잠재 고객 가치도 높음. LTV 상위 10% 시드 vs 전체 구매자 시드의 효율 차이가 큼.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-4. 시드 최신성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오래된 시드(2년 전 구매자)는 행동 패턴이 시장과 어긋남. 최근 90일 내 구매자가 표준.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-5. 시드 매칭률&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;플랫폼이 시드를 자기 사용자와 매칭한 비율. Meta EMQ&amp;middot;Google match rate가 60%+ 권장. 매칭률 낮으면 시드 패턴 추출 한계.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;시드 품질 변수&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;추천&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;크기&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;5,000+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;동질성&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;단일 세그먼트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;가치&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;LTV 상위 10-20%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;최신성&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;90일 내&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;매칭률&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;60%+&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--note&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;이 글의 전제&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;독자가 광고 운영자&amp;middot;퍼포먼스 마케터로 LAL을 한 번이라도 운영해본 적 있다고 가정합니다. 1st-party 데이터&amp;middot;CRM에 익숙하다고 가정합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 확장 비율의 트레이드오프&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LAL 확장 비율(plataform별 1-10%)이 정밀도와 reach의 트레이드오프를 만듭니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1. 1% LAL &amp;mdash; 시드와 가장 비슷&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EU 4억 인구 중 1% = 400만. 시드와 행동 패턴이 가장 비슷, ROAS 가장 높음. reach 작아 광고 빈도가 빠르게 올라감(피로 위험).&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-2. 5% LAL &amp;mdash; 표준&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시드와 어느 정도 비슷, reach 충분. 대부분의 캠페인에 적합.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-3. 10% LAL &amp;mdash; 가장 넓음&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시드와 가까운 정도가 약함, reach 가장 큼. 브랜드 인지&amp;middot;신규 도달 캠페인에 적합.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;확장 비율&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;reach&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;정밀도&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;적합 캠페인&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1%&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;작음&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;매우 높음&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;직접 반응, ROAS 우선&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;3-5%&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;중간&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;높음&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;표준&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;7-10%&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;큼&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;중간&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;브랜드 인지, 신규 도달&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-4. 다중 확장 비율 동시 운영&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1%, 3%, 7% LAL을 모두 만들고 광고 그룹 분리. 1%에 우선 노출, 소진되면 3%, 그 다음 7%. ROAS 우선순위 자동화.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 평가 사이클 &amp;mdash; 분기 1회 LAL 효율 점검&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-1. LAL vs control 효과 비교&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LAL 노출 vs 일반 타겟팅 노출의 ROAS&amp;middot;CPA 비교. 분기에 한 번 lift study로 검증.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-2. 시드 갱신 주기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시드는 살아있는 데이터. 분기마다 갱신해 최신 90일 구매자로 업데이트. 갱신 안 하면 시드가 노화.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-3. 확장 비율별 효율&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1% vs 5% vs 10% LAL의 ROAS&amp;middot;CPA&amp;middot;CTR을 표로. 어느 비율이 가장 효율 좋은지 분기마다 확인.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-4. 시드 카테고리별 효율&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 시드(VIP&amp;middot;구매자&amp;middot;신규)별 LAL 효율 비교. 어느 시드가 가장 효율 좋은지.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;평가 항목&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;점검 빈도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;LAL vs control&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;분기 1회 (lift study)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;시드 갱신&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;분기 1회 (자동화)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;확장 비율별&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;분기 1회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;시드별 효율&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;분기 1회&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 코드 한 묶음 &amp;mdash; Python 시드 생성 자동화&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 글에 박는 유일한 코드입니다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/article&gt;</description>
      <category>앱 마케팅</category>
      <category>Audience</category>
      <category>first-party</category>
      <category>LOOKALIKE</category>
      <category>SEED</category>
      <category>Targeting</category>
      <author>Aramir</author>
      <guid isPermaLink="true">https://code77.tistory.com/123</guid>
      <comments>https://code77.tistory.com/123#entry123comment</comments>
      <pubDate>Sat, 16 May 2026 18:21:02 +0900</pubDate>
    </item>
    <item>
      <title>LLM token economics &amp;mdash; 자동화의 단위 경제학을 분기 보고로 끌고 가기</title>
      <link>https://code77.tistory.com/122</link>
      <description>&lt;article class=&quot;tistory-mirror-post&quot; data-source-slug=&quot;llm-token-economics&quot;&gt;
&lt;p class=&quot;tistory-description&quot; data-ke-size=&quot;size16&quot;&gt;LLM 자동화의 비용은 호출 수 &amp;times; 입력 토큰 &amp;times; 단가로 빠르게 커집니다. 호출별 비용&amp;middot;일일 합계&amp;middot;모델별 단위 경제학을 분기 보고에 박는 한 가지 표 양식.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM 자동화 한 자리에 비용이 매월 얼마나 드는지 즉답할 수 있나요? 첫 청구서를 받기 전까지는 의외로 어렵습니다. 호출 수 &amp;times; 입력 토큰 &amp;times; 단가가 각각 어떻게 움직이는지 모르고 자동화를 운영하면, 분기 마감일에 &quot;이번 분기 LLM 비용이 예상보다 3배&quot;라는 숫자만 받게 됩니다. 이 글은 그 숫자를 분기 보고로 끌고 가는 단위 경제학 한 묶음을 정리합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마케터가 이 글을 읽어야 하는 이유&lt;/b&gt;: LLM 자동화는 ROI가 큰 만큼 비용도 빠르게 커집니다. 호출당 비용&amp;middot;일일 합계&amp;middot;모델별 단가 차이를 미리 알면 분기 예산 결정이 정확해지고, 어느 자동화에 어느 모델을 쓸지 결정할 때 데이터가 따라옵니다. 비용 청구서가 통제 안에 들어와야 LLM 자동화가 운영의 표준 도구가 됩니다.&lt;/p&gt;
&lt;figure class=&quot;tistory-figure&quot; style=&quot;margin: 28px 0; text-align: center;&quot;&gt;&lt;img style=&quot;max-width: 100%; height: auto; border-radius: 10px;&quot; src=&quot;https://blog.trysitely.com/img/llm-token-economics-hero.png&quot; alt=&quot;입력 토큰&amp;middot;출력 토큰&amp;middot;캐시 토큰의 단가 차이를 보여주는 다이어그램과 모델별 단가 비교 표&quot; /&gt;
&lt;figcaption style=&quot;margin-top: 10px; color: #5b6474; font-size: 0.92em; line-height: 1.6;&quot;&gt;자동화 한 자리의 비용은 입력&amp;middot;출력&amp;middot;캐시&amp;middot;모델 4가지 변수로 거의 결정된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. LLM 비용의 4개 변수&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM API 비용은 단순한 공식으로 계산됩니다.&lt;/p&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6833em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;Cost&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 2.3521em; vertical-align: -1.3021em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mop op-limits&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 1.05em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -1.8479em; margin-left: 0em;&quot;&gt;&lt;span style=&quot;height: 3.05em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;calls&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3.05em;&quot;&gt;&lt;span style=&quot;height: 3.05em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span&gt;&lt;span class=&quot;mop op-symbol large-op&quot;&gt;&amp;sum;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 1.3021em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.1389em;&quot; class=&quot;mord mathnormal&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3175em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.1389em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;in&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&amp;sdot;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.7778em; vertical-align: -0.1944em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3175em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: 0em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;in&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.8333em; vertical-align: -0.15em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.1389em;&quot; class=&quot;mord mathnormal&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.2806em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.1389em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;out&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&amp;sdot;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.7778em; vertical-align: -0.1944em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.2806em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: 0em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;out&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&amp;minus;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.8333em; vertical-align: -0.15em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.1389em;&quot; class=&quot;mord mathnormal&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3361em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.1389em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;cache&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&amp;sdot;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3361em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: 0em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;cache&amp;nbsp;discount&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.8333em; vertical-align: -0.15em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.1389em;&quot; class=&quot;mord mathnormal&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3175em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.1389em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;in&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: 호출당 입력 토큰&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.8333em; vertical-align: -0.15em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.1389em;&quot; class=&quot;mord mathnormal&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.2806em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.1389em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;out&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: 호출당 출력 토큰&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.8333em; vertical-align: -0.15em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.1389em;&quot; class=&quot;mord mathnormal&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3361em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.1389em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;cache&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: 호출당 캐시 히트 토큰&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.625em; vertical-align: -0.1944em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: 토큰당 단가 (모델&amp;middot;종류별 다름)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 4개 변수가 자동화 한 자리의 매월 비용을 거의 결정합니다.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--note&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;이 글의 전제&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM API를 자동화에 한 번이라도 써보고 청구서를 받아본 적 있는 마케터&amp;middot;운영자를 가정합니다. 토큰&amp;middot;입력&amp;middot;출력 같은 단어는 일상으로 쓴다고 가정합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 모델별 단가 &amp;mdash; 자릿수 차이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2026년 기준 주요 모델 단가(1M 토큰당, USD).&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;모델&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;입력&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;출력&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;캐시 히트&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;추론(thinking)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;GPT-5&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$5&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$15&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$2.5&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;GPT-5-mini&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$0.50&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$1.50&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$0.25&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&amp;mdash;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Claude Opus 4.7&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$15&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$75&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$1.5&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&amp;mdash;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Claude Sonnet 4.6&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$3&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$15&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$0.30&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&amp;mdash;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Claude Haiku 4.5&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$0.80&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$4&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$0.08&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&amp;mdash;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Gemini 2.5 Pro&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$1.25&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$5&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$0.31&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&amp;mdash;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Gemini 2.5 Flash&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$0.30&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$2.50&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$0.075&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&amp;mdash;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 작업이라도 모델 선택만으로 비용이 10-30배 차이. 입력 토큰이 많은 자리(긴 컨텍스트)는 입력 단가, 출력이 긴 자리(보고서 생성)는 출력 단가가 핵심.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 호출당 비용 계산 &amp;mdash; 한 자동화의 단위 경제학&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캠페인 분류 자동화를 예로 들겠습니다.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;값&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;시스템 프롬프트&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;500 토큰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Few-shot 예시&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1500 토큰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;사용자 입력&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;100 토큰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;출력&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;200 토큰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;일일 호출&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1000회&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1. GPT-5 사용 시&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호출당 비용:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입력: &lt;span style=&quot;color: #cc0000;&quot; class=&quot;katex-error&quot;&gt;(500 + 1500 + 100) / 1\text{M} \times \&lt;/span&gt;5 = $0.0105$&lt;/li&gt;
&lt;li&gt;출력: &lt;span style=&quot;color: #cc0000;&quot; class=&quot;katex-error&quot;&gt;200 / 1\text{M} \times \&lt;/span&gt;15 = $0.003$&lt;/li&gt;
&lt;li&gt;호출당: &lt;span style=&quot;color: #cc0000;&quot; class=&quot;katex-error&quot;&gt;\&lt;/span&gt;0.0135$&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일일 1000회: &lt;span style=&quot;color: #cc0000;&quot; class=&quot;katex-error&quot;&gt;\&lt;/span&gt;13.5&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6833em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mord hangul_fallback&quot;&gt;한달&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;$405$.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-2. GPT-5-mini 사용 시&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호출당:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입력: &lt;span style=&quot;color: #cc0000;&quot; class=&quot;katex-error&quot;&gt;2100 / 1\text{M} \times \&lt;/span&gt;0.50 = $0.00105$&lt;/li&gt;
&lt;li&gt;출력: &lt;span style=&quot;color: #cc0000;&quot; class=&quot;katex-error&quot;&gt;200 / 1\text{M} \times \&lt;/span&gt;1.50 = $0.0003$&lt;/li&gt;
&lt;li&gt;호출당: &lt;span style=&quot;color: #cc0000;&quot; class=&quot;katex-error&quot;&gt;\&lt;/span&gt;0.00135$&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일일 1000회: &lt;span style=&quot;color: #cc0000;&quot; class=&quot;katex-error&quot;&gt;\&lt;/span&gt;1.35&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6833em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mord hangul_fallback&quot;&gt;한달&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;$40.5$. &lt;b&gt;GPT-5의 1/10&lt;/b&gt;.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-3. Caching 적용 GPT-5&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.trysitely.com/posts/prompt-caching-1000-90/&quot;&gt;Prompt caching&lt;/a&gt;을 적용하면 시스템 프롬프트&amp;middot;few-shot이 캐시 히트:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입력 (캐시 안 됨): &lt;span style=&quot;color: #cc0000;&quot; class=&quot;katex-error&quot;&gt;100 / 1\text{M} \times \&lt;/span&gt;5 = $0.0005$&lt;/li&gt;
&lt;li&gt;입력 (캐시 히트): &lt;span style=&quot;color: #cc0000;&quot; class=&quot;katex-error&quot;&gt;2000 / 1\text{M} \times \&lt;/span&gt;2.5 = $0.005$&lt;/li&gt;
&lt;li&gt;출력: &lt;span style=&quot;color: #cc0000;&quot; class=&quot;katex-error&quot;&gt;\&lt;/span&gt;0.003$&lt;/li&gt;
&lt;li&gt;호출당: &lt;span style=&quot;color: #cc0000;&quot; class=&quot;katex-error&quot;&gt;\&lt;/span&gt;0.0085$ (37% 절감)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;옵션&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;호출당&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;일일 1000회&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;월 비용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;GPT-5 (no cache)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$0.0135&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$13.5&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$405&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;GPT-5 + caching&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$0.0085&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$8.5&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$255&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;GPT-5-mini&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$0.00135&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$1.35&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$40.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;GPT-5-mini + caching&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$0.001&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$1.0&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$30&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 작업에 모델&amp;middot;캐싱 조합으로 월 $30-405. 13배 차이.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 코드 한 묶음 &amp;mdash; 호출별 비용 추적&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 글에 박는 유일한 코드입니다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/article&gt;</description>
      <category>AI&amp;middot;LLM</category>
      <category>Cost</category>
      <category>LLM</category>
      <category>Reporting</category>
      <category>token</category>
      <category>unit-economics</category>
      <author>Aramir</author>
      <guid isPermaLink="true">https://code77.tistory.com/122</guid>
      <comments>https://code77.tistory.com/122#entry122comment</comments>
      <pubDate>Sat, 16 May 2026 18:20:07 +0900</pubDate>
    </item>
    <item>
      <title>Heterogeneous treatment effects &amp;mdash; 평균 효과 너머의 개인별 효과</title>
      <link>https://code77.tistory.com/121</link>
      <description>&lt;article class=&quot;tistory-mirror-post&quot; data-source-slug=&quot;heterogeneous-treatment-effects&quot;&gt;
&lt;p class=&quot;tistory-description&quot; data-ke-size=&quot;size16&quot;&gt;A/B 평균 효과 +5%p가 모든 사람에게 같지 않습니다. 일부에게는 +20%p, 일부에게는 -3%p. CATE&amp;middot;uplift forest로 효과의 이질성을 추정해 타겟 마케팅을 정밀화하는 흐름.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A/B 결과 &quot;B안이 평균 +5%p 효과&quot;라는 한 줄은 사실 평균값입니다. 어떤 사용자에게는 +20%p, 어떤 사용자에게는 -3%p일 수 있습니다. 평균만으로 결정하면 효과 큰 사용자에 못 집중하고, 효과 음수인 사용자도 똑같이 처리합니다. CATE(Conditional Average Treatment Effect)&amp;middot;uplift forest는 이 이질성을 추정해 정밀한 타겟팅을 가능하게 합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마케터가 이 글을 읽어야 하는 이유&lt;/b&gt;: 같은 캠페인을 모든 사용자에게 동일하게 노출하는 시대는 지나갑니다. 효과가 큰 세그먼트에 집중하고 효과 없는 세그먼트는 제외하는 정밀 타겟팅이 ROAS의 다음 도약 자리. CATE 추정은 그 결정의 데이터 기반.&lt;/p&gt;
&lt;figure class=&quot;tistory-figure&quot; style=&quot;margin: 28px 0; text-align: center;&quot;&gt;&lt;img style=&quot;max-width: 100%; height: auto; border-radius: 10px;&quot; src=&quot;https://blog.trysitely.com/img/heterogeneous-treatment-effects-hero.png&quot; alt=&quot;평균 효과 +5%p 위에 사용자 세그먼트별 효과(-3, 0, 5, 10, 20%p) 분포가 그려진 다이어그램&quot; /&gt;
&lt;figcaption style=&quot;margin-top: 10px; color: #5b6474; font-size: 0.92em; line-height: 1.6;&quot;&gt;평균은 한 숫자, 실제는 분포. 그 분포를 보면 타겟팅이 달라진다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. ATE에서 CATE로&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평균 처리 효과(ATE):&lt;/p&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.5806em; vertical-align: -0.15em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.1132em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;tau;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3283em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.1132em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;ATE&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0576em;&quot; class=&quot;mord mathnormal&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mord mathnormal&quot;&gt;Y&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&amp;minus;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mord mathnormal&quot;&gt;Y&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 사용자에 평균한 효과. A/B 결과 &quot;+5%p&quot;가 이 값.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건부 평균 처리 효과(CATE):&lt;/p&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.1132em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;tau;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3283em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.1132em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;CATE&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0576em;&quot; class=&quot;mord mathnormal&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mord mathnormal&quot;&gt;Y&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&amp;minus;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mord mathnormal&quot;&gt;Y&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;∣&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6833em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0785em;&quot; class=&quot;mord mathnormal&quot;&gt;X&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 특성 &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6833em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0785em;&quot; class=&quot;mord mathnormal&quot;&gt;X&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;를 가진 사용자에게의 효과. 사용자별&amp;middot;세그먼트별로 다른 값.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;사용자 X&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;CATE&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;신규, 모바일, 20대&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;+20%p&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;기존, 데스크톱, 40대&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;+2%p&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;VIP, 카테고리 A 선호&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;+12%p&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;비활성, 마지막 구매 90일+&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;-3%p&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ATE 평균 +5%p는 이 분포의 평균에 불과. 분포를 보면 타겟팅 결정이 완전히 달라집니다.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--note&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;이 글의 전제&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A/B 테스트&amp;middot;인과추론 단어를 일상으로 쓴다고 가정합니다. 회귀&amp;middot;머신러닝의 직관 정도는 받아들인다고 가정합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Uplift modeling &amp;mdash; CATE의 마케팅 언어&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마케팅 자리에서 CATE를 부르는 더 흔한 단어가 uplift입니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처리 받았을 때의 결과 - 처리 안 받았을 때의 결과 = uplift&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;사용자 유형&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;uplift&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;마케팅 의미&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Persuadables&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;+&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;광고로 설득 가능 &amp;mdash; 타겟 1순위&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Sure things&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;어차피 살 사람 &amp;mdash; 광고 낭비&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Lost causes&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;어차피 안 살 사람 &amp;mdash; 광고 낭비&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Sleeping dogs&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;-&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;광고가 오히려 역효과 &amp;mdash; 광고 제외&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마케팅 ROI의 핵심은 Persuadables를 찾고 Sleeping dogs를 제외하는 것. 평균 효과만 보면 둘이 섞여 결과가 흐려집니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. CATE 추정 방법 3가지&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1. Meta-learners (S/T/X-learner)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처리&amp;middot;비처리 별도 모델 학습 후 조합.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;S-learner: 처리 인디케이터를 feature로 단일 모델&lt;/li&gt;
&lt;li&gt;T-learner: 처리&amp;middot;비처리 두 모델 별도 학습&lt;/li&gt;
&lt;li&gt;X-learner: T-learner + 매칭으로 보정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 단순. sklearn 모델로 직접 구현 가능.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-2. Causal Forest&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Random Forest의 인과 추론 버전. 트리 분할 기준이 &quot;효과가 가장 다른 자리&quot;가 되도록 학습. CATE를 노드 단위로 추정.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-3. Uplift Tree (Klassifier)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Two-step: (1) outcome 예측 (2) 그 예측 차이로 uplift 정렬. 단순하고 해석 가능.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;방법&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;강점&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;약점&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Meta-learner&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;단순, sklearn 호환&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;큰 모델 비용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Causal Forest&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;비선형 자동 잡음&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;학습 느림&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Uplift Tree&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;해석 쉬움&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;정밀도 낮음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 코드 한 묶음 &amp;mdash; EconML CausalForest&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 글에 박는 유일한 코드입니다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/article&gt;</description>
      <category>통계&amp;middot;ML</category>
      <category>cate</category>
      <category>causal-inference</category>
      <category>Heterogeneous</category>
      <category>Targeting</category>
      <category>uplift</category>
      <author>Aramir</author>
      <guid isPermaLink="true">https://code77.tistory.com/121</guid>
      <comments>https://code77.tistory.com/121#entry121comment</comments>
      <pubDate>Sat, 16 May 2026 18:19:27 +0900</pubDate>
    </item>
    <item>
      <title>Function calling 설계 패턴 &amp;mdash; LLM이 도구를 부를 때 마케터가 점검할 것</title>
      <link>https://code77.tistory.com/120</link>
      <description>&lt;article class=&quot;tistory-mirror-post&quot; data-source-slug=&quot;function-calling-llm&quot;&gt;
&lt;p class=&quot;tistory-description&quot; data-ke-size=&quot;size16&quot;&gt;LLM이 광고 API&amp;middot;BigQuery&amp;middot;Slack을 직접 부르기 시작하면, 답변 품질보다 &quot;어느 도구를 언제 부를지&quot;가 운영 사고의 진앙이 됩니다. function calling의 한 줄 직관과 마케터가 점검할 5가지.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;이 캠페인 ROAS 보여줘&quot;라고 묻자 챗봇이 BigQuery에 SQL을 던져 결과를 돌려줍니다. 마케터 입장에서는 마법 같은 일인데, 그 &quot;마법&quot;의 정체가 function calling입니다. 모델이 직접 데이터를 가져오는 게 아니라, 어느 도구를 어떤 인수로 부를지를 결정해 시스템에 넘기는 한 가지 능력입니다. 이 글은 function calling이 어떻게 동작하고, 운영에서 깨지는 자리, 그리고 마케터가 직접 점검할 5가지 체크포인트를 정리합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마케터가 이 글을 읽어야 하는 이유&lt;/b&gt;: LLM 챗봇&amp;middot;에이전트가 사내 데이터에 직접 접근하기 시작하면, &quot;답변이 맞다&quot;보다 &quot;어느 도구를 언제 불렀나&quot;가 운영 사고의 1순위가 됩니다. 잘못된 도구를 부르면 잘못된 데이터로 답하고, 잘못된 인수를 넘기면 다른 캠페인의 데이터가 나옵니다. function calling의 작동 원리를 이해하면 이 사고들을 사전에 막을 수 있습니다.&lt;/p&gt;
&lt;figure class=&quot;tistory-figure&quot; style=&quot;margin: 28px 0; text-align: center;&quot;&gt;&lt;img style=&quot;max-width: 100%; height: auto; border-radius: 10px;&quot; src=&quot;https://blog.trysitely.com/img/function-calling-llm-hero.png&quot; alt=&quot;LLM이 사용자 질문을 받아 도구를 선택하고 인수를 추출해 호출한 뒤 결과를 답변으로 통합하는 4단계 흐름&quot; /&gt;
&lt;figcaption style=&quot;margin-top: 10px; color: #5b6474; font-size: 0.92em; line-height: 1.6;&quot;&gt;모델이 답을 만드는 게 아니라, 어느 도구를 어떤 인수로 부를지를 결정한다 &amp;mdash; 이게 function calling의 본질.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Function calling의 한 줄 직관&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전통적 LLM은 한 가지만 합니다 &amp;mdash; 토큰 시퀀스 받아 다음 토큰 예측. 이 모델에 외부 도구를 붙이는 표준 방식이 function calling입니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델이 답을 만드는 대신, &quot;어느 도구를 어떤 인수로 부르라&quot;는 구조화된 지시를 출력한다. 실제 실행은 호스트 시스템이 한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작동 흐름을 4단계로 쪼개면:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;의도 파악&lt;/b&gt; &amp;mdash; 사용자 질문 의미 해석 (&quot;이 캠페인 ROAS 알려줘&quot; &amp;rarr; 데이터 조회 의도)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;도구 선택&lt;/b&gt; &amp;mdash; 등록된 도구 목록 중 적합한 것 결정 (&lt;code&gt;get_campaign_roas&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;인수 추출&lt;/b&gt; &amp;mdash; 함수 시그니처에 맞춰 JSON 인수 생성 (&lt;code&gt;{&quot;campaign_id&quot;: &quot;M2026Q2-display&quot;}&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;응답 통합&lt;/b&gt; &amp;mdash; 호스트가 실행한 결과를 받아 자연어로 답변 합성&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 단계가 모두 모델 출력에서 나옵니다. 의도 파악과 인수 추출은 attention이 텍스트를 풀어가는 과정이고, 도구 선택은 등록된 함수 schema와의 매칭입니다. 잘 이해하면 LLM이 마케팅 데이터&amp;middot;SaaS API&amp;middot;내부 시스템을 자연어로 조작할 수 있는 인터페이스가 됩니다.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--note&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;이 글의 전제&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;독자가 LLM&amp;middot;챗봇&amp;middot;에이전트라는 단어는 일상에서 쓰고, GPT/Claude API를 한 번이라도 들어봤다고 가정합니다. 코드를 직접 짜본 적 없어도 OK이고, &quot;도구를 부른다&quot;는 개념의 의미는 받아들인다고 가정합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 마케팅 자리에 흔한 5가지 도구&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;function calling은 추상적 기술이 아니라 마케팅 운영의 구체적 자리에 들어옵니다. 자주 등장하는 도구 패턴은 다음 5가지입니다.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;도구 카테고리&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;예시&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;위험 자리&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;데이터 조회&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;get_campaign_roas&lt;/code&gt;, &lt;code&gt;query_bigquery&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;잘못된 캠페인 ID&amp;middot;기간 추출&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;보고 생성&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;generate_weekly_report&lt;/code&gt;, &lt;code&gt;export_to_pdf&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;형식 일관성&amp;middot;접근권한&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;액션 실행&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;pause_campaign&lt;/code&gt;, &lt;code&gt;update_budget&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;의도 오해석으로 운영 중 캠페인 정지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;외부 검색&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;search_competitor&lt;/code&gt;, &lt;code&gt;lookup_creative_db&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;외부 API rate limit&amp;middot;환각&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;사내 알림&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;send_slack&lt;/code&gt;, &lt;code&gt;notify_oncall&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;잘못된 채널&amp;middot;잘못된 사람 멘션&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위험 자리에 공통으로 들어가는 단어가 &quot;잘못된&quot;입니다. 모델이 의도를 잘못 해석하거나 인수를 잘못 추출하면, 자연어 인터페이스의 편의가 그대로 운영 사고로 연결됩니다.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--warn&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;액션 도구는 두 단계 게이트&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 조회 도구는 잘못 불러도 잘못된 답이 나오고 끝납니다. 하지만 액션 도구(&lt;code&gt;pause_campaign&lt;/code&gt;, &lt;code&gt;update_budget&lt;/code&gt;)는 잘못 부르면 캠페인이 멈추거나 예산이 바뀝니다. 액션 도구는 반드시 사용자 명시 확인 단계(&lt;code&gt;confirm: true&lt;/code&gt; 같은 추가 인수)를 끼워두세요.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 도구 schema 설계의 작은 디테일&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델이 도구를 잘 부르려면 함수 schema가 잘 쓰여 있어야 합니다. 같은 도구라도 schema 한 줄 차이로 호출 정확도가 크게 달라집니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1. 이름이 의도를 담아야 한다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;get_data&lt;/code&gt; 같은 모호한 이름은 모델이 어느 자리에 부를지 헷갈립니다. &lt;code&gt;get_campaign_roas_by_id&lt;/code&gt;처럼 입력&amp;middot;출력&amp;middot;범위가 한 번에 보이는 이름이 호출 정확도가 높습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-2. description은 &quot;언제 부르는가&quot;를 명시&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 description은 함수가 무엇을 하는지가 아니라 언제 부르고 언제 안 부르는지를 적습니다. &quot;분기&amp;middot;월&amp;middot;주 단위 캠페인 ROAS를 조회. campaign_id가 명확할 때만 사용. 캠페인 이름으로 조회해야 한다면 lookup_campaign_by_name을 먼저 부를 것&quot;처럼 호출 조건과 선후 관계가 들어가야 모델이 도구 선택에서 헤매지 않습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-3. 인수에 enum과 default를 적극 사용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;enum&lt;/code&gt;이 있으면 모델은 그 값들 중 하나만 선택하므로 임의 문자열로 인한 오류가 사라집니다. 예를 들어 기간 인수가 &lt;code&gt;[&quot;last_week&quot;, &quot;last_month&quot;, &quot;last_quarter&quot;, &quot;ytd&quot;]&lt;/code&gt; 네 값 중 하나로 제한되면, 사용자가 &quot;지난 분기&quot;라고 말했을 때 모델이 &lt;code&gt;last_quarter&lt;/code&gt;로 정확히 매핑합니다. 자유 문자열로 두면 &lt;code&gt;Q1&lt;/code&gt; &lt;code&gt;2025Q1&lt;/code&gt; &lt;code&gt;1분기&lt;/code&gt; 같은 다양한 표기로 깨집니다. &lt;code&gt;default&lt;/code&gt;까지 있으면 사용자가 기간을 명시하지 않을 때 모델이 추측하지 않고 안전한 기본값을 씁니다.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--tip&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;schema 한 줄을 다듬는 ROI&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델 교체나 프롬프트 엔지니어링보다 schema 한 줄을 다듬는 게 호출 정확도 개선에 더 빠릅니다. 도구 description을 &quot;언제 부르고 언제 안 부른다&quot;로 다시 쓰는 30분이 모델을 GPT-4o &amp;rarr; GPT-5로 교체한 효과보다 클 때가 흔합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 의도 오해석이 일어나는 자리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;function calling의 사고 대부분은 모델이 도구를 &quot;부른다 vs 안 부른다&quot;의 경계에서 일어납니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-1. 부를 도구가 없는데 억지로 부르는 케이스&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 &quot;지난 분기 분위기 어땠어?&quot;처럼 모호한 질문을 하면, 모델이 적절한 도구가 없는데도 &lt;code&gt;get_campaign_roas&lt;/code&gt; 같은 가까운 도구를 일단 호출합니다. 결과는 잘못된 컨텍스트를 깔고 환각이 시작됩니다. 방어책은 시스템 프롬프트에 &quot;확신이 없으면 도구를 부르지 말고 사용자에게 명확화 질문을 하라&quot;는 룰 명시입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-2. 도구는 맞는데 인수가 틀린 케이스&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;이번 분기 ROAS&quot;라고 했을 때 모델이 &lt;code&gt;period: &quot;last_quarter&quot;&lt;/code&gt;로 부를지 &lt;code&gt;period: &quot;ytd&quot;&lt;/code&gt;로 부를지 헷갈립니다. enum 값에 대한 description(&quot;이번 분기는 last_quarter 아님, 현재 진행 중 분기는 별도 도구 사용&quot;)을 붙이면 줄어듭니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-3. 도구를 안 불러야 하는데 부르는 케이스&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;우리 캠페인 ROAS는 보통 어느 정도가 좋아?&quot;는 일반론 질문입니다. 도구를 부르지 않고 일반 답변을 해야 하는데, 모델이 &quot;이 회사 데이터를 봐야 한다&quot;고 오해하고 도구를 호출합니다. 시스템 프롬프트에 &quot;일반론 질문은 도구 호출 없이 답한다&quot; 명시 + few-shot 예시로 분리합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 모델 출력 한 묶음 &amp;mdash; 코드 예시 한 개&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델이 어떻게 도구 호출을 출력하는지 한 번만 보여드립니다. 이게 글에 박는 유일한 코드입니다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/article&gt;</description>
      <category>AI&amp;middot;LLM</category>
      <category>Agent</category>
      <category>function-calling</category>
      <category>LLM</category>
      <category>marketing-ai</category>
      <category>tool-use</category>
      <author>Aramir</author>
      <guid isPermaLink="true">https://code77.tistory.com/120</guid>
      <comments>https://code77.tistory.com/120#entry120comment</comments>
      <pubDate>Sat, 16 May 2026 18:17:33 +0900</pubDate>
    </item>
    <item>
      <title>Doubly robust estimation &amp;mdash; IPW와 outcome 모델의 결합으로 인과 추정 안정화</title>
      <link>https://code77.tistory.com/119</link>
      <description>&lt;article class=&quot;tistory-mirror-post&quot; data-source-slug=&quot;doubly-robust-estimation&quot;&gt;
&lt;p class=&quot;tistory-description&quot; data-ke-size=&quot;size16&quot;&gt;PSM&amp;middot;IPW는 propensity 모델이 틀리면 무너지고, 회귀는 outcome 모델이 틀리면 무너집니다. doubly robust는 두 모델을 결합해 둘 중 하나만 맞으면 정직한 효과 추정. 마케팅 인과 분석의 안전판.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무작위 배정이 안 되는 자리에 인과 효과를 추정하려면 두 가지 길이 있습니다 &amp;mdash; propensity 모델 기반(PSM&amp;middot;IPW) 또는 outcome 모델 기반(회귀). 두 길은 각각 서로 다른 자리에서 깨집니다. doubly robust(이중 안전) 추정은 두 모델을 결합해, 둘 중 하나만 맞으면 정직한 효과 추정을 보장합니다. 마케팅 인과 분석의 안전판.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마케터가 이 글을 읽어야 하는 이유&lt;/b&gt;: 인과 분석 결과를 회의에서 신뢰성 있게 보고하려면 &quot;이 추정의 모델 가정 중 어느 게 깨져도 결과가 무너지는가&quot;를 먼저 답해야 합니다. doubly robust는 그 답이 &quot;둘 다 깨져야 무너진다&quot;라 회의 신뢰도가 한 단계 올라갑니다.&lt;/p&gt;
&lt;figure class=&quot;tistory-figure&quot; style=&quot;margin: 28px 0; text-align: center;&quot;&gt;&lt;img style=&quot;max-width: 100%; height: auto; border-radius: 10px;&quot; src=&quot;https://blog.trysitely.com/img/doubly-robust-estimation-hero.png&quot; alt=&quot;Propensity weighting과 outcome regression이 평행으로 결합되는 doubly robust 다이어그램&quot; /&gt;
&lt;figcaption style=&quot;margin-top: 10px; color: #5b6474; font-size: 0.92em; line-height: 1.6;&quot;&gt;둘 중 하나만 맞으면 정직 &amp;mdash; 인과 추정의 안전 마진.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. PSM&amp;middot;IPW가 흔들리는 자리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.trysitely.com/posts/propensity-score-matching/&quot;&gt;PSM&lt;/a&gt;이나 IPW(역확률 가중)는 propensity score &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0785em;&quot; class=&quot;mord mathnormal&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mop&quot;&gt;Pr&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord hangul_fallback&quot;&gt;노출&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;∣&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0785em;&quot; class=&quot;mord mathnormal&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;를 정확히 추정한다는 가정에 의존합니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;propensity 모델이 틀리면 매칭&amp;middot;가중이 잘못되고 효과 추정이 편향됩니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흔한 자리:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비선형 관계 (로지스틱이 아닌 GBM 필요)&lt;/li&gt;
&lt;li&gt;변수가 너무 많음 (overfitting)&lt;/li&gt;
&lt;li&gt;관측 변수 부족 (unmeasured confounder)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Outcome 회귀가 흔들리는 자리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 길은 outcome을 직접 모델링하는 것. &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0576em;&quot; class=&quot;mord mathnormal&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mord mathnormal&quot;&gt;Y&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;∣&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0785em;&quot; class=&quot;mord mathnormal&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;margin-right: 0.1667em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.1389em;&quot; class=&quot;mord mathnormal&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;를 회귀로 추정하고, &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6833em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.1389em;&quot; class=&quot;mord mathnormal&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6444em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;과 &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6833em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.1389em;&quot; class=&quot;mord mathnormal&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6444em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;의 차이를 효과로.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;outcome 모델이 틀리면 회귀 계수가 편향되고 효과 추정도 무너집니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흔한 자리:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비선형 outcome (회귀 가정 위반)&lt;/li&gt;
&lt;li&gt;interaction 효과 미포함&lt;/li&gt;
&lt;li&gt;결과 변수의 분포 가정 위반&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Doubly robust의 한 줄 직관&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 모델을 결합해 어느 하나만 맞으면 정직한 추정을 보장.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘 다 잘 추정하면 효율 최고, 하나만 맞아도 unbias, 둘 다 틀리면 무너짐.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수식으로(AIPW = Augmented IPW):&lt;/p&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.8444em; vertical-align: -0.15em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord accent&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.6944em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -3em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.1132em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;tau;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;left: -0.2222em;&quot; class=&quot;accent-body&quot;&gt;&lt;span class=&quot;mord&quot;&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3283em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.1132em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span style=&quot;margin-right: 0.0278em;&quot; class=&quot;mord mathnormal mtight&quot;&gt;D&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0077em;&quot; class=&quot;mord mathnormal mtight&quot;&gt;R&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 2.7277em; vertical-align: -1.2777em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 1.3214em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.314em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.109em;&quot; class=&quot;mord mathnormal&quot;&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3.23em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;border-bottom-width: 0.04em;&quot; class=&quot;frac-line&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3.677em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.686em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.1667em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mop op-limits&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 1.05em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -1.8723em; margin-left: 0em;&quot;&gt;&lt;span style=&quot;height: 3.05em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3.05em;&quot;&gt;&lt;span style=&quot;height: 3.05em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span&gt;&lt;span class=&quot;mop op-symbol large-op&quot;&gt;&amp;sum;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 1.2777em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.1667em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;minner&quot;&gt;&lt;span style=&quot;top: 0em;&quot; class=&quot;mopen delimcenter&quot;&gt;&lt;span class=&quot;delimsizing size3&quot;&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 1.427em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.314em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.0785em;&quot; class=&quot;mord mathnormal&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3117em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.0785em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3.23em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;border-bottom-width: 0.04em;&quot; class=&quot;frac-line&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3.677em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.1389em;&quot; class=&quot;mord mathnormal&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3117em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.1389em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mord mathnormal&quot;&gt;Y&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3117em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.2222em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&amp;minus;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;&amp;mu;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3011em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: 0em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.0785em;&quot; class=&quot;mord mathnormal&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3117em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.0785em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.936em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&amp;minus;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 1.427em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.314em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&amp;minus;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.0785em;&quot; class=&quot;mord mathnormal&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3117em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.0785em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3.23em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;border-bottom-width: 0.04em;&quot; class=&quot;frac-line&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3.677em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&amp;minus;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.1389em;&quot; class=&quot;mord mathnormal&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3117em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.1389em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mord mathnormal&quot;&gt;Y&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3117em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.2222em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&amp;minus;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;&amp;mu;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3011em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: 0em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.0785em;&quot; class=&quot;mord mathnormal&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3117em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.0785em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.936em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;&amp;mu;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3011em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: 0em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.0785em;&quot; class=&quot;mord mathnormal&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3117em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.0785em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&amp;minus;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;&amp;mu;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3011em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: 0em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.0785em;&quot; class=&quot;mord mathnormal&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3117em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.0785em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;top: 0em;&quot; class=&quot;mclose delimcenter&quot;&gt;&lt;span class=&quot;delimsizing size3&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;첫 두 항: IPW 보정 (residual에 가중)&lt;/li&gt;
&lt;li&gt;세 번째 항: outcome 모델의 직접 추정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심: propensity 모델이 정확하면 첫 두 항이 정직. outcome 모델이 정확하면 세 번째 항이 정직. 둘 다 틀려야 무너짐.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--note&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;이 글의 전제&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PSM 또는 IPW를 들어본 적 있고(&lt;a href=&quot;https://blog.trysitely.com/posts/propensity-score-matching/&quot;&gt;PSM 글&lt;/a&gt; 참고), 회귀 모델을 들어본 적 있다고 가정합니다. 코드를 직접 짠 적 없어도 됩니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. AIPW vs 단순 IPW&amp;middot;회귀 비교&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 데이터에 세 추정량을 적용하면 어떻게 다른지.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;추정량&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;propensity 정확&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;outcome 정확&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;결과&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;IPW&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;✓&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;✗&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;정직&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;회귀&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;✗&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;✓&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;정직&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;IPW&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;✗&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;✗&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;편향&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;회귀&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;✗&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;✗&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;편향&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;AIPW&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;✓&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;✗&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;정직&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;AIPW&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;✗&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;✓&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;정직&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;AIPW&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;✗&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;✗&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;편향&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AIPW가 IPW와 회귀의 위험 분산. 한 모델이 흔들려도 다른 모델이 받쳐주는 구조.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 코드 한 묶음 &amp;mdash; Python AIPW 구현&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 글에 박는 유일한 코드입니다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/article&gt;</description>
      <category>통계&amp;middot;ML</category>
      <category>aipw</category>
      <category>causal-inference</category>
      <category>doubly-robust</category>
      <category>ipw</category>
      <category>observational</category>
      <author>Aramir</author>
      <guid isPermaLink="true">https://code77.tistory.com/119</guid>
      <comments>https://code77.tistory.com/119#entry119comment</comments>
      <pubDate>Sat, 16 May 2026 18:16:48 +0900</pubDate>
    </item>
    <item>
      <title>EU DMA가 walled garden을 어떻게 흔드나 &amp;mdash; 마케터 영향 정리</title>
      <link>https://code77.tistory.com/118</link>
      <description>&lt;article class=&quot;tistory-mirror-post&quot; data-source-slug=&quot;dma-walled-garden&quot;&gt;
&lt;p class=&quot;tistory-description&quot; data-ke-size=&quot;size16&quot;&gt;EU의 Digital Markets Act(DMA)가 Meta&amp;middot;Google&amp;middot;Apple의 walled garden을 강제 개방시키고 있습니다. 광고주 데이터&amp;middot;측정&amp;middot;광고 제품 관점에서 마케터가 알아야 할 변화 정리.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Meta&amp;middot;Google&amp;middot;Apple은 자기 플랫폼 안의 사용자 데이터&amp;middot;광고 제품을 닫힌 환경(walled garden)에서 운영해 왔습니다. 광고주는 그 안의 데이터를 부분만 보고, 측정&amp;middot;타겟팅 능력도 플랫폼에 의존했습니다. EU의 Digital Markets Act(DMA)가 2024년 본격 시행되면서 이 walled garden이 강제 개방되고 있고, 그 변화가 광고주의 데이터&amp;middot;측정&amp;middot;운영에 영향을 미칩니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마케터가 이 글을 읽어야 하는 이유&lt;/b&gt;: 한국 광고주에게도 DMA가 직접 영향을 줄 수 있습니다. 글로벌 캠페인 운영, 글로벌 분석 표준 변화, EU 사용자 타겟팅 룰 변경. 미리 흐름을 알면 분기 운영에서 헤매지 않습니다.&lt;/p&gt;
&lt;figure class=&quot;tistory-figure&quot; style=&quot;margin: 28px 0; text-align: center;&quot;&gt;&lt;img style=&quot;max-width: 100%; height: auto; border-radius: 10px;&quot; src=&quot;https://blog.trysitely.com/img/dma-walled-garden-hero.png&quot; alt=&quot;Meta&amp;middot;Google&amp;middot;Apple의 닫힌 영역 일부가 DMA로 강제 개방되는 모습 다이어그램&quot; /&gt;
&lt;figcaption style=&quot;margin-top: 10px; color: #5b6474; font-size: 0.92em; line-height: 1.6;&quot;&gt;walled garden 일부가 열리는 중 &amp;mdash; 광고주에게 새 가능성과 새 책임이 동시에.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. DMA의 핵심 &amp;mdash; gatekeeper 의무&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EU DMA는 시장 지배적 디지털 플랫폼(gatekeeper) 7개를 지정해 의무를 부과합니다.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;Gatekeeper&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;주요 서비스&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Alphabet (Google)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Search, YouTube, Maps, Play, Chrome&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Apple&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;App Store, Safari, iOS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Meta&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Facebook, Instagram, WhatsApp, Messenger&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Amazon&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Marketplace, Ads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Microsoft&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Windows, LinkedIn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;ByteDance&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;TikTok&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Booking&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;(2024 추가)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이들에게 부과된 의무:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 이식성 &amp;mdash; 광고주에게 자기 데이터를 가져갈 권리 보장&lt;/li&gt;
&lt;li&gt;결합 제한 &amp;mdash; gatekeeper 서비스끼리 사용자 데이터 결합에 사용자 동의 요구&lt;/li&gt;
&lt;li&gt;자사 우대 금지 &amp;mdash; 검색 결과&amp;middot;광고 노출에 자사 제품 부당 우대 금지&lt;/li&gt;
&lt;li&gt;인터스토어 &amp;mdash; 앱 내 결제 외 결제 수단 허용 (Apple 영향)&lt;/li&gt;
&lt;li&gt;인터오퍼러빌리티 &amp;mdash; 메신저 등 호환 가능 (Meta 영향)&lt;/li&gt;
&lt;/ul&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--note&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;이 글의 전제&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;독자가 광고 운영을 일상으로 하고 walled garden&amp;middot;privacy&amp;middot;플랫폼 의존이라는 단어를 쓰는 마케터를 가정합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 광고주 영향 &amp;mdash; 데이터 측면&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1. 데이터 이식성 (Data portability)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;광고주가 Meta&amp;middot;Google에 쌓아둔 광고 데이터(노출&amp;middot;클릭&amp;middot;전환&amp;middot;오디언스)를 포터블 형식으로 추출 가능. CDP&amp;middot;BigQuery 같은 자체 시스템에 결합하기 쉬워짐.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2. Cross-service 데이터 결합 제한&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Google이 검색&amp;middot;YouTube&amp;middot;Maps의 사용자 데이터를 결합해 광고 타겟팅에 쓰던 자리가 사용자 명시 동의 필요. 동의 안 한 사용자에 대한 cross-service 타겟팅 정밀도 저하.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-3. 1st-party 데이터의 가치 상승&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;walled garden 안 매칭 정밀도가 떨어지면 광고주의 1st-party 데이터(이메일&amp;middot;전화번호 해시) 매칭이 더 중요. &lt;a href=&quot;https://blog.trysitely.com/posts/server-side-tagging-capi/&quot;&gt;Server-side tagging&amp;middot;CAPI&lt;/a&gt; 운영 가치 상승.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;영역&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;변화&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;광고주 대응&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;데이터 이식성&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;+&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1st-party 결합 강화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Cross-service 타겟팅&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;- (동의 필요)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;직접 동의 받는 페이지 운영&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1st-party 매칭&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;+&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;CRM&amp;middot;CDP 정비&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 광고주 영향 &amp;mdash; 측정 측면&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1. lift study의 표준화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DMA에 따라 gatekeeper가 광고주 자체 lift study를 더 자주 허용. Google&amp;middot;Meta의 자체 lift 도구 외 외부 툴(Nielsen&amp;middot;Comscore)과 통합도 증가.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-2. Conversion lift API 개방&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Meta의 Conversion Lift, Google의 Brand/Search lift 같은 도구가 더 표준화된 API 제공. 광고주 자체 분석 시스템과 통합 용이.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-3. Attribution 멀티터치 가능성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 walled garden의 last-click 어트리뷰션 의존이 컸음. DMA가 광고주에게 자기 데이터를 외부 MTA&amp;middot;MMM 도구로 분석할 수 있게 하면서 멀티터치 어트리뷰션이 다시 살아남.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 광고주 영향 &amp;mdash; 광고 제품 측면&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-1. 검색 광고의 자사 우대 금지&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Google Search에서 자사 제품(Shopping&amp;middot;Travel)이 부당하게 상단 노출되는 자리 제한. 광고주의 검색 키워드 가치가 재조정.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-2. App Store 결제 우회 (Apple)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iOS 앱이 외부 결제 수단으로 우회 가능해지면서 Apple 30% 수수료 회피 자리 발생. 광고주의 in-app 광고 ROI 변화.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-3. 메신저 인터오퍼러빌리티 (Meta)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WhatsApp이 다른 메신저와 호환 가능. 글로벌 CRM 캠페인 채널 확장.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;광고 제품&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;DMA 영향&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;광고주 액션&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Google Search&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;자사 우대 금지&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;키워드 가치 재평가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;YouTube Ads&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Cross-service 타겟팅 약화&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1st-party seed 강화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Meta Ads&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;API 표준화&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;외부 분석 도구 통합&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;App Store&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;외부 결제 허용&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;결제 비용 재계산&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 한국 광고주에게의 영향 &amp;mdash; 직간접&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5-1. 직접 영향 (글로벌 캠페인)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EU 사용자 대상 캠페인 운영 시 DMA 룰 적용. Cross-service 동의 게이트 추가, 데이터 결합 제한 등.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5-2. 간접 영향 (글로벌 표준 변화)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Meta&amp;middot;Google의 글로벌 정책이 EU 룰에 맞춰 통일되는 경향. 한국 시장 광고 운영도 영향.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5-3. 한국 자체 규제 (PIPA)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한국 개인정보보호법(PIPA)이 cross-service 동의&amp;middot;1st-party 데이터 가치 측면에서 비슷한 방향. DMA의 흐름이 PIPA&amp;middot;KISA 기준에도 반영되는 추세.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--warn&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;DMA 직접 적용 여부 점검&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EU 사용자(IP 기준) 한 명이라도 캠페인 대상이면 DMA 룰이 적용됩니다. 글로벌 광고 캠페인의 EU 분리 운영이 표준이 되어가고 있습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 마케터가 미리 점검할 5가지&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-1. 1st-party 데이터 정비&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버측 태깅&amp;middot;CAPI 운영이 표준 인프라가 되어가고 있습니다. &lt;a href=&quot;https://blog.trysitely.com/posts/server-side-tagging-capi/&quot;&gt;server-side-tagging-capi&lt;/a&gt;에서 다룬 매칭 키 정규화&amp;middot;EMQ 점수 관리가 더 중요해짐.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-2. 동의 관리 시스템 (CMP)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OneTrust&amp;middot;TrustArc 같은 CMP 도입. EU 사용자 cross-service 동의를 받는 표준 플로우 운영.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-3. 측정의 다층화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;walled garden 자체 측정 + 외부 lift study + MMM 결합. 한 도구의 한계를 다른 도구로 보완.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-4. 글로벌 캠페인 분리 운영&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EU&amp;middot;미국&amp;middot;아시아 캠페인을 분리해 각 지역 룰 적용. 글로벌 단일 캠페인은 DMA 위반 위험.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-5. 분기 정책 변화 점검&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DMA&amp;middot;Apple ATT&amp;middot;Google Privacy Sandbox 등 정책 변화가 빠름. 분기에 한 번씩 정리하는 자리 필요.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;점검 항목&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;분기 1회 점검&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1st-party 데이터 EMQ 점수&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;7+ 유지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;CMP 동의율&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;60%+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;외부 lift study&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;분기 1회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;글로벌 캠페인 분리&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;자동화 검토&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;정책 변화 요약&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;30분 회의&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 코드 한 묶음 &amp;mdash; 지역 분리 운영 인디케이터&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 글에 박는 유일한 코드입니다. EU 사용자 분리 추적의 간단한 패턴.&lt;/p&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# 광고 노출 로그 처리 시 EU 사용자 인디케이터
&lt;/code&gt;&lt;/pre&gt;
&lt;/article&gt;</description>
      <category>프라이버시&amp;middot;컴플라이언스</category>
      <category>DMA</category>
      <category>EU</category>
      <category>Measurement</category>
      <category>privacy</category>
      <category>walled-garden</category>
      <author>Aramir</author>
      <guid isPermaLink="true">https://code77.tistory.com/118</guid>
      <comments>https://code77.tistory.com/118#entry118comment</comments>
      <pubDate>Sat, 16 May 2026 18:16:00 +0900</pubDate>
    </item>
    <item>
      <title>Customer journey orchestration &amp;mdash; 채널을 시간 축에서 묶는 법</title>
      <link>https://code77.tistory.com/117</link>
      <description>&lt;article class=&quot;tistory-mirror-post&quot; data-source-slug=&quot;customer-journey-orchestration&quot;&gt;
&lt;p class=&quot;tistory-description&quot; data-ke-size=&quot;size16&quot;&gt;같은 사용자가 광고&amp;middot;이메일&amp;middot;푸시&amp;middot;SMS를 받는 순서가 ROAS를 좌우합니다. customer journey orchestration이 cross-channel 시퀀싱을 자동화해 마찰을 줄이는 흐름. 도구&amp;middot;룰&amp;middot;평가 정리.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 사용자에게 광고가 뜨고 5분 뒤 이메일이 오고 1시간 뒤 푸시가 오고 다음 날 SMS가 오면 그건 마케팅이 아니라 폭격입니다. 사용자가 떠나면 ROAS가 무너집니다. customer journey orchestration은 채널을 시간 축에서 묶어 사용자 한 명의 경험을 디자인합니다. 마케팅의 다음 도약 자리.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마케터가 이 글을 읽어야 하는 이유&lt;/b&gt;: 채널별 ROAS 보고는 채널 안의 효율만 보여주고, cross-channel 마찰은 안 보여줍니다. journey orchestration이 그 마찰을 줄여 같은 예산으로 ROAS&amp;middot;LTV를 끌어올립니다. 도구&amp;middot;룰&amp;middot;평가의 표준 워크플로를 알면 분기 운영의 다음 단계 로드맵이 잡힙니다.&lt;/p&gt;
&lt;figure class=&quot;tistory-figure&quot; style=&quot;margin: 28px 0; text-align: center;&quot;&gt;&lt;img style=&quot;max-width: 100%; height: auto; border-radius: 10px;&quot; src=&quot;https://blog.trysitely.com/img/customer-journey-orchestration-hero.png&quot; alt=&quot;시간 축에 사용자 한 명의 광고 노출, 이메일 오픈, 푸시 클릭, SMS 수신 시퀀스가 시각화된 다이어그램&quot; /&gt;
&lt;figcaption style=&quot;margin-top: 10px; color: #5b6474; font-size: 0.92em; line-height: 1.6;&quot;&gt;채널 단위가 아니라 사용자 한 명의 시간 축에서 마케팅을 디자인.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Cross-channel 마찰의 한 줄 직관&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;채널별로 분리된 운영의 함정.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;광고팀은 광고 노출 최대화, 이메일팀은 발송 빈도 최대화, 푸시팀은 클릭률 최대화 &amp;mdash; 각자 자기 지표를 최적화하면 사용자 한 명에게 동시에 폭격.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마케팅이 채널별 ROAS만 보고 의사결정하면 사용자 경험이 깨집니다. 사용자 단위 frequency&amp;middot;시간 간격이 운영의 새 단위가 되어야 합니다.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;채널&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;단독 KPI&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;단독 최적화&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;Cross-channel 마찰&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;광고&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;노출&amp;middot;CTR&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;빈도 늘림&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;사용자 피로&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;이메일&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;오픈률&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;발송 늘림&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;스팸 신고&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;푸시&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;클릭률&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;알림 늘림&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;앱 알림 끔&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;SMS&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;응답률&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;발송 늘림&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;unsubscribe&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cross-channel orchestration의 한 줄: &quot;사용자 한 명에게 노출되는 모든 채널의 합을 한 곳에서 통제.&quot;&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--note&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;이 글의 전제&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;독자가 광고&amp;middot;이메일&amp;middot;푸시&amp;middot;CRM을 운영하는 마케터&amp;middot;운영자를 가정합니다. CDP&amp;middot;1st-party 데이터의 기초 개념을 받아들인다고 가정합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Journey orchestration의 4가지 핵심 능력&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1. 사용자 단위 통합 ID&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;광고 노출&amp;middot;이메일 발송&amp;middot;푸시 알림이 모두 한 사용자에 매핑되어야 함. CDP&amp;middot;ID graph가 기반. &lt;a href=&quot;https://blog.trysitely.com/posts/cdp-id-graph/&quot;&gt;CDP ID 그래프&lt;/a&gt; 참고.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2. 채널 간 시간 간격 룰&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;광고 노출 후 24시간은 이메일 보내지 않음&quot; 같은 룰을 자동 적용. 채널별 운영팀이 모르는 글로벌 룰을 orchestration이 보장.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-3. 트리거 기반 시퀀스&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 행동(장바구니 담기, 페이지 방문)이 일어나면 다음 단계 채널 자동 발동. 정적 발송이 아닌 동적 흐름.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-4. A/B 테스트 시퀀스 자체&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;journey 시퀀스 한 가지가 아니라 여러 변형을 동시 테스트. &quot;광고 &amp;rarr; 이메일&quot; vs &quot;광고 &amp;rarr; 푸시&quot; 효율 비교.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;능력&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;도구&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;통합 ID&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;CDP (Segment, Tealium, Hightouch)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;시간 룰&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;journey 도구 (Braze, Iterable, Customer.io)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;트리거&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;event-based campaign&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;A/B&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;journey-level experiment&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 표준 journey 패턴 5가지&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마케팅 자리에 자주 등장하는 시퀀스 패턴.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1. Welcome series&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가입 후 7일간 단계적 메시지. 1일차 환영 &amp;rarr; 3일차 첫 액션 가이드 &amp;rarr; 7일차 첫 구매 인센티브.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-2. Cart abandonment&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장바구니 담은 뒤 1시간 푸시 &amp;rarr; 24시간 이메일 &amp;rarr; 72시간 광고 retargeting. 단계마다 메시지 톤 다르게.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-3. Post-purchase&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구매 후 즉시 확인 메일 &amp;rarr; 3일차 사용 가이드 &amp;rarr; 30일차 재구매 인센티브 &amp;rarr; 60일차 cross-sell.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-4. Win-back&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비활성 사용자(30일+ 미접속)에게 단계적 회복. 1주차 푸시 &amp;rarr; 2주차 이메일 &amp;rarr; 4주차 SMS + 인센티브.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-5. Loyalty progression&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포인트&amp;middot;등급 변화 시 축하 메시지. 등급 상승 즉시 &amp;rarr; 다음 등급 도달 진행률 안내 &amp;rarr; 등급 만료 임박 알림.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;패턴&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;트리거&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;채널 시퀀스&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;기간&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Welcome&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;가입&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;이메일 &amp;rarr; 푸시 &amp;rarr; 광고&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;7일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Cart abandon&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;장바구니&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;푸시 &amp;rarr; 이메일 &amp;rarr; 광고&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;72시간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Post-purchase&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;구매&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;이메일 &amp;rarr; 이메일 &amp;rarr; 광고&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;60일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Win-back&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;비활성 30일+&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;푸시 &amp;rarr; 이메일 &amp;rarr; SMS&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;4주&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Loyalty&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;등급 변화&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;푸시 &amp;rarr; 이메일&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;즉시&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 코드 한 묶음 &amp;mdash; journey 룰 평가 의사코드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 글에 박는 유일한 코드입니다. journey orchestration의 핵심 룰 평가 흐름.&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;from datetime import datetime, timedelta

def can_send(user_id: str, channel: str, history: list) -&amp;gt; bool:
    &quot;&quot;&quot;
    사용자에게 이 채널을 지금 보낼 수 있나?
    history: 최근 7일 [{ts, channel}]
    &quot;&quot;&quot;
    now = datetime.utcnow()

    # 룰 1: 채널별 일일 한도
    DAILY_LIMITS = {&quot;email&quot;: 2, &quot;push&quot;: 5, &quot;sms&quot;: 1, &quot;ads&quot;: 20}
    today_count = sum(1 for h in history
                      if h[&quot;channel&quot;] == channel
                      and (now - h[&quot;ts&quot;]).days == 0)
    if today_count &amp;gt;= DAILY_LIMITS.get(channel, 10):
        return False

    # 룰 2: 채널 간 최소 간격 (광고 후 1시간 내 이메일 금지)
    MIN_GAP = {&quot;ads_to_email&quot;: timedelta(hours=1),
               &quot;ads_to_push&quot;: timedelta(minutes=30),
               &quot;email_to_push&quot;: timedelta(hours=2)}
    for h in history:
        gap_key = f&quot;{h['channel']}_to_{channel}&quot;
        if gap_key in MIN_GAP and (now - h[&quot;ts&quot;]) &amp;lt; MIN_GAP[gap_key]:
            return False

    # 룰 3: 사용자 글로벌 frequency cap (모든 채널 합)
    week_count = sum(1 for h in history
                     if (now - h[&quot;ts&quot;]).days &amp;lt;= 7)
    if week_count &amp;gt;= 30:  # 주 30번 이상이면 모든 채널 차단
        return False

    return True

# 사용 예
history = [{&quot;ts&quot;: datetime.utcnow() - timedelta(minutes=15), &quot;channel&quot;: &quot;ads&quot;}]
print(can_send(&quot;u123&quot;, &quot;email&quot;, history))  # False (광고 후 1시간 내)
print(can_send(&quot;u123&quot;, &quot;push&quot;, history))   # True (광고 후 30분 + 1초)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 한 묶음이 cross-channel 폭격을 막는 글로벌 룰의 단순한 구현. 실제 운영은 Braze&amp;middot;Customer.io 같은 도구의 visual builder로 룰 관리.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 도구 비교 &amp;mdash; 마케팅 자리에 적합한 자리&lt;/h2&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;도구&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;강점&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;적합 자리&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Braze&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;모바일 푸시 강함, journey UI&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;앱 중심 비즈니스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Iterable&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;이메일&amp;middot;SMS 통합, 가성비&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;이커머스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Customer.io&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;트리거&amp;middot;이벤트 기반 강함&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;SaaS, 구독&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Salesforce Marketing Cloud&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;enterprise 표준&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;대형 B2B/B2C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Klaviyo&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;이커머스 전용, Shopify 연동&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;DTC 브랜드&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도구 선택보다 운영 룰 설계가 더 중요. 어느 도구를 써도 룰이 없으면 폭격이 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. Journey orchestration의 ROI 측정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;orchestration 도입의 효과를 측정하려면 journey-level lift study가 필요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-1. holdout group&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 일부를 holdout으로 두고 journey 적용 안 함. 두 그룹의 LTV&amp;middot;재구매율 비교.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-2. journey 시퀀스 A/B&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 트리거에 대해 두 가지 시퀀스 변형. 어느 시퀀스가 효율 좋은지 분기마다 검증.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-3. 지표&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 단위 conversion rate&lt;/li&gt;
&lt;li&gt;사용자 단위 unsubscribe&amp;middot;앱 알림 끔 비율&lt;/li&gt;
&lt;li&gt;사용자 단위 LTV&lt;/li&gt;
&lt;li&gt;channel별 marginal ROI (한 채널 추가했을 때의 lift)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;지표&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;journey 도입 전&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;도입 후&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;변화&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;사용자 unsubscribe 비율&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;8%&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;3%&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;-5%p&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;앱 알림 끔 비율&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;12%&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;5%&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;-7%p&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;90일 재구매율&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;22%&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;28%&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;+6%p&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;LTV&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$180&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$215&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;+19%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 표가 journey orchestration의 운영 가치를 정량적으로 보여주는 표준 양식.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--warn&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;journey orchestration의 가장 큰 함정&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;journey 룰을 너무 복잡하게 만들면 운영팀이 모르고 새 캠페인을 만들어 룰 충돌. 룰은 단순하게(글로벌 frequency cap, 채널 간 최소 간격) 시작하고 점진적 확장.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 운영 시작의 첫 30일 로드맵&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;orchestration 도입의 표준 첫 분기.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7-1. 1주차 &amp;mdash; 통합 ID 정비&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CDP에 광고&amp;middot;이메일&amp;middot;푸시&amp;middot;구매 이벤트가 같은 사용자 ID로 들어오는지 점검. ID graph 정비.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7-2. 2-3주차 &amp;mdash; 글로벌 frequency cap&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 단순하고 강력한 첫 룰. 사용자별 7일 합계 노출 30+ 차단. 채널별 일일 한도 설정.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7-3. 4-6주차 &amp;mdash; 채널 간 최소 간격&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;광고 &amp;rarr; 이메일 1시간, 이메일 &amp;rarr; 푸시 2시간 등의 룰 자동 적용.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7-4. 7-12주차 &amp;mdash; 첫 journey 패턴 운영&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cart abandonment 또는 welcome series 한 가지부터 운영. holdout group 두고 효과 측정.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;주차&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;작업&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;통합 ID 정비&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;2-3&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;글로벌 frequency cap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;4-6&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;채널 간 최소 간격&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;7-12&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;첫 journey 패턴 (cart abandon)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;분기 후&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;journey 확대 + A/B 테스트&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 마치며 &amp;mdash; 마케팅의 다음 도약&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;채널별 ROAS 보고가 마케팅 운영의 표준이지만, 사용자 단위 경험 디자인이 다음 도약 자리입니다. journey orchestration이 cross-channel 마찰을 줄이고 사용자 LTV를 올려, 같은 예산으로 더 많은 결과를 만듭니다. 도구 도입보다 룰 설계가 중요하고, 단순한 룰부터 시작해 점진적 확장하는 게 표준 로드맵.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 분기에 한 번만 시도해 볼 만한 것은 사용자 단위 글로벌 frequency cap 한 가지를 도입해 unsubscribe&amp;middot;앱 알림 끔 비율 변화를 측정하는 흐름입니다. 한 가지 룰만으로 사용자 경험이 눈에 띄게 개선됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;다음에 읽을 글&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.trysitely.com/posts/cdp-id-graph/&quot;&gt;CDP ID 그래프&lt;/a&gt; &amp;mdash; 통합 ID의 인프라&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.trysitely.com/posts/frequency-capping-design/&quot;&gt;Frequency capping&lt;/a&gt; &amp;mdash; 채널별 frequency cap의 깊이&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.trysitely.com/posts/marketing-analytics-maturity/&quot;&gt;Marketing analytics maturity&lt;/a&gt; &amp;mdash; 측정 성숙도와의 결합&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Braze, &quot;Customer engagement platform&quot;: &lt;a href=&quot;https://www.braze.com/&quot;&gt;https://www.braze.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Iterable, &quot;Cross-channel marketing&quot;: &lt;a href=&quot;https://iterable.com/&quot;&gt;https://iterable.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Customer.io, &quot;Behavioral messaging&quot;: &lt;a href=&quot;https://customer.io/&quot;&gt;https://customer.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&quot;Customer journey orchestration&quot; (Forrester): &lt;a href=&quot;https://www.forrester.com/&quot;&gt;https://www.forrester.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&quot;Lifecycle marketing playbook&quot; (Reforge): &lt;a href=&quot;https://www.reforge.com/&quot;&gt;https://www.reforge.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/article&gt;</description>
      <category>CRM&amp;middot;라이프사이클</category>
      <category>CDP</category>
      <category>CRM</category>
      <category>cross-channel</category>
      <category>journey</category>
      <category>orchestration</category>
      <author>Aramir</author>
      <guid isPermaLink="true">https://code77.tistory.com/117</guid>
      <comments>https://code77.tistory.com/117#entry117comment</comments>
      <pubDate>Sat, 16 May 2026 18:15:11 +0900</pubDate>
    </item>
    <item>
      <title>Context engineering &amp;mdash; 200k 토큰 컨텍스트의 설계 원칙 5가지</title>
      <link>https://code77.tistory.com/116</link>
      <description>&lt;article class=&quot;tistory-mirror-post&quot; data-source-slug=&quot;context-engineering-long-context&quot;&gt;
&lt;p class=&quot;tistory-description&quot; data-ke-size=&quot;size16&quot;&gt;컨텍스트 창이 200k 토큰까지 커졌지만 단순히 다 넣으면 lost-in-the-middle&amp;middot;비용 폭발&amp;middot;정확도 하락이 옵니다. 마케팅 자동화에 적용하는 5가지 컨텍스트 설계 원칙.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Sonnet은 200k 토큰, GPT-5는 1M 토큰까지 컨텍스트를 받습니다. 보고서 한 권을 통째로 넣고 질문할 수 있다는 뜻입니다. 그런데 실제 운영해보면 함정이 보입니다 &amp;mdash; 중간 부분의 정보를 모델이 자주 놓치고, 비용은 길이 제곱으로 늘고, 정작 답변 정확도가 컨텍스트 짧을 때보다 떨어집니다. 긴 컨텍스트를 잘 쓰는 건 따로 설계 원칙이 필요합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마케터가 이 글을 읽어야 하는 이유&lt;/b&gt;: RAG 챗봇&amp;middot;보고서 자동화&amp;middot;캠페인 분석 등 LLM 자동화의 거의 모든 자리에서 컨텍스트가 길어지는 압력이 있습니다. 단순히 &quot;다 넣자&quot;가 아니라 어떤 정보를 어디에 배치할지의 설계 한 줄이 답변 품질&amp;middot;비용 둘 다 결정합니다.&lt;/p&gt;
&lt;figure class=&quot;tistory-figure&quot; style=&quot;margin: 28px 0; text-align: center;&quot;&gt;&lt;img style=&quot;max-width: 100%; height: auto; border-radius: 10px;&quot; src=&quot;https://blog.trysitely.com/img/context-engineering-long-context-hero.png&quot; alt=&quot;200k 토큰 컨텍스트 안에서 처음&amp;middot;끝의 정보가 강하게 attention 받고 중간이 흐려지는 lost-in-the-middle 현상 다이어그램&quot; /&gt;
&lt;figcaption style=&quot;margin-top: 10px; color: #5b6474; font-size: 0.92em; line-height: 1.6;&quot;&gt;긴 컨텍스트는 새 차원의 문제를 만든다. 처음&amp;middot;끝&amp;middot;중간의 attention 분포가 다르다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Lost-in-the-middle &amp;mdash; 가장 큰 함정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;긴 컨텍스트를 처음 써보면 가장 빨리 마주치는 현상입니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델이 컨텍스트 처음&amp;middot;끝의 정보를 잘 보고, 중간 정보는 약하게 본다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.trysitely.com/posts/transformer-intuition/&quot;&gt;트랜스포머 직관&lt;/a&gt;에서 다룬 것처럼 attention이 모든 토큰을 같은 강도로 보지 않습니다. 학습 데이터에서 처음&amp;middot;끝 토큰이 정답에 자주 등장한 패턴이 모델에 박혀 있어, 100k 토큰의 중간에 핵심 정보를 두면 잘 못 찾습니다.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;정보 위치&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;회수 정확도 (평균)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;처음 10%&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;90%+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;처음 30%&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;70-80%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;중간 50%&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;50-60%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;끝 30%&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;70-80%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;끝 10%&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;85%+&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NIAH (Needle In A Haystack) 벤치마크에서 일관되게 관찰되는 패턴. 모델&amp;middot;버전마다 차이가 있지만 큰 흐름은 비슷.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--note&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;이 글의 전제&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;독자가 LLM&amp;middot;RAG&amp;middot;프롬프트라는 단어를 일상으로 쓰고, 트랜스포머의 attention 직관 정도는 받아들인다고 가정합니다. 코드를 직접 짠 적 없어도 됩니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 원칙 1 &amp;mdash; 핵심 정보는 처음과 끝에&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 단순하고 강력한 원칙. 사용자 질문&amp;middot;핵심 지시는 시스템 프롬프트의 시작 또는 사용자 메시지의 끝에 배치합니다.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;좋은 구조&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;나쁜 구조&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;[시스템 핵심 지시] [컨텍스트 문서들] [사용자 질문]&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;[컨텍스트 문서들] [시스템 지시 중간] [사용자 질문]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배경 컨텍스트(few-shot 예시&amp;middot;참고 문서)는 중간으로. 핵심 정보가 처음과 끝에 자리잡으면 lost-in-the-middle 영향을 줄입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 원칙 2 &amp;mdash; 컨텍스트 다이어트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;200k가 가능하다고 200k를 다 쓸 이유는 없습니다. 컨텍스트 길이는 비용&amp;middot;latency&amp;middot;정확도 셋 다에 영향을 줍니다.&lt;/p&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6833em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;Cost&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;&amp;prop;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.8778em; vertical-align: -0.1944em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.1389em;&quot; class=&quot;mord mathnormal&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3175em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.1389em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;in&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;margin-right: 1em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.1667em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;Latency&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;&amp;prop;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.8778em; vertical-align: -0.1944em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.1389em;&quot; class=&quot;mord mathnormal&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3175em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.1389em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;in&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;margin-right: 1em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.1667em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;Attention&amp;nbsp;compute&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;&amp;prop;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1.1111em; vertical-align: -0.247em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.1389em;&quot; class=&quot;mord mathnormal&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.8641em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.453em; margin-left: -0.1389em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;in&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3.113em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.247em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비용: 입력 토큰 단가 &amp;times; 토큰 수 (선형)&lt;/li&gt;
&lt;li&gt;Latency: 토큰 수에 거의 비례 (선형)&lt;/li&gt;
&lt;li&gt;Attention 연산: 토큰 수 제곱 (KV cache 적용해도 인상)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8k &amp;rarr; 4k 절반으로 줄이면 비용 절반, latency 절반, attention 연산 1/4. 동시에 lost-in-the-middle 감소. 모든 차원에서 이득.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--tip&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;다이어트 첫 시도&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 컨텍스트의 절반을 제거해도 답변 품질이 큰 차이가 없는 자리가 80% 이상입니다. 골든셋 50개로 절반 다이어트 ON/OFF 비교를 한 번 돌려보면 자리에 따라 어떻게 다른지 명확해집니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 원칙 3 &amp;mdash; RAG로 동적 선택&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코퍼스가 크면 벡터 검색으로 관련 문서를 동적 선택해 컨텍스트에 넣는 RAG가 표준 패턴입니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;사용자 질문
    │
    ▼
벡터 검색 &amp;rarr; Top 5 문서 선택
    │
    ▼
선택된 5개만 컨텍스트로 LLM에 전달
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 코퍼스를 통째로 넣지 않고 관련 5개만 동적 선택. 컨텍스트 다이어트가 자동으로 일어남. RAG 품질 개선은 &lt;a href=&quot;https://blog.trysitely.com/posts/rag-evaluation/&quot;&gt;RAG 평가&lt;/a&gt;와 &lt;a href=&quot;https://blog.trysitely.com/posts/rag-reranking-cross-encoder/&quot;&gt;RAG 재순위&lt;/a&gt;에서 다룹니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 원칙 4 &amp;mdash; 구조화된 형식 활용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;긴 컨텍스트라도 구조화된 형식이면 모델이 정보를 더 잘 회수합니다.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;형식&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;효과&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;자유 산문&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;가장 약함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Markdown 헤딩&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;중간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;YAML/JSON 구조&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;강함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;XML 태그&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;가장 강함 (Anthropic 권장)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XML 태그로 컨텍스트의 각 영역을 명시적으로 구분하면 모델이 &quot;이 부분은 회사 정책, 저 부분은 사용자 데이터&quot;를 분명히 인식합니다. Claude는 XML 형식에 특히 강하게 학습되어 있어 컨텍스트 회수 정확도가 한 단계 올라갑니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 원칙 5 &amp;mdash; 위치별 역할 분담&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;긴 컨텍스트의 위치별 역할을 명확히 잡으면 효율이 올라갑니다.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;위치&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;역할&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;시스템 프롬프트 시작&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;핵심 지시&amp;middot;역할&amp;middot;톤&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;시스템 프롬프트 중간&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;제약&amp;middot;스타일 가이드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;시스템 프롬프트 끝&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;출력 형식 명시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;사용자 메시지 시작&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;컨텍스트 문서&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;사용자 메시지 중간&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Few-shot 예시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;사용자 메시지 끝&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;핵심 질문&amp;middot;요청&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조를 표준 템플릿으로 박아두면 새 자동화에 적용할 때 헷갈리지 않습니다. 각 자리의 역할이 분명하니 lost-in-the-middle도 줄어듭니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 코드 한 묶음 &amp;mdash; 컨텍스트 구조 템플릿&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 글에 박는 유일한 코드입니다. Anthropic XML 태그 활용 패턴.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/article&gt;</description>
      <category>AI&amp;middot;LLM</category>
      <category>conTeXt</category>
      <category>LLM</category>
      <category>long-context</category>
      <category>prompt-engineering</category>
      <category>Rag</category>
      <author>Aramir</author>
      <guid isPermaLink="true">https://code77.tistory.com/116</guid>
      <comments>https://code77.tistory.com/116#entry116comment</comments>
      <pubDate>Sat, 16 May 2026 18:14:19 +0900</pubDate>
    </item>
    <item>
      <title>Brand lift study 설계 &amp;mdash; 광고가 인지&amp;middot;호감도를 끌어올렸나</title>
      <link>https://code77.tistory.com/115</link>
      <description>&lt;article class=&quot;tistory-mirror-post&quot; data-source-slug=&quot;brand-lift-study&quot;&gt;
&lt;p class=&quot;tistory-description&quot; data-ke-size=&quot;size16&quot;&gt;브랜드 광고는 ROAS로 잡히지 않고 인지&amp;middot;호감도&amp;middot;구매의향으로만 측정됩니다. 노출 그룹과 비노출 그룹을 비교하는 brand lift study의 설계, 표본 계산, 실무 함정을 마케터 시선에서 정리.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;이 브랜드 캠페인 효과 있었어?&quot;라는 질문은 ROAS로 답하기 어렵습니다. 브랜드 광고의 진짜 결과는 며칠 또는 몇 주 뒤에 인지&amp;middot;호감도&amp;middot;구매의향으로 나타나기 때문입니다. brand lift study는 그 변화를 노출 그룹과 비노출 그룹의 설문 응답 차이로 측정합니다. Meta&amp;middot;Google&amp;middot;YouTube가 자체 도구로 제공하지만, 설계 한 줄을 잘못 잡으면 결과 해석이 통째로 깨집니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마케터가 이 글을 읽어야 하는 이유&lt;/b&gt;: 브랜드 캠페인 예산 의사결정에서 &quot;효과 있었다 vs 없었다&quot;의 답을 데이터로 정리하지 않으면, 다음 분기 브랜드 예산이 늘 위협받습니다. brand lift study가 그 답을 정직하게 만드는 표준 도구이고, 마케터가 직접 점검할 5가지 디자인 결정이 있습니다. 그 결정 한 줄이 결과의 신뢰도 절반을 만듭니다.&lt;/p&gt;
&lt;figure class=&quot;tistory-figure&quot; style=&quot;margin: 28px 0; text-align: center;&quot;&gt;&lt;img style=&quot;max-width: 100%; height: auto; border-radius: 10px;&quot; src=&quot;https://blog.trysitely.com/img/brand-lift-study-hero.png&quot; alt=&quot;노출 그룹과 비노출 그룹에 같은 설문 4개 문항을 던져 응답 차이로 lift를 측정하는 다이어그램&quot; /&gt;
&lt;figcaption style=&quot;margin-top: 10px; color: #5b6474; font-size: 0.92em; line-height: 1.6;&quot;&gt;ROAS가 못 잡는 자리를 잡는 표준 &amp;mdash; 노출과 비노출의 설문 응답 차이가 곧 brand lift.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Brand lift의 한 줄 직관&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;광고에 노출된 사람들과 노출되지 않은 사람들이 같은 설문에 어떻게 답하는가의 차이.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 사용자 풀에서 무작위로 두 그룹 추출 &amp;rarr; 한 그룹은 광고 노출, 다른 그룹은 비노출(holdout) &amp;rarr; 며칠 뒤 두 그룹 모두에게 같은 설문 &amp;rarr; 응답 차이가 brand lift.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전형적 4개 KPI 문항:&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;KPI&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;질문&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;인지 (Awareness)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&quot;다음 브랜드 중 들어본 적 있는 것은?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;회상 (Ad recall)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&quot;최근 1주일 안에 X 브랜드 광고를 본 적 있나요?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;호감도 (Favorability)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&quot;X 브랜드에 대한 호감도는?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;구매의향 (Purchase intent)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&quot;다음 구매 시 X 브랜드를 고려하시겠습니까?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노출 그룹 응답률이 비노출 그룹보다 +5%p 높다면, 그 5%p가 brand lift. 이게 광고 노출이 일으킨 인과 효과의 추정치입니다.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--note&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;이 글의 전제&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;독자가 브랜드 캠페인을 운영해본 적 있고 ROAS&amp;middot;인지도 같은 단어를 일상으로 쓴다고 가정합니다. A/B 테스트의 무작위 배정 직관도 받아들인다고 가정합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. ROAS가 못 잡는 자리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브랜드 캠페인의 결과는 ROAS 보고서에서 거의 안 잡힙니다. 이유는 세 가지.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1. 시간 격차&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브랜드 광고를 본 사용자가 며칠~몇 주 뒤에 검색&amp;middot;구매로 이어지는데, 그 사이에 다른 채널&amp;middot;이벤트가 끼어듭니다. 마지막 클릭 어트리뷰션에서는 검색 광고에 100% 공이 가고 브랜드 광고는 0.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2. 측정 한도&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ROAS는 클릭과 직접 전환만 잡습니다. 인지도&amp;middot;호감도 변화는 ROAS에 안 들어옵니다. 측정 도구의 한계.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-3. 자가 선택 편향&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관심 있는 사람이 광고를 더 보고 더 구매합니다. 광고가 일으킨 효과가 아니라 원래 관심 있던 사람의 행동.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 세 가지를 동시에 해결하는 설계가 brand lift study의 무작위 배정 + holdout. 인과 효과 추정의 표준 구조입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 무작위 배정과 holdout&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;brand lift의 핵심은 무작위 배정입니다. 같은 사용자 풀에서 광고 노출 자격을 무작위로 결정. 노출 그룹과 holdout 그룹이 통계적으로 동일한 분포를 갖도록.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Meta&amp;middot;Google&amp;middot;YouTube의 brand lift 도구는 광고 자격을 가진 사용자 중 일정 비율(보통 10-20%)을 holdout으로 떼어두고, 그 그룹에는 광고를 노출하지 않습니다. 캠페인 종료 후 양 그룹에 같은 설문이 노출됩니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;노출 그룹 (Exposed)&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;Holdout&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;배정&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;무작위 80-90%&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;무작위 10-20%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;광고 노출&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;가능&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;차단&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;설문 노출&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;캠페인 후&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;캠페인 후&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;응답 비교&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;brand lift 측정&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;기준선&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조 안에서만 &quot;광고가 일으킨 효과&quot;가 정직하게 추정됩니다. holdout 없이 노출 그룹의 사전&amp;middot;사후만 비교하는 건 자연 변화&amp;middot;계절성을 잡지 못해 결과가 부풀려집니다.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--warn&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;holdout 비율의 트레이드오프&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;holdout 10%면 그 사용자에 광고비가 안 쓰여 효율이 좋고, 검출력은 약합니다. 20%면 검출력은 좋지만 그만큼 광고 노출 기회가 줄어 캠페인 도달이 줄어듭니다. 작은 캠페인은 20%, 대형 캠페인은 10%가 일반적.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 표본 크기 &amp;mdash; 검출 가능 lift는 얼마?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;brand lift는 표본이 충분해야 검출 가능합니다. 작은 캠페인에서는 lift가 있어도 검출 못 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표준 lift 검출 표본 크기 공식 (이항 비율 차이):&lt;/p&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.4831em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;n&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;&amp;asymp;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 2.1771em; vertical-align: -0.686em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 1.4911em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.314em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.0379em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;delta;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.7401em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.989em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3.23em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;border-bottom-width: 0.04em;&quot; class=&quot;frac-line&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3.677em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.044em;&quot; class=&quot;mord mathnormal&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.1514em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.044em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span style=&quot;margin-right: 0.0037em;&quot; class=&quot;mord mathnormal mtight&quot;&gt;&amp;alpha;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.044em;&quot; class=&quot;mord mathnormal&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3361em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.044em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span style=&quot;margin-right: 0.0528em;&quot; class=&quot;mord mathnormal mtight&quot;&gt;&amp;beta;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.2861em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.8141em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -3.063em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&amp;sdot;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;mord accent&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.5678em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -3em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;left: -0.1667em;&quot; class=&quot;accent-body&quot;&gt;&lt;span class=&quot;mord&quot;&gt;ˉ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.1944em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&amp;minus;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord accent&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.5678em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -3em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;left: -0.1667em;&quot; class=&quot;accent-body&quot;&gt;&lt;span class=&quot;mord&quot;&gt;ˉ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.1944em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.686em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.7622em; vertical-align: -0.1944em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord accent&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.5678em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -3em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;left: -0.1667em;&quot; class=&quot;accent-body&quot;&gt;&lt;span class=&quot;mord&quot;&gt;ˉ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.1944em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;는 평균 응답률, &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6944em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0379em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;delta;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;는 검출하고 싶은 lift, &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.5806em; vertical-align: -0.15em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.044em;&quot; class=&quot;mord mathnormal&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.1514em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.044em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span style=&quot;margin-right: 0.0037em;&quot; class=&quot;mord mathnormal mtight&quot;&gt;&amp;alpha;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6444em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;1.96&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.7167em; vertical-align: -0.2861em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.044em;&quot; class=&quot;mord mathnormal&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3361em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.044em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span style=&quot;margin-right: 0.0528em;&quot; class=&quot;mord mathnormal mtight&quot;&gt;&amp;beta;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.2861em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6444em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;0.84&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; (검출력 80%, 양측 5%).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시: 인지 baseline 30%, 5%p lift 검출 (검출력 80%, 양측 5%).&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.7622em; vertical-align: -0.1944em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord accent&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.5678em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -3em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;left: -0.1667em;&quot; class=&quot;accent-body&quot;&gt;&lt;span class=&quot;mord&quot;&gt;ˉ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.1944em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6444em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;0.325&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6944em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0379em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;delta;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6444em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;0.05&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.4831em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;n&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;&amp;asymp;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1.4539em; vertical-align: -0.345em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 1.1089em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.655em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;0.0&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.7463em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.786em; margin-right: 0.0714em;&quot;&gt;&lt;span style=&quot;height: 2.5em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size3 size1 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3.23em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;border-bottom-width: 0.04em;&quot; class=&quot;frac-line&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3.485em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;1.96&lt;/span&gt;&lt;span class=&quot;mbin mtight&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;0.84&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.8913em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.931em; margin-right: 0.0714em;&quot;&gt;&lt;span style=&quot;height: 2.5em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size3 size1 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mbin mtight&quot;&gt;&amp;sdot;&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;mbin mtight&quot;&gt;&amp;sdot;&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;0.325&lt;/span&gt;&lt;span class=&quot;mbin mtight&quot;&gt;&amp;sdot;&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;0.675&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.345em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;&amp;asymp;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6444em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;1376&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 그룹 1376명, 총 약 2750명 응답 필요. 응답률 5% 가정 시 노출 약 5만 명, holdout 1.4만 명 = 캠페인 노출 6.4만 명+.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;baseline&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;검출 lift&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;그룹당 표본&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;30%&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;5%p&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;약 1300&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;30%&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;3%p&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;약 3700&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;30%&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1%p&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;약 33,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;50%&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;5%p&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;약 1500&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작은 lift를 검출하려면 표본이 폭증합니다. 1%p lift를 잡으려면 그룹당 3.3만 명.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 코드 한 묶음 &amp;mdash; lift 검출 표본 계산&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 글에 박는 유일한 코드입니다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/article&gt;</description>
      <category>퍼포먼스 마케팅</category>
      <category>awareness</category>
      <category>brand-lift</category>
      <category>incrementality</category>
      <category>Measurement</category>
      <category>Survey</category>
      <author>Aramir</author>
      <guid isPermaLink="true">https://code77.tistory.com/115</guid>
      <comments>https://code77.tistory.com/115#entry115comment</comments>
      <pubDate>Sat, 16 May 2026 18:13:29 +0900</pubDate>
    </item>
    <item>
      <title>Bayesian A/B 테스트 심화 &amp;mdash; prior 잡는 법과 HDI 해석</title>
      <link>https://code77.tistory.com/114</link>
      <description>&lt;article class=&quot;tistory-mirror-post&quot; data-source-slug=&quot;bayesian-ab-prior-hdi&quot;&gt;
&lt;p class=&quot;tistory-description&quot; data-ke-size=&quot;size16&quot;&gt;베이지안 A/B는 &quot;p-value &amp;lt; 0.05&quot;가 아니라 &quot;B가 A보다 좋을 확률 0.92&quot;를 줍니다. 그 확률이 정직하려면 prior를 잘 잡아야 하고, HDI를 잘못 읽으면 함정이 옵니다. 마케터 시선에서 prior&amp;middot;posterior&amp;middot;HDI 정리.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;B안이 A보다 좋을 확률 92%&quot;라는 한 줄이 회의를 한 번에 정리합니다. 베이지안 A/B의 매력입니다. 그런데 그 92%라는 숫자가 정직하려면 prior를 어떻게 잡았는지, HDI를 어떻게 해석했는지가 함께 따라와야 합니다. 이 글은 마케터 시선에서 베이지안 A/B의 prior 설계, posterior 해석, HDI의 함정을 정리합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마케터가 이 글을 읽어야 하는 이유&lt;/b&gt;: 빈도주의 A/B의 &quot;p-value &amp;lt; 0.05&quot;는 실무에서 늘 어색합니다. &quot;그래서 B가 더 좋다는 거야 아니야?&quot; 베이지안은 그 질문에 직접 답합니다. 다만 prior를 무심코 잡으면 답이 흔들리고, HDI를 단순 신뢰구간처럼 읽으면 의미가 깨집니다. 두 가지만 잘 잡으면 회의에서 의사결정 속도가 한 단계 올라갑니다.&lt;/p&gt;
&lt;figure class=&quot;tistory-figure&quot; style=&quot;margin: 28px 0; text-align: center;&quot;&gt;&lt;img style=&quot;max-width: 100%; height: auto; border-radius: 10px;&quot; src=&quot;https://blog.trysitely.com/img/bayesian-ab-prior-hdi-hero.png&quot; alt=&quot;prior 분포가 데이터를 만나 posterior 분포로 갱신되고, posterior 위에 HDI 95% 구간이 표시된 다이어그램&quot; /&gt;
&lt;figcaption style=&quot;margin-top: 10px; color: #5b6474; font-size: 0.92em; line-height: 1.6;&quot;&gt;prior가 출발점, 데이터가 갱신, posterior가 결론. HDI는 그 결론을 한 줄로 요약하는 구간.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 빈도주의 A/B와 베이지안 A/B의 한 줄 차이&lt;/h2&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;빈도주의&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;베이지안&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;답하는 질문&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&quot;이 차이가 우연일 확률은?&quot;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&quot;B가 A보다 좋을 확률은?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;출력&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;p-value, 신뢰구간&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;posterior 분포, HDI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;해석&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&quot;기각/채택&quot; 이분법&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&quot;어느 정도 더 좋은가&quot; 연속적&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;표본 부족 자리&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;검출력 부족&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;prior가 정보 보강&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;회의 친화도&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;낮음 (해석 어려움)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;높음 (확률로 직접 답)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;베이지안의 직관: 사전 믿음(prior)을 데이터로 갱신해 사후 믿음(posterior)을 만든다. posterior가 의사결정의 입력이 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Prior 잡는 법 &amp;mdash; 세 가지 표준 패턴&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;prior는 &quot;데이터를 보기 전에 우리가 알고 있던 것&quot;입니다. 마케팅 자리에 자주 등장하는 세 패턴을 보겠습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1. 무정보 prior &amp;mdash; 정보 없을 때&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;Beta(1, 1)&lt;/code&gt; (= 균등분포)는 &quot;0과 1 사이 어디든 가능성 동일&quot;을 의미합니다. 정보가 전혀 없을 때 안전한 출발점.&lt;/p&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6944em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0278em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;theta;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;&amp;sim;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;Beta&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;margin-right: 0.1667em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점: 사전 편향 없음. 단점: 표본 작을 때 posterior가 흔들리기 쉬움.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2. 약한 정보 prior &amp;mdash; 일반 상식 반영&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;Beta(2, 8)&lt;/code&gt;은 &quot;전환율이 낮은 자리(평균 약 20%)에 약한 사전 정보&quot;. 마케터가 &quot;이 캠페인은 전환율이 보통 15-25% 사이&quot;라는 상식이 있을 때 그 상식을 prior에 반영.&lt;/p&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6944em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0278em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;theta;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;&amp;sim;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;Beta&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;margin-right: 0.1667em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 prior는 데이터가 적을 때도 합리적인 posterior를 만들고, 데이터가 많아지면 prior 영향이 사라져 데이터가 답을 결정합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-3. 강한 정보 prior &amp;mdash; 과거 데이터 활용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 캠페인의 작년 분기 데이터가 있으면, 그 데이터를 prior로 사용. 작년 분기에 1000명 중 250명 전환이라면 &lt;code&gt;Beta(250, 750)&lt;/code&gt;을 prior로 잡습니다. 이게 베이지안 A/B의 가장 강력한 자리 &amp;mdash; 과거 데이터가 사전 정보로 그대로 들어옵니다.&lt;/p&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6944em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0278em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;theta;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;&amp;sim;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;Beta&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;250&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;margin-right: 0.1667em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;750&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 분기 작은 표본만으로도 posterior가 안정적으로 추정됩니다.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;Prior 종류&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.8889em; vertical-align: -0.1944em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0037em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;alpha;&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;margin-right: 0.1667em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0528em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;beta;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;표현&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;무정보&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1, 1&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&quot;아는 게 없음&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;약한 정보&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;2, 8&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&quot;전환율 약 20% 가정&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;강한 정보&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;250, 750&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&quot;작년 데이터로 신뢰&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--warn&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;강한 prior가 데이터를 누르는 자리&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강한 prior는 과거 데이터를 그대로 신뢰합니다. 작년과 올해의 시장&amp;middot;계절&amp;middot;캠페인 톤이 비슷할 때만 정직합니다. 큰 변동(브랜드 리포지셔닝, 시장 충격)이 있었으면 prior를 약하게 풀거나 무정보 prior로 갱신.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Posterior &amp;mdash; 데이터로 갱신된 사후 분포&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;prior에 데이터가 들어가 posterior가 됩니다. Beta-Binomial 결합의 표준 결과:&lt;/p&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6833em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;Posterior&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;Beta&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0037em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;alpha;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.8889em; vertical-align: -0.1944em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;margin-right: 0.1667em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0528em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;beta;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.1076em;&quot; class=&quot;mord mathnormal&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.4306em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;는 성공 수(전환), &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.8889em; vertical-align: -0.1944em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.1076em;&quot; class=&quot;mord mathnormal&quot;&gt;f&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;는 실패 수(비전환). 1000명 노출 250명 전환이라면 &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.4306em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.8889em; vertical-align: -0.1944em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;250&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;margin-right: 0.1667em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.1076em;&quot; class=&quot;mord mathnormal&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6444em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;750&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;. prior가 &lt;code&gt;Beta(2, 8)&lt;/code&gt;이라면 posterior는 &lt;code&gt;Beta(252, 758)&lt;/code&gt;. 마케터 직관: 사전에 가정한 알파&amp;middot;베타에 실제 관측치를 더한다. 데이터가 많을수록 prior 영향은 사라지고 posterior가 데이터에 수렴.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A/B 두 변형 모두에 같은 절차를 적용해 두 posterior &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.8444em; vertical-align: -0.15em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.0278em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;theta;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3283em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.0278em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;&amp;sim;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;Beta&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.0037em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;alpha;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3283em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.0037em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;margin-right: 0.1667em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.0528em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;beta;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3283em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.0528em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.8444em; vertical-align: -0.15em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.0278em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;theta;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3283em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.0278em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span style=&quot;margin-right: 0.0502em;&quot; class=&quot;mord mathnormal mtight&quot;&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;&amp;sim;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;Beta&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.0037em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;alpha;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3283em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.0037em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span style=&quot;margin-right: 0.0502em;&quot; class=&quot;mord mathnormal mtight&quot;&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;margin-right: 0.1667em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.0528em;&quot; class=&quot;mord mathnormal&quot;&gt;&amp;beta;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3283em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.0528em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span style=&quot;margin-right: 0.0502em;&quot; class=&quot;mord mathnormal mtight&quot;&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;를 얻습니다. 비교는 두 분포의 비교입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. &quot;B가 A보다 좋을 확률&quot; 계산&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 posterior에서 직접 샘플링해 비교합니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;P(B &amp;gt; A) = posterior 샘플 중 B 샘플이 A 샘플보다 큰 비율&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10000개 샘플을 두 분포에서 각각 뽑아 짝지어 비교한 비율이 그 확률. 92%면 &quot;B가 A보다 좋을 확률 92%&quot;라고 회의에서 한 줄로 답할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 빈도주의 p-value가 못 답하는 자리입니다. p-value는 &quot;차이가 우연일 확률&quot;이지 &quot;B가 A보다 좋을 확률&quot;이 아닙니다. 둘은 다른 질문입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 코드 한 묶음 &amp;mdash; Beta-Binomial Bayesian A/B&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 글에 박는 유일한 코드입니다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/article&gt;</description>
      <category>통계&amp;middot;ML</category>
      <category>ab-testing</category>
      <category>Bayesian</category>
      <category>experimentation</category>
      <category>hdi</category>
      <category>prior</category>
      <author>Aramir</author>
      <guid isPermaLink="true">https://code77.tistory.com/114</guid>
      <comments>https://code77.tistory.com/114#entry114comment</comments>
      <pubDate>Sat, 16 May 2026 18:12:43 +0900</pubDate>
    </item>
    <item>
      <title>CAC Payback period &amp;mdash; 광고비를 몇 개월 만에 회수하는가</title>
      <link>https://code77.tistory.com/113</link>
      <description>&lt;article class=&quot;tistory-mirror-post&quot; data-source-slug=&quot;roas-payback-period&quot;&gt;
&lt;p class=&quot;tistory-description&quot; data-ke-size=&quot;size16&quot;&gt;CAC 한 번 쓰고 끝이 아닙니다. 그 광고비를 매출로 회수하는 데 몇 개월 걸리는지가 현금흐름&amp;middot;재투자 속도를 결정합니다. payback period 계산&amp;middot;운영 룰&amp;middot;SaaS vs 이커머스 차이.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;광고비 &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6833em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;mord hangul_fallback&quot;&gt;써서새고객한명데려왔다고끝이아닙니다&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mord hangul_fallback&quot;&gt;그&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;50을 매출로 회수하는 데 한 달 걸리는 채널과 1년 걸리는 채널은 현금흐름이 완전히 다릅니다. payback period는 LTV/CAC 비율이 못 잡는 시간 차원을 보여주는 핵심 지표이고, 마케팅 성장의 속도 한도를 결정합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마케터가 이 글을 읽어야 하는 이유&lt;/b&gt;: LTV/CAC 5.0이라도 회수가 18개월 걸리면 그 캠페인을 매월 늘릴수록 현금이 마이너스로 갑니다. 회수 6개월 캠페인은 같은 비율 5.0이라도 빠르게 재투자 가능. payback period가 광고 예산 투입 속도의 한도를 데이터로 답합니다.&lt;/p&gt;
&lt;figure class=&quot;tistory-figure&quot; style=&quot;margin: 28px 0; text-align: center;&quot;&gt;&lt;img style=&quot;max-width: 100%; height: auto; border-radius: 10px;&quot; src=&quot;https://blog.trysitely.com/img/roas-payback-period-hero.png&quot; alt=&quot;시간 축에 CAC 회수 곡선과 6개월&amp;middot;12개월&amp;middot;18개월 손익분기 마커가 그려진 다이어그램&quot; /&gt;
&lt;figcaption style=&quot;margin-top: 10px; color: #5b6474; font-size: 0.92em; line-height: 1.6;&quot;&gt;LTV/CAC만 보면 못 보는 시간 차원 &amp;mdash; 회수 속도가 성장 한도를 결정한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Payback period의 한 줄 정의&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신규 고객 한 명에게서 누적 매출이 그 고객을 획득한 CAC를 넘는 시점까지 걸린 시간.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수식으로:&lt;/p&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;Payback&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mop&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 3.0582em; vertical-align: -1.2777em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mop op-limits&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 1.7806em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -1.8723em; margin-left: 0em;&quot;&gt;&lt;span style=&quot;height: 3.05em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;mrel mtight&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3.05em;&quot;&gt;&lt;span style=&quot;height: 3.05em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span&gt;&lt;span class=&quot;mop op-symbol large-op&quot;&gt;&amp;sum;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -4.3em; margin-left: 0em;&quot;&gt;&lt;span style=&quot;height: 3.05em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 1.2777em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.1667em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;revenue&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3117em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;&amp;ge;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;CAC&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매출이 시간이 지나면서 누적되니, payback period는 그 누적 매출이 CAC를 넘는 첫 달.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;CAC&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;월매출&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;Payback&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$50&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$25&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;2개월&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$50&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$10&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;5개월&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$50&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$5&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;10개월&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$50&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$4&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;13개월&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;월매출이 절반이면 payback이 두 배. 시간 대비 회수 속도가 단순한 비례 관계.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--note&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;이 글의 전제&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;독자가 ROAS&amp;middot;CAC&amp;middot;LTV 단어를 일상으로 쓰는 마케터&amp;middot;운영자를 가정합니다. 현금흐름&amp;middot;재투자 같은 운영 개념을 받아들인다고 가정합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. LTV/CAC와 payback의 차이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LTV/CAC와 payback은 둘 다 단위 경제학 지표지만 답하는 질문이 다릅니다.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;지표&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;답하는 질문&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;시간 단위&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;LTV/CAC&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&quot;이 고객이 가치 있나?&quot;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;12-24개월 누적&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Payback&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&quot;광고비 회수까지 얼마나?&quot;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1-24개월&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LTV/CAC 5.0인 채널 두 개:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;채널 A: payback 4개월 &amp;rarr; 매월 재투자 가능&lt;/li&gt;
&lt;li&gt;채널 B: payback 18개월 &amp;rarr; 같은 자본으로 매월 늘리면 현금 마이너스&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 비율인데 운영 속도가 완전히 다름. payback이 그 차이를 잡습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 산업별 표준 &amp;mdash; SaaS vs 이커머스&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1. SaaS&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;월간 구독 모델은 매출이 매월 나옵니다. payback은 보통 12-18개월이 표준.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;LTV/CAC&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;Payback&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;등급&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;3.0+&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&amp;lt; 12개월&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;매우 우수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;3.0+&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;12-18개월&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;표준&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;3.0+&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;18-24개월&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;한계&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;3.0+&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;24+&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;자본 큰 회사만&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-2. 이커머스&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이커머스는 첫 구매가 큰 비중. payback이 짧으면 좋고, 길면 재구매 LTV에 의존.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;첫 구매 매출&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;재구매율&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;Payback&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$50 (CAC와 동일)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;0%&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1개월 (첫 구매로 회수)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$30&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;30%&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;약 4개월&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$20&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;50%&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;약 6개월&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$15&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;60%&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;약 10개월&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-3. DTC 브랜드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평균 payback 6-12개월. 12개월 이상이면 광고 자본이 빠르게 묶여 성장 속도 한계.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;산업&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;표준 payback&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;SaaS B2B&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;12-18개월&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;SaaS B2C&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;6-12개월&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;이커머스&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;6-12개월&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;DTC&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;6-12개월&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;게임&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;3-6개월&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;구독 박스&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;3-9개월&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 코드 한 묶음 &amp;mdash; Python으로 payback 계산&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 글에 박는 유일한 코드입니다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/article&gt;</description>
      <category>그로스해킹</category>
      <category>CAC</category>
      <category>Cashflow</category>
      <category>cohort</category>
      <category>payback-period</category>
      <category>unit-economics</category>
      <author>Aramir</author>
      <guid isPermaLink="true">https://code77.tistory.com/113</guid>
      <comments>https://code77.tistory.com/113#entry113comment</comments>
      <pubDate>Sat, 16 May 2026 18:11:50 +0900</pubDate>
    </item>
    <item>
      <title>ROAS&amp;middot;CAC&amp;middot;LTV &amp;mdash; 세 숫자 서로 다른 질문에 답하는 이유</title>
      <link>https://code77.tistory.com/112</link>
      <description>&lt;article class=&quot;tistory-mirror-post&quot; data-source-slug=&quot;roas-cac-ltv-three-views&quot;&gt;
&lt;p class=&quot;tistory-description&quot; data-ke-size=&quot;size16&quot;&gt;회의에서 ROAS만 들고 가면 장기&amp;middot;LTV가 빠지고, CAC만 보면 광고 효율이 빠집니다. 세 숫자를 한 슬라이드에 입체적으로 두는 표준 양식과 의사결정 프레임.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분기 회의에서 마케터가 ROAS만 들고 가면 임원이 &quot;장기 매출은?&quot; 묻고, CAC만 들고 가면 &quot;획득 품질은?&quot; 묻고, LTV만 들고 가면 &quot;광고 효율 어떄?&quot; 묻습니다. 세 숫자가 서로 다른 질문에 답하는 도구이고, 한 숫자만 보면 의사결정의 60%가 빠집니다. 이 글은 세 숫자를 한 슬라이드에 입체적으로 두는 표준 양식과 의사결정 프레임을 정리합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마케터가 이 글을 읽어야 하는 이유&lt;/b&gt;: 분기마다 같은 질문이 회의에서 반복됩니다. 세 숫자를 한 번에 묶어 보고 양식으로 두면 그 반복이 사라지고, 의사결정 속도가 한 단계 올라갑니다. 신규 채널 도입&amp;middot;예산 재배분&amp;middot;캠페인 종료 같은 결정이 모두 세 숫자의 균형으로 답합니다.&lt;/p&gt;
&lt;figure class=&quot;tistory-figure&quot; style=&quot;margin: 28px 0; text-align: center;&quot;&gt;&lt;img style=&quot;max-width: 100%; height: auto; border-radius: 10px;&quot; src=&quot;https://blog.trysitely.com/img/roas-cac-ltv-three-views-hero.png&quot; alt=&quot;ROAS&amp;middot;CAC&amp;middot;LTV 세 숫자가 각각 다른 질문에 답하면서 서로 보완하는 입체 다이어그램&quot; /&gt;
&lt;figcaption style=&quot;margin-top: 10px; color: #5b6474; font-size: 0.92em; line-height: 1.6;&quot;&gt;세 숫자는 같은 결과의 다른 측면. 한 숫자만 보면 60%가 빠진다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 세 숫자의 한 줄 정의&lt;/h2&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;숫자&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;한 줄 정의&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;답하는 질문&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;ROAS&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;광고비 1원당 매출 (Return on Ad Spend)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&quot;광고가 단기적으로 얼마나 효율적인가?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;CAC&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;신규 고객 1명 획득에 든 비용&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&quot;고객 한 명 데려오는 데 얼마?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;LTV&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;고객 1명이 평생 만들 매출 (Lifetime Value)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&quot;데려온 고객이 얼마짜리?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세 숫자는 서로 다른 시간 단위&amp;middot;서로 다른 분모에서 계산됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ROAS = 매출 / 광고비 (캠페인 단위, 단기)&lt;/li&gt;
&lt;li&gt;CAC = 광고비 / 신규 고객 수 (코호트 단위, 단기)&lt;/li&gt;
&lt;li&gt;LTV = 매출 / 고객 수 (코호트 단위, 장기)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 차이가 회의에서 의사결정자가 묻는 질문의 차이를 만듭니다.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--note&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;이 글의 전제&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;독자가 광고 운영을 일상으로 하고 ROAS&amp;middot;CAC&amp;middot;LTV 단어를 쓰는 마케터&amp;middot;운영자를 가정합니다. 세 숫자를 분리해 본 적은 있어도 한 슬라이드에 입체적으로 둔 적은 적다는 가정.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 세 숫자가 서로 다른 답을 하는 자리&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1. ROAS 4.0인데 LTV가 망가지는 자리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ROAS는 단기 매출 효율만 봅니다. 첫 구매가 일어났으면 ROAS는 좋아 보이지만, 그 고객이 재구매 안 하고 떠나면 LTV는 낮습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ROAS 4.0: 광고비 1원당 첫 구매 4원&lt;/li&gt;
&lt;li&gt;LTV: 그 고객의 12개월 누적 매출이 4원에서 끝&lt;/li&gt;
&lt;li&gt;결론: 단기 효율 좋지만 장기 가치 없음. 같은 ROAS 4.0의 다른 채널보다 가치 낮음.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2. CAC 낮은데 LTV가 부족한 자리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CAC만 낮추는 데 집중하면 획득 품질이 떨어집니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CAC &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6444em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6833em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord hangul_fallback&quot;&gt;신규&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;mord hangul_fallback&quot;&gt;명에&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;20만 씀&lt;/li&gt;
&lt;li&gt;LTV &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6444em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;25&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6833em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord hangul_fallback&quot;&gt;평생매출이&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;25&lt;/li&gt;
&lt;li&gt;LTV/CAC 비율 1.25 (운영 한계, 보통 3.0+ 권장)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 자리에서 CAC &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6833em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;40&lt;/span&gt;&lt;span class=&quot;mord hangul_fallback&quot;&gt;인데&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;L&lt;/span&gt;&lt;span style=&quot;margin-right: 0.1389em;&quot; class=&quot;mord mathnormal&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mord mathnormal&quot;&gt;V&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;200이면 비율 5.0으로 훨씬 좋음. CAC만 보면 첫 자리가 좋아 보이지만 LTV/CAC가 진실.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-3. LTV 높은데 CAC도 폭주하는 자리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VIP 채널은 LTV가 높지만 CAC도 폭주할 수 있음.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LTV $500: 평균 매출 좋음&lt;/li&gt;
&lt;li&gt;CAC $300: 획득에 너무 비쌈&lt;/li&gt;
&lt;li&gt;LTV/CAC 1.7 (한계 영역)&lt;/li&gt;
&lt;/ul&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--warn&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;한 숫자 함정&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세 숫자 중 하나만 보고 의사결정하면 거의 항상 다른 두 숫자가 망가집니다. 분기 보고에 항상 세 숫자를 한 줄에 두세요.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 세 숫자의 관계 &amp;mdash; LTV/CAC 비율&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세 숫자를 묶는 표준 지표가 LTV/CAC 비율입니다.&lt;/p&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;LTV/CAC&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 2.0463em; vertical-align: -0.686em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 1.3603em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.314em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;CAC&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3.23em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;border-bottom-width: 0.04em;&quot; class=&quot;frac-line&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3.677em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;LTV&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.686em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;LTV/CAC&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;진단&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&amp;lt; 1.0&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;손실. 획득할수록 손해&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1.0-2.0&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;한계. 광고 효율 또는 LTV 개선 필수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;3.0+&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;표준 (SaaS&amp;middot;이커머스의 권장)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;5.0+&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;매우 우수. 추가 투자 가치&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LTV/CAC 3.0+가 권장되는 이유: 운영비&amp;middot;고정비를 제외한 마진을 확보하고 재투자할 여지를 만들기 위해서. 이커머스의 경우 마진 30%, SaaS는 70%+ 가정하에 산정.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1. ROAS와 LTV/CAC의 관계&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단기 ROAS와 장기 LTV/CAC는 다른 도구입니다.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;시나리오&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;ROAS&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;LTV/CAC&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;첫 구매만 ROAS&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;4.0&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1.5 (LTV 부족)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;재구매 풍부&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;2.5&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;5.0 (LTV 우위)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;신규 시즌&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1.5&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;3.0 (확장 단계)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ROAS만 좋고 LTV/CAC 부족이면 short-termist 함정. ROAS 낮은데 LTV/CAC 좋으면 장기 투자 자리.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 채널별 세 숫자 비교 &amp;mdash; 표준 양식&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분기 회의에 가져갈 표준 표.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;채널&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;ROAS&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;CAC&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;LTV&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;LTV/CAC&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;판단&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Meta 검색 (브랜드)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;6.5&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$25&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$180&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;7.2&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;투자 확대&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Meta retargeting&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;4.2&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$35&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$140&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;4.0&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;유지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;TikTok prospecting&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1.8&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$55&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$95&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1.7&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;한계 &amp;mdash; 검증&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Naver 검색&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;5.1&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$40&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$220&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;5.5&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;투자 확대&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Display&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;0.9&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$80&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$110&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1.4&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;축소 또는 incrementality 검증&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 채널이 세 숫자에서 다르게 평가됩니다. 한 숫자만 보면 결정을 잘못 내림.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--tip&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;회의 한 줄 결론&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Meta 브랜드와 Naver 검색에 예산 +20% 이동, TikTok prospecting은 incrementality 검증 후 결정, Display는 -30% 축소 또는 brand lift 데이터로 정당화.&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 코드 한 묶음 &amp;mdash; Python으로 세 숫자 계산&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 글에 박는 유일한 코드입니다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/article&gt;</description>
      <category>그로스해킹</category>
      <category>CAC</category>
      <category>LTV</category>
      <category>Reporting</category>
      <category>ROAS</category>
      <category>unit-economics</category>
      <author>Aramir</author>
      <guid isPermaLink="true">https://code77.tistory.com/112</guid>
      <comments>https://code77.tistory.com/112#entry112comment</comments>
      <pubDate>Sat, 16 May 2026 18:10:55 +0900</pubDate>
    </item>
    <item>
      <title>마케팅 실험 플랫폼 설계 &amp;mdash; 사내 A/B 시스템의 5가지 원칙</title>
      <link>https://code77.tistory.com/111</link>
      <description>&lt;article class=&quot;tistory-mirror-post&quot; data-source-slug=&quot;marketing-experiment-platform&quot;&gt;
&lt;p class=&quot;tistory-description&quot; data-ke-size=&quot;size16&quot;&gt;광고 플랫폼 자체 A/B로는 부족하고 외부 SaaS는 비쌉니다. 사내 마케팅 실험 플랫폼을 설계할 때 깔아야 할 split assignment&amp;middot;exposure log&amp;middot;SRM 검정&amp;middot;sequential safe&amp;middot;메타 표준 5가지 원칙.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Meta&amp;middot;Google의 자체 A/B 도구는 광고 자체 효과만 보고, Optimizely&amp;middot;VWO는 비싸고 마케팅 데이터와 안 맞습니다. 사내 마케팅 실험 플랫폼을 직접 만들 때 깔아야 할 5가지 원칙이 있습니다. 한 가지라도 빠지면 결과가 흔들리고, 다섯 가지가 함께 깔리면 분기 실험이 정직한 의사결정의 기반이 됩니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마케터가 이 글을 읽어야 하는 이유&lt;/b&gt;: 사내 실험 플랫폼은 분석가&amp;middot;엔지니어가 만들지만, 마케터가 그 5가지 원칙을 모르면 결과 보고를 제대로 해석 못 합니다. 어떤 자리에서 어떤 보정이 필요한지, SRM 알림이 뜨면 무엇을 의심해야 하는지 &amp;mdash; 이걸 알면 회의에서 결정 속도가 한 단계 올라갑니다.&lt;/p&gt;
&lt;figure class=&quot;tistory-figure&quot; style=&quot;margin: 28px 0; text-align: center;&quot;&gt;&lt;img style=&quot;max-width: 100%; height: auto; border-radius: 10px;&quot; src=&quot;https://blog.trysitely.com/img/marketing-experiment-platform-hero.png&quot; alt=&quot;사용자 &amp;rarr; split assignment &amp;rarr; exposure log &amp;rarr; 결과 집계 &amp;rarr; SRM 검정 &amp;rarr; 보고 5단계 데이터 플로우 다이어그램&quot; /&gt;
&lt;figcaption style=&quot;margin-top: 10px; color: #5b6474; font-size: 0.92em; line-height: 1.6;&quot;&gt;실험 플랫폼의 골격은 단순하지만 각 단계의 디테일이 결과 신뢰도를 결정한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 원칙 1 &amp;mdash; 결정론적 split assignment&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-1. 직관&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 사용자가 실험에 여러 번 진입해도 항상 같은 그룹에 배정되어야 함. 매번 다른 그룹에 들어가면 결과가 흩어짐.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-2. 표준 구현&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 ID와 실험 ID를 결합한 해시로 그룹 결정.&lt;/p&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;group&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;margin-right: 0.1667em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;hash&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;u&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&amp;oplus;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0556em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathrm&quot;&gt;mod&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0556em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6833em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.109em;&quot; class=&quot;mord mathnormal&quot;&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.4306em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;u&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;는 사용자 ID, &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.4306em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;e&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;는 실험 ID, &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6833em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.109em;&quot; class=&quot;mord mathnormal&quot;&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;은 그룹 수. SHA-256&amp;middot;MurmurHash3 등 빠른 해시 사용. 결정론적이라 같은 입력에는 항상 같은 출력.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-3. 흔한 실수&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시간 기반 ID 사용 &amp;rarr; 매번 다른 그룹&lt;/li&gt;
&lt;li&gt;실험 ID 빠뜨림 &amp;rarr; 한 사용자가 모든 실험에서 같은 그룹 (의도된 균등 배정 깨짐)&lt;/li&gt;
&lt;li&gt;캠페인 단위 실험인데 사용자 단위 split &amp;rarr; 노출 빈도 차이로 편향&lt;/li&gt;
&lt;/ul&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--note&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;이 글의 전제&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;독자가 A/B 테스트를 일상으로 운영하는 마케터&amp;middot;분석가를 가정합니다. 코드를 직접 짠 적은 없어도 OK이고, 사내 시스템&amp;middot;CDP&amp;middot;BigQuery 같은 단어를 받아들인다고 가정합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 원칙 2 &amp;mdash; exposure log&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1. 직관&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 실험 그룹에 배정된 시점&amp;middot;맥락을 모두 기록. 결과 분석에 그 로그가 진실의 기반.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2. 필수 필드&lt;/h3&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;필드&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;의미&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;user_id&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;사용자 식별자&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;experiment_id&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;실험 ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;variant&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;배정된 그룹 (A/B/C...)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;timestamp&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;노출 시점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;context&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;디바이스&amp;middot;페이지&amp;middot;세그먼트 등&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 5개 필드만 정확하면 후속 분석의 80%가 가능.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-3. 노출 vs 의도 (intent-to-treat)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A/B 결과 분석의 표준은 ITT(Intent-to-Treat) &amp;mdash; 그룹에 배정된 사용자가 실제로 처리를 받았는지와 무관하게 그룹 단위로 분석. 이 원칙을 지키려면 exposure log가 &quot;어느 그룹에 속해야 했는가&quot;를 기록해야 함. 실제 처리를 받았는지는 별도 컬럼.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 원칙 3 &amp;mdash; SRM(Sample Ratio Mismatch) 자동 검정&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1. 직관&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;50:50 그룹이 51:49로 깨졌으면 그룹 자체가 다른 분포일 수 있음. 카이제곱 검정으로 자동 점검.&lt;/p&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1.0585em; vertical-align: -0.1944em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;&amp;chi;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.8641em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -3.113em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2778em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 2.7688em; vertical-align: -1.2777em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mop op-limits&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 1.05em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -1.8723em; margin-left: 0em;&quot;&gt;&lt;span style=&quot;height: 3.05em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3.05em;&quot;&gt;&lt;span style=&quot;height: 3.05em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span&gt;&lt;span class=&quot;mop op-symbol large-op&quot;&gt;&amp;sum;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 1.2777em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.1667em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 1.4911em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.314em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.0576em;&quot; class=&quot;mord mathnormal&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3117em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.0576em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3.23em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;border-bottom-width: 0.04em;&quot; class=&quot;frac-line&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top: -3.677em;&quot;&gt;&lt;span style=&quot;height: 3em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.0278em;&quot; class=&quot;mord mathnormal&quot;&gt;O&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3117em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.0278em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&amp;minus;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span style=&quot;margin-right: 0.0576em;&quot; class=&quot;mord mathnormal&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.3117em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -2.55em; margin-left: -0.0576em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.15em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.8141em;&quot; class=&quot;vlist&quot;&gt;&lt;span style=&quot;top: -3.063em; margin-right: 0.05em;&quot;&gt;&lt;span style=&quot;height: 2.7em;&quot; class=&quot;pstrut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span style=&quot;height: 0.836em;&quot; class=&quot;vlist&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6833em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0278em;&quot; class=&quot;mord mathnormal&quot;&gt;O&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;는 관측 빈도, &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.6833em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span style=&quot;margin-right: 0.0576em;&quot; class=&quot;mord mathnormal&quot;&gt;E&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;는 기대 빈도(균등 분배 가정). p-value 0.001 이하면 SRM 의심.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-2. SRM이 뜨면 의심할 것&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;bot&amp;middot;크롤러가 한쪽에 몰림&lt;/li&gt;
&lt;li&gt;캐시 정책이 그룹별 다르게 작동&lt;/li&gt;
&lt;li&gt;라우팅 로직 오류&lt;/li&gt;
&lt;li&gt;트래픽 폭주로 한쪽 서버 과부하&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-3. 자동화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실험 시작 후 1시간&amp;middot;1일&amp;middot;1주 단위로 SRM 자동 체크. 알림 시 즉시 실험 일시 중지&amp;middot;원인 추적.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.trysitely.com/posts/simpsons-paradox-marketing/&quot;&gt;Simpson's Paradox&lt;/a&gt;에서 다룬 거의 모든 함정의 시작이 SRM이라 가장 먼저 잡아야 함.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 원칙 4 &amp;mdash; Sequential safe 분석&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-1. 직관&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전통적 t-test는 한 번만 봐야 함. 여러 번 보면 false positive 폭증. Sequential testing이 여러 번 봐도 안전한 통계.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-2. peeking 함정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매일 결과 보면서 &quot;유의미하면 종료&quot; 룰 &amp;rarr; 실험 5번 반복하면 false positive가 5배.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-3. 표준 도구&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;mSPRT (mixture Sequential Probability Ratio Test) &amp;mdash; Optimizely&amp;middot;VWO 기본&lt;/li&gt;
&lt;li&gt;always-valid p-value&lt;/li&gt;
&lt;li&gt;Bayesian A/B (prior + posterior, 매번 봐도 정직)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.trysitely.com/posts/sequential-testing-ab/&quot;&gt;Sequential testing&lt;/a&gt;에서 깊이 다룸.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-4. 마케팅 자리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분기 회의에서 &quot;지금까지 결과 어때?&quot; 질문이 자주 옴. Sequential safe 통계가 깔려 있어야 그 자리에 정직한 답 가능.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;질문 빈도&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;통계 도구&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;실험 끝 후 1번만&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;t-test, chi-square&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;분기 한 번 점검&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Sequential test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;매주 점검&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;mSPRT 또는 Bayesian&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;매일 점검&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Bayesian A/B&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 원칙 5 &amp;mdash; 메타데이터&amp;middot;표준화&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5-1. 직관&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;플랫폼이 받는 모든 실험에 표준 메타데이터를 강제. 후속 분석&amp;middot;보고가 자동화 가능.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5-2. 필수 메타&lt;/h3&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;필드&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;의미&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;실험 가설&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&quot;B안이 A보다 CVR +2%p&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Primary KPI&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;CVR, ROAS, 매출 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;사전 등록 MDE&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;검출 가능한 최소 효과&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;사전 등록 표본&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;a href=&quot;https://blog.trysitely.com/posts/power-analysis-mde/&quot;&gt;power analysis&lt;/a&gt; 결과&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;종료 조건&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;표본 도달 또는 기간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;결과 책임자&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;의사결정 담당&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5-3. 사전 등록(preregister)이 보장하는 것&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결과 보고 임의 조정 방지&lt;/li&gt;
&lt;li&gt;p-value hacking 방지&lt;/li&gt;
&lt;li&gt;다중 비교 함정 회피&lt;/li&gt;
&lt;li&gt;결과 신뢰도 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5-4. 코드 한 묶음 &amp;mdash; 실험 메타 schema&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 글에 박는 유일한 코드입니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;from pydantic import BaseModel
from typing import Literal
from datetime import datetime

class ExperimentMeta(BaseModel):
    experiment_id: str
    hypothesis: str
    primary_kpi: Literal[&quot;cvr&quot;, &quot;roas&quot;, &quot;revenue&quot;, &quot;ctr&quot;, &quot;retention&quot;]
    mde_absolute: float       # 검출 최소 효과
    sample_size_per_group: int
    expected_duration_days: int
    end_condition: Literal[&quot;sample_reached&quot;, &quot;time_elapsed&quot;]
    owner: str
    created_at: datetime
    status: Literal[&quot;draft&quot;, &quot;running&quot;, &quot;ended&quot;, &quot;stopped&quot;]

# 실험 시작 전 메타 등록
exp = ExperimentMeta(
    experiment_id=&quot;exp-2026-q2-cta-color&quot;,
    hypothesis=&quot;빨강 CTA가 파랑 CTA 대비 CVR +1.5%p&quot;,
    primary_kpi=&quot;cvr&quot;,
    mde_absolute=0.015,
    sample_size_per_group=8136,
    expected_duration_days=8,
    end_condition=&quot;sample_reached&quot;,
    owner=&quot;marketing-team&quot;,
    created_at=datetime.utcnow(),
    status=&quot;draft&quot;,
)
print(exp.model_dump_json(indent=2))
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 스키마를 BigQuery&amp;middot;실험 테이블에 박아두면 모든 실험이 같은 양식으로 등록되고, 분기 보고 자동화가 가능.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 분석 단계 &amp;mdash; 결과 보고의 표준 양식&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실험 종료 후 결과 보고에 들어가야 할 항목.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;값 (예시)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;실험 ID&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;exp-2026-q2-cta-color&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;가설&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;빨강 CTA +1.5%p&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;표본 (그룹당)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;8,200 / 8,150&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;SRM 검정 p-value&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;0.42 (균형 OK)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Primary KPI 효과&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;+1.8%p (95% CI: +0.9%p - +2.7%p)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Sequential test 결과&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;유의 (p = 0.018)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;운영 의미&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;ROPE &amp;plusmn;1%p 밖, 의미 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;결정&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;B안 채택, 전체 노출 전환&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 양식이 실험 플랫폼의 출력으로 자동 생성되면 의사결정 속도가 크게 빨라짐.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--warn&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;실험 결과 해석의 함정 5가지&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Primary KPI 외 secondary KPI도 보면 다중 비교 함정 (FDR 보정 필요)&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;세그먼트별 분리 분석은 사전 등록 안 됐으면 exploratory로만&lt;/li&gt;
&lt;li&gt;SRM 안 보고 결과 발표하면 자가 선택 편향&lt;/li&gt;
&lt;li&gt;단기 실험으로 장기 효과 외삽 금지&lt;/li&gt;
&lt;li&gt;novelty effect: 첫 1-2주 결과 부풀려짐&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 외부 SaaS vs 사내 플랫폼 트레이드오프&lt;/h2&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;외부 SaaS (Optimizely, VWO)&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;사내 플랫폼&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;도입 속도&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;빠름&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;6-12개월&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;비용&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;월 $1K-10K+&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;인건비&amp;middot;인프라&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;마케팅 데이터 통합&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;약함&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;강함 (CDP&amp;middot;BQ 직결)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;통계 도구&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;표준 (Sequential, Bayesian 내장)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;직접 구현&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;커스터마이징&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;제한적&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;자유&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;운영 부담&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;거의 없음&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;큼&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소규모 팀: 외부 SaaS. 대규모 팀(분기 100+ 실험): 사내 플랫폼이 비용&amp;middot;통합 우위.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 마치며 &amp;mdash; 실험 플랫폼은 마케팅의 인프라&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마케팅 의사결정의 신뢰도가 분기마다 올라가려면 실험 플랫폼이 5가지 원칙 위에 깔려 있어야 합니다. split assignment, exposure log, SRM 자동 검정, sequential safe 분석, 메타 표준화 &amp;mdash; 한 가지라도 빠지면 결과가 흔들리고 의사결정자가 데이터를 안 믿게 됩니다. 마케터가 그 5가지를 알면 분석 결과 회의에서 정직한 질문을 던지고 정직한 답을 받을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 분기에 한 번만 시도해 볼 만한 것은 사내 실험 플랫폼의 메타데이터 등록&amp;middot;SRM 자동 검정 두 가지를 표준화하는 흐름입니다. 두 가지만 깔려도 분기 실험의 신뢰도가 한 단계 올라갑니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;다음에 읽을 글&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.trysitely.com/posts/sequential-testing-ab/&quot;&gt;Sequential testing&lt;/a&gt; &amp;mdash; 매번 봐도 정직한 통계&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.trysitely.com/posts/power-analysis-mde/&quot;&gt;Power analysis &amp;middot; MDE&lt;/a&gt; &amp;mdash; 사전 등록의 표본 계산&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.trysitely.com/posts/simpsons-paradox-marketing/&quot;&gt;Simpson's Paradox&lt;/a&gt; &amp;mdash; SRM 안 잡았을 때의 함정&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Kohavi, Tang, Xu (2020), &quot;Trustworthy Online Controlled Experiments&quot;: &lt;a href=&quot;https://www.amazon.com/Trustworthy-Online-Controlled-Experiments-Practical/dp/1108724264&quot;&gt;https://www.amazon.com/Trustworthy-Online-Controlled-Experiments-Practical/dp/1108724264&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&quot;ExP platform&quot; (Microsoft): &lt;a href=&quot;https://www.exp-platform.com/&quot;&gt;https://www.exp-platform.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&quot;Statistical methods in online controlled experiments&quot; (Microsoft): &lt;a href=&quot;https://www.microsoft.com/en-us/research/group/experimentation-platform-exp/&quot;&gt;https://www.microsoft.com/en-us/research/group/experimentation-platform-exp/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&quot;Always Valid Inference&quot; (Optimizely): &lt;a href=&quot;https://research.optimizely.com/&quot;&gt;https://research.optimizely.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&quot;Stats engine&quot; (VWO): &lt;a href=&quot;https://vwo.com/downloads/VWO_SmartStats_technical_whitepaper.pdf&quot;&gt;https://vwo.com/downloads/VWO_SmartStats_technical_whitepaper.pdf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/article&gt;</description>
      <category>통계&amp;middot;ML</category>
      <category>ab-testing</category>
      <category>experiment-platform</category>
      <category>Infrastructure</category>
      <category>split-assignment</category>
      <category>SRM</category>
      <author>Aramir</author>
      <guid isPermaLink="true">https://code77.tistory.com/111</guid>
      <comments>https://code77.tistory.com/111#entry111comment</comments>
      <pubDate>Sat, 16 May 2026 18:10:03 +0900</pubDate>
    </item>
    <item>
      <title>LLM evaluation harness &amp;mdash; 분기마다 챗봇 품질을 자동 평가하는 공장</title>
      <link>https://code77.tistory.com/110</link>
      <description>&lt;article class=&quot;tistory-mirror-post&quot; data-source-slug=&quot;llm-eval-harness-marketing&quot;&gt;
&lt;p class=&quot;tistory-description&quot; data-ke-size=&quot;size16&quot;&gt;챗봇&amp;middot;에이전트가 운영에 들어가면 한 번 평가가 아니라 분기 자동 평가가 필요합니다. 골든셋&amp;middot;regression&amp;middot;hyperparameter A/B를 묶는 evaluation harness 설계와 마케팅 자리에서의 적용.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG 챗봇&amp;middot;LLM 에이전트가 운영에 들어가면 한 번 평가하고 끝이 아닙니다. 모델 버전이 바뀌고, 프롬프트가 다듬어지고, 새 컨텍스트가 추가될 때마다 품질이 흔들립니다. evaluation harness는 분기마다 자동으로 모든 변화를 점검하는 공장이고, 사내 챗봇 품질의 운영 안정성을 결정합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마케터가 이 글을 읽어야 하는 이유&lt;/b&gt;: 사내 RAG 챗봇&amp;middot;자동화 에이전트가 점점 늘어나는데, 그 품질이 분기마다 어떻게 변하는지 추적이 안 되면 사고가 사용자 보고로만 발견됩니다. evaluation harness는 그 사고를 사전 알림으로 잡는 표준 도구이고, 마케터&amp;middot;운영자가 도구의 골격을 알면 어떤 자리에 도입해야 할지 결정 가능.&lt;/p&gt;
&lt;figure class=&quot;tistory-figure&quot; style=&quot;margin: 28px 0; text-align: center;&quot;&gt;&lt;img style=&quot;max-width: 100%; height: auto; border-radius: 10px;&quot; src=&quot;https://blog.trysitely.com/img/llm-eval-harness-marketing-hero.png&quot; alt=&quot;골든셋 &amp;rarr; 실행 엔진(여러 모델&amp;middot;프롬프트) &amp;rarr; 점수 집계 &amp;rarr; 회귀 비교 단계의 evaluation harness 데이터 플로우 다이어그램&quot; /&gt;
&lt;figcaption style=&quot;margin-top: 10px; color: #5b6474; font-size: 0.92em; line-height: 1.6;&quot;&gt;모델&amp;middot;프롬프트가 바뀔 때마다 자동으로 50개 골든셋이 돌아간다 &amp;mdash; 사고를 사용자보다 먼저 잡는 공장.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Evaluation harness의 한 줄 직관&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;골든셋(질문&amp;middot;기대 답변 묶음)을 입력으로, 여러 LLM 설정(모델&amp;middot;프롬프트&amp;middot;컨텍스트)을 자동 실행하고, 결과 점수를 비교 가능한 형태로 저장하는 시스템.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수동 평가의 한계:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사람이 매번 50개 답변을 읽어 점수 매기기 &amp;rarr; 분기 1회도 어려움&lt;/li&gt;
&lt;li&gt;모델&amp;middot;프롬프트 변경마다 처음부터 다시 &amp;rarr; 비교 불가능&lt;/li&gt;
&lt;li&gt;결과가 한 번 보고 사라짐 &amp;rarr; 추세 추적 불가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;harness는 이 세 가지를 자동화합니다.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--note&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;이 글의 전제&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;독자가 RAG 챗봇&amp;middot;LLM 에이전트 단어를 일상으로 쓰는 마케터&amp;middot;운영자&amp;middot;분석가를 가정합니다. &lt;a href=&quot;https://blog.trysitely.com/posts/rag-evaluation/&quot;&gt;RAG 평가&lt;/a&gt; 글의 4가지 지표를 이미 알고 있다고 가정합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 4가지 핵심 컴포넌트&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1. 골든셋(golden set)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;질문&amp;middot;기대 답변&amp;middot;컨텍스트의 묶음. 50-200개가 표준. 분기마다 갱신.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;필드&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;의미&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;question&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;사용자 질문&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;expected_answer&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;기대 답변 또는 핵심 fact&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;context_docs&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;답변에 필요한 문서 ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;difficulty&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;easy/medium/hard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;category&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;도메인 분류 (FAQ, 데이터 조회, 액션 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2. 실행 엔진(runner)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 LLM 설정을 병렬로 실행. 같은 골든셋을 GPT-5 vs Claude Sonnet에 동시 투입해 비교.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-3. 점수 매기기(scorer)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.trysitely.com/posts/rag-evaluation/&quot;&gt;Ragas&lt;/a&gt; 같은 라이브러리로 4개 지표 자동 계산:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Context relevance&lt;/li&gt;
&lt;li&gt;Context recall&lt;/li&gt;
&lt;li&gt;Faithfulness&lt;/li&gt;
&lt;li&gt;Answer relevance&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-4. 결과 저장&amp;middot;비교(tracker)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 실행의 결과를 SQL&amp;middot;JSON&amp;middot;MLflow에 저장. 분기 추세&amp;middot;configuration 비교가 자동.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 데이터 플로우 표준 흐름&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;골든셋 (50-200개 질문)
        │
        ▼
실행 엔진 &amp;mdash; N개 configuration 병렬
   ├ GPT-5 + 프롬프트 v1
   ├ GPT-5 + 프롬프트 v2
   ├ Claude Sonnet + 프롬프트 v1
   └ Claude Sonnet + 프롬프트 v2
        │
        ▼
점수 매기기 &amp;mdash; 4지표 &amp;times; N config
        │
        ▼
결과 비교 표
   config &amp;times; 지표 매트릭스
        │
        ▼
회귀 비교 &amp;mdash; 지난 분기 결과 vs 이번 분기
        │
        ▼
보고 생성 (자동)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 한 흐름이 마케팅 챗봇의 분기 품질 보고를 자동화.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 코드 한 묶음 &amp;mdash; Pytest 스타일 harness&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 글에 박는 유일한 코드입니다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/article&gt;</description>
      <category>AI&amp;middot;LLM</category>
      <category>evaluation</category>
      <category>Harness</category>
      <category>LLM</category>
      <category>Rag</category>
      <category>regression</category>
      <author>Aramir</author>
      <guid isPermaLink="true">https://code77.tistory.com/110</guid>
      <comments>https://code77.tistory.com/110#entry110comment</comments>
      <pubDate>Sat, 16 May 2026 18:09:14 +0900</pubDate>
    </item>
    <item>
      <title>코호트 LTV 곡선 &amp;mdash; 누적 매출 그래프 그리고 해석하기</title>
      <link>https://code77.tistory.com/109</link>
      <description>&lt;article class=&quot;tistory-mirror-post&quot; data-source-slug=&quot;cohort-ltv-curve-design&quot;&gt;
&lt;p class=&quot;tistory-description&quot; data-ke-size=&quot;size16&quot;&gt;평균 LTV 한 숫자로는 채널&amp;middot;시즌&amp;middot;세그먼트 차이가 안 보입니다. 코호트별 누적 매출 곡선을 그려 그 차이를 시각적으로 잡고, 곡선 모양으로 운영 결정을 내리는 표준 워크플로.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;이 채널 LTV &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 0.8889em; vertical-align: -0.1944em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;180&lt;/span&gt;&lt;span class=&quot;mord hangul_fallback&quot;&gt;입니다&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;.&quot;&lt;/span&gt;&lt;span class=&quot;mord hangul_fallback&quot;&gt;한숫자가회의에던져집니다&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mord hangul_fallback&quot;&gt;그런데그&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;L&lt;/span&gt;&lt;span style=&quot;margin-right: 0.1389em;&quot; class=&quot;mord mathnormal&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;margin-right: 0.2222em;&quot; class=&quot;mord mathnormal&quot;&gt;V&lt;/span&gt;&lt;span class=&quot;mord hangul_fallback&quot;&gt;가평균이라면&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;margin-right: 0.1667em;&quot; class=&quot;mspace&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord hangul_fallback&quot;&gt;어느코호트는&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;400이고 어느 코호트는 $80일 수 있습니다. 코호트 LTV 곡선은 그 차이를 한 그래프로 보여주고, 곡선 모양 자체가 운영 결정의 근거가 됩니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마케터가 이 글을 읽어야 하는 이유&lt;/b&gt;: 분기 회의에서 LTV 평균만 들고 가면 의사결정자가 &quot;그래서 어느 자리에서 그 평균이 나왔어?&quot;를 묻습니다. 코호트 곡선이 그 자리를 시각적으로 답합니다. 곡선이 빠르게 평탄화되면 churn 문제, 천천히 우상향이면 재구매 강함, 한 번 떨어지고 회복 안 되면 이슈 발생 시점 &amp;mdash; 곡선 모양 한 번 보면 운영 진단이 즉답.&lt;/p&gt;
&lt;figure class=&quot;tistory-figure&quot; style=&quot;margin: 28px 0; text-align: center;&quot;&gt;&lt;img style=&quot;max-width: 100%; height: auto; border-radius: 10px;&quot; src=&quot;https://blog.trysitely.com/img/cohort-ltv-curve-design-hero.png&quot; alt=&quot;시간 축에 코호트별 누적 매출 곡선 4개가 다른 형태로 그려진 다이어그램&quot; /&gt;
&lt;figcaption style=&quot;margin-top: 10px; color: #5b6474; font-size: 0.92em; line-height: 1.6;&quot;&gt;평균 한 숫자가 못 보여주는 입체. 곡선 모양 자체가 진단.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. LTV 곡선의 한 줄 직관&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 코호트(같은 시점에 획득한 사용자 묶음)의 누적 평균 매출을 시간 축에 그린 그래프.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;X축이 코호트 시작 후 경과 시간(월), Y축이 그 시점까지 누적된 사용자 1인당 매출.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;경과 월&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;A코호트 누적 LTV&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;B코호트 누적 LTV&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$30&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$55&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$85&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$55&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;12&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$145&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$75&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;24&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$220&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$90&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평균 LTV (12개월 = &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span style=&quot;height: 1em; vertical-align: -0.25em;&quot; class=&quot;strut&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;110&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mord hangul_fallback&quot;&gt;가같아도&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;mord hangul_fallback&quot;&gt;는&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;24&lt;/span&gt;&lt;span class=&quot;mord hangul_fallback&quot;&gt;개월에&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;220, B는 $90으로 곡선 모양이 완전 다름. 의사결정에 이 차이가 결정적.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--note&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;이 글의 전제&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;독자가 코호트&amp;middot;LTV&amp;middot;재구매 단어를 일상으로 쓰는 마케터&amp;middot;분석가를 가정합니다. 코호트 분석을 한 번 해봤다면 OK.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 코호트 정의 &amp;mdash; 어떻게 묶을까&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코호트는 같은 시점에 획득한 사용자 묶음. 자주 등장하는 묶음 기준.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1. 획득 월&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 흔한 기준. 2026-Q1&amp;middot;Q2&amp;middot;Q3 등 분기 단위 또는 월 단위.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2. 획득 채널&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Meta&amp;middot;Google&amp;middot;Naver 등 채널별로 코호트 분리. 채널별 LTV 곡선 비교가 분기 의사결정의 핵심 자리.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-3. 캠페인&amp;middot;크리에이티브&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 캠페인이나 크리에이티브로 들어온 사용자만 묶기. 캠페인 단위 평가에 적합.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-4. 첫 구매 카테고리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 구매 카테고리(전자기기&amp;middot;의류&amp;middot;식품 등)별로 묶어 LTV 차이 측정.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;코호트 기준&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;자주 쓰는 자리&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;획득 월&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;분기 트렌드&amp;middot;시즌 효과&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;채널&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;채널 간 LTV 비교&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;캠페인&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;캠페인 평가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;첫 카테고리&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;카테고리 전략&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;첫 구매 가격대&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;가격 정책&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 4가지 표준 곡선 모양&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LTV 곡선의 모양이 곧 운영 진단입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1. 가파른 우상향 &amp;mdash; 우수&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 1-3개월에 빠르게 누적, 그 이후 안정적 추가 매출. 재구매&amp;middot;구독 강한 자리.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;  $250 |              ___------
  $200 |          __--
  $150 |       _-/
  $100 |    _-/
   $50 | _-/
       +-----+-----+-----+-----+
         3m   6m   12m  18m
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진단: 이 채널&amp;middot;세그먼트에 예산 추가 투입.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-2. 빠른 평탄화 &amp;mdash; Churn 문제&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 한두 달은 매출 좋고, 그 이후 거의 평평. 첫 구매 후 떠나는 사용자 많음.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;  $100 |     ____________________
   $80 |    /
   $40 |   /
   $20 |  /
       +-----+-----+-----+-----+
         3m   6m   12m  18m
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진단: post-purchase journey, retention 캠페인 도입 검토.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-3. S-curve &amp;mdash; 늦게 활성화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초반은 약하고 6-9개월쯤부터 매출 급증. 학습&amp;middot;신뢰 형성 후 사용 본격화 패턴.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;  $200 |                ____------
  $150 |             __-/
  $100 |          __-/
   $50 |    _____/
       +-----+-----+-----+-----+
         3m   6m   12m  18m
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진단: 회수 시간이 길지만 LTV는 큼. 자본 여유 시 가치 큰 자리.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-4. 톱니형 &amp;mdash; 시즌&amp;middot;이벤트 의존&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 시기(연말&amp;middot;세일)마다 급증, 다른 시기엔 평탄. 일정 의존도 높음.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;  $150 |          __-/-_____-/
  $100 |       __/
   $60 |    __/
   $30 |  _/
       +-----+-----+-----+-----+
         3m   6m   12m  18m
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진단: 시즌 외 retention 약점. 평상시 캠페인 강화.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 코드 한 묶음 &amp;mdash; 코호트 곡선 그리기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 글에 박는 유일한 코드입니다.&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;
ax.legend(); ax.grid(alpha=0.3)
plt.tight_layout(); plt.savefig(&quot;ltv_curve.png&quot;, dpi=150)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 한 묶음이 코호트 LTV 곡선의 표준 시각화. 채널별 비교가 한 그래프에.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 곡선에서 읽는 의사결정 신호 5가지&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5-1. 12개월 LTV 절대치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 채널&amp;middot;세그먼트의 12개월 누적 LTV가 LTV/CAC 비율의 기반. 절대치 비교가 첫 단계.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5-2. 곡선 기울기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기울기가 가파른 자리는 재구매 강함. 평평한 자리는 첫 구매 의존.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5-3. 손익분기 시점 (CAC 회수)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;곡선이 CAC 라인 넘는 시점이 &lt;a href=&quot;https://blog.trysitely.com/posts/roas-payback-period/&quot;&gt;payback period&lt;/a&gt;. 짧을수록 좋음.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5-4. 코호트 간 변동성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 채널 다른 월 코호트의 곡선이 비슷한 모양인지. 변동성 크면 운영 안정성 약함.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5-5. 시즌&amp;middot;이벤트 영향&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 코호트가 다른 모양이면 그 시기에 시즌&amp;middot;이벤트&amp;middot;정책 변화 의심.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--tip&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;회의 한 줄 결론 룰&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;곡선 4개 보고 가장 가파른 채널에 +20%, 가장 평평한 채널에 -20%, 변동성 큰 채널에 lift study 검증. 이 룰 한 줄로 분기 재배분의 80%가 결정.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. LTV 곡선의 한계와 보완&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-1. 미래 추정의 한계&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12개월 코호트 곡선이 24개월 LTV를 정확히 예측 못 함. BG/NBD 같은 확률 모델(&lt;a href=&quot;https://blog.trysitely.com/posts/bgnbd-ltv-prediction/&quot;&gt;bgnbd-ltv-prediction&lt;/a&gt;)이 미래 LTV 추정의 표준.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-2. 자가 선택 편향&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ROAS 좋은 채널은 광고 자체가 더 자주 좋은 사용자에게 노출됨. LTV 곡선이 채널 효과인지 사용자 차이인지 분리 어려움.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-3. 외부 요인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경기&amp;middot;경쟁&amp;middot;브랜드 인지도 변화가 LTV에 영향. 같은 채널의 분기 코호트가 다른 모양이면 외부 요인 의심.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-4. Right-truncation&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 최근 코호트는 데이터가 짧아 12개월 LTV 알 수 없음. 6개월 LTV로 12개월 LTV 추정하는 모델 필요.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--warn&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;결과 해석의 함정&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코호트 LTV 곡선이 우상향 보여도 그게 인과인지 상관인지 분리 못 함. 진정한 채널 효과 검증은 &lt;a href=&quot;https://blog.trysitely.com/posts/brand-lift-study/&quot;&gt;brand lift study&lt;/a&gt; 또는 &lt;a href=&quot;https://blog.trysitely.com/posts/geo-lift-causal/&quot;&gt;geo-lift&lt;/a&gt; 같은 인과 분석이 따로 필요.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 분기 보고에 박을 표 양식&lt;/h2&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;채널&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;12mo LTV&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;곡선 기울기&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;Payback&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;변동성&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;판단&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Meta retargeting&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$185&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;가파름&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1개월&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;낮음&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;적극 확장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Naver 검색&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$220&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;표준&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;5개월&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;낮음&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;표준&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;TikTok prospecting&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$110&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;평평&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;9개월&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;높음&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;retention 캠페인 도입&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Display&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;$130&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;톱니&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;14개월&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;매우 높음&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;시즌 의존 &amp;mdash; 분기별 분석&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LTV 절대치만 보면 Naver가 1위지만, 곡선 기울기&amp;middot;payback&amp;middot;변동성을 함께 보면 Meta retargeting이 운영 안정성 우위.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 마치며 &amp;mdash; 평균 한 숫자가 가린 진실&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평균 LTV 한 숫자는 코호트 간 차이&amp;middot;곡선 모양&amp;middot;시간 변동성을 모두 가립니다. 코호트별 LTV 곡선을 한 그래프에 두는 것만으로 분기 회의의 의사결정 입력이 입체적이 되고, &quot;왜 이 채널?&quot;의 답이 데이터로 따라옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 분기에 한 번만 시도해 볼 만한 것은 채널별 코호트 LTV 곡선을 한 슬라이드에 두고 4가지 모양(가파른&amp;middot;평탄&amp;middot;S&amp;middot;톱니)으로 분류하는 흐름입니다. 분류 자체가 다음 분기 액션을 정해줍니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;다음에 읽을 글&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.trysitely.com/posts/bgnbd-ltv-prediction/&quot;&gt;BG/NBD LTV 예측&lt;/a&gt; &amp;mdash; 미래 LTV 확률 모델링&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.trysitely.com/posts/roas-payback-period/&quot;&gt;CAC payback period&lt;/a&gt; &amp;mdash; 곡선의 손익분기 시점&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.trysitely.com/posts/retention-curve-cohort/&quot;&gt;Retention curve cohort&lt;/a&gt; &amp;mdash; LTV 곡선의 형제 도구&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;Cohort analysis 101&quot; (Mode): &lt;a href=&quot;https://mode.com/blog/cohort-analysis/&quot;&gt;https://mode.com/blog/cohort-analysis/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&quot;LTV cohort curves in DTC&quot; (Common Thread): &lt;a href=&quot;https://commonthreadco.com/&quot;&gt;https://commonthreadco.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&quot;Cohort retention&quot; (Reforge): &lt;a href=&quot;https://www.reforge.com/&quot;&gt;https://www.reforge.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&quot;Customer LTV&quot; (HBR, 2014): &lt;a href=&quot;https://hbr.org/&quot;&gt;https://hbr.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&quot;Right-truncation in LTV estimation&quot; (Fader &amp;amp; Hardie): &lt;a href=&quot;https://www.brucehardie.com/papers/&quot;&gt;https://www.brucehardie.com/papers/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/article&gt;</description>
      <category>그로스해킹</category>
      <category>Analysis</category>
      <category>cohort</category>
      <category>LTV</category>
      <category>retention</category>
      <category>unit-economics</category>
      <author>Aramir</author>
      <guid isPermaLink="true">https://code77.tistory.com/109</guid>
      <comments>https://code77.tistory.com/109#entry109comment</comments>
      <pubDate>Sat, 16 May 2026 18:08:22 +0900</pubDate>
    </item>
    <item>
      <title>웹 CRO 입문 &amp;mdash; 랜딩 페이지 최적화의 핵심 6원칙과 실험 운영 표준</title>
      <link>https://code77.tistory.com/108</link>
      <description>&lt;article class=&quot;tistory-mirror-post&quot; data-source-slug=&quot;web-cro-6principles&quot;&gt;
&lt;p class=&quot;tistory-description&quot; data-ke-size=&quot;size16&quot;&gt;같은 트래픽에서 매출만 1.5배 만드는 게 CRO입니다. 랜딩 페이지의 6원칙(clarity&amp;middot;urgency&amp;middot;friction&amp;middot;social proof&amp;middot;value prop&amp;middot;trust)부터 실험 운영&amp;middot;도구&amp;middot;KPI까지 한 글로.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;광고비를 늘리지 않고 매출을 1.5배 만드는 가장 빠른 길은 CRO(Conversion Rate Optimization)예요. 들어오는 트래픽은 그대로, 그 트래픽이 더 자주 사는 사이트로 바꾸는 일. 그런데 CRO를 처음 시작하면 &quot;버튼 색을 빨강으로 vs 초록으로&quot; 같은 표면적인 실험에 빠지기 쉽습니다. 진짜 CRO는 사이트의 6가지 원칙을 점검하는 일이에요. 이 글은 랜딩 페이지 CRO의 6원칙과 실험 운영 표준을 한 글로 정리합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;CRO가 왜 광고보다 효율 높은가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 자리에서 매출을 늘리는 두 갈래.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;광고비를 늘려 트래픽을 늘리기 (스케일링)&lt;/li&gt;
&lt;li&gt;트래픽 그대로 두고 conversion을 늘리기 (CRO)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CRO의 한 가지 강점은 &lt;b&gt;한 번 만들면 영구적&lt;/b&gt;이라는 점. 한 분기 CRO로 conversion이 1.2배가 되면 그 다음 분기에도 자동으로 1.2배예요. 광고비는 매달 지출이지만 CRO는 자산입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 CRO에도 한계가 있어요. 자기 매체의 baseline conversion이 ceiling에 가까우면 추가 개선 어려워집니다. 보통 첫 사이트 audit으로 3-5개 큰 문제를 찾고, 그것만 잡아도 conversion이 1.2-1.5배 늘어요.&lt;/p&gt;
&lt;figure class=&quot;tistory-figure&quot; style=&quot;margin: 28px 0; text-align: center;&quot;&gt;&lt;img style=&quot;max-width: 100%; height: auto; border-radius: 10px;&quot; src=&quot;https://blog.trysitely.com/img/web-cro-6principles-hero.png&quot; alt=&quot;CRO 6원칙과 실험 운영 매트릭스&quot; /&gt;
&lt;figcaption style=&quot;margin-top: 10px; color: #5b6474; font-size: 0.92em; line-height: 1.6;&quot;&gt;clarity&amp;middot;urgency&amp;middot;friction&amp;middot;social proof&amp;middot;value prop&amp;middot;trust &amp;mdash; 6원칙을 점검하면 사이트의 conversion이 자연스럽게 올라간다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6원칙 한 표 &amp;mdash; 사이트 audit 체크리스트&lt;/h2&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;원칙&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;한 줄 정의&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;점검 질문&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Clarity (명확성)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&quot;이 사이트가 뭘 파는지 5초 안에 보이나&quot;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;첫 화면 H1&amp;middot;sub가 가치를 명확히 말하나&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Urgency (긴급성)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&quot;지금 사야 할 이유가 있나&quot;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;시간 한정&amp;middot;재고 표시&amp;middot;early bird 같은 신호&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Friction (마찰)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&quot;사는 게 얼마나 쉽나&quot;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;form 필드 수&amp;middot;결제 단계 수&amp;middot;sign up 필수 여부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Social proof (사회적 증거)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&quot;남들도 쓰나&quot;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;사용자 수&amp;middot;리뷰&amp;middot;logos&amp;middot;case study&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Value prop (가치 제안)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&quot;왜 경쟁사 말고 우리인가&quot;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;차별점 한 줄&amp;middot;benefit 3개&amp;middot;price&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Trust (신뢰)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&quot;이 사이트 안전한가&quot;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;보안&amp;middot;환불&amp;middot;고객 응대&amp;middot;법적 정보&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;audit은 이 6가지 질문을 자기 사이트에 던지는 일이에요. 한 원칙이라도 약하면 conversion이 그만큼 깎입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;원칙 1 &amp;mdash; Clarity (명확성)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자는 사이트 도착 후 5초 안에 &quot;이 사이트가 뭘 파는가&quot;를 판단합니다. 첫 화면의 H1&amp;middot;sub&amp;middot;hero 이미지가 그 답을 명확하게 전달해야 해요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흔한 실수:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;H1이 슬로건 (의미 모호) &amp;mdash; &quot;더 나은 삶, 더 가까운 미래&quot;&lt;/li&gt;
&lt;li&gt;사용자 가치가 아닌 회사 자랑 &amp;mdash; &quot;업계 1위, 100만 고객&quot;&lt;/li&gt;
&lt;li&gt;너무 많은 정보로 첫 화면 가득 채우기&lt;/li&gt;
&lt;li&gt;가치 제안과 무관한 hero 이미지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 H1 패턴:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;[누구]가 [무엇]을 [어떻게] 한다&quot; &amp;mdash; &quot;마케터가 매체 데이터를 BI에서 본다&quot;&lt;/li&gt;
&lt;li&gt;&quot;[목표]를 [방법]으로&quot; &amp;mdash; &quot;ROAS를 베이지안 신뢰구간으로&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;H1을 사용자 가치로 바꾸면 conversion이 10-30% 늘어나는 일이 흔해요. 가장 cost-efficient한 CRO 첫 작업.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;원칙 2 &amp;mdash; Urgency (긴급성)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사람은 손해를 회피하기 위해 빠르게 결정합니다. &quot;지금 안 사면 손해&quot;라는 신호가 있으면 결정이 빨라져요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표준 urgency 패턴:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시간 한정 (24시간 할인&amp;middot;이번 주말까지)&lt;/li&gt;
&lt;li&gt;재고 한정 (이 사이즈 3개 남음&amp;middot;매진 임박)&lt;/li&gt;
&lt;li&gt;early bird (사전 예약 -30%)&lt;/li&gt;
&lt;li&gt;countdown timer&lt;/li&gt;
&lt;li&gt;limited edition&amp;middot;시즌 한정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윤리적 경계가 있어요. 거짓 재고&amp;middot;가짜 카운트다운은 단기 conversion은 올려도 장기 trust와 reputation을 깨요. 진짜 urgency를 만들거나, urgency 없이 다른 원칙으로 가는 게 낫습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;원칙 3 &amp;mdash; Friction (마찰)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마찰은 사용자가 conversion에 도달하기까지의 모든 장애물. 줄이면 줄일수록 conversion이 올라요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흔한 마찰 자리:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;form 필드가 너무 많음 (요청 정보 줄이기)&lt;/li&gt;
&lt;li&gt;sign up 필수 (guest checkout 옵션)&lt;/li&gt;
&lt;li&gt;결제 단계가 너무 많음 (1-page checkout)&lt;/li&gt;
&lt;li&gt;이메일 인증 필수 (소셜 로그인)&lt;/li&gt;
&lt;li&gt;모바일에서 폼 입력 어려움 (autofill&amp;middot;numeric keyboard)&lt;/li&gt;
&lt;li&gt;페이지 로딩 느림 (LCP 3초 넘으면 conversion 절반)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;form optimization 1개로 conversion이 25%까지 늘어난 사례가 흔해요. 필수가 아닌 필드를 다 빼고, 필요하면 결제 후에 받는 progressive disclosure.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--warn&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;모바일 friction이 데스크탑보다 2배 중요&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분 트래픽이 모바일인 시대에 모바일 form&amp;middot;결제 흐름의 friction이 가장 큰 leverage. 데스크탑에서 잘 되는 사이트도 모바일에서 form 필드 1개 줄이면 conversion이 비대칭적으로 올라요.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;원칙 4 &amp;mdash; Social Proof&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;남들이 쓴다는 신호는 사용자가 망설이지 않게 만들어요. 특히 처음 방문 사이트에서 결정적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;활용 자리:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 수 (&quot;100,000명이 이용 중&quot;)&lt;/li&gt;
&lt;li&gt;리뷰 별점&amp;middot;실제 인용 (&quot;이 제품 진짜 좋아요&quot; - 김ㅇㅇ)&lt;/li&gt;
&lt;li&gt;신뢰 로고 (B2B의 client logo wall)&lt;/li&gt;
&lt;li&gt;미디어 언급 (TechCrunch&amp;middot;매체 언급)&lt;/li&gt;
&lt;li&gt;case study&amp;middot;success story&lt;/li&gt;
&lt;li&gt;live activity (&quot;방금 ㅇㅇ님이 구매했어요&quot;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원칙 &amp;mdash; 진짜 데이터로만, 인용은 실명&amp;middot;사진 같이. 가짜 리뷰는 발각되면 trust가 무너집니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;원칙 5 &amp;mdash; Value Proposition&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;왜 경쟁사 말고 우리인가&quot;의 답이 첫 화면에 있어야 해요. 사용자는 다른 옵션을 두고 비교하기 때문에 차별점이 명확해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 value prop 구조:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 줄로 핵심 차별점&lt;/li&gt;
&lt;li&gt;3개의 benefit 묘사&lt;/li&gt;
&lt;li&gt;가격 또는 가격 모델 명시&lt;/li&gt;
&lt;li&gt;(선택) 경쟁사 직접 비교 표&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가격을 숨기는 사이트는 보통 conversion이 낮아요. enterprise B2B는 &quot;contact for pricing&quot;이 맞지만 SaaS&amp;middot;이커머스는 가격 명시가 표준입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;원칙 6 &amp;mdash; Trust&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 결제 직전 가장 자주 이탈하는 자리가 trust 신호 부족이에요. 결제 직전에 다음이 보여야 합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;환불&amp;middot;교환 정책&lt;/li&gt;
&lt;li&gt;보안 인증 (SSL&amp;middot;PG&amp;middot;보안 logo)&lt;/li&gt;
&lt;li&gt;고객 응대 채널 (전화&amp;middot;채팅&amp;middot;FAQ)&lt;/li&gt;
&lt;li&gt;회사 정보 (법인 정보&amp;middot;주소&amp;middot;사업자 등록)&lt;/li&gt;
&lt;li&gt;리뷰&amp;middot;평점 (정직한 평균치)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iOS App Store에서 트래픽 들어오는 경우 ATT 동의&amp;middot;privacy label 같은 신호도 trust 요소예요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실험 운영 표준 &amp;mdash; CRO를 A/B로&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CRO는 가설을 A/B로 검증하는 일이에요. 매주 가설 1-2개를 검증하면 1년에 50-100개 학습이 쌓입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실험 운영 표준:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가설 backlog 우선순위 (ICE: Impact&amp;middot;Confidence&amp;middot;Ease)&lt;/li&gt;
&lt;li&gt;MDE(Minimum Detectable Effect)와 표본 수 계산&lt;/li&gt;
&lt;li&gt;한 번에 1 페이지&amp;middot;1 변수만 (multi-variate는 후순위)&lt;/li&gt;
&lt;li&gt;통계적 유의 + 실용적 유의 (5% lift가 의미 있는가)&lt;/li&gt;
&lt;li&gt;종료 후 결과 문서화 (배운 것&amp;middot;다음 가설)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도구: Google Optimize는 종료됐고 지금은 VWO&amp;middot;Optimizely&amp;middot;Convert&amp;middot;자체 framework 사용. 무료로 시작하려면 GA4 audience + URL 분기 + custom segment로도 일정 수준 가능해요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.trysitely.com/posts/mab-vs-ab-testing&quot;&gt;mab-vs-ab-testing&lt;/a&gt;&amp;middot;&lt;a href=&quot;https://blog.trysitely.com/posts/cuped-variance-reduction&quot;&gt;cuped-variance-reduction&lt;/a&gt;&amp;middot;&lt;a href=&quot;https://blog.trysitely.com/posts/ab-test-pitfalls&quot;&gt;ab-test-pitfalls&lt;/a&gt;에서 실험 통계의 깊은 자리를 다뤘습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;CRO 측정 &amp;mdash; Funnel KPI&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CRO의 KPI는 단순 conversion rate가 아니라 funnel 전체. 어느 단계가 약한지 알아야 어디를 고칠지 결정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표준 funnel 예시 (이커머스):&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;단계&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;이상적 conversion&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;방문 &amp;rarr; 상품 페이지&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;30-50%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;상품 페이지 &amp;rarr; 장바구니&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;5-15%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;장바구니 &amp;rarr; 결제&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;60-80%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;결제 &amp;rarr; 완료&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;70-90%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 표 자기 회사 숫자와 비교해서 가장 낮은 단계를 우선 개선. 한 단계 5% 올리면 매출 5% 늘어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;heatmap&amp;middot;session replay (Hotjar&amp;middot;Microsoft Clarity&amp;middot;FullStory)로 어느 자리에서 사람이 멈추는지 보고, A/B로 가설 검증.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마치며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CRO는 거창한 일이 아니라 6원칙 체크리스트를 자기 사이트에 던지는 일에서 시작해요. 첫 1주는 audit, 그 다음부터 매주 가설 1개 실험. 1년 50개 실험이 누적되면 자기 사이트가 다른 사이트가 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 글로는 &lt;a href=&quot;https://blog.trysitely.com/posts/sqlbi-7-roas-sql&quot;&gt;Meta&amp;middot;Google&amp;middot;TikTok 픽셀 + CAPI 설치&lt;/a&gt;에서 측정 정합성, &lt;a href=&quot;https://blog.trysitely.com/posts/ga4-bigquery-roas&quot;&gt;웹 퍼널 세그먼트 설계&lt;/a&gt;에서 트래픽 분해를 다룹니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://baymard.com/research&quot;&gt;Baymard Institute &amp;mdash; UX research for ecommerce&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://conversionsciences.com/blog/&quot;&gt;Conversion Sciences blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/speed&quot;&gt;Speed matters: Google research on page speed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.influenceatwork.com/&quot;&gt;Cialdini's principles of influence (책)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;사내 글: &lt;a href=&quot;https://blog.trysitely.com/posts/ab-test-pitfalls&quot;&gt;A/B 테스트 흔히 빠뜨리는 5가지&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;사내 글: &lt;a href=&quot;https://blog.trysitely.com/posts/mab-vs-ab-testing&quot;&gt;MAB vs A/B&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;사내 글: &lt;a href=&quot;https://blog.trysitely.com/posts/cuped-variance-reduction&quot;&gt;CUPED 분산 축소&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;사내 글: &lt;a href=&quot;https://blog.trysitely.com/posts/power-analysis-mde&quot;&gt;Power analysis&amp;middot;MDE&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/article&gt;</description>
      <category>웹 마케팅</category>
      <category>ab-test</category>
      <category>CRO</category>
      <category>landing-page</category>
      <category>optimization</category>
      <category>web-marketing</category>
      <author>Aramir</author>
      <guid isPermaLink="true">https://code77.tistory.com/108</guid>
      <comments>https://code77.tistory.com/108#entry108comment</comments>
      <pubDate>Sat, 16 May 2026 18:07:34 +0900</pubDate>
    </item>
    <item>
      <title>스타트업 데이터팀 채용 &amp;mdash; 1번 데이터 사람 뽑기와 첫 90일 온보딩</title>
      <link>https://code77.tistory.com/107</link>
      <description>&lt;article class=&quot;tistory-mirror-post&quot; data-source-slug=&quot;startup-data-team-hiring-90days&quot;&gt;
&lt;p class=&quot;tistory-description&quot; data-ke-size=&quot;size16&quot;&gt;스타트업이 처음 데이터 사람을 뽑을 때 가장 자주 깨지는 자리는 역할 정의&amp;middot;면접 기준&amp;middot;온보딩 90일. ICP&amp;middot;면접 셋&amp;middot;90일 마일스톤&amp;middot;흔한 실수를 한 글로 정리합니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스타트업이 처음 데이터 사람을 뽑을 때 가장 자주 깨지는 자리는 &quot;어떤 사람을 뽑아야 하는지&quot;부터 모호한 채로 채용 공고를 올리는 거예요. data scientist vs analytics engineer vs analyst의 차이도 모호하고, 면접에서 무엇을 보고 합격 시킬지도 흩어지고, 채용 후 첫 90일에 무엇을 시킬지 정리가 안 됩니다. 이 글은 스타트업의 1번 데이터 채용을 디자인하는 가이드. ICP&amp;middot;면접 셋&amp;middot;90일 마일스톤&amp;middot;자주 실패하는 패턴까지.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;왜 1번 데이터 채용이 어려운가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스타트업이 데이터팀을 처음 만들 때 어려운 이유 5가지.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;회사가 뭐가 필요한지 모름 (analyst&amp;middot;engineer&amp;middot;scientist 다 다름)&lt;/li&gt;
&lt;li&gt;면접관이 데이터 직무를 깊게 모름&lt;/li&gt;
&lt;li&gt;senior 1명이 모든 걸 해줄 거라 기대 (현실은 갭이 큼)&lt;/li&gt;
&lt;li&gt;채용 후 시키는 일이 broad (&quot;뭐든 다 봐주세요&quot;)&lt;/li&gt;
&lt;li&gt;첫 6개월 결과가 안 보이면 채용 자체가 실패로 보임&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 5가지가 동시에 깨지면 6개월 후 채용한 사람이 떠나거나 회사가 데이터 효용을 못 느껴 추가 채용을 미뤄요.&lt;/p&gt;
&lt;figure class=&quot;tistory-figure&quot; style=&quot;margin: 28px 0; text-align: center;&quot;&gt;&lt;img style=&quot;max-width: 100%; height: auto; border-radius: 10px;&quot; src=&quot;https://blog.trysitely.com/img/startup-data-team-hiring-90days-hero.png&quot; alt=&quot;스타트업 데이터팀 첫 채용 + 90일 온보딩 로드맵&quot; /&gt;
&lt;figcaption style=&quot;margin-top: 10px; color: #5b6474; font-size: 0.92em; line-height: 1.6;&quot;&gt;ICP 정의 &amp;rarr; 면접 셋 &amp;rarr; 첫 90일 마일스톤. 1번 데이터 채용 성공 패턴은 3단계의 명확함.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터 직무 3가지 &amp;mdash; 어느 ICP인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스타트업 1번 채용에서 가장 먼저 풀어야 할 질문이 &quot;어떤 직무인가&quot;. 세 가지가 본질적으로 달라요.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;직무&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;주력&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;산출물&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;도구&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Analyst&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;SQL&amp;middot;BI&amp;middot;domain&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;보고서&amp;middot;대시보드&amp;middot;ad-hoc 분석&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;SQL, Looker, Tableau&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Analytics Engineer&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;데이터 모델링&amp;middot;파이프라인&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;dbt 모델&amp;middot;신뢰할 fact table&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;dbt, BigQuery, Airflow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Data Scientist&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;ML&amp;middot;실험&amp;middot;통계&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;모델&amp;middot;실험&amp;middot;예측&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Python, ML libraries&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사 단계별 1번 채용 추천.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;시드-시리즈 A (직원 1-30명)&lt;/b&gt;: Analyst. 비즈니스 질문에 빠르게 답하고 SQL&amp;middot;BI를 직접 만들어야 함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시리즈 A-B (직원 30-100명)&lt;/b&gt;: Analytics Engineer. 데이터 모델&amp;middot;파이프라인을 정비해야 다음 분석이 굴러감&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시리즈 B+ (직원 100+명)&lt;/b&gt;: Data Scientist. 모델&amp;middot;실험&amp;middot;예측이 회사 의사결정에 들어감&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분 스타트업의 1번 채용은 Analyst가 맞아요. ML&amp;middot;deep learning 사람을 너무 일찍 뽑으면 데이터 인프라가 약해서 모델을 못 굽니다.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--warn&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;Senior 1명이 모든 걸 한다는 환상 금지&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;senior 1명만 뽑으면 다 알아서 한다&quot;는 가정은 실패율 높아요. senior라도 한 직무에 깊고 다른 직무에 약합니다. ICP를 좁히는 게 첫 단계.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ICP가 명확해진 다음 &amp;mdash; 채용 공고&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 채용 공고의 5가지 요소.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;회사 단계&amp;middot;맥락&lt;/b&gt; (어디까지 와있고 어디 가는지)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이 직무가 해결할 진짜 문제&lt;/b&gt; (3-5개 구체 예시)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;첫 90일 성공 기준&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;필요 스킬 vs 좋으면 좋은 스킬 분리&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;같이 일할 사람&amp;middot;보고 라인&amp;middot;자율성 수준&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흔한 안티패턴 &amp;mdash; &quot;데이터에 관심 있는 분&quot;, &quot;SQL&amp;middot;Python&amp;middot;R&amp;middot;Tableau&amp;middot;dbt&amp;middot;Airflow&amp;middot;SQL&amp;middot;BigQuery&amp;middot;Snowflake 다 가능한 분&quot;. 둘 다 지원자가 무엇을 기대받는지 모릅니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;면접 셋 4단계&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표준 채용 면접 구조.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;단계&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;시간&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;평가&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1. 전화&amp;middot;줌 스크리닝&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;30분&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;동기&amp;middot;기본 fit&amp;middot;연봉 범위&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;2. 기술 면접&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;60-90분&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;SQL&amp;middot;통계&amp;middot;도구 깊이&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;3. 케이스 인터뷰&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;60분&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;비즈니스 문제 푸는 사고&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;4. 컬처 fit&amp;middot;임원 면접&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;45분&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;회사 가치&amp;middot;장기 fit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 단계에서 명확한 합격&amp;middot;불합격 기준이 있어야 면접관 별로 흩어지지 않아요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기술 면접의 SQL 질문 예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;한 user의 N번째 구매 추출&quot; (window function)&lt;/li&gt;
&lt;li&gt;&quot;30일 rolling retention rate 계산&quot;&lt;/li&gt;
&lt;li&gt;&quot;두 table을 outer join 후 NULL 처리&quot;&lt;/li&gt;
&lt;li&gt;&quot;PII 노출 없이 cohort size 보고&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지원자가 답하면서 가정&amp;middot;trade-off를 같이 설명하는지가 진짜 평가 자리.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;케이스 인터뷰의 핵심&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기술이 강해도 케이스 인터뷰에서 깨지는 사람이 많아요. 케이스는 &quot;비즈니스 문제 &amp;rarr; 데이터 가설 &amp;rarr; 분석 설계 &amp;rarr; 결론&quot;의 전 흐름을 보는 자리.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 케이스 예시.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;마케팅 채널 5개 중 어디를 줄일지 어떻게 판단할까?&quot;&lt;/li&gt;
&lt;li&gt;&quot;신규 user의 첫 7일 retention이 갑자기 떨어졌다. 어떻게 디버깅?&quot;&lt;/li&gt;
&lt;li&gt;&quot;A/B 테스트 결과가 통계적으로 유의했는데 매출이 늘지 않았다. 무엇을 확인?&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지원자가 가정&amp;middot;데이터 점검&amp;middot;여러 가설 비교&amp;middot;우선순위&amp;middot;결론까지 가는 흐름을 보여줘야 합니다. 단답이 아니라 사고 과정.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;채용 후 90일 마일스톤&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;채용했다고 끝이 아니에요. 첫 90일이 회사&amp;middot;사람 둘 다의 fit을 결정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표준 90일 마일스톤 (Analyst 기준).&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;시기&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;목표&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Week 1-2&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;도구&amp;middot;데이터&amp;middot;codebase 온보딩, 1:1 stakeholder 소개&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Week 3-4&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;첫 ad-hoc 분석 1개 (작은 비즈니스 질문)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Week 5-8&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;핵심 대시보드 audit&amp;middot;1개 새 dashboard 출시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Week 9-12&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1개 자기 주도 분석 프로젝트 + 사내 발표&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;90일 후 다음 분기 우선순위를 같이 정하고 본격 운영. 90일 안에 첫 성과 1개를 같이 만드는 게 사람과 회사 모두에게 큰 모멘텀이에요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;첫 90일 온보딩의 안티패턴&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;첫 주에 너무 많은 도구&amp;middot;문서를 한 번에 던지기&lt;/li&gt;
&lt;li&gt;첫 한 달 동안 의미 있는 산출물 없이 read-only 상태&lt;/li&gt;
&lt;li&gt;1:1을 안 잡거나 너무 적게 잡기&lt;/li&gt;
&lt;li&gt;ad-hoc 요청을 무한정으로 받음 (포커스 깨짐)&lt;/li&gt;
&lt;li&gt;&quot;데이터 인프라부터 다시 정리해주세요&quot; 같은 6개월 짜리 큰 일&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;90일 안에는 작지만 visible한 성공을 만드는 게 우선. 큰 인프라 작업은 90일 이후로 미뤄야 운영 fit을 보여줄 수 있어요.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--tip&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;첫 90일은 stakeholder 매핑이 KPI&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새 데이터 사람의 첫 90일 KPI는 &quot;기술 산출물 N개&quot;가 아니라 &quot;stakeholder N명과의 신뢰 구축&quot;. 영업&amp;middot;마케팅&amp;middot;product&amp;middot;CEO 각각과 1:1을 갖고 그들의 진짜 데이터 needs를 듣는 게 다음 6개월 일을 결정합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터팀 1명에서 3명으로 가는 길&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번 채용이 성공하면 다음은 누구를 뽑을까. 패턴.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1명: Analyst (broad coverage)&lt;/li&gt;
&lt;li&gt;3명: + Analytics Engineer (인프라 정비) + Junior Analyst&lt;/li&gt;
&lt;li&gt;10명: + Data Scientist + Data Engineer + manager&lt;/li&gt;
&lt;li&gt;30명: 도메인별 분리 (marketing&amp;middot;product&amp;middot;finance data팀)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1&amp;rarr;3은 보통 18-24개월 차에 옴. 너무 일찍 ML&amp;middot;data engineering hire 하면 첫 사람이 외로워져요 (협업할 사람 없음).&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;한국 시장 특수성&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;영문 SQL&amp;middot;툴 익숙도와 한국어 비즈니스 컨텍스트 둘 다 필요&lt;/li&gt;
&lt;li&gt;한국 직무 시장에서 &quot;데이터 분석가&quot;는 BA&amp;middot;DA&amp;middot;DS가 다 섞여있어 ICP 정의 더 중요&lt;/li&gt;
&lt;li&gt;외부 채용 비용이 글로벌 대비 합리적이지만 좋은 사람의 retention이 어려움&lt;/li&gt;
&lt;li&gt;신입&amp;middot;주니어 풀에 부트캠프 출신이 많아져서 코드&amp;middot;통계 기본기 점검 필수&lt;/li&gt;
&lt;li&gt;LinkedIn보다 wanted&amp;middot;remember&amp;middot;잡코리아&amp;middot;원티드 인사이트가 1차 채용 채널&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마치며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스타트업 1번 데이터 채용은 &quot;어떤 사람을 뽑을까&quot;보다 &quot;그 사람이 어떤 환경에서 6개월 동안 첫 성과를 만들지&quot;를 먼저 디자인하는 일이에요. 그 디자인이 명확하면 채용 자체가 쉬워지고 retention도 따라옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 글로는 &lt;a href=&quot;https://blog.trysitely.com/posts/sqlbi-7-roas-sql&quot;&gt;스타트업 마케팅 조직 설계&lt;/a&gt;&amp;middot;&lt;a href=&quot;https://blog.trysitely.com/posts/aarrr-north-star-metric-funnel-ops-growth-loop&quot;&gt;stakeholder 커뮤니케이션 표준&lt;/a&gt;으로 이어집니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://locallyoptimistic.com/&quot;&gt;Locally Optimistic &amp;mdash; Data team blogs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.getdbt.com/what-is-analytics-engineering&quot;&gt;dbt &amp;mdash; analytics engineering 정의&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://brittanybennett.com/&quot;&gt;Brittany Bennett &amp;mdash; building a data team&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://erikbern.com/&quot;&gt;Erik Bernhardsson &amp;mdash; building analytics teams&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reforge.com/&quot;&gt;Reforge &amp;mdash; Data Strategy course&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;사내 글: &lt;a href=&quot;https://blog.trysitely.com/posts/crm-onboardingactivationretentionwin-back-4&quot;&gt;CRM 라이프사이클 메시징&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;사내 글: &lt;a href=&quot;https://blog.trysitely.com/posts/aarrr-north-star-metric-funnel-ops-growth-loop&quot;&gt;AARRR 진짜 운영&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;사내 글: &lt;a href=&quot;https://blog.trysitely.com/posts/llm-6-guardrail-costlatency&quot;&gt;LLM cost guardrails&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/article&gt;</description>
      <category>스타트업 운영&amp;middot;조직</category>
      <category>data-team</category>
      <category>Hiring</category>
      <category>onboarding</category>
      <category>OPS</category>
      <category>Startup</category>
      <author>Aramir</author>
      <guid isPermaLink="true">https://code77.tistory.com/107</guid>
      <comments>https://code77.tistory.com/107#entry107comment</comments>
      <pubDate>Sat, 16 May 2026 18:06:42 +0900</pubDate>
    </item>
    <item>
      <title>광고 SQL&amp;middot;BI 안티패턴 7가지 &amp;mdash; ROAS 보고서를 거짓말로 만드는 SQL 함정</title>
      <link>https://code77.tistory.com/106</link>
      <description>&lt;article class=&quot;tistory-mirror-post&quot; data-source-slug=&quot;sqlbi-7-roas-sql&quot;&gt;
&lt;p class=&quot;tistory-description&quot; data-ke-size=&quot;size16&quot;&gt;광고 데이터를 SQL로 집계할 때 반복적으로 깨지는 7가지 패턴 &amp;mdash; 중복 조인&amp;middot;attribution window 누락&amp;middot;시간대 미스&amp;middot;conversion lag&amp;middot;환율&amp;middot;채널 매핑&amp;middot;dedup. 마케터&amp;middot;BI팀이 실무에서 만나는 함정을 실제 SQL 반례와 함께 정리합니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Meta는 ROAS 5.2라는데, GA4는 3.8이고, BI팀이 BigQuery로 다시 뽑은 건 9.6이에요.&quot; 어느 회의에서나 흔한 풍경입니다. 셋 다 다른 데이터를 봤다면 차이가 나는 게 당연한데, 진짜 무서운 건 같은 raw event를 두 사람이 SQL로 집계했는데 ROAS가 30% 차이 나는 경우입니다. 거의 모든 경우 원인은 데이터가 아니라 &lt;b&gt;SQL 한 줄&lt;/b&gt;이에요. 이 글은 광고 데이터를 SQL로 집계할 때 마케터&amp;middot;BI팀이 반복적으로 빠지는 7가지 안티패턴을 정리합니다. 각각 어떻게 ROAS를 왜곡하는지, 어떻게 잡는지까지.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;왜 SQL 한 줄이 ROAS 30%를 바꾸나&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;광고 데이터는 다른 도메인 데이터와 결이 다릅니다. 한 유저가 같은 캠페인을 4번 보고, 그 사이에 3번 사이트를 들렀다가, 마지막에 다른 디바이스로 구매하는 일이 일상입니다. 이걸 표 한 장으로 만들 때 SQL은 마법을 부려야 합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;impression&amp;middot;click&amp;middot;event 테이블이 따로&lt;/li&gt;
&lt;li&gt;attribution window가 채널마다 다름&lt;/li&gt;
&lt;li&gt;같은 user가 cookie&amp;middot;gaid&amp;middot;email_hash로 흩어져 있음&lt;/li&gt;
&lt;li&gt;광고비는 매체 통화, 매출은 자사 통화&lt;/li&gt;
&lt;li&gt;보고 시점마다 conversion lag로 어제 수치가 바뀜&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 다섯 가지가 동시에 들어오면 SQL은 굉장히 미묘해집니다. 운이 나쁘면 한 줄 잘못 짜서 ROAS가 두 배로 나오기도 하고, 운이 좋으면 한 분기 동안 모르고 지나가기도 합니다. 그래서 광고 SQL은 &quot;맞다/틀리다&quot;가 아니라 &quot;어떤 안티패턴을 피했나&quot;의 게임이에요.&lt;/p&gt;
&lt;figure class=&quot;tistory-figure&quot; style=&quot;margin: 28px 0; text-align: center;&quot;&gt;&lt;img style=&quot;max-width: 100%; height: auto; border-radius: 10px;&quot; src=&quot;https://blog.trysitely.com/img/sqlbi-7-roas-sql-hero.png&quot; alt=&quot;광고 SQL&amp;middot;BI 안티패턴 7가지를 한 장에 정리한 인포그래픽&quot; /&gt;
&lt;figcaption style=&quot;margin-top: 10px; color: #5b6474; font-size: 0.92em; line-height: 1.6;&quot;&gt;JOIN&amp;middot;timezone&amp;middot;lag&amp;middot;환율&amp;middot;UTM&amp;middot;dedup &amp;mdash; 각각 한 줄 잘못 짜면 ROAS가 30%씩 흔들리는 7가지 함정.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 BigQuery 기준으로 예시를 들지만 Snowflake&amp;middot;Redshift&amp;middot;Postgres 어디서나 동일한 함정이에요. 한 번에 다 외울 필요는 없고, BI팀과 마케팅팀의 숫자가 안 맞을 때 위에서부터 체크리스트로 쓰면 됩니다.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--note&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;이 글이 가정하는 독자&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;광고 데이터를 직접 짜본 적이 있거나, BI팀이 짠 SQL을 리뷰해야 하는 마케터&amp;middot;운영자&amp;middot;데이터 분석가입니다. 깊은 윈도우 함수나 옵티마이저 지식은 필요 없고, SELECT&amp;middot;JOIN&amp;middot;GROUP BY가 익숙하면 충분합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;함정 1 &amp;mdash; Fan-out 중복 조인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 흔하고, 가장 큰 폭의 오류를 만드는 패턴입니다. 광고비 테이블과 전환 테이블을 단순 JOIN으로 붙이면 한 행이 N행으로 부풀어 매출이 N배가 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상황을 그려볼게요. 광고비 테이블 &lt;code&gt;ad_spend&lt;/code&gt;는 캠페인&amp;middot;날짜 단위로 한 행씩 있습니다. 전환 테이블 &lt;code&gt;conversions&lt;/code&gt;는 한 user의 한 구매가 한 행입니다. 한 캠페인의 하루에 구매가 50건 있다면 단순 JOIN의 결과는 어떻게 될까요.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;-- ❌ 안티패턴: spend가 50번 복제되어 매출이 정상이지만 spend가 50배가 된다
SELECT
  s.campaign_id,
  s.date,
  SUM(s.spend) AS spend,        -- 50배 부풀려진다
  SUM(c.revenue) AS revenue
FROM ad_spend s
JOIN conversions c
  ON s.campaign_id = c.campaign_id
 AND s.date = DATE(c.event_time)
GROUP BY 1, 2
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 쿼리는 &lt;code&gt;ad_spend&lt;/code&gt;의 한 행을 &lt;code&gt;conversions&lt;/code&gt;의 50행과 카르테시안 조인합니다. &lt;code&gt;SUM(s.spend)&lt;/code&gt;가 50배가 되어 ROAS가 1/50로 찍히죠. 운 좋게 매출 쪽이 부풀려지는 케이스라면 반대로 ROAS가 N배가 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결은 두 갈래입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;먼저 dedup&amp;middot;집계 &amp;rarr; 그 다음 JOIN&lt;/b&gt;. 전환 테이블을 먼저 &lt;code&gt;GROUP BY campaign_id, date&lt;/code&gt;로 합쳐서 한 행으로 만든 뒤 광고비와 1:1로 붙입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;full-outer + COALESCE 패턴&lt;/b&gt;. 전환이 없는 캠페인도 살려야 하니 INNER가 아니라 FULL OUTER로 붙이고 NULL은 0으로.&lt;/li&gt;
&lt;/ul&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--warn&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;JOIN 전에 카디널리티 확인&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새 테이블을 JOIN하기 전에 &lt;code&gt;SELECT COUNT(*), COUNT(DISTINCT key)&lt;/code&gt;로 키의 카디널리티를 먼저 봐야 합니다. 두 숫자가 같지 않으면 그 키는 fan-out을 일으킵니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 안티패턴이 무서운 이유는 결과가 그럴듯하게 보인다는 점이에요. ROAS 0.04 같은 명백히 이상한 숫자라면 다들 알아차리지만, 1.8쯤 나오면 &quot;광고가 좀 약한가&quot; 하고 넘어갑니다. 한 분기를 그렇게 보내고 나서야 누가 발견하는 일이 흔합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;함정 2 &amp;mdash; Attribution window 누락&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;광고는 오늘 클릭하고 내일 구매합니다. 어떤 카테고리는 일주일 뒤에 구매하기도 하죠. SQL을 짤 때 click과 purchase를 같은 날짜로 묶으면 이 lag가 다 빠집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흔한 잘못된 패턴은 click과 purchase를 user_id로 묶을 때 &lt;code&gt;click.date = purchase.date&lt;/code&gt; 같은 등치 조건을 같이 넣는 것입니다. 이렇게 짜면 클릭한 당일에 구매한 케이스만 매칭되고 D+1 이후는 전부 attribution에서 빠져요. 단순 등치가 아니라 &lt;code&gt;BETWEEN click.timestamp AND TIMESTAMP_ADD(click.timestamp, INTERVAL N DAY)&lt;/code&gt; 같은 윈도우 매칭이 표준입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;광고 채널별로 표준이 다른 attribution window가 있습니다.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;채널&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;기본 window&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;비고&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Meta&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;click 7d / view 1d&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;캠페인 옵션으로 28d까지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Google Ads&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;30d&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;data-driven은 더 유연&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;TikTok&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;click 7d / view 1d&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Naver SA&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;14d&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;캠페인 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;MMP (Appsflyer&amp;middot;Adjust)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;click 7d / install 30d&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;앱 기준&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 window를 채널마다 다르게 적용해야 같은 보고서가 됩니다. 한 SQL에 모두 7일로 통일하면 Google Ads의 D+10 전환이 다 빠지고, 모두 30일로 통일하면 Meta&amp;middot;TikTok에서 view-through가 7배쯤 부풀려집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결 패턴:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;채널별 window를 &lt;b&gt;설정 테이블&lt;/b&gt;로 분리합니다. &lt;code&gt;channel_attribution_config(channel, click_window_days, view_window_days)&lt;/code&gt; 같은 lookup.&lt;/li&gt;
&lt;li&gt;매칭 조건은 &lt;code&gt;BETWEEN click_time AND TIMESTAMP_ADD(click_time, INTERVAL window DAY)&lt;/code&gt;로 씁니다.&lt;/li&gt;
&lt;li&gt;view-through는 별도 컬럼으로 분리해 두고, 보고서에서 켜고 끄게 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--tip&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;window는 일자가 아닌 timestamp 기준&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하루 단위 매칭은 &quot;23:59 클릭이 다음 날 00:01 구매면 D+1&quot;이라는 작은 오류를 만듭니다. 광고 측정의 표준은 항상 클릭 timestamp + N일 윈도우입니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;함정 3 &amp;mdash; Timezone 미스매치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Meta API는 광고주 시간대를 기본으로 주지만 일부 endpoint는 UTC, GA4 BigQuery export는 이벤트 시점 UTC, 사내 주문 DB는 KST. 이 네 개를 같은 &quot;5월 16일&quot;로 집계하면 광고비와 매출이 각각 다른 24시간을 보고 있게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흔한 증상.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;매일 9시에 도는 잡이 어제 ROAS를 뽑는데, KST 자정 직후 1시간의 전환이 사라진다&lt;/li&gt;
&lt;li&gt;월요일 ROAS가 항상 낮고 일요일 ROAS가 높다 (광고비는 토&lt;del&gt;일, 매출은 일&lt;/del&gt;월 카운팅)&lt;/li&gt;
&lt;li&gt;광고 매체와 BI의 ROAS 차이가 정확히 &quot;하루 정도의 비율&quot;로 일정하다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결은 단순합니다. 모든 timestamp를 &lt;b&gt;한 timezone(보통 KST)으로 정규화&lt;/b&gt;한 다음 그 위에서 날짜를 만들어요. BigQuery라면 &lt;code&gt;DATE(TIMESTAMP(event_timestamp), 'Asia/Seoul')&lt;/code&gt; 한 줄, Snowflake라면 &lt;code&gt;CONVERT_TIMEZONE('UTC', 'Asia/Seoul', event_ts)::DATE&lt;/code&gt;처럼 표준 함수 한 줄로 처리합니다. 핵심은 raw layer가 항상 UTC라는 약속을 깨지 않는 거예요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매체 API는 &lt;code&gt;time_increment=1&lt;/code&gt; 옵션을 쓸 때 광고주 timezone으로 쪼개주지만, 통화&amp;middot;환율 변환과 섞이면 다시 깨집니다. 정책은 항상 같은 것이 좋아요. &lt;b&gt;raw layer는 UTC로 통일해서 저장, 보고 layer에서 KST로 변환&lt;/b&gt;. dbt 같은 변환 도구를 쓴다면 timezone 변환 매크로를 만들어두면 안전합니다.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--note&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;DST가 없는 한국이라 다행&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;미국 시장 데이터를 같이 다루면 DST 전후 한 주가 항상 한 시간 어긋납니다. timezone-aware 라이브러리(pytz, JDK ZoneId)나 BigQuery &lt;code&gt;AT TIME ZONE&lt;/code&gt;을 반드시 써야 해요.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;함정 4 &amp;mdash; Conversion lag와 진행 중 데이터&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어제 ROAS를 오늘 봤더니 2.3이었는데, 다음 주에 다시 보니 3.1이 됐습니다. 데이터가 바뀐 게 아니라 conversion lag로 늦게 잡힌 전환이 추가된 거예요. 마케터에게는 굉장히 혼란스러운 경험입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 함정은 SQL 자체보다 &lt;b&gt;운영 정책&lt;/b&gt;의 문제입니다. SQL은 &quot;지금 시점의 최선의 추정치&quot;를 매번 다시 계산하니까요. 정책 없이 매일 ROAS를 뽑으면 어제 본 숫자와 오늘 본 숫자가 다를 수밖에 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표준 운영 정책 3가지.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;T+3 freeze&lt;/b&gt;. 발생 후 3일 지난 데이터만 KPI로 확정. 어제&amp;middot;그제&amp;middot;오늘은 &quot;진행 중&quot;으로 표시.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;D+7 ROAS와 D+30 ROAS를 분리해 본다&lt;/b&gt;. 단기 의사결정은 D+7, 분기 회고는 D+30.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스냅샷 테이블&lt;/b&gt;. 매일 아침 같은 시점의 ROAS를 별도 테이블에 적재해서 시점별 비교 가능하게.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dbt를 쓰면 &lt;code&gt;snapshots&lt;/code&gt;나 &lt;code&gt;incremental + invalidation&lt;/code&gt; 패턴으로 이걸 처리합니다. SQL만 짠다면 적어도 &lt;code&gt;report_run_date&lt;/code&gt; 컬럼을 항상 같이 박아두는 게 안전해요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ROAS가 시점에 따라 바뀐다는 점을 회의에서 명확히 공유하지 않으면 마케터가 매일 다른 숫자를 보고 부담을 느낍니다. &quot;월요일에 본 지난주 ROAS는 진행 중이고, 이번주 금요일 freeze 이후가 확정&quot;이라는 식의 룰을 팀에 박아둬야 합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;함정 5 &amp;mdash; 환율과 통화 단위&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다국가 캠페인을 운영하면 Meta 광고비는 USD, GA 매출은 KRW, TikTok 광고비는 USD, 일부 매체는 EUR이 섞입니다. 이걸 단순히 한 컬럼으로 합치면 1달러와 1원이 같은 무게로 더해집니다. 그러면 환율 1300배짜리 ROAS 폭탄이 만들어져요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흔한 잘못된 패턴:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;환율을 적용 안 한 채 SUM하기 (한 통화로 보면 ROAS가 1300배)&lt;/li&gt;
&lt;li&gt;환율을 적용할 때 보고서 출력 시점 환율로 일괄 적용하기&lt;/li&gt;
&lt;li&gt;환율을 적용할 때 transaction 시점이 아니라 batch가 도는 시점으로 적용하기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;권장 패턴:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;raw layer에 항상 source currency 컬럼을 같이 적재&lt;/b&gt;. &lt;code&gt;spend_amount&lt;/code&gt; + &lt;code&gt;spend_currency&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;환율 테이블은 일별 + 통화별로 별도&lt;/b&gt;. &lt;code&gt;fx_rate(date, from_currency, to_currency, rate)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;보고 layer에서 &lt;code&gt;spend_amount * fx_rate&lt;/code&gt; 형태로 일자별 환율을 매칭해서 KRW 변환.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 짜놓으면 분기 회고에 &quot;당시 환율 기준&quot;과 &quot;기준일 환율 기준&quot; 두 가지 ROAS를 다 볼 수 있어요. 광고비는 당시 환율로 본 값이 의사결정에 더 맞고, 회계 정산은 기준일 환율로 보는 게 맞아서 두 뷰 모두 의미가 있습니다.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--warn&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;USD&amp;middot;EUR&amp;middot;JPY는 항상 ISO 4217 코드로&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사람이 보는 보고서에는 &quot;달러&quot;라고 쓰더라도, 데이터에는 항상 &lt;code&gt;USD&lt;/code&gt;&amp;middot;&lt;code&gt;EUR&lt;/code&gt;&amp;middot;&lt;code&gt;JPY&lt;/code&gt;&amp;middot;&lt;code&gt;KRW&lt;/code&gt; 같은 ISO 4217 3글자 코드로 박아야 합니다. &quot;USD&quot;와 &quot;US Dollar&quot;가 섞이면 환율 매칭이 NULL이 됩니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;함정 6 &amp;mdash; 채널 매핑과 UTM 일관성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 채널이 raw data에서 네 가지 이름으로 나타납니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;utm_source=facebook&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;utm_source=Facebook&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;utm_source=fb&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;utm_source=meta&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GA4 UI에서는 자동으로 일부 통합되지만 BigQuery export는 raw 그대로 들어옵니다. 채널 정규화 lookup이 없으면 같은 Meta가 4개 행으로 쪼개지고, 채널별 ROAS는 다 1/4 수준으로 찍힙니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 여기서 끝나지 않아요. 더 깊은 함정은 utm을 잘못 박은 캠페인, 마케터가 자율적으로 만든 utm 표기, 매체가 자동으로 추가하는 파라미터(&lt;code&gt;gclid&lt;/code&gt;, &lt;code&gt;fbclid&lt;/code&gt;)와의 우선순위입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;권장 정책:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;채널 정규화 테이블&lt;/b&gt;을 1번 소스로 만들고 SQL은 항상 LEFT JOIN으로 정규화 후 사용.&lt;/li&gt;
&lt;li&gt;utm 표기 규칙(소문자, 하이픈, 캠페인 코드 prefix)을 마케팅팀과 합의해 거버넌스 문서로.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gclid&lt;/code&gt;&amp;middot;&lt;code&gt;fbclid&lt;/code&gt;가 있을 때 utm보다 우선하는 fallback 룰 정의.&lt;/li&gt;
&lt;li&gt;정규화 실패 케이스(매핑에 없는 새 utm)는 &lt;b&gt;매주 모니터링 쿼리&lt;/b&gt;로 점검.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 함정은 한 번 정리하면 한 분기는 평화롭다가, 마케터가 새 매체를 추가하면 다시 깨집니다. 거버넌스가 SQL보다 더 중요해요. 매주 도는 모니터링 쿼리 하나만 두면 안전합니다 &amp;mdash; 채널 매핑 테이블에 없는 신규 &lt;code&gt;utm_source&lt;/code&gt; TOP 10을 매주 슬랙으로 알려주는 잡 하나. 새 매체가 들어오면 자동으로 잡혀요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;함정 7 &amp;mdash; Dedup과 동일 user의 다중 식별자&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 user가 brand search로 한 번 들어왔다가, 7일 뒤 retargeting으로 다시 와서 구매했다고 칩시다. raw data에는 &lt;code&gt;cookie_id&lt;/code&gt; 두 개, &lt;code&gt;email_hash&lt;/code&gt; 한 개, &lt;code&gt;gaid&lt;/code&gt; 한 개로 나타날 수 있어요. SQL에서 user 단위 집계를 할 때 이 식별자들을 어떻게 묶느냐가 결과를 완전히 바꿉니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흔한 잘못된 패턴:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;COUNT(DISTINCT cookie_id)&lt;/code&gt;로 unique user를 셈 &amp;rarr; 한 user가 N명으로 카운팅&lt;/li&gt;
&lt;li&gt;email_hash가 NULL인 비로그인 행을 user 집계에서 누락 &amp;rarr; 신규 user가 사라짐&lt;/li&gt;
&lt;li&gt;attribution을 user_id 매칭으로만 처리 &amp;rarr; 로그인 전 클릭이 attribution에서 빠짐&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결 패턴은 &lt;b&gt;ID resolution&lt;/b&gt;입니다. 사내에 CDP가 있다면 unified user_id를 쓰면 되고, 없다면 다음 우선순위로 식별자를 통합합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;로그인된 &lt;code&gt;email_hash&lt;/code&gt; (가장 강함)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gaid&lt;/code&gt; / &lt;code&gt;idfv&lt;/code&gt; (모바일 디바이스)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cookie_id&lt;/code&gt; (가장 약함, 짧은 수명)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;window function을 써서 한 &lt;code&gt;cookie_id&lt;/code&gt;가 어느 시점에 어느 &lt;code&gt;email_hash&lt;/code&gt;로 매칭됐는지 추적합니다. 그 매칭이 잡힌 순간부터 그 &lt;code&gt;cookie_id&lt;/code&gt;의 과거 이벤트도 같은 user로 묶어요. SQL로는 &lt;code&gt;FIRST_VALUE(email_hash) OVER (PARTITION BY cookie_id ORDER BY event_time ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)&lt;/code&gt; 같은 윈도우 함수 한 줄로 unified_email_hash를 만든 뒤, 그 매핑 테이블을 raw events에 LEFT JOIN으로 붙이는 식이 표준입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 함정은 SQL 한 줄이 아니라 데이터 모델 자체의 문제라 가장 어렵습니다. 사내 ID 거버넌스가 아직 약하다면 &lt;a href=&quot;https://blog.trysitely.com/posts/cdp-id-graph&quot;&gt;cdp-id-graph&lt;/a&gt;와 &lt;a href=&quot;https://blog.trysitely.com/posts/server-side-tagging-capi&quot;&gt;server-side-tagging-capi&lt;/a&gt;를 먼저 보시면 도움이 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마치며 &amp;mdash; 안티패턴 체크리스트&lt;/h2&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;함정&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;증상&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;1차 점검&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1. Fan-out 중복 조인&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;일부 캠페인의 spend&amp;middot;revenue가 비현실적으로 큼&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;JOIN 전 키 카디널리티 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;2. Attribution window 누락&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;채널별 ROAS가 일관되게 낮음&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;window 설정 테이블, BETWEEN timestamp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;3. Timezone 미스매치&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;요일별로 ROAS가 비정상 패턴&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;raw=UTC, 보고=KST 통일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;4. Conversion lag&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;어제 수치가 매일 바뀜&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;T+3 freeze + 스냅샷&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;5. 환율&amp;middot;통화&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;ROAS 단위가 비현실적 (1300배 또는 1/1300)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;currency 컬럼 + 일자별 fx_rate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;6. 채널 매핑&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;같은 채널이 여러 행으로 쪼개짐&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;정규화 lookup + 모니터링&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;7. Dedup&amp;middot;식별자&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;unique user 수가 부풀려짐&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;ID resolution + window function&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7가지를 한 번에 다 해결하려고 하지 마세요. 1&amp;middot;2&amp;middot;3은 SQL 표준 정착으로, 4는 운영 정책으로, 5&amp;middot;6은 데이터 거버넌스로, 7은 데이터 모델로 풀어야 합니다. 각각 다른 사람이 책임자라는 뜻이에요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BI팀과 마케팅팀의 ROAS가 안 맞을 때, 회의에서 &quot;데이터가 틀린 것 같아요&quot;보다 &quot;이 7가지 함정 중 어디서 깨졌을까요&quot;로 시작하면 훨씬 건강한 대화가 됩니다. 데이터는 거의 안 틀려요. 거의 항상 SQL 한 줄이 틀려있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://support.google.com/analytics/answer/7029846&quot;&gt;GA4 BigQuery export schema 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.getdbt.com/reference/dbt-jinja-functions&quot;&gt;dbt 공식 &amp;mdash; surrogate_key&amp;middot;dedup 매크로&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.facebook.com/docs/marketing-api/insights/parameters&quot;&gt;Meta Marketing API &amp;mdash; attribution windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.fivetran.com/blog&quot;&gt;Modern Data Stack &amp;mdash; attribution modeling 사례 (Fivetran 블로그)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;사내 글: &lt;a href=&quot;https://blog.trysitely.com/posts/ga4-bigquery-roas&quot;&gt;GA4 + BigQuery로 ROAS 파이프라인 직접 만들기&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;사내 글: &lt;a href=&quot;https://blog.trysitely.com/posts/ad-data-flow&quot;&gt;광고 측정 데이터 흐름 &amp;mdash; impression부터 BI까지&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;사내 글: &lt;a href=&quot;https://blog.trysitely.com/posts/bayesian-attribution&quot;&gt;베이지안 어트리뷰션 &amp;mdash; 적은 데이터로 더 안정적인 이유&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;사내 글: &lt;a href=&quot;https://blog.trysitely.com/posts/cdp-id-graph&quot;&gt;CDP 시대의 ID 그래프&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/article&gt;</description>
      <category>Analytics Ops (GA4&amp;middot;GTM)</category>
      <category>attribution</category>
      <category>BI</category>
      <category>data-quality</category>
      <category>ROAS</category>
      <category>SQL</category>
      <author>Aramir</author>
      <guid isPermaLink="true">https://code77.tistory.com/106</guid>
      <comments>https://code77.tistory.com/106#entry106comment</comments>
      <pubDate>Sat, 16 May 2026 18:05:53 +0900</pubDate>
    </item>
    <item>
      <title>매체 raw data 컬럼 가이드 &amp;mdash; Meta, Google, TikTok, Naver의 진짜 컬럼들</title>
      <link>https://code77.tistory.com/105</link>
      <description>&lt;article class=&quot;tistory-mirror-post&quot; data-source-slug=&quot;raw-data-meta-google-tiktok-naver&quot;&gt;
&lt;p class=&quot;tistory-description&quot; data-ke-size=&quot;size16&quot;&gt;Meta&amp;middot;Google&amp;middot;TikTok&amp;middot;Naver 각 매체가 주는 raw export 컬럼을 한 표로 매핑합니다. spend&amp;middot;impression&amp;middot;click&amp;middot;conversion&amp;middot;video view&amp;middot;viewability까지, 같은 의미가 매체마다 어떻게 다른 이름으로 들어오는지 정리합니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Meta API의 &lt;code&gt;actions&lt;/code&gt;, Google Ads의 &lt;code&gt;conversions&lt;/code&gt;, TikTok의 &lt;code&gt;result&lt;/code&gt;, Naver SA의 &lt;code&gt;conversion_count&lt;/code&gt;. 셋 다 다른 이름이지만 비슷한 의미예요. 그런데 미묘하게 다릅니다. 마케터&amp;middot;BI팀이 매체 raw data를 다룰 때 가장 자주 깨지는 자리는 이 &quot;비슷하지만 다른&quot; 컬럼들을 잘못 매핑하는 자리예요. 이 글은 네 매체의 raw export 컬럼을 한 표로 매핑하고, 각 컬럼이 진짜로 무엇을 뜻하는지를 풀어둡니다. 매일 raw data 다루는 분 옆에 두는 사전 한 권.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;왜 매체별 raw data를 알아야 하나&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매체 UI 대시보드는 잘 그려졌지만 다음 분석을 하려면 raw data가 필요합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;매체 간 통합 대시보드 (한 BI에 4개 매체 ROAS를 동시에)&lt;/li&gt;
&lt;li&gt;MMM 입력 (일자별&amp;middot;채널별 spend&amp;middot;impression&amp;middot;click&amp;middot;conversion)&lt;/li&gt;
&lt;li&gt;자체 attribution (last-click&amp;middot;data-driven 대신 자사 룰)&lt;/li&gt;
&lt;li&gt;매체 default와 다른 lookback window로 재계산&lt;/li&gt;
&lt;li&gt;클릭별&amp;middot;소재별 deep dive&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매체 raw를 직접 다룰 때 가장 큰 함정은 컬럼 이름이 매체마다 다르고, 같은 이름의 컬럼도 정의가 다를 수 있다는 점입니다. &quot;conversion&quot;이라는 같은 단어가 매체마다 다른 걸 가리켜요.&lt;/p&gt;
&lt;figure class=&quot;tistory-figure&quot; style=&quot;margin: 28px 0; text-align: center;&quot;&gt;&lt;img style=&quot;max-width: 100%; height: auto; border-radius: 10px;&quot; src=&quot;https://blog.trysitely.com/img/raw-data-meta-google-tiktok-naver-hero.png&quot; alt=&quot;Meta&amp;middot;Google&amp;middot;TikTok&amp;middot;Naver raw data 컬럼 매핑 인포그래픽&quot; /&gt;
&lt;figcaption style=&quot;margin-top: 10px; color: #5b6474; font-size: 0.92em; line-height: 1.6;&quot;&gt;네 매체의 컬럼은 이름이 달라도 spend&amp;middot;impression&amp;middot;click&amp;middot;conversion&amp;middot;video 5개 그룹으로 매핑하면 한 번에 보인다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5초 매핑 &amp;mdash; 4개 매체 컬럼 한 표&lt;/h2&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;의미&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;Meta (Marketing API)&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;Google Ads (Ads API)&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;TikTok (Marketing API)&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;Naver SA&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;캠페인 ID&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;campaign_id&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;campaign.id&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;campaign_id&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;nccCampaignId&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;광고 그룹&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;adset_id&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;ad_group.id&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;adgroup_id&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;nccAdgroupId&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;소재&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;ad_id&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;ad.id&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;ad_id&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;nccCreativeId&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;노출&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;impressions&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;metrics.impressions&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;impressions&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;impCnt&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;클릭&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;clicks&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;metrics.clicks&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;clicks&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;clkCnt&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;비용&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;spend&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;metrics.cost_micros&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;spend&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;salesAmt&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;전환 수&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;actions&lt;/code&gt; (nested)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;metrics.conversions&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;result&lt;/code&gt; / &lt;code&gt;conversion&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;convCnt&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;전환 가치&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;action_values&lt;/code&gt; (nested)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;metrics.conversions_value&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;total_purchase_value&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;convAmt&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;비디오 25% 시청&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;video_p25_watched_actions&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;video_quartile_p25_rate&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;video_play_25_rate&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;(없음)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Viewability&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;video_avg_time_watched_actions&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;metrics.active_view_viewable_impressions&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;viewable_impressions&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;(별도)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Reach&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;reach&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;metrics.unique_users&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;reach&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;(별도)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Frequency&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;frequency&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;metrics.avg_impression_frequency_per_user&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;frequency&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;(별도)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 표 하나를 옆에 두면 매체 raw data SQL을 짤 때 막힐 일이 거의 없습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Meta Marketing API 핵심 컬럼&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Meta의 raw 데이터는 &lt;code&gt;actions&lt;/code&gt;라는 nested array가 가장 큰 함정입니다. 한 row 안에 여러 종류의 전환이 array로 들어있고, 각각의 attribution window별 값이 또 따로예요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자주 쓰는 액션 타입:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;purchase&lt;/code&gt; &amp;mdash; 구매&lt;/li&gt;
&lt;li&gt;&lt;code&gt;add_to_cart&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;initiate_checkout&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;complete_registration&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lead&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;app_install&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mobile_app_install&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 액션의 attribution 값은 &lt;code&gt;1d_click&lt;/code&gt;, &lt;code&gt;7d_click&lt;/code&gt;, &lt;code&gt;28d_click&lt;/code&gt;, &lt;code&gt;1d_view&lt;/code&gt;, &lt;code&gt;7d_view&lt;/code&gt; 같은 sub-field로 들어옵니다. 그래서 같은 &lt;code&gt;purchase&lt;/code&gt; 액션도 윈도우별로 다른 값이 동시에 들어있어요.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;Meta 액션 컬럼&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;의미&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;actions[action_type=purchase].value&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;기본 attribution 윈도우의 전환 수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;actions[action_type=purchase]._1d_click&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1일 click attribution 윈도우&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;actions[action_type=purchase]._7d_click&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;7일 click attribution 윈도우&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;actions[action_type=purchase]._1d_view&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;1일 view attribution 윈도우&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;action_values[action_type=purchase].value&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;전환 가치 (매출)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;raw export를 BigQuery로 적재할 때 actions array를 풀어서 store하는 게 표준입니다. UNNEST + 액션 타입 필터로 분석하세요.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--warn&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;Meta의 spend는 광고주 통화&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Meta &lt;code&gt;spend&lt;/code&gt;는 광고주가 광고 매니저에서 설정한 통화로 들어옵니다. 다국가 캠페인을 KRW로 합치려면 일자별 환율 매칭이 필수예요. &lt;a href=&quot;https://blog.trysitely.com/posts/sqlbi-7-roas-sql&quot;&gt;SQL 안티패턴 글&lt;/a&gt;의 함정 5에서 다뤘던 패턴이 여기서 자주 깨집니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Google Ads API 핵심 컬럼&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Google Ads API는 &lt;code&gt;cost_micros&lt;/code&gt; 같은 단위가 특이합니다. 비용이 1원이면 1,000,000 micros로 들어와요. 1000000 나눠야 일반 단위가 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자주 쓰는 컬럼:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;metrics.cost_micros&lt;/code&gt; &amp;mdash; 1,000,000 나누면 원&lt;/li&gt;
&lt;li&gt;&lt;code&gt;metrics.impressions&lt;/code&gt; &amp;mdash; 노출 수&lt;/li&gt;
&lt;li&gt;&lt;code&gt;metrics.clicks&lt;/code&gt; &amp;mdash; 클릭 수&lt;/li&gt;
&lt;li&gt;&lt;code&gt;metrics.conversions&lt;/code&gt; &amp;mdash; 전환 수 (float, 부분 attribution 가능)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;metrics.conversions_value&lt;/code&gt; &amp;mdash; 전환 가치&lt;/li&gt;
&lt;li&gt;&lt;code&gt;metrics.all_conversions&lt;/code&gt; &amp;mdash; 모든 전환 액션 합산 (multi action conversion)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;metrics.view_through_conversions&lt;/code&gt; &amp;mdash; view-through 전환만&lt;/li&gt;
&lt;li&gt;&lt;code&gt;metrics.search_impression_share&lt;/code&gt; &amp;mdash; 검색 인벤토리 점유율&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Google Ads는 conversion이 float인 게 인상적입니다. data-driven attribution에서 한 클릭이 부분 전환을 만들 수 있어 0.4 같은 값이 나옵니다. 이걸 INT로 변환하면 안 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전환 액션을 따로 보려면 &lt;code&gt;conversion_action&lt;/code&gt; 리소스를 따로 쿼리해서 액션 ID별로 metrics를 분해해야 합니다. 예를 들어 매출 전환과 lead 전환을 분리해서 ROAS&amp;middot;CPL을 따로 계산하려면 그 단계가 필요해요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;TikTok Marketing API 핵심 컬럼&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TikTok은 비교적 최근 회사라 API가 깔끔합니다. RESTful + JSON, 단위가 직관적.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자주 쓰는 컬럼:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;spend&lt;/code&gt; &amp;mdash; 비용 (광고주 통화)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;impressions&lt;/code&gt; / &lt;code&gt;clicks&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;result&lt;/code&gt; &amp;mdash; TikTok이 정의한 최적화 목표(설치&amp;middot;구매 등)에 따른 결과&lt;/li&gt;
&lt;li&gt;&lt;code&gt;conversion&lt;/code&gt; &amp;mdash; 픽셀&amp;middot;이벤트로 측정한 전환&lt;/li&gt;
&lt;li&gt;&lt;code&gt;total_purchase&lt;/code&gt; &amp;mdash; 구매 수&lt;/li&gt;
&lt;li&gt;&lt;code&gt;total_purchase_value&lt;/code&gt; &amp;mdash; 매출&lt;/li&gt;
&lt;li&gt;&lt;code&gt;video_play_actions&lt;/code&gt; &amp;mdash; 비디오 재생 시작 수&lt;/li&gt;
&lt;li&gt;&lt;code&gt;video_play_25_rate&lt;/code&gt; &amp;mdash; 25% 시청 비율&lt;/li&gt;
&lt;li&gt;&lt;code&gt;video_play_100_rate&lt;/code&gt; &amp;mdash; 100% 시청 비율&lt;/li&gt;
&lt;li&gt;&lt;code&gt;engagements&lt;/code&gt; &amp;mdash; 좋아요&amp;middot;댓글&amp;middot;공유 합&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TikTok의 &lt;code&gt;result&lt;/code&gt; 컬럼은 캠페인 최적화 목표에 따라 의미가 바뀝니다. 설치 목표 캠페인의 result는 설치 수, 구매 목표 캠페인의 result는 구매 수. 그래서 캠페인 타입 메타데이터와 함께 봐야 의미가 잡힙니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비디오 광고가 많은 TikTok 특성상 &lt;code&gt;video_play_*&lt;/code&gt; 시리즈가 굉장히 중요해요. 25%&amp;middot;50%&amp;middot;75%&amp;middot;100% 시청률은 크리에이티브 평가의 핵심 KPI입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Naver SA&amp;middot;DA 핵심 컬럼&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Naver는 국내 마케터에게는 빠질 수 없는 매체. 컬럼 이름이 국문 도메인이라 살짝 헷갈리지만 매핑은 단순해요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자주 쓰는 컬럼:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;nccCampaignId&lt;/code&gt; / &lt;code&gt;nccAdgroupId&lt;/code&gt; / &lt;code&gt;nccKeywordId&lt;/code&gt; / &lt;code&gt;nccCreativeId&lt;/code&gt; &amp;mdash; 4단계 계층&lt;/li&gt;
&lt;li&gt;&lt;code&gt;impCnt&lt;/code&gt; &amp;mdash; 노출 수&lt;/li&gt;
&lt;li&gt;&lt;code&gt;clkCnt&lt;/code&gt; &amp;mdash; 클릭 수&lt;/li&gt;
&lt;li&gt;&lt;code&gt;salesAmt&lt;/code&gt; &amp;mdash; 비용 (원)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;convCnt&lt;/code&gt; &amp;mdash; 전환 수&lt;/li&gt;
&lt;li&gt;&lt;code&gt;convAmt&lt;/code&gt; &amp;mdash; 전환 가치&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ctr&lt;/code&gt; &amp;mdash; CTR (Naver가 직접 계산해서 줌)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cpc&lt;/code&gt; &amp;mdash; CPC&lt;/li&gt;
&lt;li&gt;&lt;code&gt;avgRnk&lt;/code&gt; &amp;mdash; 평균 노출 순위 (검색 광고)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Naver는 검색(SA)과 디스플레이(DA) API가 분리되어 있어요. 같은 컬럼 이름도 SA와 DA에서 미묘하게 의미가 다를 수 있어 SA&amp;middot;DA를 다른 raw 테이블로 적재하는 게 표준입니다.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--note&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;Naver의 conversion은 'NTM script'를 박은 페이지 기준&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Naver의 전환 측정은 사이트에 박힌 NTM(Naver Tag Manager) 스크립트가 보내는 이벤트 기준입니다. GA4 conversion과 정의가 다를 수 있어요. 사이트에 NTM 스크립트가 빠진 페이지의 전환은 Naver raw에 안 잡힙니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;매체별 같은 의미&amp;middot;다른 정의&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 단어인데 매체마다 정의가 다른 컬럼들:&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;단어&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;Meta&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;Google&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;TikTok&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;Naver&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Impression&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;광고가 사용자 viewport에 로드&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;광고가 검색결과/페이지에 표시&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;광고가 피드에 표시&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;광고가 검색결과에 노출&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Click&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;link/post click&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;검색 결과 클릭&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;광고 영역 모든 클릭 (link&amp;middot;profile&amp;middot;video)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;광고 클릭&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Reach&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;광고를 본 unique user&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;광고를 본 unique user (cookie 기반)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;광고를 본 unique device&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;(별도 컬럼)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Frequency&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;reach 평균 노출 횟수&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;impressions / reach&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;impressions / reach&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;(별도)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Viewability&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;MRC 기준 (50%&amp;middot;1초)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;active view&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;MRC 기준&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;(별도)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 click의 정의가 큽니다. TikTok의 click에는 video play, profile click 같은 비-link click이 다 포함됩니다. CTR을 매체 간 비교할 때 그대로 비교하면 TikTok이 항상 높아 보여요. link click만 분리해서 봐야 공평한 비교가 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;통합 BI 테이블 설계 권장&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매체 raw를 한 BI 테이블로 합칠 때 표준 스키마는 이렇습니다.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;컬럼&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;타입&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;의미&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;date&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;DATE&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;데이터 기준 일자 (KST)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;media_source&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;STRING&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;meta / google / tiktok / naver&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;campaign_id&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;STRING&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;매체 캠페인 ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;campaign_name&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;STRING&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;캠페인 이름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;adset_id&lt;/code&gt; / &lt;code&gt;adset_name&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;STRING&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;광고 그룹&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;ad_id&lt;/code&gt; / &lt;code&gt;ad_name&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;STRING&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;소재&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;impressions&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;INT&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;노출&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;clicks&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;INT&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;link click 기준&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;spend_krw&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;NUMERIC&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;환율 변환된 비용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;conversions&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;NUMERIC&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;전환 수 (float 허용)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;conversion_value_krw&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;NUMERIC&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;전환 가치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;attribution_window&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;STRING&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&quot;click_7d_view_1d&quot; 같은 라벨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;currency_original&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;STRING&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;원본 통화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;spend_original&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;NUMERIC&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;원본 통화 비용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 스키마를 정의해두면 새 매체를 추가할 때도 매핑만 작성하면 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마치며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매체 raw data는 컬럼이 많지만 그룹 매핑 한 번 해두면 통합 BI가 빠르게 굴러갑니다. 매체가 추가될 때마다 위 스키마에 맞춰 ETL을 짜면 새 매체 추가 비용이 1-2주에서 1-2일로 줄어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 글은 raw data에서 마케터가 가장 헷갈리는 트래픽 소스 &amp;mdash; Organic&amp;middot;Direct&amp;middot;Referral의 4가지 정의를 &lt;a href=&quot;https://blog.trysitely.com/posts/organicdirectreferral-ga4-mmp-amplitude-organic-4&quot;&gt;organicdirectreferral-ga4-mmp-amplitude-organic-4&lt;/a&gt;에서 다룹니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.facebook.com/docs/marketing-api/insights&quot;&gt;Meta Marketing API &amp;mdash; Insights&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/google-ads/api/fields/v17/metrics&quot;&gt;Google Ads API &amp;mdash; Metrics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://business-api.tiktok.com/portal/docs?id=1738864847838721&quot;&gt;TikTok Marketing API &amp;mdash; Reporting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/naver/searchad-apidoc&quot;&gt;Naver Search Ad API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;사내 글: &lt;a href=&quot;https://blog.trysitely.com/posts/ga4-bigquery-roas&quot;&gt;GA4 + BigQuery로 ROAS 파이프라인 직접 만들기&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;사내 글: &lt;a href=&quot;https://blog.trysitely.com/posts/ad-data-flow&quot;&gt;광고 측정 데이터 흐름&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;사내 글: &lt;a href=&quot;https://blog.trysitely.com/posts/sqlbi-7-roas-sql&quot;&gt;광고 SQL&amp;middot;BI 안티패턴 7가지&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;사내 글: &lt;a href=&quot;https://blog.trysitely.com/posts/mmp-raw-export-appsflyer-adjust-branch&quot;&gt;MMP raw export 컬럼 사전&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/article&gt;</description>
      <category>매체 데이터 알아보기</category>
      <category>data-pipeline</category>
      <category>google-ads</category>
      <category>meta</category>
      <category>naver</category>
      <category>raw-data</category>
      <category>tiktok</category>
      <author>Aramir</author>
      <guid isPermaLink="true">https://code77.tistory.com/105</guid>
      <comments>https://code77.tistory.com/105#entry105comment</comments>
      <pubDate>Sat, 16 May 2026 18:05:00 +0900</pubDate>
    </item>
    <item>
      <title>Organic&amp;middot;Direct&amp;middot;Referral의 진실 &amp;mdash; GA4, MMP, Amplitude가 organic을 부르는 4가지 방식</title>
      <link>https://code77.tistory.com/104</link>
      <description>&lt;article class=&quot;tistory-mirror-post&quot; data-source-slug=&quot;organicdirectreferral-ga4-mmp-amplitude-organic-4&quot;&gt;
&lt;p class=&quot;tistory-description&quot; data-ke-size=&quot;size16&quot;&gt;GA4의 organic search, MMP의 Organic, Amplitude의 Direct, GA4의 (direct)/(none). 같은 단어가 도구마다 다른 의미예요. 4가지 정의를 한 글로 정리하고 dark traffic&amp;middot;attribution 누락을 어떻게 분리하는지를 풉니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;지난주 organic 트래픽이 갑자기 30% 늘었어요. SEO 효과인가요?&quot; 이 질문 하나에 답하려고 BI팀과 마케팅팀이 한 시간씩 회의를 합니다. 그런데 자세히 보면 GA4 organic, MMP Organic, Amplitude Direct, 자사 BI의 unknown이 다 다른 걸 뜻하고 있어요. 같은 organic이라는 단어가 도구마다 의미가 다릅니다. 이 글은 organic&amp;middot;direct&amp;middot;referral의 4가지 정의를 한 표로 매핑하고, &quot;진짜 SEO 트래픽&quot;과 &quot;attribution 누락 dark traffic&quot;을 어떻게 분리하는지 정리합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;왜 organic의 정의가 도구마다 다른가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;organic이라는 단어는 직관적으로 &quot;광고비를 안 쓴 트래픽&quot;으로 들립니다. 그런데 실제로는 도구마다 측정 방식이 달라서 정의가 갈립니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GA4는 utm&amp;middot;referrer&amp;middot;landing 정보로 organic&amp;middot;direct&amp;middot;referral&amp;middot;paid를 판단&lt;/li&gt;
&lt;li&gt;MMP는 attribution이 실패한 install을 Organic으로 부름&lt;/li&gt;
&lt;li&gt;Amplitude는 첫 세션의 referrer로 acquisition channel을 판단&lt;/li&gt;
&lt;li&gt;자사 BI는 자체 규칙으로 분류&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 사용자, 같은 방문이라도 도구마다 다른 채널로 분류돼요. 이 차이를 모르고 비교하면 답이 안 나오는 회의가 됩니다.&lt;/p&gt;
&lt;figure class=&quot;tistory-figure&quot; style=&quot;margin: 28px 0; text-align: center;&quot;&gt;&lt;img style=&quot;max-width: 100%; height: auto; border-radius: 10px;&quot; src=&quot;https://blog.trysitely.com/img/organicdirectreferral-ga4-mmp-amplitude-organic-4-hero.png&quot; alt=&quot;GA4&amp;middot;MMP&amp;middot;Amplitude&amp;middot;BI에서 organic의 4가지 다른 정의 다이어그램&quot; /&gt;
&lt;figcaption style=&quot;margin-top: 10px; color: #5b6474; font-size: 0.92em; line-height: 1.6;&quot;&gt;organic이라는 단어 한 개로 네 가지 다른 트래픽이 묶인다. SEO&amp;middot;dark traffic&amp;middot;attribution 실패&amp;middot;진짜 직접 방문을 분리해야 의사결정이 가능해진다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4가지 정의 &amp;mdash; 한 표&lt;/h2&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;도구&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;&quot;Organic&quot; / 유사 라벨&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;진짜 의미&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;GA4&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;organic search&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;검색 엔진 referrer가 잡힌 자연 검색&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;GA4&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;(direct) / (none)&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;utm&amp;middot;referrer 모두 없음 (북마크&amp;middot;앱&amp;middot;dark traffic)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;MMP (Appsflyer 등)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;Organic&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;attribution이 어느 매체에도 안 잡힘&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Amplitude&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;Direct&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;첫 세션의 referrer가 비어있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;자사 BI&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;unknown&lt;/code&gt; / &lt;code&gt;untagged&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;채널 매핑 lookup이 실패한 경우&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 5가지가 다 다른 트래픽을 뜻해요. 같은 단어로 부르지만 마케터가 의사결정할 때는 분리해서 보는 게 정확합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;GA4의 organic search vs (direct)/(none)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GA4의 acquisition channel은 한 마디로 referrer + utm 분석입니다. 사용자가 방문할 때 가져오는 정보로 채널을 추론해요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;utm_source/medium이 박혀있으면 &amp;rarr; 해당 매체로 분류&lt;/li&gt;
&lt;li&gt;referrer가 검색 엔진(google.com/search 등)이면 &amp;rarr; organic search&lt;/li&gt;
&lt;li&gt;referrer가 일반 사이트면 &amp;rarr; referral&lt;/li&gt;
&lt;li&gt;utm도 없고 referrer도 없으면 &amp;rarr; &lt;code&gt;(direct) / (none)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;(direct) / (none)&lt;/code&gt; 버킷이 가장 큰 함정이에요. 이 안에는 진짜 직접 방문(북마크&amp;middot;URL 직접 입력) 외에 다음이 다 섞여 있어요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTTPS &amp;rarr; HTTP 전환으로 referrer가 떨어진 트래픽&lt;/li&gt;
&lt;li&gt;모바일 앱 deeplink (referrer 없음)&lt;/li&gt;
&lt;li&gt;이메일&amp;middot;메신저 내장 브라우저 (referrer 정책 제한)&lt;/li&gt;
&lt;li&gt;utm 빠뜨린 광고 클릭&lt;/li&gt;
&lt;li&gt;도메인 직접 입력 (진짜 direct)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흔히 (direct)/(none)이 전체 트래픽의 20~40%인 사이트가 많은데, 이 안에서 진짜 direct는 절반도 안 되는 경우가 흔해요. 나머지가 다 dark traffic입니다.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--warn&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;(direct)/(none)이 늘면 dark traffic 의심부터&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GA4 (direct)/(none) 트래픽이 어느 날 갑자기 30% 늘었다면 사이트 인기가 폭증한 게 아니라 utm 누락이 늘었거나 referrer가 떨어지는 트래픽이 늘었을 가능성이 큽니다. 진짜 direct는 보통 천천히 늘어요.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;MMP의 Organic은 attribution 실패다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱 마케팅에서 MMP raw data의 &lt;code&gt;media_source = Organic&lt;/code&gt;은 &quot;SEO로 들어왔다&quot;가 아닙니다. &quot;attribution이 어느 매체에도 매칭되지 않았다&quot;는 뜻이에요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기 들어가는 트래픽:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;App Store / Google Play의 검색 트래픽 (진짜 organic)&lt;/li&gt;
&lt;li&gt;친구 추천으로 검색 후 설치&lt;/li&gt;
&lt;li&gt;이전 사용자 재설치 (window 지난 reattribution)&lt;/li&gt;
&lt;li&gt;iOS ATT 거부로 attribution 못 잡은 광고 트래픽&lt;/li&gt;
&lt;li&gt;click_id가 누락된 광고 트래픽&lt;/li&gt;
&lt;li&gt;광고 SDK가 늦게 초기화되어 매칭 못 한 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iOS 14.5 ATT 이후 MMP Organic 비율이 갑자기 40%로 늘어난 게 마지막 3개 항목 때문이에요. 진짜 organic이 늘어난 게 아니라 attribution 실패가 늘어난 거예요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Organic 분해 분석:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;App Store / Play Store referrer가 잡힌 트래픽 &amp;rarr; 진짜 organic&lt;/li&gt;
&lt;li&gt;IDFA가 NULL이고 click_id 없는 트래픽 &amp;rarr; ATT 실패 의심&lt;/li&gt;
&lt;li&gt;같은 user의 reinstall 흔적이 있는 트래픽 &amp;rarr; reattribution 누락&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 식으로 Organic 안을 다시 분류해야 진짜 SEO&amp;middot;ASO 효과와 attribution 실패를 분리할 수 있어요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Amplitude의 Direct는 첫 세션 기준&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Amplitude&amp;middot;Mixpanel 같은 product analytics는 user-level의 첫 세션 referrer를 acquisition channel로 잡습니다. GA4가 매 세션 기준이라면 product analytics는 사용자 기준이에요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 차이가 만드는 함정:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;같은 사용자의 모든 후속 세션도 첫 채널로 attribution&lt;/li&gt;
&lt;li&gt;첫 방문이 (direct)면 그 사용자는 평생 Direct user&lt;/li&gt;
&lt;li&gt;광고로 처음 들어왔다가 나중에 organic으로 재방문해도 acquisition은 광고&lt;/li&gt;
&lt;li&gt;광고 첫 방문 후 attribution이 30일 지나 만료되면 Direct로 잡힘&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;product analytics의 acquisition은 &quot;이 user를 누가 데려왔나&quot;의 답이라 광고 ROAS 계산에는 적합하지 않아요. 광고 ROAS는 매체 raw 또는 MMP를 봐야 하고, product analytics는 코호트&amp;middot;retention&amp;middot;funnel 분석에 씁니다.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--note&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;GA4와 Amplitude의 channel 차이&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 사용자의 같은 세션이 GA4에서는 organic search로, Amplitude에서는 Direct로 잡힐 수 있어요. GA4는 그 세션의 referrer를, Amplitude는 그 user의 첫 세션 referrer를 봤기 때문이에요. 둘 다 맞지만 다른 질문에 답하고 있을 뿐.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자사 BI의 unknown은 채널 매핑 실패다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자사 BI에서 별도 unknown/untagged 버킷이 있는 회사가 많습니다. 이건 보통 채널 매핑 lookup 테이블이 실패한 경우예요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새 매체가 추가됐는데 매핑이 아직 없음&lt;/li&gt;
&lt;li&gt;utm_source 표기가 lookup에 없는 값&lt;/li&gt;
&lt;li&gt;마케터가 새 캠페인에 자체 utm을 박았는데 표준화 안 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 unknown은 직접 잡을 수 있는 자리예요. 매주 unknown TOP 10을 모니터링하고 매핑에 추가하면 보통 사라집니다. &lt;a href=&quot;https://blog.trysitely.com/posts/sqlbi-7-roas-sql&quot;&gt;SQL 안티패턴 글의 함정 6&lt;/a&gt;에서 다뤘던 채널 매핑 거버넌스가 이걸 다룹니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Dark traffic을 줄이는 운영 표준&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진짜 direct(북마크&amp;middot;URL 입력)와 dark traffic을 분리하지 않으면 의사결정이 흐려집니다. dark traffic을 줄이는 운영 표준을 정리해볼게요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 광고 링크에 utm 5종 박기 (source, medium, campaign, content, term)&lt;/li&gt;
&lt;li&gt;사내 표준 utm 형식 (소문자&amp;middot;하이픈&amp;middot;캠페인 코드 prefix)&lt;/li&gt;
&lt;li&gt;HTTPS &amp;rarr; HTTPS만 referrer 살아남으니 외부 링크는 HTTPS 강제&lt;/li&gt;
&lt;li&gt;이메일&amp;middot;메신저 deeplink에는 별도 source 라벨 (예: utm_source=newsletter)&lt;/li&gt;
&lt;li&gt;모바일 앱에 들어가는 deeplink는 별도 utm 박기&lt;/li&gt;
&lt;li&gt;광고 매체별 click_id 자동 파라미터를 사이트가 인식해 저장 (gclid, fbclid, ttclid 등)&lt;/li&gt;
&lt;li&gt;referrer 떨어지는 케이스를 GA4 referrer override로 보정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 7가지를 다 해도 (direct)/(none)이 0이 되지는 않습니다. 진짜 direct는 어느 정도 남아요. 다만 dark traffic 비중이 20%에서 5% 수준으로 줄어듭니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;진짜 SEO 효과를 측정하는 법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;organic이 늘었다&quot;가 SEO 효과인지 확인하려면 다음 분리가 필요합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;검색 엔진별 트래픽 (Google&amp;middot;Naver&amp;middot;Bing&amp;middot;DuckDuckGo) &amp;mdash; Search Console&amp;middot;Naver Search Advisor 연결&lt;/li&gt;
&lt;li&gt;검색 키워드별 트래픽 &amp;mdash; 키워드 클러스터링&lt;/li&gt;
&lt;li&gt;랜딩 페이지별 organic 트래픽 &amp;mdash; 콘텐츠 단위 SEO 효과&lt;/li&gt;
&lt;li&gt;신규 vs 재방문 organic 분리&lt;/li&gt;
&lt;li&gt;(direct)/(none) 안의 진짜 direct 추정 (북마크&amp;middot;URL 입력)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 모든 분리를 GA4 UI에서만 하기는 어려워서 BigQuery export 기반 자체 SEO 대시보드를 만드는 게 표준입니다. Google Search Console API와 GA4 raw event를 매칭해서 키워드 &amp;rarr; 랜딩 페이지 &amp;rarr; 전환의 흐름을 보는 거예요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;organic 분류 의사결정 체크리스트&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;organic이 늘었다&quot; &amp;rarr; 어느 도구의 organic인지 먼저 확인&lt;/li&gt;
&lt;li&gt;GA4 organic search 늘었다 &amp;rarr; 검색 엔진별&amp;middot;키워드별 분해&lt;/li&gt;
&lt;li&gt;GA4 (direct)/(none) 늘었다 &amp;rarr; dark traffic 의심부터, utm 누락&amp;middot;referrer 떨어짐 점검&lt;/li&gt;
&lt;li&gt;MMP Organic 늘었다 &amp;rarr; attribution 실패 분해, ATT 거부율&amp;middot;매체별 SDK 체크&lt;/li&gt;
&lt;li&gt;Amplitude Direct 늘었다 &amp;rarr; 신규 user의 referrer가 떨어지는 경로 점검&lt;/li&gt;
&lt;li&gt;자사 BI unknown 늘었다 &amp;rarr; 채널 매핑 lookup에 새 utm 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마치며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;organic은 한 단어인데 도구마다 다른 4가지 의미가 들어가 있다는 사실 하나만 알아도 보고서 회의 시간이 절반으로 줄어듭니다. 모든 분석의 시작은 &quot;어느 도구의 organic이에요?&quot; 한 질문이에요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 글은 SEO의 다음 진화 &amp;mdash; LLM 답변에 우리 브랜드를 노출시키는 &lt;a href=&quot;https://blog.trysitely.com/posts/generative-engine-optimization-llm-seo&quot;&gt;Generative Engine Optimization&lt;/a&gt;으로 이어집니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://support.google.com/analytics/answer/9756891&quot;&gt;GA4 &amp;mdash; Default channel groups&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.appsflyer.com/hc/en-us/articles/207377436&quot;&gt;Appsflyer &amp;mdash; Organic vs Non-Organic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.amplitude.com/hc/en-us/articles/115002935568&quot;&gt;Amplitude &amp;mdash; Attribution and channels&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/webmaster-tools&quot;&gt;Google Search Console API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;사내 글: &lt;a href=&quot;https://blog.trysitely.com/posts/attribution-history&quot;&gt;어트리뷰션의 역사&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;사내 글: &lt;a href=&quot;https://blog.trysitely.com/posts/ios-att-skadnetwork-aem&quot;&gt;iOS ATT와 SKAdNetwork&amp;middot;AEM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;사내 글: &lt;a href=&quot;https://blog.trysitely.com/posts/sqlbi-7-roas-sql&quot;&gt;광고 SQL&amp;middot;BI 안티패턴 7가지&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;사내 글: &lt;a href=&quot;https://blog.trysitely.com/posts/mmp-raw-export-appsflyer-adjust-branch&quot;&gt;MMP raw export 컬럼 사전&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/article&gt;</description>
      <category>매체 데이터 알아보기</category>
      <category>Amplitude</category>
      <category>attribution</category>
      <category>dark-traffic</category>
      <category>GA4</category>
      <category>MMP</category>
      <category>Organic</category>
      <author>Aramir</author>
      <guid isPermaLink="true">https://code77.tistory.com/104</guid>
      <comments>https://code77.tistory.com/104#entry104comment</comments>
      <pubDate>Sat, 16 May 2026 18:04:08 +0900</pubDate>
    </item>
    <item>
      <title>MMP raw export 컬럼 사전 &amp;mdash; Appsflyer, Adjust, Branch가 주는 진짜 데이터</title>
      <link>https://code77.tistory.com/103</link>
      <description>&lt;article class=&quot;tistory-mirror-post&quot; data-source-slug=&quot;mmp-raw-export-appsflyer-adjust-branch&quot;&gt;
&lt;p class=&quot;tistory-description&quot; data-ke-size=&quot;size16&quot;&gt;Appsflyer&amp;middot;Adjust&amp;middot;Branch raw export에는 어떤 컬럼이 있고 각 컬럼이 진짜로 무엇을 뜻하는지. media_source&amp;middot;campaign&amp;middot;af_status&amp;middot;reattribution&amp;middot;SKAdNetwork postback 컬럼까지 마케터&amp;middot;데이터팀이 매일 만나는 raw export를 한 글로 정리합니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱 광고 운영자라면 MMP raw export는 매일 만나는 데이터입니다. 그런데 정작 컬럼이 100개가 넘어가는 그 CSV에서 무엇이 진짜 신뢰할 컬럼이고, 무엇이 보조 정보이고, 무엇이 NULL이 많은지를 한 곳에서 정리한 글은 의외로 드물어요. 이 글은 Appsflyer&amp;middot;Adjust&amp;middot;Branch 세 MMP의 raw export 컬럼을 한 표로 정리하고, 각 컬럼이 마케터의 의사결정에서 어떤 의미를 갖는지를 함께 풉니다. 이 글 하나 옆에 두고 raw 데이터 보면 80%의 질문이 끝납니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;왜 raw export를 직접 봐야 하나&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MMP UI 대시보드는 굉장히 잘 만들어졌습니다. 캠페인별 install&amp;middot;revenue&amp;middot;ROAS가 알아서 그려져요. 그런데 운영자가 다음 단계로 가려면 raw export를 직접 만져야 하는 순간이 옵니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;UI ROAS와 BI ROAS가 다르다, 어디서 깨졌나&quot;&lt;/li&gt;
&lt;li&gt;&quot;MMM에 넣을 채널별 install&amp;middot;revenue 일자별 데이터&quot;&lt;/li&gt;
&lt;li&gt;&quot;사내 CDP와 MMP 데이터를 user-level로 매칭&quot;&lt;/li&gt;
&lt;li&gt;&quot;incrementality 분석을 위한 raw event 추출&quot;&lt;/li&gt;
&lt;li&gt;&quot;View-through와 click-through를 분리해서 보고&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 모든 분석의 1번 입력이 MMP raw export입니다. UI는 가공된 요약이라서 원하는 단위&amp;middot;정의로 못 자릅니다.&lt;/p&gt;
&lt;figure class=&quot;tistory-figure&quot; style=&quot;margin: 28px 0; text-align: center;&quot;&gt;&lt;img style=&quot;max-width: 100%; height: auto; border-radius: 10px;&quot; src=&quot;https://blog.trysitely.com/img/mmp-raw-export-appsflyer-adjust-branch-hero.png&quot; alt=&quot;Appsflyer&amp;middot;Adjust&amp;middot;Branch raw export 컬럼 매핑 인포그래픽&quot; /&gt;
&lt;figcaption style=&quot;margin-top: 10px; color: #5b6474; font-size: 0.92em; line-height: 1.6;&quot;&gt;세 MMP의 컬럼은 이름이 다르지만 같은 의미. media_source&amp;middot;campaign&amp;middot;attribution flag&amp;middot;reinstall&amp;middot;postback 5개 그룹으로 매핑하면 한 번에 보인다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5초 요약 &amp;mdash; 세 MMP의 컬럼 매핑 표&lt;/h2&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;의미&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;Appsflyer&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;Adjust&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;Branch&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;매체 이름&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;media_source&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;network_name&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;last_attributed_touch_data_tilde_channel&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;캠페인&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;campaign&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;campaign_name&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;..._tilde_campaign&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;광고 그룹&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;adset&lt;/code&gt; / &lt;code&gt;af_adset&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;adgroup_name&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;..._tilde_ad_set_name&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;소재&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;af_ad&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;creative_name&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;..._tilde_ad_name&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;install 시각&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;install_time&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;installed_at&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;last_attributed_touch_data_plus_timestamp&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;클릭 시각&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;click_time&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;click_time&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;last_attributed_touch_data_plus_click_timestamp&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;사용자 ID&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;appsflyer_id&lt;/code&gt; + &lt;code&gt;customer_user_id&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;adid&lt;/code&gt; + &lt;code&gt;user_id&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;branch_id&lt;/code&gt; + &lt;code&gt;developer_identity&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;디바이스 ID&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;idfa&lt;/code&gt;/&lt;code&gt;idfv&lt;/code&gt;/&lt;code&gt;gaid&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;idfa&lt;/code&gt;/&lt;code&gt;gps_adid&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;idfa&lt;/code&gt;/&lt;code&gt;google_advertising_id&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;매출&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;revenue&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;revenue_usd&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;last_attributed_touch_data_plus_revenue&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;attribution 종류&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;af_status&lt;/code&gt;(Organic/Non-Organic)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;tracker&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;last_attributed_touch_type&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Reattribution&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;is_retargeting&lt;/code&gt; + &lt;code&gt;reattribution_status&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;is_reattributed&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;last_cta_view_timestamp&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;첫 설치인가&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;is_first_session&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;is_first_session&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;(이벤트 type)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 표 한 장으로 MMP 간 데이터 매핑 SQL의 90%가 결정됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Appsflyer 핵심 컬럼&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Appsflyer가 글로벌 1위 MMP인 만큼 raw export 컬럼이 가장 풍부하고, 또 많아서 헷갈립니다. 자주 쓰는 컬럼 그룹을 분류해볼게요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;매체&amp;middot;캠페인 식별&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;media_source&lt;/code&gt; &amp;mdash; 매체 (예: facebook_int, googleadwords_int, organic)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;campaign&lt;/code&gt; / &lt;code&gt;campaign_id&lt;/code&gt; &amp;mdash; 캠페인&lt;/li&gt;
&lt;li&gt;&lt;code&gt;adset&lt;/code&gt; / &lt;code&gt;adset_id&lt;/code&gt; &amp;mdash; 광고 그룹&lt;/li&gt;
&lt;li&gt;&lt;code&gt;af_ad&lt;/code&gt; / &lt;code&gt;af_ad_id&lt;/code&gt; &amp;mdash; 소재&lt;/li&gt;
&lt;li&gt;&lt;code&gt;af_channel&lt;/code&gt; &amp;mdash; 매체가 지정한 채널&lt;/li&gt;
&lt;li&gt;&lt;code&gt;af_keywords&lt;/code&gt; &amp;mdash; 검색 광고의 키워드&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Attribution 결과&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;af_status&lt;/code&gt; &amp;mdash; Organic / Non-Organic. 가장 중요한 분류 컬럼&lt;/li&gt;
&lt;li&gt;&lt;code&gt;attribution_type&lt;/code&gt; &amp;mdash; click_through / view_through / impression&lt;/li&gt;
&lt;li&gt;&lt;code&gt;match_type&lt;/code&gt; &amp;mdash; referrer / probabilistic / id_matching&lt;/li&gt;
&lt;li&gt;&lt;code&gt;is_primary_attribution&lt;/code&gt; &amp;mdash; 같은 install의 multiple touch 중 1차 attribution 여부&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시간&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;install_time&lt;/code&gt; &amp;mdash; 첫 설치 시각 (가장 중요)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;event_time&lt;/code&gt; &amp;mdash; 이 이벤트 시각&lt;/li&gt;
&lt;li&gt;&lt;code&gt;attributed_touch_time&lt;/code&gt; &amp;mdash; 마지막 어트리뷰션 터치 시각&lt;/li&gt;
&lt;li&gt;&lt;code&gt;click_time&lt;/code&gt; &amp;mdash; 마지막 클릭 시각&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;식별자&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;appsflyer_id&lt;/code&gt; &amp;mdash; MMP가 만드는 device-level ID&lt;/li&gt;
&lt;li&gt;&lt;code&gt;customer_user_id&lt;/code&gt; &amp;mdash; 광고주가 박는 사용자 ID (CDP 매칭용)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;idfa&lt;/code&gt; / &lt;code&gt;idfv&lt;/code&gt; / &lt;code&gt;gaid&lt;/code&gt; &amp;mdash; 디바이스 광고 ID&lt;/li&gt;
&lt;li&gt;&lt;code&gt;idfv&lt;/code&gt; &amp;mdash; iOS는 ATT 동의 안 받으면 idfa는 NULL, idfv만 채워짐&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;매출과 이벤트&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;event_name&lt;/code&gt; &amp;mdash; purchase, level_up, tutorial_complete 등 SDK가 보낸 이벤트&lt;/li&gt;
&lt;li&gt;&lt;code&gt;event_value&lt;/code&gt; &amp;mdash; 이벤트 페이로드 JSON&lt;/li&gt;
&lt;li&gt;&lt;code&gt;revenue&lt;/code&gt; &amp;mdash; 매출 (자사 통화)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;revenue_in_selected_currency&lt;/code&gt; &amp;mdash; 보고서 환산 통화의 매출&lt;/li&gt;
&lt;/ul&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--note&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;Organic의 진짜 의미&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;af_status = Organic&lt;/code&gt;은 &quot;어느 매체에도 attribution이 안 됐다&quot;는 의미입니다. 진짜 organic 검색이 아니라 attribution 실패 + dark traffic까지 다 포함이에요. iOS ATT 거부로 attribution이 안 잡힌 광고 트래픽도 여기로 들어옵니다. 그래서 ATT 비율이 떨어지면 Organic이 비현실적으로 늘어 보여요.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Adjust 핵심 컬럼&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Adjust는 Appsflyer 대비 컬럼이 좀 더 깔끔하고 표준 OpenAPI 친화적입니다. 자주 쓰는 컬럼:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;tracker&lt;/code&gt; &amp;mdash; Adjust가 만든 deeplink 트래커 ID&lt;/li&gt;
&lt;li&gt;&lt;code&gt;network_name&lt;/code&gt; / &lt;code&gt;campaign_name&lt;/code&gt; / &lt;code&gt;adgroup_name&lt;/code&gt; / &lt;code&gt;creative_name&lt;/code&gt; &amp;mdash; 매체 계층&lt;/li&gt;
&lt;li&gt;&lt;code&gt;installed_at&lt;/code&gt; &amp;mdash; 첫 설치 시각&lt;/li&gt;
&lt;li&gt;&lt;code&gt;click_time&lt;/code&gt; &amp;mdash; 마지막 클릭 시각&lt;/li&gt;
&lt;li&gt;&lt;code&gt;impression_time&lt;/code&gt; &amp;mdash; 마지막 view 시각 (view-through 시)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;adid&lt;/code&gt; &amp;mdash; Adjust device ID&lt;/li&gt;
&lt;li&gt;&lt;code&gt;idfa&lt;/code&gt; / &lt;code&gt;idfv&lt;/code&gt; / &lt;code&gt;gps_adid&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;user_id&lt;/code&gt; &amp;mdash; 광고주가 박는 사용자 ID&lt;/li&gt;
&lt;li&gt;&lt;code&gt;revenue_usd&lt;/code&gt; &amp;mdash; USD 변환된 매출&lt;/li&gt;
&lt;li&gt;&lt;code&gt;currency&lt;/code&gt; &amp;mdash; 원본 통화&lt;/li&gt;
&lt;li&gt;&lt;code&gt;is_first_session&lt;/code&gt; &amp;mdash; 첫 설치/재설치 여부&lt;/li&gt;
&lt;li&gt;&lt;code&gt;is_reattributed&lt;/code&gt; &amp;mdash; reattribution 여부&lt;/li&gt;
&lt;li&gt;&lt;code&gt;engagement_type&lt;/code&gt; &amp;mdash; click / impression / install&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Adjust의 강점은 &lt;code&gt;tracker&lt;/code&gt; 한 컬럼만 봐도 캠페인 전체 계층(매체&amp;middot;캠페인&amp;middot;광고그룹&amp;middot;소재)을 다 풀어낼 수 있다는 점입니다. 단일 키로 모든 매핑을 할 수 있어 SQL이 깔끔해요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Branch 핵심 컬럼&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Branch는 deeplink&amp;middot;attribution을 한 번에 다루는 회사라 컬럼 이름이 길고 nested합니다. 그런데 그만큼 한 이벤트의 attribution 맥락 전체가 한 row에 들어있어요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;last_attributed_touch_data_tilde_channel&lt;/code&gt; &amp;mdash; 매체&lt;/li&gt;
&lt;li&gt;&lt;code&gt;last_attributed_touch_data_tilde_campaign&lt;/code&gt; &amp;mdash; 캠페인&lt;/li&gt;
&lt;li&gt;&lt;code&gt;last_attributed_touch_data_tilde_ad_set_name&lt;/code&gt; &amp;mdash; 광고 그룹&lt;/li&gt;
&lt;li&gt;&lt;code&gt;last_attributed_touch_data_tilde_ad_name&lt;/code&gt; &amp;mdash; 소재&lt;/li&gt;
&lt;li&gt;&lt;code&gt;last_attributed_touch_data_plus_timestamp&lt;/code&gt; &amp;mdash; 마지막 touch 시각&lt;/li&gt;
&lt;li&gt;&lt;code&gt;last_attributed_touch_data_plus_click_timestamp&lt;/code&gt; &amp;mdash; 마지막 클릭 시각&lt;/li&gt;
&lt;li&gt;&lt;code&gt;last_attributed_touch_type&lt;/code&gt; &amp;mdash; click / impression / referrer&lt;/li&gt;
&lt;li&gt;&lt;code&gt;last_attributed_touch_data_plus_revenue&lt;/code&gt; &amp;mdash; 매출&lt;/li&gt;
&lt;li&gt;&lt;code&gt;branch_id&lt;/code&gt; &amp;mdash; Branch device ID&lt;/li&gt;
&lt;li&gt;&lt;code&gt;developer_identity&lt;/code&gt; &amp;mdash; 광고주 박은 사용자 ID&lt;/li&gt;
&lt;li&gt;&lt;code&gt;last_cta_view_timestamp&lt;/code&gt; &amp;mdash; 마지막 CTA view 시각&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Branch는 단일 row 안에 first touch / last touch 정보가 다 들어있어 multi-touch attribution을 한 SQL로 짤 수 있다는 게 강점입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;SKAdNetwork postback 컬럼&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iOS 14.5 이후 attribution은 SKAdNetwork(SKAN) 기반 conversion value postback이 표준이 됐습니다. MMP raw에 추가로 들어오는 컬럼들이에요.&lt;/p&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;컬럼 의미&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;Appsflyer&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;Adjust&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;Branch&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Conversion value&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;conversion_value&lt;/code&gt; (0~63)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;conversion_value&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;conversion_value&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Redownload&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;redownload&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;redownload&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;redownload&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;App version&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;source_app_id&lt;/code&gt; 등&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;source_app&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;app_version&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Postback 시각&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;event_time&lt;/code&gt; (postback 도착 시각)&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;postback_at&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;&lt;code&gt;postback_received_at&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SKAN 데이터는 다음 두 가지 특성이 있어 raw 처리할 때 주의가 필요해요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;24~48시간 지연 후 도착 (lag)&lt;/li&gt;
&lt;li&gt;일정 수 이하의 install은 privacy threshold로 NULL (k-anonymity)&lt;/li&gt;
&lt;li&gt;conversion value 6비트(0~63)에 자사 정의한 의미 매핑이 필요 (compressed value)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깊은 SKAN 다루는 &lt;a href=&quot;https://blog.trysitely.com/posts/skan-postback-decoding&quot;&gt;skan-postback-decoding&lt;/a&gt;&amp;middot;&lt;a href=&quot;https://blog.trysitely.com/posts/ios-att-skadnetwork-aem&quot;&gt;ios-att-skadnetwork-aem&lt;/a&gt;에서 더 자세히 정리했으니 SKAN 운영하시면 같이 보시면 좋습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Reinstall&amp;middot;Reattribution 컬럼이 가장 헷갈리는 자리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 user가 앱을 지웠다가 다시 설치하면 그건 새 install인가, 재설치인가. 이걸 어떻게 카운팅하느냐에 따라 ROAS가 달라집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MMP의 룰:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;첫 설치 후 24시간 이내 재설치 &amp;rarr; reinstall (&lt;code&gt;is_first_session=true&lt;/code&gt;, &lt;code&gt;is_reattributed=false&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;첫 설치 후 24시간 이상 후 재설치 &amp;rarr; reattribution (&lt;code&gt;is_first_session=false&lt;/code&gt;, &lt;code&gt;is_reattributed=true&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;둘 다 새 install로 매체에 attribution은 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마케터 시선에서는 이걸 분리해서 봐야 해요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;is_first_session=true AND is_reattributed=false&lt;/code&gt; &amp;rarr; 진짜 신규&lt;/li&gt;
&lt;li&gt;&lt;code&gt;is_reattributed=true&lt;/code&gt; &amp;rarr; 재유입 (재마케팅 효과)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 안 나누면 reattribution이 신규로 잡혀 ROAS가 부풀려져 보입니다.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--warn&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;iOS는 reinstall 판정이 더 어렵다&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iOS는 IDFA가 없으면 같은 사람의 재설치를 못 식별할 수 있어요. 그래서 Appsflyer&amp;middot;Adjust의 iOS reattribution 컬럼은 신뢰도가 낮습니다. iOS reattribution KPI는 보조 지표로만 보세요.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;환경 노이즈를 거르는 필터&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;raw export에는 자주 보이는 노이즈가 몇 가지 있습니다. 다음 필터를 기본으로 적용하고 분석을 시작하면 시간이 절약돼요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;attribution_type IS NOT NULL&lt;/code&gt; &amp;mdash; attribution 실패 row 제외&lt;/li&gt;
&lt;li&gt;&lt;code&gt;media_source &amp;lt;&amp;gt; 'organic'&lt;/code&gt; &amp;mdash; 광고 분석 시 organic 제외&lt;/li&gt;
&lt;li&gt;&lt;code&gt;is_first_session = true&lt;/code&gt; &amp;mdash; 신규 설치만 본다면&lt;/li&gt;
&lt;li&gt;&lt;code&gt;app_version &amp;gt;= '최신 버전'&lt;/code&gt; &amp;mdash; 구버전 데이터의 가짜 attribution 제외&lt;/li&gt;
&lt;li&gt;&lt;code&gt;event_time BETWEEN install_time AND install_time + INTERVAL '30 days'&lt;/code&gt; &amp;mdash; 이상치 제외&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;사내 CDP와 매칭하는 키 우선순위&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MMP 데이터를 사내 CDP&amp;middot;DW와 매칭할 때 어느 키를 쓸지 표준화가 필요합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;code&gt;customer_user_id&lt;/code&gt; (Appsflyer) / &lt;code&gt;user_id&lt;/code&gt; (Adjust) / &lt;code&gt;developer_identity&lt;/code&gt; (Branch) &amp;mdash; 광고주가 박은 사내 ID. 가장 강함.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;idfa&lt;/code&gt; / &lt;code&gt;gaid&lt;/code&gt; &amp;mdash; 디바이스 ID. ATT 거부면 NULL.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;appsflyer_id&lt;/code&gt; / &lt;code&gt;adid&lt;/code&gt; / &lt;code&gt;branch_id&lt;/code&gt; &amp;mdash; MMP device ID. 약하지만 유일.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;idfv&lt;/code&gt; &amp;mdash; iOS 앱별 ID. 한 앱 안에서만 유효.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CDP를 운영한다면 사내 user_id를 MMP SDK 초기화 때 즉시 박는 게 표준입니다. 이걸 빠뜨리면 attribution은 잡혀도 CDP 매칭이 안 돼서 한 단계 더 분석을 할 수 없어요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마치며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MMP raw export는 컬럼이 많지만 분류 매핑 한 번 해두면 SQL 짜는 게 단순해집니다. 위 표를 옆에 두고 새 분석을 시작할 때마다 컬럼 매핑 먼저 정리하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 글에서는 매체 자체 raw data &amp;mdash; Meta&amp;middot;Google&amp;middot;TikTok&amp;middot;Naver export의 진짜 컬럼들 &lt;a href=&quot;https://blog.trysitely.com/posts/raw-data-meta-google-tiktok-naver&quot;&gt;raw-data-meta-google-tiktok-naver&lt;/a&gt;로 이어집니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://support.appsflyer.com/hc/en-us/articles/207034366&quot;&gt;Appsflyer Raw Data Reports &amp;mdash; 공식 컬럼 사전&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.adjust.com/en/article/callbacks&quot;&gt;Adjust &amp;mdash; Callbacks and exports&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.branch.io/developers-hub/docs/daily-export&quot;&gt;Branch &amp;mdash; Daily exports&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.apple.com/documentation/storekit/skadnetwork&quot;&gt;Apple SKAdNetwork docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;사내 글: &lt;a href=&quot;https://blog.trysitely.com/posts/mmp-attribution-stack&quot;&gt;MMP attribution stack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;사내 글: &lt;a href=&quot;https://blog.trysitely.com/posts/skan-postback-decoding&quot;&gt;SKAN postback decoding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;사내 글: &lt;a href=&quot;https://blog.trysitely.com/posts/ios-att-skadnetwork-aem&quot;&gt;iOS ATT와 SKAdNetwork&amp;middot;AEM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;사내 글: &lt;a href=&quot;https://blog.trysitely.com/posts/cdp-id-graph&quot;&gt;CDP 시대의 ID 그래프&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/article&gt;</description>
      <category>매체 데이터 알아보기</category>
      <category>adjust</category>
      <category>AppsFlyer</category>
      <category>attribution</category>
      <category>branch</category>
      <category>MMP</category>
      <category>raw-data</category>
      <author>Aramir</author>
      <guid isPermaLink="true">https://code77.tistory.com/103</guid>
      <comments>https://code77.tistory.com/103#entry103comment</comments>
      <pubDate>Sat, 16 May 2026 18:03:18 +0900</pubDate>
    </item>
    <item>
      <title>마케팅 트렌드 위클리 &amp;mdash; 매주 모니터링하는 글로벌&amp;middot;국내 소스 30곳 정리</title>
      <link>https://code77.tistory.com/102</link>
      <description>&lt;article class=&quot;tistory-mirror-post&quot; data-source-slug=&quot;marketing-trends-weekly-radar-30&quot;&gt;
&lt;p class=&quot;tistory-description&quot; data-ke-size=&quot;size16&quot;&gt;마케팅&amp;middot;adtech&amp;middot;AI&amp;middot;privacy 트렌드를 매주 따라잡는 표준 모니터링 소스 30곳. 글로벌&amp;middot;국내&amp;middot;매체 changelog&amp;middot;연구&amp;middot;뉴스레터&amp;middot;서브스택을 카테고리별로 묶고 활용법을 정리합니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마케터&amp;middot;운영자가 트렌드를 따라잡지 못하는 가장 큰 이유는 시간이 아니라 소스가 정리 안 됐기 때문이에요. 어디를 봐야 할지 모르면 매주 30분도 길게 느껴집니다. 반대로 잘 정리된 30곳을 매주 30분 훑어두면 사내 누구보다 빨리 매체 정책&amp;middot;AI 도구&amp;middot;privacy 변화를 알 수 있어요. 이 글은 글로벌&amp;middot;국내 마케팅&amp;middot;adtech&amp;middot;AI 트렌드를 따라잡는 표준 모니터링 소스 30곳을 카테고리별로 정리합니다. RSS&amp;middot;이메일&amp;middot;X 알림 셋업 가이드까지 함께.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;왜 트렌드 모니터링이 마케팅의 한 축인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;광고&amp;middot;attribution&amp;middot;AI 도구&amp;middot;privacy 모두 분기마다 표준이 바뀝니다. 1년 전 표준이 지금 안 맞는 게 흔해요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Meta&amp;middot;Google&amp;middot;TikTok이 새 캠페인 타입&amp;middot;attribution 옵션 출시 (매분기)&lt;/li&gt;
&lt;li&gt;iOS&amp;middot;Android&amp;middot;Chrome이 privacy 정책 변경 (매년 큰 변화)&lt;/li&gt;
&lt;li&gt;LLM 도구가 새 기능&amp;middot;새 모델 출시 (매월 1회 이상)&lt;/li&gt;
&lt;li&gt;한국 PIPA&amp;middot;해외 GDPR 갱신&lt;/li&gt;
&lt;li&gt;마케팅 자동화&amp;middot;CDP&amp;middot;BI 도구의 새 기능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 변화를 따라잡지 못한 마케터는 6개월 후에 알게 되고, 그 사이 경쟁사는 활용하고 있어요. 트렌드 따라잡기는 학습이 아니라 운영 KPI입니다.&lt;/p&gt;
&lt;figure class=&quot;tistory-figure&quot; style=&quot;margin: 28px 0; text-align: center;&quot;&gt;&lt;img style=&quot;max-width: 100%; height: auto; border-radius: 10px;&quot; src=&quot;https://blog.trysitely.com/img/marketing-trends-weekly-radar-30-hero.png&quot; alt=&quot;글로벌&amp;middot;국내 마케팅 트렌드 모니터링 소스 30곳 레이더 다이어그램&quot; /&gt;
&lt;figcaption style=&quot;margin-top: 10px; color: #5b6474; font-size: 0.92em; line-height: 1.6;&quot;&gt;6개 카테고리 &amp;times; 30곳 소스 = 매주 30분 모니터링으로 매분기 트렌드를 다 잡는 표준 레이더.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6개 카테고리 &amp;mdash; 무엇을 따라잡는가&lt;/h2&gt;
&lt;div class=&quot;tistory-table-wrap&quot; style=&quot;overflow-x: auto; margin: 24px 0;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;카테고리&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #d9e2f2; background: #edf3ff; padding: 10px; text-align: left;&quot;&gt;모니터링 대상&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;글로벌 marketing strategy&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;큰 그림&amp;middot;case study&amp;middot;growth pattern&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Adtech&amp;middot;매체 changelog&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Meta&amp;middot;Google&amp;middot;TikTok&amp;middot;MMP 정책&amp;middot;기능 변경&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;AI&amp;middot;dev tool&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;LLM 모델&amp;middot;도구&amp;middot;workflow&amp;middot;하네스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;Privacy&amp;middot;정책&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;ATT&amp;middot;GDPR&amp;middot;PIPA&amp;middot;Chrome 정책&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;국내 마케팅&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;국내 시장 동향&amp;middot;매체&amp;middot;콘텐츠&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;데이터&amp;middot;analytics&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #d9e2f2; padding: 10px; vertical-align: top;&quot;&gt;dbt&amp;middot;BigQuery&amp;middot;Snowflake&amp;middot;BI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 카테고리별로 핵심 5곳 = 총 30곳을 매주 훑어요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;글로벌 marketing strategy 5곳&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Stratechery (Ben Thompson)&lt;/b&gt; &amp;mdash; tech&amp;middot;플랫폼 전략 깊은 분석, 주 2-3회 무료 일부&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Lenny's Newsletter&lt;/b&gt; &amp;mdash; growth&amp;middot;product 깊은 인터뷰, 주 2회&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Marketing Brew&lt;/b&gt; &amp;mdash; 마케팅 daily news, 5분 짜리&lt;/li&gt;
&lt;li&gt;&lt;b&gt;HBR &amp;mdash; Marketing &amp;amp; Sales&lt;/b&gt; &amp;mdash; 학술&amp;middot;전략적 관점&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Andrew Chen blog&lt;/b&gt; &amp;mdash; growth&amp;middot;acquisition&amp;middot;viral mechanics&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 5곳이면 글로벌 마케팅&amp;middot;growth의 큰 흐름은 다 잡혀요. Stratechery는 유료지만 다른 4곳은 무료.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Adtech&amp;middot;매체 changelog 5곳&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;AdExchanger&lt;/b&gt; &amp;mdash; 글로벌 adtech 뉴스&amp;middot;attribution&amp;middot;programmatic&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Meta for Business &amp;mdash; Updates&lt;/b&gt; &amp;mdash; Meta 공식 매체 정책&amp;middot;기능 changelog&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Google Marketing Live &amp;amp; blog&lt;/b&gt; &amp;mdash; Google Ads&amp;middot;GA4&amp;middot;Tag&amp;middot;attribution 업데이트&lt;/li&gt;
&lt;li&gt;&lt;b&gt;TikTok for Business blog&lt;/b&gt; &amp;mdash; TikTok 광고 신기능&amp;middot;case study&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Appsflyer&amp;middot;Adjust&amp;middot;Branch blog&lt;/b&gt; &amp;mdash; MMP 측정&amp;middot;iOS&amp;middot;SKAN 변화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매체 정책은 한 분기 안에 ROAS를 흔들 정도로 큰 변화가 잦아요. RSS&amp;middot;이메일 구독으로 놓치지 말 것.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;AI&amp;middot;dev tool 5곳&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Anthropic &amp;mdash; News &amp;amp; Engineering blog&lt;/b&gt; &amp;mdash; Claude&amp;middot;Claude Code&amp;middot;API 신기능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;OpenAI blog&lt;/b&gt; &amp;mdash; GPT&amp;middot;ChatGPT&amp;middot;Codex&amp;middot;Sora&amp;middot;DALL-E&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Hacker News&lt;/b&gt; &amp;mdash; 매일 dev tool&amp;middot;AI 뉴스 가장 빠른 흐름&lt;/li&gt;
&lt;li&gt;&lt;b&gt;GeekNews&lt;/b&gt; &amp;mdash; 한국어 dev&amp;middot;AI 큐레이션&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Latent Space (서브스택)&lt;/b&gt; &amp;mdash; AI engineering&amp;middot;practical deep dive&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 도구는 거의 매주 큰 출시가 있어서 이 5곳 매주 한 번 훑는 게 표준. 특히 GeekNews는 한국어로 정리되어 시간 효율이 좋아요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Privacy&amp;middot;정책 5곳&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;IAPP &amp;mdash; Daily Dashboard&lt;/b&gt; &amp;mdash; privacy 글로벌 뉴스&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Apple Developer News&lt;/b&gt; &amp;mdash; iOS&amp;middot;ATT&amp;middot;SKAN 업데이트&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Google Chrome &amp;mdash; Privacy Sandbox blog&lt;/b&gt; &amp;mdash; Chrome cookie&amp;middot;sandbox 변화&lt;/li&gt;
&lt;li&gt;&lt;b&gt;개인정보보호위원회 &amp;mdash; 공지&amp;middot;과징금 사례&lt;/b&gt; &amp;mdash; 국내 PIPA 단속&amp;middot;해석&lt;/li&gt;
&lt;li&gt;&lt;b&gt;모비인사이드&amp;middot;전자신문 IT&lt;/b&gt; &amp;mdash; 국내 IT&amp;middot;광고 정책&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Privacy는 마케팅 효율보다 매출 위험 관리. 큰 변화가 한 번 있으면 분기 운영 전체가 바뀌어요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;국내 마케팅&amp;middot;콘텐츠 5곳&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;모비인사이드&lt;/b&gt; &amp;mdash; 국내 모바일&amp;middot;앱 마케팅&lt;/li&gt;
&lt;li&gt;&lt;b&gt;디지털 인사이트&lt;/b&gt; &amp;mdash; 디지털 마케팅&amp;middot;트렌드&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MAD Times&lt;/b&gt; &amp;mdash; 광고 산업 뉴스&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AB180 블로그&lt;/b&gt; &amp;mdash; 국내 MMP&amp;middot;attribution 운영 깊이&lt;/li&gt;
&lt;li&gt;&lt;b&gt;오픈서베이 트렌드&lt;/b&gt; &amp;mdash; 국내 소비자 트렌드 리포트&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;국내 시장 특수성을 잡는 데 필수. 글로벌 자료만 보면 한국 시장과 갭이 큽니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터&amp;middot;analytics 5곳&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;dbt blog&lt;/b&gt; &amp;mdash; analytics engineering&amp;middot;modern data stack&lt;/li&gt;
&lt;li&gt;&lt;b&gt;BigQuery release notes&lt;/b&gt; &amp;mdash; Google 데이터 웨어하우스&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Snowflake blog&lt;/b&gt; &amp;mdash; 경쟁 DW 업데이트&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Locally Optimistic&lt;/b&gt; &amp;mdash; data team 운영&amp;middot;culture&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Substack: Benn Stancil's Notes&lt;/b&gt; &amp;mdash; analytics 비판적 시각&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 5곳이면 데이터 stack의 현재 트렌드는 잡혀요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;운영 워크플로우 &amp;mdash; 매주 30분 표준&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스 30곳을 매주 훑는 워크플로우.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;월요일 아침 30분&lt;/li&gt;
&lt;li&gt;RSS reader(Feedly&amp;middot;Inoreader)에 30곳 등록&lt;/li&gt;
&lt;li&gt;카테고리별 폴더 분류&lt;/li&gt;
&lt;li&gt;제목&amp;middot;요약만 빠르게 (Stratechery&amp;middot;Lenny's만 본문)&lt;/li&gt;
&lt;li&gt;사내에 가치 있는 1-3개를 슬랙&amp;middot;노션에 공유 (요약 + 자체 코멘트)&lt;/li&gt;
&lt;li&gt;매분기 1회 backlog 재정비 (안 보던 소스 제거&amp;middot;신규 추가)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매주 30분 모니터링이 사내 1번 트렌드 큐레이터로 만들어요. 매니저&amp;middot;팀원&amp;middot;외부 stakeholder가 트렌드를 물을 때 답하는 사람이 곧 회사의 의사결정에 영향 주는 자리.&lt;/p&gt;
&lt;aside class=&quot;tistory-callout tistory-callout--tip&quot; style=&quot;margin: 24px 0; padding: 16px 18px; border-left: 4px solid #6f78ff; background: #f5f7ff; border-radius: 8px;&quot;&gt;
&lt;p class=&quot;tistory-callout__title&quot; style=&quot;margin: 0 0 8px; font-weight: bold; color: #25315c;&quot; data-ke-size=&quot;size16&quot;&gt;X&amp;middot;LinkedIn은 add-on&lt;/p&gt;
&lt;div class=&quot;tistory-callout__body&quot; style=&quot;line-height: 1.75;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RSS&amp;middot;이메일 위주로 모니터링하되 X(트위터) follow list와 LinkedIn 팔로우도 보조 채널. 다만 알고리즘 피드는 시간 흡입력이 강해서 30분 룰 깨기 쉬워요. 정해진 list만 보는 게 표준.&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;모니터링을 콘텐츠로 &amp;mdash; Weekly digest 발행&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매주 모니터링한 결과를 자체 콘텐츠로 발행하면 회사&amp;middot;개인 브랜드가 같이 자라요. huny.log 같은 곳에 다음 형식으로.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주간 5-10개 카드 (소스 링크 + 한 줄 요약)&lt;/li&gt;
&lt;li&gt;자체 코멘트 (마케터 영향도&amp;middot;실무 액션)&lt;/li&gt;
&lt;li&gt;카테고리별 분류&lt;/li&gt;
&lt;li&gt;매주 같은 요일&amp;middot;같은 시간 발행 (월요일 오전 같은 cadence)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.trysitely.com/posts/sqlbi-7-roas-sql&quot;&gt;marketing-trends-2026-q2-recap&lt;/a&gt;&amp;middot;&lt;a href=&quot;https://blog.trysitely.com/posts/ga4-bigquery-roas&quot;&gt;marketing-trends-platform-policy-changelog&lt;/a&gt; 같은 분기 정기 발행으로 더 큰 cycle도 운영합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;트렌드 따라잡기의 안티패턴&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;30곳을 등록만 하고 매주 안 봄 (RSS 12000개 안 읽음)&lt;/li&gt;
&lt;li&gt;모든 글을 처음부터 끝까지 정독 (시간 폭주)&lt;/li&gt;
&lt;li&gt;카테고리 분류 안 함 (피로 가중)&lt;/li&gt;
&lt;li&gt;가치 없는 글에도 자체 코멘트 시도 (퀄리티 하락)&lt;/li&gt;
&lt;li&gt;글로벌 자료만 보고 국내 시장 갭 무시&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10곳부터 시작해서 익숙해지면 30곳으로 확장하는 게 표준 onboarding이에요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마치며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트렌드 모니터링은 학습이 아니라 운영입니다. 매주 30분 표준이 잡혀있으면 분기 의사결정에서 동료보다 늘 한 발 앞에 서요. 30곳을 한 번에 다 등록하기보다 5곳부터 시작해서 매월 확장하는 게 지속 가능한 패턴.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 글로는 &lt;a href=&quot;https://blog.trysitely.com/posts/sqlbi-7-roas-sql&quot;&gt;2026 Q2 마케팅 트렌드 분기 정리&lt;/a&gt;&amp;middot;&lt;a href=&quot;https://blog.trysitely.com/posts/ga4-bigquery-roas&quot;&gt;광고 매체 정책 changelog 분기 정리&lt;/a&gt;로 이어집니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://feedly.com/&quot;&gt;Feedly &amp;mdash; RSS reader&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.inoreader.com/&quot;&gt;Inoreader &amp;mdash; RSS reader&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stratechery.com/&quot;&gt;Stratechery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.lennysnewsletter.com/&quot;&gt;Lenny's Newsletter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.marketingbrew.com/&quot;&gt;Marketing Brew&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://news.hada.io/&quot;&gt;GeekNews 한국어 IT 큐레이션&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;사내 글: &lt;a href=&quot;https://blog.trysitely.com/posts/llm-6-guardrail-costlatency&quot;&gt;LLM cost guardrails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;사내 글: &lt;a href=&quot;https://blog.trysitely.com/posts/aarrr-north-star-metric-funnel-ops-growth-loop&quot;&gt;AARRR 진짜 운영&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;사내 글: &lt;a href=&quot;https://blog.trysitely.com/posts/generative-engine-optimization-llm-seo&quot;&gt;GEO 입문&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/article&gt;</description>
      <category>마케팅 트렌드&amp;middot;뉴스</category>
      <category>monitoring</category>
      <category>Newsletter</category>
      <category>sources</category>
      <category>trends</category>
      <category>weekly</category>
      <author>Aramir</author>
      <guid isPermaLink="true">https://code77.tistory.com/102</guid>
      <comments>https://code77.tistory.com/102#entry102comment</comments>
      <pubDate>Sat, 16 May 2026 18:02:32 +0900</pubDate>
    </item>
  </channel>
</rss>