내일배움캠프

[본캠프] 데이터기반 QA/QC 부트캠프 32일차

min0jun 2026. 6. 25. 20:45

1. 오늘의 학습 목표

오늘은 머신러닝 모델을 만들기 전에 필요한 전체 흐름을 다시 정리했다.

이전까지는 모델을 학습하고 평가하는 부분을 중심으로 봤다면, 오늘은 그 앞단에 있는 데이터 수집, EDA, 데이터 전처리 과정을 학습했다. 모델링 자체도 중요하지만, 실제 데이터 분석에서는 모델을 만들기 전까지의 과정이 훨씬 많은 시간을 차지한다는 점을 확인했다.

오늘의 목표는 크게 세 가지였다.

첫 번째는 예측 모델링 프로세스가 어떤 순서로 진행되는지 이해하는 것이다. 데이터 수집부터 전처리, EDA, 모델링과 평가, 배포까지 이어지는 전체 흐름을 정리했다.

두 번째는 EDA를 통해 데이터를 어떻게 이해하는지 보는 것이다. 기술통계와 시각화를 활용해서 데이터의 분포, 관계, 이상치, 범주별 차이를 확인하는 방법을 학습했다.

세 번째는 머신러닝에 들어가기 전 데이터를 어떻게 다듬는지 정리하는 것이다. 이상치, 결측치, 인코딩, 스케일링처럼 모델 학습 전에 반드시 확인해야 하는 전처리 개념을 학습했다.


2. 오늘 학습한 내용

머신러닝

예측 모델링 전체 프로세스

예측 모델링은 단순히 모델을 만들고 성능을 평가하는 과정만 의미하지 않는다.

전체 흐름은 보통 다음과 같이 이어진다.

데이터 수집 → 데이터 전처리 → EDA → 모델링 및 평가 → 배포

이 중에서 모델링과 평가는 눈에 잘 보이는 핵심 단계처럼 느껴지지만, 실제 현업에서는 데이터 수집과 전처리에 훨씬 많은 시간이 들어간다. 데이터가 제대로 준비되지 않으면 아무리 좋은 모델을 사용해도 결과를 믿기 어렵기 때문이다.

데이터 수집 단계에서는 회사 내부에 이미 존재하는 데이터를 SQL이나 Python으로 추출할 수도 있고, 외부 데이터를 CSV, Excel, API, 크롤링 방식으로 가져올 수도 있다. 여기서 중요한 점은 데이터 분석가가 항상 데이터를 직접 생성하는 것은 아니라는 점이다.

데이터 엔지니어가 데이터를 적재하고 저장하는 구조를 만든다면, 데이터 분석가는 이미 존재하는 데이터를 추출하고, 분석 목적에 맞게 가공하고, 리포팅하거나 머신러닝 모델에 활용한다.

처음에는 “데이터 수집”이라고 하면 그냥 파일 하나 다운로드하는 정도로 생각했는데, 실제로는 Data Source, Data Lake, Data Warehouse, Data Mart처럼 데이터가 저장되고 가공되는 구조까지 이어지는 큰 흐름이었다.

데이터 수집 구조

데이터는 여러 출처에서 들어올 수 있다.

OLTP Database는 온라인 쇼핑, 뱅킹, 주문 입력처럼 실시간으로 발생하는 트랜잭션 데이터를 처리하는 데이터베이스다. 회사 내부 시스템에서 생성되는 고객 관계 데이터나 마케팅, 세일즈 데이터도 중요한 데이터 소스가 될 수 있다.

외부 데이터로는 Google Analytics 같은 Third-Party 데이터가 있고, 사용자의 행동을 기록한 Web/Log 데이터도 있다.

이렇게 다양한 데이터는 원시 형태로 Data Lake에 저장될 수 있고, 더 구조화된 형태로 정리되면 Data Warehouse에 저장된다. 이후 특정 부서나 목적에 맞게 가공된 데이터는 Data Mart 형태로 활용된다.

정리하면, 데이터 분석은 단순히 주어진 CSV 파일을 여는 것에서 끝나는 것이 아니라 데이터가 어디서 오고, 어떤 구조로 저장되고, 어떤 목적에 맞게 가공되는지 이해하는 것에서 시작한다.

