본문 바로가기
CS/python

scipy.stats.skew 가 nan을 리턴할 때

by judy@ 2023. 6. 21.

문제 상황

skewness를 측정하려고 scipy.stats.skew를 사용하였는데, 결과로 nan이 리턴되었다.

from scipy.stats import skew

skew(df[col])
nan

 

해결 방법

문제 확인

아래 코드를 통해, skewness를 측정하려했던 컬럼에 결측값(np.nan)이 있었음

df[col].isna().sum()
179

 

scipy 공식 도큐먼트를 통해 skew 메서드에 결측치 처리 정책 옵션을 줄 수 있는 것을 확인함. 디폴트 옵션으로 nan_policy='propagate'가 설정되어 있어 na이 출력됨을 확인함.

  • propagate: nan이 있으면 nan을 출력함
  • omit: (사전적 의미는 생략) nan이 있으면, 무시하고 값이 있는 데이터에 대해서만 skewness 구하기
  • raise: nan이 있으면 에러를 발생시킴

해결 코드

아래와 같이 nan_policy를 omit으로 추가해주면 nan을 제외하고 skewness를 계산하여 값이 나옴

skew(df[col], nan_policy='omit')
0.41902274279363194

 

 

참고: scipy.stats.skew 메서드

skewness(왜도)는 데이터의 분포가 왼쪽 또는 오른쪽으로 치우쳐져 있는지를 수치화한 것으로. 0에 가까울수록 치우치지 않은 것을 의미. skewness가 매우 큰 경우 로그, 지수 변환 등을 활용하여 치우침을 어느 정도 보완할 수 있음. (가정이 성립하게 하거나, 학습이 더 잘 되도록)

이 메서드에서는 skewness를 Fisher-Pearson coefficient of skewness 을 계산함. 

g1은 m3를 m2의 3/2로 나누어 계산하는데, central moment인 mi의 정의는 아래와 같다.

즉, m1은 데이터에서 평균을 빼 합한, 편차의 합을 나타내며, m2는 편차의 제곱합이므로 분산을 의미하게 된다.

 

나의 해석

즉, 이 값들은 데이터가 어느 한 쪽으로 치우치거나, 이쁜 정규분포가 아닌 들쭉날쭉한 분포일 때 더 커질 것이다. skewness는 데이터의 치우침만을 반영해야 하므로, m3를 m2인 분산으로 나누어, 들쭉날쭉한 분포에는 덜 반응하고 왜곡의 정도가 계산되도록 의도한 수식같다.

 

사용 예시

 

 

 

 

반응형