project:eve
파이썬을 이용한 데이터 분석 : 결측치, 이상치 보간하기 본문
오늘은 결측치를 보간하는 방법에 대해 알아보려고 해요.
결측치란 데이터 자료에 일부분이 누락되어서 값이 없는 부분을 말해요.
예를 들어 1학년 4반의 키 평균을 구하고 싶은데 신체 정보 자료에 한 명의 키 정보가 Null값이라면 평균을 제대로 구할 수 없겠죠? 그 한 명을 무시하고 구하더라도 결과값이 완전하지 않기 때문에 신뢰성을 가지기도 어려워요. 그렇기 때문에 분석 결과가 인정받으려면 바탕이 되는 자료가 완전한 상태에서 분석이 행해져야 합니다.
이제 결측치는 알겠고 보간한다는 말은 뜻이 뭘까요? 저도 항상 구글에서 검색할 때 '결측치 보간' 이라는 문장을 많이 들어서 따라서 많이 썼었는데, 이번에 글로 정리하면서 정확하게 알아봤어요.

사전에서 찾아본 결과 문맥상 특정 값은 알수 없으나 다른 주변 값들을 알고 있을 때 특정 값에 대해 추정하는 것이라고 이해가 되네요.
결측치를 채운다. 결측치를 보완한다. 이런 말들도 비슷한 의미로 사용할 수 있을 것 같아요.
결측치를 보간하는 방법은 여러가지가 있는데요. 오늘은 아래처럼 네 가지를 알아봤어요. 1번부터 하나씩 코드를 써볼게요.
1. 삭제하기
2. 대체하기
3. KNN
4. MICE
1. 삭제하기
삭제하기는 말 그대로 결측치가 담긴 데이터를 삭제합니다. 만약 삭제할 데이터 행에 다른 열의 데이터가 들어있더라도 같이 삭제합니다. 이 방법은 간편하지만, 너무 많은 데이터를 이 방식으로 처리할 경우 대용량 데이터가 아닌 이상 분석 결과가 전혀 달라질 수 있기 때문에 조심해야 합니다.
사용한 데이터는 공공데이터 포털에서 가져온 15~19년간 지역별 임대 아파트의 분양가 자료입니다(지금 보니까 데이터포털에서 지워졌더라구요.. 대신 아래에 파일을 첨부해놓을게요)
공공데이터 포털
국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase
www.data.go.kr
데이터를 가져와서 결측치가 있는지 확인해 볼게요.
presale2.info()

info() 함수를 통해 결측치가 분양가격에 있고, 데이터 형식은 object인 것을 확인할 수 있어요.
아래 코드를 써서 결측치는 모두 삭제해볼게요.
presale2.dropna(inplace=True)
presale2.info()

dropna 메서드는 데이터프레임 내의 결측치를 제거하는 역할을 하구요. 속성값 axis값으로 결측치가 속하는 행을 제거할 것인지 열을 제거할 것인지를 선택할 수 있습니다(axis=0일 경우 결측치가 속한 행을 제거).
또 코드에서 사용한 inplace는 메서드의 결과를 데이터프레임에 저장 여부를 선택할 수 있습니다. inplace=True일 경우 dropna된 결과가 presale2에 저장이 되는 것이죠!!반대로 false일 경우에는 원본 데이터가 보존됩니다.
만약 적용된 데이터와 원본 데이터가 둘 다 필요할 경우는 아래 코드처럼 dropna한 결과를 변수에 저장하면 됩니다.
df_dropped = presale2.dropna()
또 drop을 사용해서 삭제할 수도 있어요. drop의 속성값 몇 개를 알아두시면 좋은데, axis나 inplace는 dropna에서 설명했던 것과 동일하고 지울 대상을 자유롭게 선택할 수 있어요.
그리고 지울 데이터의 위치를 정해주는 속성값으로 label과 index/column이 있는데요. 하나만 입력하면 label이고 행과 열을 둘 다 입력하려면 index/column을 하나씩 써주어야 합니다. label은 입력값을 컬럼과 인덱스 둘 다에서 찾아보고 위치를 파악하기 때문에 반드시 행과 열 중에 한 곳에만 있어야 해요.
크게 label과 index/column으로 나눌 수 있고, label은 index나 column에서 고유한 값이면 자동으로 행인지 열인지를 인식합니다. 아래코드에서 null_idx에 담긴 값은 presale2에서 결측치 행의 index가 모여있는 list인데요. 이 리스트를 입력하면 해당 인덱스의 행만 삭제합니다.
null_idx = presale2.loc[presale2['분양가격(㎡)'].isnull() == True,].index
presale2.drop(null_idx, axis=0, inplace=True)
2. 대체하기
결측치를 다른 값으로 대체하는 방법입니다. 대체하는 값으로는 보통 평균, 최빈값, 중앙값 등등이 사용되는 것 같아요.
라이브러리에 SimpleImputer라는 것이 있어서 이걸 사용해 볼게요. 데이터는 삭제할 때와 같은 것을 사용할 건데요. 혹시 아까 결측치 열의 형식이 object였던 것 기억나시나요? 그래서 숫자형으로 변경해주는 작업이 필요해요.
presale2['평당분양가격'] = pd.to_numeric(presale2['분양가격(㎡)'], errors='coerce')
to_numeric함수는 입력값을 숫자형으로 변환해주는 역할을 하구요. errors 속성은 변환 중에 에러가 발생할 때 처리 방법을 선택할 수 있어요.

