JUST GO

[07] 데이터프레임 변경 본문

카테고리 없음

[07] 데이터프레임 변경

root_go 2023. 8. 23. 09:37

6. 데이터프레임 변경 (2)

  • 정확한 데이터 분석을 위해서는 정확한 데이터가 준비되어야 합니다.
  • 정확한 데이터 준비를 위해 누락된 데이터나 중복 데이터를 제거하는 전처리 작업이 필요합니다.

6.1.결측치 처리

  • NaN 값, 즉 결측치는 정확한 분석을 방해합니다.
  • NaN 값을 만나면 오류가 발생하는 함수도 있습니다.
  • NaN 값은 제거하든지 다른 값(예를 들면 평균값, 최빈값 등) 으로 채워야 합니다.

[ airquality 데이터 셋 정보 ]

  • Ozone : 오존 농도
  • Solar.R : 태양복사량
  • Wind : 풍속
  • Temp : 기온
  • Month : 월
  • Day : 일
# 데이터 읽어오기
path = 'https://raw.githubusercontent.com/Jangrae/csv/master/airquality.csv'
air = pd.read_csv(path)

# 확인
air.head()

6.1.1.결측치 찾기

  • 결측치 존재 여부를 확인하고 이를 어떻게 처리할 지 방법을 결정해야 합니다.
  • 결측치를 확인할 수 있는 방법은 참 많습니다.

1) info() 메소드로 확인

# 값 개수로 결측치 존재 여부 확인
air.info()

2) isnull(), notnull() 메소드 사용

  • isnull() 메소드는 결측치면 True, 유효한 값이면 False 를 반환합니다.
  • notnull() 메소드는 결측치면 False, 유효한 값이면 True를 반환합니다.
  • isnull() 대신 isnal(), notnull() 대신 notnal() 메소드를 사용해도 됩니다.
  • sum() 메소드를 사용해 True 값의 개수, 즉 열의 결측치 
# 전체 데이터 중에서 결측치는 False 로 표시
# air.notna()
air.notnull()

6.1.2.결측치 제거

  • dropna() 메소드로 결측치가 있는 열이나 행을 제거할 수 있습니다.
  • inplace=True 옵션을 지정해야 해당 데이터프레임에 실제로 반영됩니다.
  • axis 옵션으로 행을 제거할 지 열을 제거할 지 지정합니다.
    • axis=0: 행 제거(기본값)
    • axis=1: 열 제거

1) 어떤 열이든 결측치가 있는 행 제거

  • dropna() 메소드는 기본적으로 어느 열이든 결측치가 있는 행을 제거합니다.
# 데이터프레임 복사
air_test = air.copy()

# 열의 결측치 개수 확인
air_test.isnull().sum()
# 결측치가 하나라도 있는 행 제거
air_test.dropna(axis=0, inplace=True)

# 확인
air_test.isna().sum
# 몇 개 행이 제거 되었나?
len(air) - len(air_test)

2) 특정 열에 결측치가 있는 행 제거

  • subset 옵션에 열을 지정해 해당 열에 결측치가 있는 행을 제거합니다.
# 데이터프레임 복사
air_test = air.copy()

# Ozone 열이 결측치인 행 제거
air_test.dropna(subset=['Ozone'], axis=0, inplace=True)

# 확인
air_test.isna().sum()

3) 결측치가 있는 모든 열 제거

  • axis=1 옵션을 지정해 열을 제거할 수 있습니다.

6.1.3.결측치 채우기

  • fillna() 메소드를 사용해 결측치를 다른 값으로 채울 수 있습니다.

1) 평균값으로 채우기

  • 결측치가 있는 열의 평균값을 구한 후 결측치를 그 값으로 채웁니다.
# 데이터프레임 복사
air_test = air.copy()

# Ozone 평균 구하기
mean_Ozone = air_test['Ozone'].mean()

# 결측치를 평균값으로 채우기
air_test['Ozone'].filna(mean_Ozone, inplace=True)

# 확인
air_test.isna().sum()

