본문 바로가기

TIL

[240105] 데이터 리터러시 & SQL: 코드카타 92~94 & 파이썬: 코드카타 8

[데이터 리터러시(Data Literacy) by 오준엽 튜터]

 

1. 데이터 리터러시란? 

- 정의: 데이터를 읽고, 이해하고, 비판적으로 분석하는 능력

            + 분석 결과를 의사소통에 활용할 수 있는 능력

 

- 상세 의미 

└ 데이터 수집과 데이터 원천을 이해하고
└ 주어진 데이터에 대한 다양한 활용법을 이해하고
└ 데이터를 통한 핵심지표를 이해하는 것
데이터 리터러시는 올바른 질문을 던질 수 있도록 만들어 줌

 

- 데이터 분석에 대한 착각  

데이터 분석을 배운다 ≠ SQL, Python, Tableau 등 학습
    but, 막상 데이터 분석 하려면 쉽지 않음 

데이터를 잘 분석 ≠ 문제, 목적, 결론이 나올 것
데이터를 잘 가공 ≠ 유용한 정보를 얻을 것
분석에 실패 ≠ 방법론, 스킬이 부족한 것

 

- 데이터 해석 오류 사례

① 심슨의 역설 (Simpson’s Paradox)
 : '부분'에서 성립한 대소 관계가 그 부분을 종합한 '전체'에 대해서는 성립하지 않는 모순적인 경우를 의미 

 : 전체 데이터에 대한 결론이 언제나 개별 집단에 그대로 적용되는 것은 아님 (ex. 연령대별 코로나 백신 접종과 치명률)

② 시각화를 활용한 왜곡

 : 자료의 표현 방법에 따라서 해석의 오류 여지가 존재

③ 샘플링 편향 (Sampling Bias)

 : 전체를 대표하지 못하는 편향된 샘플 선정으로 인해 오류가 발생

 

④ 상관관계와 인과관계

 : 상관관계는 두 변수가 얼마나 상호 의존적인지 파악하는 것을 의미(한 변수가 다른 변수의 추이를 따름)

 : 인과관계는 실질적으로 하나의 요인으로 인해 다른 요인의 수치가 변하는 형태를 의미(원인과 결과가 명확)

 : 상관관계는 늘 인과관계가 있는 것은 아니므로 양쪽 모두 파악해서 의사결정 필요

 

- 데이터 리터러시가 필요한 이유와 데이터 분석 접근법

: ‘생각’이 주요한 단계에서 데이터 리터러시가 필요
: 데이터 분석이 목적이 되지 않도록 ‘왜?’를 항상 생각해야 함

 

 

2. 문제정의

- 정의

 : 데이터 분석 프로젝트의 성공을 위한 초석이자 첫걸음
 : 분석하려는 특정 상황이나 현상에 대한 명확하고 구체적인 진술
 : 프로젝트의 목표를 설정하고 분석 방향을 설정
 : (X) 매출을 어떻게 늘릴 수 있을까?

   (O) 지난 6개월 동안 20대 여성 고객층의 구매 전환율 감소 > 해당 타겟 전환율을 2%에서 5%로 끌어올릴 방법은? 

 

- 문제 정의 방법론

① MECE (Mutually Exclusive, Collectively Exhaustive) 

 

- 문제 해결과 분석에서 널리 사용되는 접근 방식

- 문제를 상호 배타적(mutually exclusive)이면서, 전체적으로 포괄적(collectively exhaustive)인 구성요소로 나누는 것
- MECE를 통해 복잡한 문제를 체계적으로 분해하고, 구조화된 방식으로 분석할 수 있음
- 주의할 점: 분류 기준이 명확하고 통일되어야 하며, 중복이나 누락이 없어야 함

 

② 로직 트리(Logic Tree)  

- MECE 원칙을 기반으로 복잡한 문제를 더 작고 관리하기 쉬운 하위 문제로 분해하는데 사용
- 상위 문제로부터 시작하여 하위 문제로 계층적 접근
- 일반적으로 도표 형식으로 표현되어 쉽게  파악 가능

- 주의할 점: 이벤트 효과 같은 해결책은, 로직트리 가지에 넣지 않아야 함 

- 로직트리 Cheat Sheet (ex. 네스카페 로직트리)

 

 

