데이터 이야기 11

[SQL/Clickhouse] 시계열 데이터 지수index로 변환하기

오늘은 물가지수, 주가지수와 같은 지수로 변환하는 법이다. 아이디어는 간단하다. 시계열 순으로 가장 최초의 값을 가져오고, 그 값을 모든 행에 나눠서 지수로 표현하는 방법이다. 거래액 등 단위 자체가 다른 2개의 지표에 대해서, 시작점을 100으로 놓고 어떤게 더 성장했는지 비교할 때 유용하다. 예를 들면, 통계청에서 발표한 이커머스 거래 현황과 작고 소중한 우리 회사 거래액을 비교한다고 가정해보자. 시장지배력이 높은 기업이라도 아마 단위 자체가 다를 가능성이 높다. 이럴 때 시장의 성장에 비해 우리의 성장이 잘 이뤄지고 있는지 등을 볼 때, 지수로 변환해서 확인하면 유용하다. 우선 코드는 아래와 같다. SELECT stat_date, round(company_gmv/sum(company_gmv_r1)o..

Uber의 Data Science Team의 비전

아래 내용은 아티클 중 일부를 발췌/번역했습니다. Uber는 각 직원들이 특정 기술적 전문성 없이도 더 나은 결정을 내리고, 결과를 예측할 수 있도록 자신들을 강화하길 원합니다. 최근 이벤트에서 Uber의 데이터 과학 책임자 Franziska Bell은 세계 최대 규모의 교통 네트워크 회사가 모든 직원들이 데이터 과학자처럼 자신들의 직무를 수행할 수 있도록 바란다고 말했습니다. Bell에 따르면 이렇게 하면 회사는 손쉽게 이용 가능한 모든 데이터 세트에서 깊은 인사이트를 얻어 직원과 고객 모두에게 우수한 경험을 제공할 수 있게 될 것입니다. Uber는 서로 다른 부서의 팀이 풍부한 데이터 포인트를 통해 지속적으로 상호 작용하는 플랫폼화를 통해 이를 달성하고자 합니다. Uber는 또한 엔지니어링, 제품 및..

데이터 이야기 2023.04.09

[시계열분석] Prophet 모델 Trend Changepoint(변곡점)의 활용

들어가면서 시계열 분석에서 중요한 것 중 하나가 변곡점(changepoints)이다. 시간의 흐름에 따라 나타나는 패턴이라는 것이 매번 동일한 수준으로 발생하지 않는다. 어떤 순간을 기점으로 상승세나 하락세의 흐름이 변화하기도 한다. 주식을 예로 든다면, 일시적인 조정을 하락세로 판단하고 보유한 주식을 전량 처분하거나, 순간적인 반등인데 상승세로의 전환으로 판단하고 풀베팅을 때린다면 문제가 될 것이다. 따라서 시계열 분석에서 의미있는 변곡점을 파악하는 것은 중요한 과제다. Prophet 모델은 변곡점 분석을 위한 기능을 제공한다. Trend Changepoint는 시계열 데이터에서 추세 변화가 일어날 수 있는 지점을 나타낸다. 다행히 Prophet 모델은 이런 변곡점을 자동으로 감지하고, 이를 반영하여 ..

[시계열분석] Prophet 모델에 독립변수 추가하기

들어가면서 우리가 어떤 변수에 대한 예측치를 정할 때, 그 예측치의 추세에 영향을 주는 것들이 있다. 예를 들면, 첫 구매 프로모션 혜택을 받게 될 고객을 예측한다고 가정해보자. 이런 경우, 첫 구매 수치는 아무래도 회원가입 추세를 따라가게 될 가능성이 크다. 이런 것처럼 어떤 변수를 예측할 때, 다른 원인이 되는 독립변수를 분석에 결합한다면 조금 더 정확한 추세를 분석할 수 있을 것이다. Prophet에서도 모델에도 add_regressor이라는 기능을 제공하고 있다. # Prophet에 사용할 데이터프레임 생성 prophet_df = first_df[['first_promote_day', 'first_cnt', 'join_total']].rename(columns={'first_promote_day'..

[시계열분석] Prophet 모델에 한국 공휴일 추가하기

들어가면서 내가 처음 입사했을 때, 회사에서는 매월 주요 지표를 예측하는 과정은 기존에 엑셀의 회귀분석 기능을 활용했다. 나도 작년까지는 이런 회귀분석과 Cohort 추이 분석을 토대로 필요한 예측치를 산출하고는 했다. 다만, 시계열 분석을 공부하는 과정에서 이런 방식이 가지는 한계를 느낄 수 있었다. 그래서 시계열 공부를 시작했고, 그 과정에서 메타에서 제작한 prophet 모델을 알고 이를 실무에 도입하고 있다. prophet 모델이 Excel에서 제공하는 회귀분석 기능과 비교해서 가지는 장점은 다음과 같다. 계절성 및 휴일 패턴을 고려: Prophet 모델은 시계열 데이터에서 계절성 및 휴일 패턴을 고려하여 예측할 수 있습니다. 이는 Excel의 회귀분석에서는 별도로 처리해야 하므로 복잡하고 번거로..

군집화 모델(Clustering Model)의 개념과 K-Means/K-Means++ 알고리즘

들어가면서 머신러닝은 크게 지도학습과 비지도학습으로 구분할 수 있다. 지도 학습(Supervised Learning)은 입력 값이 주어졌을 때 원하는 결과값(label)을 가진 학습 데이터를 학습시켜서, 이후 결과값이 없는 테스트 데이터가 주어졌을 때 적절한 결과값을 찾도록 하는 방법이다. 지도 학습은 결과값이 딱딱 끊어지는 범주형 데이터인 경우 분류 모델(Classification Model)을 활용하고, 연속형 데이터가 결과값으로 제공된다면 회귀 모델(Regression Model)을 활용하게 된다. 회귀 모델을 통한 사업 지표 예측하기 (1) (회귀모델의 개념/성능평가) 반면 학습 데이터가 없는 경우라면 비지도학습(Unsupervised Learning)을 적용하게 된다. 오늘 정리한 군집화 모델(..

데이터 이야기 2023.01.09

[clickhouse] neighbor 활용하여 이전행/다음행 가져오기

이탈 분석을 하다보면, 사용자들이 이탈 직전에 어떤 액션을 했는지, 또는 어떤 퍼널에서 이탈했는지 확인이 필요하다. 다만, 하나의 테이블에 유저의 모든 액션이 순서대로 집계된 경우 특정 사용자의 직전 액션만 모으는 것이 난해하다. 이렇게 저장되는 경우, 우리가 뽑아내고 싶은 내용은 kazuha는 1달무료이용까지만 이용하고 회원탈퇴를 했다는 점, 그리고 sakura는 정기결제1개월까지 이용하고 회원탈퇴를 했다는 점이다. 아마 아래와 같이 데이터를 뽑아야 할 것이다. 이런 경우, SQL에서는 이전의 행(Row)을 가져올 수 있는 lag, lead라는 함수를 제공한다. 그리고 우리처럼 Clickhouse를 사용하는 경우에는 neighbor을 활용할 수 있다. 우선 neighbor에 대한 기능을 소개해본다. n..

sum over, 일별 진척율 대비 YoY 구하기 (1) (sum over의 개념 등)

휴가 중 문의를 받았다. 2022년 12월의 일별 누적거래액 차트를 만들고 싶어요. 아 물론 2021년 12월 1일부터 동기간 YoY를 비교하는 형태가 가능하면 좋을 것 같아요. 문과로 태어난 나의 정체성을 유지하고 싶었지만, 엔지니어의 기운이 스며든 것인지 기존에 시도하지 않았던 요청이 오면 게임하는 것만큼 흥미로운 것 같다. 요청 내용을 처리해보자. 일별 진척율을 왜 보고 있을까 우선 이런 것을 왜 구하는지 먼저 살펴보자. 비즈니스 분석팀은 매번 월말 기준 예측치를 산출한다. 이번달 예측치는 140점으로 예상 YoY는 40%가 나올 것 같아요. 이후 분석팀은 비즈니스 지표를 모니터링하게 된다. 물론 찐 엔지니어 성격의 데이터 분석팀은 이를 하지 않는 것 같다. 우리처럼 전략기획팀 한 스푼 묻은 데이터..

회귀 모델을 통한 사업 지표 예측하기 (1) (회귀모델의 개념/성능평가)

목차 1. 회귀 모델 Regression Model 2. 회귀 모델의 성능 평가 회귀 모델 Regression Model - 2023년의 거래액은 어떻게 예측할 수 있을까? - 2023년의 회원가입은 어느 정도 수준으로 나타날 수 있을까? 특정 사용자가 이탈할 것인가, 잔류할 것인가를 판단할 때는 분류 모델Classification Model을 활용했다. 하지만 내년도 실적 전망치를 예측하는 경우에는 이런 분류 모델을 활용할 수 없다. 왜냐하면, 결과값이 연속형 데이터이기 때문이다. 이런 경우에는 회귀 모델 Regression Model을 사용하게 된다. 회귀는 회귀 분석의 그 회귀다. 어떤 자료에 대해 그 값에 영향을 주는 요소를 고려하여 구한 평균으로, 연속형 데이터의 형태로 값을 예측할 때 사용하는..

[SQL/Clickhouse] LIMIT n BY, 그룹별/조건별로 필요한 수만큼 추출하기

조건에 따른 상위랭커를 뽑아보려면 처음에 SQL을 배우면 가장 먼저 배우는 것 중 하나가 LIMIT문이다. 그래서 처음에 RANK와 같은 순위 함수를 모르더라도, '거래액 순으로 상위 10개를 뽑아주세요'라는 요청을 받으면 어렵지 않게 출력할 수 있을 것이다. 다만, 가끔 전체가 아닌 그룹별로 뽑아야하는 경우가 발생할 수 있다. "우리 고객사들을 카테고리별로 거래액 상위 10개 몰을 추출해주세요." 이런 경우, 초보인 경우는 WHERE에다가 카테고리 이름을 하나씩 쓰면서, 발품을 파는 경우가 많다. (어떻게 확신하듯 작성하냐면, 내가 맨 처음에 그랬던 것 같다.) 그렇다면 어떻게 해야할까? 나중에 쿼리를 공부하면서 알게 된 방법은 크게 2가지가 있다. 하나는 RANK를 활용하는 것이고, 또 하나는 LIM..