로그 데이터 분석 | [마케팅 데이터 분석 기초 2] Topic 1. 웹로그 분석과 비즈니스 빠른 답변

당신은 주제를 찾고 있습니까 “로그 데이터 분석 – [마케팅 데이터 분석 기초 2] Topic 1. 웹로그 분석과 비즈니스“? 다음 카테고리의 웹사이트 you.maxfit.vn 에서 귀하의 모든 질문에 답변해 드립니다: https://you.maxfit.vn/blog. 바로 아래에서 답을 찾을 수 있습니다. 작성자 EPASSKOREA 이(가) 작성한 기사에는 조회수 8,070회 및 좋아요 136개 개의 좋아요가 있습니다.

로그 데이터 분석 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 [마케팅 데이터 분석 기초 2] Topic 1. 웹로그 분석과 비즈니스 – 로그 데이터 분석 주제에 대한 세부정보를 참조하세요

과정내용
– [이론] 웹로그 분석의 정의와 데이터 분석 트랜드의 변화
과정내용
Topic 1. 웹 로그 분석과 비즈니스
Topic 2. Google Analytics 시작하기
Topic 3. Google Analytics의 주요보고서와 대시보드
Topic 4. 측정기준(Dimensions)
Topic 5. 측정항목(Metrics)
Topic 6. ROI 분석을 위한 목표설정과 전환추적
Topic 7. 온라인 마케팅 효율 측정을 위한 채널 트래킹
이전편
– [마케팅 데이터 분석 기초 1] 오리엔테이션 : https://youtu.be/N-C8BPfdlUY
다음편
– [마케팅 데이터 분석 기초 3] Topic 2. Google Analytics 시작하기 : https://youtu.be/0HyNyXylaLk
Google Analytics 마스터코스 자세히보기
– PC : https://bit.ly/3wdF5Om
– 모바일 : https://bit.ly/3rLJvst

로그 데이터 분석 주제에 대한 자세한 내용은 여기를 참조하세요.

로그 데이터로 유저 이해하기 | 우아한형제들 기술블로그

이를 위해 로그 설계/수집/분석에 이르는 전반적 과정에 직/간접적으로 관여하고 있으며, 입사후 4개월간 경험한 내용과 생각을 공유하고자 합니다. 1.

+ 자세한 내용은 여기를 클릭하십시오

Source: techblog.woowahan.com

Date Published: 4/12/2021

View: 7790

로그 데이터를 이용한 고객 세분화 – PuzzleData

로그 데이터는 실제 현실에서 발생하는 사건을 데이터로 기록한 것으로, 로그 데이터를 분석하면 실제 현황에 대해서 자세히 확인할 수 있습니다.

+ 여기에 보기

Source: www.puzzledata.com

Date Published: 4/25/2022

View: 962

데이터 분석에서 앱 로그 데이터는 어떤 모습일까?

비전공자가 데이터 분석 분야로 뛰어든 스토리. … 그중에서도 사용자의 행동 이력과 정보가 담긴 앱 로그 데이터에 한하여 설명드려보겠습니다.

+ 여기에 자세히 보기

Source: heemosquito.tistory.com

Date Published: 5/15/2022

View: 3472

데이터 로그 설계, 데이터 로깅, 이벤트 로그 설계, 데이터 QA의 …

유저 로그라고 지칭하면 사용자 행동 데이터를 의미함 · 서비스에 반드시 필요한 내용은 아니고, 더 좋은 제품을 만들기 위해 또는 데이터 분석시 필요한 …

+ 더 읽기

Source: zzsza.github.io

Date Published: 3/13/2022

View: 3740

판다스 – 로그데이터 분석 : 고객 이탈률이 높은 페이지는?

데이터 불러오기. 이는 실제 로그 데이터가 아닌 임의로 작성된 데이터를 밝힘. 사용자가 어떤 과정을 거치는지는 url 컬럼을 확인한다.

+ 여기에 표시

Source: steadiness-193.tistory.com

Date Published: 5/17/2021

View: 1781

로그 분석이란? | 퓨어스토리지 – Pure Storage

로그 파일은IT 시스템 운영 중에 발생한 이벤트, 프로세스 및 기타 정보를 기록한 컴퓨터 생성 메시지입니다. 로그 분석은 문제 해결, 성능 예측, 유지관리 및 개선에 도움 …

+ 여기에 더 보기

Source: www.purestorage.com

Date Published: 3/30/2021

View: 8510

KR101170478B1 – 로그 데이터 분석 방법

본 발명은 로그 데이터 분석 방법에 관한 것으로서, 이는 컴퓨터, TV, 휴대폰 등과 같은 각종 전자 디바이스와의 로그 데이터를 통계적으로 분석하여 사용자의 사용 …

+ 자세한 내용은 여기를 클릭하십시오

Source: patents.google.com

Date Published: 10/20/2022

View: 7019

[PostgreSQL] 사용자 로그데이터(Log Data) 매출분석(1)

[PostgreSQL] 사용자 로그데이터(Log Data) 매출분석(1) – 사용자들의 특징 찾기(사용자 그룹화, 카테고리별 집계, 벤다이어그램(CASE)). YSY^ 2021.

+ 여기에 보기

Source: ysyblog.tistory.com

Date Published: 6/2/2022

View: 4650

모바일 앱 로그분석, 어떻게 시작해야 할까? – 브런치

Firebase와 BigQuery를 이용한 로그분석 시스템 구축하기 | 데이터 파이프라인을 잘 구축한다는 건 어떤 의미일까요? 기술적으로는 어떤 데이터베이스 …

+ 자세한 내용은 여기를 클릭하십시오

Source: brunch.co.kr

Date Published: 6/25/2022

View: 822

주제와 관련된 이미지 로그 데이터 분석

주제와 관련된 더 많은 사진을 참조하십시오 [마케팅 데이터 분석 기초 2] Topic 1. 웹로그 분석과 비즈니스. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

[마케팅 데이터 분석 기초 2] Topic 1. 웹로그 분석과 비즈니스
[마케팅 데이터 분석 기초 2] Topic 1. 웹로그 분석과 비즈니스

주제에 대한 기사 평가 로그 데이터 분석

  • Author: EPASSKOREA
  • Views: 조회수 8,070회
  • Likes: 좋아요 136개
  • Date Published: 2018. 7. 16.
  • Video Url link: https://www.youtube.com/watch?v=G5tedDl8uH8

로그 데이터로 유저 이해하기

0. 들어가며

우아한형제들 데이터서비스팀 송훈화입니다. 제 업무는 로그를 설계/정의하고 데이터를 분석하는 것입니다. 궁극적으로, 유저가 남긴 로그로부터 유저의 경험을 추정하고 니즈를 파악해 서비스 개선에 필요한 인사이트를 제공하는 것입니다. 이를 위해 로그 설계/수집/분석에 이르는 전반적 과정에 직/간접적으로 관여하고 있으며, 입사후 4개월간 경험한 내용과 생각을 공유하고자 합니다.

1. 분석의 시작은 서비스를 이해하는 것부터

입사 직후 진행한 업무는 클라이언트 로그를 설계하는 것이었습니다. 앱의 모든 화면과 이벤트(클릭, 배너 노출)를 상세히 파악하고, 시나리오와 서비스의 흐름을 이해하는 것부터 시작했습니다. 마치 실제 유저가 앱을 쓰듯이 모든 기능과 화면을 하나씩 파악하면서 로깅 항목을 정리했습니다.

