inflearn logo
강의

Khóa học

Chia sẻ kiến thức

BigQuery(SQL) ứng dụng nâng cao (phân tích phễu, phân tích retention)

3-13 리텐션 과제 제출합니다!

Đã giải quyết

57

kj0106k88

1 câu hỏi đã được viết

0

안녕하세요! 데이터 분석가를 희망하는 학생입니다. 유튜브부터 시작해서 BigQuery 입문, 활용편 정말 많은 도움이 되고 있습니다.


https://app.notion.com/p/3-13-3f36fc83bdc1804cb3b7cb1f47c909cb?source=copy_link


과제 완료하여 노션 링크 첨부합니다! 2, 3번의 경우 일부 AI의 도움을 받았습니다.

피드백 해주시면 정말 감사하겠습니다~




sql Google-Analytics firebase google-sheets bigquery

Câu trả lời 2

0

kyleschool

용찬님 안녕하세요! 문제 푸시느라 고생하셨습니다!
1번은 강의에서 다루었으니 2, 3번 위주로 이야기를 해볼게요


2번

- 기준을 세우고 그 기준을 월별 스냅샷까지 확장한 것 잘 진행하셨어요. 다만 몇 부분에 이슈가 있어서 이거 점검하셔야 할 것 같아요


1. SELECT * GROUP BY ALL

