[내배캠] 데이터분석 6기/본캠프 기록

[본캠프 13일차] 파이썬 코드카타, SQL 코드카타, 데이터 리터러시 공부, 아티클 스터디②

물맨두 2025. 3. 6. 23:07

 

오늘 한 일은,

  • 파이썬 공부
    • [코드카타] 어제 푼 문제 복습 (45~47번)
    • [코드카타] 파이썬 1문제 풀기 (48번)
  • SQL 공부
    • [코드카타] 어제 못 푼 문제(59번) 다시 풀기
    • [코드카타] SQL 2문제 풀기 (59~60번)
    • 내일 QCC 대비로, 코드카타 푼 문제들 복습(Lv.2~Lv.3 문제들 위주로) 
    • [라이브 세션] 7회차 수강
  • 두 번째 아티클 스터디 진행 (누적은 17번째(11+4+2)
  • [데이터 리터러시] 1주차 1-4 수강
  • [ADsP 자격증 챌린지] 7주차 7-1~7-2 수강

 

파이썬 공부①: 어제 푼 문제 복습(45~47번)

바로 어제 풀었는데 바로 다음날 똑같이 헤매는 사람이 있다? 댓츠 미~~

… …

오늘은 복습할 때 제대로 못 푼 문제가 있었다.

 

45. 시저 암호

def solution(s, n):
    answer = ''
    for i in s:
        if ' ' in s: #s에 공백을 포함한다면~
            answer += ' '
        else:
            if i.isupper():
                answer += chr((ord(i)-ord('A')+n)%26+ord('A'))
            elif i.islower():
                answer += chr((ord(i)-ord('a')+n)%26+ord('a'))
    return answer

처음 이렇게 작성했더니 테스트 케이스에서 마지막 기댓값이 아닌 공백이 출력됐다.

 

다시 코드를 확인해보니 공백을 판단할 때 if 조건에 s에 공백이 있으면(' ' in s)이라고 작성해서 벌어진 문제였다.

원인을 파악한 후 다음과 같이 코드를 수정했다. 

def solution(s, n):
    answer = ''
    for i in s:
        if i == ' ': #i가 공백이라면~
            answer += ' '
        else:
            if i.isupper():
                answer += chr((ord(i)-ord('A')+n)%26+ord('A'))
            elif i.islower():
                answer += chr((ord(i)-ord('a')+n)%26+ord('a'))
    return answer

 


 

파이썬 공부②: 코드카타 문제 풀기(48번)

48. K번째 수

배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.
배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.

def solution(array, commands):
    answer = []
    for a in commands:
        i = a[0]
        j = a[1]
        k = a[2]
        
        memo = array[i:j]
        memo.sort()
        answer.append(memo[k])
    return answer

처음엔 이렇게 작성했다. 

이 코드를 실행하니 리스트의 인덱스가 범위를 벗어난다는 에러 메시지가 떴다.

 

중간에 print(memo)를 추가해서 memo에 어떻게 담기고 있는지 확인했더니 지정한 범위의 끝에 있는 있는 값이 memo에 담기고 있지 않았다.

array의 첫 번째 값을 불러오려면 array[0]이라고 해야 한다는 점을 반영하여 코드를 수정했다.

def solution(array, commands):
    answer = []
    for a in commands:
        i = a[0]
        j = a[1]
        k = a[2]
        
        memo = array[i-1:j]
        memo.sort()
        answer.append(memo[k-1])
    return answer

 

 


 

SQL 공부①: 어제 못 푼 문제 다시 풀기(59번)

59. 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기

(출처: 내 티스토리)

우선 어제 못 푼 문제가 있어서 이 문제에 대한 질문부터 올리고 다시 풀어보기로 했다.


( 👇 어제 시도했던 쿼리 보러 가기 👇 )

 

 

[본캠프 12일차] ADsP 공부, 데이터 리터러시 공부, 파이썬 코드타카, SQL 코드카타

오늘 한 일은,[ADsP 자격증 챌린지] 6주차 수강하기[데이터 리터러시] 1주차(1-1~1-3) 수강하기파이썬 공부[코드카타] 어제 푼 문제 복습 (42~44번)[코드카타] 파이썬 3문제 풀기 (45~47번)SQL 공부[코드카

maandoo.tistory.com


250306 떠먹여주는 수준으로 친절하신 튜터님 답변

즉 내가 car_id별 1건만 보겠다고 해당 car_id의 가장 최근 기록 1개만 선택한 조건이 잘못된 방식이었다.

그러니 car_id별 2022년 10월 16일 기준으로 availability 컬럼의 값이 1건만 조회되도록 하기 위해선 다른 방식으로 작성해야 했다.

SELECT car_id, 
       CASE WHEN car_id IN(SELECT car_id
                           FROM car_rental_company_rental_history
                           WHERE '2022-10-16' BETWEEN start_date AND end_date) 
                           THEN "대여중" ELSE "대여 가능" END availability
FROM car_rental_company_rental_history
GROUP BY car_id
ORDER BY car_id DESC

이렇게 작성하면,

  • ① 2022년 10월 16일이 start_date~end_date에 포함되어 있다면 
  • ② 해당 조건을 충족하는 car_id들을 조회하는데 
  • ③ 그 car_id들 중에 해당 car_id가 있다면 '대여중', 없으면 '대여 가능'으로 값을 부여함

그리고 위의 과정을 car_id별로 진행하게끔 GROUP BY절을 작성한다.

 

서브쿼리를 이렇게도 쓸 수 있구나…


SQL 공부②: 코드카타 풀기(60번)

오늘은 내일 첫 번째 QCC 전에 이전에 푼 SQL 문제들을 다시 풀어보고 싶어서 코드카타 문제를 새로 많이 풀기보다 하나만 풀고 복습에 더 시간을 쓰도록 했다.

60. 년, 월, 성별별 상품 구매 회원 수 구하기

USER_INFO 테이블과 ONLINE_SALE 테이블에서 년, 월, 성별 별로 상품을 구매한 회원수를 집계하는 SQL문을 작성해주세요. 결과는 년, 월, 성별을 기준으로 오름차순 정렬해주세요. 이때, 성별 정보가 없는 경우 결과에서 제외해주세요.

SELECT YEAR(os.sales_date) year,
       MONTH(os.sales_date) month,
       ui.gender,
       COUNT(ui.gender) users
FROM online_sale os LEFT JOIN user_info ui ON os.user_id = ui.user_id
WHERE ui.gender IS NOT NULL
GROUP BY YEAR(os.sales_date), MONTH(os.sales_date), ui.gender
ORDER BY YEAR(os.sales_date), MONTH(os.sales_date), ui.gender

처음에 이렇게 작성했더니 틀렸다고 했다.

그래서 '왜지?' 하고서 COUNT() 함수를 적용할 컬럼을 이리저리 바꾸다가 갑자기 정답을 맞춰버렸다..

SELECT YEAR(os.sales_date) year,
       MONTH(os.sales_date) month,
       ui.gender,
       COUNT(DISTINCT os.user_id) users
FROM online_sale os LEFT JOIN user_info ui ON os.user_id = ui.user_id
WHERE ui.gender IS NOT NULL
GROUP BY YEAR(os.sales_date), MONTH(os.sales_date), ui.gender
ORDER BY YEAR(os.sales_date), MONTH(os.sales_date), ui.gender

 

(좌) 오답: COUNT(ui.gender) 사용 / (우) 정답: COUNT(DISTINCT os.user_id) 사용

일단 내가 COUNT(os.user_id)를 쓴 것도 회원 수를 세라고 했으니까 user_id 컬럼을 사용해야 하지 않을까 싶어서다.

그러나 오답이 나왔고, 그 다음으로 시도한 것이 COUNT(DISTINCT os.user_id)다. 그랬더니 통과됐다.

 

'user_id는 어쨌든 회원마다 고유한 값이니까 그냥 세도 되지 않나?' 싶었는데,

생각해보니 해당 월에 어떤 회원은 2번 샀을 수도 있으니까 그러면 중복으로 세지는 것인가 싶기도 했다.

 

2022년 3월에 상품을 구매한 고객의 성별과 회원 아이디

그래서 데이터 건수가 적은 2022년 3월 데이터를 기준으로 성별과 회원 ID를 조회해봤더니 user_id가 68인 사람이 2번 조회되는 것을 보면 이래서 COUNT(DISTINCT os.user_id)로 적어야 함을 깨달았다.

 


 

데이터 리터러시 공부: [데이터 리터러시] 1주차 수강

지표 설정

지표

  • 지표
    • 특정 목표나 성과를 측정하기 위한 구체적이고 측정 가능한 기준
      • 목표 달성도를 평가하고 전략적 결정에 필요한 핵심 정보를 제공
      • 정의한 문제를 정확하게 파악하기 위해서 필요
    • '문제 정의'와 '지표 설정'을 비교했을 때,
      • 문제 정의 : 어떤 문제를 풀고자 하는가, 둘 이상의 해석이 존재하지 않도록 구체적으로 표현했는가
      • 지표 설정 : 어떤 결과를 기대하는가, 정의한 문제를 확인하는 데 적합한가 

주요 지표

  • Active User (활성 사용자)
    • 제품/서비스를 사용하는 실제 사용자 (제품/서비스를 이용하는 모든 유저 X)
      • 어떻게 Active User를 정의하느냐에 따라 조직의 전략과 뱡향이 달라짐
      • Active User 정의에 따라 '이탈 사용자' 역시 정의됨
      • 투자를 위한 서비스 지표에 중요한 역할을 함
      • Active User를 설정함에 있어서 정밀도와 허들이 높아질수록 Active User로 잡히는 사용자 수는 적어질 수밖에 없음
    • Active User를 정의할 때 던져볼 질문
      • 어디까지 경험한 사용자를 Active User로 삼을까?
      • 일반 사용자와 활성 사용자를 나누는 기준은 무엇일까?
      • 사용자는 어디에서 우리의 제품/서비스에서 효용성을 느낄까?
      • 우리가 제어할 수 있는 사용자 수는 얼마나 될까?
    • 그밖에 Active User와 함께 사용하는 주요 지표들

  • Retention Ratio (재방문율)
    • 몇 퍼센트의 사용자가 우리의 제품/서비스를 다시 찾는지를 보여주는 지표
      • Retention Ratio가 높은 서비스는 획득 비용에 투자한 비용을 빠르게 회수할 수 있음
      • 서비스(특히 앱 서비스) 성장에 있어서 매우 중요함
      • 기본적으로 방문을 기준으로 Retention을 측정하지만, 서비스 특성에 따라 기준을 다르게 정의할 수 있음
    • Retention Ratio 측정법
      • 1) N-Day 리텐션
        • 최초 사용일로부터 N일 후 재방문한 Active User의 비율
        • 습관적으로 사용하거나 반복적으로 행동을 유도하는 제품/서비스에 적합 (ex. 게임, SNS)
          ( = N-day 리텐션 : 용자가 매일 접속하는 서비스에 활용하기 적절함)
        • 사용자가 Active User로 집계된 최초의 날을 Day 0으로 설정
          ( = Day 0에 액티브 상태가 된 모든 유저들의 N일차 리텐션을 계산)
        • N-Week, N-Month도 가능
      • 2) Unbounded 리텐션
        • 특정 날짜를 포함하여 그 이후에 재방문한 사용자의 비율
          (그 날짜 이후에 한 번이라도 재방문했다면 해당 유저들을 Active User로 간주)
        • 사용자가 정기적으로 찾는 제품/서비스가 아니라면(= 사용 빈도가 높지 않은) 적합
          (ex. 채용 사이트, 쇼핑몰, 부동산 매물 서비스 등)
        • Unbounded 리텐션 = 이탈률의 반대 개념
        • 절대적인 수치로 보기보단 지표의 변화를 추적하며 추이를 보는 용도로 활용하는 편이 좋음
      • 3) Bracket 리텐션
        • 특정 기간을 기반으로 재방문한 사용자의 비율
          N-Day 리텐션을 확장한 개념 → 일/주/월 단위가 아닌 지정한 구간으로 나눔
        • Active User가 특정 활동을 위해 각 Braket 내에 제품/서비스를 다시 찾았을 경우 잔존 사용자로 해석함
        • 하루 정도는 제품/서비스를 찾지 않아도 리텐션에 영향을 주지 않는 점에서 기준이 상대적으로 널널함
        • 서비스 사용 주기가 길거나 주기적인 경우에 사용하기 적합 (ex. 식료품 배달 서비스, 세차 서비스)
    • Retention Ratio 활용법
      • 리텐션이 높은 세그먼트를 발굴하는 작업이 필요
        • 리텐션이 높은 세그먼트는 무엇인지
          어떤 식으로 세그먼트를 나눴을 때에 어떤 세그먼트에서 리텐션이 높게 집계되는지
          그렇다면 이를 바탕으로 어떤 행동을 유도하여 특정 세그먼트로의 전환을 끌어낼 수 있는지
      • 서비스 사용 주기에 따라 리텐션 조회 기간을 조정해야 함
        • 1년에 한 번 사용하는 서비스인데 3개월 간의 리텐션을 따져보는 건 의미 없는 짓임
      • 사후 분석에 용이함
  • Funnel (퍼널)
    • 잠재 고객을 유입시키고 최종적인 목표 액션을 달성할 때까지의 과정을 구조화한 모델
      • 분석을 통해 '유저들이 어디서 이탈하는가'를 확인함
      • 각 단계의 전환율(혹은 첫 유입 대비 전환율)을 측정
    • AARRR
      • 사용자의 서비스 이용 흐름을 기반으로,
        Acquisition(고객 유치) → Activation(활성화) → Retention(재방문/재구매) → Revenue(수익) → Referral(추천)으로
        단계를 나눠 전환율을 지표화하여 서비스의 보완 지점을 파악함

  • ④LTV(Life Time Value, 고객 평생 가치)
    • 한 명의 사용자가 생애 주기 동안 얼만큼의 이익을 주는지를 정량적으로 지표화한 것
      • 고객 생애 주기 : 한 명의 사용자가 서비스를 사용하기 시작 ~ 서비스를 이탈하기까지의 기간
      • 해당 지표를 통해 사용자와의 관계를 측정하고, 이를 사업적 이익으로 가져가는 데 중요한 지표
      • LTV가 높다 = 해당 서비스와의 관계가 좋고 충성도 높은 고객들이 많다
      • 가정에 기반한 지표라는 점에서 꾸준한 모니터링이 필요함
      • LTV를 추측할 수 있다면 신규 유저를 데려오는 비용(Customer Acquisition Cost, CAC)의 산출 및 효율적인 예산 운용이 가능
    • LTV 산출법
      • LTV를 산출하는 방법은 여러 가지이고, 서비스와 관점에 따라 방법들이 다 다르기 때문에 다각도로 고민해야
        ; 자사 서비스에 딱 맞는 LTV를 산출하는 일은 어려움 (∵사용 주기, 변수, 객단가 등을 고려해야 하기에)
      • 참고할 만한 LTV 산출법
        • 이익 x Life Time x 할인율(미래 비용에 대한 현재 가치)
        • 연간 거래액 x 수익률 x 고객 지속 연수
        • 고객의 평균 구매 단가 x 평균 구매 횟수
        • (매출액 – 매출 원가) / 구매자 수
        • 평균 구매 단가 x 구매 빈도 x 구매 기간
        • (평균 구매 단가 x 구매 빈도 x 구매 기간) – (신규 획득 비용 + 고객 유지 비용)
        • 월 평균 객단가 / 월 가중 평균 잔존율
      • 더보기
        LTV 관련 참고할 만한 아티클

        송형근, "Excel로 Retention 변화에 따른 LTV 시뮬레이션하기", pap, 2022.07.12.
        https://playinpap.github.io/retention-ltv-simulation/
        이지현, "무한한 사업 전략의 세계로 건너가는 법", tossfeed, 2023.02.22.
        https://blog.toss.im/article/tossbdm
        임승현, "이제 LTV(고객생애가치)를 정확히 계산해 봅시다", EO, 2022.12.03
        https://eopla.net/magazines/1519#

