Day30_SQL분석_79‐84_SQL & Tableau - bonniekwon0721/Dataanalytics-study GitHub Wiki

31/MAR/2024


매출 분석 기반으로 사업 시작 지역 선정하기 1

USE mydb;

-- subquery 방법으로 작성
-- Group by 사용

select City, count(StoreNumber) high_sale_store_cnt
from (select City
	, StoreNumber
    , Sum(SaleDollars) sales_sum
    , row_number() over(order by sum(SaleDollars) desc) store_rank
from city_data
group by 1, 2
order by store_rank
) t1
where t1.store_rank <= 20
group by t1.City
order by high_sale_store_cnt desc
;
-- with 절 활용
with store_rank_table as (
	select City
		, StoreNumber
		, Sum(SaleDollars) sales_sum
		, row_number() over(order by sum(SaleDollars) desc) store_rank
	from city_data
	group by 1, 2
)
select City, count(StoreNumber) high_sale_store_cnt
from store_rank_table 
where store_rank <= 20
group by City
order by high_sale_store_cnt desc;

위의 subquery 나 with 모두 같은 결과값을 가져온다.

-- 매출 상위 20위권 스토어의 비중이 많은 지역은 어디인가?
with store_rank_table as (
	select City
		, StoreNumber
		, Sum(SaleDollars) sales_sum
		, row_number() over(order by sum(SaleDollars) desc) store_rank
	from city_data
	group by 1, 2
)
select
	City
    , count(distinct StoreNumber) total_store_cnt
    , SUM(CASE WHEN store_rank <= 20 THEN 1 ELSE 0 END) store_cnt_under_20
    -- CASE WHEN (조건)  THEN (조건이 True인 경우의 output) ELSE (False일 경우에 output)
    -- if a:
    -- return a
    -- else b
    -- END
    , ROUND(100 * SUM(CASE WHEN store_rank <= 20 THEN 1 ELSE 0 END) / count(distinct StoreNumber), 2) store_rato_under_20
from store_rank_table
group by city;

매출 분석 기반으로 사업 시작 지역 선정하기 2

TEMP TABLE 사용하기

CREATE TEMPORARY TABLE store rank data
SELECT
		City
		, StoreNumber
		,SUM(SaleDollars) sales_sum
		,ROW_NUMBER() OVER(ORDER BY SUM(SaleDollars) DESC) store rank
FROM city data
GROUP BY City, StoreNumber;

SELECT *
FROM store rank data;

MySql 은 temporary table 을 session/connection 이 종료되었을 때 자동으로 삭제

  • 쿼리의 재사용이 필요한 상황에서 사용하는 게 사용하는 입장에선 편리

TEMP TABLE 단점

  1. 메모리를 차지한다.
  2. 어떤 테이블인지 바로 파악하기 어렵다.
-- tempor table
create temporary table store_rank_table
select
	City
    , StoreNumber
    , sum(SaleDollars) sales_sum
    , row_number() over(order by sum(SaleDollars) desc) store_rank
from city_data
group by 1,2;

select *
from store_rank_table;

매출 분석 기반으로 사업 시작 지역 선정하기 3

-- tempor table
create temporary table store_rank_table
select
	City
    , StoreNumber
    , sum(SaleDollars) sales_sum
    , row_number() over(order by sum(SaleDollars) desc) store_rank
from city_data
group by 1,2;

select *
from store_rank_table;
-- 매출편차가 왜 이렇게 큰지 다시한번 자세히 알아보자
select *, round(sales_sum) sales_sum
from store_rank_table
where store_rank <= 20;
  • 1, 2, 3 위의 매출의 비중이 가장 높고 그 아래 순위는 매출이 고만고만 하다.
-- 결론
-- 안정적인 수익을 얻고 싶다면?
-- 20위권 순위 비율이 가장 높고 평균 매출이 가장 높은 mount vernon을 추천합니다.
-- 공격적으로 사업을 해서 무조건 1위를 하겠다!!
-- 매출이 높은 store 갯수가 많은 DES MOINES를 추천하겠습니다.

지역별 아이템 수익성 분석하기 1

-- 지난시간 recap
-- 5위 중 평균 매출과 매출이 높은 스토어의 비중이 높은 곳은 
-- 'MOUNT VERNON'
-- 공격적인 사업을 해 볼만한 곳은
-- 'DES MOINES'

-- 수익이 좋은 주류 종류는 무엇인가?

-- 매출 1등 주류: 저희가 선택한 2가지 도시
USE mydb;

-- row_number : 순위를 매김, 동일한 값이 나와도 다른 값을 참조해서 순위 나눔 (1,1,2,3 -> 1,2,3,4)
-- rank : 순위를 매김, 동일한 값인 경우 동일한 순위 부여 (1,1,2,3 -> 1,1,3,4)

