본캠프/TIL ♨

0624 간만에 쓰는 것 같은 TIL : 모델링 디버깅 작업, 태블로 시작

yssummer 2025. 6. 24. 23:18

 

클러스터링 한창 하면서 배운 점 : 클러스터링은 그림으로만 보기보다는 점수로도 봐줘야한다. 군집 중 불분명한 한 친구가 다른 군집들 중간중간 자꾸 섞여있으면 그 친구는 그 외 라는 이름으로 보는 방법도 있긴 하다.

 

모델링에서 당면한 문제: 시계열의 함정에 빠짐. 시계열이라는 걸 생각하면서 코드를 짜는 게 관건인데 처음해봐서 어려웠다.

 

파생변수에서 눈물 흘리는 문제:  파생변수를 가지고 아무 이슈 없이 코드작업하고 태블로 작업하고 시각화 하는 게 정말 쉽지 않은 일임을 알게 되었다. 심지어 내가 만들었던 파생변수는 좀 신뢰성?과 보편타당성이 떨어진다고 판단되어 넣지 않았다. 파생변수를 가진 데이터로 잘 짜는 게 실력적으로도 어렵고 데이터 품질 면에서도 어려움이 있다는 것을 많이 느꼈다.

 왜 그런걸 특히 느꼈냐면 데이터셋을 여러번 수정하고 만들다보니 오늘 태블로에 데이터 연결하여 확인해보고 발견한 문제가 있었는데 exploded해서 만들어놓은 cuisine컬럼이 다시 리스트 형태로 붙어버려서 태블로 상에서도 그냥 리스트로만 보인다는 것이다. 그걸 뺴고 사용해야할 것 같은 상황이 되었고 다행히 그렇게 되기 전에 그걸 이용해서 파생변수가 세세하게 있었어서 그것들 활용할 수 있을 것 같다 새로운 묶음이라던지, 비율같은 걸 구해놨었기 때문에. 다행히 그렇게 활용가능할 것 같아서 전처리 다시해서 데이터셋 새로 만들지 않고 (아직) 일단 가진걸로 최대한 진도를 뺄 수 있는지 확인하는 중이다.

태블로에서 당면한 문제 : 태블로에서 전처리부터 시작해서 그 안에서 파생변수 만드는 것은 해봤지만, 이미 파이썬 라이브러리로 만들어진 파생변수들을 태블로에 갖다 넣기만 하는 작업은 이번이 처음인거라 그걸 해봐야 되는지 안되는지 알게 되는 상황이다.

 

기술질문할 게 2번이나 있었던 하루였다.

 

심화작업도 태블로도 포트폴리오를 위해 ppt도 잘 하려다보니

여러 도전 과제를 만나는 한 주였다. 그래서 저녁까지 작업하다보니 잘 써오던 til도 쓸 엄두가 안나게 되었던 것 같다 .오늘이라도 잘 써야지.. 

튜터님의 말씀은, 모델링을 시계열 데이터를 가지고 하는 것이 쉽지 않은 공부라서 이걸 잘 한다면 이것 자체가 우리가 심화작업으로 하려했던 마케팅 자동화 등의 작업보다 더 가치있을 수 있다고 하셨다.

그래서 지금 이 데이터를 만나 시계열같은 까다로운 개념을 적극 이해해야 하는 기회가 생겼고 덕분에 많은 경험을 쌓아서 좋다고 생각하게 되었다.

 

 

 

 

-------------------------------------------------------------

아래는 작업물들을 그냥 투척함.

 

방금 팀 논의했던 일에 대해 기술 질문 노트를 작성했다:

 


[4단계 질문 프레임워크]

  1. 현재 상황 / 하고자 하는 목표
  1. 이탈 분류 모델링 하는 중. 튜터님이 지도해주신 것 참고해서 작업중.
  2. 시도한 방법 / 현재 진행 상태
  3. 이탈 정의의 기준을 200일로 설정하고, ‘마지막 주문일’ 이라는 파생변수를 사용해 코드 짰는데,
  4. 아래 하이라이트 한 것처럼 특정날짜 기준으로 전에는 모조리 이탈이고 이후에는 모조리 잔존으로 결과가 나오는 걸 발견해 몹시 당황.
  5. 지금 문제 진단:
  6. 왜 이런일이 생겼지? —성능 테스트 여러 방면으로 해보니 안좋다.데이터셋이 이상한가?— 제발 아니었으면.
  7. 실험 설계에 구멍이 있었나? ==아마 이게 아닐까. 예외없이 특정 일 전 후로 딱 0 아님 1로 나뉘는게 넘 부자연스러우니 아마 뭔가 잘못 설계했을 것이라고 추정.
  8. 실수를 했나? —코드 디버그 계속 했는데 오류는 없었다.

 

 

 

 

 

 

  1. 어려운 점 / 막힌 지점
    1. ‘마지막 주문일’ 이라는 기준으로 코드설계 했는데
    2. (이렇게 설계한 것 자체에 문제가 있는 것은 아닌 것 같은데)
    3. 결과적으로 200일이라는 주문1과 주문2 사이의 간격이 아닌, ‘특정 날짜’ 기준으로 0 or 1로 나뉘는 걸 보니까, 시계열 작업에 대한 이해 부족으로 설계 실수 한 것 같음. 특정 날짜를 기준으로 나뉘게 되지 않도록 수정이 필요.
    4. ‘마지막 주문일’ 인 그 날짜가 기준이 된 듯?? .max 써서 잡힌 그 latest_date…(2019 08 09와 2019 08 12사이 언젠가다.) 이 날짜 기준으로 200일 지나고 안지나고로 0,1이 나뉘는 거 아닌가 추정….
    해결방법은 아마
    1. ‘마지막 주문일’이라는 파생변수를 사용할 때 이 오류가 없도록 하는 코드가 필요한데 우리가 모르고 있는 게 아닐까. 이걸 알면 되지 않을까.
    2. 마지막 주문일이라는 기준 대신 다른 파생변수를 기준으로 사용해야하지 않을까.
    3. 튜터님께 조언 구하기…
    우리끼리의 결론:
    1. ‘주문간격’ 기반의 파생변수로 바꿔서 적용해보자.
    2. 이탈일 기준도 100일로 잡아보자.
    3. 나머지 사람들은 다른거 하고 있자 : EDA 시각화 작업도 얼른 해야해서 그거 집중 하기로 함.
  2. 원인추정:
  3. 문제관련 참고 자료 / 관련 코드
  4. 아래 코드 부분에서 000000000…111111이슈의 원인이 생긴 것 같음.