다소 노가다 업무였지만, 이 작업을 하면서 앱에 대한 이해가 한 단계 더 깊어지는 경험을 하게 되었습니다. 또, 이 과정에서 (제가 느끼기에) 편리한 기능도 있었고 이상한(?) 기능도 있었는데, 향후 분석을 위한 방향과 프레임을 잡는 데 유용한 정보를 얻었습니다.

로그 설계/정의 업무가 마무리되고 엔지니어 및 개발자와 협업하면서 로그 수집을 진행하였습니다. 데이터는 JSON 형태로 저장소에 차곡히 쌓이기 시작했고, 엔지니어의 도움으로 언제든 저장소에 접근해 데이터를 추출/분석할 수 있는 환경이 마련되었습니다. 실제 수집된 로그는 아래와 같았습니다.(아래 이미지 참고) 유저가 우리 서비스에 접속해 특정 화면을 보거나 액션을 할때마다, 설계된 스키마 대로 데이터가 쌓였고 샘플을 추출하여 데이터 탐색 준비를 마무리 하였습니다.

로그 데이터 예시(일부 항목 숨김처리)

2. 품질 확보와 분석 프레임 설정

이번과 같이 로그 수집 프로세스가 처음 진행된 경우, 본격적인 데이터 분석을 진행하기 앞서 데이터 품질을 확보하는 것이 중요하다고 판단했습니다. 기존에 정의한 대로 각 필드 및 파라메터에 적절한 로그가 쌓이고 있는지, 누락되거나 이상한 데이터가 없는지 확인하고 만약 수정/보완이 필요한 경우 데이터 품질을 확보하는 작업을 진행하였습니다.

예를 들어, 아래 예시와 같이 수집이 잘못된 경우 유관자와 원인을 파악하고 문제 해결 과정을 통해 데이터 품질 확보에 많은 노력과 시간을 투입하였습니다.

데이터 수집 오류의 예시

또 다른 중요한 과정은 분석 프레임을 설정하는 것이었습니다. 일반적으로 로그 데이터의 경우 단기간에 몇 십만, 몇 백만 건의 데이터가 순식간에 쌓이고 로그 정의 항목은 수백 건에 달합니다. 무작정 데이터 탐색 분석으로 뛰어들 경우 망망대해에서 길을 잃고 허우적거리는 경험을 할 것 같았습니다. 따라서 목적을 명확히 설정하고 적절한 질문을 사전에 작성하는 것이 효과적일 것으로 판단했고, 로그 설계시 경험을 바탕으로 대략적인 프레임을 구축하여, 데이터 분석 및 인사이트 도출 과정에 유용한 나침반으로 활용하였습니다. 분석 프레임 설정의 예시는 아래와 같습니다.

목적 앱내 시나리오 및 기능을 개선할 수 있는 방안을 찾자 (궁극적으로 사용성 및 UX 개선)

질문 구간별 Conversion Rate은? 어떠한 기준으로 계산할 것인가? 세션 기준? DAU 기준으로? Funnel 별 이탈율은 얼마나 될까? 주요 bottleneck 구간은 어디일까? 각 단계별 주요 행동 패턴은? 주로 활용되는 기능은? 세부적인 개선점은? 재구매율 혹은 재방문율은 어떠한가? 지표 계산 방식은? 평균 재구매 시간? 시간이 오래 걸릴수록 패널티 주는 방식은? 초기 주요 인사이트 및 시사점은? 분석의 한계점 및 논의/개선 필요사항은?

목적 전체 유저를 세분화하여 행동 패턴의 차이를 확인하자 >> 핵심 그룹 타깃팅

질문 지역별에 따른 유저 행동 패턴의 차이는? 주간 방문수 기준으로 구분하면? 주문 경험 유 vs 무 여부로 구분 신규 유저 vs 기존 가입 유저의 행동 패턴의 차이는? 타 플랫폼 이용 경험 유 vs 무 (디바이스 크로스)가 결제에 미치는 영향은? 주문한 카테고리 (예, 시킨 것만 시키는 그룹, 바꾸는 그룹)별로 구분하면? 결제시 주문 방식별 세분화? 주문 방식별로 특이한 패턴은? 클릭한 배너에 따른 결제율 차이는?

여담이지만, 현재 팀에는 분석가를 위해 전용 서버, Spark, Zeppelin 등 최적화된 분석 환경이 마련되어 있습니다. 쾌적한 환경 구축을 위해 애쓰신 엔지니어분들께 감사를 전하고 싶습니다. 또 로그 수집과 데이터 품질 개선을 위해 노력해주신 개발자분들께 감사를 전하고 싶습니다.

3. 디테일에 목숨걸지 말자!

로그 데이터를 추출해보면 난해한 결과가 나오는 경우가 있습니다. 경험상 주로 다음과 같은 이유로 발생하는 것 같습니다.

로그 설계 과정에서 항목 누락 혹은 잘못된 필드/값 정의

로그 데이터 관리 부족 (예, 업데이트된 서비스의 시나리오 및 기능을 기존 로그 설계에 반영 못했을 경우)

데이터 품질 확보를 위한 노력 부족

수집 과정에서 중복 데이터 발생 (아래 표 예시 참고)

위 4번에 해당하는 예시

위 항목 중 1,2,3 번의 경우 인적요인으로 인해 발생한 것이며, 실무자와 협의를 통해 해결 가능한 부분입니다. 4번의 경우는 기계적으로 수집되는 과정에서 자연스럽게 발생할 수 있는 부분입니다. 이 역시 협업을 통해 해결할 수 있으나, (엔지니어분과 개발자분들은 항상 바쁘므로) 4번 같은 경우 분석 과정에서 자체적으로 해결하는 것이 효과적일 것으로 판단했습니다.

즉 위 테이블을 그대로 읽으면, ‘UserNo가 천사(1004)인 유저가 MyPage 화면을 3초동안 5번 보았다’로 해석되는데, (유저는 기계가 아닌 인간이기에) 어떤 유저도 이런 식으로 앱을 이용하지 않을 것 같았습니다. 차라리 초(Second) 단위의 정보를 무시하고(중복 수집으로 판단), ‘2017년 5월 1일 10시 10분에 천사 유저가 MyPage를 1번 보았다’로 해석하는 것이 더 적절할 것으로 판단했습니다.

때로는 ‘이러한 방식이 세밀한 정보를 놓치는 것이 아닌가?’ 혹은 ‘너무 자의적인 해석이 아닌가?’ 라고 스스로 반문하기도 하였으나, (비록 정보 손실이 있더라도) 효율을 추구하는 동시에, 인간의 행동을 효과적으로 설명할 수 있는 해석이 타당해보였습니다.

결과적으로 기존 5개 행의 데이터를 중복으로 처리해 하나의 행으로 축약시켰으며, 유사한 데이터가 있을 경우 ‘무엇을 기준으로 중복 값을 제거하는 것이 적절한가?’에 대한 물음을 자문하며 분석을 진행했습니다. 이 과정에서 유용했던 것은 초반에 설정한 목적과 의미, 그리고 논리성과 인간을 기반으로 한 접근 방식이었던 것 같습니다.

