본문 바로가기
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인 분산으로 나누어, 들쭉날쭉한 분포에는 덜 반응하고 왜곡의 정도가 계산되도록 의도한 수식같다.

     

    사용 예시

     

     

     

     

    반응형