- 문제정의 핵심

 : 문제의 명확한 정의 > 해결을 위한 데이터 분석 방향성 > 결과 정리 해석 > 새로운 액션플랜 수립 

 : SO WHAT?

   └ 그래서 결국 어떻다거지? 앞에 오는 정보에 맞는 중요한 결과/핵심를 추출하는 작업

 : WHY SO? 

  └ 왜 그러게 말할 수 있지? SO WHAT의 타당성 및 자료의 구체적인 의미를 검증하고 확인하는 작업 

 

- 문제정의 팁

 : 결과를 공유하고자 하는 사람이 누구인지 정의하기
 : 결과를 통해 원하는 변화를 생각하고, (가능하면) 경영자 입장에서 바라보기 

 : 혼자서 충분히 고민하는 시간을 갖되, 다른 사람들과도 의견 나누기 

 

 

3. 데이터의 유형

- 정성적 데이터  vs 정량적 데이터

└ 정성적 데이터(Qualitative Data)
 : 비수치적인 정보로 사람의 경험, 관점, 태도와 같은 주관적인 요소 포함
 : 대부분 텍스트, 비디오, 오디오 형태로 존재해 데이터로 구조화하기 어려움 
 : 새로운 현상이나 개념에 대한 이해를 심화하는데 사용

정량적 데이터(Quantitative Data)
 : 수치적 정보로 숫자 형태로 존재하기 때문에 지표 생성이 용이하고 통계적으로 분석 가능 

 : 정성적 데이터에 비해 객관성이 높고, 주로  설문조사, 실험, 인구통계, 지표 분석 등에 활용

구분 정량적 데이터 정성적 데이터
유형 정형/반정형 데이터 비정형 데이터
특징 및 관점 여러 요소의 결합으로 의미 부여
주로 객관적 내용
객체 하나가 함축된 의미 내포
주로 주관적 내용
구성 및 형태 수치나 기호
데이터베이스, 스프레드시트
문자나 언어
웹 로그, 텍스트 파일
위치 DBMS, 로컬 시스템 등 내부 웹사이트, 모바일 플랫폼 등 외부
분석 통계 분석 시 용이 통계 분석 시 어려움

 

 

4. 지표 설정

- 정의

: 특정 목표나 성과를 측정하기 위한 구체적이고 측정 가능한 기준
: 목표 달성도를 평가하고 전략적 결정에 필요한 핵심 정보를 제공
: 문제 정의는 '어떤 문제를 풀고자 하는가?'라면, 지표는 '어떤 결과를 기대하는가?'에 대한 정량화된 기준

 

 

- 주요 지표 이해하기

① Active User (활성유저)

  : 서비스에 들어오는 모든 유저? x
  : 서비스마다 정의가 다르며, 정의에 따라 전략과 방향성, 이탈 유저정의 등이 달라짐
  : 투자 및 서비스 개선에 중요한 역할 
   (ex)  Active User 설정 사례 


② Retention Ratio (재방문율)


  : 서비스를 사용한 사람이 다시 서비스를 사용하는 비율 %

  : 한번 획득한 유저가 서비스로 다시 돌아왔는가?에 대한 지표로 활성 기준은 서비스에 따라 다름 

  : 리텐션이 높으면 고객획득에 투자한 비용을 빠르게 회수 가능해 서비스(특히 앱) 성장에서 매우 중요한 지표 

  : 통상 리텐션은 시간이 지나면서 자연스럽게 감소 > 감속폭이 완만해지며 안정화되면 시장에 적합한 서비스!     
 

  (측정방법1) N-Day 리텐션

 : 최초 사용일로부터 N일 후에 재방문한 Active User의 비율
 : 일반적으로 사용하는 리텐션 지표로, 게임, 소셜 등 매일 접속 및 반복 행동을 유도하는 제품에 적합

 : 유저가 Active User로 집계된 최초 날을 Day 0으로 설정 & 액티브 상태 된 후 N일차 리텐션 계산

 : 서비스 사용주기가 길면 리텐션이 과소 평가될 여지가 있으며, 경우에 따라 N-Week, N-Month도 가능      

 

 (측정방법2) Unbounded 리텐션

 : 특정 날짜를 포함하여 그 이후에 한 번이라도 재방문한 유저의 비율

 : 사용 빈도가 높지 않은 서비스에 활용하기 적절한 지표(채용 사이트, 부동산 매물 서비스 등)
 : Unbounded 리텐션은 이탈률의 반대 개념

 : 마지막 방문일 이전에 방문하면, 실제로 방문하지 않은 날도 방문한한 것으로 계산

 : 시간 흐름에 따라 리텐션 추가 발생시 이전 리텐션 값이 모두 변동되는 문제가 있음

  └ 절대적인 수치보다는 지표의 변화 트렌드를 보는 용도로 활용 권장

  (측정방법3)  Bracket 리텐션
  : 설정한 특정 기간을 기반으로 재방문율을 측정 ex. 1(0일차) / 2(1-3일차) / 3(4-6일차) / 4(7-11일차)
  : Bracket 리텐션은 N-Day 리텐션을 확장한 개념 > 일/주/월 단위가 아닌 지정한 구간으로 나눔
  : 활성유저가 특정한 활동을 위해 각 Bracket 내 서비스에 재방문시 잔존 유저로 해석

  : 서비스 사용주기가 길거나 주기적인 경우 사용하기 적합한 지표(식료품 배달 서비스 등)   

 

 


    - Retention을 활용법 
  : 리텐션이 높은 세그먼트를 발굴 가능 
  : 서비스의 사용 주기에 따라 리텐션 조회 기간 조정 
  : 사후 분석 시 용이
 
