<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>알랭드보통사람</title>
    <link>https://botongsaram.tistory.com/</link>
    <description>데이터 분석가의 공부 노트</description>
    <language>ko</language>
    <pubDate>Thu, 16 Apr 2026 15:50:24 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>알랭드보통 사람</managingEditor>
    <image>
      <title>알랭드보통사람</title>
      <url>https://tistory1.daumcdn.net/tistory/5655906/attach/23e86a25b47b40778c087e6346256499</url>
      <link>https://botongsaram.tistory.com</link>
    </image>
    <item>
      <title>브레이즈 커넥티드 컨텐츠(Connected Content)로 활용할 API 만들기 (feat. Google Cloud Platform)</title>
      <link>https://botongsaram.tistory.com/entry/%EB%B8%8C%EB%A0%88%EC%9D%B4%EC%A6%88-%EC%BB%A4%EB%84%A5%ED%8B%B0%EB%93%9C-%EC%BB%A8%ED%85%90%EC%B8%A0Connected-Content%EB%A1%9C-%ED%99%9C%EC%9A%A9%ED%95%A0-API-%EB%A7%8C%EB%93%A4%EA%B8%B0-feat-Google-Cloud-Platform</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이전 글에서 RFM Segment 라벨링을 빅쿼리에 적재하는 방법을 소개했었습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a title=&quot;태블로 Rest API 로 view 데이터 csv 로 다운받고 빅쿼리에 저장하기&quot; href=&quot;https://botongsaram.tistory.com/entry/%ED%83%9C%EB%B8%94%EB%A1%9C-Rest-API-%EB%A1%9C-view-%EB%8D%B0%EC%9D%B4%ED%84%B0-csv-%EB%A1%9C-%EB%8B%A4%EC%9A%B4%EB%B0%9B%EA%B3%A0-%EB%B9%85%EC%BF%BC%EB%A6%AC%EC%97%90-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;태블로&amp;nbsp;Rest&amp;nbsp;API&amp;nbsp;로&amp;nbsp;view&amp;nbsp;데이터&amp;nbsp;csv&amp;nbsp;로&amp;nbsp;다운받고&amp;nbsp;빅쿼리에&amp;nbsp;저장하기&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1737536218560&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;태블로 Rest API 로 view 데이터 csv 로 다운받고 빅쿼리에 저장하기&quot; data-og-description=&quot;태블로에서 RFM 대시보드를 만들고 이를 활용해서 CRM 캠페인 액션들을 수행한뒤 유져벌 RFM 세그먼트 이동을 관찰해야 한다.&amp;nbsp;하지만 이를 정기적으로 다운로드 받아서 구글 시트에 저장해야하는&quot; data-og-host=&quot;botongsaram.tistory.com&quot; data-og-source-url=&quot;https://botongsaram.tistory.com/entry/%ED%83%9C%EB%B8%94%EB%A1%9C-Rest-API-%EB%A1%9C-view-%EB%8D%B0%EC%9D%B4%ED%84%B0-csv-%EB%A1%9C-%EB%8B%A4%EC%9A%B4%EB%B0%9B%EA%B3%A0-%EB%B9%85%EC%BF%BC%EB%A6%AC%EC%97%90-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B8%B0&quot; data-og-url=&quot;https://botongsaram.tistory.com/entry/%ED%83%9C%EB%B8%94%EB%A1%9C-Rest-API-%EB%A1%9C-view-%EB%8D%B0%EC%9D%B4%ED%84%B0-csv-%EB%A1%9C-%EB%8B%A4%EC%9A%B4%EB%B0%9B%EA%B3%A0-%EB%B9%85%EC%BF%BC%EB%A6%AC%EC%97%90-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B8%B0&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/yGsPv/hyX4t3Y80J/2jh2KsaArv3OA3QvI8C1tk/img.png?width=800&amp;amp;height=458&amp;amp;face=0_0_800_458,https://scrap.kakaocdn.net/dn/cH02il/hyX4xZGurw/rLNKhkb8vcv37Q5WKUKhL0/img.png?width=800&amp;amp;height=458&amp;amp;face=0_0_800_458,https://scrap.kakaocdn.net/dn/csS2Rb/hyX4klJNga/MMl8FsKxOql1VwiZlTPBfk/img.png?width=3052&amp;amp;height=1628&amp;amp;face=0_0_3052_1628&quot;&gt;&lt;a href=&quot;https://botongsaram.tistory.com/entry/%ED%83%9C%EB%B8%94%EB%A1%9C-Rest-API-%EB%A1%9C-view-%EB%8D%B0%EC%9D%B4%ED%84%B0-csv-%EB%A1%9C-%EB%8B%A4%EC%9A%B4%EB%B0%9B%EA%B3%A0-%EB%B9%85%EC%BF%BC%EB%A6%AC%EC%97%90-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://botongsaram.tistory.com/entry/%ED%83%9C%EB%B8%94%EB%A1%9C-Rest-API-%EB%A1%9C-view-%EB%8D%B0%EC%9D%B4%ED%84%B0-csv-%EB%A1%9C-%EB%8B%A4%EC%9A%B4%EB%B0%9B%EA%B3%A0-%EB%B9%85%EC%BF%BC%EB%A6%AC%EC%97%90-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B8%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/yGsPv/hyX4t3Y80J/2jh2KsaArv3OA3QvI8C1tk/img.png?width=800&amp;amp;height=458&amp;amp;face=0_0_800_458,https://scrap.kakaocdn.net/dn/cH02il/hyX4xZGurw/rLNKhkb8vcv37Q5WKUKhL0/img.png?width=800&amp;amp;height=458&amp;amp;face=0_0_800_458,https://scrap.kakaocdn.net/dn/csS2Rb/hyX4klJNga/MMl8FsKxOql1VwiZlTPBfk/img.png?width=3052&amp;amp;height=1628&amp;amp;face=0_0_3052_1628');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;태블로 Rest API 로 view 데이터 csv 로 다운받고 빅쿼리에 저장하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;태블로에서 RFM 대시보드를 만들고 이를 활용해서 CRM 캠페인 액션들을 수행한뒤 유져벌 RFM 세그먼트 이동을 관찰해야 한다.&amp;nbsp;하지만 이를 정기적으로 다운로드 받아서 구글 시트에 저장해야하는&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;botongsaram.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RFM 점수에 따라 세그멘트를 분류하면 아래와 같이 유저별로 이렇게 세그먼트 라벨이 생성됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 데이터를 브레이즈 커넥티드 콘텐츠로&amp;nbsp; 활용할 수 있게 만들면 효율적이겠다는 판단이 들었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글링을 해보니 비개발자도 손쉽게(?) 구현 가능하겠다는 판단이 들어서 API를 만드는 방법을 소개하려고 합니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 136px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 19.1473%; height: 18px;&quot;&gt;user_id&lt;/td&gt;
&lt;td style=&quot;width: 30.8527%; height: 18px;&quot;&gt;RFM_Segment_nm&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;created_at(데이터 적재일)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 19.1473%; height: 20px;&quot;&gt;a&lt;/td&gt;
&lt;td style=&quot;width: 30.8527%; height: 20px;&quot;&gt;이탈한 고객&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;2025-01-01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 19.1473%; height: 20px;&quot;&gt;b&lt;/td&gt;
&lt;td style=&quot;width: 30.8527%; height: 20px;&quot;&gt;떠날 위험이 큰 고객&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;2025-01-01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 19.1473%; height: 20px;&quot;&gt;c&lt;/td&gt;
&lt;td style=&quot;width: 30.8527%; height: 20px;&quot;&gt;충성 고객&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;2025-01-01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 19.1473%; height: 20px;&quot;&gt;d&lt;/td&gt;
&lt;td style=&quot;width: 30.8527%; height: 20px;&quot;&gt;로열티 가망 고객&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;2025-01-01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 19.1473%; height: 20px;&quot;&gt;e&lt;/td&gt;
&lt;td style=&quot;width: 30.8527%; height: 20px;&quot;&gt;신규 고객&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;2025-01-01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 19.1473%; height: 18px;&quot;&gt;...&lt;/td&gt;
&lt;td style=&quot;width: 30.8527%; height: 18px;&quot;&gt;...&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;2025-01-01&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;브레이즈 커넥티드 컨텐츠란?&amp;nbsp;&lt;/b&gt;&lt;br /&gt;외부 서버에 있는 정보를 API로 가져와서 메시지에 활용하는 기능입니다.&lt;br /&gt;브레이즈에 데이터가 저장되지 않아 DP 소진이 안 되는 장점도 있다고 합니다.&amp;nbsp;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커넥티드 컨텐츠는&amp;nbsp; GET / POST 방식 둘 다 사용 가능하고 이번에 만들어 볼&amp;nbsp; API는 GET 요청의 형식입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;GET / POST 란?&lt;/b&gt;&lt;br /&gt;GET / POST 는 HTTP 메서드로 클라이언트에서 서버로 뭔가 요청할 때 사용합니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;그럼 HTTP 메서드는 뭐냐?&amp;nbsp;&lt;/b&gt;&lt;br /&gt;클라이언트가 서버에 요청의 목적 / 종류를 알리는 수단입니다.&amp;nbsp;&lt;br /&gt;아 안에는 GET, POST, PUT, PATCH, DELETE, HEAD, OPTION, CONNECT로 8가지가 있지만&lt;br /&gt;여기선 GET/POST 만 알면 될 것 같습니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 80px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;GET 방식&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;POST 방식&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;사용 목적&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;서버에 리소스 요청&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;서버에 리소스 생성 / 업데이트 할 때&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;DB로 표현하면&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;SELECT&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;CREATE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;Body 유무&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;&amp;nbsp;없음&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;있음&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 본격적으로 구현해봅시다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cloud Function 이 빅쿼리를 쿼리해서 데이터를 반환하는 API를 만드는 과정이라고 보시면 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 GCP 에 가서 서비스 계정 2개를 만들 겁니다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나는 API 게이트웨이 만들 때 사용하고 다른 하나는 Cloud Functions을 만들 때 쓸 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;API 게이트웨이란?&lt;/b&gt;&lt;br /&gt;클라이언트가 서버와의 소통하는 다리 역할 (API가 지나다니는 통로!)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;서비스 계정 2개 만들기&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1015&quot; data-origin-height=&quot;680&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnTMdp/btsLWRCBKFJ/HmSdOz2HONo40ub3dFB1g1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnTMdp/btsLWRCBKFJ/HmSdOz2HONo40ub3dFB1g1/img.png&quot; data-alt=&quot;서비스 계정 2개 생성하기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnTMdp/btsLWRCBKFJ/HmSdOz2HONo40ub3dFB1g1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnTMdp%2FbtsLWRCBKFJ%2FHmSdOz2HONo40ub3dFB1g1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1015&quot; height=&quot;680&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1015&quot; data-origin-height=&quot;680&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;서비스 계정 2개 생성하기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 각 계정 생성 시 권한을 아래와 같이 부여합니다&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;권한&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&lt;span style=&quot;background-color: #a6bc00;&quot;&gt;API Gateway 에 사용할 계정&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;Cloud&amp;nbsp;Functions&amp;nbsp;호출자&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;Cloud Functions 에 사용할 계정&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;BigQuery&amp;nbsp;읽기&amp;nbsp;세션&amp;nbsp;사용자&lt;br /&gt;BigQuery&amp;nbsp;작업&amp;nbsp;사용자&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 추가로 &lt;span style=&quot;background-color: #f3c000; color: #333333; text-align: start;&quot;&gt;Cloud Functions에 사용할 계정&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;에 BigQuery에서 조회할 특정 테이블만 권한을 부여해 줍니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;공유 &amp;rarr; 새 주 구성원에 &lt;span style=&quot;background-color: #f3c000; color: #333333; text-align: start;&quot;&gt;Cloud Functions에 사용할 계정(~~~@iam.gserviceaccount.com~~~)&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;을 추가하고 아래와 같이 BigQuery 데이터 뷰어 권한으로 설정해 주세요.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitdddled.png&quot; data-origin-width=&quot;1346&quot; data-origin-height=&quot;884&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SVeb7/btsLVKYOP14/jgbmPzZmC7ovcGhox6xLIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SVeb7/btsLVKYOP14/jgbmPzZmC7ovcGhox6xLIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SVeb7/btsLVKYOP14/jgbmPzZmC7ovcGhox6xLIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSVeb7%2FbtsLVKYOP14%2FjgbmPzZmC7ovcGhox6xLIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1346&quot; height=&quot;884&quot; data-filename=&quot;Untitdddled.png&quot; data-origin-width=&quot;1346&quot; data-origin-height=&quot;884&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Cloud Functions 만들기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cloud Functions에서 함수 만들기를 누르고 아래와 같이 설정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환경은 1세대(&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;2세대도 상관없으나.. ) 나머지는 이미지 내 설정대로 하고 아래 런타임 서비스 계정을 이전 단계에서 생성한 서비스 계정 중 &lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;Cloud Functions에 사용할 계정&lt;/b&gt;&lt;/span&gt;을 선택해줘야 합니다&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dd.png&quot; data-origin-width=&quot;629&quot; data-origin-height=&quot;950&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baja3t/btsLViIbw5x/FqjYZmkDjKgeDnJFbozDu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baja3t/btsLViIbw5x/FqjYZmkDjKgeDnJFbozDu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baja3t/btsLViIbw5x/FqjYZmkDjKgeDnJFbozDu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbaja3t%2FbtsLViIbw5x%2FFqjYZmkDjKgeDnJFbozDu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;629&quot; height=&quot;950&quot; data-filename=&quot;dd.png&quot; data-origin-width=&quot;629&quot; data-origin-height=&quot;950&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dddUntitled.png&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;593&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/np8jK/btsLVv1Bjkh/wW7H5X6Hg3b58MlkmroQlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/np8jK/btsLVv1Bjkh/wW7H5X6Hg3b58MlkmroQlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/np8jK/btsLVv1Bjkh/wW7H5X6Hg3b58MlkmroQlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnp8jK%2FbtsLVv1Bjkh%2FwW7H5X6Hg3b58MlkmroQlk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;635&quot; height=&quot;593&quot; data-filename=&quot;dddUntitled.png&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;593&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그다음 이제 코드를 작성합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 동작은&amp;nbsp; HTTP 요청을 받아 BigQuery 쿼리를 실행하고, 결과를 JSON 형태로 반환하는 코드입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;requirement.txt 에는 아래 3가지 라이브러리만 있으면 됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;google-cloud-bigquery&lt;/li&gt;
&lt;li&gt;google-cloud-storage&lt;/li&gt;
&lt;li&gt;pandas&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-01-22 18.08.22.png&quot; data-origin-width=&quot;734&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRNWrd/btsLW6faVIx/6Fl2EoaHXZTVktVpXTO1v1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRNWrd/btsLW6faVIx/6Fl2EoaHXZTVktVpXTO1v1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRNWrd/btsLW6faVIx/6Fl2EoaHXZTVktVpXTO1v1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRNWrd%2FbtsLW6faVIx%2F6Fl2EoaHXZTVktVpXTO1v1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;788&quot; height=&quot;264&quot; data-filename=&quot;스크린샷 2025-01-22 18.08.22.png&quot; data-origin-width=&quot;734&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수를 생성할 때 진입점을 꼭 기재해 주셔야 동작을 합니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-01-22 18.09.32.png&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dP9ruR/btsLVKRIWeC/wfcXVOMN46Nw4BtJtZ5rj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dP9ruR/btsLVKRIWeC/wfcXVOMN46Nw4BtJtZ5rj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dP9ruR/btsLVKRIWeC/wfcXVOMN46Nw4BtJtZ5rj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdP9ruR%2FbtsLVKRIWeC%2FwfcXVOMN46Nw4BtJtZ5rj1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;798&quot; height=&quot;286&quot; data-filename=&quot;스크린샷 2025-01-22 18.09.32.png&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;286&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1737535974737&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from google.cloud import bigquery
import json
from datetime import date, datetime

def bigquery_to_api(request):
    try:
        print(&quot;Request received.&quot;)  # 요청 수신 로그

        # BigQuery 클라이언트 생성
        client = bigquery.Client()
        print(&quot;BigQuery client created.&quot;)  # 클라이언트 생성 로그

        # 쿼리 작성
        query = &quot;&quot;&quot;
            SELECT cust_id, rfm_seg_nm 
            FROM `{테이블명}`
            WHERE created_at = (
                SELECT MAX(created_at)
                FROM `{테이블명}`
            )
        &quot;&quot;&quot;
        print(f&quot;Query to be executed: {query}&quot;)  # 쿼리 출력

        # 쿼리 실행
        query_job = client.query(query)
        print(&quot;Query executed. Waiting for results...&quot;)  # 쿼리 실행 로그

        # 쿼리 결과 가져오기
        results = query_job.result()
        print(&quot;Query results fetched.&quot;)  # 결과 가져오기 로그

        # JSON 직렬화 가능한 형식으로 변환
        def serialize_row(row):
            return {
                key: (value.isoformat() if isinstance(value, (date, datetime)) else value)
                for key, value in dict(row).items()
            }

        rows = [serialize_row(row) for row in results]

        # 가져온 결과 중 일부만 출력
        sample_rows = rows[:10]  # 최대 10개만 샘플로 출력
        print(f&quot;Number of rows fetched: {len(rows)}&quot;)  # 전체 결과 개수
        print(f&quot;Sample rows: {json.dumps(sample_rows, indent=2)}&quot;)  # 샘플 결과 출력

        return json.dumps(rows), 200, {'Content-Type': 'application/json'}
    except Exception as e:
        # 예외 처리 및 에러 로그 출력
        print(f&quot;Error occurred: {str(e)}&quot;)
        return json.dumps({'error': str(e)}), 500, {'Content-Type': 'application/json'}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;API Config 파일 만들기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 API을 실행을 위한 yaml 파일을 만들어 줘야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 파일의 역할은 Google Cloud API Gateway에서 API를 정의하고 설정하기 위해 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 요청을 클라이언트로부터 수신해서 Cloud Functions로 전달하는 게이트웨이를 구성한다고 생각하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 이 파일에서 API의 요청 방식(GET / POST)을 정의해 줍니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;sublime text 하나 여시고 로컬에 저장(아래 코드)하고 API Gateway에 업로드해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 address는 앞에서 만든 Cloud Function의 트리거 URL을 복사에서 붙여 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;122222.png&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqybVa/btsLYczgC4K/h3AVygcAwmkokGYe53ArL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqybVa/btsLYczgC4K/h3AVygcAwmkokGYe53ArL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqybVa/btsLYczgC4K/h3AVygcAwmkokGYe53ArL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqybVa%2FbtsLYczgC4K%2Fh3AVygcAwmkokGYe53ArL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;632&quot; height=&quot;482&quot; data-filename=&quot;122222.png&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;482&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 파일제목의 확장자는. yaml로 저장해 줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1737594964462&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;swagger: &quot;2.0&quot;
info:
  title: &quot;test_rfm_api&quot;
  description: &quot;API 설명&quot;
  version: &quot;1.0.0&quot;
paths:
  /rfm_api: -- 위에서 만들었던 클라우드 함수 이름
    get:
      summary: &quot;Get RFM data from BigQuery&quot;
      description: &quot;Returns Recent BigQuery data.&quot;
      operationId: &quot;getRFMData&quot;
      parameters:
        - name: &quot;x-api-key&quot;
          in: &quot;header&quot;
          required: true
          type: &quot;string&quot;
      responses:
        &quot;200&quot;:
          description: &quot;Successful response&quot;
          schema:
            type: &quot;array&quot;
            items:
              type: &quot;object&quot;
              properties:
                field_name:
                  type: &quot;string&quot;
      x-google-backend:
        address: &quot;https://asia-northeast3-{프로젝트ID}.cloudfunctions.net/rfm_api&quot;
        protocol: &quot;http/1.1&quot;
      security:
        - api_key: []
securityDefinitions:
  api_key:
    type: &quot;apiKey&quot;
    name: &quot;x-api-key&quot;
    in: &quot;header&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 GCP 콘솔에서 API Gateway를 검색해서 게이트웨이를 만듭니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 API 사양 업로드에 바로 직전에 생성한 yaml 파일을 업로드하고 아래 서비스 계정 선택에서 처음에 생성한 계정 중 &lt;span style=&quot;background-color: #a6bc00;&quot;&gt;API Gateway에 사용할 계정&lt;/span&gt;을 선택해 줍니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1111111111111.png&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;901&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9pVOO/btsLWu2h6LI/DT9vPvjAkOJrDh8q0DyEyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9pVOO/btsLWu2h6LI/DT9vPvjAkOJrDh8q0DyEyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9pVOO/btsLWu2h6LI/DT9vPvjAkOJrDh8q0DyEyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9pVOO%2FbtsLWu2h6LI%2FDT9vPvjAkOJrDh8q0DyEyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;639&quot; height=&quot;901&quot; data-filename=&quot;1111111111111.png&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;901&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 마지막 단계&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;API 키 만들기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콘솔에서 API 및 서비스를 검색합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 키를 만들어 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ㅇㅇㅇㅇㅇㅇUntitled.png&quot; data-origin-width=&quot;1428&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtqzrI/btsLVK5zc90/kfStimRjfEqzwh3yLaK0u1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtqzrI/btsLVK5zc90/kfStimRjfEqzwh3yLaK0u1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtqzrI/btsLVK5zc90/kfStimRjfEqzwh3yLaK0u1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtqzrI%2FbtsLVK5zc90%2FkfStimRjfEqzwh3yLaK0u1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1428&quot; height=&quot;454&quot; data-filename=&quot;ㅇㅇㅇㅇㅇㅇUntitled.png&quot; data-origin-width=&quot;1428&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성 후에 API 키를 복사합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Un323titled.png&quot; data-origin-width=&quot;1142&quot; data-origin-height=&quot;647&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eif81I/btsLVLpRL4N/P2DlHk5tdbroRU6STJRJt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eif81I/btsLVLpRL4N/P2DlHk5tdbroRU6STJRJt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eif81I/btsLVLpRL4N/P2DlHk5tdbroRU6STJRJt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feif81I%2FbtsLVLpRL4N%2FP2DlHk5tdbroRU6STJRJt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1142&quot; height=&quot;647&quot; data-filename=&quot;Un323titled.png&quot; data-origin-width=&quot;1142&quot; data-origin-height=&quot;647&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 설정 중에 'API 제한 설정'이 있는데 API Gateway 설정해 줍니다.&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;드디어 API 호출!&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;터미널에서 아래와 같이 입력하면 이렇게 데이터가 출력됩니다!&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737598798124&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -X GET \
