반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

<데이터 분석 관련 글>

 

2021.04.12 - [파이썬 패키지/데이터분석] - [파이썬 데이터 분석] 1편. 데이터는 금이다 (feat.데이터 관련 직업 소개)

2021.04.13 - [파이썬 패키지/데이터분석] - [파이썬 데이터 분석] 2편. 데이터 분석을 위한 준비 (Jupyter Notebook 설치 및 사용법)

2021.04.14 - [파이썬 패키지/데이터분석] - [파이썬 데이터 분석] 3편. 데이터 분석 필수 패키지, 판다스! (feat. 10 minutes to pandas)

2021.04.15 - [파이썬 패키지/데이터분석] - [파이썬 데이터 분석] 4편. 데이터 분석을 위한 데이터 다운로드 받기 (feat.공공데이터포털)

2021.04.16 - [파이썬 패키지/데이터분석] - [파이썬 데이터 분석] 5편. Jupyter Notebook으로 데이터 파일 불러오기 (꿀팁. Tap과 Tap+Shift 사용법은 꼭 알아두세요!!)

2021.04.17 - [파이썬 패키지/데이터분석] - [파이썬 데이터 분석] 6편. 데이터 분석에서 결측치란? (feat. 주피터 노트북 Pandas 관련 함수)

2021.04.18 - [파이썬 패키지/데이터분석] - [파이썬 데이터 분석] 7편. 원하는 이름의 열 & 특정 문자열을 포함한 데이터 인덱싱하기

 

이번 시간에는 데이터 분석에서 중요한 개념인 결측치에 대해서 알아보고, 주피터 노트북에서 결측치를 어떻게 찾고 제거할 수 있는지 알아보겠습니다.

 


결측치란?

출처. Null 나무위키 

 

결측치(Missing Value)는 직역하면 '값이 없는 것'을 의미합니다.  결측치는 사용하는 언어마다 여러가지로 표현됩니다.

 

- NA : Not Available (유효하지 않은)

- NaN : Not a Number (숫자가 아닌)

- Null : 아무것도 존재하지 않음을 의미

 

예를 들어서 설문조사를 했는데, 응답자가 10가지 질문 중에 4가지만 응답했다면 나머지 6가지는 결측치가 되는 것입니다. 제가 전공자가 아니라서 아직 잘 모르지만 결측치는 데이터를 분석하는데에 장애 요소라고 하며, 아래와 같은 문제를 일으킬 수 있다고 합니다.

 

- 결측치를 모두 제거할 경우, 막대한 데이터 손실을 불러일으킬 수 있음

- 결측치를 잘 못 대체할 경우, 데이터에서 편향(bias)이 생길 수가 있음

 

결측치 유형에 따른 처리에 대해 정리된 글이 있어 링크를 공유드립니다.

 

junklee.tistory.com/4

 

결측치(Missing Value) 처리

데이터를 다루다보면 필연적으로 결측치(Null, NaN, Na 등)를 만나게 됩니다. 학습초기에는 그저 이렇게하면 되지 않을까 싶은데로 데이터를 처리해왔었는데 관련된 가이드라인이 있어 정리하고자

junklee.tistory.com

 


 

Jupyter notebook에서 결측치 다루기

 

먼저 지난 시간 불러왔던 데이터 셋을 가져와서 정보를 보겠습니다.

 

import pandas as pd
df = pd.read_csv("소상공인시장진흥공단_상가업소정보_의료기관_201909.csv", low_memory=False)

df.shape

<결과>

(91255, 39)

 

df.shape로 데이터 셋의 행(row)와 열(column)의 갯수를 살펴보니, 91255개의 행과 39개의 열로 이루어져있습니다. 참고로, df를 출력해봐도 아래로 91255개의 행이 쭉 있어서 화면에 모두 표시 되지 않고 ...으로 생략되어 출력됩니다.

 

df.head( )

: 데이터 프레임 구조 확인

 

df.head( ) 함수로 가장 위의 행을 확인 해보겠습니다. head( )의 안에 숫자를 넣는 만큼 행이 표현되며, 아무것도 입력하지 않을 시엔 5개가 기본적으로 표시됩니다.

 

 

df.info( )

: 데이터 프레임 정보 확인

 

데이터 셋 df의 종합적인 정보는 df.info( ) 함수를 통해 확인 가능합니다. 여기서 주목해서 보실 부분은 Non-Null Count입니다. 결측치가 아닌 데이터의 갯수를 의미합니다. 즉, 91335, 39의 데이터 셋에서 91335 non-null는 결측치가 없는 열(column)이다는 것을 의미하고, 지점명처럼 숫자가 1346개라는 말은 거의 모든 값이 결측치라는 것을 의미합니다.

 

