목차
문제 상황
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인 분산으로 나누어, 들쭉날쭉한 분포에는 덜 반응하고 왜곡의 정도가 계산되도록 의도한 수식같다.
사용 예시
'CS > python' 카테고리의 다른 글
파이썬 float 문자열 포맷팅 (0) | 2023.09.13 |
---|---|
python graphviz 설치 오류 (0) | 2023.07.24 |
[pandas] 모두 nan인 컬럼 제거하는 한 줄 코드 (0) | 2023.06.19 |
[pandas] datetime64에 하루 더하기 (pandas DateOffsets) (0) | 2023.05.09 |
Git Jupyter notebook 충돌 해결 방법 (0) | 2023.05.03 |