상세 컨텐츠

본문 제목

탐색적 데이터 분석(EDA)

AIFFEL👩🏻‍💻

by 올앤지 2022. 1. 21. 12:54

본문

EDA(Exploratory Data Analysis)는 본격적인 분석이나 모델학습 이전에 데이터를 톺아보는 과정이다. 활용하려는 데이터의 특성을 잘 알고 있어야 모델의 설계나 이후의 분석에서도 더 유의미한 결과를 낼 확률이 높다.

  1. 데이터셋 불러오기

Kaggle 에서 데이터셋을 가져오는 경우
Description 파트를 보면 데이터 제공자의 친절한 설명이 있을 수도, 없을 수도 있다. 대부분의 경우는 데이터셋에 대한 개략적인 설명이 들어있다.
Data Explorer 파트에 들어가면 Detail Compact Column 등의 메뉴가 있다. 데이터셋을 자세하게, 간략하게, 컬럼만 모아서 등등으로 한 눈에 파악하기 쉽다.

original_datadata 분리
원본 데이터는 따로 저장해둬야 data에서 아무리 지지고 볶고해도 원하면 얼마든지 원본 데이터를 다시 불러올 수 있다. 안 그러면 다시 데이터를 read해와야하는 불편함이 있으므로 습관 들여놓기.

  1. 데이터셋 전체적으로 확인하기

head()tail()을 이용해서 대충 이런 데이터셋이구나~ 파악하기.

결측치 파악하기

.isnull()을 하면 데이터 프레임 형식으로 뜨기 때문에 너무 보기 어려움. 이럴 땐 .isnull().sum()을 이용하여 컬럼별로 결측치가 몇 개나 있는지 파악 가능.
* isnull()isna()의 차이를 찾아봤는데 pandas API reference를 보면 isnull()isna()는 서로의 alias(별칭)라고 되어있다. 파이썬식 표기법은 isna()인데 보통 결측치를 null이라고 표기하기 때문에 사용자의 편의를 위해 isnull()이라는 별칭도 만들어 준듯.

전체 컬럼 이해하기

print(len(data.columns)): 전체 컬럼의 갯수
data.columns: 컬럼 인덱스를 쭉 보여준다

컬럼 별로 중복값이 있는지?

len(data["index"])len(set(data["index"])) 비교: 파이썬의 set 객체는 중복 데이터를 가질 수 없다. 따라서 만약 len(data["index"])은 10인데 len(set(data["index"]))가 8이라면 2개의 중복값이 있는 것.

특정 행/컬럼 값 조회하기

data.loc[] 혹은 data.iloc[] 사용
참고: https://bearwoong.tistory.com/65

차집합을 이용해서 컬럼 별 차이 값 찾기

set(data["index1"]) - set(data["index2"])
파이썬은 집합 연산이 굉장히 직관적으로 가능하다. 차집합을 구하는 위의 코드로 유사한 컬럼 간의 차이를 알 수있다. 위 코드의 결과값의 type은 집합(set).

피벗 테이블 이용하기

pd.pivot_table() 이용해서 원하는 값(각 항목별 총합, 비율, 평균값 등)을 구할 수도 있고 결측치를 채워 넣을 수도 있다.

pd.concat(): 속성 형태가 동일한 데이터셋끼리 합쳐 줌

  1. 데이터 시각화하기

* seabornmatplotlib
둘 다 데이터 시각화 라이브러리인데 matplotlib은 단순한 그래프 등을 그릴 때, seaborn은 조금 더 고급스러운 시각화를 원할 때 쓴다.
seaborn은 보통 sns로, matplotlibplt로 줄여쓴다.

plt.subplot(211): 2행 1열 짜리 subplot 중 1번째에 위치
plt.subplot(212): 2행 1열 짜리 subplot 중 2번째에 위치

sns.countplot(): 데이터의 개수를 표시하는 막대 그래프

sns.scatterplot(): 데이터를 점으로 표현하는 산포도, hue는 색 지정 변수

`matplotlib` 문법 넘 헷갈린다 ax가 무슨 변수인지??? fig, ax = plt.subplots() 해주는 이유가 뭔지????

>>> plt.subplots()은 figure 및 axes 객체를 포함하는 튜플을 반화하는 함수.

https://towardsdatascience.com/what-are-the-plt-and-ax-in-matplotlib-exactly-d2cf4bf164a9

[What Are the “plt” and “ax” in Matplotlib Exactly?

Plotting on a paper, or in a cell on the paper

towardsdatascience.com](https://towardsdatascience.com/what-are-the-plt-and-ax-in-matplotlib-exactly-d2cf4bf164a9)

  1. 모델에 적합한 데이터로 전처리하기

문자열 데이터

data = data.replace(to_replace="original_value", value="new_value"): 맘에 안드는 데이터가 있다면(모델 학습에 적합하지 않은 데이터가 있다면 바꿔줄 수 있다.

문자열 데이터는 그대로 학습에 사용할 수 없기 때문에 적절하게 변형해줘야 함.(숫자나 bool 값으로)

토큰화

공백 기준으로 쪼개기: .split()
대문자로 시작해서 소문자로 끝나는 토큰들로 구분하기: tokens = re.findall('[A-Z][a-z]*', data)

collection 패키지

list 또는 set에 속해있는 요소의 개수를 다룰 때 용이한 패키지
OrderedDict: 순서가 있는 딕셔너리
Counter: 요소 개수 세는 모듈 → 딕셔너리 반환

a = [1, 1, 0, 0, 0, 1, 1, 2, 3]
Counter(a)

>>> CounterCounter({1: 4, 0: 3, 2: 1, 3: 1})
Counter(a).most_common()

>>>[(1, 4), (0, 3), (2, 1), (3, 1)] #가장 많은 요소와 등장 횟수 알려줌

범주형 데이터

범주형 데이터(예를 들어 포켓몬이 어떤 속성인가 하는..)도 문자열로 되어있는 경우에는 학습에 사용할 수 없다. 따라서 One-hot Encoding으로 숫자 데이터화 해줘야 함!

참고: https://pandas.pydata.org/docs/user_guide/basics.html#comparing-if-objects-are-equivalent

관련글 더보기