EDA란 무엇인가

EDA는 Exploratory Data Analysis의 약자로, 탐색적 데이터 분석을 의미한다.

EDA는 데이터를 시각화하거나 기술통계를 확인하면서 데이터를 이해하고 탐구하는 과정이다. 모델링을 하기 전에 데이터가 어떤 구조를 가지고 있는지, 변수들이 어떤 분포를 가지는지, 이상치는 없는지, 변수 간 관계는 어떤지 확인하는 단계라고 볼 수 있다.

예측 모델링을 하지 않더라도 EDA는 데이터 분석에서 거의 항상 필요하다. 데이터를 제대로 이해하지 못한 상태에서 모델부터 만들면, 결과가 나와도 그 결과를 해석하기 어렵다.

기술통계에서는 describe()를 활용할 수 있다. 기본적으로 수치형 변수의 개수, 평균, 표준편차, 최솟값, 사분위수, 최댓값 등을 확인할 수 있고, include='all' 옵션을 사용하면 범주형 변수까지 함께 확인할 수 있다.

tips.describe(include='all')

이 한 줄만으로도 데이터의 기본 구조를 빠르게 볼 수 있다. 물론 이것만으로 모든 것을 알 수는 없지만, EDA의 출발점으로는 꽤 유용하다.

시각화를 활용한 EDA

오늘은 EDA에서 자주 사용하는 시각화 방법도 정리했다.

countplot은 범주형 데이터의 빈도수를 확인할 때 사용한다. 예를 들어 요일별 데이터 개수, 성별 데이터 개수처럼 각 카테고리에 데이터가 얼마나 있는지 보고 싶을 때 사용할 수 있다.

sns.countplot(x='day', data=tips)

barplot은 범주형 변수에 따라 수치형 값의 평균을 비교할 때 사용한다. 예를 들어 성별에 따른 평균 팁 금액이나 요일별 평균 결제 금액을 비교할 때 사용할 수 있다.

boxplot은 데이터의 분포, 중앙값, 사분위수, 이상치를 한 번에 볼 수 있는 그래프다. 여러 그룹의 분포를 비교할 때 특히 유용하다.

histogram은 수치형 데이터의 분포를 확인할 때 사용한다. 데이터가 어느 구간에 많이 몰려 있는지, 한쪽으로 치우쳐 있는지 볼 수 있다.

scatterplot은 두 수치형 변수 사이의 관계를 확인할 때 사용한다. 예를 들어 total_bill과 tip처럼 한 변수가 증가할 때 다른 변수도 같이 증가하는지 확인할 수 있다.

pairplot은 여러 변수 간 관계를 한 번에 확인할 수 있는 시각화다. 대각선에는 각 변수의 분포가 나타나고, 나머지 영역에는 변수 간 관계가 나타난다.

처음에는 그래프 종류가 많아서 헷갈렸는데, 기준을 단순하게 잡으니 조금 정리됐다. 범주별 개수를 보려면 countplot, 범주별 평균 비교는 barplot, 분포와 이상치는 boxplot, 수치형 분포는 histogram, 두 수치형 관계는 scatterplot으로 생각하면 된다.

데이터 전처리의 중요성

데이터 전처리는 전체 분석 과정에서 매우 많은 시간과 노력이 들어가는 단계다.

전처리는 모델에 데이터를 넣기 전에 데이터를 정리하는 과정이다. 이상치를 처리하고, 결측치를 채우거나 제거하고, 범주형 데이터를 숫자로 바꾸고, 수치형 변수의 단위를 맞추는 작업이 여기에 포함된다.

모델은 결국 데이터를 기반으로 학습한다. 그래서 데이터에 문제가 있으면 모델 결과에도 문제가 생길 수밖에 없다.

오늘 학습한 전처리 내용은 크게 네 가지였다.

이상치 처리, 결측치 처리, 인코딩, 스케일링이다.

이상치 처리

이상치는 관측된 데이터 범위에서 크게 벗어난 아주 작은 값이나 큰 값을 의미한다.

