코딩/Python

파이썬 기초 - 데이터 분석할 때 필요한 데이터 결측값 대체하기 -

kaki_ss 2022. 6. 13. 23:58
728x90
반응형

안녕하세요!

 

오늘은 다시 돌고 돌아 파이썬에 대한 글을 써보려고 합니다.

처음에 파이썬 정리하면서 목표가 파이썬을 이용해서 R에서처럼 데이터 분석을 해보자! 여서

매우 기나긴 여정이 될 것 같아요....ㅋ

 

일단은 목표가 빅데이터 분석 기사 실기 대비했을 때 정도? 까지는 정리해보려고 합니다.

 

오늘 해볼 거는 바로 데이터 결측값 대체하는 방법입니다.

데이터 분석하기 전에 데이터 전처리를 할 때 우리는 결측치를 만나고는 합니다.

 

전체 데이터에 비해서 터무니없이 적으면 없애주어도 되고 그 데이터를 없애기에는 다른 중요한 데이터가 함께 없어질 수도 있어서 대체값을 넣기도 합니다.

 

오늘은 데이터 중에서 결측값을 찾아보고 대체값을 넣는 것까지만 해보겠습니다.

 

반응형
0) 들어가기 전에

 

먼저 오늘 결측치 대체하는데 필요한 라이브러리 먼저 불러오겠습니다.

 

import pandas as pd
import seaborn as sns
import numpy as np

이제는 자주 봐서 익숙한 pandas, 데이터를 불러오기 위해서 필요한 seaborn,  numpy는 일단 쓰기는 했지만 이번에는 필요가 없습니다...ㅠㅠ

 

오늘 사용할 데이터는 penguins 데이터인데 그전에 seaborn에 어떤 데이터가 있는지 궁금할 때 사용하는 코드를 먼저 알려드릴게요.

sns.get_dataset_names()

이 코드를 입력만 하면 바로 아래에 seaborn 안에 어떤 데이터가 들어있는지 나옵니다.

꽤 많은 데이터가 안에 들어있어서 실습용으로 가지고 놀기 좋은 것 같아요:)

 

이번 글에서 사용할 데이터는 penguins 데이터입니다. 계속 sns~~ 하면서 데이터를 불러오면 번거로우니 penguins라는 변수로 데이터를 저장하고 시작하겠습니다.

#데이터 불러오기
penguins = sns.load_dataset('penguins')

참고로 원하는 데이터셋을 penguins 대신에 집어넣으면 데이터를 불러올 수 있습니다.

 

1) 결측치 확인하기

 

먼저 결측치가 어떤 변수에 얼마나 있는지를 파악하는 것이 중요합니다.

사실 저번에 데이터 파악하기에서 null 개수 즉, 결측치의 개수를 파악하는 방법이 있었는데요.

 

 

파이썬 기초 - 데이터 전처리를 위한 DataFrame 데이터 살펴보기 - (with seaborn)

안녕하세요! 오늘은 python에서 데이터 전처리하기 전에 데이터의 구조가 어떻게 되는지 형태를 파악하기 위한 코드를 소개해보려고 합니다. R에서 하던 데이터 분석 작업을 파이썬으로 하려고

sskaki.tistory.com

위의 글을 참고하셔도 되고 이번 글에서도 한번 직접 실행해보겠습니다.

 

#info
데이터.info()

penguins.info()를 실행한 결과는 다음과 같습니다.

 

어떤 열이 있는지 각 열에 null이 아닌 데이터의 개수, 그리고 데이터의 타입이 나옵니다.

전체 344개의 데이터 중에서 bill_length_mm, bill_depth_mm, flipper_length_mm, sex 데이터에서 결측치가 있다는 것을 알 수 있습니다.

 

이 방법은 전체 데이터 파악을 위해서 사용하는 것이므로 딱 결측치만 집어서 알고 싶다고 하면 다른 방법을 사용하면 됩니다.

 

#na데이터 확인하기
penguins.isna()

isna()는 결측치면 True, 결측치가 아니면 False로 데이터가 나오게 됩니다. 이 데이터셋 자체가 344개의 데이터를 가지고 있어서 중간중간 True로 나오는 걸로 보아 결측치가 있는 것을 확인할 수 있지만 정확하게 파악하는 것은 힘듭니다.

 

