06 Tidy Data - stack, melt, pivot
오늘은 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로 자동 제거
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를 이동)
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 명으로 정돈 한다.
- melt한 경우 index 명은 RangeIndex로 대체
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 컬럼의 값들을 사용