-H &quot;x-api-key: {api_key}&quot; \
&quot;https://{위에서 만든 게이트 웨이 URL}/rfm_api&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;{위에서 만든 게이트웨이 URL}/{.yaml파일내 path값}&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitlegated.png&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJkhdf/btsLVEROE5v/u8oVZeSZ4FcoBXFynnyLk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJkhdf/btsLVEROE5v/u8oVZeSZ4FcoBXFynnyLk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJkhdf/btsLVEROE5v/u8oVZeSZ4FcoBXFynnyLk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJkhdf%2FbtsLVEROE5v%2Fu8oVZeSZ4FcoBXFynnyLk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1168&quot; height=&quot;320&quot; data-filename=&quot;Untitlegated.png&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;320&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ㅊㄱㄱㄱ.png&quot; data-origin-width=&quot;1576&quot; data-origin-height=&quot;742&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WWSKX/btsLVFDbQdH/tktGypHgOu8lKyULmgjTh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WWSKX/btsLVFDbQdH/tktGypHgOu8lKyULmgjTh0/img.png&quot; data-alt=&quot;api 호출 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WWSKX/btsLVFDbQdH/tktGypHgOu8lKyULmgjTh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWWSKX%2FbtsLVFDbQdH%2FtktGypHgOu8lKyULmgjTh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1576&quot; height=&quot;742&quot; data-filename=&quot;ㅊㄱㄱㄱ.png&quot; data-origin-width=&quot;1576&quot; data-origin-height=&quot;742&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;api 호출 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고글&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://cloud.google.com/api-gateway/docs/creating-api-config?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://cloud.google.com/api-gateway/docs/creating-api-config?hl=ko&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1737601287027&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;API 구성 만들기 &amp;nbsp;|&amp;nbsp; API Gateway Documentation &amp;nbsp;|&amp;nbsp; Google Cloud&quot; data-og-description=&quot;의견 보내기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. API 구성 만들기 기본 요건 API 구성을 만들려면 먼저 다음을 확인합니다. API 구성 ID 요구사항 아&quot; data-og-host=&quot;cloud.google.com&quot; data-og-source-url=&quot;https://cloud.google.com/api-gateway/docs/creating-api-config?hl=ko&quot; data-og-url=&quot;https://cloud.google.com/api-gateway/docs/creating-api-config?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/neXNc/hyX4rFmMHr/obVMngnHgZK13JKQaEG56k/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://cloud.google.com/api-gateway/docs/creating-api-config?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://cloud.google.com/api-gateway/docs/creating-api-config?hl=ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/neXNc/hyX4rFmMHr/obVMngnHgZK13JKQaEG56k/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;API 구성 만들기 &amp;nbsp;|&amp;nbsp; API Gateway Documentation &amp;nbsp;|&amp;nbsp; Google Cloud&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;의견 보내기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. API 구성 만들기 기본 요건 API 구성을 만들려면 먼저 다음을 확인합니다. API 구성 ID 요구사항 아&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;cloud.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://zoe1.medium.com/how-to-set-up-an-api-with-a-cloud-function-backend-that-queries-bigquery-on-gcp-5e3f88b508f6&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://zoe1.medium.com/how-to-set-up-an-api-with-a-cloud-function-backend-that-queries-bigquery-on-gcp-5e3f88b508f6&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1737601206032&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;How to set up an API with a Cloud Function backend that queries BigQuery on GCP&quot; data-og-description=&quot;This article will show you how to create an API with API Gateway with a Cloud Functions backend that takes in a date in the API query and&amp;hellip;&quot; data-og-host=&quot;zoe1.medium.com&quot; data-og-source-url=&quot;https://zoe1.medium.com/how-to-set-up-an-api-with-a-cloud-function-backend-that-queries-bigquery-on-gcp-5e3f88b508f6&quot; data-og-url=&quot;https://zoe1.medium.com/how-to-set-up-an-api-with-a-cloud-function-backend-that-queries-bigquery-on-gcp-5e3f88b508f6&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cJeiwr/hyX4ohwA2B/I22KlreRYMWnu3pekvQg80/img.png?width=1200&amp;amp;height=820&amp;amp;face=0_0_1200_820&quot;&gt;&lt;a href=&quot;https://zoe1.medium.com/how-to-set-up-an-api-with-a-cloud-function-backend-that-queries-bigquery-on-gcp-5e3f88b508f6&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://zoe1.medium.com/how-to-set-up-an-api-with-a-cloud-function-backend-that-queries-bigquery-on-gcp-5e3f88b508f6&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cJeiwr/hyX4ohwA2B/I22KlreRYMWnu3pekvQg80/img.png?width=1200&amp;amp;height=820&amp;amp;face=0_0_1200_820');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;How to set up an API with a Cloud Function backend that queries BigQuery on GCP&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;This article will show you how to create an API with API Gateway with a Cloud Functions backend that takes in a date in the API query and&amp;hellip;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;zoe1.medium.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT 관련</category>
      <category>Braze</category>
      <category>braze connected content api</category>
      <category>tableau api</category>
      <category>tableau rest api</category>
      <author>알랭드보통 사람</author>
      <guid isPermaLink="true">https://botongsaram.tistory.com/16</guid>
      <comments>https://botongsaram.tistory.com/entry/%EB%B8%8C%EB%A0%88%EC%9D%B4%EC%A6%88-%EC%BB%A4%EB%84%A5%ED%8B%B0%EB%93%9C-%EC%BB%A8%ED%85%90%EC%B8%A0Connected-Content%EB%A1%9C-%ED%99%9C%EC%9A%A9%ED%95%A0-API-%EB%A7%8C%EB%93%A4%EA%B8%B0-feat-Google-Cloud-Platform#entry16comment</comments>
      <pubDate>Thu, 23 Jan 2025 12:04:58 +0900</pubDate>
    </item>
    <item>
      <title>태블로 Rest API 로 view 데이터 csv 로 다운받고 빅쿼리에 저장하기</title>
      <link>https://botongsaram.tistory.com/entry/%ED%83%9C%EB%B8%94%EB%A1%9C-Rest-API-%EB%A1%9C-view-%EB%8D%B0%EC%9D%B4%ED%84%B0-csv-%EB%A1%9C-%EB%8B%A4%EC%9A%B4%EB%B0%9B%EA%B3%A0-%EB%B9%85%EC%BF%BC%EB%A6%AC%EC%97%90-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;태블로에서 RFM 대시보드를 만들고 이를 활용해서 CRM 캠페인 액션들을 수행한뒤 유져벌 RFM 세그먼트 이동을 관찰해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이를 정기적으로 다운로드 받아서 구글 시트에 저장해야하는 번거로움이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복적인 업무기 때문에 자동화시킬 필요가 있다고 생각하여 구현해본 케이스를 기록도 해볼겸 공유해볼까 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;638&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPRn2o/btsLMVLEQVA/WdI2FY2IjsRkaOA88zWZd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPRn2o/btsLMVLEQVA/WdI2FY2IjsRkaOA88zWZd0/img.png&quot; data-alt=&quot;RFM Dashboard&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPRn2o/btsLMVLEQVA/WdI2FY2IjsRkaOA88zWZd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPRn2o%2FbtsLMVLEQVA%2FWdI2FY2IjsRkaOA88zWZd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1112&quot; height=&quot;638&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;638&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;RFM Dashboard&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글링을 해보니 유저 아이디별 라벨링된 세그먼트명을 태블로 RestAPI 를 활용해서 csv 파일로 다운 받을 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아주 다행스럽게 파이썬 라이브러리가 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/divinorum-webb/tableau-api-lib&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/divinorum-webb/tableau-api-lib&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1736817266015&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - divinorum-webb/tableau-api-lib: An API library that allows developers to call on the methods listed in Tableau's REST A&quot; data-og-description=&quot;An API library that allows developers to call on the methods listed in Tableau's REST API documentation. - divinorum-webb/tableau-api-lib&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/divinorum-webb/tableau-api-lib&quot; data-og-url=&quot;https://github.com/divinorum-webb/tableau-api-lib&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c18O9X/hyX0tXlman/9RFMQKtPXnD9yIgF9jb9nk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/Q6U7H/hyX0mKGF0L/fzkUE7VaAcI7KundvKEJkK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/divinorum-webb/tableau-api-lib&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/divinorum-webb/tableau-api-lib&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c18O9X/hyX0tXlman/9RFMQKtPXnD9yIgF9jb9nk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/Q6U7H/hyX0mKGF0L/fzkUE7VaAcI7KundvKEJkK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - divinorum-webb/tableau-api-lib: An API library that allows developers to call on the methods listed in Tableau's REST A&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;An API library that allows developers to call on the methods listed in Tableau's REST API documentation. - divinorum-webb/tableau-api-lib&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 매번 다운로드해서 관리하지 않아도 정기적으로 RFM 세그먼트의 히스토리 데이터를 적재할 수 있게되고 더불어 이 데이터를 API로 만들어서 Braze에서 쓸 수 있게되면 금상첨화!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구현해보는 걸 나눠서 기록해보려 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 글에서는 GCP에서 빅쿼리를 쿼리하는 Cloud Function 로 API를 구현하는 방법을 포스팅 해볼 예정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; GCP를 활용했고 구현을 위한 프로세스는 아래와 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-01-14 10.05.38.png&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9qbdo/btsLNz84CT6/4olETpsQ9AxpK7KzPOcHD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9qbdo/btsLNz84CT6/4olETpsQ9AxpK7KzPOcHD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9qbdo/btsLNz84CT6/4olETpsQ9AxpK7KzPOcHD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9qbdo%2FbtsLNz84CT6%2F4olETpsQ9AxpK7KzPOcHD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;432&quot; height=&quot;210&quot; data-filename=&quot;스크린샷 2025-01-14 10.05.38.png&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;210&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 Cloud Functions을 2개를 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나는 Tableau Rest API 로 데이터를 소싱하는 함수하나 다른 하나는 Cloud Storage에 적재된 CSV 파일을 빅쿼리에 적재하는 함수다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 클라우드 스케줄러로 데이터를 소싱할 시간을 지정해서 Pub/Sub 메시지를 예약.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. Pub/Sub 메시지로 Cloud Functions을 호출.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 함수가 호출되면 데이터를 CSV 로 추출해서 GCS(Cloud Storage)에 적재한다. (그냥 빅쿼리에 바로 적재해도 되지만 혹시 모르니 파일로 저장해둔다.)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. csv 파일이 GCS에 저장되면 빅쿼리에 데이터를 적재하는 함수를 트리거 시킨다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. 빅쿼리에 적재한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 되면 지정한 시간대로 유저별 세그먼트 라벨이 빅쿼리에 적재되게 된다. 히스토리 데이터로 저장되니 이걸 시각화하면 세그먼트의 변화량을 관찰할 수 있게 된다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 GCS에 태블로의 view를 csv 파일로 저장하는 코드는 아래와 같다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cloud Storage 에 Bucket 은 미리 만들어 두고 함수를 만드시길!&lt;/p&gt;
&lt;pre id=&quot;code_1737269728947&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os
from datetime import datetime
from io import BytesIO
import pandas as pd
from google.cloud import storage
from tableau_api_lib import TableauServerConnection
from config import settings

bucket_name = 'bucket_rfm_history'
blob_name = f&quot;rfm_stat_{datetime.now().strftime('%Y-%m-%d')}.csv&quot;

def save_csv_to_gcs(csv_data):
    &quot;&quot;&quot;
    Cloud Storage에 CSV 데이터를 저장합니다.
    기존 blob이 존재하더라도 새 데이터로 덮어씁니다.
    &quot;&quot;&quot;
    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)
    blob = bucket.blob(blob_name)

    print(f&quot;Saving latest data to '{bucket_name}/{blob_name}'...&quot;)
    blob.upload_from_string(csv_data, content_type='text/csv')
    print(f&quot;Data saved successfully to '{bucket_name}/{blob_name}'.&quot;)

def format_date_columns(df):
    &quot;&quot;&quot;
    날짜 컬럼의 형식을 'YYYY-MM-DD'로 변경
    &quot;&quot;&quot;
    try:
        # 날짜 컬럼 이름 확인
        if 'Day of #1-1. Recency' in df.columns:
            # 공백 제거 및 한글 날짜를 ISO 형식(YYYY-MM-DD)으로 변환
            df['Day of #1-1. Recency'] = (
                df['Day of #1-1. Recency']
                .astype(str)  # 데이터가 문자열 형식임을 보장
                .str.strip()  # 공백 제거
            )
            df['Day of #1-1. Recency'] = pd.to_datetime(
                df['Day of #1-1. Recency'], 
                format='%Y년 %m월 %d일')
            ).dt.strftime('%Y-%m-%d') 
            print(f&quot;Formatted 'Day of #1-1. Recency' column to 'YYYY-MM-DD'.&quot;)
    except Exception as e:
        print(f&quot;Error formatting date columns: {e}&quot;)
    return df

def fetch_tableau_data():
    &quot;&quot;&quot;
    Tableau에서 데이터를 가져와 DataFrame으로 처리하고 CSV 데이터를 반환합니다.
    &quot;&quot;&quot;
    # Tableau config
    config = {
        'tableau_prod': {
            'server': settings['TABLEAU_URL'],
            'api_version': '3.24',
            'personal_access_token_name': settings['TABLEAU_PERSONAL_ACCESS_TOKEN_NAME'],
            'personal_access_token_secret': settings['TABLEAU_PERSONAL_ACCESS_TOKEN_SECRET'],
            'site_name': settings['TABLEAU_SITE_ID'],
            'site_url': settings['TABLEAU_SITE_ID'],
        }
    }

    # Tableau 서버 연결
    conn = TableauServerConnection(config_json=config, env='tableau_prod')
    conn.sign_in()
    print(&quot;Connected to Tableau Server!&quot;)

    # 데이터 가져오기
    view_id = &quot;d0c284ea-ce86-4b9d-8864-b0bf0105118f&quot;
    response = conn.query_view_data(view_id=view_id)

    # CSV 데이터를 DataFrame으로 변환
    csv_data = BytesIO(response.content)
    df = pd.read_csv(csv_data)

    # created_at 컬럼 추가
    today_date = datetime.now().strftime('%Y-%m-%d')
    df['created_at'] = today_date

    # 날짜 컬럼 형식 변경
    df = format_date_columns(df)

    # DataFrame을 CSV로 변환
    csv_with_created_at = df.to_csv(index=False)

    # 데이터 확인 로그
    print(f&quot;DataFrame shape: {df.shape}&quot;)
    print(f&quot;DataFrame preview: \n{df.head()}&quot;)
    conn.sign_out()

    return csv_with_created_at

def main(request, context):
    &quot;&quot;&quot;
    Cloud Function의 엔트리포인트 함수.
    &quot;&quot;&quot;
    try:
        # Tableau 데이터 가져오기
        csv_data = fetch_tableau_data()

        # GCS에 CSV 저장
        save_csv_to_gcs(csv_data)

        return f&quot;Data fetched and saved to {bucket_name}/{blob_name}.&quot;, 200
    except Exception as e:
        print(f&quot;Error: {str(e)}&quot;)
        return f&quot;Error: {str(e)}&quot;, 500&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 csv가 자동으로 저장되었으니 빅쿼리로 퍼다 날라야 되니 그 추가로 함수를 만들어 준다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;gcs.png&quot; data-origin-width=&quot;3052&quot; data-origin-height=&quot;1628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RH2kO/btsLRnJz8cf/GZD8X1MgMAFAslkog6LgKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RH2kO/btsLRnJz8cf/GZD8X1MgMAFAslkog6LgKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RH2kO/btsLRnJz8cf/GZD8X1MgMAFAslkog6LgKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRH2kO%2FbtsLRnJz8cf%2FGZD8X1MgMAFAslkog6LgKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3052&quot; height=&quot;1628&quot; data-filename=&quot;gcs.png&quot; data-origin-width=&quot;3052&quot; data-origin-height=&quot;1628&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 이 함수는 위에서 언급한대로&lt;b&gt;선택한 버킷에서 파일 완료/생성 시&lt;/b&gt; 되어야 된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1737269936194&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os
import logging
from datetime import datetime
import pandas as pd
from io import StringIO 
from google.cloud import storage
from google.cloud import bigquery
from google.cloud.exceptions import NotFound

# 로깅 설정
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

bucket_name = &quot;bucket_rfm_history&quot;
dataset_id = &quot;bucket_data&quot;
table_id = &quot;rfm_history&quot;

# 컬럼 매핑 딕셔너리
COLUMN_MAPPING = {
    &quot;RFM score&quot;: &quot;rfm_score&quot;,
    &quot;#1-2. Frequency&quot;: &quot;frequency&quot;,
    &quot;#1-3. Monetary&quot;: &quot;monetary&quot;,
    &quot;#4. RFM Seg&quot;: &quot;rfm_seg_nm&quot;,
    &quot;Cust Id&quot;: &quot;cust_id&quot;,
    &quot;Day of #1-1. Recency&quot;: &quot;recency&quot;,
    &quot;created_at&quot;: &quot;created_at&quot;,
}

# 컬럼 타입 지정
COLUMN_TYPES = {
    &quot;rfm_score&quot;: &quot;int64&quot;,
    &quot;frequency&quot;: &quot;int64&quot;,
    &quot;monetary&quot;: &quot;int64&quot;,
    &quot;recency&quot;: &quot;datetime64[ns]&quot;,
    &quot;created_at&quot;: &quot;datetime64[ns]&quot;,
}


def sanitize_and_map_columns(df):
    &quot;&quot;&quot;
    컬럼 이름을 요청된 이름으로 매핑하고, 소문자로 변환합니다.
    &quot;&quot;&quot;
    new_columns = []
    for col in df.columns:
        if col in COLUMN_MAPPING:
            # COLUMN_MAPPING에 정의된 컬럼 이름 우선 사용
            new_columns.append(COLUMN_MAPPING[col])
        else:
            # 허용되지 않는 문자 제거 및 알파벳, 숫자, 밑줄(_)로만 구성
            sanitized_col = ''.join(char if char.isalnum() or char == '_' else '_' for char in col)
            sanitized_col = sanitized_col.lower().strip('_')  # 소문자 변환 및 앞뒤 밑줄 제거

            # 첫 글자가 '_'로 시작하지 않도록 수정
            if sanitized_col.startswith('_'):
                sanitized_col = sanitized_col[1:]

            new_columns.append(sanitized_col)
    df.columns = new_columns
    return df


def convert_column_types(df):
    &quot;&quot;&quot;
    컬럼 타입을 지정된 형식으로 변환합니다.
    &quot;&quot;&quot;
    for col, dtype in COLUMN_TYPES.items():
        if col in df.columns:
            try:
                if &quot;datetime&quot; in dtype:
                    df[col] = pd.to_datetime(df[col], errors=&quot;coerce&quot;)
                else:
                    df[col] = df[col].astype(dtype)
                logger.info(f&quot;Converted column '{col}' to type '{dtype}'.&quot;)
            except Exception as e:
                logger.error(f&quot;Error converting column '{col}' to type '{dtype}': {e}&quot;)
    return df


def get_bigquery_table_schema(bigquery_client, dataset_id, table_id):
    &quot;&quot;&quot;
    기존 BigQuery 테이블의 스키마를 가져옵니다.
    &quot;&quot;&quot;
    try:
        table_ref = bigquery_client.dataset(dataset_id).table(table_id)
        table = bigquery_client.get_table(table_ref)
        logger.info(f&quot;Existing table schema: {table.schema}&quot;)
        return table.schema
    except NotFound:
        logger.info(f&quot;Table {table_id} not found. A new table will be created.&quot;)
        return None


def load_csv_to_bigquery(bucket_name, file_name, dataset_id, table_id):
    &quot;&quot;&quot;
    Cloud Storage에 업로드된 CSV 파일을 BigQuery 테이블에 로드하는 함수.
    &quot;&quot;&quot;
    if not file_name.endswith('.csv'):
        logger.info(f&quot;Skipping non-CSV file: {file_name}&quot;)
        return f&quot;File {file_name} is not a CSV. Skipped.&quot;

    logger.info(f&quot;Processing file: {file_name} from bucket: {bucket_name}&quot;)

    # GCS에서 파일 다운로드
    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)
    blob = bucket.blob(file_name)
    csv_data = blob.download_as_string().decode('utf-8')

    # CSV 데이터를 DataFrame으로 로드
    df = pd.read_csv(StringIO(csv_data))

    # 컬럼 이름 정리 및 매핑
    df = sanitize_and_map_columns(df)

    # 컬럼 타입 변환
    df = convert_column_types(df)

    logger.info(f&quot;Sanitized and mapped columns: {df.columns.tolist()}&quot;)
    logger.info(f&quot;Loaded DataFrame with shape: {df.shape}&quot;)
    logger.info(f&quot;DataFrame preview: \n{df.head()}&quot;)

    # BigQuery 클라이언트 초기화
    bigquery_client = bigquery.Client()

    # 테이블 스키마 확인 또는 생성
    existing_schema = get_bigquery_table_schema(bigquery_client, dataset_id, table_id)
    if not existing_schema:
        logger.info(f&quot;Creating new table {table_id}.&quot;)
        schema = [
                    bigquery.SchemaField(
                        name,
                        bigquery.enums.SqlTypeNames.INTEGER if dtype == &quot;int64&quot; 
                        else bigquery.enums.SqlTypeNames.DATE if &quot;datetime&quot; in dtype 
                        else bigquery.enums.SqlTypeNames.STRING)  # 기본값: 문자열
                    for name, dtype in COLUMN_TYPES.items()
        ]       
        
        # DataFrame 컬럼 중 `COLUMN_TYPES`에 없는 컬럼도 문자열로 추가
        for col in df.columns:
            if col not in COLUMN_TYPES:
                schema.append(bigquery.SchemaField(col, bigquery.enums.SqlTypeNames.STRING))

        table_ref = bigquery_client.dataset(dataset_id).table(table_id)
        table = bigquery.Table(table_ref, schema=schema)
        bigquery_client.create_table(table)
        logger.info(f&quot;Table {table_id} created.&quot;)
    else:
        # 기존 스키마와 맞춰 DataFrame 조정
        schema_field_names = [field.name for field in existing_schema]
        df = df[[col for col in df.columns if col in schema_field_names]]
        logger.info(f&quot;Adjusted DataFrame to match existing schema: {df.columns.tolist()}&quot;)

    # BigQuery로 데이터 삽입
    table_ref = bigquery_client.dataset(dataset_id).table(table_id)
    job = bigquery_client.load_table_from_dataframe(df, table_ref)
    job.result()

    logger.info(f&quot;Loaded {df.shape[0]} rows into {dataset_id}:{table_id}.&quot;)
    return f&quot;Loaded {df.shape[0]} rows into {dataset_id}:{table_id}.&quot;


def get_latest_file_from_bucket(bucket_name):
    &quot;&quot;&quot;
    Cloud Storage에서 가장 최근 파일 이름 반환.
    &quot;&quot;&quot;
    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)
    blobs = list(bucket.list_blobs())
    if not blobs:
        raise ValueError(&quot;No files found in bucket.&quot;)
    blobs.sort(key=lambda blob: blob.time_created, reverse=True)
    return blobs[0].name