4. 결과는 이해하기 쉽고 명확하게!

로그 데이터를 설계/수집하고 분석하는 일련의 과정은 이 업무의 절반에 해당한다고 생각합니다. 나머지는 분석 결과를 유관자에게 전달하고, 설득을 통해 실제적인 변화와 성과를 이끌도록 지원하는 것이라고 생각합니다. 이를 위해 분석 결과를 명확하고 간결하며, 이해하기 쉽게 전달하는 것은 매우 중요한 과정인 것 같습니다.

주니어 분석가 시절에는 시각화와 리포트 작성에 많은 노력을 투입했고, 단순하고 쉬운 방법론 보다 고급 방법론이 항상 좋은 것이라고 착각했었습니다. 하지만 아무리 고수준의 방법론이라도, 결과를 공유받는 상대로부터 실제적인 변화를 이끌어내지 못한다면 큰 의미가 없다는 것을 깨닫고, 아래 원칙을 토대로 커뮤니케이션하기 위해 노력하고 있습니다.

단순하고 이해하기 쉬운 그래프

보기에 멋지지만 이해하는 데 시간이 오래걸리고 만들기도 어려운 시각화

5. 로그 데이터를 잘 활용하는 방법

일반적으로 로그 데이터를 수집/처리/분석하기 위해 많은 담당자분들이 노력과 시간을 투입합니다. 이러한 인적자원뿐 아니라, 서버 및 분석도구 등 시스템적 비용 역시 발생하기 때문에 데이터 활용도를 높이는 것이 중요하다고 생각합니다.

일차적으로 생각해볼 수 있는 각 영역/부문별 데이터 활용 방안은 아래와 같습니다.

개발 영역 버그 혹은 크래시율 수집 및 상시 트래킹 이슈 발생 후 롤백 및 대응 등에 대한 의사결정 판단의 근거로 활용 특정 기능에 대한 사용성 진단

마케팅 영역 마케팅 채널별 ROI 진단 및 비용 최적화 배너/프로모션/이벤트 효과 측정 유저 Segmentation, Targeting

기획/디자인 영역 시나리오/기능/디자인에 대한 성과 측정 및 개선 (A/B 테스트) 유저 Journey 경로 분석 및 이탈 구간 개선 (UX/UI 최적화) 유저 Persona 구축 (with 리서치) 및 신규 기능 Ideation

기타 영역 영업 및 CS 관련 대응 사업 및 투자 성과 진단

6. 마치며

개인적으로 데이터가 비로소 그 가치를 발휘하는 순간은 분석 결과가 실제 비즈니스에 적용되어 가시적인 성과를 일으키는 것이라고 생각합니다. 다만 첫술에 배부를 수 없듯이, (작은 규모라도) 반복적인 프로세스로 운영하고 개선이 필요할 경우 기민하게 진행하는 것이 필요하다고 생각합니다. 이를 위해 부서간 기밀한 협업과 업무 프로세스에 대한 공감대 형성이 필요하며, 또 데이터에 대한 적극적이고 열린 태도로 업무를 진행하려는 노력이 필요할 것 같습니다.

더불어, 이를 지원할 수 있는 데이터 전문 인력과 변화에 열려있고 효율성을 추구하는 조직 문화, 유저 친화적인 시스템 등의 기반 역시 필요할 것 같습니다. 비록 데이터나 수치가 모든 비즈니스 문제의 해답을 말해주지 않지만, 문제 해결을 위한 실마리를 제공할 수도 있으니 부담 없이 한번 시도해보는 것은 어떨까요??

로그 데이터를 이용한 고객 세분화

로그 데이터를 이용한 고객 세분화

세일 상품 구매 고객은 20대, 프리미엄 상품은 50대

로그 데이터는 실제 현실에서 발생하는 사건을 데이터로 기록한 것으로, 로그 데이터를 분석하면 실제 현황에 대해서 자세히 확인할 수 있습니다. 프로세스 마이닝을 이용해 로그 데이터를 분석할 수 있으며, 이번 편에서 프로세스 마이닝을 이용한 웹 로그 데이터 분석을 소개하겠습니다.

애견 쇼핑몰 가공 데이터를 프로세스 마이닝에 적용하여 프로세스 맵을 그렸으며 이는 [그림 1]에 나타나 있습니다. 프로세스 맵은 실제 고객이 웹페이지에서 움직인 동선을 그려주며, 프로세스 맵을 통하여 어디로부터 고객이 많이 방문했는지, 어떤 곳을 많이 방문했는지 등을 확인할 수 있습니다. [그림 1]을 확인해보니 해당 애견 쇼핑몰을 방문한 고객 5명 중 3명은 앱 접속을 통해 방문한 것을 확인할 수 있습니다. 또한 고객은 세일 상품에 관심이 많으며 그 다음으로 프리미엄 상품, 일반 상품 순으로 관심이 많은 것을 확인할 수 있습니다.

[그림1] 프로세스 맵

그럼 어떤 고객이 어떤 상품을 많이 구매했는지 확인해 보겠습니다. [그림2]는 나이대별 구매 고객 수를 나타낸 그래프로 어떤 나이대가 가장 구매가 높은지, 나이대별로 어떤 상품을 선화하는지를 확인할 수 있습니다. 해당 애견 쇼핑목에서 20대 고객이 상품을 가장 많이 구매하였으며, 그 다음으로는 40대, 30대가 상품을 많이 구매하였습니다. 20대 고객은 세일 상품 구매 비율이 높고 프리미엄 상품 구매 비율이 낮으며, 50대 고객은 프리미엄 상품 비율이 매유 높은 것을 확인할 수 있습니다.

[그림2] 나이대별 구매 고객 수

이번에 어떤 상품이 어떤 고개에게 많이 팔렸는지 확인해 보겠습니다. [그림3]은 상품별 구매 고객 수를 나타낸 그래프로 해당 상품이 얼마나 팔리는지 확인할 수 있습니다. 해당 애견 쇼핑몰은 상품을 세일 상품, 일반 상품, 프리미엄 상품으로 구분했습니다. 3가지 상품 중 세일 상품이 가장 많이 판매되었으며 일반 상품의 2배가 넘는 수가 판매되었습니다. 한편 세일 상품과 일반 상품은 20대에게 인기가 있으며, 프리미엄 상품은 40대, 50대 고객에게 잘 팔린다는 것을 확인할 수 있습니다.

[그림3] 상품별 구매 고객 수

위에서 분석한 간단한 통계만으로도 여러 가지 고객 세분화 전략을 세울 수 있습니다. 또한, 목적에 맞게 여러 속성들을 결합해 추가 분석을 진행할 수 있습니다. 성별을 이용해 좀 더 고객을 세분화하거나 시간을 이용하여 언제 어떤 고객이 많이 구매를 하는지 등을 확인할 수 있습니다.

이처럼 프로세스 마이닝을 이용해 고객 로그 데이터를 분석하면 고객이 고객의 유입 경로와 홈페이지 내 고객 이동 경로를 정확하게 파악할 수 있습니다. 또한 로그 데이터에 여러 가지 속성을 결합하면 많은 전략적 시사점을 도출할 수 있으며, 이는 회사 전략을 세우는데 타당한 근거로 사용될 수 있습니다.

데이터 분석에서 앱 로그 데이터는 어떤 모습일까?