③ Funnel (퍼널)


  : 퍼널은 잠재고객을 유입시키며 최종적인 목표 액션을 달성할 때까지의 과정
  : 모든 서비스와 비즈니스는 각 단계로 갈 수록 이용자 수가 줄어들게 됨
  : 각 단계의 전환율 (or 첫 유입 대비 전환율)을 측정 & 이탈 지점 구조화 

 

- AARRR
  └ Acquisition: 유입 / Activation: 활성화 / Retention: 재방문(재구매) / Revenue: 수익 / Referral: 추천

 : 디지털 마케팅시 퍼널을 활용하는 프레임워크

 : 단계별 전환율을 지표화 하여 서비스 보완 지점을 찾음


④ LTV (Life Time Value, 고객 평생 가치)

  : 한 명의 유저가 생애 주기* 동안 얼마만큼의 이익을 주는지를 정량적으로 지표화 한 것

   * 고객 생애 주기: 한 명의 유저가 서비스를 사용하기 시작하여 이탈할 때까지의 기간  

 : LTV는 유저와의 관계를 측정하고, 이를 사업적 이익으로 가져가는데 중요한 지표
 : LTV가 높다는 것은 해당 서비스와 관계가 좋고, 충성도가 높은 고객이 많다는 것

 : LTV에 따라 CAC(Customer Acquisition Cost) 산출 및 효율적인 예산 운용이 가능
 
(LTV 산출 방법)

└ 산출법은 매우 다양하며 서비스/관점에 따라 다각도로 고민 필요 
- 이익 x Life Time x 할인율(미래 비용에 대한 현재 가치)
- 연간 거래액 x 수익률 x 고객 지속 연수
- 고객의 평균 구매 단가 x 평균 구매 횟수
- (매출액 – 매출 원가) / 구매자 수
- 평균 구매 단가 x 구매 빈도 x 구매 기간
- (평균 구매 단가 x 구매 빈도 x 구매 기간) – (신규 획득 비용 + 고객 유지 비용)
- 월 평균 객단가 / 월 가중 평균 잔존율

 

(LTV 정리)

: LTV를 늘리기 위한 방안
 └ 객단가 상승 / 구매 빈도를 높임 / 이탈률 감소, 이용시간을 증가 등
