A. 주제

: 데이터 리터러시(Data Literacy)를 올리는 방법, 화해팀, 2022.08.08

: 데이터 리터러시(Data Literacy)를 올리는 방법 | 요즘IT (wishket.com)

B. 요약

데이터 리터러시는 데이터를 활용해 문제를 해결하는 능력을 의미함. 화해팀은 실험 프로세스를 도입하여 문제 정의, 솔루션, 측정 지표를 명확히 하고, 데이터 중심의 업무를 진행한다. 데이터맵과 대시보드을 통해 지표 간 관계와 현재 수준을 쉽게 파악한다. 데이터 분석가는 실행 가능한 액션 아이템을 제안하고, 데이터 플랫폼을 통해 분석 효율성을 높인다. 

C. 주요 포인트

1. 데이터 리터러시 정의: 데이터를 활용해 문제를 정의하고 해결하는 능력.

2. 데이터/실험 기반 사고방식:
모든 업무를 데이터와 실험 기반으로 실행한다.
실험 프로세스를 도입해 문제 정의, 관련 OKR, 측정 지표, 가설 검증 기준, 검증 후 변화될 액션, 결과, 학습한 점 등을 명확히 기록한다.
조직 전반에 걸쳐 실험과 데이터 기반 문제 해결 중심으로 업무 수행한다.

3. 분석 흐름대로 데이터를 탐색할 수 있는 환경:
데이터맵: 중요한 인풋 지표와 아웃풋 지표 간의 관계를 시각화해 구성원이 문제 해결에 필요한 지표를 쉽게 파악함.
대시보드: 분석 흐름을 따라 지표의 현재 수준을 확인할 수 있는 환경을 제공해 구성원들이 지표 변동과 원인을 빠르게 파악함.

4. 데이터 분석가의 역할:
단순히 데이터 분석과 리포팅을 넘어 문제 정의, 원인 분석, 액션 아이템 도출까지 포함한다.
역할을 명확히 하고, 분기마다 분석가의 업무 방향성을 일치시킨다.
데이터 플랫폼(데이터레이크, 데이터 웨어하우스, 데이터 카탈로그) 구축으로 업무 효율을 높이고, 분석가뿐만 아니라 구성원들이 데이터를 쉽게 접근할 수 있도록 한다.

 

D. 핵심 용어

데이터 리터러시: 데이터를 활용해 문제를 해결할 수 있는 능력

A. 어떤 문제가 있었는지
: SQL 코드카타의 '가격이 제일 비싼 식품의 정보 출력' 문제 풀이 시 집계 함수를 중심으로 정보 출력이 안되었다.

  MAX(PRICE)를 기준으로 다른 항목의 값이 출력되지 않았다.

문제 설명
다음은 식품의 정보를 담은 FOOD_PRODUCT 테이블입니다. FOOD_PRODUCT 테이블은 다음과 같고, PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, PRICE는 식품 ID, 식품 이름, 식품 코드, 식품분류, 식품 가격을 의미합니다.
Column name Type Nullable
PRODUCT_ID VARCHAR(10) FALSE
PRODUCT_NAME VARCHAR(50) FALSE
PRODUCT_CD VARCHAR(10) TRUE
CATEGORY VARCHAR(10) TRUE
PRICE NUMBER TRUE

 

B. 내가 시도해본 것
:  PRICE를 기준으로 그룹 생성, FROM 절에 서브쿼리를 생성하여 전체 정보 중 가장 비싼 항목만을 선택하였다.

SELECT PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD,CATEGORY,MAX(PRICE) PRICE
FROM FOOD_PRODUCT
PRODUCT_ID PRODUCT_NAME PRODUCT_CD CATEGORY PRICE
P0001 맛있는라면 CD_ND00001 19000


C. 어떻게 해결했는지
: SQL  WHERE절에 서브쿼리를 생성하여 해결하였다.

SELECT PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD,CATEGORY, PRICE
FROM FOOD_PRODUCT
WHERE (SELECT MAX(PRICE) FROM FOOD_PRODUCT) = PRICE
PRODUCT_ID PRODUCT_NAME PRODUCT_CD CATEGORY PRICE
P0051 맛있는배추김치 CD_KC00001 김치 19000


D. 무엇을 새롭게 알았는지

WHERE 절에 서브쿼리를 사용할 수 있다.

서브쿼리 : SQL문 내부에 사용되는 SELECT 문을 의미한다. 

SELECT문: 데이터베이스로부터 데이터를 조회하기 위한 SQL 명령어

                 특정 테이블의 모든 데이터를 조회하거나 특정 열만을 선택하여 조회 가능.

 

A. 어떤 문제가 있었는지

: 금일까지 제출해야하는 SQL 과제가 있었으나 문제가 어려웠다.

 

B. 내가 시도해본 것

