250225 TIL

수이·2025년 2월 25일
0

🟡 TIL

목록 보기
16/41

팀스터디

아티클스터디

  • 요약 : 데이터 분석의 정의와 중요성, 그리고 필요한 기술 가이드
    • 데이터 분석의 효과
      • 고객 타겟팅 개선, 제품 및 서비스 성과 측정, 문제 해결
    • 데이터 분석 과정
      • 목표 설정 → 데이터 수집 → 데이터 정제 → 데이터 분석 → 데이터 시각화
    • 필요한 기술
      • 수학 및 통계학
      • SQL 및 관계형 데이터베이스 지식
      • 프로그래밍 언어
      • 데이터 시각화 도구
      • 엑셀
  • 주요 포인트 :
    • 오늘 우리에게 도움이 되는 아티클이네요!
    • 데이터를 정제하는 것도 중요한 과정이지만, 어떤 목표를 정하냐에 따라 방향이 달라지기 때문에, 목표를 잘 설정하는 게 중요한 것 같습니다.
    • 데이터분석가는 단순 분석만 하는 것이 아니라, 결과물을 모든 이해관계자들에게 이해시켜야 하기 때문에, 커뮤니케이션 스킬도 신경써야겠습니다.
  • 핵심 개념 : 데이터 분석
    • 원시데이터에서 유용한 인사이트를 도출하는 작업
  • 용어 정리 :
    • 정성 데이터 : 숫자가 아닌 데이터 / 측정 불가
      • 이미지, 비디오, 텍스트 문서, 오디오
    • 정량 데이터 : 숫자로 표현되는 데이터 / 측정 가능
      • 수량, 수치
    • 웹 스크래핑 : 웹사이트에서 데이터와 콘텐츠를 추출하고 수집하는 것
    • 아웃라이어 : 비정상적으로 크거나 작은 값

팀원 공통 인사이트
좋은 데이터 분석을 위해 하드스킬 뿐 아니라 소프트스킬도 잘 챙기자!

기초분석

  • 구매금액과 구매횟수가 많은 사람이 VIP이지 않을까 생각
  • 구매금액, 횟수별 segmentation해서 구간별로 점수(1~5점)를 주고 합계가 큰 순으로 vip선정
  1. JOIN 써서 구매 금액 합계 구하려고 함 → 쿼리 계산속도가 오래걸려서 결과값 못 봄
SELECT o.user_id,
	   SUM(o.price) AS oct_price,
	   SUM(n.price) AS nov_price,
	   SUM(d.price) AS dec_price,
	   SUM(j.price) AS jan_price,
	   SUM(f.price) AS feb_price
FROM team.`2019_oct` o
LEFT JOIN team.`2019_nov` n ON o.user_id = n.user_id
LEFT JOIN team.`2019_dec` d ON o.user_id = d.user_id
LEFT JOIN team.`2020_jan` j ON o.user_id = j.user_id
LEFT JOIN team.`2020_feb` f ON o.user_id = f.user_id
WHERE o.event_type = 'purchase'
GROUP BY user_id
  1. UNION ALL 사용

    • 월별 / 고객별 구매 금액 / 구매 횟수 합계
    • 구매금액 및 구매횟수 많은 순으로 정렬
    SELECT user_id,
           SUM(price) AS total_price,
           COUNT(*) AS cnt_total
    FROM 
    (
    SELECT user_id, price FROM team.`2019_oct` WHERE event_type = 'purchase'
    UNION ALL
    SELECT user_id, price FROM team.`2019_dec` WHERE event_type = 'purchase'
    UNION ALL
    SELECT user_id, price FROM team.`2019_nov` WHERE event_type = 'purchase'
    UNION ALL
    SELECT user_id, price FROM team.`2020_jan` WHERE event_type = 'purchase'
    UNION ALL
    SELECT user_id, price FROM team.`2020_feb` WHERE event_type = 'purchase'
    ) purchases 
    GROUP BY user_id
    ORDER BY total_price DESC, cnt_total DESC
  2. 분류 시작

  • total_price 최대값 : 2715.87
  • cnt_total 최대값 : 563