이상치를 찾는 기준에는 여러 방법이 있지만, 오늘은 ESD와 IQR 기준을 학습했다.

ESD는 데이터가 정규분포를 따른다고 가정할 때 평균에서 표준편차의 3배 이상 떨어진 값을 이상치로 보는 방식이다.

import numpy as np

mean = np.mean(data)
std = np.std(data)

upper_limit = mean + 3 * std
lower_limit = mean - 3 * std

하지만 모든 데이터가 정규분포를 따르는 것은 아니다. 데이터가 비대칭이거나 샘플 크기가 작으면 ESD 기준이 적절하지 않을 수 있다.

IQR은 사분위수를 이용해 이상치를 판단하는 방식이다. Q1은 25%, Q3는 75% 지점이고, IQR은 Q3에서 Q1을 뺀 값이다.

Q1 = df['column'].quantile(0.25)
Q3 = df['column'].quantile(0.75)

IQR = Q3 - Q1

upper_limit = Q3 + 1.5 * IQR
lower_limit = Q1 - 1.5 * IQR

이 기준보다 크거나 작은 값은 이상치로 볼 수 있다.

다만 중요한 점은 이상치를 무조건 삭제하면 안 된다는 것이다. 이상치는 단순한 오류일 수도 있지만, 실제로 의미 있는 특이 패턴일 수도 있다. 예를 들어 사기 탐지나 사이버 보안에서는 오히려 이런 이상한 패턴을 찾는 것이 핵심이 될 수 있다.

결국 이상치 처리는 통계적 기준만 보고 기계적으로 처리하기보다, 도메인과 분석 목적을 함께 고려해야 한다.

결측치 처리

결측치는 존재하지 않는 데이터다. 쉽게 말하면 값이 비어 있는 상태다.

결측치를 처리하는 방법은 크게 삭제와 대치로 나눌 수 있다.

행 전체를 삭제할 수도 있고, 결측치가 많은 열을 삭제할 수도 있다.

df.dropna(axis=0)
df.dropna(axis=1)

값을 채우는 방식도 있다. 수치형 데이터는 평균이나 중앙값으로 대치할 수 있고, 범주형 데이터는 최빈값으로 대치할 수 있다.

df.fillna(value)

하지만 평균이 항상 좋은 대표값은 아니다. 이상치가 많은 데이터에서는 평균이 쉽게 흔들릴 수 있기 때문에 중앙값이 더 적절할 수 있다. 이 부분은 이상치와도 연결된다.

sklearn에서는 SimpleImputer를 활용해 평균, 중앙값, 최빈값으로 결측치를 대치할 수 있다.

from sklearn.impute import SimpleImputer

imputer = SimpleImputer(strategy='mean')

더 나아가 IterativeImputer나 KNNImputer처럼 알고리즘을 이용한 대치 방법도 있다. 결측치 처리가 생각보다 단순한 빈칸 채우기가 아니라 하나의 방법론으로 발전해 있다는 점이 인상적이었다.

인코딩

머신러닝 모델은 기본적으로 숫자를 기반으로 학습한다. 그래서 문자열 형태의 범주형 데이터는 숫자로 바꿔야 한다. 이 과정을 인코딩이라고 한다.

대표적인 방법은 레이블 인코딩과 원-핫 인코딩이다.

레이블 인코딩은 문자열 범주를 고유한 숫자로 바꾸는 방식이다.

예를 들어 1등급, 2등급, 3등급을 각각 0, 1, 2로 바꿀 수 있다.

from sklearn.preprocessing import LabelEncoder

encoder = LabelEncoder()
encoded = encoder.fit_transform(data)

레이블 인코딩은 간단하지만, 모델이 숫자의 크기에 의미가 있다고 잘못 해석할 수 있다. 실제로는 순서가 없는 범주인데 0보다 2가 더 크다고 받아들일 수 있는 것이다.

원-핫 인코딩은 각 범주를 0과 1로 이루어진 벡터로 바꾸는 방식이다. 예를 들어 빨강, 파랑, 초록을 각각 독립된 열로 만들어 표현한다.

pd.get_dummies(df)

