본문 바로가기
파이썬 (투자분석용)/Pandas 및 python 일반

Pandas 시작하기: 7 일차, 이상치와 결측치 처리

by amAToRoi 2024. 1. 31.
반응형

이상치와 결측치 발견

데이터 분석에서 이상치와 결측치는 데이터 곡해하거나 분석이 불가한 상태를 생성할 수 있습니다. 당연히 존재하여야 하는 값이 없음(결측)에도 이를 무시하고 통계분석을 한다던가, 데이터 후처리를 하는 경우에 분석과정이 중단되면 오히려 다행이지만 시스템에서 발견하지 못하는 오류로 진행되어 버리는 경우에는 실제와 다른 결과가 도출되는 문제가 발생합니다. 따라서, 데이터 분석 전후 이상치나 결측치가 있는지 확인하는 메소드 또한 Pandas에서 제공하고 있습니다.

물론, 데이터 구조 및 타입(정수, 실수, 문자열 등)에 대한 이해와 규칙이 뚜렷하다면 반복문으로 이를 만들어 낼 수 있지요.

결측치 탐색 메소드 활용

  • 'isna()', 'isnull()', 'notnull()' 메소드로 결측치의 확인이 가능
  • 'info()' 메소드를 사용하여 전체 데이터프레임의 결측치 확인이 가능
# 결측치 확인
missing_values = df.isna()

# 각 열에서 결측치의 개수 확인
missing_count = df.isna().sum()

통계적 방법

  • IQR(interquartile range): 데이터를 사분위로 나누고, 그 중간 두 사분위의 차이를 IQR이라고 합니다. 이상치는 IQR의 1.5배 이상 떨어진 값으로 판단할 수 있습니다.
import pandas as pd

# DataFrame을 생성합니다.
df = pd.DataFrame({
    "height": [170, 165, 180, 160, 175]
})

# IQR을 계산합니다.
q1 = df["height"].quantile(0.25)
q3 = df["height"].quantile(0.75)
iqr = q3 - q1

# 이상치를 찾습니다.
df[(df["height"] < q1 - 1.5 * iqr) | (df["height"] > q3 + 1.5 * iqr)]

''' 출력
height
160
'''

또한, 'matplotlib', 'plotly' 등 시각화를 통해 비정상 데이터를 찾아내는 방법도 있습니다. 눈으로 보면 쉽지요.

규칙을 활용한 방법

수치적 데이터는 위의 방법을 사용하면 되나, 문자열로 데이터를 구성하고 있는 경우에는 데이터 이상치를 발견하는 방법은 다양합니다.

  • 문자열과 숫자가 혼재되어 있는 경우, 'astype()' 메소드로 일괄변환 후 오류 처리
  • 딕셔너리나 정규표현식을 사용하여 유효한 패턴을 정의하고, 'isalpha()', 'isin()' 등 Pandas 내장 메소드 또는 비교구문을 활용하여 다음과 같은 방법 등의 적용 가능
    1. 허용되지 않는 문자 포함 여부": 숫자, 특수 문자, 심볼 등
    2. 길이 제한 위반 여부: 최소/최대 길이 제한 설정
    3. 형식 검증 여부: 이름과 성을 구분자로 구분, 표현식에 맞지 않음 등

이 중 딕셔너리와 패턴의 사용자 정의 함수를 활용한 예시는 다음과 같습니다.

import pandas as pd

# 허용 문자 정의
valid_chars = "abcdefghijklmnopqrstuvwxyz "

# 유효한 이름 패턴 정의 (공백 포함)
def is_valid_name(name):
    for char in name:
        if char not in valid_chars:
            return False
    return True

# DataFrame 생성
df = pd.DataFrame({
    "name": ["Alice", "Bob", "Carol", "123abc", "John Doe"]
})

# 이상치 식별
outliers = df[~df["name"].apply(is_valid_name)]

# 이상치 처리 (예시: 제거)
df.drop(outliers.index, inplace=True)

print(df)
`
''' 출력
   name
0  Alice
1   Bob
2  Carol
4  John Doe
'''

이 예시에서는 숫자가 포함된 '123abc'만 이상치로 식별합니다.
이 이외에도 다음과 같은 문자열관련 다양한 규칙검증 메소드가 있습니다.

  • str.startswith(): 문자열이 지정된 문자열로 시작하는지 여부를 확인합니다.
  • str.endswith(): 문자열이 지정된 문자열로 끝나는지 여부를 확인합니다.
  • str.contains(): 문자열이 지정된 문자열을 포함하는지 여부를 확인합니다.
  • str.match(): 문자열이 지정된 정규 표현식과 일치하는지 여부를 확인합니다.
import pandas as pd

# DataFrame 생성
df = pd.DataFrame({
    "name": ["Alice", "Bob", "Carol", "123abc", "John Doe"]
})

# 문자열 값이 "A"로 시작하는지 확인
df[df["name"].str.startswith("A")]
''' 출력
   name
0  Alice
'''

이상치와 결측치의 처리

처리 방법은 분석자가 정해야 하는 것으로 일반적인 처리 방법은 다음과 같습니다.

  • 우선은 결측치로 처리하고, 'dropna()' 메소드로 해당 행이나 열을 제거
  • 'fillna()' 메소드로 다른 값으로 대체
# 결측치가 있는 행 제거
df_dropped = df.dropna()

# 결측치가 있는 열 제거
df_dropped_columns = df.dropna(axis=1)

# 결측치를 평균값으로 대체
mean_value = df['Column'].mean()
df_filled = df['Column'].fillna(mean_value)

팁 및 모범 사례

  • 결측치의 원인 파악: 결측치의 원인을 이해하는 것이 중요합니다. 데이터 수집 과정에서의 오류인지, 또는 데이터 자체의 특성인지 파악해야 합니다.
  • 적절한 대체 값 선택: 결측치를 대체할 때는 데이터의 분포와 특성을 고려하여 적절한 값으로 대체합니다.
  • 결측치 대체 전후 비교: 결측치를 대체한 후 데이터의 분포가 크게 변하지 않았는지 확인합니다.

결론

결측치와 이상치를 찾고 수정하는 것은 다만 Pandas에 한정된 행위가 아니라 데이터분석 전반에 걸쳐 마땅히 이루어져야 하는 절차이며 이를 행하지 아니하고 Pandas를 사용한다면 데이터분석툴의 일부만 사용하는 것임을 고려할 때, 툴의 사용자로써 가장 신경써야 하는 부분이다. 다음은 마지막으로 데이터 간의 병합과 결합에 대해 알아보고자 한다.

병합과 결합까지가 Pandas를 시작하기 위한 기초정보이며, 다음 단계로 나아가기 위해서는 다양한 특이사례의 해결방법을 습득하는 것일 텐데 다루고자 하는 내용은 apply, lambda, 시계열, 정규표현식 정도가 있을 듯 하다. 나도 아직 초보를 벗어나지 못 하는 수준에서 내가 공부한 것을 정리하는 것일 뿐이니...

반응형

댓글