select
	t2.ItemDescription
    , round(sum(SaleDollars)) totla_sales
	, rank() over(order by sum(SaleDollars) desc) item_rank
From city_data t1
left join item_meta t2
ON t1.ItemNumber = t2.ItemNumber
where 
	t1.City = 'MOUNT VERNON'
    OR t1.City = 'DES MOINES'
group by t2.ItemDescription;
  • TITOS HANDMADE VODKA는 무조건 팔아야겠네
  • 매출 10위까지는 무조건 팔아야하지 않을까
  • 다른 지역도 이와 유사한가? - 추가로 쿼리 작성하여 확인 필요.

지역별 아이템 수익성 분석하기 2

-- 우리가 선택한 2개의 지역은 유사한 주류 순위를 가지고 있을까?
select
	t1.City
    , t2.ItemDescription
    , sum(SaleDollars)
    , rank() over(partition by t1.City order by sum(SaleDollars) desc) item_rank -- partition by 로 각 city 의 item 을 그룹핑 해준다.
from city_data t1
left join item_meta t2
on t1.ItemNumber = t2.ItemNumber
where 
	t1.City = 'MOUNT VERNON'
    OR t1.City = 'DES MOINES'
group by t1.City, t2.ItemDescription
order by item_rank
;
-- 각 지역별로 몇개의 아이템을 팔고 있는가?

select t1.City, count(distinct t1.ItemNumber)
from city_data t1
where
	t1.City = 'MOUNT VERNON'
    or t1.City = 'DES MOINES'
group by t1.City;
-- MOUNT VERNON: 262
-- DES MOINES: 690

지역별 아이템 수익성 분석하기 3

-- 각 아이템들이 매출에 차지하는 비줄은 어느정도인가?
-- 첫번째: city 총 매출이 얼마인지
-- 두번째: city, item 매출이 얼마, 순위가 얼마 

select
	a.City
    , a.ItemDescription
    , a.item_rank
    , b.total_sales
    , round(100 * a.item_total_sales / b.total_sales, 2) item_sales_ratio
from (
	select 
		t1.City
		, t2.ItemDescription
		, sum(SaleDollars) item_total_sales
		, rank() over(partition by t1.City order by sum(t1.SaleDollars) desc) item_rank
	from city_data t1
	left join item_meta t2
	on t1.ItemNumber = t2.ItemNumber
	where 
		t1.City = 'MOUNT VERNON'
		or t1.City = 'DES MOINES'
	group by t1.City, t2.ItemDescription
) a
left join(
	select City, sum(SaleDollars) total_sales
    from city_data
    group by City
) b
on a.city = b.city
order by item_rank, City
;

판매 비중 및 거래 업체 분석하기 1

-- 10위권까지의 판매량 비중을 합쳐본다면?
-- 첫번째 : 아이템의 매출량과, 순위가 필요
-- 두번째 : 지역별로 아이템 총 매출량
-- 순위에서 10위권까지만 사용을 해서 총 매출량 대비 10위권 까지의 아이템 매출합을 나눠주면 => 비중

with item_sales_table as (
	select City
		, ItemNumber
        , sum(SaleDollars) item_total_sales
        , rank() over(partition by city order by sum(SaleDollars) desc) item_Rank
	from city_data
    where 
		City = 'MOUNT VERNON'
        OR City = 'DES MOINES'
	group by City, ItemNumber
    )
    select
		item_sales_table.City
        , round(sum(100 * item_sales_table.item_total_sales / t2.total_sales), 1) item_sales_ratio_sum
    from item_sales_table
    left join (
		select City, sum(SaleDollars) total_sales
        from city_data
        group by City
	) t2
    ON item_sales_table.City = t2.City
    where item_rank <= 10
    group by item_sales_table.City 
    ;

MOUNT VERNON 은 상위 10위 제품만 런칭해도 잘 팔릴 수 있다는 도시로 보인다.

판매 비중 및 거래 업체 분석하기 2

-- 도매업체와 계약을 해야한다면 몇개의 업체와 해야하는가?
create temporary table rank_table
select
	City
    , ItemNumber
    , VendorNumber
    , sum(SaleDollars) time_total_sales
    , rank() over(partition by City order by sum(SaleDollars) desc) item_rank
from city_data
where
	City = 'MOUNT VERNON'
    or City = 'DES MOINES'
group by 1,2,3;

select *
from rank_table;

select City, count(distinct VendorNumber)
from rank_table
where item_rank <=10
group by City;

Chapter9

대시보드 기획하기