def main(event, context):
    &quot;&quot;&quot;
    Cloud Function 엔트리포인트.
    &quot;&quot;&quot;
    try:
        file_name = get_latest_file_from_bucket(bucket_name)
        result = load_csv_to_bigquery(bucket_name, file_name, dataset_id, table_id)
        logger.info(result)
        return result
    except Exception as e:
        logger.error(f&quot;Error: {str(e)}&quot;)
        return f&quot;Error: {str(e)}&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 함수가 동작하면 이제 빅쿼리에 아래와 같이 적재가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bq.png&quot; data-origin-width=&quot;2288&quot; data-origin-height=&quot;1524&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZ5TGl/btsLSmiKOw9/v9EhmigmTbhgo1snKkihI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZ5TGl/btsLSmiKOw9/v9EhmigmTbhgo1snKkihI0/img.png&quot; data-alt=&quot;빅쿼리에 태블로 view 데이터 저장하기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZ5TGl/btsLSmiKOw9/v9EhmigmTbhgo1snKkihI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZ5TGl%2FbtsLSmiKOw9%2Fv9EhmigmTbhgo1snKkihI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2288&quot; height=&quot;1524&quot; data-filename=&quot;bq.png&quot; data-origin-width=&quot;2288&quot; data-origin-height=&quot;1524&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;빅쿼리에 태블로 view 데이터 저장하기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 여기서 이걸 브레이즈(Braze) 에 API 를 쓸 수 있게 되면 더 편리해질 것 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 편에서는 GCP 에서 Cloud Functions 를 활용해서 빅쿼리를 쿼리하는 API 를 만드는 방법을 소개해볼 예정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api.htm&quot;&gt;https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api.htm&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1737269766147&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Tableau Server REST API&quot; data-og-description=&quot;With the Tableau Server REST API you can manage and change Tableau Server, Tableau Cloud site, and Prep Conductor resources programmatically, using HTTP&quot; data-og-host=&quot;help.tableau.com&quot; data-og-source-url=&quot;https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api.htm&quot; data-og-url=&quot;https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api.htm&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api.htm&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api.htm&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Tableau Server REST API&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;With the Tableau Server REST API you can manage and change Tableau Server, Tableau Cloud site, and Prep Conductor resources programmatically, using HTTP&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;help.tableau.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>IT 관련</category>
      <category>rfm braze</category>
      <category>tableau api</category>
      <category>tableau rest api</category>
      <category>태블로</category>
      <category>태블로 api</category>
      <author>알랭드보통 사람</author>
      <guid isPermaLink="true">https://botongsaram.tistory.com/15</guid>
      <comments>https://botongsaram.tistory.com/entry/%ED%83%9C%EB%B8%94%EB%A1%9C-Rest-API-%EB%A1%9C-view-%EB%8D%B0%EC%9D%B4%ED%84%B0-csv-%EB%A1%9C-%EB%8B%A4%EC%9A%B4%EB%B0%9B%EA%B3%A0-%EB%B9%85%EC%BF%BC%EB%A6%AC%EC%97%90-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B8%B0#entry15comment</comments>
      <pubDate>Sun, 19 Jan 2025 16:12:24 +0900</pubDate>
    </item>
    <item>
      <title>GoogleAnalytics4 세그먼트 제대로 활용하기</title>
      <link>https://botongsaram.tistory.com/entry/GoogleAnalytics4-%EC%84%B8%EA%B7%B8%EB%A8%BC%ED%8A%B8-%EC%A0%9C%EB%8C%80%EB%A1%9C-%ED%99%9C%EC%9A%A9%ED%95%98%EA%B8%B0</link>
      <description>&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;GA 세그먼트란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분석 데이터의 하위 집합입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자, 세션, 이벤트 데이터를 분리해서 세그먼트를 정의하면 분석하고자 하는 대상을 쉽게 정의할 수 있게 만드는 기능입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세그먼트를 정의하게 되면 특정 유저의 그룹 vs 나머지 유저의 특징을 비교 분석해 볼 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;활용 방법 및 예시&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GA4에서 세그먼트 기능을 통해 웬만한 유저들의 특징을 잡아낼 수 있습니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 GA4가 어떻게 유저들의 행동 데이터를 수집하고 활용하는지 제대로 알지 못하면 활용하기 힘들겠죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는 큰 틀에서 GA4가 어떤 원리로 조건이 설정되는지 알아보려고 합니다.&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;세그먼트 유형 선택하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세그먼트 생성화면을 들여다보면 꽤 많은 조건들을 설정할 수 있는 기능들이 많습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 크게 3가지 유형의 세그먼트가 있습니다. (아래 유형에 대한 이해를 잘하셔야 합니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세그먼트 유형 선택은 세그먼트를 조건에 해당하는 결과와 관련이 있는 거라고 생각하시면 이해하시기 쉬울 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히! 각 유형별로 소스 / 매체 선택할 때 주의할 점을 꼭! 숙지하시길 바랍니다!&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-08-12 10.59.04.png&quot; data-origin-width=&quot;1250&quot; data-origin-height=&quot;118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYAEam/btsI1uXvDW8/ApnFnHxdOUAjNK77HiHWn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYAEam/btsI1uXvDW8/ApnFnHxdOUAjNK77HiHWn0/img.png&quot; data-alt=&quot;GA4 세그먼트 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYAEam/btsI1uXvDW8/ApnFnHxdOUAjNK77HiHWn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYAEam%2FbtsI1uXvDW8%2FApnFnHxdOUAjNK77HiHWn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1250&quot; height=&quot;118&quot; data-filename=&quot;스크린샷 2024-08-12 10.59.04.png&quot; data-origin-width=&quot;1250&quot; data-origin-height=&quot;118&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;GA4 세그먼트 생성&lt;/figcaption&gt;
&lt;/figure&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;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 특정&amp;nbsp;기준을&amp;nbsp;충족하는&amp;nbsp;사용자의&amp;nbsp;모든&amp;nbsp;이벤트를&amp;nbsp;포함하게&amp;nbsp;만듦
&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: #ee2323;&quot;&gt;&quot;방문자&quot;&lt;/span&gt;와 관련된 분석을 한다면 사용자 세그먼트를 활용&lt;/li&gt;
&lt;li&gt;아래 세그먼트 중에 가장 큰 범위&lt;/li&gt;
&lt;li&gt;룩백 윈도우 (일반적으로 90일) 내에 사용자의 전체 구매 경로를 고려함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;트래픽 소스를 정의할 때는 First User(첫 사용자) ~ 로 시작하는&amp;nbsp; 접두사만 선택됩니다.&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-08-19 10.01.13.png&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOdeiL/btsI8nwUWgF/4I6jAvZFZ3cEZMkdcbsoek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOdeiL/btsI8nwUWgF/4I6jAvZFZ3cEZMkdcbsoek/img.png&quot; data-alt=&quot;사용자 세그먼트내 트래픽 소스 정의할 때 범위가 사용자 범위로 되어 있는 첫 사용자 소스/메체 선택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOdeiL/btsI8nwUWgF/4I6jAvZFZ3cEZMkdcbsoek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOdeiL%2FbtsI8nwUWgF%2F4I6jAvZFZ3cEZMkdcbsoek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;605&quot; height=&quot;420&quot; data-filename=&quot;스크린샷 2024-08-19 10.01.13.png&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;420&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사용자 세그먼트내 트래픽 소스 정의할 때 범위가 사용자 범위로 되어 있는 첫 사용자 소스/메체 선택&lt;/figcaption&gt;
&lt;/figure&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;&lt;span&gt;&amp;nbsp;&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&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&quot;방문&quot;&lt;/span&gt;에 초점을 맞추는 세그먼트&lt;/li&gt;
&lt;li&gt;예를 들어 전환이 발생한 특정 세션과 그 순간 유저를 사이트로 유도한 트래픽 소스를 살펴볼 때!&lt;/li&gt;
&lt;li&gt;&lt;b&gt;트래픽 소스를 정의할 때 접두사에 Session 이 되어야 함&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-08-19 10.05.42.png&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;433&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/barxLh/btsI6c45vAZ/aAk7gGE6kykDsK5ZDaYgq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/barxLh/btsI6c45vAZ/aAk7gGE6kykDsK5ZDaYgq1/img.png&quot; data-alt=&quot;세션 세그먼트내 트래픽 소스 정의할 때 범위가 세션 범위로 되어 있는 세션 소스/메체 선택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/barxLh/btsI6c45vAZ/aAk7gGE6kykDsK5ZDaYgq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbarxLh%2FbtsI6c45vAZ%2FaAk7gGE6kykDsK5ZDaYgq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;612&quot; height=&quot;433&quot; data-filename=&quot;스크린샷 2024-08-19 10.05.42.png&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;433&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;세션 세그먼트내 트래픽 소스 정의할 때 범위가 세션 범위로 되어 있는 세션 소스/메체 선택&lt;/figcaption&gt;
&lt;/figure&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;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 기준을 충족하는 특정 이벤트만 포함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자, 세션 기반 세그먼트에 비해 더 구체적인 분석이 가능합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;트래픽 소스를 정의할 때 접두사가 없어야 함&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-08-19 10.11.21.png&quot; data-origin-width=&quot;1306&quot; data-origin-height=&quot;804&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5VYPi/btsI60iC0FM/M5tlalknBIlJNul2lfVVxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5VYPi/btsI60iC0FM/M5tlalknBIlJNul2lfVVxK/img.png&quot; data-alt=&quot;이벤트 세그먼트내 트래픽 소스 정의할 때 측정기준이 기여로 되어 있는 소스/메체 선택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5VYPi/btsI60iC0FM/M5tlalknBIlJNul2lfVVxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5VYPi%2FbtsI60iC0FM%2FM5tlalknBIlJNul2lfVVxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;656&quot; height=&quot;404&quot; data-filename=&quot;스크린샷 2024-08-19 10.11.21.png&quot; data-origin-width=&quot;1306&quot; data-origin-height=&quot;804&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이벤트 세그먼트내 트래픽 소스 정의할 때 측정기준이 기여로 되어 있는 소스/메체 선택&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;이렇게 정의는 그럭저럭 이해는 할 수 있지만 역시 예시를 통해 어떻게 데이터가 선택되는지 알아보겠습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;특정 유저가 2개의 세션 안에서 몇 가지 이벤트를 발생시켰다고 가정해 보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;315&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ukBJQ/btsI1UIpEvY/Qn5mkQaBo2BokxpeS3yK4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ukBJQ/btsI1UIpEvY/Qn5mkQaBo2BokxpeS3yK4K/img.png&quot; data-alt=&quot;예시) 1명의 유저가 생성한 2개의 세션&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ukBJQ/btsI1UIpEvY/Qn5mkQaBo2BokxpeS3yK4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FukBJQ%2FbtsI1UIpEvY%2FQn5mkQaBo2BokxpeS3yK4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;315&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;315&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예시) 1명의 유저가 생성한 2개의 세션&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. 사용자 세그먼트 예시&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;사용자 세그먼트 기준으로 구매한 유저를 세그먼트를 만들면 어떻게 데이터가 선택될까요?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;총 7개의 이벤트가 모두 선택됩니다. 사용자 기준이니까 조회한 날짜에 있는 이벤트가 모두 포함되기 때문입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;435&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vk88n/btsI8RxZOIL/IJQTH2iqNalVjSvLMoWsk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vk88n/btsI8RxZOIL/IJQTH2iqNalVjSvLMoWsk0/img.png&quot; data-alt=&quot;사용자 세그먼트 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vk88n/btsI8RxZOIL/IJQTH2iqNalVjSvLMoWsk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvk88n%2FbtsI8RxZOIL%2FIJQTH2iqNalVjSvLMoWsk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;435&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;435&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사용자 세그먼트 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 세션 세그먼트 예시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최소 한 개의 구매 이벤트가 발생한 모든 세션의 데이터기 때문에 이 기준으로 충족되는 데이터는 purchase(구매) 이벤트가 발생한&lt;span&gt;&amp;nbsp;&lt;/span&gt;session - 2 만 선택됩니다( session - 1 에는 구매 이벤트가 없음)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ocfYm/btsI8FRWZn2/fGiBWr7PeEc8hdsRlJpkbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ocfYm/btsI8FRWZn2/fGiBWr7PeEc8hdsRlJpkbk/img.png&quot; data-alt=&quot;세션 세그먼트 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ocfYm/btsI8FRWZn2/fGiBWr7PeEc8hdsRlJpkbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FocfYm%2FbtsI8FRWZn2%2FfGiBWr7PeEc8hdsRlJpkbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;442&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;세션 세그먼트 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 이벤트 세그먼트 예시&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트 기준이면 기준에 맞는 이벤트만 선택한다는 말이기 때문에 session - 2에서 발생한 purchase 이벤트만!! 선택됩니다. 다른 이벤트는 선택 안됩니다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d2QKjb/btsI7eVGmZg/pnL5rECgsJWJf3sOwyvhYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d2QKjb/btsI7eVGmZg/pnL5rECgsJWJf3sOwyvhYK/img.png&quot; data-alt=&quot;이벤트 세그먼트 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d2QKjb/btsI7eVGmZg/pnL5rECgsJWJf3sOwyvhYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd2QKjb%2FbtsI7eVGmZg%2FpnL5rECgsJWJf3sOwyvhYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;442&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이벤트 세그먼트 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;조건 범위 설정하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서는 어떤 조건의 유저를 선택할지 셋팅하는 옵션을 선택할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-08-12 12.21.58.png&quot; data-origin-width=&quot;961&quot; data-origin-height=&quot;356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biYOTX/btsI1Wl1c6d/l1xryTtNKlYFilMJsGM4PK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biYOTX/btsI1Wl1c6d/l1xryTtNKlYFilMJsGM4PK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biYOTX/btsI1Wl1c6d/l1xryTtNKlYFilMJsGM4PK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiYOTX%2FbtsI1Wl1c6d%2Fl1xryTtNKlYFilMJsGM4PK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;961&quot; height=&quot;356&quot; data-filename=&quot;스크린샷 2024-08-12 12.21.58.png&quot; data-origin-width=&quot;961&quot; data-origin-height=&quot;356&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기서 AND, OR 조건을 선택할 수 있는데 회원가입과 구매 이벤트를 발생시킨 유저 선택해 보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-08-12 12.25.23.png&quot; data-origin-width=&quot;1575&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d8VO4C/btsI0J8ZkNn/ZUh2jvxgVj6KQ1Z2YNaQb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d8VO4C/btsI0J8ZkNn/ZUh2jvxgVj6KQ1Z2YNaQb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d8VO4C/btsI0J8ZkNn/ZUh2jvxgVj6KQ1Z2YNaQb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd8VO4C%2FbtsI0J8ZkNn%2FZUh2jvxgVj6KQ1Z2YNaQb0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1575&quot; height=&quot;314&quot; data-filename=&quot;스크린샷 2024-08-12 12.25.23.png&quot; data-origin-width=&quot;1575&quot; data-origin-height=&quot;314&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그런데 하단에 보면 포함할 조건 그룹 추가라는 버튼이 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-08-12 12.26.32.png&quot; data-origin-width=&quot;1569&quot; data-origin-height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tiGOz/btsI2fey2nt/oiBrIiAVNcxcKLuQysqdg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tiGOz/btsI2fey2nt/oiBrIiAVNcxcKLuQysqdg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tiGOz/btsI2fey2nt/oiBrIiAVNcxcKLuQysqdg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtiGOz%2FbtsI2fey2nt%2FoiBrIiAVNcxcKLuQysqdg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1569&quot; height=&quot;394&quot; data-filename=&quot;스크린샷 2024-08-12 12.26.32.png&quot; data-origin-width=&quot;1569&quot; data-origin-height=&quot;394&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;동일한 방식으로 회원가입과 구매를 한 조건을 설정하면 이렇게 할 수 있죠&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-08-12 12.26.59.png&quot; data-origin-width=&quot;1574&quot; data-origin-height=&quot;487&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s5hkg/btsI0CWyqfC/EItWU1v9kIuYcXW5mqkcu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s5hkg/btsI0CWyqfC/EItWU1v9kIuYcXW5mqkcu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s5hkg/btsI0CWyqfC/EItWU1v9kIuYcXW5mqkcu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs5hkg%2FbtsI0CWyqfC%2FEItWU1v9kIuYcXW5mqkcu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1574&quot; height=&quot;487&quot; data-filename=&quot;스크린샷 2024-08-12 12.26.59.png&quot; data-origin-width=&quot;1574&quot; data-origin-height=&quot;487&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;즉 하나의 조건 그룹에 회원가입 이벤트와 구매 이벤트를 선택한 것이고 나머지 하나는 두 개의 조건 그룹에 회원가입 이벤트와 구매 이벤트가 각각 설정을 했습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;첫 번째 방식과 차이점은 뭘까요? 동일한 결과가 나올까요? 결과는 동일합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;???&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이게 무슨 말이냐면 그룹 간 영역에서 오른쪽 상단에 보면 사람모양의 드롭다운 버튼이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-08-07 15.36.30.png&quot; data-origin-width=&quot;1783&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czrkeP/btsI2tKCBHR/IecC4IogRfhjgD5ojawtd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czrkeP/btsI2tKCBHR/IecC4IogRfhjgD5ojawtd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czrkeP/btsI2tKCBHR/IecC4IogRfhjgD5ojawtd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczrkeP%2FbtsI2tKCBHR%2FIecC4IogRfhjgD5ojawtd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1783&quot; height=&quot;500&quot; data-filename=&quot;스크린샷 2024-08-07 15.36.30.png&quot; data-origin-width=&quot;1783&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이걸 클릭하면 조건 범위를 지정할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;세그먼트 설정할 때랑 동일한 방식이죠? 사용자, 세션, 이벤트 단위로 조건설정이 가능합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-08-07 15.36.46.png&quot; data-origin-width=&quot;241&quot; data-origin-height=&quot;153&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3c33g/btsI03TS95l/oKHNoN4BEA9VIn5kBolDP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3c33g/btsI03TS95l/oKHNoN4BEA9VIn5kBolDP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3c33g/btsI03TS95l/oKHNoN4BEA9VIn5kBolDP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3c33g%2FbtsI03TS95l%2FoKHNoN4BEA9VIn5kBolDP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;241&quot; height=&quot;153&quot; data-filename=&quot;스크린샷 2024-08-07 15.36.46.png&quot; data-origin-width=&quot;241&quot; data-origin-height=&quot;153&quot;/&gt;&lt;/span&gt;&lt;/figure&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 조건일 때 동일한 조건 그룹에 여러 가지 조건이 있으면 조건 A가 session - 1에서 발생하고 조건 B가 session - 2에서 발생했다면 유저는 세그먼트에 포함됩니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;이 조건일 때는 유저의 Life Time 동안 조건이 충족됩니다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;동일 세션 내
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(세그먼트 생성 시 사용자 세그먼트를 선택했어도) 조건 A랑 조건 B가 동일한 세션(session - 1 or session - 2)내에서 발생하는 조건&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&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;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #252525; text-align: start;&quot;&gt;세션 및 이벤트 세그먼트에는 조건 지정 범위에 대한 옵션이 더 적습니다. 아래 표는&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #252525; text-align: start;&quot;&gt;사용할 수 있는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;세그먼트 유형별 조건 범위 간 조합입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 78px;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 18px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px; text-align: center;&quot;&gt;사용자 세그먼트&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px; text-align: center;&quot;&gt;세션 세그먼트&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px; text-align: center;&quot;&gt;이벤트 세그먼트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 20px; text-align: center;&quot;&gt;모든 세션&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px; text-align: center;&quot;&gt;✅&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px; text-align: center;&quot;&gt;❌&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px; text-align: center;&quot;&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 20px; text-align: center;&quot;&gt;동일 세션 내&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px; text-align: center;&quot;&gt;✅&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px; text-align: center;&quot;&gt;✅&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px; text-align: center;&quot;&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 20px; text-align: center;&quot;&gt;동일 이벤트 내&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px; text-align: center;&quot;&gt;✅&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px; text-align: center;&quot;&gt;✅&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px; text-align: center;&quot;&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 예시를 들어볼게요&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GA4에서 첫 구매 유저를 따로 이벤트를 개발하지 않으면 특정하기 힘든데 회원가입 후 첫 구매 유저를 세그먼트로 한 번 만들어 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 유저들을 특정하기 위한 필요한 이벤트는 first_visit(첫 방문)과 purchase 이벤트겠죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 구매 유저를 특정한다고 해도 이를 어떻게 정의하느냐에 따라 결과는 달라집니다! (주의!!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유저의 행동은 정말 엄청나게 많은 경우의 수로 발생을 하죠.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A유저 : 구매 의사 결정이 빠른 A유저는 동일한 세션 시간 내에서 구매&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;B유저 : 구매 의사 결정이 느린 B유저는 어제 상품을 처음 둘러보고 내일 구매&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 예시처럼 첫 구매를 동일한 세션 시간내 첫 구매를 한 유저를 특정할 것인지, 세션에 상관없이 첫 구매 유저를 식별한 것인지 정의하기 나름입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;첫 구매 유저 세그먼트를 만든다면 어떤 조건을 설정해야 될까요?&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 세그먼트를 기준으로 세그먼트를 설정하면 유저의 조건에 해당하지 않는 방문데이터도 포함되게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러니까  첫 방문 이후 첫 세션에 구매를 하지 않아도 구매를 특정시킨 뒤에 제외 조건을 구매 조건을&amp;nbsp; 2번 이상으로 설정하여 첫 구매한 유저를 식별할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-08-19 12.24.41.png&quot; data-origin-width=&quot;1531&quot; data-origin-height=&quot;692&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZzLqx/btsI6Yr3d59/cugBRSq04TmQcUE8Q3oVUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZzLqx/btsI6Yr3d59/cugBRSq04TmQcUE8Q3oVUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZzLqx/btsI6Yr3d59/cugBRSq04TmQcUE8Q3oVUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZzLqx%2FbtsI6Yr3d59%2FcugBRSq04TmQcUE8Q3oVUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1531&quot; height=&quot;692&quot; data-filename=&quot;스크린샷 2024-08-19 12.24.41.png&quot; data-origin-width=&quot;1531&quot; data-origin-height=&quot;692&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 first_visit, 첫 구매 사용자의 방문 데이터만 확인하고자 한다면 사용자 세그먼트가 아닌 세션 세그먼트를 기준으로 동일 세션 내의 조건 범위를 선택하여 세그먼트를 생성해야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-08-19 14.00.51.png&quot; data-origin-width=&quot;1542&quot; data-origin-height=&quot;624&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qlOcx/btsI6X00v6F/LZRR0quRswSK8T4yO7UaLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qlOcx/btsI6X00v6F/LZRR0quRswSK8T4yO7UaLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qlOcx/btsI6X00v6F/LZRR0quRswSK8T4yO7UaLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqlOcx%2FbtsI6X00v6F%2FLZRR0quRswSK8T4yO7UaLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1542&quot; height=&quot;624&quot; data-filename=&quot;스크린샷 2024-08-19 14.00.51.png&quot; data-origin-width=&quot;1542&quot; data-origin-height=&quot;624&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 구매 유저를 모든 세션 범위 조건으로 하여 세그먼트를 생성하고 재구매자(purchase 이벤트가 2번 이상)와 겹치는 부분이 없는지 세그먼트 중복 기능을 활용해 벤다이어그램으로 확인해 보겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1385&quot; data-origin-height=&quot;636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0dojk/btsI7nLMe30/ZmxW5KeRXra7yL4rhmUSXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0dojk/btsI7nLMe30/ZmxW5KeRXra7yL4rhmUSXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0dojk/btsI7nLMe30/ZmxW5KeRXra7yL4rhmUSXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0dojk%2FbtsI7nLMe30%2FZmxW5KeRXra7yL4rhmUSXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1385&quot; height=&quot;636&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1385&quot; data-origin-height=&quot;636&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GA의 세그먼트는 생각보다 할 수 있는 게 많긴 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 제대로 활용하기 위해서는 위에 설명한 개념들이 잘 정리가 되어 있어야 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글을 쓰면서 느낀 건 솔직히 GA4는 사실 Amplitude를 사용해 봤다면 이런게 다 있나 싶을 정도로 불편하고... 뭔가 찜찜한 느낌을 지울 수 없었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서 첫 구매 유저 세그먼트를 예시로 들었는데 GA4에서 First time purchases라는 측정항목이 존재하긴 하지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 세그먼트로 활용은 못합니다...&amp;nbsp; 약간 독립적인 측정항목 같은 느낌입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GA4내 First time purchasers(&lt;span style=&quot;background-color: #ecf3fe; color: #0b57d0; text-align: left;&quot;&gt;처음 구매자 수&lt;/span&gt;)라는 측정항목의 정의를 진짜 유저의 히스토리컬 데이터를 기반으로 첫 구매 이벤트를 측정한다고 합니다. 이걸 그런데.. 세그먼트로 못쓴다니..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Amplitude에서는 사실 아주 간단하게 첫 구매 유저를 특정할 수 있는 Historical Count 기능이 있어서.. 아쉬웠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(물론 제약 조건은 있습니다. 날짜 범위가 시작되기&amp;nbsp;&lt;b&gt;전 최대 1년까지&amp;nbsp;&lt;/b&gt;기간만 포함됩니다. 그래도 이건 혁명적인 기능!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-08-19 15.07.30.png&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;494&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6ws0d/btsI8pINrvP/mxfAdJ6oo7TAIEiYEeS9Wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6ws0d/btsI8pINrvP/mxfAdJ6oo7TAIEiYEeS9Wk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6ws0d/btsI8pINrvP/mxfAdJ6oo7TAIEiYEeS9Wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6ws0d%2FbtsI8pINrvP%2FmxfAdJ6oo7TAIEiYEeS9Wk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;550&quot; height=&quot;494&quot; data-filename=&quot;스크린샷 2024-08-19 15.07.30.png&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;494&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본질적으로 GA의 목적은 유저 획득에 초점을 맞춰져 있다면 Amplitude는 Product Analytics 툴로 사용자 행동 분석에 초점이 맞춰져 있긴 합니다. 그래서 목적에 맞지 않아서 해당 기능 개발을 하지 않은 건가 싶기도 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당장 앰플리튜드를 도입하지 않을 거라면 속 편하게 GA4에서 First Purchase 이벤트 개발을 요청하거나 혹은 일단 소개드린 방식대로 우선 트렌드만 확인하는 용도로 세그먼트를 생성해서 데이터를 분석하시는 걸 권장드립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT 관련</category>
      <category>amplitude vs ga4</category>
      <category>ga4 first purchaser</category>
      <category>ga4첫구매</category>
      <category>첫구매</category>
      <category>첫구매유저세그먼트</category>
      <author>알랭드보통 사람</author>
      <guid isPermaLink="true">https://botongsaram.tistory.com/14</guid>
      <comments>https://botongsaram.tistory.com/entry/GoogleAnalytics4-%EC%84%B8%EA%B7%B8%EB%A8%BC%ED%8A%B8-%EC%A0%9C%EB%8C%80%EB%A1%9C-%ED%99%9C%EC%9A%A9%ED%95%98%EA%B8%B0#entry14comment</comments>
      <pubDate>Mon, 19 Aug 2024 15:50:40 +0900</pubDate>
    </item>
    <item>
      <title>GA4에서 세션 지표는 이해하고 사용하셔야 합니다.</title>
      <link>https://botongsaram.tistory.com/entry/GA4%EC%97%90%EC%84%9C-%EC%84%B8%EC%85%98-%EC%A7%80%ED%91%9C%EB%8A%94-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B3%A0-%EC%82%AC%EC%9A%A9%ED%95%98%EC%85%94%EC%95%BC-%ED%95%A9%EB%8B%88%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Google Analytics를 사용해 보셨다면 &amp;lsquo;세션&amp;rsquo;이라는 용어에 익숙하실 것입니다. Universal Analytics(GA3)에서는 세션 단위로 데이터를 수집하여 지표를 측정했지만, GA4에서는 데이터 수집 방식이 달라져 주의가 필요합니다. GA4의 세션 관련 지표는 혼란을 일으킬 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는 세션의 개념을 자세히 살펴보고, GA4에서의 세션이 어떻게 다른지 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;세션이란?&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션 관련해서 구글 가이드 문서에 따르면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;- 세션은 사용자가 웹사이트 또는 앱과 상호작용하는 기간입니다.&lt;br /&gt;- 세션은 사용자가 앱을 포그라운드에서 열거나 페이지나 화면을 보고 현재 활성화된 세션이 없는 경우 시작됩니다.&lt;br /&gt;- 세션 수 : 고유 세션 ID 수를 추정하여 사이트나 앱에서 발생하는 세션 수를 계산합니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를들어 유저가 브라우저 탭에서 페이지를 열고 이메일을 확인하거나 다른 일을 하다가 2시간 뒤에 다시 돌아와서 브라우징을 할 수 있겠죠? GA4에서는 이를 페이지 뷰가 있는 세션으로 보고 2시간 뒤에 사용자 참여로 간주하고 새로운 세션으로 기록합니다.&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;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자가 오전 9시에 웹사이트의 특정 페이지를 엽니다.&lt;/li&gt;
