본문 바로가기

데이터 분석/SQL과 Python8

[SQL] CTE, 뷰 그리고 임시 테이블 대용량 데이터를 다룬 이후로 성능에 대한 관심이 커졌다. 특히 자주 사용하는 컬럼들에 대해 임시 테이블을 생성했던 것이 다른 테이블들과 조인 시 확실히 효율적이고 체감 성능도 개선되었던 좋은 경험이었다. 그래서 CTE와 뷰, 임시 테이블을 사용할 때 실제로 성능 차이가 있는지, 그리고 임시 테이블을 생성하기까지 몇 차례의 시행착오가 있었기 때문에 CTE와 임시 테이블을 언제, 어떻게 사용해야 할지 알아보았다. CTE와 뷰의 차이 우선 CTE와 뷰에 대해서는 이전에 메모해둔 내용이 있어서 다시 찾아보았다. 오늘 강의에서는 뷰에 대한 내용이 있었는데 뷰의 쓰임 중 하나가 복잡한 연산을 용이하게 하는 것이어서 with절과의 차이가 무엇인지 궁금해서 추가로 찾아보았다.​ ​임시테이블이라는 관점에서는 유사하지만 .. 2023. 5. 17.
[SQL] 데이터 정합성 검증하기(3) - 이상값 이상값: 너무 많거나, 너무 적을 때 이상값은 엄연히 따지면 에러는 아니지만 분석에 방해가 되는 노이즈에 해당되기 때문에 전처리가 필요하다. 이상값 역시 이상값의 여부를 먼저 확인하고 이상값의 원인이 되는 요인을 제거해주는 방식으로 접근한다. 1) 데이터의 분산 확인하기 이상값을 찾는 방법 중 하나는 분산을 확인하고 분산에서 많이 벗어난 값을 찾는 것이다. ① 세션 별 조회수 구하기 → 어떤 세션의 조회수가 극단적으로 많다면 크롤러이거나 내부 IP일 가능성이 있다. with session_cnt as ( select session, count(session) as cnt from action_log_with_noise group by session) select session, cnt, rank() ov.. 2023. 1. 2.
[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.
[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.
[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.
[SQL&Python] 실전 맨땅에 EDA 데이터를 잘 다루기 위해서는 어디에, 어떤 데이터가 있는지 속속들이 파악하는 것이 먼저인 것 같다는 생각이 드는 요즘. 이런 걸 EDA라고 멋들어지게 말하던데 화려한 시각화까지는 아니더라도 나만의 EDA 방법을 매뉴얼화 해보려고 한다. (언제나 그렇듯 근본없음. 내가 보려고 만듦. 그리고 약간의 파이썬을 곁들인..) 1. 요구사항 정의 우리 쇼핑몰에서는 단가가 높은 상품이 많이 나가는지, 단가가 낮은 상품 위주로 판매되는지 알고 싶다는 니즈에서 출발해본다. 먼저 위와 같이 자연어로 이루어진 요구사항을 데이터 추출에 용이한 문장으로 재작성한다. 예시로 든 상황에서도 오해의 소지가 많은데 가령 가장 많이 팔린 상품의 판매가를 말하는 건지, 전체 주문 상품 판매가의 평균을 말하는 건지 등 다양한 의미로 해석될.. 2022. 10. 8.
[SQL] with절과 서브쿼리 부제: 서브쿼리가 너무 싫어서 서브쿼리 안 쓰는 방법을 필사적으로 찾아봄 서브쿼리를 작성할 때 밑에서부터 타고 올라가다 보니 내가 어디까지 정의했는지 헷갈린 적이 많았다. 그보다 더 심각한 건 다른 사람이 작성한 쿼리를 파악할 때인데 쿼리문의 중간 어드메 그 뿌리를 찾아가는게 너무 괴로운 경험이었다. 그래서 도대체 왜 with절을 안 쓰고 서브쿼리를 쓰는지,,, 크게 두 가지 의문이 들었다. with절과 서브쿼리, 어떤 차이가 있는지? 일단 서브쿼리 자체는 세 종류이다. select절, from절, where절에 위치하고 각각 컬럼처럼, 테이블처럼, 조건의 value처럼 사용된다. 이 중에서도 with절과 쓰임이 같은 것은 from절 서브쿼리이다. 그래서 내가 의문을 가진 부분도 from절 서브쿼리에 해.. 2022. 9. 16.