어떤 시각화를 적용해야 하는가?

  1. 정보의 Depth 가 얕아도 되는 정보 ex) 미국 전역의 주류 매출 크기 비교

    : 미국 전체 지역 지도 형태의 시각화

  2. 구체적인 수치를 배교해야 하는 정보 ex) 추천하는 지역들의 매출 추이, 성장률

    : 지역정보 그래프 , 차트

  3. 실제 데이터를 직접 이용하면 좋은 정보 ex) 특정지역, 점포의 매출과 판매 비중

    : 선택 지역 상세 그래프(성장률 등), 선택 지역 상세 차트 (판매 아이템 정보 등)

매출 동향 시각화

City_Data.csv 에서 2022년 매출동향 그래프 만들기

  • 열선반: 월
  • 행선반: 합계 SaleDollars (색상 - City) & 합계 SaleDollars
  • 레이블 지정할 마크: 최소/최대

계산된 필드 만들기

  • 이름: 전체

  • 값: ‘’

  • 색상 필드에 아까 만든 ‘전체’를 넣어주면 우측에 레이블도 표시된다.

도구설명 다듬기

  1. 전체 도구 설명

    전체 매출

    월: <월(Date)>

    Sale Dollars: <합계(Sale Dollars)>

  2. City 도구 설명

    월: <월(Date)>

    City:

    Sale Dollars: <합계(Sale Dollars)>

주 별 도매상 및 아이템 수 테이블 만들기

‘도매상 수’ 계산된 필드 만들기

  • 이름: 도매상 수
  • countd([Vendor Name])

‘아이템 수’ 계산된 필드 만들기

  • 이름: 아이템 수
  • COUNTD([Item Description])

테이블 만들기

  • 행선반: City
  • 열선반: 도매상 수 & 아이템 수

누적 매출 현황 시각화 - running

하기와 같은 계산된 필드를 사용하여 누적매출을 만들수 도 있고, 퀵 테이블의 ‘누계’로도 간단히 만들수도 있기는 하다.

  • RUNNING_SUM: 누계 합계
  • RUNNING_AVG: 누계 평균
  • RUNNING_COUNT: 누계 카운트
  • RUNNING_MAX: 누계 최대값
  • RUNNING_MIN: 누계 최소값

계산된 필드

  1. 누적매출: RUNNING_SUM(sum([Sale Dollars]))

  2. 누적매출평균:

    RUNNING_AVG(sum([Sale Dollars]))

전월 대비 매출 성장 정도 - lookup

Lookup 은 다른 행의 값을 가져오거나 차이를 계산해야할 때 많이 사용한다.

‘전월 대비 매출 성장액’ 계산된 필드

SUM([Sale Dollars]) - LOOKUP(SUM([Sale Dollars]), -1)

그래프 만들기

  • 열 선반: Date(월)
  • 행 선반: 전월 대비 매출 성장액
  • 색상: City
  • 필터: City - MOUNT VERNON
  • 그래프 타입: 영역

아이템 매출 순위 TOP 20 - fixed, index

  • 필터: City - MOUNT VERNON

  • 행 선반: Item Description & 합계(Sale Dollars)

  • 표현 방식: 텍스트 테이블

  • 정렬: 필드 > Sale Dollars > 내림 차순

  • 색상: 합계(Sale Dollars)

  • 마크 형태: 사각형

‘지역별 매출 합계’ 계산된 필드 추가

{FIXED [City]: sum([Sale Dollars])}
  • 지역별 매출 합계 필드 > 도구설명에 추가
  • 도구설명 편집

‘순위’ 계산된 필드 추가

Index()
  • 불연속형 선택

필터에 순위 20위 까지만 선택

카테고리 매출 순위 TOP 20 - 히트맵, 워드클라우드

히트맵

  • 레이블: Category Name
  • 레이블: 합계(Sales Dollars)
  • 크기: 합계(Sales Dollars)
  • 색상: 합계(Sales Dollars)

워드클라우드

  • 레이블: Category Name
  • 크기: 합계(Sales Dollars)
  • 색상: 합계(Sales Dollars)
  • 마크형태: 텍스트

도매상 매출 순위 TOP 20 - 파이차트, 바 차트

파이차트

  • 행 선반: Vendor Name
  • 열 선반: 합계(Sale Dollars)
  • 표현방식: 파이차트

바차트

  • 행 선반: Vendor Name

  • 열 선반: 합계(Sale Dollars)

  • 표현방식: 가로막대차트

  • 정렬(Vendor Name): 필드 > Sale Dollars > 내림차순

  • 색상: 합계(Sale Dollars)

  • 필터: 계산된필드’순위’ 20

  • 필터: City - MOUNT VERNON