안녕하세요!

오늘은 제가 앱 로그 데이터가 어떻게 생겼는지(?) 알려드리겠습니다:)

앱 로그데이터에는 종류가 많이 존재하는데요!

그중에서도 사용자의 행동 이력과 정보가 담긴 앱 로그 데이터에 한하여 설명드려보겠습니다.

사용자의 행동이력 및 정보의 앱 로그 데이터란?

1) 사용자의 행동 이력 :

사용자가 특정 앱을 시작하면서부터 종료할 때까지 활동한 다양한 행동들이 순차적으로 기록된 데이터

ex) 다양한 행동들의 예시

– 장바구니 담기, 결제, 홈 화면 클릭 등

2) 사용자 정보 :

사용자가 특정 앱을 시작할 때 입력한 개인 정보

ex) 개인 정보 예시

– 성별, 지역, 나이 등

다음은 사용자 앱 로그 데이터의 예시입니다. 사실 수집된 로그 데이터를 어떠한 형태로 저장할 것인지는 회사마다 다를 수 있기 때문에, 반드시 해당 구조처럼 존재하는 것은 아닙니다.

{ “user_id”: “5d468b47-6ec6-4eb3-8704-e3a96c8a504b”

, “property”: { “gender”: “male”,

“age”: 42,

“city”: “seoul”}

, “session_id”: “HZq-IYjARqWEXvRudFrKpg”

, “date”: 2022-02-22 13:25:00

, “duration”: 3000

, “events”: [ { “name”: “buy_store”,

“date”: 2022-02-22 13:25:06,

“param”: { “membership”: “off”,

“use_point”: 3000,

“use_cart”: “on”

}

}

]

}

처음 접하신다면 생소하실 수 있는데요. 실제로 제가 특정 앱을 사용한다고 해보겠습니다.

그렇다면 다음과 같이 이해하시면 될 것 같습니다.

user_id : 특정 앱 내에서 내가 갖는 고유한 아이디

property : 나의 개인 정보

session_id : 내가 앱을 실행할 때마다 생기는 하나의 세션의 고유한 아이디

date : 앱을 실행할 때의 시간

duration : 앱을 실행하고 종료할 때까지의 소요된 시간

events : 내가 앱을 실행할 때 사용한 앱 내의 기능

param : 사용한 앱 내의 기능의 부가적인 기능

중요한 특징은 저희가 일반적으로 사용하는 행과 열의 구조가 아닌 key-value의 형태로 이루어진 딕셔너리의 구조라는 것입니다. 물론 이 데이터를 DB에서 쿼리를 통해서 테이블의 구조로 가져다가 사용하는 경우가 대부분이라고 생각됩니다.

DB에서 query를 이용하여 사용하는 경우

하지만 저는 위의 데이터의 구조를 직접 가져다가 사용해야 했습니다. 따라서 해당 구조로 만들어진 데이터를 연습해보고 다루는 방법을 고민해보시는 것을 추천드립니다!

처음 접했을 때, stackoverflow의 관련된 거의 모든 글들을 살펴보면서 팁들을 얻으려고 했던 것 같습니다,,!

이전에는 구조적 잘 되어 있는 csv나 xlsx 형태의 데이터들을 분석할 때에는 항상 “데이터 처리 및 가공”이라는 과정에 대해서 의문이 들곤 했습니다. 하지만 해당 문제를 고민하면서 다음의 항목들을 해결해야 했습니다.

한 사용자가 특정 앱 내에 여러 번 접속해서 했던 행동들을 살펴보려면 어떻게 해야 할까? 해당 데이터를 행과 열의 구조로 나타내려면 어떻게 해야 할까? 하나의 행에는 어떤 내용들이 있어야 할까? 테이블을 여러 개로 나눠서 데이터를 관리하면 어떨까?

1-4번의 과정을 python으로 수행하려면 어떤 코드를 짜야할까?

저도 완벽하게 이 문제를 해결해낸 것은 아니고, 해결 방법들에는 여러 가지가 있었습니다.

여러분들도 고민해보시고 좋은 방법이 있다면 알려주세요!

마지막으로, 해당 글은 제 경험 기반 하에 작성한 것이기 때문에 틀린 점이나 보완할 점이 있을 수 있으니

피드백은 언제든 편하게 말씀 주시면 감사하겠습니다:)

판다스 – 로그데이터 분석 : 고객 이탈률이 높은 페이지는?

반응형

웹서버가 request를 받으면 해당 요청에 대한 log 정보가 남는다.

log 정보

ip / 세션아이디 / 사용자아이디 / 시각 / 요청 페이지 / 상태코드 / 바이트사이즈 등이 있다.

세션 아이디

사용자가 로그인을 해서 일련의 활동을 하는데, 그 활동이 활발하게 이루어지는 그 기간

즉, 사용자가 Active하게 해당 사이트를 이용하는 기간을 의미한다.

간혹 어떤 페이지에서 장시간 움직임이 없으면 자동으로 로그아웃되는데

이는 세션 아이디가 리셋되는 것이라 생각하면 된다.

데이터 불러오기

이는 실제 로그 데이터가 아닌 임의로 작성된 데이터를 밝힘.

사용자가 어떤 과정을 거치는지는 url 컬럼을 확인한다.

url컬럼의 고유값

여기서 /checkout을 제외한 4단계를 살펴볼 예정이다.

날짜 컬럼 전처리

필요 없는 대괄호는 없애준다.

to_datetime을 이용해서 datetime자료형으로 바꿔준다.

여기서 형식을 반드시 지정해줘야 원하는 대로 날짜가 나온다.

첫행의 기존 데이터를 보면

01/Dec/2019T00:47:11

일/월/연T시:분:초 이렇게 구성되어 있다.

구성에 맞게

일 : %d / 3자리 월 : %b / 4자리 연도 : %Y

T

24시간 : %H

2자리 분 : %M

2자리 초 : %S

위 포맷을 전달해주면 된다.

datetime이 보기 좋게 바뀌었다.

funnel step 데이터프레임 제작

위에서 봤던 url 컬럼의 4가지 값을 추출하여 단계별로 순서를 맞춰놓는다.

제품 리스트 → 제품 설명 → 장바구니 → 결제 완료

이 순서이다.

session과 url로 그룹핑

user_id가 아닌 session을 기준으로 잡아야한다.

그 이유는 동일한 유저라도 다른 세션으로 접속했다면 다른 경우로 간주하기 때문이다.

위 grouped에서 필요한 것은 사실 datetime 컬럼이다.

그룹별 datetime 컬럼의 가장 빠른 시간대를 살펴보자

시간대가 가장 빠른 이벤트를 추출하는 것이다.

위 grouped를 데이터프레임화

url별 숫자로 순서를 나타내기 위해

전에 만든 funnel_stpes와 merge 실행

결과

funnel_steps의 /check_out 단계는 merge할 대상이 없기에

기존 1290행에서 1115행으로 줄어들었다.

funnel 제작

grouped의 인덱스를 리셋한 다음

session_id를 인덱스로, step_no를 컬럼으로 피벗해서

funnel 데이터프레임을 만든다.

다만 1,2,3,4로 보기엔 헷갈리니 컬럼명을 단계별 이름으로 바꿔주자

