본문 바로가기
파이썬/데이터 다듬기

[240920] 데이터다듬기#6 - 판다스 데이터프레임 변경 (2)

by 황오독 2024. 9. 21.

1. 결측치 처리 (info(), isna(), isnull(), notnull(), isna().sum())
 - 결측치는 NaN 값으로, 누락된 데이터를 처리하기 위한 전처리 작업이 필요함.
 - 제거를 하거나, 다른 값(평균값, 최빈값 등)으로 채워야 함.
  1) 결측치 찾기

# info()
df.info() # Non-Null Count를 확인하여, Null 값을 찾는다.

# isna(), isnull(), notnull()
df.isnull() # Null 값을 True나 False로 반환 (결측치를 True로 반환)

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

 
 2) 결측치 제거 (dropna())

# dropna() 
df.dropna(axis=0, inplace=True) # 결측치가 하나라도 있는 '행'을 제거

# dropna(subset=['특정열'], axis=0, inplace=True)
df.dropna(subset=['Ozone'], axis=0, inplace=True) # 'Ozone' 열에 결측치가 있는 행을 제거

# dropna(axis=1, inplace=True)
df.dropna(axis=1, inplace=True) # 결측치가 있는 모든 '열'을 제거

 
 3) 결측치 채우기 (fillna())

# 평균값으로 채우기
# Ozone 평균 구하기
mean_Ozone = air_test['Ozone'].mean()

# 결측치를 평균값으로 채우기
air_test['Ozone'].fillna(mean_Ozone, inplace=True) # 원래 inplace=True 열에는 X,, 원래는 dataframe에 대한 거기때문
# air_test['Ozone'] = air_test['Ozone'].fillna(mean_Ozone)

# 특정값으로 채우기
air_test['Solar.R'].fillna(0, inplace=True) # 경고 발생
# air_test = air_test['Solar.R'].fillna(0)

# 직전 행의 값 또는 바로 다음 행의 값 : ffill(바로 앞의 값), bfill(바로 다음 값)
# Ozone 열의 누락된 값을 바로 앞의 값으로 채우기
# air_test['Ozone'] = air_test['Ozone'].fillna(method='ffill')
air_test['Ozone'] = air_test['Ozone'].ffill
# Solar.R 열의 누락된 값을 바로 뒤의 값으로 채우기
# air_test['Solar.R'] = air_test['Solar.R'].fillna(method='bfill')
air_test['Solar.R'] = air_test['Solar.R'].bfill

# 선형보간법으로 채우기 interpolate()
df.interpolate(method='linear', inplace=True)

 
 
2. 가변수(Dummy Variable) 만들기 (One-Hot-Encoding)
 - 범주형 '문자열' 데이터는 머신러닝에서 인식하지 못하므로, 머신러닝 알고리즘에 사용하기 위하여 숫자로 변환함.
 - get_dummies()
  1) 변수 개별 처리
    - columns 옵션에 열을 하나 지정해 처리
    - 자동으로 원본 열 제거, 열 이름 prefix로 사용됨.
    - 다중공선성 문제를 없애기 위해 drop_first=True 옵션 지정

더보기

* 다중공선성 문제

- 통계학의 회귀분석에서 독립변수들 간에 강한 상관관계가 나타나는 문제

- 독립변수들 간 정확한 선형관계가 존재하는 완전공선성의 경우와

- 독립변수들 간 높은 성형관계가 존재하는 다중공선성으로 구분

 => 적절한 회귀분석을 위해 해결해야 하는 문제

 

ex) adult_Yes, adult_No가 각

  Yes : No

    1      0

    0      1

    0      1 로 되어 있으면

- 하나의 값이 없어도 다른 하나의 값으로 인해 값을 알 수 있음.

- adult_Yes가 없어도 adult_No로 충분히 값을 확인할 수 있음.

 2) 일괄 처리

# 여러 범주형 변수를 가변수화: smoker, day, time
dumn_cols = ['smoker', 'day', 'time']
tip = pd.get_dummies(tip, columns=dumn_cols, drop_first=True, dtype=int)
# columns 옵션을 지정하지 않으면, 문자열 값을 갖는 열 모두를 대상으로 함
# 참고 => dtype=int : 결측치가 있으면 자료형이 float가 되므로, int로 바꾸어 주어야 함.