이럴 때는 sum()을 이용하면 됩니다.

#전체에서 na 데이터가 몇개인지 세기
penguins.isna().sum()

결측치 True로 나온 데이터의 개수의 합을 한눈에 확인할 수 있습니다.

위의 info에서 본 것처럼 같은 열의 데이터에서 결측치가 있는 것을 알 수 있습니다. 위에서는 직접 전체 데이터에서 결측치가 아닌 값을 빼서 확인했다면 여기서는 바로 결측치가 몇 개인지 확인할 수 있습니다.

 

2) 결측치 대체하기

 

결측치를 확인했다면 이 값을 어떻게 할 것인가...

사실 데이터 분석하다 보면 이거를 어떻게 정해야 할 지도 고민을 해야 합니다.

어떤 게 타당한 판단인지는 분석가 본인의 몫이지만 저에게는 아직 어려운 것 같습니다.

 

오늘은 일단 특정한 값으로 대체한다고 가정하고 한번 진행해보겠습니다.

 

방법은 두 가지여서 편한 걸로 진행하시면 됩니다.

#대체값을 다시 데이터에 집어넣기
데이터['열'] = 데이터['열'].fillna(대체값)

fillna()라는 함수를 이용해서 진행합니다. fillna 안에 내가 원하는 대체값을 넣으면 결측치가 대체값으로 바뀝니다.

사실 이렇게만 하면 끝이라고 생각될 수 있는데 fillna로 바뀐 값을 다시 데이터 안으로 저장을 시켜주어야 데이터 값이 바뀝니다. 그러지 않으면 데이터 안의 값은 바뀌지 않습니다.

 

다른 방법은 다음과 같습니다.

#inplace 사용하기
데이터['열'].fillna(대체값, inplace=True)

fillna 안의 옵션을 이용해서 데이터를 바꿀 수도 있습니다. inplace라는 옵션을 True로 해서 데이터를 바꾸면서 진행할 수도 있습니다. 원본 데이터를 그대로 바꿀 수 있어서 앞의 코드보다 더 짧게 진행할 수 있습니다.

 

상황에 따라서 두 가지 모두 사용할 수도 있습니다. 원본 데이터를 그대로 사용하지 못할 때는 위의 데이터를 다른 거로 바꾸어서 사용하거나 다른 데이터에 넣을 수도 있습니다. 

 

두 코드를 모두 실행시켜서 똑같이 실행되는지 한번 보겠습니다.

 

보기 전에 제가 코드 실행을 위해서 사용할 열은 bill_length_mm입니다. 3, 339 두 개의 값이 비어져 있습니다.

#na데이터 대체하기
penguins['bill_length_mm'] = penguins['bill_length_mm'].fillna(0)
penguins[penguins.bill_length_mm==0]['bill_length_mm']

이번에 대체값으로 0을 집어넣었습니다. 다른 데이터에는 0이 존재하지 않기 때문에 0이 어디있는지 확인하면 되는데요.

 

3번과 339번에 0으로 들어간 것을 확인할 수 있습니다.

300x250

이번에는 2번째 방법을 사용해보겠습니다.

 

#na데이터 대체하기
penguins['bill_length_mm'].fillna('unknown', inplace = True)
penguins[penguins.bill_length_mm=='unknown']['bill_length_mm']

이번에는 0 대신에 unknown을 대체값으로 했습니다. inplace=True 옵션을 사용해서 데이터를 바꾸어주었습니다.

 

결측치에 unknown이라고 잘 대체되어 있는 것을 확인할 수 있습니다.

 

여기까지 해서 결측치를 어떻게 대체할 수 있는지에 대해서 설명드렸습니다. 참고로 결측치 = 결측값이니 안 헷갈리셔도 됩니다ㅎㅎ

두 가지 방법 다 이런저런 방법으로 사용할 수 있으니 알아 두셔도 되고 fillna로 해도 다시 원래 데이터에 돌려주어야 한다? 이 정도까지만 기억하셔도 괜찮을 것 같습니다.

 

 

읽으신 분들에게 도움이 되길 바라며...

오늘 하루도 즐거운 하루 보내세요( •̀ ω •́ )✧

728x90
반응형