2) 특정 값으로 채우기

  • 모든 결측치, 또는 일부 결측치를 특정 값으로 채웁니다.
# Solar.R 열이 누락된 값을 0으로 채우기
air_test['Solar.R'].fillna(0, inplace=True)

# 확인
air_test.isna().sum()

4) 직전 행의 값 또는 바로 다음 행의 값으로 채우기

  • 결측치를 바로 앞의 값이나 바로 다음에 나오는 값으로 채웁니다.
  • 날짜 또는 시간의 흐름에 따른 값을 갖는 시계열 데이터 처리시 유용합니다.
  • method='ffill': 바로 앞의 값으로 변경(Fowared Fill)
  • method='bfill' : 바로 다음 값으로 변경(Backwared Fill)
# Ozone 열의 누락된 값을 바로 앞의 값으로 채우기
air_test['Ozone'].fillna(method='ffill', inplace=True)

# Solar.R 열의 누락된 값을 바로 뒤의 값으로 채우기
air_test['Solar.R'].fillna(method='bfill', inplace=True)

# 확인
air_test.isna().sum()
air.head(10)

5) 선형보간법으로 채우기

  • interpolate() 메소드를 사용해 선형보간법으로 채울 수 있습니다.
# 데이터프레임 복사
air_test = air.copy()

# 선형보간법으로 채우기
air_test.interpolate(method='linear', inplace=True)
air_test['Solar.R'].interpolate(method='linear', inplace=True)

참고 : 이상치

# 라이브러리 불러오기
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 데이터 읽어오기
path = 'https://raw.githubusercontent.com/jangrae/csv/master/tips.csv'
tip =
df.rename()
df.columns=[]
df.drop(axis=1)	# 열 제거
df.dropna(axis=0)	# 행 제거
# tip 열 데이터 분포
plt.hist(tip['tip'], bins=20, alpha=0.7, edgecolor='w')
plt.show()
# 박스 플롯
plt.figure(figsize=(6, 2))
plt.boxplot(tip['tip'], vert=False)
plt.show

6.2.가변수(Dummy Variable) 만들기

  • 가변수는 일정하게 정해진 범위의 값을 갖는 데이터(범주형 데이터) 를 독립된 열로 변환한 것입니다.
  • 특히 범주형 문자열 데이터는 머신러닝 알고리즘에 사용하려면 숫자로 변환해야 합니다.
  • 가변수를 만드는 과정을 One-Hot-Encoding 이라고 부르기도 합니다.
  • get_dummies() 함수를 사용해서 가변수를 쉽게 만들 수 있습니다.
# 데이터 읽어오기
path = 'http://raw.githubusercontent.com/jangrae/csv/master/tips.csv'
tip.info()

6.2.1. 범주형 변수 확인

6.2.2.변수 개별 처리

다중공선성 문제(Multicollinearity)

통계학의 회귀분석에서 독립변수들 간에 강한 상관관계가 나타나는 문제이다.
독립변수들 간에 정확한 선형관계가 존재하는 완전공선성의 경우와 독립변수들 간에
높은 선형관계가 존재하는 다중공선성으로 구분하기도 한다. 이는 회구분석의 전제 가정읠 위배하는 것이므로
적절한 회귀분석을 위해 해결해야 하는 문제가 된다.
# 가변수화: sex
dumm_cols = ['sex']
pd.get_dummies(tip, columns=dumm_cols, drop_first=False)

# 확인
tip.head()

6.2.3.일괄 처리

  • columns 옵션에 대상 열을 리스트로 지정해 한 번에 처리합니다.
  • 자동으로 열 이름이 prefix 로 지정되며 원본 열이 제거됩니다.
  • columns 옵션을 지정하지 않으면 문자열 값을 갖는 열 모두를 대상으로 합니다.
# 여러 범주형 변수를 가변수화 : smoker, day, time
dumm_cols = ['smoker', 'day', 'time']
tip = pd.get_dummies(tip, columns=dumm_cols, drop_first=True)

# 확인
tip.head()