본문 바로가기
Big Data/Database

Long format / Wide format

by Wikinist 2023. 7. 26.

Long format과 Wide format은 데이터를 표현하는 방식 중 두 가지 주요한 형태입니다. 이러한 표현 방식은 주로 데이터 분석과 시각화에 사용되며, 데이터의 구성과 해석에 영향을 미칩니다.

Long format

Long format은 "긴 형식"이라고도 하며, 데이터를 기록할 때 하나의 관찰값(예: 행)이 하나의 행에 위치하도록 하는 형태를 말합니다. 각 관찰값은 고유한 식별자에 의해 구분되며, 여러 개의 변수가 사용될 수 있습니다.
예시를 통해 설명하겠습니다. 아래는 "과일"이라는 데이터를 long format으로 표현한 예시입니다.

person_id fruit quantity
1 apple 3
1 banana 2
1 orange 1
2 apple 2
2 banana 4
2 peach 2

위의 예시에서, 각 관찰값은 개별 행에 위치하고 있으며, 'person_id'라는 식별자를 통해 사람별로 과일과 수량이 기록되어 있습니다.

Wide format

Wide format은 "넓은 형식"이라고도 하며, 데이터를 기록할 때 하나의 관찰값(예: 행)이 하나의 열에 위치하도록 하는 형태를 말합니다. 각 열은 하나의 변수를 나타내며, 여러 개의 관찰값이 사용될 수 있습니다.
이전 예시의 데이터를 wide format으로 변환하면 다음과 같습니다.

person_id apple banana orange peach
1 3 2 1 0
2 2 4 0 2

위의 예시에서, 각 관찰값은 개별 열에 위치하고 있으며, 'person_id'라는 식별자를 통해 사람별로 과일과 수량이 기록되어 있습니다.

어떤 형태가 더 적절한지는 데이터 분석의 목적과 시각화 방법에 따라 다를 수 있습니다. 일반적으로 데이터 분석을 위해서는 Long format이 더 유용하며, 시각화를 위해서는 Wide format이 더 적절할 수 있습니다. 데이터베이스나 분석 도구에 따라 데이터 형식을 변환하는 기능을 제공하기도 하므로, 데이터의 구성과 분석 목적에 맞게 적절한 형태로 변환하여 사용하는 것이 중요합니다.

Long format에서 Wide format으로 변환하기

MySQL에서 Long format과 Wide format 간의 변환은 주로 데이터의 재구성을 위해 여러 기능과 함수를 사용할 수 있습니다. 아래에서는 각 형식을 서로 변환하는 방법을 설명하겠습니다.

Long format의 데이터를 Wide format으로 변환할 때는 주로 PIVOT 기능을 사용합니다. MySQL에는 직접적인 PIVOT 함수가 없지만, CASE WHEN 구문을 활용하여 PIVOT과 유사한 동작을 수행할 수 있습니다.

예를 들어, 위에서 소개한 Long format의 과일 데이터를 Wide format으로 변환해 보겠습니다.

SELECT
  person_id,
  MAX(CASE WHEN fruit = 'apple' THEN quantity ELSE 0 END) AS apple,
  MAX(CASE WHEN fruit = 'banana' THEN quantity ELSE 0 END) AS banana,
  MAX(CASE WHEN fruit = 'orange' THEN quantity ELSE 0 END) AS orange,
  MAX(CASE WHEN fruit = 'peach' THEN quantity ELSE 0 END) AS peach
FROM
  fruits
GROUP BY
  person_id;

 

위의 쿼리는 'fruits' 테이블에서 'person_id'를 기준으로 각 과일별 수량을 Wide format으로 변환합니다. CASE WHEN 구문을 사용하여 각 과일을 열로 변환하고, 해당 과일에 해당하는 수량 값을 가져옵니다.

Wide format에서 Long format으로 변환하기

Wide format의 데이터를 Long format으로 변환할 때는 UNPIVOT 기능을 사용합니다. MySQL에서는 직접적인 UNPIVOT 함수가 없기 때문에, UNION ALL을 사용하여 열을 행으로 변환할 수 있습니다.

예를 들어, Wide format의 과일 데이터를 Long format으로 변환해 보겠습니다.

SELECT person_id, 'apple' AS fruit, apple AS quantity FROM fruits
UNION ALL
SELECT person_id, 'banana' AS fruit, banana AS quantity FROM fruits
UNION ALL
SELECT person_id, 'orange' AS fruit, orange AS quantity FROM fruits
UNION ALL
SELECT person_id, 'peach' AS fruit, peach AS quantity FROM fruits;

위의 쿼리는 'fruits' 테이블에서 각 과일별 수량을 Long format으로 변환합니다. UNION ALL을 사용하여 각 과일을 행으로 변환하고, 해당 과일에 해당하는 수량 값을 가져옵니다.

데이터의 형식을 변환할 때는 기존 데이터의 구성과 분석 목적에 주의하며, 적절한 방법을 선택하는 것이 중요합니다. 이러한 변환 과정을 통해 데이터를 원하는 형태로 조작할 수 있습니다.

실전예제

Wide Format

INSERT INTO passenger_number
         (use_date, line_num, st_name, use_hour, is_ride, amount)
SELECT (date_format(use_date, '%Y%m%d')) as use_date, line_num, st_name, '00-01' as use_hour, 1 is_ride,
      CASE WHEN 00_01_ride <> 0 THEN 00_01_ride ELSE 0 END as amount
FROM master_table
UNION ALL
SELECT (date_format(use_date, '%Y%m%d')) as use_date, line_num, st_name, '00-01' as use_hour, 0 is_ride,
        CASE WHEN 00_01_alight <> 0 THEN 00_01_alight ELSE 0 END as amount
FROM master_table

Long Format

해당 게시글은 ChatGPT의 도움을 받아 작성되었습니다.

 

'Big Data > Database' 카테고리의 다른 글

GROUP BY 사용 시 제한  (0) 2023.07.26
EXISTS, ANY, ALL  (0) 2023.07.26
DATA_ADD 함수  (0) 2023.07.26
공통 테이블 표현식(CTE)  (0) 2023.07.26
서브쿼리를 이용한 뷰 생성 및 사용 예제  (0) 2023.07.26