북극성 지표

  • 여러 지표들 중에서 서비스의 성공을 정의하는 지표 어떤 지표들을 봐야 자사 제품/서비스의 성장을 확인할 수 있는가
    • 제품/서비스의 핵심 가치를 가장 잘 나타냄
    • 장기적인 성장을 위해 꾸준히 모니터링해야 함
    • 제품/서비스 및 조직이 무엇에 최적화돼야 하고 , 또 무엇을 포기해도 되는지에 대한 방향성을 제시함
    • 전 직원을 하나의 목표에 집중시킴으로써 업무 효율을 증대시킬 수 있음
      (서로 상반된 목표에 집중한다거나 중복으로 일하는 상황을 방지함)
  • 좋은 북극성 지표의 특징
    • 제품/서비스 전략의 핵심 지표
    • 사용자/고객이 제품/서비스에서 느끼는 가치를 보여줌
    • 회사의 사업 목표를 보여주는 지표들 중 선행 지표에 해당
  • 좋은 북극성 지표를 확인하기 위한 체크리스트
    • 사용자가 목적을 달성하는 때가 언제인가?
    • 모든 사용자가 해당되나?
    • 측정가능한가?
    • 측정 주기가 적절한가? (일, 주, 월, …) 너무 늦으면 해당 지표를 추적하느라 다른 중요한 것을 놓칠 수 있기 때문에
      : 북극성 지표의 변화를 적어도 매주 관찰 가능한가?
    • 외부 요인으로부터 영향을 많이 받진 않는가? 다루기 힘든 지표라면 해당 지표를 추적하는 게 별 의미 없을 수도 있음
    • 북극성 지표의 성장이 사업의 성장과 함께하는가?
    • AARRR 퍼널 전 과정이 북극성 지표에 영향을 주는가?
  • 북극성 지표의 사례

 


 