→ 1점~ 5점으로 점수 매긴다고 생각하고 각 5개 그룹으로 분류

  • total_price / 5 = 약 540점 ⇒ 500점 단위로 그룹
  • cnt_total / 5 = 약 112점 ⇒ 100점 단위로 그룹
    • 고민되는 지점
      1회 이상이라도 구매한 사람은 점수를 줘야하나?
      => 결국 그냥 데이터 양이 커서 100회 이상 구매 1점으로 치기로 함 / 나머지 0점

a) 쿼리 짜기

    SELECT user_id,
    	   total_price,
    	   CASE WHEN sub.total_price > 2500 THEN '5점'
    	        WHEN sub.total_price > 2000 THEN '4점'
    	        WHEN sub.total_price > 1500 THEN '3점'
    	        WHEN sub.total_price > 1000 THEN '2점'
    	        WHEN sub.total_price > 500 THEN '1점'
    	        ELSE '0점'
    	        END AS '구매금액점수',
    	   cnt_total,
    	   CASE WHEN sub.cnt_total > 500 THEN '5점'
    	        WHEN sub.cnt_total > 400 THEN '4점'
    	        WHEN sub.cnt_total > 300 THEN '3점'
    	        WHEN sub.cnt_total > 200 THEN '2점'
    	        WHEN sub.cnt_total > 100 THEN '1점' 
    	        ELSE '0점'
    	        END AS '구매횟수점수'
    FROM
    (
    SELECT user_id,
           SUM(price) AS total_price,
           COUNT(*) AS cnt_total
    FROM 
    (
    SELECT user_id, price FROM team.`2019_oct` WHERE event_type = 'purchase'
    UNION ALL
    SELECT user_id, price FROM team.`2019_nov` WHERE event_type = 'purchase'
    UNION ALL
    SELECT user_id, price FROM team.`2019_dec` WHERE event_type = 'purchase'
    UNION ALL
    SELECT user_id, price FROM team.`2020_jan` WHERE event_type = 'purchase'
    UNION ALL
    SELECT user_id, price FROM team.`2020_feb` WHERE event_type = 'purchase'
    ) purchases 
    GROUP BY user_id
    )sub

b) 구매금액점수 + 구매횟수점수 / 점수 5점 이상 쿼리

SELECT user_id,
	   total_price,
	   구매금액점수,
	   cnt_total,
	   구매횟수점수,
	   구매금액점수 + 구매횟수점수 AS 합계점수
FROM
(
SELECT user_id,
	   total_price,
	   CASE WHEN sub.total_price > 2500 THEN '5'
	        WHEN sub.total_price > 2000 THEN '4'
	        WHEN sub.total_price > 1500 THEN '3'
	        WHEN sub.total_price > 1000 THEN '2'
	        WHEN sub.total_price > 500 THEN '1'
	        ELSE '0'
	        END AS '구매금액점수',
	   cnt_total,
	   CASE WHEN sub.cnt_total > 500 THEN '5'
	        WHEN sub.cnt_total > 400 THEN '4'
	        WHEN sub.cnt_total > 300 THEN '3'
	        WHEN sub.cnt_total > 200 THEN '2'
	        WHEN sub.cnt_total > 100 THEN '1' 
	        ELSE '0'
	        END AS '구매횟수점수'
FROM
(
SELECT user_id,
      SUM(price) AS total_price,
      COUNT(*) AS cnt_total
FROM 
(
SELECT user_id, price FROM team.`2019_oct` WHERE event_type = 'purchase'
UNION ALL
SELECT user_id, price FROM team.`2019_nov` WHERE event_type = 'purchase'
UNION ALL
SELECT user_id, price FROM team.`2019_dec` WHERE event_type = 'purchase'
UNION ALL
SELECT user_id, price FROM team.`2020_jan` WHERE event_type = 'purchase'
UNION ALL
SELECT user_id, price FROM team.`2020_feb` WHERE event_type = 'purchase'
) purchases 
GROUP BY user_id
)sub
)sub2
ORDER BY 합계점수 DESC
LIMIT 31; -- 5점 이상 인원

c) 여기서 vip 인원들 ID만 뽑아서 원본 데이터랑 연결을 해야하는데 도저히 방법이 생각 안 나서 소현 튜터님 찾아감

WITH 구문 쓰면 간단하게 끝날 수 있다고 속성으로 강의까지 해주셨는데, 도저히 못 짜겠다

