코린이 유치원/파이썬반

06 Tidy Data - stack, melt, pivot

개나리반 2022. 6. 15. 23:55

 

오늘은 Tiday Data에 대해서 배워보자!

집 정리는 못하니깐변 

데이터 정리라도 잘하는 사람이 되기를🙏


01 Tidy Data 개요

데이터 재구성의 목적은 정돈된 데이터(tidy data)를 만드는 것이다.

정돈된 데이터란?

  • 각 변수(데이터의 속성)가 열을 형성하는 데이터
  • 각 관측값(하나의 데이터)은 행을 형성하는 데이터 
  • 각 관측 단위별로 별도의 테이블 구성하는데이터 --> 단일 관측

변수

: 변수, Feature, 컬럼으로 불린다.

변수는 통계쪽, Feature는 머신러닝, 컬럼은 데이터 베이스에서 주로 사용된다.

 

변수 값

: value, 관측을 통해서 얻은 값

 

단일 관측

  • 하나의 Entity, 하나의 데이터를 말한다 -> 이것이 단일 관측 단위
    • DataFrame(Pandas),Table(데이터베이스), 표(엑셀)로 표현
  • 단일 관측 대상은 여러개의 속성들로 구성, 그 속성을 변수, Feature, 컬럼이라고 함
    • 단일 관측은 하나의 데이터에 대한 모든 변수값의 모음
    • 관측 대상의 단위 -> 하나의 데이터 -> 변수들로 구성
  • 백화점에서 직원정보, 고객정보, 제품 정보 등의 데이터가 필요하다면
    • 종업원정보와 고객정보를 같은 테이블에 병합 x

정돈되지 않은 데이터의 형태

  • 열 이름이 변수 이름이 아니라 값인 경우
  • 열 이름에 복수 개의 변수가 저장된 경우
  • 변수가 행과 열에 모두 저장된 경우
  • 같은 테이블에 복수형식의 관측 단위가 저장된 경우 
  • 단일 관측 단위가 복수 테이블에 저장된 경우

 

데이터 정돈의 의미

단순히 데이터셋 값을 바꾸거나 결측치 채우는 것만이 아닌 데이터를 정돈하는 것은 데이터의 ㅎ여태나 구조를 정돈 원칙에 맞게 변형 시키는 것 -> 데이터가 올바른 구조로 주어진다면 분석이 쉬워지니깐

 

데이터 정돈의 메소드

  • stack() / unstack()
  • melt()
  • pivot()
  • pivot_table()
  • 정돈된 데이터를 다듬는 메소드
    • rename()
    • rename_axis()
    • reset_index()
    • set_index()

 

01 Stack

  • 컬럼명을 index 명으로 전환 -> 기존 index 있으면 하위레벨(멀티 인덱스)로 들어감 
  • 컬럼명을 컬럼의 값으로 전치시킬 때도 사용 가능
  • 매개변수: dropna = Flase(stcaking 시 생성되는 결측치는 제거되지 않게 한다) -> 디폴트는 True로 자동 제거

state.fruits

s1 = state.fruits.stack()
s1

state.fruits DF에 stack을 적용하면 apple, orange,banana가 인덱스로 변환되어, 2개의 인덱스를 갖게됨

데이터 형식도 시리즈로 변경

 

# .to_frame: DataFrame으로 변환
s1.to_frame(name = 'price') # 열 이름 부여

열 이름 부여

 

데이터를 살펴보니 미국 주 이름과 과일 종류도 변수로 만드는 것이 더 적합해 보인다. (맞지?)

state_fruit_tidy = s1.to_frame(name = 'price').reset_index() # reset_index로 번호 인덱스 생성
state_fruit_tidy

state_fruit_tidy.rename(columns = {'level_0':'state', 'level_1':'fruit'}, inplace = True) # 컬럼명 변경
state_fruit_tidy

번호 인덱스 생성하고 세가지 값은 모두 열로 설정하고 이름까지 부여 완료!

 

02 Unstack

  • stack 반대로 index를 컬럼으로 변환한다.
  • 매개변수: level(multi-index일 경우 컬럼으로 만들 레벨을 지정한다. 기본값은 -1로 가장 안쪽의 index를 이동)

s

state, fruit이 index, price가 값인 상태

fruit을 column으로 만들고 싶다면? 정답은 unstack

s.unstack()

 

03 Melt

  • stack과 같이 컬럼명을 단일 컬럼의 값으로 변환
  • 변환할 컬럼들을 지정할 수 있어 stack보다 더 유연

매개변수

  • id_vars: 값으로 변환하지 않고 그대로 유지하고자 하는 컬럼명들의 리스트
    • 식별변수
    • 지정한 컬럼은 열에 남게 되고, value_vars에 전달된 각 열에 대해 반복적으로 나타남
  • value_vars: 하나의 컬럼의 값으로 변경하고자 하는 컬럼명 리스트
    • value_vars에 지정한 컬럼이 value가 되고 그 컬럼의 값들은 다른 컬럼으로 생성
    • id_vars와 value_vars에 지정 안된 컬럼은 제거
      • 제거되지 않고 단독 컬럼으로 유지되길 바라는 컬럼은 id_vars로 지정
  • var_name: value_vars로 단일열이 된 열의 이름 지정(지정 안하면 컬럼명은 variable)
  • value_name: value_vars에 지정된 열들의 값들이 변환된 컬럼의 이름 지정(지정 안하면 컬럼명은 value)
    • melt한 경우 index 명은 RangeIndex로 대체
      • Index를 유지하려면 reset_index를 이용해 value로뺀 뒤 해야 한다.
    • stack은 열 이름을 index 명으로 정돈 한다.

sf

index = 0, 1, 2/ column = state, Apple, Orange, Banana

 

01 id_vars, value_vars

sf.melt(id_vars = ['state'], # 컬럼으로 유지될 컬럼명
		value_vars =['Apple', 'Orange', 'Banana']) # 컬럼의 값으로 만들 컬럼명

 

02 컬럼명 제거 

value_vars에 포함 되지 않은 컬럼명은 값이 되지 못하고 제거 된다.

sf.melt(id_vars = ['state'],
		value_vars = ['Apple', 'Orange'])

03  컬럼명 지정

지정 하지 않으면 variable, value로 들어있던 컬럼명들을 지정해서 알맞게 바꿔보자!

state_fruit_melt = sf.melt(id_vars = ['state'], value_vars = ['Apple', 'Orange', 'Banana'],
	var_name = 'fruits',  # value_var에 지정한 컬럼명을 값으로 가지는 컬럼의 이름
    value_name = 'price') # value_var에 지정한 컬럼들의 값들을 가지는 컬럼의 이름

04 Pivot

  • 데이터 프레임 재구조화가 목적
  • 데이터 프레임에서 두개이상의 범주형 번수를 그룹으로 묶어 특정 값을 보려고 할 때 사용
    • pivot_table은 그룹으로 묶은 뒤 특정변수의 통계량을 본다면 pivot은 그 값을 그대로 본다.
  • melt()된 것을 원상복구 시킬때도 사용할 수 있음.

pivot은 정말 뭔가 데이터 프레임으로 찰흙놀이 하는 것 마냥 원하는 대로 쭈물쭈물할 수 있다!

 

df = state_fruit.melt.pivot(index = 'state', # state 컬럼의 값들이 index명이 됨
							columns = 'fruits', # fruits 값들이 columns명이 됨
                            values = 'price') # DF 값으로 price 컬럼의 값들을 사용