게시글
질문&답변
데이터 로그 설계 과제 작성
현리님 안녕하세요! 로그 설계랑 지표 정의까지 다 잘 정리하셨네요!! 고생하셨습니다 피그마 기획서를 보고 피그마 기준 page를 사용하셔도 괜찮습니다. 회사의 상황에 따라 적절하게 수정하면 됩니다. 다만 스프레드시트를 보니까 page에 여러 이벤트가 있는 경우가 있는데(예를 들어 search_result) 이럴 때 셀병합을 해주시면 시각적으로 더 인지하기 좋습니다(search_result 페이지에 view_search_result, click_food, click_filter 이벤트가 있구나! 라고 이해가 됩니다. 지금은 옆은 빈칸이라 추론을 해서 search_result인가보다 하게 되지요)[1] 기능이 잘 동작하는지 확인하기에서 추천된 음식, 동네 맛집쪽은 view 이벤트 또는 노출(Impression) 이벤트를 사용할 수 있습니다. 위에서 정의할 때 click_recommend_food/view_home로 잘 하셨는데, 밑에서 추천된 음식을 구분하는 방법을 잘 모르겠습니다 ㅠㅠ라고 말씀하신 것은 어떤 의미일까요? click_recommend_food에 food_id가 있을테니 활용할 수 있지요 나머지 부분은 잘 하셨습니다! 지표 정의 문제에서처럼 왜 이 지표인가?를 같이 기록해보시면 좋을 것 같아요!(지표 정의 + 로그 설계까지 앞으로는 같이!)
- 0
- 2
- 31
질문&답변
3장 강의자료 다운로드 시, 2강이 다운로드 됩니다.
안녕하세요!앗 제가 방금 다운로드할 때는 파일이 맞게 다운로드가 되고 있는데, 어떻게 다운로드가 되고 있나요?18. 3-1. Intro와 카일스토리에서 다운로드를 하셨는데 데이터 리터러시 파일이 다운로드가 되고 있는 상황일까요?브라우저를 변경해도 동일하게 발생하나요? 새벽에 인프런에서 점검 작업을 한거로 알고 있는데, 그 여파로 오류가 발생하는 것일수도 있겠어요
- 0
- 2
- 21
질문&답변
데이터 로그 설계 과제 작성
현리님 안녕하세요! 제가 지금 몸이 안좋아서 늦어지고 있어요. 2-3일 내로 피드백 드릴게요..!답변이 늦어져서 죄송합니다 🙏
- 0
- 2
- 31
질문&답변
챌린지 검색이 안되서요.
안녕하세요. 어떤 리스트에서 보이지 않는다는걸까요?챌린지는 일반 강의와 다르게 시작일 기점으로 세부 내용을 확인할 수 있다고 해요!현재 확인해보니 Public하게 공유된 "챌린지 참여 방법 정리(꼭 읽어주세요!)"은 보신 것으로 나오네요(이 내용은 Public 공유라서 미리 볼 수 있어요) (사진)내 학습 - 챌린지쪽을 보면 저는 이렇게 나오네요(챌린지를 클릭하신 것이 맞을까요? 온라인이 활성화되어 있으면 챌린지는 보이지 않아요)
- 0
- 1
- 42
질문&답변
코칭 관련
홍주님 안녕하세요! 네 여전히 가능합니다!급하게 마감되진 않을 것 같아서 강의 듣고 신청해주셔요!!
- 0
- 2
- 34
질문&답변
array 등
안녕하세요!배열 함수를 자주 접하신 적이 없으면 생소할 수 있습니다. 우선 BigQuery의 Array 데이터는 Google Analytics4나 Firebase를 사용하는 회사에서는 자주 볼 수 있습니다. GA4나 Firebase를 배열로 데이터를 저장하기 때문에 이걸 사용하지 않으면 데이터를 풀 수 없습니다. 그럼 BigQuery만의 특수한 문법이 아닌가?라고 생각할 수 있는데, 전통적인 OLTP에서는 배열 데이터가 없기도 합니다. 예를 들어 MySQL에서는 배열 함수가 없고, JSON 형태를 활용해서 만들어야 합니다. 예시는 링크에서 확인할 수 있습니다. 그 외에 PostgreSQL에는 배열이 있습니다. BigQuery에서 사용하는 ARRAY 관련 함수를 볼 수 있습니다.공식 문서 : https://www.postgresql.org/docs/current/arrays.html 데이터 웨어하우스(DW) 계열에서는 배열 데이터가 많이 활용됩니다. 여러 데이터를 저장해야 할 때, 배열 형태로 데이터를 저장하곤 합니다(파이썬의 List처럼) 그리고 그걸 활용할 때 배열을 사용하게 됩니다. Snowflake 문서 : https://docs.snowflake.com/ko/sql-reference/functions/array_aggSpark 문서 : https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.array.html 데이터 저장하는 형태가 복잡해지면 배열은 한번 쯤은 경험하게 되는 것 같아요. 사용자 앱 로그 데이터를 저장할 때는 배열 형태로 저장하는 것이 수월한 경우도 꽤 있었어요. 파이썬에서도 Dict, List가 존재하는데 데이터를 어떻게 저장해야 하느냐에 따라 적절하게 활용하곤 합니다. 데이터베이스, 데이터 웨어하우스에도 목적에 따라 적절하게 배열이나 파이썬의 딕셔너리처럼 저장하고 싶을 때 강의의 ARRAY, STRUCT를 사용한다고 생각하시면 될 것 같아요.
- 0
- 2
- 24
질문&답변
슈퍼셋 사용이 처음이라 질문드립니다.
안녕하세요!Superset 자체에도 간단하게 집계하는 기능이 있어서 테이블의 수가 적다면 바로 시각화가 가능하긴 할 거예요. 그러나 여러 테이블을 JOIN해야 하고, 테이블의 부하를 줄이기 위해서는 직접 SQL을 배우셔서 하시는 것이 장기적으론 좋습니다. 어떤 DB를 연결하시나요? 쿼리의 결과를 테이블로 저장하고 그걸 Superset에 연결하면 비용 효율적으로 사용할 수 있어요.제 강의들을 들으시면 SQL로 할 수 있는 대부분을 할 수 있게 되고, 그 쿼리를 토대로 Superset에서 시각화를 하시면 되어요. 시각화 도구는 매번 바뀔 수 있고(Superset, Tableau 등) 대부분 SQL 기능이 있어서 SQL로 하시면 시각화 도구와 상관없이 확장성을 가질 수 있을 거예요
- 0
- 1
- 35
질문&답변
N day 리텐션 쿼리 관련 질문
안녕하세요1번. DISTINCT를 사용한 이유(시작하기 전에) 제가 강의에서 사용한 쿼리가 많아서 듣다가 궁금한 내용에 대해서 쿼리를 붙여주셔도 좋을 것 같아요! 또는 몇 초에 나오는 쿼리라고 말씀해주시면 제가 확인하기 수월합니다(저도 모든 쿼리를 다 기억하는 것이 아니라서 확인하고 이 부분인가? 저 부분인가? 생각하게 되더라구요)말씀하신 것처럼 timestamp 컬럼이 있어서 중복이 있을 확률은 적습니다. 그러나 클라이언트 개발에 따라 다른데 screen_view나 page_view 시리즈와 click이 동시에 발생할 수도 있습니다(약간의 딜레이는 있을 수 있지만 구현에 따라 다름)그리고 저번 질문과 유사한데 지금 단일 테이블에선 중복이 없을 확률이 매우 높지만, 다른 테이블과 JOIN을 할 때 데이터가 많이 늘어날 수 있습니다. 그렇기 때문에 저는 DISTINCT를 항상 사용하면서 중복을 제거하려는 습관이 있다고 생각하시면 됩니다또한 Google Analytics 4, Firebase는 저희가 로깅하지 않아도 발생하는 로그들이 존재합니다. 예를 들어 user_engagement 같은 이벤트가 있습니다. 이런 이벤트를 WHERE 조건에서 제외하는 것도 방법이고, 중복이 있더라도 제거하는 방법도 가능합니다기본적으로 제가 DISTINCT를 쓰는 것은 더 장기적 관점의 습관이라고 보시면 됩니다. DISTINCT를 안써서 JOIN할 때 이슈가 생기는 경험이 많아 중복을 제거하는 것그리고 회사에서 로깅의 이슈로 중복으로 로그가 생기는 경우도 있습니다(개발쪽의 이슈) 그럴 때 개발쪽에서 로그를 수정해달라고 할 수는 있지만, 이미 생긴 로그에 대해서는 삭제가 어려울 수 있습니다. 그런 경우에 데이터쪽에서 쿼리로 중복을 제거하곤 합니다실무에서 JOIN 이슈 + 잘못된 데이터가 있을 경우 => 이를 대비하기 위해 DISTINCT를 쓴다라고 생각해주셔요 2번강의에서 보여드린 diff_of_day, user_cnt는 리텐션 커브를 위한 집계 결과입니다. 330쪽의 쿼리는 "코호트 리텐션"의 형태입니다. 코호트 리텐션은 3-10 강의와 연결됩니다. 그러나 강의에서 보여드린 쿼리에서 first_date만 추가하면 됩니다. 리텐션 커브 -> 코호트 리텐션으로 데이터를 다른 관점으로 보고 있다고 생각하시면 될 것 같아요. 다른 것이 아니라 리텐션 커브를 뽑는 결과 데이터에서 조금만 바꾸면 코호트 리텐션까지 뽑을 수 있습니다(공유해주신 것처럼 first_date 추가) 3번WEEK은 WEEK 단독으로 쓰이진 않고, EXTRACT나 DATE_TRUNC에서 사용할 수 있습니다. 강의에선 EXTRACT와 같이 쓰는 WEEK 의미로 말씀드린거라고 생각해주시면 됩니다! 엄밀히 말하면 강의에서 WEEK 함수라고 했는데 EXTRACT와 함께 쓰이는 WEEK이라고 말씀을 드려야 더 정확했을 것 같네요. 단독 WEEK이 아닌!DATE_TRUNC(date, WEEK(MONDAY)) EXTRACT(WEEK FROM DATE '2025-10-09')
- 0
- 2
- 27
질문&답변
이동평균 계산 시 order by 기본값은 뭔가요?
안녕하세요. 윈도우 함수 내에 ORDER BY는 기본값이 있지 않고, 현재 ORDER BY를 작성하지 않은 경우엔 정렬하지 않은 형태의 데이터에서 프레임을 설정합니다. 지금 문제는데이터가 이미 정렬이 된 상태라서 윈도우 함수 안에 ORDER BY가 없어도 윈도우 함수의 ORDER BY와 같은 결과가 나오게 된 것입니다. 즉, 데이터가 정렬이 되어있기에 이렇게 나온 것입니다(우연히 정렬이 된 데이터였던 것) 확인을 위해 아래 쿼리를 실행해보시면 이해하실 수 있을 것 같아요. 기존 filled_data를 사전에 ORDER BY를 하고 지금 작성하신 쿼리를 비교해보면 결과가 다릅니다. WITH raw_data AS ( SELECT DATE '2024-05-01' AS date, 15 AS number_of_orders UNION ALL SELECT DATE '2024-05-02', 13 UNION ALL SELECT DATE '2024-05-03', NULL UNION ALL SELECT DATE '2024-05-04', 16 UNION ALL SELECT DATE '2024-05-05', NULL UNION ALL SELECT DATE '2024-05-06', 18 UNION ALL SELECT DATE '2024-05-07', 20 UNION ALL SELECT DATE '2024-05-08', NULL UNION ALL SELECT DATE '2024-05-09', 13 UNION ALL SELECT DATE '2024-05-10', 14 UNION ALL SELECT DATE '2024-05-11', NULL UNION ALL SELECT DATE '2024-05-12', NULL ), filled_data AS ( SELECT * EXCEPT(number_of_orders), LAST_VALUE(number_of_orders IGNORE NULLS) OVER(ORDER BY date) AS number_of_orders FROM raw_data ORDER BY date DESC # 여기에 ORDER BY를 추가해서 데이터 순서를 변경함 ) SELECT *, AVG(number_of_orders) OVER(ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_avg1, # 위에서 데이터를 정렬한 후 집계한 값 AVG(number_of_orders) OVER(ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_avg2 # 올바른 답 FROM filled_data 질문해주신 ORDER BY와는 살짝 다르지만, 윈도우 함수에서 프레임을 명시하지 않으면 기본 값은 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW가 됩니다. 관련 내용은 인프런 AI 인턴이 링크를 걸어준 글을 보시면 도움이 될 것 같아요
- 0
- 2
- 32
질문&답변
윈도우 연습문제 1번 질문
안녕하세요! *의 의미를 본질적으로 이해하시면 좋답니다.COUNT(*) : 모든 Row의 수를 COUNT한다는 의미입니다COUNT(query_date) : query_date에 있는 값의 수를 COUNT한다는 의미입니다.두개의 차이는 NULL을 포함하는지?입니다COUNT(*)은 Row의 수를 세기 때문에 NULL도 포함해서 COUNT를 하고, COUNT(query_date)는 query_date에서 NULL이 아닌 행만 셉니다.지금 데이터에서는 값에 NULL이 없기 때문에 동일하게 나오는거라 보면 됩니다. 데이터가 어떻게 저장되어 있는지를 잘 파악해야 *을 사용할지, 컬럼을 명시할지가 결정됩니다. 그리고 query_date를 사용한 이유는 query_date가 있는 경우를 세고 싶었기 때문이에요. 물론 지금 데이터는 *을 사용해도 괜찮구요. id 같은 값이 있었다면 id를 COUNT할텐데 id가 없는 데이터라 query_date를 COUNT했다고 생각해주시면 되어요 즉, 목적에 따라 다르다입니다. 실무에서 뭘 쓰냐는 결국에 목적에 따라 다릅니다. 내가 어떤 데이터를 보려고 하는지? 그래서 초보자를 위한 BigQuery 입문에서 쿼리를 작성할 때 어떤 것을 구하려고 하는지를 써보라고 템플릿을 드린 거예요. 이게 명시적으로 정리가 되어야 쿼리를 짤 때 판단을 할 수 있어요! 추가로 활용편의 데이터는 단일 테이블이고 NULL이 거의 없습니다. 그래서 강의를 들을 때는 두개 모두 다 상관없이 사용하셔도 됩니다.실무에서 이슈가 되는 경우는 여러 테이블을 JOIN하면서 특정 컬럼에 NULL이 생길 수 있어요. 이럴 때는 데이터의 Row가 늘어난 것처럼 보일 수 있거든요. 이런 경우 *을 쓰면 Row 수만 세서 좀 많아집니다. 그래서 저는 명시적으로 컬럼을 쓰곤 해요. 이번 초보자를 위한 BigQuery 입문의 연습 문제에서 JOIN하고 COUNT하는 문제에서 많이 나타나게 된답니다.
- 0
- 1
- 26




