TIL

👀Today I Learn

결측치 탐지와 처리

1. 결측치 탐지

결측치(Missing Value)?

  • 데이터가 누락되거나 기록되지 못한 상황
  • Pandas는 결측치를 쉽게 탐지하고 처리할 수 있는 기능 제공

isna()와 isnull()로 결측치 탐지

  • 데이터프레임의 각 요소가 결측치 여부를 확인
  • NaN은 수치적인 데이터를 나타내고, None은 파이썬 코드에서 값이 없는 것을 의미(둘 다 결측치)

      df.isna()
      # 결측치면 True 아니면 False
    

sum() 을 사용한 결측치 개수 확인

  • 결측치의 총 개수를 확인하려면 sum()을 사용

      # 각 열별 결측치 개수 확인
      df.isna().sum()
    


2. 결측치 처리 방법

결측치 제거

  • 결측치가 표함된 행이나 열을 삭제
  • dropna() 함수를 사용(열을 제거하려면 axis=1)

      df_dropped_rows = df.dropna()
    

결측치 대체(채우기)

  • 결측치를 특정 값으로 대체(채우기)
  • fillna() 함수 사용

      # 결측치를 '없음'으로 대체
      df_filled = df.fillna('없음')
    
  • 평균, 중앙값, 최빈값 등으로도 결측치를 채울 수 있음

      # '나이' 열의 결측치를 평균값으로 대체
      df['나이'] = df['나이'].fillna(df['나이'].mean())
    

결측치 보간(iInterpolation)

  • 결측치를 주변 값들을 기반으로 보간 가능
    • 일반적으로 행이 순서에 따라 연관이 있을 경우 사용함(선형보간)
  • interplate() 함수를 사용
  • 특히 시간 데이터를 다룰 때 유용

      # 선형 보간법으로 결측치 채우기
      df2['온도'] = df2['온도'].interpolate()
    


3. 고급 결측치 처리 방법

특정 조건을 기반으로 결측치 처리

  • 예를 들어, 다른 열의 값을 기준으로 결측치를 채우기

      df.loc[(df['직업'] == '학생') & (df['나이'].isna()), '나이'] = 20
    

apply() 를 사용한 사용자 정의 함수 적용

  • 결측치를 처리하는 사용자 정의 함수를 적용 가능

      df['나이'] = df['나이'].apply(fill_missing_age)
    


이상치 탐지 및 처리

1. 이상치(Outloer)란?

  • 데이터의 일반적인 패턴에서 벗어난 값
  • 이러한 값들은 데이터 분석에 부정적인 영향을 미치므로 탐지하여 적절히 처리하는 것이 중요


2. 이상치 탐지 방법

기술 통계 기반 이상치 탐지

  • describe() 함수 사용
  • 데이터의 기본 통계랑을 확인하고, 이상치 의심

      # 기술 통계량 확인
      df['나이'].describe()
    
  • 이상치 의심
    • 평균(mean)과 표준편자(std)가 큰 경우
    • 최대값(max)이 비정상적으로 높은 경우

시각화를 사용한 이상치 탐지

  • 박스플롯(Box Plot)과 히스토그램을 사용하면 데이터를 시각적으로 확인할 수 있어 이상치 탐지 용이
  • 박스플롯의 이상치는 통상적으로 박스(사분위수 범위)의 위아래에 위치한 점으로 표시

      import matplotlib.pyplot as plt
        
      # 박스플롯으로 이상치 시각화
      plt.boxplot(df['나이'])
      plt.title('나이의 박스플롯')
      plt.show()
    


IQR(Interquartile Range)을 사용한 이상치 탐지

  • IQR은 1사분위수(Q1)와 3사분위수(Q3)의 차이로, 이 범위를 벗어나는 데이터를 이상치로 간주
  • 추천하지 않는 방식

      # IQR 계산
      Q1 = df['나이'].quantile(0.25)
      Q3 = df['나이'].quantile(0.75)
      IQR = Q3 - Q1
        
      # IQR을 이용한 이상치 탐지
      lower_bound = Q1 - 1.5 * IQR
      upper_bound = Q3 + 1.5 * IQR
        
      outliers = df[(df['나이'] < lower_bound) | (df['나이'] > upper_bound)]
        
      # 20이라는 값이 IQR 범위를 벗어나므로 이상치로 탐지됩니다.
    


3. 이상치 처리 방법

이상치 제거

  • 이상체를 데이터프레임에서 제거

      # 이상치를 제거
      df_without_outliers = df[(df['나이'] >= lower_bound) & (df['나이'] <= upper_bound)]
    

이상치를 특정 값으로 대체

  • 이상치를 특정 값으로 대체 가능

      # '나이'의 중앙값으로 이상치 대체
      median_age = df['나이'].median()
      df['나이'] = df['나이'].apply(lambda x: median_age if x > upper_bound or x < lower_bound else x)
    

이상치를 그대로 유지

  • 이상치가 중요한 분석 포인트가 될 수 있다고 판단되면, 별도의 처리를 하지 않고 그대로 유지하기도 함
  • 이 방법은 분석 목적에 따라 선택적으로 사용

      # 이상치를 그대로 유지하는 경우 (처리하지 않음)
      print(df)
    



💡Today I Thought

오늘의 체크리스트

  • 알고리즘 코드카타 38-40
  • SQL 코드카타 45-46
  • 백준 코테 1문제
  • 프로그래머스 코딩테스트 Day 25 ⇒ 2문제
  • 머신러닝 과제
  • TIL 작성

회고

  머신러닝 과제가 잘 안되서 너무 힘들다ㅠㅠ 엉엉.. 주말에도 공부해야하다니.. 주말에는 놀고싶었는데,, 두부도 데리고 와야하는데..

댓글남기기