첫번째 행 세션아이디는 제품 리스트를 보고 디테일까진 갔지만 장바구니로 연결되진 않았다.

세번째의 경우에는 장바구니까진 갔지만 결제가 완료되진 않았다.

퍼널 카운트 계산

각 스텝별로 얼마나 누락값이 생기는지

즉, 이탈을 얼마나 하는지 계산

리스트로 바로 담아줬다.

funnel 시각화

각 funnel별 스텝 이름과

각 funnel별 카운트 값을 이용해 Funnel 그래프를 그린다.

세번째 장바구니 단계의 경우

처음의 62.3%가 남았고

바로 그 전 단계인 produce_list에서는 74.4%가 남았다.

확실히 order_complete까지 가는데 이탈자가 많은 것을 볼 수 있다.

평균 시간 계산

각 퍼널별 평균 소요 시간을 살펴보자

제품 리스트에서 제품 상세까지 가는데 걸리는 평균 시간은 16분

제품 상세에서 장바구니로 이동하는데 걸리는 평균 시간은 18분

그러나 장바구니에서 결제 완료까지 걸리는 평균 시간은 33분.

확실히 제품 결제하는 단계에서의 User 맞춤형 편리화를 재고할 필요가 있다.

반응형

로그 분석이란?

로그 분석이란?

로그 파일은IT 시스템 운영 중에 발생한 이벤트, 프로세스 및 기타 정보를 기록한 컴퓨터 생성 메시지입니다. 로그 분석은 문제 해결, 성능 예측, 유지관리 및 개선에 도움이 될 수 있는 패턴을 식별하기 위해 로그 파일을 분석하는 일반적인 분야입니다.

IT운영 상, 로그 파일은 주로 하드웨어의 고장, 보안 사고 또는 기타 다른 유형의 사고 시 발생한 프로세스 및 이벤트를 이해하는 데 사용됩니다. 로그분석 툴은 미래의 사고를 미연에 방지하고자 시스템 전반의 트렌드를 밝히는데 사용될 수 있습니다.

데이터 스토리지 인프라에 대한 로그 분석의 장점

로그 분석의 장점은 다음과 같습니다:

KR101170478B1 – 로그 데이터 분석 방법 – Google Patents

G06F11/34

Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment

사용자들의 특징 찾기(사용자 그룹화, 카테고리별 집계, 벤다이어그램(CASE))

728×90

SMALL

csv파일을 Import 하는 방법은 아래 포스팅에 자세히 적혀있습니다.

ysyblog.tistory.com/143

Data소개

1. 고객로그데이터

2010년 12월부터 2011년 2월초까지 어느 온라인쇼핑몰의 고객 주문 로그 데이터입니다. 아래 데이터를 database에 import합니다.

onlineshop.csv 4.63MB

테이블을 만들기 위한 SQL 쿼리입니다.

DROP TABLE IF EXISTS online_sales; CREATE TABLE online_sales ( order_id SERIAL, invoice integer, stockcode VARCHAR(255), description VARCHAR(255), quantity integer, date DATE, price float(50), customerid VARCHAR(50), country VARCHAR(50), Primary KEY(order_id) );

2. 사용자데이터

customer_info.csv 0.09MB (해당 데이터는 수정되었습니다. 따라서 결과값이 이후 포스팅과 다를 수 있습니다.)

고객들의 성별, 나이, 등록일, 등록기기 등의 정보를 모아둔 데이터입니다. 고객로그데이터의 customer_id를 기반으로 임의로 만든 데이터입니다.(랜덤추출)

테이블을 만들기 위한 SQL 쿼리입니다.

DROP TABLE IF EXISTS customer_info; CREATE TABLE customer_info ( order_id SERIAL, customerid VARCHAR(50), age integer, register_date DATE, register_device VARCHAR(50), sex VARCHAR(50), Primary KEY(order_id) ); select * from customer_info;

국가별 사용자 수 집계

국가별로 얼마나 주문을 하는지, 1인당 주문을 얼마나 하는지 알아보는 쿼리입니다.

with문을 활용하여 총 주문을 임시로 구하고, 기존 테이블과 CROSS JOIN하여 점유율과 주문률을 구하였습니다.

with stats as( select count(distinct customerid) as total_co from online_sales ) select l.country — 주문한 국가 ,count(distinct l.customerid) as action_co — 주문고객 수 ,count(1) as action_count — 총 주문 수 ,s.total_co — 전체 주문자수 ,round(100.0 * count(distinct l.customerid) / s.total_co,2) as usage_rate — 국가별 점유율 ,round(1.0 * count(1) / count(distinct l.customerid),2) as count_per_user — 국가별 1인당 주문률 from online_sales as l cross join stats as s group by l.country, s.total_co;

– 총 주문 빈도는 영국이 가장 높고 인당 주문률은 아일랜드(EIRE)가 가장 높았습니다. 해당 온라인 쇼핑몰은 영국 사이트라고 유추해볼 수 있습니다.

사용자 연령 집계

나이 구간을 기준으로 사용자의 그룹을 나누었습니다. 20살 미만은 Teen(청소년층), 20~39살은 Youth(청년층), 40~59살은 Ender(장년층), 그 이후 나이는 Old(노년층)으로 지정하고 성별과 합쳐서, 사용자들을 구분하였습니다.

with user_age as( select customerid ,sex ,age ,concat(sex, Case when age < 20 Then '_Teen' when age between 20 and 39 Then '_Youth' when age between 40 and 60 Then '_Elder' Else '_Old' End) as age_split from customer_info ) select * from user_age; 연령그룹별 카테고리 집계하기 - 각 연령그룹별로 카테고리마다 얼마나 구매했는지를 보여주는 쿼리입니다. with user_age as( select customerid ,sex ,age ,concat(sex, Case when age < 20 Then '_Teen' when age between 20 and 39 Then '_Youth' when age between 40 and 60 Then '_Elder' Else '_Old' End) as age_split from customer_info ) select o.category ,u.age_split ,count(*) as purchase_count from online_sales as o join user_age as u on o.customerid = u.customerid group by o.category, u.age_split; 사용자의 방문빈도 집계 - 사용자가 해당사이트에서 얼마나 자주 구매했는지 알려주는 쿼리입니다.이 with user_count as( select customerid ,count(distinct date) as action_day_count from online_sales -- 12월 첫째주 대상을 방문횟수 체크 where date between '2010-12-01' and '2010-12-07' group by customerid ) select action_day_count ,count(distinct customerid) as user_count from user_count group by action_day_count order by action_day_count; - 위 표를 해석하면, 1주일 동안 한 번 방문한 사람은 387명, 2번 방문한 사람은 32명, 3번 방문한 사람은 2명이다. 여러 카테고리를 구매한 사용자 수 집계(CUBE) - 어떤 사람은 하나의 카테고리만 구매하는 반면, 다른사람은 여러 카테고리를 구매할 것입니다. 따라서 여러 카테고리를 사는 사람이 얼마나 되는지 알아보겠습니다. - 카테고리 숫자가 많으므로, cloth/health/cook 세 카테고리만 분석하겠습니다. - 해당 분석결과로 벤다이어그램을 만들거나, 장바구니분석(연관성분석)에 활용 할 수 있습니다. - CUBE 구문을 통해 모든 조합에 대해 사용자 수를 집계할 수 있습니다. -- 사용자마다 세 카테고리를 주문했는지 집계 with user_category as( select customerid ,SIGN(sum(case when category='cloth' then 1 else 0 end)) as buy_cloth ,SIGN(sum(case when category='health' then 1 else 0 end)) as buy_health ,SIGN(sum(case when category='cook' then 1 else 0 end)) as buy_cook from online_sales group by customerid ) , user_group as( select buy_cloth, buy_health, buy_cook, count(1) as users from user_category group by CUBE(buy_cloth, buy_health, buy_cook) ) select * from user_group order by buy_cloth, buy_health, buy_cook; 이를 벤다이어그램으로 만들기 좋게 만들려면 다음과 같이 쿼리를 진행한다. -- 사용자마다 세 카테고리를 주문했는지 집계 with user_category as( select customerid ,SIGN(sum(case when category='cloth' then 1 else 0 end)) as buy_cloth ,SIGN(sum(case when category='health' then 1 else 0 end)) as buy_health ,SIGN(sum(case when category='cook' then 1 else 0 end)) as buy_cook from online_sales group by customerid ) , user_group as( select buy_cloth, buy_health, buy_cook, count(1) as users from user_category group by CUBE(buy_cloth, buy_health, buy_cook) ) select case buy_cloth when 1 then 'cloth' when 0 then 'not purchase' else 'any' end as buy_cloths ,case buy_health when 1 then 'health' when 0 then 'not purchase' else 'any' end as buy_healths ,case buy_cook when 1 then 'cook' when 0 then 'not purchase' else 'any' end as buy_cooks ,users ,round(100.0 * users / NULLIF( SUM(Case when buy_cloth is null and buy_health is null and buy_cook is null then users else 0 end) over() ,0),2) as ratio from user_group order by buy_cloths, buy_healths, buy_cooks; 해당 포스팅은 다음의 책을 활용하여 작성하였습니다. - 가사키 나가토, 다미야 나오토, 『데이터 분석을 위한 SQL 레시피』, 한빛미디어, p186~232 728x90 반응형