아티클 스터디 ②: 기획자도 파이썬을 배워야 하나요? - ①이론편

오늘 읽은 아티클:

 

기획자도 파이썬을 배워야 하나요? - 1이론편 | 요즘IT

기획자이거나 기획자가 되고 싶은 당신, ‘나도 파이썬을 배워야 하지 않을까?’라는 고민을 한 적이 있지 않나요? 그런데 막상 배우면 실무에 도움이 되지 않을까봐 걱정되진 않았나요? 앞으로

yozm.wishket.com

 

 

250306 오늘 진행한 아티클 스터디의 개인 요약 중 일부

오늘의 아티클을 읽으면서 파이썬을 배워야겠다는 동기 부여를 받을 수 있었다. 매일 코드카타에서 파이썬으로 알고리즘 문제를 풀면서 한 발짝 가까워지면서 익숙해지는 동시에 세 발짝 멀어지는(...) 중이다. 그런데 아티클에서 "엑셀보다 유용하다", "앞으로는 파이썬이 엑셀을 대체하지 않을까요?"라는 말에 열심히 파이썬을 익혀야겠다는 생각이 들었다.

 

그리고 덧붙여서 서로의 인사이트를 공유할 때 나온 인사이트 중에 '현재는 교과 과정 중에서 코딩을 학습하고 있으니 이들이 이후 사회에 진출할 시점에는 프로그래밍 역량이 지금보다 더 보편적으로 갖춰야 할 역량이 될 것이고, 그 즈음엔 우리들은 시니어 정도가 되어 있을 텐데 그들과 원활히 협업하고 또 자신의 경쟁력을 갖추기 위해서도 파이썬 역량을 갖추는 게 좋겠다'고 한 말이 인상적이었다. 실제로 해당 내용을 기사로 몇 번 접한 적도 있고, 동생이 고등학교에서 코딩 수업을 배우고 이에 대한 교과서도 있는 걸 봤기 때문에 해당 인사이트가 중요한 지점이라고 여겨졌다. 또한 다른 분께서 '직무 스터디를 위한 자료 조사를 진행하면서 여러 채용 공고들을 봤을 때, 파이썬 역량을 요구하는 곳이 개발 직군 외에도 기획자 및 데이터 직군 등 점점 많은 분야에서 보이고 있다'고 하시는 점에서 지금 파이썬을 배워야 할 필요를 체감하지 못한다 해도 막상 배워두면 이곳저곳에 활용할 수 있을 것 같다.

 