원-핫 인코딩은 범주 간 순서가 없다는 점을 잘 표현할 수 있지만, 범주의 개수가 많으면 열이 너무 많이 늘어날 수 있다. 이 때문에 차원이 커지고 모델이 복잡해질 수 있다.

그래서 인코딩도 데이터의 성격에 맞게 선택해야 한다.

스케일링

스케일링은 수치형 데이터의 단위를 맞추는 전처리 과정이다.

데이터마다 단위가 다르면 모델이 특정 변수의 크기에 더 큰 영향을 받을 수 있다. 예를 들어 나이는 20~80 사이인데 소득은 수천만 단위라면, 단순히 숫자 크기만 보고 소득 변수가 더 중요하게 반영될 수 있다.

대표적인 스케일링 방법은 표준화, 정규화, 로버스트 스케일링이다.

표준화는 평균을 0, 표준편차를 1로 맞추는 방법이다.

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
scaled_data = scaler.fit_transform(data)

정규화는 데이터를 0과 1 사이 값으로 바꾸는 방법이다.

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
scaled_data = scaler.fit_transform(data)

로버스트 스케일링은 중앙값과 IQR을 기준으로 스케일링한다. 이상치의 영향을 덜 받는다는 장점이 있다.

from sklearn.preprocessing import RobustScaler

scaler = RobustScaler()
scaled_data = scaler.fit_transform(data)

정리하면 표준화는 평균과 표준편차를 기준으로 하고, 정규화는 최소값과 최대값을 기준으로 하며, 로버스트 스케일링은 중앙값과 IQR을 기준으로 한다.

각 방법마다 장단점이 있기 때문에 데이터에 이상치가 있는지, 값의 범위가 중요한지에 따라 선택해야 한다.


3. 나의 간단 소감

오늘은 머신러닝 모델을 만들기 전에 필요한 과정들을 전체적으로 정리했다. 모델을 학습시키고 성능을 보는 과정만 생각하면 머신러닝이 꽤 단순해 보이지만, 막상 앞단을 보니 데이터 수집부터 전처리까지 해야 할 일이 훨씬 많았다.

특히 데이터 수집 부분은 생각보다 범위가 넓었다. 그냥 CSV 파일을 불러오는 정도가 아니라, 데이터가 어디서 생성되고 어떻게 저장되며 어떤 형태로 분석가에게 전달되는지까지 이어졌다. Data Lake, Data Warehouse, Data Mart 같은 구조를 보면서 데이터 분석이 단순히 분석 코드만 작성하는 일이 아니라는 생각이 들었다.

EDA는 이전에도 몇 번 봤던 내용이지만, 오늘은 그래프별 사용 목적을 다시 정리할 수 있었다. countplot, barplot, boxplot, histogram, scatterplot, pairplot이 각각 언제 쓰이는지 구분하니까 조금 덜 헷갈렸다. 그래프는 예쁘게 그리는 것도 중요하지만, 결국 어떤 질문에 답하기 위해 그리는지가 더 중요해 보였다.

전처리에서는 이상치와 결측치가 가장 기억에 남았다. 이상치는 무조건 삭제하면 되는 값이라고 생각하기 쉬운데, 실제로는 도메인에 따라 중요한 신호가 될 수도 있다는 점이 중요했다. 결측치도 평균으로 대충 채우면 끝나는 것이 아니라, 데이터의 분포와 이상치 여부에 따라 중앙값이나 최빈값, 알고리즘 기반 대치까지 고려할 수 있었다.

인코딩과 스케일링은 모델이 데이터를 이해할 수 있게 바꿔주는 과정처럼 느껴졌다. 범주형 데이터는 숫자로 바꿔야 하고, 수치형 데이터는 단위를 맞춰야 한다. 이 과정이 제대로 되어야 모델이 엉뚱하게 해석하지 않는다는 점에서 전처리가 모델 성능의 출발점이라는 생각이 들었다.

오늘 내용은 화려한 모델을 배우는 느낌은 아니었지만, 실제로는 머신러닝에서 가장 기본이 되는 부분이었다. 모델을 잘 만드는 것보다 먼저 데이터를 제대로 이해하고 정리하는 것이 중요하다는 걸 다시 느낀 하루였다.