위에 쓰는 것까진 했는데 WITH에서 사용한 alias로 추출할 수가 없음!🥲

두 번째로 찾아갔을때 UNION ALL 부분만 올리고 나머지 부분을 JOIN이나 서브쿼리로 엮어보라고 하셨는데 아직도 방법을 못 찾았다 여기서부터 멘붕의 시작

WITH purchases AS (
    SELECT user_id, price FROM team.`2019_oct` WHERE event_type = 'purchase'
    UNION ALL
    SELECT user_id, price FROM team.`2019_nov` WHERE event_type = 'purchase'
    UNION ALL
    SELECT user_id, price FROM team.`2019_dec` WHERE event_type = 'purchase'
    UNION ALL
    SELECT user_id, price FROM team.`2020_jan` WHERE event_type = 'purchase'
    UNION ALL
    SELECT user_id, price FROM team.`2020_feb` WHERE event_type = 'purchase'
),
user_data AS (
    SELECT user_id,
           SUM(price) AS total_price,
           COUNT(*) AS cnt_total
    FROM purchases
    GROUP BY user_id
),
scores AS (
    SELECT user_id,
           total_price,
           cnt_total,
           CASE 
               WHEN total_price > 2500 THEN 5
               WHEN total_price > 2000 THEN 4
               WHEN total_price > 1500 THEN 3
               WHEN total_price > 1000 THEN 2
               WHEN total_price > 500 THEN 1
               ELSE 0
           END AS 구매금액점수,
           CASE 
               WHEN cnt_total > 500 THEN 5
               WHEN cnt_total > 400 THEN 4
               WHEN cnt_total > 300 THEN 3
               WHEN cnt_total > 200 THEN 2
               WHEN cnt_total > 100 THEN 1
               ELSE 0
           END AS 구매횟수점수
    FROM user_data
),
vvip AS (
    SELECT user_id
    FROM scores
    ORDER BY (구매금액점수 + 구매횟수점수) DESC
    LIMIT 31
    )
    
SELECT *
FROM vvip

4) 조원인 혜령님이 3-b 코드로 데이터를 추출해서 거기서 그냥 다시 쿼리 돌려보는 게 어떻겠냐고 하셔서, 그렇게 하기로 일단은 결정했다🥴

내가 초기 쿼리를 짜 줘야 조원들도 쿼리를 돌릴 수 있어서 빨리 해야 했었는데 그게 안(못) 돼서 너무너무 속상했따 얼른 하고 개인 스터디도 하고 싶었는데 계획한 걸 하나도 하지 못했음

내일은 세부 쿼리 짜는 거 함께 할 예정..🤐
이번 주 정말 힘들군요

개인스터디

데일리퀘스트

python - 평균 구하기
python - 짝수와 홀수
SQL - 여러 기준으로 정렬하기
SQL - 이름에 el이 들어가는 동물 찾기


일기

  • SQL 코드카타 11-12✅
    EZ
  • Python 코드카타 11-12✅
    EZ ㅋ
  • 기초분석스터디 쿼리짜기/방향설정✅
  • SQLD 2주차 완강❌
  • ADSP 8주차 복습❌
    처참히 개인공부(강의듣기) 대 실 패. . .

하루종일 기초분석 코드 짜는 거에만 매달린 것 같은데 진도도 안 나가고 머리도 안 돌아간다 어쩜 이럴수가
게다가 과제 관련 이런저런 혼선이 있어서 전체적으로 혼란스러웠다 흑흑

SQL 쉽다고 생각했는데 확실히 실제 데이터에 접근하는 건 다른 문제라는 걸 다시금 깨달음 쥐엔장

원래는 풀어야 할 문제를 제시해주고 거기에 대한 답을 써내려가는 거여서 답이 정해져 있다 보니 쉬웠는데, 기초분석 과제는 답을 만들어야 하는 거다 보니 .. . .. 수동적 교육의 어쩌고..

스스로의 부족함에 이마 빡빡 때림
내일은 뭐라도 결과물이 나와야할텐데 걱정이 된다
그리고 점점 개인공부할 시간이 없는 것 같아서 자격증 시험 접수해놓은 걸 취소할까 생각중

잘 할 수 있겠지? 파이팅 🤣🍀🍀🍀

0개의 댓글

관련 채용 정보