diff_of_event AS (
-- 전체 유저의 평균, 최소, 최장 접속 주기 파악 (2회 이상 접속한 유저 기준)   
  SELECT
    *,
    ROUND(AVG(DATE_DIFF(event_date, prev_event_date, DAY)), 3) AS avg_diff_of_event_date,
    ROUND(MIN(DATE_DIFF(event_date, prev_event_date, DAY)), 3) AS min_diff_of_event_date,
    ROUND(MAX(DATE_DIFF(event_date, prev_event_date, DAY)), 3) AS max_diff_of_event_date,
    DATE_DIFF(event_date, prev_event_date, DAY) AS diff_of_event_date -- 접속 주기
  FROM (
    SELECT
      user_pseudo_id,
      MIN(event_date) OVER(PARTITION BY user_pseudo_id ORDER BY event_date) AS first_date, -- 유저별 첫 방문일
      event_date,
      LAG(event_date) OVER(PARTITION BY user_pseudo_id ORDER BY event_date) AS prev_event_date -- 유저별 event_date 직전 방문일
    FROM base 
  )
  GROUP BY ALL 
  • 이 쿼리에서 안쪽에 있는 쿼리는 user_pseudo_id, first_date, event_date, prev_event_date가 나오는데 그 후에 SELECT *을 하시면서 GROUP BY ALL을 합니다

  • 그 결과로 user_pseudo_id, first_date, event_date, prev_event_date +

    • avg_diff_of_event_date, min_diff_of_event_date, max_diff_of_event_date, diff_of_event_date가 됩니다

    • 이러면 유저별, 일자별로 집계라서 데이터가 이상해질 것 같아요.

    • 전체 유저별로 하고 싶었다면 SELECT *이 없었어야 할 것 같고, 유저별로 원했다면 user_pseudo_id만 남기면 됩니다.

저라면 아래처럼 만들고

-- 분류용 CTE: 집계 없이 행 단위 유지
diff_of_event AS (
  SELECT
    *,
    DATE_DIFF(event_date, prev_event_date, DAY) AS diff_of_event_date -- 접속 주기
  FROM (
    SELECT
      user_pseudo_id,
      MIN(event_date) OVER(PARTITION BY user_pseudo_id) AS first_date, -- 유저별 첫 방문일
      event_date,
      LAG(event_date) OVER(PARTITION BY user_pseudo_id ORDER BY event_date) AS prev_event_date -- 유저별 직전 방문일
    FROM base
  )
)

별도로 데이터를 구해볼 것 같아요

-- 탐색용 쿼리: 전체 유저 기준 접속 주기
SELECT
  ROUND(AVG(diff_of_event_date), 3) AS avg_diff_of_event_date,
  MIN(diff_of_event_date) AS min_diff_of_event_date,
  MAX(diff_of_event_date) AS max_diff_of_event_date
FROM diff_of_event
WHERE
  diff_of_event_date IS NOT NULL

월별 집계에서 1월 기준일

LAST_DAY(month_start) AS month_end를 하셨는데, 데이터가 1/20까지 있을거라 실제 데이터가 24일치만 있어서 과소 집계될 거예요. Dormant도 11일 앞당겨 판정되어서 과대집계가 될 거예요.

1월에 집계가 덜 끝났다고 하셨는데 쿼리에도 반영해야 합니다

35일 기준

  • 감으로 정하지 않고 실제 접속 주기를 확인해서 기준을 잡은 접근 아주 좋아요. 다만 평균은 기준값으로 쓰기 애매한 면이 있습니다.

  • 평균은 극단값에 쉽게 끌려가요. 예를 들어 방문 간격이 1, 1, 2, 3, 170일이면 평균은 약 35일이지만, 실제로는 5번 중 4번이 3일 안에 재방문했어요. “35일”이 대부분 유저의 행동을 대표하지 못할 수 있어요.

  • 그래서 평균 하나보다 분포를 같이 보는 게 좋아요. 예를 들어 p90이 28일이면 "재방문의 90%가 28일 안에 일어난다", 즉 28일이 지나도 안 오면 다시 올 가능성이 낮다고 설명할 수 있어요

  • 현실에서는 숫자 하나를 정답처럼 찾기보다, 이런 식으로 정하는 경우가 많아요.


    • 서비스 사용 주기 기준: 매일 쓰는 서비스면 7일, 주 단위면 14 ~ 28일, 월 단위면 30일 이상처럼 서비스 성격에 맞춰 정해요.

    • 요일 효과를 피하려고 7의 배수(28일 등)를 씁니다(계산도 쉬워지고)

  • 여러 기준으로 비교: 8, 14, 28일로 각각 돌려보고 결론이 크게 달라지지 않으면 어떤 기준이든 괜찮다고 판단해요. 만약 달라지면 그 자체도 인사이트로 볼 수 있어요

  • 결국 중요한 건 "정확한 숫자"보다 "왜 이 숫자인지 설명할 수 있는가"에요


분석 내용 피드백

  • 우선 각 인사이트마다 "그래서 뭘 확인해야 하지?"를 같이 적어주신 점 좋았어요. 숫자만 읽고 끝나는 경우가 많은데, 다음 액션까지 고민하신 게 보입니다.

    • 여기서 힌트를 드리자면 "8, 9, 10월에 New 유저 유입이 증가한다, 11~1월엔 유입이 지속적으로 감소한다 => 그러면 이유 파악 필요라고 하는게 아니라 "어? 왜 그럴까?"라는 생각을 하고 가설을 던져야 합니다. 이게 제일 중요한 활동이에요. 이유 파악 필요라고 하면 사실 이후에 할 말이 없거든요(그걸 찾기 위해 데이터를 보는거니깐요)

    • 지금 용찬님이 하신 것은 Depth가 1단계입니다. 데이터를 보는 사람이라면 이 부분을 집요하게 파내야 합니다. Current 유저가 상승하지만 하락한다? 그러면 왜 그럴까?? 생각해보셔요. 이건 습관의 영역이에요

  • 지금 결론에 쓰신 것은 데이터의 현황을 파악한거라 결론이라고 하긴 애매합니다. 여기서 가설 만들어서 그 가설이 진짜인지 확인하며 결론을 내는 것을 추천드려요



3번

  • 가설에서 "결제 이력이 있는 유저 집단은 결제 이력이 없는 유저 집단보다 Weekly Retention이 높을 것이다."을 해주셨는데, 이런 가설은 편향이 있는 가설이라, 저라면 이런 가설을 쓰지 않을 것 같아요. 상관 관계는 있을 수 있는데 인과 관계는 아닐 수 있을 것 같아요

  • "결제 이력"을 전체 기간으로 보면, 오래 남아있던 유저일수록 결제할 기회가 많아요.

    즉 "결제해서 리텐션이 높다"가 아니라 "리텐션이 높아서 결제했다"가 섞입니다.

    • 극단적으로, 1주 차에 이탈한 유저는 2주 차 이후에 결제할 기회 자체가 없어요. 결제 그룹에는 구조적으로 오래 남은 유저만 들어가게 됩니다. (이걸 immortal time bias라고 부르기도 해요)

  • 원래 의도가 다른 유저

    • 주문할 생각으로 들어온 유저와 구경만 하러 온 유저는 처음부터 성향이 달라요.

    • 결제가 리텐션을 만든 게 아니라, 원래 의지가 강한 유저가 결제도 하고 재방문도 하는 것일 수 있습니다.

  • 제가 바꿔본다면 이렇게 할 것 같아요

    • 결제 이력이 있는 유저가 리텐션이 높다(X)

    • 첫 주 안에 결제한 유저가 2주 차 이후 리텐션이 높다(O)

      • 이런 가설을 만들면 확실한지 데이터를 보고 해석할 수 있겠지요. 그리고 이 가설이 의미가 있으려면 얼마나 차이가 나는지 핵심입니다. 차이가 2배인지 10배인지 등을 파악해야 합니다

결론쪽

  • 리텐션이 주차가 지날수록 하락하는 건 거의 모든 서비스에서 나타나는 모양이라, 그 자체로는 문제라고 보기 어려워요.

  • 중요한 건 어디서 평평해지는지, 그리고 그 수준이 몇 %인지예요. 예를 들어 4주 차부터 15%에서 유지된다면 “15%는 남는 서비스”라고 말할 수 있어요. 강의에서 리텐션에서 중요한 부분이 여기라고 말씀드렸으니 닷 ㅣ생각해보셔요

  • "결제까지 이어질 수 있는 액션 플랜", "계속 사용해야 할 이유"는 다른 서비스에도 해당되는 이야기라 분석 결과에서 나온 결론으로 보이진 않아요.

    • 예를 들어 "결제 유저 중 3주 이상 남은 유저는 특정 기능(예 : 검색)을 많이 썼다"처럼 데이터에서 찾은 근거가 있어야 구체적인 액션으로 이어질 수 있어요


가설을 떠올리는 과정을 고민해보시고 다시 떠올려보셔요! AI를 쓰더라도 가설을 떠올리는 것은 사람이 해야하더라고요. 파이팅이에요!

0

kj0106k88

상세한 피드백 정말 감사합니다!! 말씀해주신 부분 보완해서 최종 과제에 반영해보겠습니다. 도움 많이 됐습니다!

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다. 고용찬님!

리텐션 과제 제출을 완료하셨군요. 리텐션 분석에서는 단순히 SQL 쿼리를 작성하는 것뿐 아니라, New·Current·Resurrected·Dormant 유저의 기준을 일관되게 정의하고, 결과를 해석한 뒤 가설과 Action Item까지 도출하는 과정이 중요합니다. 아래 유사 과제와 지식공유자님의 피드백을 참고해 보시면 좋습니다.

  • 리텐션 분석 과제
    Weekly Retention 쿼리에서 중복을 제거하는 방법, first_date와 last_date 네이밍, 유저 그룹 분류 기준, 데이터 QA 및 Action Item 도출 방법을 자세히 설명하고 있습니다.

  • 리텐션 과제 작성
    리텐션 쿼리 작성 시 불필요한 UNNEST를 제거하는 방법과 New·Current·Resurrected·Dormant 유저를 주차별로 분석하는 방법을 확인할 수 있습니다. 또한 쿼리 결과를 바탕으로 가설을 세우고 검증하는 분석 흐름도 안내되어 있습니다.

  • 리텐션 연습문제
    유저 유형별 결과를 시각화하고, 각 세그먼트의 규모와 리텐션 차이를 해석하는 방법에 대한 피드백이 담겨 있습니다. 쿼리 작성 이후 결과 해석까지 연습하는 데 도움이 됩니다.

  • 3-13 리텐션 과제 제출
    New·Current·Resurrected·Dormant 유저의 기준을 어떻게 정할지, 주차별로 유저 상태가 변화하는 과정을 어떻게 분석할지 설명하고 있습니다. AI의 도움을 받은 쿼리도 각 조건의 근거와 데이터 결과를 직접 검증해 보시면 좋습니다.

특히 2번과 3번 문제는 정답인 기준을 그대로 적용하기보다, 왜 해당 기간을 New 또는 Resurrected로 정의했는지 데이터를 근거로 설명할 수 있는지가 중요합니다. 또한 특정 이벤트를 수행한 유저의 리텐션이 더 높은지 비교하는 등, 과제 결과에서 새로운 가설을 만들고 이를 추가 데이터로 검증해 보시면 분석 완성도가 높아집니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

[과제]1-9 피벗 테이블 만들어보기

0

64

2

cnt수를 구할 때 왜 user_pseudo_id 를 사용하나요?

0

60

2

최종 과제 제출합니다.

0

94

2

3-13 과제

0

89

3

3-13 리텐션 과제 제출합니다

0

90

2

app logs 데이터로 쿼리 연습

0

93

2

[과제] 연습문제 쿼리 작성했습니다!

0

80

2

6-1. 강의 최종 과제 제출합니다.

0

100

3

3-13 리텐션 과제 제출합니다

0

163

3

3-13. 리텐션 연습과제 제출합니다.

0

134

4

최종 과제 제출

0

107

3

Weekly Retention 과제 작성하였습니다.

0

84

2

3-10 강의 14분경 코호트 해석 질문드립니다.

0

90

2

Weekly 및 Monthly Retention 과제 제출합니다.

0

85

2

[과제] 퍼널 쿼리 PIVOT 테이블 작성

0

103

2

최종 과제 제출

0

171

3

BigQuery 활용편 18강 질문있습니다!

0

124

1

리텐션 공부하다가 궁금한게 생겨 질문드립니다

0

138

2

안녕하세요 강사님 코호트 쿼리 공부하다가 의문점이 생겨서 문의드립니다

0

131

2

biquery 테이블 생성 오류 이슈

0

128

2

동일하게 쿼리를 작성했는데 화면과 다른 값이 나옵니다

0

132

2

[과제] 퍼널 PIVOT 테이블 작성하기

0

137

2

array 등

0

118

2

N day 리텐션 쿼리 관련 질문

0

126

2