참고로, Dtype의 int64는 정수, object는 문자열, float64는 실수를 의미합니다. 그리고 가장 아래에 보면 데이터 크기가 27메가 정도네요.

 

 

df.isnull( )

: 데이터 프레임에서 결측치를 True, 값이 있으면 False를 반환

 

 

우리는 df.isnull( ) 함수와 sum( ) 함수를 조합해서 각 column들이 몇개의 null값을 가졌는지 확인 가능합니다. 추후 이 값을 사용하기 위해서 null_count 변수에 담아주었습니다. 참고로 null_count 값은 Data frame(2차원 자료)이 아닌 Series(1차원 자료)입니다. 데이터 프레임은 위의 그림처럼 표의 형태이고, 시리즈는 아래와 같이 표의 느낌이 없습니다.

 

 

Series.reset_index( )

: Series 형태의 자료를 DataFrame 자료로 변형

 

 

DataFrame.columns = ["바꿀 컬럼명", ..., (반드시 컬럼 갯수만큼!) ]

: DataFrame의 컬럼명을 바꿈

 

Pandas는 컬럼명을 가지고 데이터를 자주 다룹니다. 그래서 컬럼명을 데이터의 정체성을 잘 표현할 수 있도록 잘 정의해줄 필요가 있습니다. 여기서는 위에서 만들어진 데이터 프레임의 컬럼명인 index와 0을 "컬럼명"과 "결측치수"로 변경해보겠습니다.

 

 

DataFrame.sort_values( by="컬럼명")

저는 데이터 분석을 위해서 결측치가 가장 많은 10개의 컬럼들을 모두 제거한 데이터 프레임을 얻을 예정입니다. 이를 위해서는 결측치수가 많은 순서대로 즉, "결측치수"를 기준으로 내림차순으로 정렬해서 10개의 행만 얻어야 합니다. 이를 위해서는 아래와 같이 코딩하시면 됩니다. 아래의 코드에서 만약 ascending을 입력하지 않으면 기본적으로 ascending=True로 되어있어 오름차순으로 정렬됩니다.

 

 

DataFrame["컬럼명"]

: 데이터 프레임에서 원하는 컬럼만 가지는 Series 생성

 

 

DataFrame["원하는 컬럼명"]을 입력하면 해당 컬럼명만 가지는 Series가 만들어집니다. 잠시 후에 drop( ) 함수를 이용해서 해당 컬럼들을 제거 해주기 위해서 사용할 예정입니다. 이 뿐만 아니라 앞으로 데이터 분석 시 아주 많이 사용되는 함수이니 기억해두면 좋을 것 같습니다.

 

DataFrame.drop( row의 index 혹은 column의 이름, ...(여러개 가능), axis = 0 or 1 )

: 원하는 row나 column을 제거하는 함수

 

df.drop( ) 함수에는 아래의 인자들이 들어갈 수 있습니다.

 

1) row의 index (series나 list 형태도 가능)

2) column의 이름 (series나 list 형태도 가능)

 

이때 주의할 것은 행(row)를 제거할 경우엔 'axis = 0'으로, 열(column)을 제거할 경우엔 'axis = 1'로 설정해주어야 한다는 것입니다.

 

이 예제에서는 위에서 얻었던 drop_columns 시리즈에서 컬럼명들을 리스트 형식으로 변형시켜보겠습니다. 사실 위에서 구한 drop_columns를 그대로 사용해주어도 상관없지만, 리스트로 바꿔서 사용할 경우, 여러 drop case들을 합쳐줄 때 편한 점이 있으므로 알아두시면 좋을 것 같습니다.

 

.tolist( ) 함수를 이용해 시리즈 형태에서 리스트 형태으로 바뀐 것을 확인해보세요. 

 

여기서 얻은 drop_columns_list 리스트를 drop( )함수에 넣어서 처음 데이터 프레임과 무엇이 달라졌는지 확인해봅시다.

 

series 형태의 drop_columns를 사용했을 때

 

list 형태의 drop_columns_list를 사용했을 때

처음의 데이터 프레임 df와 결측치가 많은 10개의 열을 제거한 df_drop의 shape를 비교해보니, 열이 39개에서 29개로 줄어든 것을 확인할 수 있습니다.

 

그리고 df_drop.info( ) 함수를 통해 아래와 같이 용량이 기존 27.2MB에서 20.2MB로 7MB 감소한 것도 확인하실 수 있습니다.

 


오늘은 데이터 분석에서 데이터 전처리 중, 결측치를 다루는 방법에 대해서 간단하게 알아보았습니다.

다음 시간에는 원하는 데이터만 가져오는 방법에 대해서 알아보겠습니다.

반응형

+ Recent posts