현재 코드카타 문제들로 파이썬에 익숙해지는 과정은 어떤 곡은 연주하기 위해, 혹은 부르기 위해 필요한 테크닉을 몸에 체득하기 위해 스케일 연습 반복하는 과정과 같다고 느꼈다. 스케일 연습은 재밌지 않지만 꾸준히 반복하면서 스스로 어떤 식으로 내 몸을 사용해야 하는지 익혀야 내가 원하는 대로 내 몸을 제어할 수 있다. 이처럼 코드카타도 재밌진 않지만 문제들은 반복해서 풀면서 파이썬 문법에 익숙해지고 내가 자주 범하는 실수를 바로잡고 여러 함수와 메소드들을 문제에서 주어진 상황을 통해 외워짐으로써 언어를 배워나가는 과정이라고 생각한다. 

 

아티클에서 파이썬을 통해 데이터를 전처리하고, 또 텍스트 도구로 분석할 수 있다고 말한 것이 지금은 사실 먼 얘기처럼 들리고 잘 와닿지 않지만 차근차근 내 수준에서 해야 할 일을 꾸준히 한다면 이번 달 동안 이런 일들을 하게 될 것이다. SQL이 관계형 데이터베이스와 소통하는 언어이듯, 파이썬 역시 컴퓨터에게 특정 연산을 요구하기 위해 소통하는 언어라는 점을 잊지 말고, 단순히 외워야 할 게 많다고 힘들어하기보다 파이썬으로 무엇을 할 수 있을지를 생각하며 학습해야겠다.