본문 바로가기

개발 공부/데이터 분석

[Machine Learning] EDA 시작하기 | Titanic 구조 확인

1. EDA란 무엇일까?

EDA(Exploratory Data Analysis, 탐색적 데이터 분석)는 데이터를 학습시키기 전에 “어떤 데이터가 들어 있는지”, “비어 있는 값은 없는지”, “변수끼리 어떤 관계가 있는지”를 탐색하는 과정이다.

  • 데이터의 행·열 개수와 컬럼 이름을 확인한다.
  • 결측치와 저장 자료형(dtype)을 확인한다.
  • 수치형·명목형·순서형처럼 변수의 실제 의미를 다시 판단한다.
  • 분포, 이상치, 타겟과 변수의 관계를 확인한 뒤 전처리 방향을 정한다.
EDA는 데이터에 질문을 던지고 통계와 그래프로 답을 찾는 과정이다.

 

2. 데이터는 어떻게 나뉠까?

구분 의미 예시
정형 데이터 행과 열, 고정된 스키마를 가진 표 형태 데이터 엑셀, MySQL 테이블, DataFrame
반정형 데이터 고정된 표는 아니지만 구조 정보가 포함된 데이터 JSON, XML, HTML
비정형 데이터 일정한 스키마 없이 저장되는 데이터 텍스트, 이미지, 영상, 음성

이번 Titanic 실습은 행과 열로 구성된 정형 데이터다. Pandas DataFrame은 보통 이런 2차원 표 데이터를 다룰 때 사용한다.

 

3. Seaborn이 Titanic 데이터를 갖고 있는 이유

Seaborn의 본업은 시각화 라이브러리다. 다만 그래프를 쉽게 연습할 수 있도록 Titanic, iris, tips 같은 공개 예제 데이터도 함께 제공한다. 실제 분석에서는 보통 CSV나 데이터베이스에서 데이터를 불러오고, Seaborn은 그 데이터를 시각화하는 데 사용한다.

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

df = sns.load_dataset('titanic')

 

4. 가장 먼저 확인하는 함수: shape, head, tail, info

df.shape  # (행 개수, 열 개수)

df.head()  # 앞 5개 행

df.tail()  # 마지막 5개 행

df.info()  # non-null 개수와 dtype

age, embarked, deck, embark_town은 결측치 존재

 

함수 확인하는 것 Titanic에서 읽는 법
shape 데이터 크기 (891, 15) = 승객 891명, 컬럼 15개
head() 앞부분 실제 값 컬럼명과 데이터 값을 빠르게 봄
tail() 끝부분 실제 값 마지막 행까지 데이터가 정상인지 확인
info() 결측치·저장 자료형 age의 non-null이 714라면 891-714=177개의 결측치가 있음

 

5. dtype과 실제 데이터 유형은 다르다

Pandas의 dtype은 컴퓨터가 저장한 형식이고, 데이터 유형은 값이 실제로 무엇을 뜻하는지에 대한 해석이다.
숫자로 보인다고 모두 연속형 수치 데이터는 아니다.

컬럼 저장 형식 실제 해석
survived int (0, 1) 생존/사망을 나타내는 이진 범주
pclass int (1, 2, 3) 1·2·3등석의 순서가 있는 순서형 범주
age, fare float 측정값·금액이므로 연속형 수치 데이터
sibsp, parch int 함께 탄 가족 수를 세는 이산형 수치 데이터

예를 들어 pclass의 3은 3등석이라는 등급 코드다.
그래서 평균을 낼 수는 있어도, 해석할 때는 등급형 변수라는 점을 기억해야 한다.

 

6. 숫자형과 범주형 컬럼 나누기

df_number = df.select_dtypes(include=np.number)
df_object = df.select_dtypes(exclude=np.number)

df_number.describe()
df_object.describe()

select_dtypes()는 dtype을 기준으로 컬럼을 고르는 함수다.
include = np.number 는 int, float처럼 숫자로 저장된 컬럼만 골라내고,

숫자 타입인 열을 df_number에 저장

exclude = np.number 는 숫자형을 제외한 문자·불리언·category 컬럼을 골라낸다.

숫자 타입인열을 제외하고 df_object에 저장

 

describe()는 각 컬럼의 통계 정보를 한 번에 보여주는 함수다.
다만 숫자형 데이터와 범주형 데이터는 확인할 수 있는 통계 정보가 달라서, 나오는 요약값다르다.

숫자형 데이터는 값의 크기와 차이를 계산할 수 있으므로 데이터 개수(count), 평균(mean), 표준편차(std), 최솟값(min), 사분위수, 최댓값(max) 같은 통계 정보가 나온다.

반면 범주형 데이터는 평균이나 표준편차를 계산하는 것이 의미 없으므로, 데이터 개수(count), 서로 다른 값의 개수(unique), 최빈값(top), 최빈값의 등장 횟수(freq)가 요약값으로 나온다.

describe() 결과 수치형 데이터 범주형 데이터
대표 정보 count, mean, std, min, 25%, 50%, 75%, max count, unique, top, freq
해석 평균·표준편차·사분위수처럼 계산 가능한 통계 서로 다른 값의 개수와 가장 많이 나온 값

범주형 결과에서 top은 최빈값, freq는 그 최빈값이 등장한 횟수다.
예를 들어 sex의 top=male, freq=577이라면 male이 577번 나왔다는 뜻이다.

 

7. 중복된 정보와 파생 컬럼 확인하기

컬럼 겹치는 정보 정리 방향
embarked / embark_town 탑승 항구 코드와 도시명 둘 중 해석하기 쉬운 하나만 남기는 것을 검토
survived / alive 0·1 생존 여부와 yes·no 생존 여부 타겟으로 사용할 survived를 남기고 alive는 제거 가능
pclass / class 1·2·3 등급과 First·Second·Third 분석 방식에 따라 하나만 사용
who / adult_male 성별·나이에서 파생된 정보 원본 변수와 중복되는지 확인한 뒤 선택

df.drop(columns=['embarked', 'alive', 'class'], inplace=True)

inplace=True는 처리 결과를 원본 df에 바로 반영한다는 뜻이다.
다만 원본이 바뀌므로 실무에서는 아래처럼 새 결과를 다시 저장해 흐름을 명확하게 쓰는 경우도 많다.

df = df.drop(columns=['embarked', 'alive', 'class'])

 

8. astype()으로 자료형 바꾸기

df['survived'] = df['survived'].astype(str)
df['pclass'] = df['pclass'].astype(str)

astype()은 자료형을 바꾸는 함수다. 위 코드는 0·1 또는 1·2·3으로 저장된 값을 문자열로 바꿔, describe()에서 연속형 숫자 통계가 아니라 범주형 통계로 확인한다. astype()만 실행하면 원본은 바뀌지 않으므로, 결과를 다시 컬럼에 저장해야 한다.



반응형