: SQL 강의를 모두 듣고 숙제 및 온보딩 주차 강의를 따라가며 실습하였다.

 

C. 어떻게 해결했는지

: SQL 구조와 문제의 문장 간 관계에 집중하였다. 어떤 데이터가 필요하고, 그 위에 어떤 방식으로 데이터를 솎아내면 되는지에 집중해 공부하였다.

 

D. 무엇을 새롭게 알았는지

: SubQuery, Join, Pivot, Format 생성 및 변경 하는 방법을 알았다.

- SubQuery와 Join을 활용하여 복잡한 연산 수행이 가능하다는 것을 배웠다.

- 예상치 못한 데이터 값에 대한 분석 및 적절한 처리 방법을 습득하였다.

 

Q. 식당별 평균 음식 주문 금액과 주문자의 평균 연령을 기반으로 Segmentation 하기

SELECT restaurant_name,
       price_group,
       case when age<30 then '~20대'
       		when age<40	then '30대'
       		when age<50 then '40대'
       		ELSE '50대 이상'
       		END age_group
FROM
(
SELECT restaurant_name,
	   age,
       case when price>=5000 then '5,000원'
       		when price>=10000 then '10,000원'
       		when price>=30000 then '30,0000원'
       	    ELSE '30,000원 초과' END price_group     
FROM 
(
SELECT f.restaurant_name,
       avg(f.price) price,
       avg(c.age) age
FROM food_orders f INNER JOIN customers c ON f.customer_id = c.customer_id
GROUP BY f.restaurant_name
) base
) avg_price
ORDER BY restaurant_name

 

Q. 음식 타입별, 연령별 주문건수 Pivot View 만들기

SELECT cuisine_type,
	   sum(case when age between 10 and 19 then 1 else 0 end) as '10대',
	   sum(case when age between 20 and 29 then 1 else 0 end) as '20대',
	   sum(case when age between 30 and 39 then 1 else 0 end) as '30대',
	   sum(case when age between 40 and 49 then 1 else 0 end) as '40대',
	   sum(case when age between 50 and 59 then 1 else 0 end) as '50대',
	   count(1) cnt_order
FROM food_orders f INNER JOIN customers c ON f.customer_id =c.customer_id
where age BETWEEN 10 and 59
GROUP BY 1
ORDER BY 1

※  형식을 외우면 쉽지만, 이론적으로 왜 이렇게 코드를 작성하여야 하는지 모르겠다.

 

[과제 중 어려웠던 문제]

Q. 아래 조건을 만족시키는 코드를 생성하라

조건
1. user 테이블에서 서버 번호가 2 이상인 데이터와 payment 테이블에서 결제 수단 'Card' 인 경우Join
2. 게임계정ID별로 게임캐릭터ID를 중복값 없이 세어 'actorcnt' 로 컬럼명 명시
3. 게임계정ID별 결제금액의 합 출력하고 'sumamount'로 컬럼명 명시
4. 최종적으로 'actorcnt'가 2 이상인 경우만 추출, 'sumamount' 의 내림차순 정렬
select game_account_id,
       count(distinct game_actor_id) as actorcnt,
       sum(pay_amount) as sumanount
from 
(
select u.serverno, u.game_account_id, p.pay_type, p.pay_amount, u.game_actor_id
from users u left join payment p on u.game_account_id = p.game_account_id 
)a
where serverno >=2
	and pay_type = 'CARD'
group by game_account_id
having actorcnt >=2
order by sumanount desc

▶ 조건이 많고, Join 구문에 익숙하지 않아 코드의 흐름을 따라가는 것이 큰 어려움으로 다가옴.

    그러나 반복적인 강의 실습을 통해 SQL의 구조에 따라 어떻게 작성하는 것이 좋은지 감을 잡아가고 있음.

 

번외

[예상과 많이 다른 튜터와 코드 비교]

조건
1. 각 서버(serverno)별로 결제한 사용자의 수를 계산하세요.
2. 서버 번호와 해당 서버에서 결제한 사용자 수를 반환해야 합니다.

3. 사용자 수는 중복 제거한 상태로 계산해주세요. 결과값은 아래와 같아야합니다.
select serverno, count(distinct game_account_id) as 'users_with_payment'
from 
(
select p.game_account_id, u.serverno
from users u inner join payment p on u.game_account_id = p.game_account_id
) a
group by serverno
SELECT serverno, COUNT(DISTINCT(u.game_account_id))
FROM USERS u
JOIN PAYMENT p ON u.game_account_id = p.game_account_id
GROUP BY u.serverno

한 눈에 봐도 튜터의 코드와 비교됨. 좀 더 간결하게 작성하는 방법을 생각하자.

A. 주제

: SQL 가독성을 높이는 다섯 가지 사소한 습관, 데이터리안(윤선미), 2022.06.09