: LTV는 가정을 베이스로 하는 지표이기 때문에 꾸준한 모니터링이 필요
: LTV에 관심이 더 생긴다면 읽어보면 좋을 자료들
   [PAP Excel로 Retention 변화에 따른 LTV 시뮬레이션하기](https://playinpap.github.io/retention-ltv-simulation/)
   [토스 - 무한한 사업 전략의 세계로 건너가는 법](https://blog.toss.im/article/tossbdm)

   [EO planet - 이제 LTV(고객생애가치)를 정확히 계산해 봅시다](https://eopla.net/magazines/1519)
    

- 북극성 지표

 : 제품/서비스가 유저에게 주는 core value를 가장 잘 나타낸 것으로 제품/서비스의 ‘성공’을 정의
 : 장기 성장을 위해 필수적으로 모니터링 해야 함

 

① 특징 

 : 제품/서비스 전략의 핵심
 : 유저/고객이 제품/서비스에서 느끼는 가치

 : 회사의 사업 목표를 나타내는 지표 중 선행지표 (후행X)

 

② 좋은 북극성 지표를 위한 체크리스트
 □ 유저가 목적을 달성하는 때가 언제인가?

 □ 모든 유저가 해당되나?
 □ 측정 가능한 지표인가?
 □ 측정 주기가 적절한가? (일, 주, 월, …)
 □ 외부 요인으로부터 영향을 많이 받진 않는가?
 □ 북극성지표의 성장이 사업의 성장과 함께하는가?
 □ AARRR 퍼널 전 과정이 북극성 지표에 영향을 주는가?
 □ 북극성 지표의 변화가 적어도 매주 관찰가능한가?

 

(cf) 나쁜 북극성 지표의 예: 회원가입수, DAU, 리텐션, 다운로드수, 페이지뷰 수 등

외부 요인을 받거나, 전체 여정을 반영하지 않거나, 유저/고객이 직접 가치를 느낄 수 없거나, 츨정 불가능 한 경우 

 

③ 북극성 지표의 유형

 

④ 북극성 지표가 중요한 이유

 └ 방향성 

  : 제품/사업 조직 무엇을 포기하고 어느 것을 최적화 해야 하는지 방향성 제시 
  : 제품/사업 조직의 진척과 가치창출을 전사에 보여줘 적극적인 지원 유도 및 액션 실행 속도 개선
  : 비즈니스 임팩트에 따라 평가가 가능해지고, 결과에 책임을 지도록 함

 └ 효율 증대

  : 전 직원을 하나의 목표에 집중시킴
  : 서로 상반된 목표에 집중하거나, 중복으로 일하는 것을 방지 (MECE한 구조)

 

⑤ 북극성 지표의 구조 

 

 

5. 결론 도출 

- 결과와 결론의 차이

└ 결과 (보통 많이 말하는 것)  - 무엇을

 : 계산과 분석을 해서 나온 결과물

 : 데이터 처리, 분석, 모델링 후에 얻어진 구체적인 데이터의 출력
 : 숫자, 통계, 그래프, 차트 등의 형태로 나타낼 수 있음
(ex) 고객 설문 조사 데이터 분석 결과, 고객 만족도와 구매 빈도 사이에 강한 상관관계가 있음이 나타났다. 

 

결론 (실제로 우리가 필요한 것) - 그것이 왜 중요하지? 
 : 목적에 대해 어떤 의미가 있는지 설명하는 것
 : 분석된 데이터 결과를 바탕으로 이끌어낸 의미나 통찰
 : 데이터에 기반한 해석, 추론 또는 권고 사항을 포함
(ex) 고객 만족도와 구매 빈도 사이의 강한 상관관계가 나타난 결과를 토대로, 고객 만족도 향상이 전반적인 매출 증가로 이어질 수 있다는 결론을 내릴 수 있다.

 

- 결론 도출 시 주의사항
 : 결과 - 결론 도출 시에는 스토리텔링이 필요
 : 데이터를 통해 알 수 있는 범위에서만 생각해야 하지, 필요 이상으로 자기 해석을 융합하면 안됨 

 

- 결론을 잘 정리하는 법

 : 문제 정의, 지표 설정 당시의 목적 떠올리기
 : 결론을 공유할 대상이 누구이며, 어떻게 변화하길 원하는지? 생각하기

①  단순하고 쉽게 전달
 : 핵심 지표 위주로 전달 하되, 해당 지표에 오너십이 있는 조직에서 활용할만한 포인트 제안 
 : 액션 아이템을 제안 하는것이 핵심
 : 지표를 해석하는 방법에 대해서도 설명

② 흥미 유발
 : 상대가 궁금해할만한 내용은 뭘까? 고민하고 필터링 하기 (모든 내용 X)
 : 궁금한 사람들을 위해서는 디테일한 문서 따로 공유

③ 대상자 관점에서의 접근
 : 공유 받는 사람의 시선에서 이해하기 쉽도록 정리
 : 논지를 뒷받침 해줄 자료 함께 첨부하고 허들이 낮은 시각화 활용

④ 시각화 팁
 : 화려한 그래프 보다는 대상이 직관적으로 이해할 수 있도록 구성
 : 보통 선, 막대 그래프로 거의 대부분의 리포팅이 가능
 : 각 그래프의 범례와 단위 함께 표기해주기

⑤ 결론 보고서에 쓰면 좋은 플로우
 : 전체 내용을 한 문장으로 요약
 : 해당 보고서의 메인 주제

 : 해당 보고서를 쓴 이유와 원하는 변화
 : 문제 정의 단계
 : 핵심 내용 전개
 : 결론 및 액션 아이템

- 결국 데이터 리터러시란? 왜?를 항상 생각하기

 

(참고도서)

빅데이터 시대, 성과를 이끌어 내는 데이터 문해력 / 카시와기 요시키 저

로지컬 씽킹 / 데루야 하나코, 오카다 게이코 저


[SQL 코드카타]

 

1. SQL 작동 원리 고민하고 쿼리를 짜야   

1251. Average Selling Price https://leetcode.com/problems/average-selling-price/

 

1) 어떤 문제가 있었나

현재 행과 이전행 값을 활용해 계산해야 한다는 생각에 빠져 쿼리를 지나치게 복잡하게 작성 

 

2) 내가 시도해본 건 무엇인가

GROUP 적용하면 같은 그룹 행 값이 모두 SUM되는데, 그 원리를 생각하지 못함

현재 행과 이후 행의 값을 더해햐 한다는 생각에 SUM 윈도우 함수에 ROWS 범위 값을 활용함 

SELECT product_id, 
        case when each_values <> totla_price and quantity <> units then round(totla_price/quantity,2)  
        else null end average_price 
  FROM 
       (SELECT p.product_id, 
                P.price, 
                U.units, 
                P.price*U.units each_values, 
                sum(P.price*U.units) over (partition by P.product_id order by units rows between current row and 1 following)totla_price, 
                sum(units) over (partition by P.product_id order by units rows between current row and 1 following) quantity
        FROM Prices P
        left JOIN UnitsSold U ON P.PRODUCT_ID = U.PRODUCT_ID 
            AND U.purchase_date BETWEEN P.start_date AND end_date  
        )A
  group by 1;

 

3) 어떻게 해결했나