SimpleImputer의 strategy 속성으로 대체할 값을 설정할 수 있어요. 기본값은 mean이고 중앙값, 최빈값, 지정값으로 바꿀 수 있어요.
data = pd.DataFrame(presale2['평당분양가격'])
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy = 'mean')
presale2['평당분양가격'] = imputer.fit_transform(data)
presale2.info()


3. KNN
KNN 알고리즘은 분류, 회귀에서 비슷한 인자를 가진 행끼리 같은 결과를 도출하도록 유도하는 알고리즘인데, 이 특징을 그대로 결측치를 보간하는 방법으로도 사용할 수 있어요. KNNImputer는 결측치 주변의 값 평균으로 결측치를 대체하는 방법을 사용해요.
또 KNNImputer는 연속형 변수에 대해서만 사용할 수 있기 때문에 범주형 변수에 대해 사용하려면 가변수화 과정을 거쳐야 합니다.
from sklearn.impute import KNNImputer
# 숫자형 변수만 적용 가능하기 때문에 형변환 필요
presale2['분양가격'] = pd.to_numeric(presale2['분양가격(㎡)'], errors='coerce')
model = KNNImputer(n_neighbors=2) # n_neighbors : 확인할 주변값 수
data = pd.DataFrame(presale2['분양가격'])
Imputed = model.fit_transform(data)
presale2['분양가격_2'] = np.round(Imputed)
presale2['분양가격_2'].isna().sum() -> #0 출력
4. MICE
MICE는 Multiveriate Imputation by Chained Equations의 약자로 다중 대치법 중의 하나인데요. 다중 대치법이란 결측치를 회귀값으로 대체하되 여러 번 대체해 보면서 최상의 값을 찾아내는 알고리즘이라고 해요.
KNN과 마찬가지로 수치형 변수에만 사용이 가능하고 범주형 변수에 사용하려면 전처리가 필요해요.
from sklearn.impute import IterativeImputer
# 수치형으로 변환
presale2['분양가격'] = pd.to_numeric(presale2['분양가격(㎡)'], errors='coerce')
data = pd.DataFrame(presale2['분양가격'])
imputer_mice = IterativeImputer(random_state=18)
result = imputer_mice.fit_transform(data)
presale2['분양가격'] = result
presale2.info() # 결측치 0
결측치를 보간하는 여러가지 방법에 대해 공부해봤습니다~~!
추가로 KNN과 MICE를 활용할 때 결측치는 채워졌지만 그게 어떤 값으로 채워졌는지 궁금하더라구요. 알아본 다음에 이어서 써볼게요~~
'Python' 카테고리의 다른 글
| 파이썬을 이용한 데이터 분석 : 단순선형회귀 (0) | 2023.01.25 |
|---|---|
| 파이썬을 이용한 데이터 분석 - 전국 신규 임대 아파트의 분양가 시각화 (0) | 2023.01.07 |
| 파이썬을 이용한 데이터 분석 : 회귀분석(1) (0) | 2022.12.31 |
| 파이썬을 이용한 데이터 분석 : 상관분석 (0) | 2022.12.30 |
| 파이썬을 이용한 그래프 그리기 (0) | 2022.12.28 |