모바일 앱 로그분석, 어떻게 시작해야 할까?

데이터 파이프라인을 잘 구축한다는 건 어떤 의미일까요? 기술적으로는 어떤 데이터베이스를 이용할지 선택하고, 스트리밍과 배치를 적절히 설계하고, 수집된 데이터의 전처리 프로세스를 만들고… 등등의 수많은 고려사항이 있을 텐데요. 개발자가 아닌 분석가 입장에서 ‘데이터 파이프라인을 잘 만든다’는 건 약간 다른 측면의 이야기라고 생각합니다. 저는 다음과 같은 질문을 해 볼 수 있을 것 같네요. 서비스 데이터와 유저 행동 데이터가 잘 구조화되어서 저장되고 있고, 서로 연계해서 보는 데 어려움이 없는가?

면접에서 많이 듣는 말 1위 vs. 입사하고 많이 하는 말 1위…

서비스를 이용하는 사용자들이 남기는 로그는 서비스 로그와 행동 로그로 구분됩니다. 서비스 로그는 transaction의 결과를 기록하는 로그입니다. 가입하거나, 예약하거나, 결제하는 등 하나의 transaction이 완료되었을 때 각각의 서비스 로그가 남게 됩니다. 반면 행동 로그는 transaction에 이르기까지 사용자들이 서비스에서 하는 하나하나의 action에 대한 로그를 의미합니다. 특정 상품을 클릭하거나, 검색하거나, 배너를 스와이프하는 등의 action을 예로 들 수 있습니다.

서비스 로그는 기본적인 서비스 운영을 위해서 필수적으로 쌓고 관리해야 하므로 이 데이터를 활용하는 데는 대부분 큰 문제가 없습니다. (모든 변경분을 다 쌓을지, 최종 수정된 내용만 남길지 정도의 고려사항은 있겠지만…)

반면 행동 로그의 경우 데이터양도 훨씬 많고, 설계하는 과정에서의 자유도도 높아서 수집이나 활용이 상대적으로 까다로운 편입니다. 당장 볼 수 없다고 해서 서비스에 큰 문제가 생기는 것도 아니고요. 그러다 보니 ‘일단 되는대로 다 쌓자! 근데 어떻게 봐야 할지 모르겠다. 나중에 누군가 보겠지 뭐…’ 상태로 방치되는 경우가 많습니다.

이 글에서는 마이리얼트립 모바일 앱에서의 행동 로그를 어떤 방식으로 수집해서 보고 있는지를 간단히(?) 소개하려고 합니다. 단, 연동에 대한 기술적인 부분보다는 이벤트 구조를 어떻게 설계하고, 어떤 식으로 적재하고, 어떻게 조회하는지… 분석가 관점에서의 로그 수집과 처리에 대한 이야기를 주로 말씀드릴 예정입니다.

행동 로그 설계하기

행동 로그를 어떻게 설계하느냐에 따라서, 얻을 수 있는 정보의 수준은 완전히 달라집니다. 행동 로그를 보는 가장 단순한 방식은, 발생한 이벤트의 숫자를 count 하는 것입니다. (ex. 가입하기 버튼 클릭 수는 100회입니다.) 하지만 단순 이벤트 숫자 집계만으로는 원하는 수준의 인사이트를 얻기 어렵겠죠. 사실 행동 로그 설계의 핵심은 이벤트의 속성(property)을 어떤 수준으로 함께 남길 것인가? 를 정의하는 부분입니다. 속성에 대해서 약간 더 부연설명을 하자면, 특정 이벤트가 발생했을 때 함께 남길 수 있는 이벤트(혹은 사용자)에 대한 세부정보라고 생각하시면 됩니다. 가령, ‘예약하기’ 버튼을 누르는 이벤트가 있다고 하면, 아래와 같은 것들이 property가 될 수 있겠네요.

이벤트의 속성을 남기지 않았다면, 예약하기 버튼을 클릭한 숫자 정도만 확인이 가능합니다. 하지만 이벤트의 property를 함께 기록했다면 어떤 상품을 클릭했는지, 그 상품의 가격이 얼마였는지, 어떤 화면에서 클릭했는지…와 같은 훨씬 더 자세한 정보를 얻을 수 있습니다. 만약 사용자 property까지 함께 기록했다면? 해당 이벤트를 한 사용자가 어떤 특성이 있는지도 확인할 수 있습니다. 즉, 하나의 이벤트가 발생했을 때 훨씬 더 입체적으로 정보를 얻을 수 있게 됩니다. 아래 표를 보면 property를 남기는 수준에 따라서 얻을 수 있는 인사이트의 수준이 크게 차이 남을 확인하실 수 있습니다.

BigQuery에 로그 적재하기

마이리얼트립은 Firebase-BigQuery 로 이어지는 파이프라인을 이용해서 앱 로그를 남기고 있습니다. BigQuery는 구글이 제공하는 대용량 데이터베이스인데요. TB 단위의 스캔에도 전혀 무리 없는 빠른 속도, 매우 저렴한 저장비용, 무제한에 가까운 용량, 관리의 편의성, Firebase 프레임웍과의 연동… 등 앱 로그를 쌓는 용도로 사용하기에 아주 좋은 선택입니다. BigQuery에 대한 자세한 소개, 그리고 Firebase를 BigQuery와 연동하기 위한 설정에 대한 디테일한 내용은 아래 링크를 참고하시길 바랍니다.