다른 풀이를 통해 보다 간결한 쿼리를 숙지하고 다시 타이핑 해봄 

SELECT p.product_id, IFNULL(round(SUM(p.price*u.units)/sum(u.units),2),0) as average_price
FROM Prices p 
LEFT JOIN UnitsSold u
ON p.product_id = u.product_id AND 
u.purchase_date BETWEEN p.Start_date and p.end_date
GROUP BY p.product_id

 

4) 무엇을 새롭게 알았나

- IFNULL(Column명, "Null일 경우 대체 값") 

: 해당 Column의 값이 NULL을 반환할 때, 다른 값으로 출력할 수 있도록 하는 함수

: IF(IS NULL(칼럼명),  "Null일 경우 대체 값", 칼럼명) IF절과 동일한 내용 

 

2. 최종 값을 출력 할 때는 distinct가 필요할지 한 번 더 체크해야  

1633. Percentage of Users Attended a Contest
https://leetcode.com/problems/percentage-of-users-attended-a-contest/

1) 어떤 문제가 있었나

퍼센테이지를 구하는 문제에서 2개 테이블을 join 후, contest_id별 group by 설정을 해두니 
전체 user_id 숫자(절대값)가 나오지 않고, 그룹핑 적용된 테이블 내 contest_id별 user_id 수만 추출됨
(모든 컨테스트별 비율이 100%로 환원)

 

2) 내가 시도해본 건 무엇인가

서브쿼리로 user 테이블의 유저수를 별도 추출하여 계산식에 삽입 

3) 어떻게 해결했나

SELECT contest_id, round(COUNT(contest_id)/(select count(*) from Users)*100,2) percentage 
 FROM Register r 
 group by contest_id
 order by percentage desc, contest_id


4) 무엇을 새롭게 알았나

정답처리되긴 하였으나, 값의 중복이나 null값을 고려하여 distinct나 count(user_id) 활용 필요 

SELECT contest_id, round(COUNT(distinct contest_id)/(select count(user_id) from Users)*100,2) percentage 
 FROM Register
 group by contest_id
 order by percentage desc, contest_id