본문 바로가기

분류 전체보기178

[SQL] 데이터 정합성 검증하기(2) - 중복값 중복값: 같은게 여러 개 있을 때 기본적으로 관계형 데이터베이스에는 무결성을 검증하는 기능이 있지만 RDB가 아닌 데이터베이스에서 아래와 같은 이유로 중복되는 키를 가진 데이터가 생성될 수 있다. 1) 데이터를 로드할 때 실수로 여러 번 로드되어 같은 데이터를 가진 레코드가 중복 생성된 경우 → 로드할 때마다 데이터를 지우고 새로 저장하도록 한다 2) 마스터 데이터의 값을 갱신할 때 문제가 발생해서 오래된 데이터와 새로운 데이터가 서로 다른 레코드로 분리된 경우 → 최신 데이터만 남기거나 키 값과 시간을 조합하여 키를 만든다 3) 운용상의 실수로 같은 ID를 다른 데이터에 재사용한 경우 출처: 데이터 분석을 위한 SQL 레시피 (441p) 1) 키의 중복 확인하기 중복되는 키 값의 여부를 먼저 확인하고 .. 2023. 1. 2.
[SQL] 데이터 정합성 검증하기(1) - 결손값 데이터를 수집하면서 데이터가 잘 쌓이는지는 우연에 맡긴 경향이 있는데 규모가 커질수록 영향도가 커진다는 생각이 들었다. 그래서 데이터 정합성을 검증하는 관점을 세 가지로 구분해보았다. (엄청 어려운 일은 아니지만 귀찮은 일에 속하는 것 같다) 목차 [SQL] 데이터 정합성 검증하기(1) - 결손값 [SQL] 데이터 정합성 검증하기(2) - 중복값 [SQL] 데이터 정합성 검증하기(3) - 이상값 결손값: 있어야 하는 게 없거나, 없어야 하는 게 있을 때 결손도 확인하기 액션의 종류에 따라 컬럼의 값이 not null이어야 하는지, null 허용인지 달라진다. 가령 purchase 액션은 products와 amount 컬럼의 값이 반드시 not null이어야 한다. select action, round(a.. 2023. 1. 2.
2022 결산 올해도 죽지도 않고 돌아온 세 번째 결산입니다. 총 80권을 읽었는데 내년에는 과연 100권을 넘길지? 저도 궁금해요 올해의 공감: 믿음에 대하여 나도 꽤 오랫동안 생각해온 말 올해의 소설: 그 남자네 집 너무 많이 울었고 그 카페는 다시 못가고 있다.. 올해의 두 번째 소설: 참을 수 없는 존재의 가벼움 아쉽게도 그 남자네 집에 밀려 두 번째 소설이 되었지만 다시 읽어보고 싶은 책 올해의 다정: 천문학자는 별을 보지 않는다 심채경 과학자는 정말 다정하시다 올해의 마이웨이: 꿈은 없고요 그냥 성공하고 싶습니다, 우리 모두 가끔은 미칠 때가 있지, 퇴근길의 마음 누군가 내 삶에 조언을 하려 든다면 그 사람은 본인 삶에 불만족하는 사람이다 명백히... 그리고 나도 누군가에게 조언을 하고 싶어진다면 현재 불만.. 2022. 12. 31.
매출 분석 - ARPU/ARPPU 구하기 우리 서비스 유저들의 1인당 평균 결제금액은 얼마나 되나요? 이 지표를 어떻게 활용할 수 있을까요? 문제 정의하기 ARPU(Average Revenue Per User)는 특정 기간 동안의 유저 1인당 평균 결제금액을 말한다. 유저 1인당 평균 결제금액은 결제 여부를 기준으로 크게 두 가지로 구분할 수 있다. ✔ ARPU(유저 1인당 평균 결제금액) = 매출/활성 사용자 수 ✔ ARPPU(결제 유저 1인당 평균 결제금액) = 매출/결제 사용자 수 한편 일자별 ARPPU의 경우 다른 일자의 결제 활동은 고려할 수 없기 때문에 일자별로 수치가 크게 상이한 상황이 발생할 수 있다. 필요한 데이터 활동 로그 데이터(발생일시, 이벤트명, 유저id), 주문 데이터(주문일자, 주문금액, 주문id) 풀이 1) 일자별 .. 2022. 12. 26.
사용자 분석 - 고객 세분화 그룹 구하기(RFM) 충성고객에게 혜택을 주는 이벤트를 기획 중입니다 구매금액이 큰 순서로 충성고객 리스트를 뽑아주세요 문제 정의하기 충성고객은 장기적이고 지속적인 관점에서 서비스 온보딩 여부(+사용자의 가치)를 판단해야 하기 때문에 단순히 구매금액이 큰 사용자만을 충성고객으로 정의하기는 어렵다. 따라서 RFM 분석을 통해 언제, 얼마나 자주, 얼마나 많은 금액을 지불했는지 사용자 그룹을 나누어 봐야 한다. RFM은 다음 3가지의 기준을 의미한다. ✔ Recency(최근 구매일): 최근 구매 이력이 있는 사용자를 충성고객으로 취급 (숫자가 작을수록 충성고객) ✔ Frequency(누적 구매 횟수): 사용자가 구매한 횟수 (숫자가 클수록 충성고객) ✔ Monetary(구매 금액 합계): 사용자의 구매 금액 합계 (숫자가 클수록.. 2022. 12. 20.
매출 분석 - 매출 연관 지표 구하기 작년 이맘 때보다 매출이 떨어진 것 같은데 원인이 무엇인지 분석해주세요 문제 정의하기 매출은 결과에 불과하기 때문에 결과의 원인인 판매 횟수, 평균 구매액 등 주변 데이터를 같이 봐야 한다. 매출이 하락하고 있다 ✔ 판매횟수: 판매 횟수는 변화 없는데 ✔ 평균 구매액: 평균 구매액이 낮아져서 전체적인 매출이 하락했다 → 기간 내 판매된 상품의 내역을 확인해서 수치에 대한 근거를 찾는다 매출에 변화가 없다 ✔ 판매 횟수: 판매 횟수는 증가했는데 ✔ 평균 구매액: 평균 구매액이 낮아져서 매출에 변화가 없다 → 방문 횟수, 상품 수, 회원 등록 수를 확인해서 판매 횟수의 증가 원인을 찾는다 매출 관련 지표 판매 횟수 평균 구매액 매출액 누계 매출액 작년 매출액 작년비 20XX년 1월 - 회 - 원 - 원 - .. 2022. 12. 17.
[SQL] 가로 세로 피봇팅 하기 피봇팅은 행(의 값)을 열로 변환하는 것을 의미한다 → 열로 변환되므로 그룹함수를 활용하고 데이터를 집계하는데 유용! 풀이 select dt, max(case when indicator = 'impressions' then val end) as impressions, max(case when indicator = 'sessions' then val end) as sessions, max(case when indicator = 'users' then val end) as users from daily_kpi group by dt ✔ case 문으로 새로운 레이블의 컬럼을 지정해주면서 ✔ case 문의 결과는 [10]과 같은 리스트 형식이기 때문에 하나의 스칼라(값)을 추출하기 위해 max나 min 함수와 .. 2022. 12. 17.
사용자 분석 - MAU 구하기 우리 서비스의 MAU를 알고 싶어요 어떻게 그 수치가 나오게 되었는지 설명해주세요 문제 정의하기 MAU 숫자만 봤을 때는 개선을 위한 전략이나 액션 아이템을 도출하기 어렵기 때문에 MAU를 구성하는 사용자의 유형을 나누어 봐야 한다. MAU(월간 활성 사용자)는 다음의 케이스들로 이루어져 있다. ✔ 신규 사용자: 이번 달에 처음 사용한 경우 ✔ 재사용자: 지난 달에도 사용하고 이번 달에도 사용한 경우 ✔ 컴백사용자: 지난 달에 사용하지 않았고 이번 달에 사용했으나 이번 달 첫 사용이 아닌 경우 필요한 데이터 유저 데이터(가입일자, 유저id), 활동 로그 데이터(발생일시, 이벤트명, 유저id) 풀이 with monthly_user_action as ( select u.user_id, DATE_FORMAT(.. 2022. 12. 14.
매출 분석 - 카테고리별 매출 구하기 카테고리별 매출이 얼마나 되는지 알고 싶어요 각 카테고리 내에서 차지하는 비율까지 알 수 있으면 좋겠어요 필요한 데이터 주문 상세 데이터(1차 카테고리, 2차 카테고리, 금액, 상품명) 풀이 select category, sub_category, sum(price) over (partition by category, sub_category) amount, sum(price) over (partition by category) total, sum(price) over (partition by category, sub_category) / sum(price) over (partition by category) * 100 as rate from purchase_detail_log group by categor.. 2022. 12. 13.
[Python] 그룹별 구간 나누기 이 정도 수치면 그룹 내에서 높은걸까? 낮은걸까? → 각 데이터 값의 그룹 내 위치, 중요도, 우선순위 등을 알아보자 [Step 1] 수치형 데이터의 구간 나누기 pd.qcut(data['close_price'], 3).value_counts() pd.cut(data['close_price'], 3).value_counts() qcut()과 cut() 함수 -> cut은 절대평가, qcut은 상대평가 출처: [Python Pandas] 동일 길이로 나누어서 범주 만들기 pd.cut(), 동일 개수로 나누어서 범주 만들기 pd.qcut() [Step 2] 나누어진 구간에 라벨링하기 pd.qcut(data['close_price'], 3, labels = ['L', 'M', 'H']) pd.cut(data[.. 2022. 12. 7.