아이템 매출 그래프 - 도구 설명에 시트 삽입 해보기

먼저 삽입하고 싶은 시트 그리기

  • 행 선반: 합계(Sale Dollars)
  • 열 선반: Item Description
  • 정렬(Item Description): 필드 > Sale Dollars > 내림차순
  • 색상: 합계(Sale Dollars)
  • 필터: 계산된 필드 ‘순위’ 5

도매상 매출 순위 Top20 로 가서 도구설명 설정하기

  • 도구설명 편집 > 삽입 > 시트

두가지 이상의 시각화를 하나의 그래프에 보여주기 완성

도시별/스토어별/아이템별 정보 상세 - total

  • 필터: City - MOUNT VERNON

‘총 매출’ 계산된 필드 만들기

TOTAL(SUM([Sale Dollars]))
  • 행 선반: Store Name & 총매출 & Item Description & 합계(Sale Dollars)
  • 총매출: 다음을 사용하여 계산 > Item Description

‘도시별 스토어별 매출’ 계산된 필드 만들기

{FIXED [City], [Store Name]: SUM([Sale Dollars])}

결국 위의 ‘총매출’ 필드와 ‘도시별 스토어별 매출’ 필드의 값은 같다.

‘도시별 매출’ 계산된 필드 만들기

{FIXED [City]:sum([Sale Dollars])}

‘총 매출’ 필드와 ‘도시별 매출’ 계산된 필드도 ‘총 매출’ 데이터 필드를 ‘테이블(아래로)’로 계산할 시 같아진다.

미국 전역 주류 매출 지도 - 맵 차트

  • 도시필드 > 지리적 역할 > 주/시/도

  • 표현방식 : 지도

  • 색상: 합계(총 매출)

  • 레이블: 도시

레이블에 Iowa 만 표시하는 계산된 필드 만들기

  • 이름: Iowa 이름
if [도시] == 'Iowa' then 'Iowa' END

도구설명 다듬기

<특성(랭킹)>위
도시:	<도시>
총 매출:	<합계(총 매출)>

인터랙티브 대시보드 만들기 - 필터, 매개변수

동작 - 필터 추가하기

  • 원본 시트: 2022년 매출 동향, 주 별 도매상 및 아이템 수
  • 대상 시트: 아이템 매출 순위 Top20, 도매상 매출 순위 Top 20, 전월 대비 매출 성장 정도, 카테고리 매출 순위
  • 필터: 선택한 필드 (City)

같은 변화를 ‘매개 변수’를 따로 만든 후 필터링을 해서 방금 전과 같은 값을 만들어 보자.

  1. 계산된 필드 ‘도시 필터’ 만들기
if [도시 선택] = [City] then True else False end
  1. 매개변수 ‘도시 선택’ 만들기
  • 데이터 유형: 문자열
  • 허용 가능한 값: 목록
  • 다음에서 값 추가: city_data > city

‘전월 대비 매출 성장 정도’ 그래프로 가서 필터 입혀보자

  • 필터: 도시 필터 > 참

  • 다른 원하는 그래프도 다~

대시보드에 매개변수 적용하기

  • 동작 > 매개 변수 동작 추가

  • 원본시트: 주 별 도매상 및 아이템 수

  • 동작 실행 조건: 선택

  • 대상 매개 변수: 도시 선택

  • 원본 필드: City

  • 제목 수정

추천 지역 상세보기 (지역:<매개 변수.도시 선택>)

사용자를 위한 대시보드 - 탐색, 다운로드

대시보드를 하나 추가

  • 도시별 스토어별 아이템별 정보 테이블 적용
  • 필터에 ‘도시필터’추가
  • 제목 편집
<시트 이름> (도시: <매개 변수.도시 선택>)

사용자를 위한 대시보드 - 탐색, 다운로드

대시보드를 하나 추가

  • 도시별 스토어별 아이템별 정보 테이블 적용
  • 필터에 ‘도시필터’추가
  • 제목 편집
<시트 이름> (도시: <매개 변수.도시 선택>)

대시보드 2로 가서…

  • 다운로드 버튼 적용

  • 텍스트로 안내: “해당 도시 상세 데이터 다운로드는 오른쪽 버튼을 클릭 해 주세요.”

  • 다운로드 버튼 편집

    • 내보낼 위치: 크로스탭
    • 제목: 도시 정보 상세 데이터 다운로드

태블로 서버/클라우드를 이용한 대시보드 발행

https://public.tableau.com/views/_17118771125010/sheet11?:language=ko-KR&publish=yes&:sid=&:display_count=n&:origin=viz_share_link


Studied from 제로베이스 데이터스쿨

⚠️ **GitHub.com Fallback** ⚠️