latest_date = df['last_order_date'].max()
df['days_since_last_order'] = (latest_date - df['last_order_date']).dt.days
df['is_churned'] = (df['days_since_last_order'] > 200).astype(int)

 

 

 

 

 

이거 작성하기 전에 아까 낮에도 코호트 작업에 대해 질문할 거 있어서 다녀왔는데 두번이나 기술질문노트를 작성한 날이 되었군.

 

이건 아까 낮에 했던 코호트 분석 의문.

 

튜터님 답변 모음:

means가 평균 기반이어서 means때문일 수 있으니 다른 것도 써보면 어떨지 점수로 파악하는 게 그림으로 파악하는 게 더 정확하다 뜬금 클러스터가 나올 수도 있어서 vip가 나올거라고 확신하면 안되고 그 뜬금 클러스터도 의미가 있을 수 있다.

이탈 모델을 할 경우, 데이터 누수 조심 필요. ----> 이 문제 실제로 중간에 있었다가 해결이 되었음.

0번을 그 외로 칭하는 방법도 존재

테스트 여러번 돌릴 때 컴퓨터터지면 기록 다 날아가니까 별도의 스프레드시트에 꼭 작업 메모하라고 하셨다.

 

 매출이 가장 높았던 2018년에 1월에 활동하고 있던 구매 상위 20%인 고객user_id를 월 단위로 추적해서 몇월달에 이탈을 많이 했는지 파악하기. → 20%가 아닌 전체를 봐도 된다.

첫 주문을 기준으로 하기 → 정보가 부족하기 때문에

질문1_ 코호트 분석을 해볼까 싶어 구체적인 아이디어로 정리해봤는데,

타당한지 봐주셨으면 좋겠습니다.

코호트 분석은 다들 처음이라 이해가 부족합니다.

  • 조마토 데이터셋에서 코호트 분석을 할 수 있을지 생각을 해보았는데, 데이터셋을 살펴보면
  • 고객 행동 파악할 만한 정보는 order_date에서 첫 주문일, 마지막 주문일, 재주문 정도입니다.
  • 고객의 구체적인 행동(가입, view, 구매, 장바구니) 정보는 없고, 이벤트나 프로모션에 대한 정보가 없습니다.
  • 반면 요런 작업은 가능하다고 생각했습니다: ex. 매출이 가장 높았던 2018년에 1월에 활동하고 있던 구매 상위 20%인 고객user_id를 월 단위로 추적해서 몇월달에 이탈을 많이 했는지 파악하기.

아래가 구체적으로 써본 작업 방향입니다.

