본문 바로가기
SW개발/Python

데이터 수집 → 전처리 → 시각화 → 예측까지! 통합 파이프라인 만들기

by ICT 인사이트 2025. 4. 1.
728x90

단계별로 따로따로 공부하지 마세요! 오늘은 데이터를 처음부터 끝까지 다루는 “통합 데이터 파이프라인”을 직접 만들어 봅니다.

안녕하세요, 데이터 실무에 강해지고 싶은 여러분을 위한 실전 포스팅입니다! 이번 시간에는 Python을 이용해 다음 네 단계를 하나로 묶은 통합 파이프라인을 만들어볼 거예요. ✔️ 데이터 수집 (Open API or CSV) ✔️ 전처리 (결측치, 인코딩, 스케일링) ✔️ 시각화 (matplotlib, seaborn) ✔️ 예측 모델 학습 (scikit-learn) 각 단계별 코드와 함께 실제 분석 흐름을 연결해보며, “데이터 분석이 어떻게 끝까지 이어지는지” 직접 체험해볼 수 있는 콘텐츠입니다. 데이터 사이언스 입문자, 실무 전환자, 프로젝트를 시작하려는 분이라면 꼭 끝까지 따라와 주세요!

1. 데이터 불러오기 및 구조 파악

이번 실습에서는 예제로 널리 사용되는 **타이타닉 생존자 예측 데이터셋**을 사용하겠습니다. 데이터는 Kaggle에서 다운로드하거나 seaborn 내장 데이터로도 불러올 수 있어요.


import pandas as pd
import seaborn as sns

# seaborn에서 바로 로드
df = sns.load_dataset("titanic")
print(df.shape)
df.head()

컬럼에는 생존 여부, 나이, 성별, 클래스, 요금, 탑승 위치 등 다양한 정보가 들어있어요. 이제 이 데이터를 분석 가능한 형태로 가공해봅시다!

2. 전처리: 결측치 처리, 인코딩, 정규화

이제 데이터를 모델링 가능한 형태로 정리합니다. 결측치를 채우고, 범주형을 수치형으로 인코딩하고, 정규화까지 처리해보겠습니다.


df = df.drop(columns=["deck", "embark_town", "alive"])
df["age"].fillna(df["age"].median(), inplace=True)
df["embarked"].fillna("S", inplace=True)
df.dropna(inplace=True)

# 인코딩
df["sex"] = df["sex"].map({"male": 0, "female": 1})
df["embarked"] = df["embarked"].map({"S": 0, "C": 1, "Q": 2})

# 정규화
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
df[["age", "fare"]] = scaler.fit_transform(df[["age", "fare"]])

전처리 후에는 결측치도 사라지고, 모든 변수가 수치형이 되어 머신러닝 입력값으로 준비 완료입니다!

3. 시각화로 패턴 파악하기

전처리가 끝났다면, 본격적인 분석에 앞서 간단한 시각화를 통해 변수 간 관계를 살펴봅니다. survived(생존 여부)와 성별, 클래스, 요금 간 관계를 시각적으로 확인해볼게요.


import seaborn as sns
import matplotlib.pyplot as plt

# 생존율과 클래스
sns.barplot(x="pclass", y="survived", data=df)
plt.title("클래스별 생존율")
plt.show()

# 요금과 생존률
sns.boxplot(x="survived", y="fare", data=df)
plt.title("요금과 생존 여부 관계")
plt.show()

이러한 시각화는 단순한 그림이 아니라, 모델 설계의 핵심 인사이트를 제공합니다. “이 변수는 생존과 관계 있겠구나!”라는 직관을 얻을 수 있는 단계죠.

4. 예측 모델 학습 및 테스트

이제 전처리된 데이터를 기반으로 머신러닝 모델을 학습해보겠습니다. 우리는 타이타닉 승객의 생존 여부를 예측하는 **이진 분류(binary classification)** 문제를 풀게 됩니다.


from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report

X = df.drop("survived", axis=1)
y = df["survived"]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

model = RandomForestClassifier()
model.fit(X_train, y_train)

preds = model.predict(X_test)
print(classification_report(y_test, preds))

랜덤포레스트(Random Forest)는 구조가 직관적이면서도 강력한 성능을 가진 분류 모델입니다. 정확도(accuracy), 정밀도(precision), 재현율(recall) 등을 보고 성능을 평가할 수 있어요.

5. 전체 파이프라인 통합 및 함수화

실무에서는 각 단계를 함수로 나누어 하나의 파이프라인으로 묶는 것이 중요합니다. 이렇게 하면 코드 재사용성, 유지보수성, 자동화까지 쉬워집니다.


def preprocess(df):
    df = df.drop(columns=["deck", "embark_town", "alive"])
    df["age"].fillna(df["age"].median(), inplace=True)
    df["embarked"].fillna("S", inplace=True)
    df.dropna(inplace=True)
    df["sex"] = df["sex"].map({"male": 0, "female": 1})
    df["embarked"] = df["embarked"].map({"S": 0, "C": 1, "Q": 2})
    scaler = MinMaxScaler()
    df[["age", "fare"]] = scaler.fit_transform(df[["age", "fare"]])
    return df

def train_model(df):
    X = df.drop("survived", axis=1)
    y = df["survived"]
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
    model = RandomForestClassifier()
    model.fit(X_train, y_train)
    preds = model.predict(X_test)
    print(classification_report(y_test, preds))
    return model

# 실행
df = sns.load_dataset("titanic")
clean_df = preprocess(df)
trained_model = train_model(clean_df)

이제 우리는 데이터 수집 → 전처리 → 시각화 → 모델링까지 한 번에 실행 가능한 **통합 데이터 분석 파이프라인**을 완성했습니다! 🎉

자주 묻는 질문 (FAQ)
Q 파이프라인은 왜 함수로 나누는 게 좋나요?

함수로 나누면 각 단계가 독립적으로 관리되고, 중복 코드 없이 재사용할 수 있으며 자동화에도 유리합니다. 실무에서도 유지보수를 위해 필수적인 구조입니다.

Q 전처리 순서가 중요한가요?

네! 예를 들어 결측치를 채우기 전에 정규화를 하면 잘못된 값이 들어갈 수 있고, 인코딩 순서도 학습 영향을 줄 수 있어요. 흐름에 따라 순서를 정하는 게 중요합니다.

Q 예측 정확도가 낮게 나와요. 왜 그럴까요?

입력 데이터가 충분하지 않거나, 중요한 특성을 누락했을 수 있습니다. 다양한 모델을 시도하거나 파라미터 튜닝, 교차검증을 활용해 성능을 개선해보세요.

Q 파이프라인 전체를 저장하거나 재사용할 수 있나요?

네! scikit-learn의 Pipeline 또는 joblib으로 모델과 전처리 흐름을 파일로 저장하고 불러올 수 있어요. MLOps나 배포에도 많이 활용됩니다.

지금까지 데이터를 불러오고, 전처리하고, 시각화하며, 모델링까지 연결해보는 통합 분석 파이프라인을 함께 구현해보았습니다. 이런 구조를 한 번 직접 만들어보면, 데이터 분석의 흐름과 실무에서의 사용 방식을 한 눈에 이해할 수 있어요. 앞으로는 더 다양한 데이터셋, 더 고도화된 모델, 자동화와 배포까지도 단계별로 확장해볼 수 있습니다. 꼭 기억하세요. 분석은 단계가 아닌 흐름입니다. 

728x90