구글 BigQuery 공식 문서

변성윤 님의 BigQuery 튜토리얼

이민우 님의 BigQuery 시작하기

BigQuery에 쌓인 이벤트 로그는 아래와 같은 포맷의 스키마를 갖습니다. event에 딸린 key가 있고(위에서 설명한 event property 명칭에 해당합니다), 해당 key에 매핑된 value (event property의 구체적인 값에 해당합니다)가 있습니다. 특이한 점은 value가 자료형에 따라 구분되어 있다는 건데요. string, integer, float, double 각 자료형에 따라서 컬럼이 구분되어 있고, 추후 조회를 할 때도 자료형에 따라 정확한 컬럼을 지정해야 값을 확인할 수 있습니다. 참고로, 아래는 event property를 예로 들었지만 user property도 적재되는 방식은 동일합니다.

scheme 예시

event 안에 N개의 key가 있고, 각 key에는 매핑되는 value가 있습니다 (4개 type 중 하나)

또 한가지 주목해야 하는 부분은 하나의 이벤트에 복수 개의 property가 존재하는 경우, row 안에 row가 내재한 구조로 쌓인다는 점인데요 (BigQuery에서는 이런 유형의 컬럼을 Record type으로 분류합니다. 일명 nested 구조…) 구글은 이걸 장점이라고 홍보하던데 -_-; 사실 분석하는 입장에서는 이런 nested 구조 때문에 쿼리 작성의 난이도가 굉장히 높습니다ㅠㅜ 간단히 설명해 드리면, record type의 데이터를 조회할 때는 항상 unnest 한 다음에 쿼리를 해야한다는 건데요. 이 부분은 뒤에서 자세히 설명해 드리도록 하겠습니다.

(저도 nested 구조에 익숙하지 않아서 처음에는 엄청 고생하다가, 이 글을 다섯 번쯤 정독하고 나서야 경건한 마음으로 콘솔에 쿼리 작성을 할 수 있었습니다…)

BigQuery에서 로그 조회하기

unnest를 활용하여 기본적인 쿼리를 작성하는 방법은 아래와 같습니다. from 문 뒤에 unnest를 이용해서 특정 record type을 임시로 펼치고, 그 컬럼을 불러와서 정보를 조회합니다.

# unnest 사용 예시

# 검색어 입력 방법(search_type)에 따라서 count하는 단순한(!) 쿼리

SELECT

event_params.value.string_value,

COUNT(*) as cnt

FROM

`dataset.table_name`,

UNNEST(event_params) AS event_params

WHERE

_TABLE_SUFFIX BETWEEN ‘20190801’ AND ‘20190807’

AND event_name =’search’

AND event_params.key = ‘search_type’

GROUP BY 1

ORDER BY 2 DESC

위 케이스는 하나의 property를 사용하는 일반적인 상황에서 쓸 수 있는데요. 만약, 특정 record type에 있는 property 여러 개를 동시에 사용하는 쿼리를 짜고 싶다면 어떻게 해야 할까요? 가령 ‘특정 검색어’에 대해서만 ‘search_type’을 구분해서 보고 싶다면? 좀 번거롭긴 하지만 사용하려고 하는 property 개수만큼 해당 record를 unnest 하면, 복수 property를 활용하는 쿼리문을 작성할 수 있습니다.

# 2개 이상의 property를 활용하는 쿼리

# 사용하려는 property 개수만큼 unnest를 한다 -_-

SELECT

x.value.string_value AS search_term,

y.value.string_value as search_type

COUNT(*) as cnt

FROM

`dataset.table_name`,

UNNEST(event_params) as x,

UNNEST(event_params) as y

WHERE

_TABLE_SUFFIX BETWEEN ‘20190801’ AND ‘20190807’

AND event_name =’search’

AND x.key = ‘search_term’

AND y.key = ‘search_type’

GROUP BY 1,2

ORDER BY 3 DESC

다음으로, parameter 안에 있는 value를 꺼내서 select나 group by의 기준으로 쓰고 싶다면? 아래와 같이 subquery를 이용하면 됩니다. name, key, value가 좀 헷갈릴 수 있는데, 자꾸 사용하다 보면 어쨌든 익숙해지긴 하더군요.

# parameter 안에 있는 value를 사용하고 싶을 때는 subquery를 활용

# 처음 봤을 땐 대략 정신이 멍해지지만, 익숙해지면 또 어떻게든 짜게 된다…

SELECT

(SELECT params.value.string_value FROM UNNEST(event_params) params

WHERE params.key = ‘city_name’) AS city_name,

COUNT(*) as screen_view

FROM

`dataset.table_name`,

UNNEST(event_params) AS event_params

WHERE

_TABLE_SUFFIX BETWEEN ‘20190801’ AND ‘20190807’

AND event_name = ‘screen_view’

AND key = ‘screen_name’

AND value.string_value = ‘city’

GROUP BY 1

ORDER BY 2 DESC

이런 식으로 이벤트와 사용자의 property를 잘 정의해서 BigQuery에 쌓아두면 사용자의 행동 로그를 굉장히 자세한 레벨에서 분석할 수 있습니다. 기본적인 노출이나 클릭 이벤트 집계는 물론이고, 주요 페이지에 대한 퍼널 분석이라던지, 핵심 기능에 대한 사용성 확인, 신규 피쳐에 대한 A/B 테스트 성과 확인 등이 모두 가능합니다. user property를 잘 남겼다면 특정 행동을 한 유저 리스트를 추출하거나, 적합한 프로모션을 위한 세밀한 타겟팅도 할 수 있습니다.

다만 한가지 문제가 있는데요. nested 되어서 쌓이는 DB 구조 때문에 여러 가지 복잡한 조건이 포함된 쿼리를 작성하는 게 굉장히 어렵습니다. ㅠㅜ 기본적인 SQL 문법을 알고 있는 사람이라도 하더라도, 쿼리를 작성할 때 아래 사항을 챙기느라 꽤나 시행착오를 겪어야 합니다.

기본적으로 unnest가 항상 필요

unnest하는 과정에서 불필요하게 생성되는 많은 row로 인해서 쿼리 스캔 비용이 늘어남

event, parameter.key, parameter.value가 매번 헷갈림

value의 타입이 string, integer, float, double 중 어느 것인지를 쿼리할때마다 정확히 지정해야 함

parameter.value를 꺼내 쓰려면 subquery 등 굉장히 복잡한 문법이 필요함

사실 정확히 말하면… 쿼리 작성이 어려운 게 문제라기보다는, 쿼리 작성이 어려워지면서 로그를 점점 소극적으로 보게 된다는 문제가 생깁니다. 물론 빈번하게 활용되는 쿼리들은 초기에 일괄 세팅해서 편하게 볼 수 있도록 했지만, 이후 추가로 분석할만한 다양한 주제가 생겼을 때 쿼리 작성이 까다로워서 진행 자체가 늦어지거나, 세세한 데이터를 충분히 보지 못하는 경우가 종종 발생했거든요.

분석이 편한 로그 테이블 만들기