&lt;li&gt;페이지 조회(page view) 이벤트가 발생하여 세션이 시작됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;두 번째 세션&lt;/b&gt;:
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;사용자가 같은 페이지를 오후 2시에 다시 돌아와 사이트를 탐색합니다&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 새로운 세션이 시작되지만 페이지 조회 이벤트는 기록되지 않습니다.&amp;rarr; 두 번째 세션이 사용자 참여로만 기록됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빅쿼리로 실제 어떤 케이스인지 특정 유저의 로그를 한 번 확인 해보겟습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-08-08 13.54.49.png&quot; data-origin-width=&quot;593&quot; data-origin-height=&quot;583&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bP1gzr/btsIYVnCDRm/YWfoksoyXKJMcnInvI5Qtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bP1gzr/btsIYVnCDRm/YWfoksoyXKJMcnInvI5Qtk/img.png&quot; data-alt=&quot;빅쿼리 조회 결과 - 페이지뷰가 없는 세션&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bP1gzr/btsIYVnCDRm/YWfoksoyXKJMcnInvI5Qtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbP1gzr%2FbtsIYVnCDRm%2FYWfoksoyXKJMcnInvI5Qtk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;593&quot; height=&quot;583&quot; data-filename=&quot;스크린샷 2024-08-08 13.54.49.png&quot; data-origin-width=&quot;593&quot; data-origin-height=&quot;583&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;빅쿼리 조회 결과 - 페이지뷰가 없는 세션&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 페이지뷰 이벤트가 없는 두 번째 세션이 생기며, 이는 참여율(Engagement Rate) 지표로 나타납니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참여율 = 참여 세션 수 / 총 세션 수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;참여 세션의 정의&lt;/b&gt;&lt;br /&gt;- 10초 이상 머문 경우 (GA4 설정 : 10~60초로 조정 가능)&lt;br /&gt;- 페이지뷰가 2회 이상 발생한 경우&lt;br /&gt;- 10초이내로 머물러도 전환이벤트를 발생시킨 경우&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-08-08 17.37.39.png&quot; data-origin-width=&quot;321&quot; data-origin-height=&quot;339&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo6EaS/btsIXZkd3sD/Rp2dNtfVNMgdRawqbP8NGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo6EaS/btsIXZkd3sD/Rp2dNtfVNMgdRawqbP8NGk/img.png&quot; data-alt=&quot;GA4 인터페이스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo6EaS/btsIXZkd3sD/Rp2dNtfVNMgdRawqbP8NGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo6EaS%2FbtsIXZkd3sD%2FRp2dNtfVNMgdRawqbP8NGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;321&quot; height=&quot;339&quot; data-filename=&quot;스크린샷 2024-08-08 17.37.39.png&quot; data-origin-width=&quot;321&quot; data-origin-height=&quot;339&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;GA4 인터페이스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 유저가 많아지면 세션 기반의 지표(예: 세션당 페이지뷰, 세션당 평균 참여시간)가 낮아집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션당 페이지뷰 수 계산 예시:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이지뷰 수 / 세션 수 = 10 / 1 = 10&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 유저의 행동이 늘어나면:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이지뷰 수 / 세션 수 = 10 / 2 = 5&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이지뷰 이벤트가 포함되지 않은 세션이 발생하니 지표가 감소하게 됩니다.(분모가 커지므로)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 GA3에서 사용하던 세션 기반의 지표는 주의해서 사용해야 하며, 이벤트나 참여 관련 지표(참여 세션)를 보는 것이 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(GA4와 GA3의 데이터 수집 방식도 다릅니다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자.. 그리고 또 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션 데이터의 현실.. 빅쿼리를 열어보면 .. 더 조심해야겠구나 라는 생각이 들껍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 절대 &lt;i&gt;세션수 &amp;ne; session_start&lt;/i&gt; 이벤트의 수 가 아닙니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜그런지 직접 조회해보죠!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;session_start 이벤트가 없는 세션이 있다?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 특정 유저의 세션을 특정해서 조회해봤습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;event_name 컬럼에 session_start 이벤트는 없고 다른 이벤트만 있죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-08-08 12.21.39.png&quot; data-origin-width=&quot;1102&quot; data-origin-height=&quot;843&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QHEGN/btsIZvBT4pK/plnJmXhqyFs5HztyjSkenk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QHEGN/btsIZvBT4pK/plnJmXhqyFs5HztyjSkenk/img.png&quot; data-alt=&quot;session_start 이벤트가 없는 세션 ID&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QHEGN/btsIZvBT4pK/plnJmXhqyFs5HztyjSkenk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQHEGN%2FbtsIZvBT4pK%2FplnJmXhqyFs5HztyjSkenk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1102&quot; height=&quot;843&quot; data-filename=&quot;스크린샷 2024-08-08 12.21.39.png&quot; data-origin-width=&quot;1102&quot; data-origin-height=&quot;843&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;session_start 이벤트가 없는 세션 ID&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;하나의 세션에 session_start 이벤트가 2개?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 상황은 빈번하지 않지만 발생할 수 있습니다. 하나의 세션에 두 개의 세션 이벤트가 발생했고, 심지어 사용자 아이디도 다릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GA4 인터페이스에서는 당연히 단일 세션으로 계산하지 않을 것 같지만 빅쿼리에서는 이런 케이스 때문에 &lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: start;&quot;&gt;user_pseudo_id와 ga_session_id를 조합해서 각 세션에 대한 고유 식별자를 만들어서 session 을 카운팅 해야됩니다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1723107175865&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;concat(user_pseudo_id, (select value.int_value from unnest(event_params) where key = 'ga_session_id')) as session_id,&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-08-08 15.46.15.png&quot; data-origin-width=&quot;1329&quot; data-origin-height=&quot;592&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cL1WIW/btsIYbkcvtW/dHZK6tg5q8tpQivA24taq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cL1WIW/btsIYbkcvtW/dHZK6tg5q8tpQivA24taq0/img.png&quot; data-alt=&quot;하나의 세션에 session_start가 두개&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cL1WIW/btsIYbkcvtW/dHZK6tg5q8tpQivA24taq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcL1WIW%2FbtsIYbkcvtW%2FdHZK6tg5q8tpQivA24taq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1329&quot; height=&quot;592&quot; data-filename=&quot;스크린샷 2024-08-08 15.46.15.png&quot; data-origin-width=&quot;1329&quot; data-origin-height=&quot;592&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;하나의 세션에 session_start가 두개&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;하나의 세션에 2개 이상의 소스?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GA3에서는 세션 윈도우(30분)가 지나면 완전히 새로운 세션이 시작되지만, GA4에서는 기존 세션이 계속 되기 때문에 이렇게 소스가 1개 이상 발생할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-08-08 15.43.50.png&quot; data-origin-width=&quot;1348&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mjYJt/btsIXeIQaV1/fm6zqkJFLuoEkV9b7lAeVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mjYJt/btsIXeIQaV1/fm6zqkJFLuoEkV9b7lAeVk/img.png&quot; data-alt=&quot;하나의 세션에 2개 이상의 소스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mjYJt/btsIXeIQaV1/fm6zqkJFLuoEkV9b7lAeVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmjYJt%2FbtsIXeIQaV1%2Ffm6zqkJFLuoEkV9b7lAeVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1348&quot; height=&quot;310&quot; data-filename=&quot;스크린샷 2024-08-08 15.43.50.png&quot; data-origin-width=&quot;1348&quot; data-origin-height=&quot;310&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;하나의 세션에 2개 이상의 소스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;GA에서 세션은 어떻게 계산될까?&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글 애널리틱스에서도 세션수를 집계할 때 추정값을 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 빅쿼리에 count(distinct ga_sesssion_id) 를 집계하면 성능에 영향을 줍니다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 전 세계에서 이걸 조회하는데 이걸 진짜 집계를 ?? 불가능하죠&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 HyperLogLog ++ (&lt;a title=&quot;가이드 링크&quot; href=&quot;https://developers.google.com/analytics/blog/2022/hll?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;가이드 링크&lt;/a&gt;)라는 알고리즘을 적용해서 추산한 값을 보여줍니다.&lt;/p&gt;
&lt;figure id=&quot;og_1723104268605&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Google 애널리틱스의 고유 개수 근사값 &amp;nbsp;|&amp;nbsp; Google Analytics &amp;nbsp;|&amp;nbsp; Google for Developers&quot; data-og-description=&quot;의견 보내기 Google 애널리틱스의 고유 개수 근사값 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 민하즈 카지, Google 애널리틱스 Developer Advocate &amp;ndash; 2022년 10월&quot; data-og-host=&quot;developers.google.com&quot; data-og-source-url=&quot;https://developers.google.com/analytics/blog/2022/hll?hl=ko&quot; data-og-url=&quot;https://developers.google.com/analytics/blog/2022/hll?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ba93X3/hyWKCaq5ol/fOkA9rlAxUXru8vLNwJOF1/img.png?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675&quot;&gt;&lt;a href=&quot;https://developers.google.com/analytics/blog/2022/hll?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developers.google.com/analytics/blog/2022/hll?hl=ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ba93X3/hyWKCaq5ol/fOkA9rlAxUXru8vLNwJOF1/img.png?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Google 애널리틱스의 고유 개수 근사값 &amp;nbsp;|&amp;nbsp; Google Analytics &amp;nbsp;|&amp;nbsp; Google for Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;의견 보내기 Google 애널리틱스의 고유 개수 근사값 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 민하즈 카지, Google 애널리틱스 Developer Advocate &amp;ndash; 2022년 10월&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developers.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 성능을 눈으로 확인해보죠&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ga_session_id를 고유하게 카운팅 해보는 쿼리로 비교를 해보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1723104306484&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;COUNT(DISTINCT ga_session_id)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-08-08 16.42.33.png&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;969&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lkQco/btsIX73luVe/PHssTC3eZoqlFSU2SCplx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lkQco/btsIX73luVe/PHssTC3eZoqlFSU2SCplx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lkQco/btsIX73luVe/PHssTC3eZoqlFSU2SCplx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlkQco%2FbtsIX73luVe%2FPHssTC3eZoqlFSU2SCplx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1874&quot; height=&quot;969&quot; data-filename=&quot;스크린샷 2024-08-08 16.42.33.png&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;969&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1723104335569&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  HLL_COUNT.EXTRACT(HLL_COUNT.INIT(ga_session_id, 14))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-08-08 16.43.58.png&quot; data-origin-width=&quot;1253&quot; data-origin-height=&quot;774&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXP61e/btsIYaZQXNt/kvQyrineK2hiE94GFb0ASk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXP61e/btsIYaZQXNt/kvQyrineK2hiE94GFb0ASk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXP61e/btsIYaZQXNt/kvQyrineK2hiE94GFb0ASk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXP61e%2FbtsIYaZQXNt%2FkvQyrineK2hiE94GFb0ASk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1253&quot; height=&quot;774&quot; data-filename=&quot;스크린샷 2024-08-08 16.43.58.png&quot; data-origin-width=&quot;1253&quot; data-origin-height=&quot;774&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;차이가 보이시나요? (참고로 데이터 하루치만 조회했고 쿼리 결과는 같습니다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든면에서 더 효율적인 처리를 하고 있음을 알 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 GA4에서는 세션이라는 개념은 더 이상 의미가 없고 지금까지 위의 예시를 통해 확인할 수 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼에도 세션 지표를 무조건 써야된다면 &lt;b&gt;참여 세션&lt;/b&gt;지표를 사용하는게 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이걸 통해서 다음 글에서는 GA4의 꽃 세그먼트 분석에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(세그먼트 기능을 쓰려면 세션에 대한 이해가 꼭 필요하기 때문에 이번 글부터 시작하게 되었습니다.)&lt;/p&gt;</description>
      <category>모바일 마케팅</category>
      <category>GA4</category>
      <category>ga4 session</category>
      <category>ga4 세션</category>
      <category>ga4 참여 세션</category>
      <category>ga4 참여 세션의 정의</category>
      <author>알랭드보통 사람</author>
      <guid isPermaLink="true">https://botongsaram.tistory.com/13</guid>
      <comments>https://botongsaram.tistory.com/entry/GA4%EC%97%90%EC%84%9C-%EC%84%B8%EC%85%98-%EC%A7%80%ED%91%9C%EB%8A%94-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B3%A0-%EC%82%AC%EC%9A%A9%ED%95%98%EC%85%94%EC%95%BC-%ED%95%A9%EB%8B%88%EB%8B%A4#entry13comment</comments>
      <pubDate>Thu, 8 Aug 2024 17:08:59 +0900</pubDate>
    </item>
    <item>
      <title>GA4 Query Explorer 에서 csv 파일로 바로 내려 받는 방법</title>
      <link>https://botongsaram.tistory.com/entry/GA4-Query-Explorer-%EC%97%90%EC%84%9C-csv-%ED%8C%8C%EC%9D%BC%EB%A1%9C-%EB%82%B4%EB%A0%A4-%EB%B0%9B%EB%8A%94-%EB%B0%A9%EB%B2%95</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;GA4 데이터를 따로 데이터 마트에 저장해서 활용하고 싶을 때&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹은 원하는 view의 테이블 형태를 조회하고 싶을 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Query Explorer 를 한 번쯤을 들어가 보셨던 경험이 있으실 거예요 (&lt;a href=&quot;https://ga-dev-tools.google/ga4/query-explorer/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;)&lt;/p&gt;
&lt;figure id=&quot;og_1722584337703&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;https://ga-dev-tools.google/ga4/query-explorer/&quot; data-og-description=&quot;&quot; data-og-host=&quot;ga-dev-tools.google&quot; data-og-source-url=&quot;https://ga-dev-tools.google/ga4/query-explorer/&quot; data-og-url=&quot;https://ga-dev-tools.google/ga4/query-explorer/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://ga-dev-tools.google/ga4/query-explorer/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ga-dev-tools.google/ga4/query-explorer/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;https://ga-dev-tools.google/ga4/query-explorer/&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ga-dev-tools.google&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 수집하려는 차원과 측정값을 선택해서 손쉽게 API를 호출해서 데이터를 확인해 볼 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 Query Explorer에서 어떤 차원과 측정값을 가져올지 확인한다음 Google Analytics Data API를 사용해 데이터를 가져오는 코드를 작성해야 되는데 우리는 GPT로 인해 이런 수고를 덜 수 있게 되었습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;iShot_2024-08-02_16.37.25.png&quot; data-origin-width=&quot;1143&quot; data-origin-height=&quot;1435&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGC500/btsITOu3D6q/0BgJv1Fpxt8nuMeKZnAXik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGC500/btsITOu3D6q/0BgJv1Fpxt8nuMeKZnAXik/img.png&quot; data-alt=&quot;query explorer&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGC500/btsITOu3D6q/0BgJv1Fpxt8nuMeKZnAXik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGC500%2FbtsITOu3D6q%2F0BgJv1Fpxt8nuMeKZnAXik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1143&quot; height=&quot;1435&quot; data-filename=&quot;iShot_2024-08-02_16.37.25.png&quot; data-origin-width=&quot;1143&quot; data-origin-height=&quot;1435&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;query explorer&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에 처럼 차원과 측정값을 선택하고 기호에 따라 정렬 혹은 필터도 가능합니다. 그런다음에 Make Request를 하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;iShot_2024-08-02_16.42.35.png&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;1244&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eabkOz/btsITChn4yr/tttl2SByrlijOSc2gfQPmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eabkOz/btsITChn4yr/tttl2SByrlijOSc2gfQPmK/img.png&quot; data-alt=&quot;api 호출하기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eabkOz/btsITChn4yr/tttl2SByrlijOSc2gfQPmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeabkOz%2FbtsITChn4yr%2Ftttl2SByrlijOSc2gfQPmK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;678&quot; height=&quot;1244&quot; data-filename=&quot;iShot_2024-08-02_16.42.35.png&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;1244&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;api 호출하기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 응답값을 바로 받아 볼 수 있습니다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데... 데이터를 다운로드 받을 수 있는 버튼이 어디에도 없습니다...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 우리는 이제 인공지능의 힘을 빌릴 수 있어서 Chat GPT를 소환합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소환하기 전에 JSON 탭을 클릭하고 오른쪽에 복사 버튼을 눌러줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-08-02 16.44.49.png&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;701&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdDHk7/btsIUfsuxEx/iBH3C9Y05wqKxPw2DlRZzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdDHk7/btsIUfsuxEx/iBH3C9Y05wqKxPw2DlRZzk/img.png&quot; data-alt=&quot;ga4 json 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdDHk7/btsIUfsuxEx/iBH3C9Y05wqKxPw2DlRZzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdDHk7%2FbtsIUfsuxEx%2FiBH3C9Y05wqKxPw2DlRZzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;659&quot; height=&quot;701&quot; data-filename=&quot;스크린샷 2024-08-02 16.44.49.png&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;701&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ga4 json 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sublime text(코드 편집기) 를 실행시켜 줍니다. visual studio code 도 상관없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;없으시면 여기서 다운로드하여주세요 (&lt;a href=&quot;https://www.sublimetext.com/download&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;)&lt;/p&gt;
&lt;figure id=&quot;og_1722584804714&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Download - Sublime Text&quot; data-og-description=&quot;Sublime Text 4 is the current version of Sublime Text. For bleeding-edge releases, see the dev builds. Sublime Text may be downloaded and evaluated for free, however a license must be purchased for continued use. There is currently no enforced time limit f&quot; data-og-host=&quot;www.sublimetext.com&quot; data-og-source-url=&quot;https://www.sublimetext.com/download&quot; data-og-url=&quot;https://www.sublimetext.com/download&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.sublimetext.com/download&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.sublimetext.com/download&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Download - Sublime Text&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Sublime Text 4 is the current version of Sublime Text. For bleeding-edge releases, see the dev builds. Sublime Text may be downloaded and evaluated for free, however a license must be purchased for continued use. There is currently no enforced time limit f&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.sublimetext.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복사한 텍스트를 갖다가 붙여 넣어 주세요&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;iShot_2024-08-02_16.48.51.png&quot; data-origin-width=&quot;2577&quot; data-origin-height=&quot;1445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bg7t6m/btsIUx0GQSs/h5G8KEjRUBHc6gUe98K38k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bg7t6m/btsIUx0GQSs/h5G8KEjRUBHc6gUe98K38k/img.png&quot; data-alt=&quot;sublime text 에 붙여 넣기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bg7t6m/btsIUx0GQSs/h5G8KEjRUBHc6gUe98K38k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbg7t6m%2FbtsIUx0GQSs%2Fh5G8KEjRUBHc6gUe98K38k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2577&quot; height=&quot;1445&quot; data-filename=&quot;iShot_2024-08-02_16.48.51.png&quot; data-origin-width=&quot;2577&quot; data-origin-height=&quot;1445&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;sublime text 에 붙여 넣기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그다음에 &lt;span style=&quot;background-color: #f89009;&quot;&gt;. json&lt;/span&gt; 파일 확장자 형태로 저장해 줍니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;iShot_2024-08-02_16.50.35.png&quot; data-origin-width=&quot;1103&quot; data-origin-height=&quot;629&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDIcZA/btsIS7oxByK/BSZKkPJfw9YEsudfZbEPt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDIcZA/btsIS7oxByK/BSZKkPJfw9YEsudfZbEPt1/img.png&quot; data-alt=&quot;json 확장자로 파일 저장하기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDIcZA/btsIS7oxByK/BSZKkPJfw9YEsudfZbEPt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDIcZA%2FbtsIS7oxByK%2FBSZKkPJfw9YEsudfZbEPt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1103&quot; height=&quot;629&quot; data-filename=&quot;iShot_2024-08-02_16.50.35.png&quot; data-origin-width=&quot;1103&quot; data-origin-height=&quot;629&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;json 확장자로 파일 저장하기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPT를 켜고 만든 json 파일을 던져 줍니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;iShot_2024-08-02_16.51.58.png&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bseHw6/btsISGENkBC/zixRX7TK9QX8Bf9bbQ56G1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bseHw6/btsISGENkBC/zixRX7TK9QX8Bf9bbQ56G1/img.png&quot; data-alt=&quot;GPT에 csv 파일로 만들어달라고 프로프트 하기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bseHw6/btsISGENkBC/zixRX7TK9QX8Bf9bbQ56G1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbseHw6%2FbtsISGENkBC%2FzixRX7TK9QX8Bf9bbQ56G1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1154&quot; height=&quot;720&quot; data-filename=&quot;iShot_2024-08-02_16.51.58.png&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;GPT에 csv 파일로 만들어달라고 프로프트 하기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운을 받아보면 아까 Query Explorer에서 Table 형태로 확인한 그대로 파일을 생성된 걸 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;iShot_2024-08-02_16.53.03.png&quot; data-origin-width=&quot;1711&quot; data-origin-height=&quot;1304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9tjQP/btsISHDFxXn/JFJgwKqeagKyxkwJFAqwRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9tjQP/btsISHDFxXn/JFJgwKqeagKyxkwJFAqwRk/img.png&quot; data-alt=&quot;csv 파일&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9tjQP/btsISHDFxXn/JFJgwKqeagKyxkwJFAqwRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9tjQP%2FbtsISHDFxXn%2FJFJgwKqeagKyxkwJFAqwRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1711&quot; height=&quot;1304&quot; data-filename=&quot;iShot_2024-08-02_16.53.03.png&quot; data-origin-width=&quot;1711&quot; data-origin-height=&quot;1304&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;csv 파일&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당장 일 배 치를 통해 데이터를 적재하지 않을 거라면 이방식으로 Query Explorer에서 바로 CSV 파일로 만들어서 확인할 수 있는 방법을 소개해봤습니다.&amp;nbsp;&lt;/p&gt;</description>
      <category>꿀팁</category>
      <category>ga4 api</category>
      <category>ga4 csv</category>
      <category>ga4 query explorer</category>
      <category>google analytics data api</category>
      <category>query explorer</category>
      <author>알랭드보통 사람</author>
      <guid isPermaLink="true">https://botongsaram.tistory.com/12</guid>
      <comments>https://botongsaram.tistory.com/entry/GA4-Query-Explorer-%EC%97%90%EC%84%9C-csv-%ED%8C%8C%EC%9D%BC%EB%A1%9C-%EB%82%B4%EB%A0%A4-%EB%B0%9B%EB%8A%94-%EB%B0%A9%EB%B2%95#entry12comment</comments>
      <pubDate>Fri, 2 Aug 2024 17:00:50 +0900</pubDate>
    </item>
    <item>
      <title>코호트 분석 - 제대로 측정하고 계신가요? (달력 기준 vs 24시간 기준)</title>
      <link>https://botongsaram.tistory.com/entry/%EC%BD%94%ED%98%B8%ED%8A%B8-%EC%B8%A1%EC%A0%95-%EC%A0%9C%EB%8C%80%EB%A1%9C-%ED%95%98%EA%B3%A0-%EA%B3%84%EC%8B%A0%EA%B0%80%EC%9A%94-%EB%8B%AC%EB%A0%A5-%EA%B8%B0%EC%A4%80-vs-24%EC%8B%9C%EA%B0%84-%EA%B8%B0%EC%A4%80</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이 글을 읽고 계시다면 코호트 분석을 이미 하고 계실 건데 측정 기준에 대해서 의문이 생기신 분이 보실 것 같네요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글에 '코호트 분석 SQL' 라고 검색하면 정말 많은 글들이 많습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글에서 소개하는 쿼리 예시는 대부분 datediff함수를 활용해서 Date Granularity를&amp;nbsp; 계산합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이해하기 쉽게 예를 들어보겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유저 1 : 23:30 에 회원가입 후 다음날 다시 들어왔습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유저 2 : 13:30에 회원가입 후 다음날 다시 들어왔습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;day 단위로 계산을 하면 유저 1 은 우리 서비스를 30분 경험하고 다음날 재방문했다고 계산됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유저 2는 약 10시간 30분 서비스를 경험하고 재방문을 했다고 계산됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일한 조건일까요? 그렇지 않죠?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만일 시간 단위로 계산을 하게 되면 특정 행동을 수행한 시간부터 다음 행동까지의 Time window를 24시간 뒤로 하면 이 유저는 다음날이 아닌 모레 재방문했다고 계산되겠죠?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1722496030932&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DATEDIFF( [first_event_dt], [second_event], DAY )&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1722496042595&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DATEDIFF( [first_event_dt], [second_event], HOUR ) / 24 )&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;월단위로 계산할 때도 마찬가지입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;월별 일자수가 모두 다릅니다. 1월(31일), 2월(28일), 4월(30일)...&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;월 단위로 측정할 때도 30일로 모두 통일해줍니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1722496052668&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DATEDIFF( [first_event_dt], [second_event], HOUR ) / 24  * 30)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 계산되면 유저별로 경과 시간은 모두 통일 되었습니다!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 Amplitude(앰플리튜드)의 코호트 분석 기능에는 이런 기능들이 존재합니다.&amp;nbsp; 만약 안 쓰고 계시다면 직접 쿼리를 날려서...&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a title=&quot;앰플리튜드 가이드&quot; href=&quot;https://amplitude.com/docs/analytics/charts/retention-analysis/retention-analysis-time&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&gt; 가이드를 보시면 앰플리튜드가 24시간 단위로 경과 시간을 측청 하는 방식을 설명해 두었습니다.&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1722496600204&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;How time works in a retention analysis&quot; data-og-description=&quot;This article helps you: Understand the different ways time can affect your Retention Analysis chart Choose the most appropriate time calculation for your analysis In a Retention Analysis chart, there are two ways to define a day: a rolling 24-hour window o&quot; data-og-host=&quot;amplitude.com&quot; data-og-source-url=&quot;https://amplitude.com/docs/analytics/charts/retention-analysis/retention-analysis-time&quot; data-og-url=&quot;https://amplitude.com/docs/analytics/charts/retention-analysis/retention-analysis-time&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/W6L1w/hyWKxesxV0/VPYMF1EHeIGVlthnY5wXJk/img.png?width=598&amp;amp;height=464&amp;amp;face=0_0_598_464&quot;&gt;&lt;a href=&quot;https://amplitude.com/docs/analytics/charts/retention-analysis/retention-analysis-time&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://amplitude.com/docs/analytics/charts/retention-analysis/retention-analysis-time&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/W6L1w/hyWKxesxV0/VPYMF1EHeIGVlthnY5wXJk/img.png?width=598&amp;amp;height=464&amp;amp;face=0_0_598_464');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;How time works in a retention analysis&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;This article helps you: Understand the different ways time can affect your Retention Analysis chart Choose the most appropriate time calculation for your analysis In a Retention Analysis chart, there are two ways to define a day: a rolling 24-hour window o&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;amplitude.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;iShot_2024-08-01_11.20.36.png&quot; data-origin-width=&quot;1250&quot; data-origin-height=&quot;992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCqpQ0/btsIRdwa9TG/QrkJLuCIaSxbXt5gGKQdE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCqpQ0/btsIRdwa9TG/QrkJLuCIaSxbXt5gGKQdE0/img.png&quot; data-alt=&quot;앰플리튜드 화면 캡쳐&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCqpQ0/btsIRdwa9TG/QrkJLuCIaSxbXt5gGKQdE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCqpQ0%2FbtsIRdwa9TG%2FQrkJLuCIaSxbXt5gGKQdE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1250&quot; height=&quot;992&quot; data-filename=&quot;iShot_2024-08-01_11.20.36.png&quot; data-origin-width=&quot;1250&quot; data-origin-height=&quot;992&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;앰플리튜드 화면 캡쳐&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;24시간 윈도우 기준, 캘린더 기준으로 경과 시간(t)을 측정하는 옵션이 있죠?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;얼마나 차이를 보였는지 가상의 데이터로 확인을 해보았습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(참고로 더미 데이터는 &lt;a href=&quot;https://www.kaggle.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;kaggle&lt;/a&gt; 이나 &lt;a href=&quot;https://www.mockaroo.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Mockaroo&lt;/a&gt; 에서 생성하실 수 있습니다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 해당 데이터 계산 기준은 월별 첫 구매 기준 재구매율입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-08-01 15.26.18.png&quot; data-origin-width=&quot;1219&quot; data-origin-height=&quot;733&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/04fAp/btsISdbcyFX/wFKFShSlZKw3OXR56r2nDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/04fAp/btsISdbcyFX/wFKFShSlZKw3OXR56r2nDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/04fAp/btsISdbcyFX/wFKFShSlZKw3OXR56r2nDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F04fAp%2FbtsISdbcyFX%2FwFKFShSlZKw3OXR56r2nDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1219&quot; height=&quot;733&quot; data-filename=&quot;스크린샷 2024-08-01 15.26.18.png&quot; data-origin-width=&quot;1219&quot; data-origin-height=&quot;733&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;t = 1 지점부터 차이를 보이기 시작하는데 t = 0 이 100%라서 차이가 잘 안 보입니다. 로그 스케일을 통해 다시 확인해 보면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-08-01 15.26.33.png&quot; data-origin-width=&quot;1214&quot; data-origin-height=&quot;740&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HJDl1/btsIRVV92RP/2qHwcLkv6kzdKcJLSCc59K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HJDl1/btsIRVV92RP/2qHwcLkv6kzdKcJLSCc59K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HJDl1/btsIRVV92RP/2qHwcLkv6kzdKcJLSCc59K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHJDl1%2FbtsIRVV92RP%2F2qHwcLkv6kzdKcJLSCc59K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1214&quot; height=&quot;740&quot; data-filename=&quot;스크린샷 2024-08-01 15.26.33.png&quot; data-origin-width=&quot;1214&quot; data-origin-height=&quot;740&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확실히 달력 기준의 리텐션율이 조금 더 높아 보이네요&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;얼마나 차이 나는지 두 기준의 리텐션율을 나눠 보겠습니다 최대&amp;nbsp; 1.27배까지 납니다. (아래 차트에서는 0은 무시합니다. t = 0 은 100%이기 때문에)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;t = 1 : 1.15배&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;t = 22 : 1.27배&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-08-01 15.52.51.png&quot; data-origin-width=&quot;1219&quot; data-origin-height=&quot;740&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7xcH3/btsIROQur1p/yWstslNAL978FDEdX5ldz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7xcH3/btsIROQur1p/yWstslNAL978FDEdX5ldz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7xcH3/btsIROQur1p/yWstslNAL978FDEdX5ldz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7xcH3%2FbtsIROQur1p%2FyWstslNAL978FDEdX5ldz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1219&quot; height=&quot;740&quot; data-filename=&quot;스크린샷 2024-08-01 15.52.51.png&quot; data-origin-width=&quot;1219&quot; data-origin-height=&quot;740&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터에 따라서 차이가 달라지겠지만&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코호트의 기준이 만일 회원가입일 기준의 재구매율이거나 회원가입일 기준 재방문율을 측정한다면 더 많은 차이를 보일 수 있을 걸로 예상됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 사용한 쿼리는 아래와 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1722496379245&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;WITH tb_pay_first AS (
        SELECT country
                ,user_id
                ,min(pay_datetime_id) first_pay_datetime_id
        FROM order
        GROUP BY 1,2

)

, tb_base_ AS (SELECT  st0.*
                    , FLOOR(TIMESTAMPDIFF(HOUR, st1.first_pay_datetime_id, st0.pay_datetime_id) / 24) AS days_since_first_pay
                    , FLOOR(TIMESTAMPDIFF(HOUR, st1.first_pay_datetime_id, st0.pay_datetime_id) / (24 * 30)) AS months_since_first_pay_period_24h
                    , (YEAR(pay_datetime_id) - YEAR(first_pay_datetime_id)) * 12 + (MONTH(pay_datetime_id) - MONTH(first_pay_datetime_id)) AS months_since_first_pay_period_day
                    , st1.first_pay_datetime_id
            FROM order st0
            LEFT JOIN tb_pay_first st1
                ON st0.user_id = st1.user_id
                AND st0.country = st1.country
            WHERE 1 = 1

)

, tb_base_24h AS (
                SELECT time_id_
                        , country
                        , since_time_period_24h
                        , CASE 
                            WHEN 'acc' = 'normal' THEN SUM(SUM(IF(since_time_period_24h = max_since_time_period_24h, repurchase_user_cnt, 0))) OVER 
                                (PARTITION BY time_id_, country ORDER BY since_time_period_24h DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
                            ELSE SUM(repurchase_user_cnt)
                            END AS repurchase_user_cnt
                        , count(1) pay_user_cnt
                        , sum(sales) AS sales

                FROM   (SELECT *
                                , CASE WHEN since_time_period_24h = 0 AND pay_cnt &amp;gt; 1 THEN 1
                                        WHEN since_time_period_24h = 0 AND pay_cnt &amp;lt;= 1 THEN 0
                                        ELSE 1 
                                    END AS repurchase_user_cnt
                                , MAX(since_time_period_24h) OVER (PARTITION BY country, user_id) as max_since_time_period_24h
                        FROM
                                (SELECT tmp0.time_id_
                                        , tmp0.country
                                        , tmp0.since_time_period_24h 
                                        , tmp0.user_id
                                        , SUM(tmp0.pay_cnt) AS pay_cnt
                                        , SUM(tmp0.sales) AS sales
                                FROM 
                                        (SELECT DATE_FORMAT(first_pay_datetime_id ,'%Y-%m-01') time_id_
                                                , country
                                                -- , months_since_first_pay_period_day AS since_time_period_day
                                                , months_since_first_pay_period_24h AS since_time_period_24h
                                                , user_id
                                                , COUNT(distinct order_id) AS pay_cnt
                                                , SUM(sales) as sales
                                        FROM tb_base_
                                        -- WHERE DATE_FORMAT(first_pay_datetime_id ,'%Y-%m-01') &amp;gt;= '2023-01-01'
                                        GROUP BY 1,2,3,4) tmp0
                                GROUP BY tmp0.time_id_
                                        , tmp0.country
                                        , tmp0.since_time_period_24h 
                                        , tmp0.user_id
                                ) tmp
                                    ) tmp1
                GROUP BY time_id_ 
                        , country
                        , since_time_period_24h
)

, tb_base_day AS (
                SELECT time_id_
                        , country
                        , since_time_period_day
                        , CASE 
                            WHEN 'acc' = 'normal'  THEN SUM(SUM(IF(since_time_period_day = max_since_time_period_day, repurchase_user_cnt, 0))) OVER 
                                (PARTITION BY time_id_, country ORDER BY since_time_period_day DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
                            ELSE SUM(repurchase_user_cnt)
                            END AS repurchase_user_cnt
                        , count(1) pay_user_cnt
                        , sum(sales) AS sales
                FROM   (SELECT *
                                , CASE WHEN since_time_period_day = 0 AND pay_cnt &amp;gt; 1 THEN 1
                                        WHEN since_time_period_day = 0 AND pay_cnt &amp;lt;= 1 THEN 0
                                        ELSE 1 
                                    END AS repurchase_user_cnt
                                , MAX(since_time_period_day) OVER (PARTITION BY country, user_id) as max_since_time_period_day
                        FROM
                                (SELECT tmp0.time_id_
                                        , tmp0.country
                                        , tmp0.since_time_period_day 
                                        , tmp0.user_id
                                        , SUM(tmp0.pay_cnt) AS pay_cnt
                                        , SUM(tmp0.sales) AS sales
                                FROM 
                                        (SELECT DATE_FORMAT(first_pay_datetime_id ,'%Y-%m-01') time_id_
                                                , country
                                                , months_since_first_pay_period_day AS since_time_period_day
                                                -- , months_since_first_pay_period_24h AS since_time_period_24h
                                                , user_id
                                                , COUNT(distinct order_id) AS pay_cnt
                                                , SUM(sales) as sales
                                        FROM tb_base_
                                        GROUP BY 1,2,3,4) tmp0
                                GROUP BY tmp0.time_id_
                                        , tmp0.country
                                        , tmp0.since_time_period_day 
                                        , tmp0.user_id
                                ) tmp
                                    ) tmp1
                GROUP BY time_id_ 
                        , country
                        , since_time_period_day
)


, cohort_base_24h AS 
                (SELECT time_id_
                    , country 
                    , since_time_period_24h
                    , repurchase_user_cnt
                    , pay_user_cnt
                    , sales
                    , SUM(sales) OVER w AS acc_sales
                    , FIRST_VALUE(pay_user_cnt) OVER w AS cohort_user_cnt
                    , COUNT(1) OVER (PARTITION BY country) AS cohort_cnt
                FROM tb_base_24h
                WINDOW w AS (PARTITION BY time_id_, country ORDER BY since_time_period_24h RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
                )
)

, cohort_base_day AS 
                (SELECT time_id_
                    , country 
                    , since_time_period_day
                    , repurchase_user_cnt
                    , pay_user_cnt
                    , sales
                    , SUM(sales) OVER w AS acc_sales
                    , FIRST_VALUE(pay_user_cnt) OVER w AS cohort_user_cnt
                    , COUNT(1) OVER (PARTITION BY country) AS cohort_cnt
                FROM tb_base_day
                WINDOW w AS (PARTITION BY time_id_, country ORDER BY since_time_period_day RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
                )
)


SELECT *
    , (pay_user_cnt * 100) / cohort_user_cnt AS retention_rate
FROM
            (SELECT 1 AS time_id
                    , country
                    , since_time_period_24h
                    , SUM(repurchase_user_cnt) AS repurchase_user_cnt
                    , SUM(pay_user_cnt) AS pay_user_cnt
                    , FIRST_VALUE(sum(cohort_user_cnt)) OVER(PARTITION BY country RANGE BETWEEN UNBOUNDED PRECEDING and CURRENT ROW) as cohort_user_cnt
            FROM cohort_base_24h
            GROUP BY 1
                    , country
                    , since_time_period_24h) tmp3&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정리해 보면!&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분석의 기준은 굉장히 중요합니다. 어떤 기준으로 분석하느냐에 따라서 의사결정 방향이 달라질 수 있겠죠?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코호트 분석은 시간을 계산해서 집계하는 분석인만큼 시간의 기준을 제대로 설정하는 게 중요합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;달력 단위의 코호트 측정이 조금 더 실제로 과대 평가되기 때문에 유저별로 통일된 &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;24시간 기준&lt;/b&gt;&lt;/span&gt;으로 계산하여&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코호트를 측정하는 것이 올바른 방법이라고 생각이 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저도 실제로 분석해 보면서 분석 기준의 중요성을 다시 한번 깨달을 수 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹시 지금 day 단위로 코호트 활용해 재구매율을 측정하고 계신다면 24시간 단위로 계산해 보시면 어떨까요?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Reference&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://medium.com/@paul.levchuk/how-to-build-user-cohort-properly-b70a74e5e1c8&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://medium.com/@paul.levchuk/how-to-build-user-cohort-properly-b70a74e5e1c8&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>모바일 마케팅</category>
      <category>amplitude</category>
      <category>cohort sql</category>
      <category>리텐션 분석</category>
      <category>시간단위코호트</category>
      <category>올바른코호트계산</category>
      <category>재구매율</category>
      <category>코호트 sql</category>
      <category>코호트분석</category>
      <category>코호트측정방법</category>
      <author>알랭드보통 사람</author>
      <guid isPermaLink="true">https://botongsaram.tistory.com/11</guid>
      <comments>https://botongsaram.tistory.com/entry/%EC%BD%94%ED%98%B8%ED%8A%B8-%EC%B8%A1%EC%A0%95-%EC%A0%9C%EB%8C%80%EB%A1%9C-%ED%95%98%EA%B3%A0-%EA%B3%84%EC%8B%A0%EA%B0%80%EC%9A%94-%EB%8B%AC%EB%A0%A5-%EA%B8%B0%EC%A4%80-vs-24%EC%8B%9C%EA%B0%84-%EA%B8%B0%EC%A4%80#entry11comment</comments>
      <pubDate>Thu, 1 Aug 2024 16:19:30 +0900</pubDate>
    </item>
    <item>
      <title>MMP(AppsFlyer), GA4, Braze 데이터를 활용해 시각화할 때 반드시 고려해야할 사항(2)- 데이터 전처리하기</title>
      <link>https://botongsaram.tistory.com/entry/MMPAppsFlyer-GA4-Braze-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%B4-%EC%8B%9C%EA%B0%81%ED%99%94%ED%95%A0-%EB%95%8C-%EB%B0%98%EB%93%9C%EC%8B%9C-%EA%B3%A0%EB%A0%A4%ED%95%B4%EC%95%BC%ED%95%A0-%EC%82%AC%ED%95%AD2-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EC%B2%98%EB%A6%AC%ED%95%98%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;지난 편에서는 각 솔루션별 데이터 수집 방법(&lt;a title=&quot;Third Parth 데이터 수집 자동화&quot; href=&quot;https://botongsaram.tistory.com/entry/MMPAppsFlyer-GA4-Braze-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%B4-%EC%8B%9C%EA%B0%81%ED%99%94%ED%95%A0-%EB%95%8C-%EB%B0%98%EB%93%9C%EC%8B%9C-%EA%B3%A0%EB%A0%A4%ED%95%B4%EC%95%BC%ED%95%A0-%EC%82%AC%ED%95%AD1-Third-Party-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%88%98%EC%A7%91-%EC%9E%90%EB%8F%99%ED%99%94&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;바로가기&lt;/a&gt;)에 대해서 알아보았습니다.&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1721637371331&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;MMP(AppsFlyer), GA4, Braze 데이터를 활용해 시각화할 때 반드시 고려해야할 사항(1)- Third Party 데이터 &quot; data-og-description=&quot;업무 시간을 데이터 수집과 데이터 전처리에 시간을 쓰는 마케터와 데이터 수집 자동화된 환경에서 성과 분석과 기획에 더 많은 시간을 쓰는 마케터 누가 더 많이 성장할까요?당연히 성과 분석&quot; data-og-host=&quot;botongsaram.tistory.com&quot; data-og-source-url=&quot;https://botongsaram.tistory.com/entry/MMPAppsFlyer-GA4-Braze-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%B4-%EC%8B%9C%EA%B0%81%ED%99%94%ED%95%A0-%EB%95%8C-%EB%B0%98%EB%93%9C%EC%8B%9C-%EA%B3%A0%EB%A0%A4%ED%95%B4%EC%95%BC%ED%95%A0-%EC%82%AC%ED%95%AD1-Third-Party-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%88%98%EC%A7%91-%EC%9E%90%EB%8F%99%ED%99%94&quot; data-og-url=&quot;https://botongsaram.tistory.com/entry/MMPAppsFlyer-GA4-Braze-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%B4-%EC%8B%9C%EA%B0%81%ED%99%94%ED%95%A0-%EB%95%8C-%EB%B0%98%EB%93%9C%EC%8B%9C-%EA%B3%A0%EB%A0%A4%ED%95%B4%EC%95%BC%ED%95%A0-%EC%82%AC%ED%95%AD1-Third-Party-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%88%98%EC%A7%91-%EC%9E%90%EB%8F%99%ED%99%94&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/byXjIT/hyWCCOPyjH/CU528krZE2W4Z9KHbFUmeK/img.png?width=800&amp;amp;height=356&amp;amp;face=25_103_111_189,https://scrap.kakaocdn.net/dn/i9Sef/hyWCBh6O5h/qAHzkSBO7DRvYkhZEkLKWk/img.png?width=800&amp;amp;height=356&amp;amp;face=25_103_111_189,https://scrap.kakaocdn.net/dn/AxeGc/hyWCLSzfD0/n3y0KLf8WD9nWV69n0BUE1/img.png?width=1896&amp;amp;height=568&amp;amp;face=0_0_1896_568&quot;&gt;&lt;a href=&quot;https://botongsaram.tistory.com/entry/MMPAppsFlyer-GA4-Braze-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%B4-%EC%8B%9C%EA%B0%81%ED%99%94%ED%95%A0-%EB%95%8C-%EB%B0%98%EB%93%9C%EC%8B%9C-%EA%B3%A0%EB%A0%A4%ED%95%B4%EC%95%BC%ED%95%A0-%EC%82%AC%ED%95%AD1-Third-Party-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%88%98%EC%A7%91-%EC%9E%90%EB%8F%99%ED%99%94&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://botongsaram.tistory.com/entry/MMPAppsFlyer-GA4-Braze-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%B4-%EC%8B%9C%EA%B0%81%ED%99%94%ED%95%A0-%EB%95%8C-%EB%B0%98%EB%93%9C%EC%8B%9C-%EA%B3%A0%EB%A0%A4%ED%95%B4%EC%95%BC%ED%95%A0-%EC%82%AC%ED%95%AD1-Third-Party-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%88%98%EC%A7%91-%EC%9E%90%EB%8F%99%ED%99%94&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/byXjIT/hyWCCOPyjH/CU528krZE2W4Z9KHbFUmeK/img.png?width=800&amp;amp;height=356&amp;amp;face=25_103_111_189,https://scrap.kakaocdn.net/dn/i9Sef/hyWCBh6O5h/qAHzkSBO7DRvYkhZEkLKWk/img.png?width=800&amp;amp;height=356&amp;amp;face=25_103_111_189,https://scrap.kakaocdn.net/dn/AxeGc/hyWCLSzfD0/n3y0KLf8WD9nWV69n0BUE1/img.png?width=1896&amp;amp;height=568&amp;amp;face=0_0_1896_568');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;MMP(AppsFlyer), GA4, Braze 데이터를 활용해 시각화할 때 반드시 고려해야할 사항(1)- Third Party 데이터&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;업무 시간을 데이터 수집과 데이터 전처리에 시간을 쓰는 마케터와 데이터 수집 자동화된 환경에서 성과 분석과 기획에 더 많은 시간을 쓰는 마케터 누가 더 많이 성장할까요?당연히 성과 분석&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;botongsaram.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;Third Party 데이터 수집 자동화&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;수집된 데이터 전처리하기&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시각화하기&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이번에는 수집된 데이터를 활용하여 어떻게 전처리 해야 되는지 알아보겠습니다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 데이터 셋들은 분석하려는 차원(dimension)을 기준으로 집계(group by)를 통해서 동일한 형태로 전처리한 후 조인 연산을 통해 데이터를 통합하는 과정이라고 생각하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마케팅 성과를 분석하기 위해서 필요한 데이터 다음과 같습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;(필요에 따라서 Dimension 의 개수는 추가될 수 있습니다. ex)device_category, country, 등등)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Dimension&lt;/b&gt;&amp;nbsp; : 날짜(일별), 유입소스(GA4 = utm_source, Appsflyer = Media_source), 캠페인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Metric&lt;/b&gt; :&amp;nbsp; 구매수, 매출, 인스톨 수&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;b&gt;구매 데이터(MMP, GA4) 통합하기&amp;nbsp;&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GA4가 웹, 앱 모두 트래킹을 할 수 있지만 WEB은 GA4, APP은 MMP로 성과를 합쳐서 보실 겁니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GA4, Firebase는 앱과 웹 내 고객 행동 분석에 주로 쓰이는 툴이고 MMP 는 광고 성과를 측정하는 툴이니깐요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 이렇게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;GA4 데이터 집계&amp;gt; - WEB&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Dimension&lt;/b&gt;&amp;nbsp; :&lt;span&gt;&amp;nbsp;&lt;/span&gt;날짜(일별), 세션 소스, 캠페인&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Metric&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;:&amp;nbsp; 구매수, 매출&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;MMP 데이터 집계&amp;gt; - APP&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Dimension&lt;/b&gt;&amp;nbsp; :&lt;span&gt;&amp;nbsp;&lt;/span&gt;날짜(일별), Media_source, 캠페인&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Metric&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;:&amp;nbsp; 구매수, 매출, 인스톨 수&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;집계된 두개의 테이블을 UNION 다시 한번 집계를 해줍니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 하면 집계된 웹앱 데이터 통합이 되었습니다.&amp;nbsp;(MMP 데이터 전처리 과정은 생략)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Dimension&lt;/b&gt;&amp;nbsp; :&lt;span&gt;&amp;nbsp;&lt;/span&gt;날짜(일별),&lt;span&gt;&amp;nbsp;&lt;/span&gt;Media_source, 캠페인&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Metric&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;:&amp;nbsp; 구매수, 매출, 인스톨 수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;브레이즈 커런츠 데이터와 구매 데이터(MMP, GA4) 연결하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브레이즈 커런츠(braze currents)데이터는 유저 인게이지먼트 데이터입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에는 유저별로 어떻게 우리 서비스로 참여를 하고있는지를 기록한 데이터들이 기록되어 있으니 메시지 발송 수단별로 노출, 클릭 성과들이 들어있습니다. 하지만 우리는 성과(구매) 판단은 MMP, GA4로 해야 하므로 서로 다른 데이터들을 어떻게 통합해서 볼지를 알아보겠습니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커런츠 데이터는 아래와 같이 구성이 되어있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-22 18.24.36.png&quot; data-origin-width=&quot;1443&quot; data-origin-height=&quot;383&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbwj7T/btsIHgtkrbC/pCjtoqM63Tr4xrn9kEqyWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbwj7T/btsIHgtkrbC/pCjtoqM63Tr4xrn9kEqyWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbwj7T/btsIHgtkrbC/pCjtoqM63Tr4xrn9kEqyWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbbwj7T%2FbtsIHgtkrbC%2FpCjtoqM63Tr4xrn9kEqyWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1443&quot; height=&quot;383&quot; data-filename=&quot;스크린샷 2024-07-22 18.24.36.png&quot; data-origin-width=&quot;1443&quot; data-origin-height=&quot;383&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;b&gt;(차원 데이터 생성을 위한 함수는 태블로 함수입니다)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;유니크한 ID 차원 만들기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 데이터를 일자, 메세지 발송 타입, 캠페인 or 캔버스별 발송수, 노출수, 클릭수 데이터를 집계를 하기 위해서는 유니크한 ID를 나타내는 차원 데이터를 만들어 줘야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일한 유저라도 캠페인, 캔버스, 베리에이션 등 다양한 형태로 타겟이 될 수 있으므로, 아래와 같이 유니크한 차원 데이터를 만들기 위해 새로운 아이디를 생성합니다. (해당 아이디는 발송 타입별로 카운트하기 위해 활용됩니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;차원의 이름은 원하시는대로 명명하시면 되고 저는 &lt;b&gt;user_id_dispatch_id &lt;/b&gt;이렇게 명명하였습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1721640547006&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- 태블로 계산식
IFNULL([User Id],'') + '-' +
IFNULL([Campaign Id],'') + '-' +
IFNULL([Message Variation Id],'') + '-' +
IFNULL([Canvas Id],'') + '-' +
IFNULL([Canvas Variation Id],'') + '-' +
IFNULL([Canvas Step Message Variation Id],'') + '-' +
IFNULL([Dispatch Id],'')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;캠페인 차원 만들기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로 캠페인 단위로 성과를 집계할 예정이기 때문에&amp;nbsp; 캠페인 차원을 만들어줘야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜냐하면 브레이즈에는 캠페인과 캠버스로 나뉘는데 campaign_name 값이 존재하면 canvas_name 이 빈값이고 거꾸로 canvas_name 값이 존재하면 campaign_name이 빈값이기 때문입니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1721640720734&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- 태블로 계산식
IFNULL([Campaign Name],[Canvas Name])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;발송 타입별 유니크한 ID 차원 만들기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;{send_type}_click 이런 식으로 차원 이름을 명명하고 아래와 같은 태블로 계산식으로 차원을 만들어줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 되면 email_click, push_click, in_app_message_click 이벤트별로 ID(&lt;b&gt;user_id_dispatch_id&lt;/b&gt;)를 생성됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1721640896414&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- 태블로 계산식
{ FIXED [user_id_dispatch_id],[Event Type] : COUNTD(IF CONTAINS([Event Type], 'inappmessage_click') THEN [user_id_dispatch_id] END)}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;발송 타입 차원 만들기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최초에 S3에 적재된 currents 데이터(avro 파일)를 DW에 적재할 때 파일별 Event 구분을 위해 Event_Type 칼럼을 생성하였습니다. (이전 글을 참고해 주세요)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #000000; color: #d1d2d3; text-align: left;&quot; data-border=&quot;0&quot; data-indent=&quot;1&quot; data-stringify-type=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-stringify-border=&quot;0&quot; data-stringify-indent=&quot;1&quot;&gt;['users.messages.email.Open.avro',&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-stringify-border=&quot;0&quot; data-stringify-indent=&quot;1&quot;&gt;&amp;nbsp;'users.messages.email.Click.avro',&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-stringify-border=&quot;0&quot; data-stringify-indent=&quot;1&quot;&gt;&amp;nbsp;'users.messages.pushnotification.Send.avro',&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-stringify-border=&quot;0&quot; data-stringify-indent=&quot;1&quot;&gt;&amp;nbsp;'users.messages.inappmessage.Click.avro',&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-stringify-border=&quot;0&quot; data-stringify-indent=&quot;1&quot;&gt;&amp;nbsp;'users.messages.email.Delivery.avro',&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-stringify-border=&quot;0&quot; data-stringify-indent=&quot;1&quot;&gt;&amp;nbsp;'users.messages.pushnotification.Open.avro',&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-stringify-border=&quot;0&quot; data-stringify-indent=&quot;1&quot;&gt;&amp;nbsp;'users.messages.inappmessage.Impression.avro']&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1721640989009&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- 태블로 계산식
IF CONTAINS([Event_Type], 'email') then 'email'
elseif CONTAINS([Event_Type], 'push') then 'push'
elseif CONTAINS([Event_Type], 'inappmessage') then 'iam' end&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 집계를 위한 전처리는 완료되었습니다(세세한 전처리 과정은 생략됨)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 위에서 만들었던 차원을 가지고 집계를 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일자별, send_type, campaign/canvas, device_category 별 오픈, 클릭, 노출, delivery 데이터는 아래와 같이 집계되었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-22 18.43.43.png&quot; data-origin-width=&quot;1275&quot; data-origin-height=&quot;329&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dnvY4g/btsIKg5IMl4/BthmNVDWGGdWUKrlyrifs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dnvY4g/btsIKg5IMl4/BthmNVDWGGdWUKrlyrifs0/img.png&quot; data-alt=&quot;Braze Currents 전처리 / 집계한 테이블 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dnvY4g/btsIKg5IMl4/BthmNVDWGGdWUKrlyrifs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdnvY4g%2FbtsIKg5IMl4%2FBthmNVDWGGdWUKrlyrifs0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1275&quot; height=&quot;329&quot; data-filename=&quot;스크린샷 2024-07-22 18.43.43.png&quot; data-origin-width=&quot;1275&quot; data-origin-height=&quot;329&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Braze Currents 전처리 / 집계한 테이블 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;통합된&amp;nbsp; GA4 / MMP 데이터와 커런츠 데이터를 통합해야 되는 과정이 또 남았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떻게 이 두 데이터를 엮어야 될까요?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조인키를 위에서 집계한 차원 데이터로 잡고 &lt;b&gt;Full Outer Join으로&lt;/b&gt; 데이터를 조인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이유는 특정 날짜에 브레이즈 커런츠 데이터는 존재하는데 성과 데이터(GA4, MMP) 데이터가 존재하지 않는다면 매칭될 수 없으니 누락이 되어버립니다. 거꾸로 성과 데이터(GA4, MMP) 데이터가 존재하는데 브레이즈 커런츠 데이터가 존재하지 않을 경우 누락이 되어버리기 때문입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;광고 성과 데이터 전처리하는 예시를 통해 Full Outer JOIN 이 어떻게 데이터를 처리되는지 예시를 통해 잠깐 확인해 보겠습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2024년 1월 1일 twitter 채널의 e 캠페인에서 비용이 1000원 소진했습니다. 그런데 GA4, MMP 데이터에는 해당 광고 채널의 캠페인에서 전환이 아예 일어나질 않았습니다. 하지만 비용이 발생했기 때문에 이 데이터를 버릴 수는 없겠죠? 무조건 살려야 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;거꾸로 광고 데이터에서 비용은 발생하지 않았는데 Attribution Window로 인해 전환이 발생했습니다. 이것도 버릴 수 없겠죠?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 두 데이터에서 LEFT JOIN 또는 RIGHT JOIN을 수행하게 되면 조인키에 대응하지 않은 데이터는 매칭이 안되어 누락이 되어 버립니다. 이를 방지하기 위해서 INNER, LEFT OUTER, RIGHT OUTER 조인 집합을 생성하는 FULL OUTER JOIN을 수행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;결과를 보면 각 테이블의 모든 데이터들이 출력이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;되는 걸&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;알 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-23 14.24.28.png&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;1048&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byfysi/btsIJe9zlye/QX284lnybYWqWmqfY7Cjxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byfysi/btsIJe9zlye/QX284lnybYWqWmqfY7Cjxk/img.png&quot; data-alt=&quot;Full Outer Join 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byfysi/btsIJe9zlye/QX284lnybYWqWmqfY7Cjxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbyfysi%2FbtsIJe9zlye%2FQX284lnybYWqWmqfY7Cjxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1884&quot; height=&quot;1048&quot; data-filename=&quot;스크린샷 2024-07-23 14.24.28.png&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;1048&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Full Outer Join 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본론으로 돌아와서!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Full Outer Join을 수행하기 전에 앞서 GA4, MMP 데이터를 합친 후 우리는 CRM 데이터만 필요하기 때문에 CRM 데이터만 필터를 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Braze Current 데이터와 성과 데이터(GA4, MMP)를 날짜, 유입소스명, 캠페인명을 조인키로 두고 Full Outer Join 을 수행합니다.(분석하고자 하는 차원데이터가 추가로 더 있다면 추가로 필요한 차원도 조인키로 활용하시면 됩니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이와 같은 방식으로 Paid 성과 데이터를 전처리 할 때도 위와 같은 방법으로 수행하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터를 전처리 할 때 중요한 건 분석하고자 하는 결과물을 먼저 그려본 뒤에 결과를 도출하기 위해서 각 테이블을 어떻게 만들어 갈 것인지 생각하면서&amp;nbsp;만들어가면 됩니다. 실제로 전처리하다 보면 자잘하게 처리해야 되는 부분이 상당히 많습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 데이터를 통합하기 위해서는 무엇보다 네이밍 컨벤션이 가장 중요한 점은 강조하지 않을 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 수집까지 잘했는데 캠페인 네이밍 컨벤션이 서로 다르다?.. 데이터 통합은 불가능합니다..&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네이밍 컨벤션은 말 그대로 명명 규칙입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 언급한 대로 우리가 데이터 통합을 위해 차원 데이터를 조인키로 활용한다고 했었는데 캠페인 차원이 MMP, GA4, Braze or 광고 데이터가 모두 다르면 안 되겠죠? 아래와 같이 통일을 시켜야만 데이터를 연결할 수 있습니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;MMP&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;GA4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;Media Source(ex. meta)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;UTM_SOURCE(ex.&amp;nbsp;meta)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;Campaign(&lt;span style=&quot;background-color: #efefef; color: #333333; text-align: start;&quot;&gt;ex.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;reach_asc_all)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;Campaign&lt;span style=&quot;background-color: #efefef; color: #333333; text-align: start;&quot;&gt;(ex. reach_asc_all)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 마케팅 데이터 수집부터 전처리 과정까지 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 글에서는 이 데이터를 활용해서 시각화 하는 방법을 살펴보겠습니다.&amp;nbsp;&lt;/p&gt;</description>
      <category>모바일 마케팅</category>
      <category>braze currents</category>
      <category>GA4</category>
      <category>MMP</category>
      <category>데이터 전처리</category>
      <category>브레이즈 커런츠</category>
      <category>브레이즈커런츠전처리</category>
      <author>알랭드보통 사람</author>
      <guid isPermaLink="true">https://botongsaram.tistory.com/10</guid>
      <comments>https://botongsaram.tistory.com/entry/MMPAppsFlyer-GA4-Braze-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%B4-%EC%8B%9C%EA%B0%81%ED%99%94%ED%95%A0-%EB%95%8C-%EB%B0%98%EB%93%9C%EC%8B%9C-%EA%B3%A0%EB%A0%A4%ED%95%B4%EC%95%BC%ED%95%A0-%EC%82%AC%ED%95%AD2-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EC%B2%98%EB%A6%AC%ED%95%98%EA%B8%B0#entry10comment</comments>
      <pubDate>Tue, 23 Jul 2024 14:32:01 +0900</pubDate>
    </item>
    <item>
      <title>MMP(AppsFlyer), GA4, Braze 데이터를 활용해 시각화할 때 반드시 고려해야할 사항(1)- Third Party 데이터 수집 자동화</title>
      <link>https://botongsaram.tistory.com/entry/MMPAppsFlyer-GA4-Braze-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%B4-%EC%8B%9C%EA%B0%81%ED%99%94%ED%95%A0-%EB%95%8C-%EB%B0%98%EB%93%9C%EC%8B%9C-%EA%B3%A0%EB%A0%A4%ED%95%B4%EC%95%BC%ED%95%A0-%EC%82%AC%ED%95%AD1-Third-Party-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%88%98%EC%A7%91-%EC%9E%90%EB%8F%99%ED%99%94</link>
      <description>&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 위해서 마케팅 데이터 파이프라인을 구축해서 분석화는 환경을 만들어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금도 GA4, MMP(AppsFlyer), Braze를 사용하고 있는데 엑셀로 데이터 수집해서 가공하는 시간을 대부분을 사용하고 있다면.. 하루빨리 마케팅 데이터 수집 자동화하고 BI를 구축을 시도해 보세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관련 주제는 내용이 많아서 3개의 파트로 나눠서 글을 발행해보려 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;Third Party 데이터 수집 자동화&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;수집된 데이터 전처리하기&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시각화하기&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 편에서는 MMP(AppsFlyer), GA4, Braze 데이터 수집을 자동화시키는 프로세스를 소개해볼까 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Third&amp;nbsp;Party&amp;nbsp;데이터&amp;nbsp;수집&amp;nbsp;자동화&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마케팅 데이터를 적재하고 시각화까지의 프로세스를 이해하기 쉽게 도식화하면 아래와 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(아래 예시에서 Github Action은 스크립트를 자동화할 수 있는 역할을 하는 Github 이 제공하는 완전관리형 CI/CD 툴입니다)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-09 11.45.39.png&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dByndH/btsIs1aziDP/GEEIE8csZwVd57MLtkk4Ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dByndH/btsIs1aziDP/GEEIE8csZwVd57MLtkk4Ok/img.png&quot; data-alt=&quot;마케팅 데이터 파이프라인 도식화 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dByndH/btsIs1aziDP/GEEIE8csZwVd57MLtkk4Ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdByndH%2FbtsIs1aziDP%2FGEEIE8csZwVd57MLtkk4Ok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1179&quot; height=&quot;526&quot; data-filename=&quot;스크린샷 2024-07-09 11.45.39.png&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;526&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;마케팅 데이터 파이프라인 도식화 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;브레이즈 Currents 데이터 수집하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브레이즈 currents 란&amp;nbsp; 유저의 engagement 이벤트의 실시간 데이터 스트림입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BI 및 분석할 수 있는 데이터를 제공해 주는 기능이다라고 이해하시면 됩니다. 단점은 가격이.. 비싸요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 수집은 클릭 몇 번으로 쉽게 수집할 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;브레이즈 어드민에서 아래처럼 어떤 데이터를 보낼지 선택해서 어디에 저장할지 S3, Cloud Storage, Azure Blob Storage 중 선택해서 적재를 시작합니다.(가이드&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;color: #0070d1; text-align: start;&quot; href=&quot;https://www.braze.com/docs/partners/data_and_infrastructure_agility/cloud_storage/amazon_s3&quot;&gt;링크&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-01 12.12.09 (1).png&quot; data-origin-width=&quot;1754&quot; data-origin-height=&quot;1696&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GEC5B/btsIr9UIK4X/ElJJaKYR6EMetKRV5zKZak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GEC5B/btsIr9UIK4X/ElJJaKYR6EMetKRV5zKZak/img.png&quot; data-alt=&quot;브레이즈 커런츠 이벤트 선택 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GEC5B/btsIr9UIK4X/ElJJaKYR6EMetKRV5zKZak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGEC5B%2FbtsIr9UIK4X%2FElJJaKYR6EMetKRV5zKZak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1754&quot; height=&quot;1696&quot; data-filename=&quot;스크린샷 2023-11-01 12.12.09 (1).png&quot; data-origin-width=&quot;1754&quot; data-origin-height=&quot;1696&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;브레이즈 커런츠 이벤트 선택 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브레이즈 커런츠 데이터를 Amazon S3에 보낸다면 아래 이미지와 같이 이벤트별로 폴더가 분리되어 적재가 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(참고로 브레이즈 Currents는 At-least-once delivery 정책으로 1시간 단위로 데이터를 적재합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 중복된 이벤트가 가끔 스토리지 버킷에 저장될 수 있습니다. 그래서 DW에 적재할 때 고유 식별자 필드(id)를 사용해 이벤트 중복을 제거할 수 있습니다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-08 16.09.03.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1094&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YemhY/btsIsCvARU4/KRfLtR6LaUSCyxgM1fJxaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YemhY/btsIsCvARU4/KRfLtR6LaUSCyxgM1fJxaK/img.png&quot; data-alt=&quot;Amazon s3 에 적재된 Braze Currents 데이터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YemhY/btsIsCvARU4/KRfLtR6LaUSCyxgM1fJxaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYemhY%2FbtsIsCvARU4%2FKRfLtR6LaUSCyxgM1fJxaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1018&quot; height=&quot;1094&quot; data-filename=&quot;스크린샷 2024-07-08 16.09.03.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1094&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Amazon s3 에 적재된 Braze Currents 데이터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 Avro 파일 명을 확인하여 event_type 필드의 key 값을 추가 필요합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 이메일 - open, click, delivery 이벤트 데이터, push - send, open 이벤트 데이터 그리고 인앱메세지의 - 노출, 클릭 데이터를 사내 DataWarehouse에 통합해서 적재한다고 할 때 event_type이라는 필드를 하나 만들어서 어떤 데이터인지 명시해 줘야 된다고 생각하시면 됩니다.&lt;/p&gt;
&lt;table id=&quot;b71420ab-e991-41a0-842b-af6c3ce0fac8&quot; style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr id=&quot;83197832-8104-445e-b64c-8852ec200f4d&quot;&gt;
&lt;td id=&quot;lpiS&quot;&gt;#&lt;/td&gt;
&lt;td id=&quot;=nro&quot;&gt;&lt;b&gt;파일명&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;TOXy&quot;&gt;&lt;b&gt;event_type 필드의 key 값(예시)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;2efd9562-65f4-41dd-af60-37067c3b1d17&quot;&gt;
&lt;td id=&quot;lpiS&quot;&gt;1&lt;/td&gt;
&lt;td id=&quot;=nro&quot;&gt;users.messages.email.Open.avro'&lt;/td&gt;
&lt;td id=&quot;TOXy&quot;&gt;email_open&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;009f631e-a1f9-47b3-b8ed-76f6f08d782e&quot;&gt;
&lt;td id=&quot;lpiS&quot;&gt;2&lt;/td&gt;
&lt;td id=&quot;=nro&quot;&gt;users.messages.email.Click.avro'&lt;/td&gt;
&lt;td id=&quot;TOXy&quot;&gt;email_click&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;636f959a-68b6-46bd-8a97-d309139ef86e&quot;&gt;
&lt;td id=&quot;lpiS&quot;&gt;3&lt;/td&gt;
&lt;td id=&quot;=nro&quot;&gt;users.messages.email.Delivery.avro'&lt;/td&gt;
&lt;td id=&quot;TOXy&quot;&gt;email_delivery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;c08e46d3-f502-4ff5-9daf-8afd39c5daef&quot;&gt;
&lt;td id=&quot;lpiS&quot;&gt;4&lt;/td&gt;
&lt;td id=&quot;=nro&quot;&gt;users.messages.pushnotification.Send.avro'&lt;/td&gt;
&lt;td id=&quot;TOXy&quot;&gt;push_send&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;66eb017d-c0ad-46c9-9420-b9c3f947596a&quot;&gt;
&lt;td id=&quot;lpiS&quot;&gt;5&lt;/td&gt;
&lt;td id=&quot;=nro&quot;&gt;users.messages.pushnotification.Open.avro'&lt;/td&gt;
&lt;td id=&quot;TOXy&quot;&gt;push_open&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;79eb6ceb-d198-49f8-be3a-c5e8cd6ae5ee&quot;&gt;
&lt;td id=&quot;lpiS&quot;&gt;6&lt;/td&gt;
&lt;td id=&quot;=nro&quot;&gt;users.messages.inappmessage.Click.avro'&lt;/td&gt;
&lt;td id=&quot;TOXy&quot;&gt;inappmessage_click&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;95c751a6-4136-4682-965a-31fa65fbe638&quot;&gt;
&lt;td id=&quot;lpiS&quot;&gt;7&lt;/td&gt;
&lt;td id=&quot;=nro&quot;&gt;users.messages.inappmessage.Impression.avro'&lt;/td&gt;
&lt;td id=&quot;TOXy&quot;&gt;inappmessage_Impression&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로 조심해야 될 부분은 브레이즈 커런츠 데이터중에 시간을 나타내는 time이라는 필드가 있는데 UTC 기준이라 추후 전처리 할 때 원하는 시간대(KST)로 처리를 해줘야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-08 16.15.02.png&quot; data-origin-width=&quot;2176&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHqmVG/btsItnR1QRa/samfm5LBmq5gcqbs7EBvW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHqmVG/btsItnR1QRa/samfm5LBmq5gcqbs7EBvW0/img.png&quot; data-alt=&quot;브레이즈 커런츠 데이터 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHqmVG/btsItnR1QRa/samfm5LBmq5gcqbs7EBvW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHqmVG%2FbtsItnR1QRa%2Fsamfm5LBmq5gcqbs7EBvW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2176&quot; height=&quot;640&quot; data-filename=&quot;스크린샷 2024-07-08 16.15.02.png&quot; data-origin-width=&quot;2176&quot; data-origin-height=&quot;640&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;브레이즈 커런츠 데이터 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;MMP(앱스플라이어) 데이터 수집하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱스플라이어 데이터는 사내에서 어떻게 집계할지 기준을 잡아주셔야 됩니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;소개드리는 방식은 SKAN 중복이 어느 정도 발생할 수 있으나 현재까지는 소개드리는 방식이 최선입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;앱스플라이어 측에서 개선을 해주신다고 들었기 때문에 기대가 됩니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱스플라이어 데이터를 집계하기 위해서는 여러 개의 리포트를 Export 해야 되는데요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아시겠지만 굉장히 번거로운 작업입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데일리 리포트를 만들려면 OS별, UA, RT(리타겟팅) 별로 csv 파일을 12번 클릭해서 받아 정리해야 되지만 API를 활용하면 충분히 자동화할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필요한 API는 아래와 같습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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 data Pull API&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;organic
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;install&lt;/li&gt;
&lt;li&gt;in-app events&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;non-organic
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;install&lt;/li&gt;
&lt;li&gt;in-app events&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Aggregate Pull API&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;User Acquisition&lt;/li&gt;
&lt;li&gt;Retargeting&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SKAN AGGREGATED PERFORMANCE REPORT API&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-09 12.02.16.png&quot; data-origin-width=&quot;1466&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GgF09/btsIrygtvFm/krmaZoPSq5U8wzBfU96ee1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GgF09/btsIrygtvFm/krmaZoPSq5U8wzBfU96ee1/img.png&quot; data-alt=&quot;Raw data Pull API 호출 횟수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GgF09/btsIrygtvFm/krmaZoPSq5U8wzBfU96ee1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGgF09%2FbtsIrygtvFm%2FkrmaZoPSq5U8wzBfU96ee1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1466&quot; height=&quot;416&quot; data-filename=&quot;스크린샷 2024-07-09 12.02.16.png&quot; data-origin-width=&quot;1466&quot; data-origin-height=&quot;416&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Raw data Pull API 호출 횟수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-09 14.43.51.png&quot; data-origin-width=&quot;983&quot; data-origin-height=&quot;311&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2kwje/btsIryAVOni/EkGQPGf2gM6Vb21VALr02K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2kwje/btsIryAVOni/EkGQPGf2gM6Vb21VALr02K/img.png&quot; data-alt=&quot;SRN 매체인 메타 데이터의 집약형 리포트 호출 횟수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2kwje/btsIryAVOni/EkGQPGf2gM6Vb21VALr02K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2kwje%2FbtsIryAVOni%2FEkGQPGf2gM6Vb21VALr02K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;983&quot; height=&quot;311&quot; data-filename=&quot;스크린샷 2024-07-09 14.43.51.png&quot; data-origin-width=&quot;983&quot; data-origin-height=&quot;311&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SRN 매체인 메타 데이터의 집약형 리포트 호출 횟수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하루에 호출해야 되는 API가 굉장히 많죠? ㅜㅜ&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 앱스플라이어는 일별 API 호출 제한이 있어서 테스트하실 때 유의해야 합니다. (가이드 &lt;a href=&quot;https://botongsaram.tistory.com/manage/newpost/?type=post&amp;amp;returnURL=%2Fmanage%2Fposts%2F&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 지금 몇 번 호출했는지 확인하시려면 어드민에서 &lt;i&gt;&lt;b&gt;오른쪽 상단 &amp;gt; security center &amp;gt; audit log&lt;/b&gt;&lt;/i&gt;를 보시면 확인 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageslideblock alignCenter&quot; data-image=&quot;[{&amp;quot;src&amp;quot;:&amp;quot;https://blog.kakaocdn.net/dn/rzBFM/btsItRrInx2/dSqkTLKKfDkW8WX4IYMZTk/img.png&amp;quot;},{&amp;quot;src&amp;quot;:&amp;quot;https://blog.kakaocdn.net/dn/bCTbyf/btsIrxWew3C/sQ1YFExhdarbpTgwpiwaR0/img.png&amp;quot;},{&amp;quot;src&amp;quot;:&amp;quot;https://blog.kakaocdn.net/dn/kCGcS/btsIsAYY5EB/zfrbd2CFVVyMmNUZiuKJkk/img.png&amp;quot;}]&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span class=&quot;image-wrap selected&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rzBFM/btsItRrInx2/dSqkTLKKfDkW8WX4IYMZTk/img.png&quot; data-url=&quot;https://blog.kakaocdn.net/dn/rzBFM/btsItRrInx2/dSqkTLKKfDkW8WX4IYMZTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rzBFM/btsItRrInx2/dSqkTLKKfDkW8WX4IYMZTk/img.png&quot; loading=&quot;lazy&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrzBFM%2FbtsItRrInx2%2FdSqkTLKKfDkW8WX4IYMZTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; data-origin-width=&quot;205&quot; data-origin-height=&quot;381&quot; data-is-animation=&quot;false&quot;/&gt;&lt;/span&gt;&lt;span class=&quot;image-wrap &quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCTbyf/btsIrxWew3C/sQ1YFExhdarbpTgwpiwaR0/img.png&quot; data-url=&quot;https://blog.kakaocdn.net/dn/bCTbyf/btsIrxWew3C/sQ1YFExhdarbpTgwpiwaR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCTbyf/btsIrxWew3C/sQ1YFExhdarbpTgwpiwaR0/img.png&quot; loading=&quot;lazy&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCTbyf%2FbtsIrxWew3C%2FsQ1YFExhdarbpTgwpiwaR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; data-origin-width=&quot;205&quot; data-origin-height=&quot;381&quot; data-is-animation=&quot;false&quot;/&gt;&lt;/span&gt;&lt;span class=&quot;image-wrap &quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kCGcS/btsIsAYY5EB/zfrbd2CFVVyMmNUZiuKJkk/img.png&quot; data-url=&quot;https://blog.kakaocdn.net/dn/kCGcS/btsIsAYY5EB/zfrbd2CFVVyMmNUZiuKJkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kCGcS/btsIsAYY5EB/zfrbd2CFVVyMmNUZiuKJkk/img.png&quot; loading=&quot;lazy&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkCGcS%2FbtsIsAYY5EB%2Fzfrbd2CFVVyMmNUZiuKJkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; data-origin-width=&quot;205&quot; data-origin-height=&quot;381&quot; data-is-animation=&quot;false&quot;/&gt;&lt;/span&gt;&lt;button class=&quot;btn btn-prev&quot;&gt;&lt;span class=&quot;ico-prev&quot;&gt;이전&lt;/span&gt;&lt;/button&gt;&lt;button class=&quot;btn btn-next&quot;&gt;&lt;span class=&quot;ico-next&quot;&gt;다음&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;
  &lt;div class=&quot;mark&quot;&gt;&lt;span data-index=&quot;0&quot;&gt;0&lt;/span&gt;&lt;span data-index=&quot;1&quot;&gt;1&lt;/span&gt;&lt;span data-index=&quot;2&quot;&gt;2&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;Appsflyer API 호출 횟수 확인하는 방법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 또 하나 중요한 점은 서두에 언급했듯이 앱스플라이어 데이터를 어떻게 볼지 기준에 대해서 논의하시고 대행사와도 공유하는 걸 권장드립니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 무슨 말이냐면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱스플라이어 rawdata를 보시다 보면 Media Source 값 중에 restricted라고 명시된 데이터를 보실 수 있습니다. 이건 SRN 매체들의 경우 개인정보보호 이슈로 rawdata에 포함하지 않기 때문입니다. 그래서 SRN 매체(메타, 핀터레스트, 트위터, 스냅챗 등)의 경우에는 집약형 데이터를 활용합니다.(가이드 문서&amp;nbsp;&lt;a href=&quot;https://support.appsflyer.com/hc/en-us/articles/360006868017-Raw-data-content-restriction-media-source-or-user-identifiers&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span&gt;링크&lt;/span&gt;&lt;/a&gt;)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그런데 여기서 LTV라는 개념이 등장합니다. 평생가치라는 개념인데.. 앱스플라이어의 &lt;a title=&quot;가이드 문서&quot; href=&quot;https://botongsaram.tistory.com/manage/newpost/?type=post&amp;amp;returnURL=%2Fmanage%2Fposts%2F&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;가이드 문서&lt;/a&gt;를 이용하면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;LTV 데이터는 특정 날짜 범위에 앱을 전환/인스톨한 사용자의 일생동안 수행되는 이벤트입니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-09 14.07.26.png&quot; data-origin-width=&quot;1002&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpGOF7/btsItIIrB1h/ygu6q576T9ZBldIZjAcDZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpGOF7/btsItIIrB1h/ygu6q576T9ZBldIZjAcDZ0/img.png&quot; data-alt=&quot;집계 데이터를 가져오기 위한 다양한 리포트 방법&amp;amp;nbsp;비교표&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpGOF7/btsItIIrB1h/ygu6q576T9ZBldIZjAcDZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpGOF7%2FbtsItIIrB1h%2Fygu6q576T9ZBldIZjAcDZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1002&quot; height=&quot;290&quot; data-filename=&quot;스크린샷 2024-07-09 14.07.26.png&quot; data-origin-width=&quot;1002&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;집계 데이터를 가져오기 위한 다양한 리포트 방법&amp;nbsp;비교표&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 표를 보시면 집약형 데이터는 LTV 데이터라고 합니다. 즉 데이터를 조회할 때마다 매출이 달라질 수 있다는 의미죠..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 되면 현재가 2024년 7월인데 2024년 5월 데이터를 5월에 조회했을 때랑 지금 조회할 때랑 큰 매출 차이를 보이게 됩니다.&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;039&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/039.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/039.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;머리가 아파집니다...&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 집약형 데이터를 API로 소싱 및 적재를 할 때 30일 정도치의 데이터를 매일 갱신해줘야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들면 집약형 데이터를 매일 30일 치 데이터를 소싱하고 기존 DB에 적재된 30일 치 집약형 데이터는 삭제하고 append 하는 방식입니다(SKAN aggregated performance API&amp;nbsp; 도 동일한 로직으로 해주시면 됩니다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SKAN API 는 Total Revenue 환율이 USD 데이터만 줍니다..&amp;nbsp; 처리하실 때 환율 데이터랑 결합해서 원화로 계산을 해야 되는.. 번거로움이 있어요..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 timezone 관련해서도 중요한데요 아래 가이드를 보시면 UTC only 라고 되어 있습니다(KST로 맞춰야 되는데..)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-09 15.23.53.png&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;1213&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfnuSX/btsIsZYtA2f/wTTLcK8WVhVs5SWDQtqRGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfnuSX/btsIsZYtA2f/wTTLcK8WVhVs5SWDQtqRGK/img.png&quot; data-alt=&quot;앱스플라이어 가이드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfnuSX/btsIsZYtA2f/wTTLcK8WVhVs5SWDQtqRGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfnuSX%2FbtsIsZYtA2f%2FwTTLcK8WVhVs5SWDQtqRGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1048&quot; height=&quot;1213&quot; data-filename=&quot;스크린샷 2024-07-09 15.23.53.png&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;1213&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;앱스플라이어 가이드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SKAN aggregated performance report API를 호출해 보면.. KST로 바꿀 수 있는 형태인지 확인해 봤는데 &lt;b&gt;%y-%m-%d&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;형태로 데이터를 줍니다... 이상해서 다른 문서들에 뭔가 추가 정보를 얻을만한 것들이 있는지 문서를 찾아봤습니다.&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;016&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/016.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/016.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-09 15.51.12.png&quot; data-origin-width=&quot;1426&quot; data-origin-height=&quot;1326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1t9aQ/btsIt4kdf06/yjKbcKOcwgRh4j0akPrxA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1t9aQ/btsIt4kdf06/yjKbcKOcwgRh4j0akPrxA0/img.png&quot; data-alt=&quot;앱스플라이어 API reference&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1t9aQ/btsIt4kdf06/yjKbcKOcwgRh4j0akPrxA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1t9aQ%2FbtsIt4kdf06%2FyjKbcKOcwgRh4j0akPrxA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1426&quot; height=&quot;1326&quot; data-filename=&quot;스크린샷 2024-07-09 15.51.12.png&quot; data-origin-width=&quot;1426&quot; data-origin-height=&quot;1326&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;앱스플라이어 API reference&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AppsFlyer의 SKAdNetwork(SKAN) 개요 대시보드 가이드 내에는 메타, 구글 SKAN 데이터는 예외적으로 설정된 타임존을 따른다고 되어있습니다.&amp;nbsp; API 문서에는 UTC only라고 되어 있어서.. 난감했던 경험이 생각납니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-09 15.45.10.png&quot; data-origin-width=&quot;1929&quot; data-origin-height=&quot;934&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFqhgm/btsIsLTDvyl/x2EHOaxMpCUE8IR7yhq9Lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFqhgm/btsIsLTDvyl/x2EHOaxMpCUE8IR7yhq9Lk/img.png&quot; data-alt=&quot;앱스플라이어 가이드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFqhgm/btsIsLTDvyl/x2EHOaxMpCUE8IR7yhq9Lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFqhgm%2FbtsIsLTDvyl%2Fx2EHOaxMpCUE8IR7yhq9Lk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1929&quot; height=&quot;934&quot; data-filename=&quot;스크린샷 2024-07-09 15.45.10.png&quot; data-origin-width=&quot;1929&quot; data-origin-height=&quot;934&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;앱스플라이어 가이드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;GA4 데이터 수집하기&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;GA4 빅쿼리는 실무에서 쓰고 있는 조직이 있나 싶을 정도로.. 사용하기가 좀 꺼려집니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&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;a href=&quot;https://botongsaram.tistory.com/entry/%EB%B9%85%EC%BF%BC%EB%A6%AC%EC%97%90%EC%84%9C%EC%9D%98-GA4-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%99%9C%EC%9A%A9-%ED%98%84%EC%8B%A4-%EA%B8%B0%ED%9A%8C%EC%99%80-%EC%B9%98%EB%AA%85%EC%A0%81%EC%9D%B8-%EB%AC%B8%EC%A0%9C%EC%A0%90&quot;&gt;빅쿼리에서의 GA4 데이터 활용 현실: 기회와 치명적인 문제점&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1720504246119&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;빅쿼리에서의 GA4 데이터 활용 현실: 기회와 치명적인 문제점&quot; data-og-description=&quot;GA4 데이터를 빅쿼리로 보내면 뭐든 다 해결될 것 같은 이야기들이 많지만 실상은 그렇지 못합니다. GA4 인터페이스와 차이가 많고 많은 데이터 용량으로 ETL 과정으로 생각보다 리소스가 많이 듭&quot; data-og-host=&quot;botongsaram.tistory.com&quot; data-og-source-url=&quot;https://botongsaram.tistory.com/entry/%EB%B9%85%EC%BF%BC%EB%A6%AC%EC%97%90%EC%84%9C%EC%9D%98-GA4-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%99%9C%EC%9A%A9-%ED%98%84%EC%8B%A4-%EA%B8%B0%ED%9A%8C%EC%99%80-%EC%B9%98%EB%AA%85%EC%A0%81%EC%9D%B8-%EB%AC%B8%EC%A0%9C%EC%A0%90&quot; data-og-url=&quot;https://botongsaram.tistory.com/entry/%EB%B9%85%EC%BF%BC%EB%A6%AC%EC%97%90%EC%84%9C%EC%9D%98-GA4-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%99%9C%EC%9A%A9-%ED%98%84%EC%8B%A4-%EA%B8%B0%ED%9A%8C%EC%99%80-%EC%B9%98%EB%AA%85%EC%A0%81%EC%9D%B8-%EB%AC%B8%EC%A0%9C%EC%A0%90&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/DeHEW/hyWvUJsqCQ/k0wtcXC36dT5xkyn6KnKN0/img.png?width=800&amp;amp;height=213&amp;amp;face=0_0_800_213,https://scrap.kakaocdn.net/dn/c3NcX2/hyWvSdMTRp/hptJUtskxacnZszHBJKfJ0/img.png?width=800&amp;amp;height=213&amp;amp;face=0_0_800_213,https://scrap.kakaocdn.net/dn/niVih/hyWzBnU7wX/nk64d8qHpTrD4tETgdnEgk/img.png?width=1951&amp;amp;height=450&amp;amp;face=0_0_1951_450&quot;&gt;&lt;a href=&quot;https://botongsaram.tistory.com/entry/%EB%B9%85%EC%BF%BC%EB%A6%AC%EC%97%90%EC%84%9C%EC%9D%98-GA4-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%99%9C%EC%9A%A9-%ED%98%84%EC%8B%A4-%EA%B8%B0%ED%9A%8C%EC%99%80-%EC%B9%98%EB%AA%85%EC%A0%81%EC%9D%B8-%EB%AC%B8%EC%A0%9C%EC%A0%90&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://botongsaram.tistory.com/entry/%EB%B9%85%EC%BF%BC%EB%A6%AC%EC%97%90%EC%84%9C%EC%9D%98-GA4-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%99%9C%EC%9A%A9-%ED%98%84%EC%8B%A4-%EA%B8%B0%ED%9A%8C%EC%99%80-%EC%B9%98%EB%AA%85%EC%A0%81%EC%9D%B8-%EB%AC%B8%EC%A0%9C%EC%A0%90&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/DeHEW/hyWvUJsqCQ/k0wtcXC36dT5xkyn6KnKN0/img.png?width=800&amp;amp;height=213&amp;amp;face=0_0_800_213,https://scrap.kakaocdn.net/dn/c3NcX2/hyWvSdMTRp/hptJUtskxacnZszHBJKfJ0/img.png?width=800&amp;amp;height=213&amp;amp;face=0_0_800_213,https://scrap.kakaocdn.net/dn/niVih/hyWzBnU7wX/nk64d8qHpTrD4tETgdnEgk/img.png?width=1951&amp;amp;height=450&amp;amp;face=0_0_1951_450');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;빅쿼리에서의 GA4 데이터 활용 현실: 기회와 치명적인 문제점&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;GA4 데이터를 빅쿼리로 보내면 뭐든 다 해결될 것 같은 이야기들이 많지만 실상은 그렇지 못합니다. GA4 인터페이스와 차이가 많고 많은 데이터 용량으로 ETL 과정으로 생각보다 리소스가 많이 듭&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;botongsaram.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 광고 데이터 성과를 집계할 때는 특별한 이유가 없다면 GA4 API 데이터를 소싱하는 게 정합성 의심의 여지가 없기 API 데이터를 활용하는 편이 좋다고 생각합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 호출 방법은 구글링 해보시면 쉽게 찾아보실 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;2032&quot; data-origin-height=&quot;1554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdc9SU/btsIrrhvsHw/FooTGsjvbjSkmTbtzxzs01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdc9SU/btsIrrhvsHw/FooTGsjvbjSkmTbtzxzs01/img.png&quot; data-alt=&quot;GA Data API&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdc9SU/btsIrrhvsHw/FooTGsjvbjSkmTbtzxzs01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbdc9SU%2FbtsIrrhvsHw%2FFooTGsjvbjSkmTbtzxzs01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2032&quot; height=&quot;1554&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;2032&quot; data-origin-height=&quot;1554&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;GA Data API&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GA4 데이터는 진짜 샘플링을 주의해야 되는데요&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보고서 만드시다 보면 오른쪽 상단에 있는 샘플링된 탐색 분석에서 더 자세한 결과를 누르지 않으면.. 샘플링된 데이터만 보게 되므로 정합성을 맞춰보실 땐 더 자세한 결과를 선택해줘야 합니다.(굉장히 번거로움)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데.. 데이터 조회 범위가 넓으면 샘플링된 보고서 밖에 확인할 수 없는...&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-08 17.32.54.png&quot; data-origin-width=&quot;291&quot; data-origin-height=&quot;157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqtuKC/btsIsft8Vim/uD2B5rkP2RSTNNOsV6qOwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqtuKC/btsIsft8Vim/uD2B5rkP2RSTNNOsV6qOwK/img.png&quot; data-alt=&quot;GA4 보고서&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqtuKC/btsIsft8Vim/uD2B5rkP2RSTNNOsV6qOwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqtuKC%2FbtsIsft8Vim%2FuD2B5rkP2RSTNNOsV6qOwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;291&quot; height=&quot;157&quot; data-filename=&quot;스크린샷 2024-07-08 17.32.54.png&quot; data-origin-width=&quot;291&quot; data-origin-height=&quot;157&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;GA4 보고서&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GA4 API 도 직접 호출해 봅니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;smapling_metadata 영역을 보시면 꽤 많은 양의 데이터가 샘플링 돼버립니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-08 17.33.56.png&quot; data-origin-width=&quot;598&quot; data-origin-height=&quot;994&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMKZF6/btsItjbgA4a/ZtCZL61lF2pneVMqKUnkTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMKZF6/btsItjbgA4a/ZtCZL61lF2pneVMqKUnkTK/img.png&quot; data-alt=&quot;GA4 API 호출 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMKZF6/btsItjbgA4a/ZtCZL61lF2pneVMqKUnkTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMKZF6%2FbtsItjbgA4a%2FZtCZL61lF2pneVMqKUnkTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;598&quot; height=&quot;994&quot; data-filename=&quot;스크린샷 2024-07-08 17.33.56.png&quot; data-origin-width=&quot;598&quot; data-origin-height=&quot;994&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;GA4 API 호출 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Query Explorer(&lt;a title=&quot;GA4 Query Explorer&quot; href=&quot;https://ga-dev-tools.google/ga4/query-explorer/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;) 도 조회해 봅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서도 데이터 조회 범위가 넓으니 샘플링된 것 같아서 구글 측에 문의해 보니 맞다고 확인했고 추후에 Query Explorer의 이슈는 해결하겠다고 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-08 17.34.58.png&quot; data-origin-width=&quot;759&quot; data-origin-height=&quot;1149&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmnl1y/btsIsZqyTSB/XjAv9KMigIY0KgDK80bJPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmnl1y/btsIsZqyTSB/XjAv9KMigIY0KgDK80bJPk/img.png&quot; data-alt=&quot;Query Explorer 를 활용한 GA4 API 호출 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmnl1y/btsIsZqyTSB/XjAv9KMigIY0KgDK80bJPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbmnl1y%2FbtsIsZqyTSB%2FXjAv9KMigIY0KgDK80bJPk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;759&quot; height=&quot;1149&quot; data-filename=&quot;스크린샷 2024-07-08 17.34.58.png&quot; data-origin-width=&quot;759&quot; data-origin-height=&quot;1149&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Query Explorer 를 활용한 GA4 API 호출 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 이슈로 GA4 API를 샘플링되지 않을 정도의 날짜 범위로 API를 호출해서 적재를 하는 것이 좋습니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지&amp;nbsp;마케팅 데이터 수집 자동화에 대해서 알아보았고 다음 편에서는 인사이트 도출을 위한 데이터 전처리 방법에 대해서 알아보겠습니다!&lt;/p&gt;</description>
      <category>모바일 마케팅</category>
      <category>apssflyer</category>
      <category>Braze</category>
      <category>braze currents</category>
      <category>GA4</category>
      <category>MMP</category>
      <category>마케팅 데이터 수집 자동화</category>
      <category>마케팅대시보드</category>
      <category>마케팅데이터수집</category>
      <category>브레이즈커런츠</category>
      <author>알랭드보통 사람</author>
      <guid isPermaLink="true">https://botongsaram.tistory.com/9</guid>
      <comments>https://botongsaram.tistory.com/entry/MMPAppsFlyer-GA4-Braze-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%B4-%EC%8B%9C%EA%B0%81%ED%99%94%ED%95%A0-%EB%95%8C-%EB%B0%98%EB%93%9C%EC%8B%9C-%EA%B3%A0%EB%A0%A4%ED%95%B4%EC%95%BC%ED%95%A0-%EC%82%AC%ED%95%AD1-Third-Party-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%88%98%EC%A7%91-%EC%9E%90%EB%8F%99%ED%99%94#entry9comment</comments>
      <pubDate>Tue, 9 Jul 2024 16:05:57 +0900</pubDate>
    </item>
    <item>
      <title>빅쿼리에서의 GA4 데이터 활용 현실: 기회와 치명적인 문제점</title>
      <link>https://botongsaram.tistory.com/entry/%EB%B9%85%EC%BF%BC%EB%A6%AC%EC%97%90%EC%84%9C%EC%9D%98-GA4-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%99%9C%EC%9A%A9-%ED%98%84%EC%8B%A4-%EA%B8%B0%ED%9A%8C%EC%99%80-%EC%B9%98%EB%AA%85%EC%A0%81%EC%9D%B8-%EB%AC%B8%EC%A0%9C%EC%A0%90</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;GA4 데이터를 빅쿼리로 보내면 뭐든 다 해결될 것 같은 이야기들이 많지만 실상은 그렇지 못합니다. GA4 인터페이스와 차이가 많고 많은 데이터 용량으로 ETL 과정으로 생각보다 리소스가 많이 듭니다. 그럼에도 불구하고 빅쿼리를 쓰는 이유가 뭘까요?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-14 11.42.41.png&quot; data-origin-width=&quot;1554&quot; data-origin-height=&quot;415&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOfnE3/btsHnhtzfwV/MkeQyhZEDDTL7qJrseFkY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOfnE3/btsHnhtzfwV/MkeQyhZEDDTL7qJrseFkY0/img.png&quot; data-alt=&quot;GA4 빅쿼리네 데이터 Export 하는 기능&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOfnE3/btsHnhtzfwV/MkeQyhZEDDTL7qJrseFkY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOfnE3%2FbtsHnhtzfwV%2FMkeQyhZEDDTL7qJrseFkY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1554&quot; height=&quot;415&quot; data-filename=&quot;스크린샷 2024-05-14 11.42.41.png&quot; data-origin-width=&quot;1554&quot; data-origin-height=&quot;415&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;GA4 빅쿼리네 데이터 Export 하는 기능&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;GA4 데이터를 빅쿼리로 활용하면 좋은 점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 샘플링(GA4 인터페이스에서의 데이터는 샘플링이 되어있습니다)&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 style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GA4 보고서를 보면 분석 범위에 행이 많으면 데이터 카디널리티 발생&lt;/li&gt;
&lt;li&gt;이로 인해서 동일한 차원을 사용하는 표준 보고서와 다른 값이 나올 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;데이터 카디널리티란?&lt;br /&gt;카디널리티는 측정 기준 고유값의 개수.&lt;br /&gt;하나의 측정기준에 얼마나 많은 고유값이 있는지를 의미함&lt;br /&gt;예를 들어, 성별 측정기준은 남성, 여성으로 두 가지 값만 가지고 있으므로 카디널리티가 낮음, 반면 마케팅 데이터를 기준으로 캠페인차원(utm_campaign) 을 기준으로 측정기준을 가져가면 카디널리티가 높은 것&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;GA4 데이터를 빅쿼리로 사용한다면 판도라의 상자를 여는 것&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 구글 애널리틱스 인터페이스와 데이터는 안 맞습니다. 아래는 공식문서상에서도 불일치가 있다는 것을 언급하고 있습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;[GA4] Compare Analytics reports and data exported to BigQuery(&lt;a href=&quot;https://support.google.com/analytics/answer/13578783?hl=en#zippy=%2Cin-this-article&quot; data-token-index=&quot;1&quot;&gt;링크&lt;/a&gt;)&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-08 12.17.48.png&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;1289&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lBvqH/btsHnqcLh8g/leZYiBlM4wk64yed1OD2kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lBvqH/btsHnqcLh8g/leZYiBlM4wk64yed1OD2kk/img.png&quot; data-alt=&quot;ga4 bigquery discrepency&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lBvqH/btsHnqcLh8g/leZYiBlM4wk64yed1OD2kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlBvqH%2FbtsHnqcLh8g%2FleZYiBlM4wk64yed1OD2kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;532&quot; height=&quot;942&quot; data-filename=&quot;스크린샷 2024-05-08 12.17.48.png&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;1289&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ga4 bigquery discrepency&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GA4와 Bigquery의 불일치를 검색하면 상당히 많은 문서들이 나옵니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;차원데이터를 Break Down 하면 할수록(카디널리티가 높으면) (other)로 집계되기도 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 GA4 빅쿼리 데이터를 가공하다 보면 어? 뭐지? 하는 현상들이 있는데 대표적인 하나의 케이스를 공유해볼까 합니다. 바로! 빅쿼리에 저장되는 GA4 데이터에는 구글 관련 트래픽에 가장 큰 문제가 있다는 것입니다ㅜㅜ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gclid 파라미터(구글 애즈 캠페인으로 들어온 트래픽이라는 의미)가 있는 세션이 시작되었을 때 빅쿼리는 utm_medium, utm_campaign 파라미터를 (organic)으로 기록해 버립니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 말하면 구글 애즈로 들어왔다는 데이터라고 식별은 되지만 캠페인 명이 증발해 버리는 현상입니다.(아래 쿼리 참고)&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;소스 = google&lt;br /&gt;매체 = Organic&lt;br /&gt;캠페인 = (Organic)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-08 12.31.03.png&quot; data-origin-width=&quot;1951&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beTJvB/btsHqaTgZPM/P4YW3N0XqvtKRo5RJDxLlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beTJvB/btsHqaTgZPM/P4YW3N0XqvtKRo5RJDxLlk/img.png&quot; data-alt=&quot;빅쿼리 RAWDATA 에 구글 캠페인명이 없음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beTJvB/btsHqaTgZPM/P4YW3N0XqvtKRo5RJDxLlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeTJvB%2FbtsHqaTgZPM%2FP4YW3N0XqvtKRo5RJDxLlk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1951&quot; height=&quot;450&quot; data-filename=&quot;스크린샷 2024-05-08 12.31.03.png&quot; data-origin-width=&quot;1951&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;빅쿼리 RAWDATA 에 구글 캠페인명이 없음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1715656546300&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;with events as (
      select
        -- DATE(datetime(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul')) as date,
        cast(event_date as date format 'YYYYMMDD') as date,
        -- unique session id
        concat(user_pseudo_id, (select value.int_value from unnest(event_params) where key = 'ga_session_id')) as session_id,
        user_pseudo_id,
        (select value.int_value from unnest(event_params) where key = 'ga_session_id') as session_start,
        if(
              (select value.string_value from unnest(event_params) where key in ('campaign_id', 'campaign', 'source', 'medium', 'term', 'content', 'gclid', 'dclid', 'srsltid') and value.string_value is not null limit 1) is not null,
              (
                select as struct
                  (select value.string_value from unnest(event_params) where key = 'campaign_id') as manual_campaign_id,
                  (select value.string_value from unnest(event_params) where key = 'campaign') as manual_campaign_name,
                  (select value.string_value from unnest(event_params) where key = 'source') as manual_source,
                  (select value.string_value from unnest(event_params) where key = 'medium') as manual_medium,
                  (select value.string_value from unnest(event_params) where key = 'term') as manual_term,
                  (select value.string_value from unnest(event_params) where key = 'content') as manual_content,
                  (select value.string_value from unnest(event_params) where key = 'gclid') as gclid,
                  (select value.string_value from unnest(event_params) where key = 'dclid') as dclid,
                  (select value.string_value from unnest(event_params) where key = 'srsltid') as srsltid
              ),
              null
              ) as collected_traffic_source,
        event_timestamp,
        stream_id,
        (select value.string_value from unnest(event_params) where key = 'device_category') device_category,
        event_name,
        ecommerce.purchase_revenue_in_usd  as purchase_revenue_in_usd,
        case 
          when event_name = 'purchase'
          then 1 else 0 end AS purchase

      from
        `테이블명`
      where
         _TABLE_SUFFIX &amp;gt;= '20231001' AND _TABLE_SUFFIX &amp;lt;= '20231001'
        -- starting from 20231102 the sessions_start and first_visit events don't need to be excluded anymore
        and (select value.string_value from unnest(event_params) where key = 'source') = 'google'
)

select * from events
order by session_id&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 현상을 해결하려면 UTM 파라미터를 자동 태깅(gclid)을 대신해서 사용하거나 URL에 커스텀 파라미터를 붙여서 해결할 수 있긴 합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Page Referrer에 담긴 gclid를 모아서 빅쿼리의 데이터를 수정해 줘야 됩니다.&lt;/li&gt;
&lt;li&gt;여기서 한 가지 조건이 있는데
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유저가 세션 안에서 2개의 페이지 뷰 이벤트를 가지고 있어야 합니다.&lt;/li&gt;
&lt;li&gt;왜냐하면 사용자가 광고 클릭 후 랜딩 페이지에 도착하고 이후 추가 페이지를 탐색할 경우, 첫 번째 페이지(랜딩 페이지)에서의 referrer에 gclid가 포함되어 기록될 가능성이 높기 때문입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;따라서 GA4 Custom Dimensions을 통해서 ga_session_id, gclid를 구글 태그매니저(GTM)로 잡는 방법을 사용하면 됩니다.&lt;/li&gt;
&lt;li&gt;이렇게 셋팅을 했다면 GA4 API를 통해서 sessionCampaignName, sessionSourceMedium, customEvent:ga_session_id, customEvent:gclid 를 구글 스프레드시트나 빅쿼리에 테이블을 만들거나 혹은 GCF(Google Cloud Function)을 활용해서 빅쿼리 테이블 만들어서 GA4 빅쿼리 테이블과 JOIN 을통해 이런 현상을 해결 해볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;결론&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유저 레벨 분석이 아닌 마케팅 성과를 집계하기 위한 목적(ROAS, CPA 등과 같은 성과지표)으로 GA4 데이터를 활용하고자 한다면 Bigquery Export 보다는 Google Analytics Data API 를 활용해서 일별로 (날짜, 소스, 매체, 캠페인 차원과 필요 지표들) 내부 DataWarehouse에 저장해서 활용하는 방식이 더 효율적일 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 Google Analytics Data API 를 활용한다면 집계된 데이터를 받아오기 때문에 Total Users와 같은 유니크한 집계값 (Count Distinct)를 해야 되는 지표는 제외하고 이벤트 단위(구매, 회원가입 이벤트 수)의 지표만 활용해야 합니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ &lt;span style=&quot;background-color: #f6e199;&quot;&gt;GA4 API 데이터 적재하여 사용할 때 user 집계 measure를 사용하면 안되는 이유&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 4명의 유저가 우리 사이트에 2024-01-01 ~ 2024-01-03 기간 동안 방문했습니다.(로우 데이터)&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;event_time&lt;/td&gt;
&lt;td&gt;user_id&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024-01-01&lt;/td&gt;
&lt;td&gt;U1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024-01-01&lt;/td&gt;
&lt;td&gt;U2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024-01-01&lt;/td&gt;
&lt;td&gt;U3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024-01-02&lt;/td&gt;
&lt;td&gt;U1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024-01-02&lt;/td&gt;
&lt;td&gt;U2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024-01-03&lt;/td&gt;
&lt;td&gt;U1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024-01-03&lt;/td&gt;
&lt;td&gt;U3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024-01-03&lt;/td&gt;
&lt;td&gt;U4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일별 Total User를 집계해 보면&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;background-color: #6ed3d8; color: #ffffff; text-align: start;&quot;&gt;event_time&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;background-color: #6ed3d8; color: #ffffff; text-align: start;&quot;&gt;user_id&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024-01-01&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024-01-02&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024-01-03&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 기간의 Total User를 집계해 보면&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;event_time_range&lt;/td&gt;
&lt;td&gt;unique user count&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024-01-01 to 2024-01-03&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일별, 기간별 집계했을 때 유니크 사용자수는 완전히 다릅니다. (DAU, MAU 개념과 동일) 일별 테이블을 다 더해서 집계를 해서 사용하시면 쓸모없는 지표가 되어버리기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 유저레벨 단위로 혹은 GA4 인터페이스에서 처리 못하는 방식의 데이터 가공이 필요하다면 위의 케이스를 반드시 고려해야 될 뿐 아니라 분석 단위(dimension) 별 유저수, source, medium별 attribution의 차이를 염두하고&amp;nbsp;빅쿼리를 사용하셔야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-origin-height=&quot;182&quot; data-origin-width=&quot;1024&quot; data-filename=&quot;마티니 서명 화이트.gif&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zZw9Q/btsD3qrTAdC/u3MaapqsMqiEotNSMcXwB1/img.gif&quot; width=&quot;287&quot; height=&quot;51&quot; data-origin-height=&quot;182&quot; data-origin-width=&quot;1024&quot; data-filename=&quot;마티니 서명 화이트.gif&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;풀스택 마케팅 컨설팅펌 마티니아이오&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1716169998980&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Martinee&quot; data-og-description=&quot;브레이즈에 대한 마티니의 높은 이해도를 바탕으로 이탈 유저 대상 LMF 실험을 통해 최적의 크리에이티브를 찾아 대조군 대비 ~93% CVR 상승을 경험했고, OS, Segment별 성과에 따른 후속 액션을 도출&quot; data-og-host=&quot;martinee.io&quot; data-og-source-url=&quot;https://martinee.io/&quot; data-og-url=&quot;https://martinee.io/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://martinee.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://martinee.io/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Martinee&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;브레이즈에 대한 마티니의 높은 이해도를 바탕으로 이탈 유저 대상 LMF 실험을 통해 최적의 크리에이티브를 찾아 대조군 대비 ~93% CVR 상승을 경험했고, OS, Segment별 성과에 따른 후속 액션을 도출&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;martinee.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마티니 링크드인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.linkedin.com/company/martinee&quot;&gt;https://www.linkedin.com/company/martinee&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1716170039848&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Martinee (마티니아이오) | LinkedIn&quot; data-og-description=&quot;Martinee (마티니아이오) | LinkedIn 팔로워 591명 | 마티니(Martinee)는 &amp;lsquo;Marketing Intelligence People&amp;rsquo;의 약자로 웹/앱 서비스 성장에 필요한 Growth, CRM, Performance Marketing을 풀 스택으로 지원합니다. | 앱스플라&quot; data-og-host=&quot;kr.linkedin.com&quot; data-og-source-url=&quot;https://www.linkedin.com/company/martinee&quot; data-og-url=&quot;https://kr.linkedin.com/company/martinee&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/wdU2t/hyV6kaEPu5/biQF7KXU9kokM8b7r1UVMK/img.jpg?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200,https://scrap.kakaocdn.net/dn/bQ3uD9/hyV9O80xox/BAXAEcLIESKWCnbKAIsrDk/img.jpg?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200&quot;&gt;&lt;a href=&quot;https://www.linkedin.com/company/martinee&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.linkedin.com/company/martinee&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/wdU2t/hyV6kaEPu5/biQF7KXU9kokM8b7r1UVMK/img.jpg?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200,https://scrap.kakaocdn.net/dn/bQ3uD9/hyV9O80xox/BAXAEcLIESKWCnbKAIsrDk/img.jpg?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Martinee (마티니아이오) | LinkedIn&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Martinee (마티니아이오) | LinkedIn 팔로워 591명 | 마티니(Martinee)는 &amp;lsquo;Marketing Intelligence People&amp;rsquo;의 약자로 웹/앱 서비스 성장에 필요한 Growth, CRM, Performance Marketing을 풀 스택으로 지원합니다. | 앱스플라&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kr.linkedin.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>모바일 마케팅</category>
      <category>bigquery</category>
      <category>GA4</category>
      <category>ga4bigquery</category>
      <category>GA4분석</category>
      <category>마케팅성과분석</category>
      <category>빅쿼리ga4</category>
      <author>알랭드보통 사람</author>
      <guid isPermaLink="true">https://botongsaram.tistory.com/8</guid>
      <comments>https://botongsaram.tistory.com/entry/%EB%B9%85%EC%BF%BC%EB%A6%AC%EC%97%90%EC%84%9C%EC%9D%98-GA4-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%99%9C%EC%9A%A9-%ED%98%84%EC%8B%A4-%EA%B8%B0%ED%9A%8C%EC%99%80-%EC%B9%98%EB%AA%85%EC%A0%81%EC%9D%B8-%EB%AC%B8%EC%A0%9C%EC%A0%90#entry8comment</comments>
      <pubDate>Mon, 20 May 2024 10:54:49 +0900</pubDate>
    </item>
    <item>
      <title>앱스플라이어(AppsFlyer) MMP 제대로 사용하고 있는걸까? 데이터 사각지대 대응 솔루션 ft. 데이터 락커</title>
      <link>https://botongsaram.tistory.com/entry/%EC%95%B1%EC%8A%A4%ED%94%8C%EB%9D%BC%EC%9D%B4%EC%96%B4AppsFlyer-MMP-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B3%A0-%EC%9E%88%EB%8A%94%EA%B1%B8%EA%B9%8C-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%82%AC%EA%B0%81%EC%A7%80%EB%8C%80-%EB%8C%80%EC%9D%91-%EC%86%94%EB%A3%A8%EC%85%98-ft-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%9D%BD%EC%BB%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;앱 마케팅의 성과 측정을 위한 방식과 데이터의 해석은 쉽지 않습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아마 경험이 있으시다면 내가 성과를 제대로 측정하고 있는지 다른 데서도 이렇게 하는지 앱 성과 측정을 잘하는 곳은 어떻게 하는지 많이 궁금해하실 겁니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 개인정보보호 이슈로인해 앱 마케터들이 필요한 성과 측정 지표에 구멍이 뚫리기 시작했었죠&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 위해 MMP들은 이를 보정하기 위해 굉장히 많은 기술로 앱 성과를 측정할 수 있도록 보완해주고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이를 제대로 사용해야만 데이터 사각지대를 피할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터 사각지대란?&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;데이터 사각지대는 마치 안개가 짙은 도로에서 운전하는 것에 비유할 수 있을 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안개가 짙으면 운전자는 도로의 일부만 볼 수 있으며, 나머지는 안개에 가려져 보이지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마찬가지로, AppsFlyer의 로우데이터 리포트에서는 일부 데이터가 제한되거나 가려져 있어 전체적인 상황을 완전히 파악하기 어려운데 이를 데이터 사각지대라고 표현합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;어떤 현상이 발생하는가?&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;모바일 앱 성과를 측정할 때는 플랫폼 및 매체사의 개인 정보 보호 및 그에 따른 데이터 공유 정책에 기반한 &lt;a href=&quot;https://groove.grvlnk2.com/url/5qrm6p4fekcud86j7qcif/aHR0cHM6Ly9zdXBwb3J0LmFwcHNmbHllci5jb20vaGMvZW4tdXMvYXJ0aWNsZXMvMzYwMDA2ODY4MDE3LVJhdy1kYXRhLWNvbnRlbnQtcmVzdHJpY3Rpb24tbWVkaWEtc291cmNlLW9yLXVzZXItaWRlbnRpZmllcnMjZ3Jvb3Zlc3VtOjIxMzc0NTQzNzY%3D&quot; data-token-index=&quot;1&quot;&gt;로데이터 리포트 제한&lt;/a&gt;으로 인해 데이터를 제공받지 못하는 현상이 발생합니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span data-token-index=&quot;2&quot;&gt;&lt;span style=&quot;background-color: #000000; color: #eb5757;&quot; data-token-index=&quot;0&quot;&gt;로데이터 리포트 제한&lt;/span&gt;이란?&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전환(설치 및 재참여) 및 제한 광고 네트워크가 기여한 관련 인앱 이벤트가 제한되어 앱스플라이어에서 데이터를 내려받으면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Media Source 필드는 restricted 로 채워지고 어트리뷰션 필드는 비어 있거나 &lt;span data-token-index=&quot;1&quot;&gt;null&lt;/span&gt;로 채워집니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-01-26 12.19.28.png&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1vEO5/btsDZlToQ4j/k4dj5AKl9PCDqmbrINYKZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1vEO5/btsDZlToQ4j/k4dj5AKl9PCDqmbrINYKZK/img.png&quot; data-alt=&quot;앱스플라이어 로우데이터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1vEO5/btsDZlToQ4j/k4dj5AKl9PCDqmbrINYKZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1vEO5%2FbtsDZlToQ4j%2Fk4dj5AKl9PCDqmbrINYKZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;701&quot; height=&quot;116&quot; data-filename=&quot;스크린샷 2024-01-26 12.19.28.png&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;116&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;앱스플라이어 로우데이터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 데이터 보존 및 삭제 정책에 따라 유저 레벨의 데이터는 AppsFlyer에 의해 제한된 기간 동안 보존되고 보존 기간이 끝나면 사용자 이벤트는 원래 미디어 소스 대신 유기적(organic) 소스로 변경됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이외에도 여러 제약 조건이 있어서 공식문서를 살펴보시길 권장드립니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;리타겟팅 어트리뷰션과 UA 어트리뷰션 데이터를 통합할 때&amp;nbsp;&lt;a href=&quot;https://groove.grvlnk2.com/url/5qrm6p4fekcud86j7qcif/aHR0cHM6Ly9zdXBwb3J0LmFwcHNmbHllci5jb20vaGMvZW4tdXMvYXJ0aWNsZXMvMzYwMDE2MzcxMDc3LURvdWJsZS1hdHRyaWJ1dGlvbi1vZi1yZXRhcmdldGluZy1ldmVudHMjZ3Jvb3Zlc3VtOjE1NjgwOTY3NTI%3D&quot; data-token-index=&quot;1&quot;&gt;인앱 이벤트 성과 중복&lt;/a&gt;이 생길 수 있는 점&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;캠페인의 re-engagement window 동안 퍼포먼스를 평가하기 위해서 인앱이벤트와 세션은 UA(user acquisition) 과 retargeting의 media source에 중복 집계됩니다&lt;/li&gt;
&lt;li&gt;이를 고려해서 리포트를 csv로 내려받은 후 마케터는 데이터를 가공해줘야합니다. (데이터를 내려받는데 시간이 약간 소요됩니다.. 리포트를 가공하는데 앱 마케터들은 매일 반복된 작업으로 오전시간을 소비합니다. 이를 자동화하고 마케터가 분석에 좀 더 몰입할 수 있게 마티니는 마케팅 데이터 파이프라인 구축에 도움을 드리고 있습니다)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-01-26 15.54.13.png&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byj49y/btsD1bI5Imw/OyG4jIBT3UoPikq0I2yhKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byj49y/btsD1bI5Imw/OyG4jIBT3UoPikq0I2yhKk/img.png&quot; data-alt=&quot;앱스플라이어 로우 데이터 Export&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byj49y/btsD1bI5Imw/OyG4jIBT3UoPikq0I2yhKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbyj49y%2FbtsD1bI5Imw%2FOyG4jIBT3UoPikq0I2yhKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1500&quot; height=&quot;410&quot; data-filename=&quot;스크린샷 2024-01-26 15.54.13.png&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;410&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;앱스플라이어 로우 데이터 Export&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인앱 이벤트 성과 중복이 된다는 개념을 살펴보자면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 이미지 처럼 리타겟팅 캠페인으로 유입된 유저의 데이터는 UA, RT(retargeting) 리포트에 중복으로 기록됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-01-26 15.52.40.png&quot; data-origin-width=&quot;1599&quot; data-origin-height=&quot;877&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uoqip/btsD3kSLyx9/TlXJe1402yPBnmdrBn1ad1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uoqip/btsD3kSLyx9/TlXJe1402yPBnmdrBn1ad1/img.png&quot; data-alt=&quot;앱스플라이어 : 리타겟팅 이벤트의 중복 어트리뷰션&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uoqip/btsD3kSLyx9/TlXJe1402yPBnmdrBn1ad1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fuoqip%2FbtsD3kSLyx9%2FTlXJe1402yPBnmdrBn1ad1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1599&quot; height=&quot;877&quot; data-filename=&quot;스크린샷 2024-01-26 15.52.40.png&quot; data-origin-width=&quot;1599&quot; data-origin-height=&quot;877&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;앱스플라이어 : 리타겟팅 이벤트의 중복 어트리뷰션&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터를 다운 받으시면 아래 이미지와 같은 컬럼을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-01-26 15.58.46.png&quot; data-origin-width=&quot;1561&quot; data-origin-height=&quot;489&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NE9zB/btsD2H1WWQg/6pVoik6zMnEjDkD6zrOHs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NE9zB/btsD2H1WWQg/6pVoik6zMnEjDkD6zrOHs0/img.png&quot; data-alt=&quot;앱스플라이어 리포트 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NE9zB/btsD2H1WWQg/6pVoik6zMnEjDkD6zrOHs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNE9zB%2FbtsD2H1WWQg%2F6pVoik6zMnEjDkD6zrOHs0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1561&quot; height=&quot;489&quot; data-filename=&quot;스크린샷 2024-01-26 15.58.46.png&quot; data-origin-width=&quot;1561&quot; data-origin-height=&quot;489&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;앱스플라이어 리포트 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 현상을 보완할 수 있는 앱스플라이어의 기능으로는&amp;nbsp;무료로 사용가능한 &lt;b&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://support.appsflyer.com/hc/ko/articles/4408945472529-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%9D%BD%EC%BB%A4%EB%A5%BC-%ED%86%B5%ED%95%9C-%EC%BD%94%ED%98%B8%ED%8A%B8-%EB%B6%84%EC%84%9D&quot; data-token-index=&quot;1&quot;&gt;&lt;span&gt;데이터 락커의 코호트 애널리틱스&lt;/span&gt;&lt;/a&gt;&lt;/b&gt; 입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-01-26 16.01.03.png&quot; data-origin-width=&quot;2352&quot; data-origin-height=&quot;364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/noD61/btsD1o2DaUa/P8XFsrNcgjkJtefA3yM4Zk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/noD61/btsD1o2DaUa/P8XFsrNcgjkJtefA3yM4Zk/img.png&quot; data-alt=&quot;데이터 락커 : 코호트 분석 리포트 샘플&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/noD61/btsD1o2DaUa/P8XFsrNcgjkJtefA3yM4Zk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnoD61%2FbtsD1o2DaUa%2FP8XFsrNcgjkJtefA3yM4Zk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2352&quot; height=&quot;364&quot; data-filename=&quot;스크린샷 2024-01-26 16.01.03.png&quot; data-origin-width=&quot;2352&quot; data-origin-height=&quot;364&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;데이터 락커 : 코호트 분석 리포트 샘플&lt;/figcaption&gt;
&lt;/figure&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;이 데이터를 활용하려면 약간의 개발 지식이 필요합니다.&lt;/li&gt;
&lt;li&gt;UA, 인스톨, 리타게팅, 리어트리뷰션, 리인게이지먼트와 관련 인앱이벤트 데이터가 포함됩니다&lt;/li&gt;
&lt;li&gt;앱스플라이어 어드민에서 데이터락커 기능을 활성화하여 Cloud Stroage(Google Cloud Storage or AWS S3)에 데이터 보내는 설정을 하고 이를 DW(Data Warehouse)에 저장을 하여 분석에 사용하셔야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-01-26 15.57.27.png&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WOsdt/btsD1n3IIKK/RpnjsdpmP4Vw5N4TVVYfx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WOsdt/btsD1n3IIKK/RpnjsdpmP4Vw5N4TVVYfx1/img.png&quot; data-alt=&quot;Cloud Stroage&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WOsdt/btsD1n3IIKK/RpnjsdpmP4Vw5N4TVVYfx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWOsdt%2FbtsD1n3IIKK%2FRpnjsdpmP4Vw5N4TVVYfx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;444&quot; height=&quot;178&quot; data-filename=&quot;스크린샷 2024-01-26 15.57.27.png&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;178&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Cloud Stroage&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 데이터는 최근 1년 동안 기여된 사용자 데이터를 담고 있고 위에서 설명드린 로데이터 리포트 제한이슈로 발생하는 데이터 사각지대를 보완하여 로데이터의 대안으로 사용할 수 있습니다.&lt;/li&gt;
&lt;li&gt;저장을 한 뒤에 성과를 올바르게 집계하기 위해 전처리를 하여 BI 툴을 활용하여 자동화된 대시보드를 구축할 수 있습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Unify 의 경우 is_primary_attribution 필드를 TRUE 혹은 NULL 로 사용&lt;/li&gt;
&lt;li&gt;UA 의 경우 conversion_type = install 로 사용&lt;/li&gt;
&lt;li&gt;RT(retargeting)의 경우 conversion_type = re-engagement 또는 re-attribution으로 사용&lt;/li&gt;
&lt;/ul&gt;
&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;iOS의 경우(마케터를 힘들게 하는 주범), 앱스플라이어 어트리뷰션과 SKAN 어트리뷰션 데이터를 통합할 때 중복이 생길 수 있는 점&lt;/li&gt;
&lt;li&gt;SSOT가 적용이 안되는 점
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SSOT는 앱스플라이어 Overview 대시보드에서만 확인 가능합니다..ㅜㅜ&lt;/li&gt;
&lt;li&gt;하지만 앱스플라이어가 유저의 니즈를 모를리 없죠. 앱스플라이어에서 이 기능을 고려한 리포트를 준비중이라고 들었네요&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;Single Source of Truth&lt;/b&gt;&lt;br /&gt;앱스플라이어가 측정한 어트리뷰션 데이터와 SKAN을 통해 측정한 어트리뷰션 데이터를 통합할 때 중복을 제거할 수 있는 솔루션이 SSOT 입니다.&amp;nbsp;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글은 앱스플라이어를 사용하면서 데이터 사각지대에 빠지지 않기 위한 방법으로 데이터 락커 코호트 분석 기능을 소개해드렸습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음번에도 앱스플라이어를 제대로 사용할 수 있게 도움을 드릴 수 있는 글을 작성해보려 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;마티니 서명 화이트.gif&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zZw9Q/btsD3qrTAdC/u3MaapqsMqiEotNSMcXwB1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zZw9Q/btsD3qrTAdC/u3MaapqsMqiEotNSMcXwB1/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zZw9Q/btsD3qrTAdC/u3MaapqsMqiEotNSMcXwB1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/zZw9Q/btsD3qrTAdC/u3MaapqsMqiEotNSMcXwB1/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;287&quot; height=&quot;51&quot; data-filename=&quot;마티니 서명 화이트.gif&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;182&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;풀스택 마케팅 컨설팅펌 마티니아이오&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://martinee.io/&quot;&gt;https://martinee.io/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1706253821661&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Martinee&quot; data-og-description=&quot;마티니의 글로벌 앱마케팅에 대한 경험은 카카오웹툰의 해외리젼에 많은 도움을 주고 있습니다. 또한, 소재에 대한 이해를 바탕으로 한 기획/제작과 글로벌 대응에도 내재화된 조직들이 있어, &quot; data-og-host=&quot;martinee.io&quot; data-og-source-url=&quot;https://martinee.io/&quot; data-og-url=&quot;https://martinee.io/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://martinee.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://martinee.io/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Martinee&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;마티니의 글로벌 앱마케팅에 대한 경험은 카카오웹툰의 해외리젼에 많은 도움을 주고 있습니다. 또한, 소재에 대한 이해를 바탕으로 한 기획/제작과 글로벌 대응에도 내재화된 조직들이 있어,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;martinee.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마티니 링크드인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.linkedin.com/company/martinee&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.linkedin.com/company/martinee&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1706253663221&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Martinee (마티니아이오) | LinkedIn&quot; data-og-description=&quot;Martinee (마티니아이오) | LinkedIn 팔로워 437명 | 마티니(Martinee)는 &amp;lsquo;Marketing Intelligence People&amp;rsquo;의 약자로 웹/앱 서비스 성장에 필요한 Growth, CRM, Performance Marketing을 풀 스택으로 지원합니다. | 앱스플라&quot; data-og-host=&quot;kr.linkedin.com&quot; data-og-source-url=&quot;https://www.linkedin.com/company/martinee&quot; data-og-url=&quot;https://kr.linkedin.com/company/martinee&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/nx0pR/hyVcarNASZ/uIU07mJFuhKzWj9orStgrK/img.jpg?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200,https://scrap.kakaocdn.net/dn/SePqE/hyU8URF8w8/qJ7iJYobDdUqpzDfrkPGv1/img.jpg?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200&quot;&gt;&lt;a href=&quot;https://www.linkedin.com/company/martinee&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.linkedin.com/company/martinee&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/nx0pR/hyVcarNASZ/uIU07mJFuhKzWj9orStgrK/img.jpg?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200,https://scrap.kakaocdn.net/dn/SePqE/hyU8URF8w8/qJ7iJYobDdUqpzDfrkPGv1/img.jpg?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Martinee (마티니아이오) | LinkedIn&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Martinee (마티니아이오) | LinkedIn 팔로워 437명 | 마티니(Martinee)는 &amp;lsquo;Marketing Intelligence People&amp;rsquo;의 약자로 웹/앱 서비스 성장에 필요한 Growth, CRM, Performance Marketing을 풀 스택으로 지원합니다. | 앱스플라&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kr.linkedin.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>모바일 마케팅</category>
      <category>Appsflyer</category>
      <category>MMP</category>
      <category>모바일앱</category>
      <category>모바일앱성과측정</category>
      <category>앱마케팅</category>
      <category>앱스플라이어</category>
      <author>알랭드보통 사람</author>
      <guid isPermaLink="true">https://botongsaram.tistory.com/6</guid>
      <comments>https://botongsaram.tistory.com/entry/%EC%95%B1%EC%8A%A4%ED%94%8C%EB%9D%BC%EC%9D%B4%EC%96%B4AppsFlyer-MMP-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B3%A0-%EC%9E%88%EB%8A%94%EA%B1%B8%EA%B9%8C-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%82%AC%EA%B0%81%EC%A7%80%EB%8C%80-%EB%8C%80%EC%9D%91-%EC%86%94%EB%A3%A8%EC%85%98-ft-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%9D%BD%EC%BB%A4#entry6comment</comments>
      <pubDate>Fri, 26 Jan 2024 16:16:57 +0900</pubDate>
    </item>
  </channel>
</rss>