분류 전체보기

[sql] cross selling
고객들은 하나의 제품만을 구매하기도 하지만, 여러 상품을 한번에 구매하기도 한다. 치약만 구매한 고객이 있는 반면 칫솔을 함께 구매하는 고객이 있고, 아이폰만 구매한 고객이 있는 반면 애플워치도 함께 구매한 고객이 있을 것이다. 이러한 주문 데이터는 DB에 기록되기 마련이며, 이를 잘 활용한다면 다른 고객들이 제품을 구매할때 어떤 다른 제품을 함께 구매하면 좋은지 추천해줄 수 있다. 그리고 이렇게 다른 제품을 추가로 구매하게 하는 것을 교차 판매(cross selling) 이라고 한다. 우리는 교차판매로 매출을 증대시켜 성과금을 받기 위해, cross selling 연관 상품을 추출하는 sql 쿼리를 알아보고자 한다. 이번쿼리는 4가지 단계를 거친다. ① 유저별 주문상품 테이블 생성 ② 유저가 주문한 상..

[sql] 작대비 매출 비교
우리는 기업을 평가할때 매출을 중요 평가 요소 중 하나로 본다. 그러나 매출을 평가할때는 절대적인 매출의 크기보다는 상대적인 매출의 크기가 더 중요하다. 우리는 매출액의 비교를 통해 기업이 성장했는지, 또는 침체기에 있는지 판단하곤한다. 이때, 비교대상도 중요하다. 오늘 매출과 전일자의 매출을 비교할수도있지만, 오늘은 대형 프로모션을 진행했고 어제는 어떠한 프로모션도 없었다면 해당비교는 크게 의미가 없을수도 있다. 각기 다른 맥락속에서 산출된 매출액이기에 비교 대상으로 적절하지 않기 때문이다. 이런점을 고려해서 매출 비교를 할때는 많은 경우 작년 대비 동월 매출 비교를 하곤한다. 작년 동월에는 기업이 비슷한 맥락속에 있었을 것이라 가정하는 것이다. 그래서 이번 게시글에서는 매출 비교의 기본인 작년대비(a..

[airflow] hook
https://indistract.tistory.com/62 [python] session과 cursor 우리는 python 코드를 이용해서 DB서버와 소통을 해야할 일이 종종있다. 코드를 이용해서 DB에 데이터를 읽거나 쓰려면은 ①session과 ②cursor에 대한 개념을 이해할 필요가 있다. 아래 코드에서 두 indistract.tistory.com 이전 게시글에서는 python 코드를 이용해서 Postgres DB와 소통하는 방법을 알아보았으며, 더불어 session과 cursor개념도 설명했다. 위 게시글의 마지막에 dag도 하나 작성해보았는데, 해당 dag는 치명적인 단점이 2가지 있다. ① DB 연결정보 변경시 관리가 번거롭다는점과 ② DB 연결정보가 코드에 노출된다는 것이다. 게시글의 마지..

[python] session과 cursor
우리는 python 코드를 이용해서 DB서버와 소통을 해야할 일이 종종있다. 코드를 이용해서 DB에 데이터를 읽거나 쓰려면은 ①session과 ②cursor에 대한 개념을 이해할 필요가 있다. 아래 코드에서 두 개념을 살펴보고자 한다. DB는 postgres를 이용한다. 먼저, python에서 postgres DB에 접속해서 sql을 수행하고, 그 결과를 가지고 올수있도록하기위해서 psycopg2 라이브러리를 불러와야한다. 해당 라이브러리를 이용해서, psgcopg2.connect() 내에 ip정보, db명, user명, password, 포트번호를 입력해주면 DB서버와의 연결을 만들수 있다. 그리고 이 DB서버와의 연결을 'session' 이라고 부른다. import psycopg2 from conte..

[sql] 가중 이동평균
https://indistract.tistory.com/60 [sql] 이동평균 주식시장에서는 기술적 분석을 할때 '이동평균선(moving average)'를 기본적인 도구로 사용한다. 이동평균선은 최근 N일치의 평균가격을 구한 값으로 주가 흐름을 파악하기 위해 사용된다. 아래 사 indistract.tistory.com 우리는 데이터를 바라볼때, 모든 기간의 데이터에 대하여 균등한 무게를 두고 분석하지는 않는다. 예를들어, 장염에 걸린 환자가 병원에 찾아간다면 의사는 환자가 '어제' 어떤 음식을 먹었는지 궁금해하며, '1년전'에 어떤 음식을 먹었는지 물어보지는 않을 것이다. 이처럼 최신의 데이터일수록 좀더 중요성을 부여해야할 경우가 종종있다. 그리고 이를 적용한 개념중 하나가 '가중 이동평균' 이다. ..

[sql] 이동평균
주식시장에서는 기술적 분석을 할때 '이동평균선(moving average)'를 기본적인 도구로 사용한다. 이동평균선은 최근 N일치의 평균가격을 구한 값으로 주가 흐름을 파악하기 위해 사용된다. 아래 사진을 보면 차례대로 5일, 20일, 60일, 그리고 120일 이동평균선이 표기되어있다. 이는 각 일자의 최근 N일 동안의 평균주가를 이어놓은 선이라고 보면 되겠다. 예를들어, 5일 이동평균선은 '5일간의 종가 합계 / 5일' 로 계산하며, 이 평균 주가를 이어놓은 선이 '5일 이동 평균선'이다. sql에서도 윈도우함수(window function)을 이용하면 위와 같은 이동평균을 구할수 있다. 실습 테이블은 주가 테이블 대신 매출테이블을 이용한다. 먼저, 이동평균 매출을 구하기전에 아래와같이 월별 총 매출을..
[sql] 테이블 관계를 고려한 aggregation
https://indistract.tistory.com/58 [sql] 월 전체 매출액 대비 비율 아래 4가지 테이블을 이용해서 월별 상품 카테고리별 구매건수와 매출을 구한뒤, 월별로 각 카테고리가 얼만큼의 매출 비중을 차지하는지 구해보려한다. ① nw.order: 주문정보 테이블 ② nw.order_it indistract.tistory.com 앞선 게시글에서는 월내 카테고리별 매출액 대비 비율을 구해봤다. 이번에는 비슷하게 카테고리내 상품별 매출액 대비 비율을 구하며, 추가적으로 각 카테고리내 상품의 매출액 순위가지 구해보려한다. 각 행의 순위를 구하려면 row_number() 함수를 사용해주면된다. 그리고 어떤 기준으로 partiton하고, 어떤 기준으로 순위를 매길것인지에 대한 정보는 over(p..

[sql] 월 전체 매출액 대비 비율
아래 4가지 테이블을 이용해서 월별 상품 카테고리별 구매건수와 매출을 구한뒤, 월별로 각 카테고리가 얼만큼의 매출 비중을 차지하는지 구해보려한다. ① nw.order: 주문정보 테이블 ② nw.order_items: 주문상품 테이블 ③ nw.products: 상품정보 테이블 ④ nw.category: 상품카테고리정보 테이블 먼저 아래와 같이 각 테이블에서 정보를 가져울수 있도록 키값에 맞춰 테이블을 연결해주고, ① 주문정보 테이블에서 일자를, ④ 카테고리 정보 테이블에서 카테고리 명을, 그리고 ② 주문상품 테이블에서 order_id의 유일값 개수와 총 매출액을 구해주면 월별/카테고리별 주문건수와 매출액을 구할수 있다. * 하나의 주문에서 여러 상품을 구입할수 있으므로, 주문번호 고윳값 갯수를 주문건수로 ..