본문 바로가기
취준일기 + Working

[Python] shape과 axis에 대하여 | 데이터 결측치 확인하는 법

by 햄찌네굴렁쇠 2022. 1. 5.

안녕하세요 햄찌입니다.

최근 DACON 컨테스트에 참여하고 있는데요 베이스코스이다보니 기본 코드를 제공해줘요.

저는 필사하면서 하나씩 공부하고 있는데요. 그 첫번째는 "데이터 결측치"를 확인하는 것입니다.

데이터가 완전하지 않으면 대표값을 얻기 어려울뿐더러 예측하기 위해 모델링을 할 때에도 오류가 나기 쉬우니까요.

 

114*10 의 데이터셋에서 결측치를 확인하는 법으로 아래 코드가 주어졌는데요

train[train.isna().sum(axis=1) > 0]

아무리 봐도 axis = 1에 대해 이해가 안되었어요. 킹갓제네럴 랑꾼님의 도움을 받아 이해를 할 수 있었는데 내용은 다음과 같습니다.

 

우선, axis개념을 알기 위해서는 Shape에 대해 알아야합니다

 

Shape 란, 제일 n차원 데이터셋의 원소를 저차원 (안쪽 괄호)의 원소 개수부터 역순으로 쓴 것입니다.

shape(2,3,4) 는 3차원 데이터 셋(n = 3)에서 1차원 요소 (제일 안쪽 괄호의 원소)는 4개, 2차원 요소 (중간 괄호의 원소)는 3개, 3차원 요소 (바깥 괄호의 원소)는 2개가 되는 것입니다.

 

예를 들면 이렇게 생겼겠군요!

[1,2,3,,,,,24] 를 (2,3,4)로 reshape하면

[

[[1,2,3,4],[5,6,7,8],[9,10,11,12]],                   제일 깊은 괄호의 원소는 4

[[13,14,15,16],[17,18,19,20],[21,22,23,24]] 다음 깊은 괄호의 원소는 3

]                                                                      바깥 괄호의 원소는 2개

가 되는 것이죠.

 

여기서 axis의 개념이 등장합니다.

데이터셋.연산자함수(axis = n)으로 사용되는데요, 데이터셋의 n번째 인덱스가 가리키는 차원을 무너뜨려서 연산하여 저차원으로 반환하는 것입니다. 즉, n번째 괄호를 허물고 원소들을 연산하는 것이죠.

 

아래 예시를 보겠습니다

 

예) sum(axis = 0 )-> 0번째 인덱스를 무너뜨려서 합친 결과 (3,4)의 데이터셋을 반환

위의 데이터를 기준으로 하면

[[1+13,2+14,3+15,4+16],[5+17,6+18,7+19,8+20],[9+21,10+22,11+23,12+24]]의 결과인

[

[14,16,18,20],[22,24,26,28], [30,32,34,36]

]

이 반환되는 것입니다.

 

예2) sum(axis = 2) -> 2번째 인덱스를 무너뜨려서 합친 결과 (2,3)의 데이터셋을 반환

위의 데이터를 기준하면

[[1+2+3+4, 5+6+7+8, 9+10+11+12], [13+14+15+16, 17+18+19+20, 21+22+23+24]]의 결과인

[

[10, 26, 42], [58, 68, 90]

]

이 반환됩니다.

 

그럼 처음으로 돌아가 결측치가 있는 코드를 다시 볼까요?

 

train[train.isna().sum(axis=1) > 0]

train데이터에 isna()함수를 적용하여 결측치가 있는 원소는 1, 결측치가 없는 원소는 0으로 대치하여 train 데이터셋의 사이즈와 똑같은 데이터셋이 반환됩니다.

이랬던 데이터가

이렇게 바뀌는 거죠 그럼 여기서 sum(axis = 1) 가 더해지면 보통 (행,렬)로 데이터셋을 적용하니까 1번째 index, 즉 열을 없애고 행*1의 데이터셋으로 원소들을 합쳐야 겠죠 -> 결측치인 원소는 True (1), 결측치가 아닌 원소는 False (0) 니까 행을 모두 더하면 (sum) 결측치가 있는 경우에 1 이상의 값을 반환하는 것이에요!!

 

즉 상기 코드는 "결측치각 있는 row들을 확인하는 방법" 이었습니다!

 

감사의 인사를 랑꾼님께 전합니다.

 

댓글