불편했지만 어찌어찌 적응하면서 지내던 저와 달리, 마이리얼트립 그로스팀에서 바른생활과 톤앤매너를 담당하고 있으며 2019년 4월의 MRTer (a.k.a 우수사원)로 선정된 안성환님은 이 문제를 꼭 해결하고 싶어했습니다. 몇 번의 시행착오를 거치긴 했지만, 결과적으로 성환님은 굉장히 깔끔한 방법으로 로그 테이블 전처리에 성공했는데요. 짧게 소개해 드리겠습니다.

nested 된 테이블 예시

위와 같이 nested 된 테이블을 ‘사람이 보기 편한’ 형태로 flatten 하려면 어떻게 해야 할까요? 약간 복잡한 subquery를 사용해야 하지만, key를 기준으로 unnest 시키면서 value의 type을 하나하나 잘 지정해주면 그리 어렵진 않습니다.

# nested된 컬럼 일괄 flatten 하기

SELECT event_name,

(SELECT value.string_value FROM UNNEST(event_params) WHERE key = ‘name’) as name,

(SELECT value.int_value FROM UNNEST(event_params) WHERE key = ‘price’) as price,

(SELECT value.string_value FROM UNNEST(event_params) WHERE key = ‘city’) as city

FROM `dataset.table_name`

WHERE event_name = ‘click_reservation’

이렇게 flatten을 하면, 아래와 같이 매우 예쁜(!) 테이블이 나오게 됩니다.

자, 그럼 이제 이 쿼리를 기반으로 UDF(User Defined Function)를 만들고, 기존 테이블에다가 이 함수를 적용한 결과를 새 테이블로 저장하면, 놀랍도록 깔끔한 데이터셋을 얻을 수 있습니다. (이 과정을 자동화하는 pipeline은 데이터플랫폼 팀의 도움을 많이 받았습니다) 아래에 적혀진 것처럼, paramValueByKey 라는 마법의(!) 함수를 통해 nested 된 테이블의 flatten 작업을 깔끔하게 진행하고 새로운 테이블에 저장할 수 있었습니다.

# UDF 예시

CREATE TEMP FUNCTION paramValueByKey(k STRING, params ARRAY>>) AS (

(SELECT x.value FROM UNNEST(params) x WHERE x.key=k)

);

CREATE OR REPLACE TABLE `dataset.new_table`

PARTITION BY date

OPTIONS (description=”flatten table partitioned by date”)

as

SELECT

date,

event_name,

paramValueByKey(‘screen_name’, event_params).string_value as screen_name,

paramValueByKey(‘content_id’, event_params).int_value as content_id,

paramValueByKey(‘price’, event_params).double_value as price

FROM `dataset.old_table`

이런 식으로 테이블이 깔끔하게 정리되고 나면, 똑같은 데이터를 추출하는 데 필요한 쿼리도 굉장히 심플해집니다. 위에서 잠깐 언급했던 검색어별 검색방법을 확인하는 쿼리(복수의 property를 활용했던 사례)를 예로 들어보면, before 대비 after 쿼리가 엄청나게 간결해진 것을 확인하실 수 있습니다. 저 정도면 사내 SQL 교육을 수료한 멤버들이 직접 궁금한 정보를 찾아보는데 전혀 무리가 없는 테이블 구조라고 할 수 있습니다. (데이터가 흐르는 조직!)

#### BEFORE ####

SELECT x.value.string_value AS search_term, y.value.string_value as search_type, COUNT(*) as cnt

FROM `dataset.old_table`, UNNEST(event_params) as x, UNNEST(event_params) as y

WHERE _TABLE_SUFFIX BETWEEN ‘20190801’ AND ‘20190807’

AND event_name =’search’ AND x.key = ‘search_term’ AND y.key = ‘search_type’

GROUP BY 1,2

ORDER BY 3 DESC

#### AFTER ####

SELECT search_term, search_type, count(*) as cnt

FROM `dataset.new_table`

WHERE date BETWEEN ‘2019-08-01’ AND ‘2019-08-07′

AND event_name =’search’

GROUP BY 1,2

ORDER BY 3 DESC

이처럼 심플한 구조로 로그데이터를 저장하게 되면 여러 장점이 있습니다. 무엇보다 쿼리를 작성하는 과정이 간편해지면서 훨씬 더 다양한 데이터를 적극적으로 살펴보게 되었고요. unnest 과정에서 생기는 불필요한 row가 사라지면서, 쿼리 비용도 훨씬 절감할 수 있었습니다. (BigQuery의 경우, 스캔하는 데이터 양 기준으로 쿼리에 대한 과금을 합니다) 기존 쿼리를 수정하거나 개선하는 경우에도, 분석을 하는 시간이 크게 단축되어서 생산성이 크게 향상되었습니다.

마무리

이상으로, 마이리얼트립에서 어떤 식으로 행동 로그를 정의하고, 수집하고, 조회하는지… 에 대해서 간략하게 소개해 드렸습니다. 로그 분석은 초반에 설계를 잘 하는 것 만큼이나 QA를 꼼꼼하게 하고, 이후 서비스가 업데이트 될 때마다 꾸준히 잘 챙기는 게 중요한데요. (전체를 갈아엎고 새로 싹 만드는 일의 난이도가 10이라면, 이후 변경사항을 꾸준히 잘 챙기는 일의 난이도는 100쯤 되는 것 같네요…)

로깅 작업을 꼼꼼하게 잘 챙기는 개발자는 있지만 (제가 N개 회사를 다녀봤는데, 마이리얼트립 개발자분들은 진짜 잘 챙겨주십니다…ㅎㅎ), 그것과 별개로 이걸 좋아하는(?) 개발자는 없다고 생각합니다. 엄청난 꼼꼼함과 완벽함이 요구되는 무한 반복 업무거든요 -_-;; (애초에 사람이 할 일이 아닌 것 같기도…)

개인적으로 마이리얼트립 개발자분들이 로깅을 꼼꼼하게 잘 챙겨주시는 큰 이유는 실제로 앱 로그 데이터가 여기저기서 잘 활용되고 있고, 같이 일하는 멤버들 사이에서 굉장히 중요한 데이터로 인식되고 있다는 점 때문이 아닐까 싶습니다. 마이리얼트립에서는 A/B테스트를 하거나, 새로운 기능을 출시했을 때, 서비스에 이상 징후가 있을 때 굉장히 열심히 행동 로그를 살펴보는 편이거든요. 누가 언제 볼지 모르는 데이터를 일단 쌓는 것과, 모두가 굉장히 열심히 보고 있는 데이터를 쌓는 건… 동기부여의 차원이 전혀 다를 테니까요!

더 공부하고 싶다면?

그로스해킹 : 데이터와 실험을 통해 성장하는 서비스를 만드는 방법

키워드에 대한 정보 로그 데이터 분석

다음은 Bing에서 로그 데이터 분석 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 [마케팅 데이터 분석 기초 2] Topic 1. 웹로그 분석과 비즈니스

  • 이패스코리아
  • epasskorea
  • GA
  • GOOGLE
  • GOOGLE ANALYTICS
  • 구글
  • 구글애널리틱스
[마케팅 #데이터 #분석 #기초 #2] #Topic #1. #웹로그 #분석과 #비즈니스


YouTube에서 로그 데이터 분석 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 [마케팅 데이터 분석 기초 2] Topic 1. 웹로그 분석과 비즈니스 | 로그 데이터 분석, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

Leave a Comment