TIL(24.06.04.)

codataffee·2024년 6월 4일

TIL

목록 보기
57/135
post-thumbnail

#INTRO

이제 6시에 해가 다 뜬다 !

오늘도 힘내보자.


#코드카타 (09:00 ~ 10:00)

  • KATA #53

  • SQL

    • 문자열 길이 구하기
      LENGTH() : Byte 수 조회 (한글의 정확한 글자 수를 알기가 어렵다.)
      CHAR_LENGTH() : Byte 수가 아닌 단순히 문자의 수 조회 (한글의 글자 수를 알기 위해 사용)
    • CTE 생성 후 행 붙이기 : UNION
  • PYTHON

    • 리스트 컴프리헨션으로 조건에 맞는 문자열 만들기
      answer = [alp[0].upper() + alp[1:].lower() if alp else "" for alp in splits]
    • if alp 조건 평가 :
      alp 가 빈 문자열이면 False, 값이 있으면 True 반환
      따라서 alp 가 빈 문자열이 아닌 경우 alp[0].upper() + alp[1:].lower()를 실행
    • alp[0].upper() :
      alp의 첫 번째 문자(alp[0])를 대문자로 변환
      예시) alp가 "hello"라면, alp[0]은 "h"이고, 대문자로 변환하여 "H"가 된다.
    • alp[1:].lower() :
      alp의 첫 번째 문자를 제외한 나머지 문자들(alp[1:])을 소문자로 변환
      예시) alp가 "hello"라면, alp[1:]은 "ello"이고, 소문자로 변환하여 "ello"가 된다.
    • 두 문자열을 합쳐 첫 글자는 대문자, 나머지는 소문자인 "Hello" 가 완성

#SQL 챌린지 과제 (10:00 ~ 12:00)

  • SQL#CHALLENGE4-1

  • 코호트 리텐션을 구하는 문제들을 풀어보고 정리해봤는데,
    WITH 문을 활용해 원하는 기간의 유저나 활동을 조회하는 CTE 를 만들고,
    각 테이블을 조인하거나 테이블과 테이블 관계를 이어지게 조회하여 원하는 데이터를 출력하는 형태로 리텐션을 구할 수 있었다.

  • 특정 월에 첫 주문을 한 고객 중에서
    다음 달에도 주문한 고객의 비율을 백분율로 계산
    하는
    쿼리 중 일부를 자세히 뜯어서 살펴보면,

ROUND(
    (
        COUNT(DISTINCT CASE 
            WHEN DATE_FORMAT(DATE_ADD(first_order_date, INTERVAL 1 MONTH), '%Y-%m') = order_month 
            THEN f_cn 
            ELSE NULL 
        END) / COUNT(DISTINCT f_cn)
    ) * 100, 
    2
) AS month1
  • DATE_ADD(first_order_date, INTERVAL 1 MONTH) :
    DATE_ADD 함수는 first_order_date에 1개월을 더한 날짜를 계산한다.
    예를 들어, first_order_date가 2023-06-01이면, 이 부분은 2023-07-01 이 된다.

  • DATE_FORMAT(..., '%Y-%m') :
    DATE_FORMAT 함수는 날짜를 'YYYY-MM' 형식의 문자열로 변환해준다.
    위의 DATE_ADD 결과가 2023-07-01이라면, 이 부분은 2023-07이 된다.

  • CASE WHEN ... THEN ... ELSE NULL END :
    DATE_FORMAT으로 변환된 날짜가 order_month와 같은지 확인하여
    order_month가 2023-07이라면 f_cn (고객 번호)를 반환하고,
    그렇지 않으면 NULL을 반환한다.

  • COUNT(DISTINCT ...):
    다음 달에 주문한 고유한 고객의 수를 센다.
    CASE 문에서 조건이 참인 경우의 f_cn을 세므로,
    특정 월에 첫 주문한 고객 중 다음 달에도 주문한 고객 수를 구할 수 있게 된다.

  • COUNT(DISTINCT f_cn) :
    첫 주문 월에 주문한 고유한 고객의 수를 센다.

  • (COUNT(DISTINCT CASE ... END) / COUNT(DISTINCT f_cn)) :
    다음 달에 주문한 고객 수를 첫 주문 월의 전체 고객 수로 나눠
    다음 달에도 주문한 고객의 비율을 구한다.

  • (... * 100) :
    비율에 100을 곱해 백분율로 변환

  • ROUND(..., 2) :
    최종 결과를 소수점 두 자리로 반올림하여 출력


#SQL 챌린지 세션 (14:00 ~ 15:00)

피벗(PIVOT) 테이블 만들기
+) 퍼널 분석, 코호트 리텐션 분석 과제 리뷰

  • 퍼널 분석에서 제출했던 과제에 큰 결점이 있었다는 것을 알게 되었다.

    • 요약하자면,
      A 이벤트 다음 B 이벤트로 전환되는 행동에 대한 전환율을 구하는 것인데,
      내가 짠 쿼리는 이벤트의 전, 후 순서에 상관없이 전환이 되는 경우도 포함했고,

    • 이벤트의 전, 후 시간을 AND 조건으로 비교하는 쿼리를 포함해야
      순서에 맞는 전환율을 구할 수 있었다.

      *퍼널 조건을 명시했기 때문에 
        선행되는 단계가 후행 단계보다 먼저 진행되었어야 한다는 조건이 필요하다. 
        예시 : AND ei.info_time <= cs.signup_time 

#빅분기(실기) 작업형2 복습 및 정리 (17:00 ~ 22:00)

  • PYTHON#22

  • 하이퍼 파라미터 튜닝 (랜덤포레스트, xgboost)

  • 랜덤 포레스트의 하이퍼 파라미터 튜닝은
    max_depth (트리의 깊이)n_estimators (트리의 갯수)를 조절할 수 있다.

    평균적인 조절값 :
    max_depth = 3 ~ 12
    n_estimators = 100 ~ 1000

  • xgboost 의 하이퍼 파라미터 튜닝은
    max_depth (트리의 깊이), n_estimators (트리의 갯수), learning_rate (학습률)을 조절할 수 있다.

    평균적인 조절값 :
    max_depth = 3 ~ 12
    n_estimators = 100 ~ 1000
    learning_rate = 0.1 ~ 0.01
    XGB는 n_estimators에 반비례하여 learning_rate 를 조절해줘야 함.


+) 사이드 프로젝트 (2024.06.03. ~ )

  • 목적
    파이썬 datapane 라이브러리를 활용하여 데이터 분석 및 시각화 대시보드 만들어보기
  1. 데이터 정하기

    • 코로나 데이터 (결정)
    • 이커머스 데이터
    • 야구, 축구 등 스포츠 데이터
  2. 코로나 데이터로 대시보드 만들기 ?

    • 데이터가 적합한지?
    • 부족하다면 어떤 데이터를 가져올 것인지?
    • 어떤 목적의 대시보드를 만들 것인지?
  3. 다음 회의까지 코로나 데이터 및 대시보드 레퍼런스 체크하기


#OUTRO

오늘의 한 줄.

진짜.. 시간 도둑이 따로 없군 !

profile
커피 좋아하는 데이터 꿈나무

0개의 댓글