: SQL 가독성을 높이는 다섯 가지 사소한 습관 | 요즘IT (wishket.com)

 

 

B. 요약

SQL이란 Structured Query Language으로, 관계형 데이터베이스 관리 시스템의 데이터를 관리하기 위하여 설계된 특수목적의 프로그래밍 언어이다. "언어"는 의사소통을 위해 만들어진 체계이다. 즉, 작성된 코드를 보고 그 언어를 사용하는 사람들 간의 의사소통이 가능해야한다는 것이다. 

가독성 높은 쿼리를 작성하는 것은 수월한 의사소통을 위함이고 더 효율적인 업무 처리를 할 수 있다.

 

C. 주요 포인트

1. 예약어는 대문자로 작성

- 예약어, 함수 이름 등을 대문자로 쓰는 습관은 에디터와 상관없이 코드 구분이 용이하다.

 

2. 빈번한 행갈이 필요

- 예약어에 따라 행갈이를 하면 빠른 문제 파악 및 로직을 빠르게 변형 가능하다.

 

3. 주석 사용

- 코드를 쓴 의도를 적어 놓는 습관은 추후 이용이 쉽다.

 

4. 성의있는 별칭(Alias) 짓기

- 다시 찾아보았을 때 이해하기 쉽다.

 

5. 합의된 규칙으로 작성

- 타인이 보았을 때도 이해가능하도록 작성하고 정리하는 것이 중요하다.

 

D. 핵심 용어

1. 예약어: 컴퓨터 프로그래밍 언어에서 이미 문법적인 용도로 사용되고 있기 때문에 식별자로 사용할 수 없는 단어

2. Alias: 가명, 별명, 변수명 / SQL 안에서 'AS'를 사용하여 나타냄. 생략이 가능하나 작성 시 가독성이 높아짐

 

내일배움캠프 데이터분석의 본캠프는 2024.06.24. 시작하였으나, 한국토지신탁 근무로 인해 2주차부터 캠프에 합류하였다.

 

A. 어떤 문제가 있었는지

: 처음보는 언어로 과제를 진행할 수 없었다.

 

B. 내가 시도해본 것들

: 스파르타에서 제공하는 SQL 관련 강의를 들으며 MySQL 설치부터 시작하여 기초적인 문법을 학습하였다.

 

C. 어떻게 해결했는지

:  SQL에 익숙해지고자 강의에서 제공하는 실습문제와 숙제를 풀었다.

 

D. 무엇을 새롭게 알았는지

: SQL 기본 문법 및 데이터 조회/필터링, 데이터 연산 및 정렬 등의 방법을 알게 되었다.

 

- SELECT 문을 사용하여 데이터를 조회

- WHERE 절을 이용하여 필터링하는 방법을 이해하고 활용

- SQL을 활용하여 숫자계산 및 문자열 다듬기

- 퀴리 결과를 원하는 순서대로 정렬

 

Q. 상품 시간이 20~30분 사이인, 한국 음식점의 식당명과 고객번호 조회하기

SELECT restaurant_name '식당명', customer_id '고객번호'
FROM food_orders
WHERE food_preparation_time between 20 AND 30
AND cuisine_type = 'Korean'

 

Q. 음식 종류별 가장 높은 주문금액과 가장 낮은 주문금액을 조회하고, 가장 낮은 주문금액 순으로(내림차순) 정렬하기

SELECT cuisine_type,MAX(price),MIN(price)
FROM food_orders
GROUP BY cuisine_type
ORDER BY price desc

 

Q. 다음의 조건으로 배달시간이 늦었는지 판단하라.

조건
주중 : 25분 이상
주말 : 30분 이상
 SQL 문의 기본 구조로 시작
조건을 여러번 적용할 때 if, case 문 중 어떤 것을 이용할지 결정
조건에 ‘주중, 주말’ 조건과 ‘배달시간’ 조건을 동시에 줄 때 사용 할 논리연산자 결정

 

1. CASE문 활용

SELECT day_of_the_week "주중구분", delivery_time AS "배달시간",
	   CASE WHEN day_of_the_week='Weekday' AND delivery_time>=25 THEN "Late"
			WHEN day_of_the_week='Weekday' AND delivery_time<25 THEN "On Time" 
			WHEN day_of_the_week='Weekend' AND delivery_time>=30 THEN "Late"
			WHEN day_of_the_week='Weekend' AND delivery_time<30 THEN "On Time" 
	   END "지연여부"
FROM food_orders

 

2. IF문 활용

SELECT day_of_the_week "주중구분", delivery_time "배달시간",
	   IF(day_of_the_week ='Weekday'AND delivery_time>=25, "Late",
	      IF(day_of_the_week='Weekend'AND delivery_time>=30,"Late","On Time"))"배달지연여부"
FROM food_orders

 

마무리

: 늦은 만큼 부지런히 공부하자.

+ Recent posts