<코호트 작업 아이디어>

  1. 문제제기:
  2. Zomato는 2018~2020년 동안 매출 감소를 경험했다.
  3. 매출 감소의 원인 가설: 단순 경기 둔화가 아닐 것이다, 핵심 고객군이 갈수록 이탈한 것도 원인일 것이다.
  4. 분석 설계 예시: 2018년도 1월 or 2018년도 전체에서 활발했던 상위 20% 고객을 추적해—> 그들이 아직도 활발한지, 아니면 몇 번에 걸쳐 이탈했는지를 알 수 있다면—> 조마토 매출이 떨어진 원인을 ‘고객에 대한 2019, 2020년동안의 리텐션 전략 부족’에서 찾을 수 있다. —> 현 프로젝트 진행의 정당성 더욱 확보 (조마토의 이전의 전략적 실수를 보완하기 위해서 현 프로젝트를 진행한다라고 할 수 있음.주요 고객군 선정 뭐로 하지?—> 모든 고객을 기준으로 보기.—> 파이썬이 더 구현 쉬울 것이다. 툴은 포폴에 뭘 넣고 싶냐에 따라 달라짐.
    코호트를 전체 고객으로 해본 다음에 vip로도 해보면 좋다. 차이가 생기면 그것도 인사이트가 된다.(➡️ cohort_year == 2018 인 고객이 전체 고객 중 몇 % 인지, 어떤 유형이었는지를 확인)(➡️ 2018년에는 vip_segment 0번(=High Spend, High Repeat) 고객이 다수인지 확인)
  5. Step 2. 당시 주요 고객군 식별
  6. Step 1. 2018년 유입 고객 코호트 생성
  7. 태블로에서 할지 파이썬으로 할지?
  8. 2018년 1월 or 전체에서 상위 20% 고객 추출? 이때 기준을 명확히 잡게 된다면 sales_amount, 주문 수, 주문 빈도 중에서 뭘 고를지?
  9. 아직 못 정한 것:
	df['first_order_date'] = df.groupby('user_id')['order_date'].transform('min')

	df['cohort_year'] = df['first_order_date'].dt.yearStep 

3. 이 고객들이 이후 유지됐는가?

코호트 기반 리텐션 분석

➡️ 2018 or 2018년 1월 활동 고객 중 1년 후에도 남아 있는 고객 비율, 활동 구하기. ➡️ 2018 or 2018년 1월 활동 고객의 연 or 월 단위 이탈 추이 구하기. —.> 트렌드 (이거는 아예다른데 retention curve라고 있음) 그것도 구해보기.

	df['month_index'] = ((df['order_date'].dt.to_period('M') - df['first_order_date'].dt.to_period('M'))).apply(lambda x: x.n)
	
	retention_table = df[df['cohort_year'] == 2018].groupby('month_index')['user_id'].nunique()

실무팁: 가격 인상할 때, 동의 필요했는데, 동의 ux 보여주는 실험했는데, 실험노출사람들 코호트 만든건데, 월 초에 본사람, 중순에 본사람 코호트나눈 다음에 결국 나중가서는 지금 거절한사람많지만 12개월 지나니까 동의를 한다더라 하는 인사이트가 나옴. 임원분들한테 걱정하지마라고 할 수 있는 근거가 됨. 이탈 모형에만 쓰는 건아니다. 현시점의 전체적인 동의율 뿐 아니라 예측결과르 보여줄 수 있따.

 

 

 

 

 

 

 

------------------------------------------

 

낮에 이 외에 한 일 메모

 

 

대시보드 만들 준비, 데이터셋 태블로 연결해서 검토, 오류 체크, 다른 대시보드 작업자들이 미리 만든 참고자료 확인,

--태블로 실습 더 필요하다는 생각을 했다 연습 더 마니 필요. 이거 하면서 공부 많이 해야겠음

 

 

노션에 오늘 기록물 정리하고, 시각화 추가작업 하고,  하루 마무리.

 

오늘 하루 요약한 기록물은 아래첨부

-----------------------------------------

화 오전 스크럼 대회의 — cuisine 리스트화 이슈로 회의 길어진 때 나온 결론:

  • 🍅파생변수만 이용하기로 일단 확정, 문제 시 전처리 다시함.
    • (리스트화 되어버린 컬럼은 일단 쓰지 않고, 그걸 이용해서 비율이나 횟수 등을 만들어놓은 파생변수들이 많이 있으니 그것들을 활용해서 일단 작업을 이어가보자. 아직 전처리 다시하는 건 하지 말고 가진걸로 활용이 되는지를 봐보자. 아마도 활용 될 것 같다. 0.5 비율, 횟수 1,2, 이런 것들이 대부분이라 비율로 횟수 구하는 계산 필요하면 가능해서.)
  • 🍅의견 제시: 고객중 상위20%가 실제로 우리가 군집으로 뽑은 user segment 몇번 클러스터에 있는지 크로스 체크 부탁합니다. - 도현 to 태블로팀
    • 😀오전스크럼 회의록 기록 (퀴진 관련 파생컬럼 계산과정 설명해주신 내용 여기에 있음)

화요일 저녁 스크럼 대회의— 모델링 이슈 + 튜터링 결과 결론 :

  • 🍅코호트 차트 의문 끝: 아마 태블로로 만들게 될 겁니다
    (시간 극도로 부족한 게 아닌 이상) —>기술노트에 튜터링 내용 적음.
    • 클러스터링 튜터링 내용: 다른 기법으로도 해보고 성능 점수 비교, ‘그 외’라는 군집을 두는 방법도 있음, vip 군집이 보이지 않을 모든 가능성.. 열어둬…. 워우워어어. 넌나를 원해. 넌내게 빠져. 넌내게 미쳐.
  • 🍅모델링 오류 해결중 : ‘주문간격’ 기반의 파생변수로 바꿔서 적용해보자. 이탈일 기준도 100일로 잡아보자.로 결론남.
    + 튜터링 기다리는 중 —> 기술노트에도 내용 적음...
  • 🍅모델링 클러스터링 담당자 외 사람들은 다른거 하고 있자 : EDA 시각화 작업도 얼른 해야 해서 그거 집중 하기로 함.