글 원본 : https://blog.naver.com/tigerkey10/222290773948
이 글은 내가 지킬 블로그를 만들기 전,
네이버 블로그에 공부 내용을 기록할 때 학습하고 복습하면서 기록했던 글을 옮겨온 것이다.
네이버 블로그에서 글을 옮겨와 지킬 블로그에도 기록해둔다.
모든 공부 과정을 기록으로 남겨 치열했던 시간들을 기록으로 남기고,
미래에 전달해 스스로 동기부여할 것이다. 또한 반복해서 학습. 복습하는 과정에서
어떤 개념에 대한 내 이해가 어떻게 변화.발전 했는지 관찰함으로써 스스로의 학습 정도를 돌아보는 거울로 삼고자 한다.
https://partrita.github.io/posts/tidy-data/
https://vita.had.co.nz/papers/tidy-data.html
이 글은 위 링크의 글을 보고, 깔끔한 데이터의 개념에 대해 공부를 한 뒤 배운 개념을 복습, 훈련 하면서 작성한 글 입니다.
깔끔한 데이터
깔끔한 데이터란 데이터 분석. 특히 수집된 데이터 ‘전처리’ 과정에 들어가는 시간을 줄이기 위한 개념이다.
나는 깔끔한 데이터의 기본 공리를 아래 3가지로 정의했다.
tidy data 공리 3가지
-
1 각 칼럼에는 유니크한 단일 변수만 들어갈 수 있다.
-
2 한 개 표에는 하나의 관측치만 들어갈 수 있다.
-
3 각 칼럼에는 유니크한 단일 관측치만 들어갈 수 있다.
위 세 가지 기본 공리를 기반으로, 데이터가 깔끔한 데이터인지, 지저분한 데이터인지 분간할 수 있다.
아래 표를 ‘깔끔한 데이터’ 형태로 바꿔보자.
#1. 표를 만들어보자.
test = pd.DataFrame([[20,43000,23,23000,70,23100,37,31300],
[30,12000,91,32200,41,31300,24,43000],
[19,19000,60,434000,32,23000,1,84700],
[28,39900,87,93500,14,84200,3,99900],
[14,50000,22,42000,93,93800,34,42400],
[96,68000,73,74000,73,42300,123,42200],
[39,12000,18,23140,45,88200,3,88800]],
index=pd.MultiIndex.from_tuples([['central','1'],
['central','2'],
['central','3'],
['northern','1'],
['northern','2'],
['southern','1'],
['southern','2']]),
columns=[['first period','first period','first period','first period','second period','second period','second period','second period'],
['1Q','1Q','2Q','2Q','3Q','3Q','4Q','4Q'],
['supply','price','supply','price','supply','price','supply','price']])
test
주어진 코드로 위와 같은 표를 만들 수 있다.
-
칼럼에 여러 변수 값들이 들어가 있다. –> row로 내리기 pd.melt
-
인덱스에도 변수의 값들이 들어가 있다. –> 칼럼으로 올리기 reset_index(drop=False)
-
두 개 관측단위가 한 개 표에 동시에 들어가 있다. –> 표와 표 분리하고, 서로 공유하는 칼럼 생성해서 두 표 연결성은 보존하기
위 세 가지 이유로 위 표는 깔끔한 데이터라고 볼 수 없다.
# 인덱스에 변수 값들이 들어가 있다. 칼럼으로 올리자.
test.reset_index(inplace=True)
test.rename(mapper={'level_0':'region'}, axis=1, inplace=True)
test.rename(mapper={'level_1':'district'}, axis=1, inplace=True)
test
# 남은 문제 : 표에 두 개의 관측단위가 공존한다. + 칼럼에 여러 변수 값들이 존재한다
먼저 인덱스에 들어가 있는 변수 값들을 칼럼으로 올려보자.
표가 위와 같이 조작된다. 원래 인덱스에 들어가 있던 변수 값들이 ‘region’, ‘district’ 라는 변수의 칼럼으로 들어갔음을 볼 수 있다.
test.info()
이제 그러면 다음 문제를 해결해보자. 위 표에는
두 가지 관측단위(supply, price)가 동시에 들어가있다.
supply와 price를 각각의 표로 분리시키자.
test_n = test[[('region','',''),('district','',''),('first period','1Q','supply'),('first period','2Q','supply'),('second period','3Q','supply'),('second period','4Q','supply')]]
test_p = test[[('region','',''),('district','',''),('first period','1Q','price'),('first period','2Q','price'),('second period','3Q','price'),('second period','4Q','price')]]
공리2번 : 각각의 표에는 하나의 관측치만 들어갈 수 있다.
[supply ]
[price ]
이제 그러면 위 표에서 칼럼에 여러 변수 값이 동시에 들어가 있는 문제를 해결해 보자.
# 1-2 칼럼에 변수값들이 있고, 여러 변수가 들어가 있다.
test_n_m = test_n.melt(id_vars=['region','district'],var_name=['period','quater','supply',], value_name='ob_unit')
test_n_m = test_n_m.pivot(index=['region','district','period','quater'],columns='supply',values='ob_unit').reset_index(drop=False)
test_n_m #tidy data.
test_n_m.head(n=10)
#1-3 마찬가지로 변수에 값들이 들어가 있고, 여러 변수가 한개 칼럼에 동시에 들어가 있다. 없애자.
test_p
test_p_m = test_p.melt(id_vars=['region','district'],var_name=['period','quater','price'], value_name='ob_unit')
test_p_m.head()
test_p_m = test_p_m.pivot(index=['region','district','period','quater'],columns='price',values='ob_unit').reset_index(drop=False)
tidy data 두 개가 완성되었다.
이제 그러면 관측단위가 다른 두 표를 연결시켜 줘야 한다. (두 표는 최소한 한 개 칼럼을 공유해야 한다)
test_n_m['number_id'] = test_n_m.index
test_n_m.head()
merged = pd.concat([test_n_m, test_p_m], axis=1)
merged.drop_duplicates(inplace=True)
p_m = merged[['number_id','price']]