AI 개발에 필요한 파이썬 데이터 전처리 기초: Pandas와 NumPy 활용법

결측치 처리부터 인코딩, 스케일링까지 모델 학습 전에 거쳐야 하는 기본 작업

"쓰레기가 들어가면 쓰레기가 나온다"는 말은 AI 모델 개발의 현실을 가장 정확하게 설명하는 문장 중 하나다. 입문 단계에서는 화려한 모델 구조에 먼저 눈이 가기 쉽지만, 실제 예측 성능은 결국 입력되는 데이터의 품질에 크게 좌우된다. 현실에서 마주치는 데이터는 대부분 값이 비어 있거나, 형식이 제각각이거나, 중복이 섞여 있다. 이런 원본 데이터를 정제하고 구조화하는 데이터 전처리 과정을 소홀히 하면, 아무리 구조가 뛰어난 모델이라도 학습 자체가 불안정해지거나 예측 성능이 떨어지는 상황을 피하기 어렵다.

전처리의 핵심 도구, NumPy와 Pandas

데이터 전처리란 무엇인가

데이터 전처리는 원본 데이터를 모델이 학습하기 적합한 깨끗하고 잘 구조화된 형태로 세척하고 변환하는 모든 과정을 가리킨다. 이 과정은 모델의 정확도뿐 아니라 학습 효율과 안정성에도 직접 영향을 준다. 파이썬 생태계에서 이 작업을 담당하는 두 축이 NumPyPandas다.

NumPy는 왜 기반이 되는가

NumPy는 파이썬에서 수치 연산을 다루는 근간이 되는 라이브러리다. 다차원 배열 객체와 이를 효율적으로 처리하는 함수들을 제공하며, 다른 데이터 과학 라이브러리 상당수가 내부적으로 NumPy 배열 구조를 기반으로 만들어져 있다.

Pandas가 표 데이터에 강한 이유

Pandas는 NumPy 위에 구축된 라이브러리로, 표 형태의 데이터를 다루는 데 특화되어 있다. DataFrame이라는 구조를 통해 엑셀 시트나 데이터베이스 테이블처럼 생긴 데이터를 직관적으로 조작할 수 있으며, 데이터 로딩부터 정제, 변환, 분석까지 전처리 과정 대부분을 이 구조 위에서 처리하게 된다.

실제로 자주 쓰는 전처리 작업

결측치 확인하고 처리하기

데이터에 비어 있는 값(NaN)이 있는지 확인하고 처리하는 것은 가장 기본적인 전처리 단계다. 결측치를 무작정 지울지, 평균이나 다른 대표값으로 채울지는 데이터 성격에 따라 달라진다.

import pandas as pd

# 비어있는 값 확인
print(df.isnull().sum())

# 결측치가 있는 행 전체 삭제
df_dropped = df.dropna()

# 특정 값(예: 평균)으로 결측치 채우기
mean_value = df['age'].mean()
df_filled = df.fillna(mean_value)

중복 제거와 타입 변환

같은 레코드가 중복으로 들어와 있으면 통계와 학습 결과가 왜곡될 수 있고, 숫자가 문자열로 저장되어 있으면 연산 자체가 되지 않는다. 이런 문제는 아래처럼 정리한다.

# 중복된 행 제거
df_deduplicated = df.drop_duplicates()

# 데이터 타입 변경 (예: object -> int)
df['price'] = df['price'].astype(int)

# 특정 조건에 따라 값 변경
df['gender'] = df['gender'].apply(lambda x: 1 if x == 'Male' else 0)

범주형 데이터를 숫자로 바꾸기

성별이나 도시명 같은 문자열 데이터는 대부분의 모델이 그대로 이해하지 못한다. 가장 널리 쓰이는 방법은 원-핫 인코딩으로, 각 범주를 별도의 이진 컬럼으로 펼쳐서 표현한다.

# 'city' 컬럼을 원-핫 인코딩으로 변환
df_encoded = pd.get_dummies(df, columns=['city'])

값 범위가 다른 피처 스케일링하기

나이처럼 0에서 100 사이인 값과 연봉처럼 수천만 단위인 값이 함께 있으면, 값의 크기 차이 때문에 학습이 특정 피처에 치우쳐 불안정해질 수 있다. 이럴 때는 피처 범위를 비슷하게 맞춰주는 스케일링 작업이 필요하다.

from sklearn.preprocessing import StandardScaler
import numpy as np

# DataFrame에서 NumPy 배열 추출
data_to_scale = df[['age', 'salary']].values

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

반복문 대신 벡터화 연산 쓰기

NumPy의 핵심은 반복문 없이 배열 전체에 한 번에 연산을 적용하는 벡터화다. 같은 계산이라도 파이썬 반복문으로 처리할 때보다 훨씬 빠르게 끝난다.

# NumPy 배열 생성
numpy_array = np.array([1, 2, 3, 4, 5])

# 배열의 모든 요소에 2를 곱하기 (반복문 불필요)
result_array = numpy_array * 2

# 배열 전체의 평균 계산
mean_val = np.mean(numpy_array)

주의할 점

가장 흔히 저지르는 실수는 데이터 누수다. 스케일링 같은 전처리를 전체 데이터 기준으로 먼저 적용한 뒤 학습용과 테스트용으로 나누면, 테스트 데이터의 정보가 학습 과정에 은근히 섞여 들어간다. 데이터를 먼저 학습용과 테스트용으로 분할하고, 학습용 데이터에만 fit을 적용한 다음 그 기준으로 양쪽 모두를 transform해야 이런 문제를 피할 수 있다.

또한 어떤 전처리 기법이 최선인지는 데이터 특성과 사용하려는 모델에 따라 달라진다는 점도 놓치기 쉽다. 하나의 방법을 정답처럼 고정해두기보다, 여러 조합을 시도하며 성능을 비교하는 과정이 필요하다. 전처리 코드를 작성하기 전에 시각화 등으로 데이터의 분포와 이상치, 피처 간 관계를 먼저 살펴보는 탐색적 데이터 분석도 결과의 방향을 정하는 데 큰 도움이 된다.

정리

데이터 전처리는 AI 프로젝트에서 가장 많은 시간이 들어가지만 눈에 잘 띄지 않는 단계다. 파이썬의 Pandas와 NumPy는 이 작업을 수행하기 위한 가장 널리 쓰이는 도구이며, 두 라이브러리를 능숙하게 다루는 능력은 지저분한 원본 데이터를 모델이 제대로 학습할 수 있는 형태로 바꾸는 실질적인 역량으로 이어진다. 결측치 처리, 중복 제거, 인코딩, 스케일링 같은 기본기를 순서대로 익히고 데이터 누수 같은 함정을 피해가면, 모델 구조를 고민하기 전에 이미 결과물의 절반은 갖추게 되는 셈이다.

핵심 요약

  • NumPy는 수치 연산의 기반이고, Pandas는 표 형태 데이터를 다루는 데 특화되어 있다.
  • 결측치 처리, 중복 제거, 타입 변환은 전처리에서 가장 먼저 확인해야 하는 단계다.
  • 문자열 범주형 데이터는 원-핫 인코딩 같은 방법으로 숫자 형태로 바꿔야 한다.
  • 값의 범위가 크게 다른 피처는 스케일링으로 범위를 맞춰야 학습이 안정적이다.
  • 전체 데이터에 먼저 fit을 적용하면 데이터 누수가 발생할 수 있어 분할 순서가 중요하다.

초보자가 자주 실수하는 포인트

  • 학습·테스트 데이터를 나누기 전에 전체 데이터로 스케일러를 fit하는 경우
  • 결측치를 무조건 삭제하거나 무조건 평균으로 채우는 식으로 데이터 성격을 고려하지 않는 경우
  • 탐색적 데이터 분석 없이 곧바로 전처리 코드부터 작성하는 경우

체크리스트

  • 결측치 비율과 분포를 먼저 확인했는가
  • 중복 데이터와 데이터 타입 오류를 정리했는가
  • 범주형 데이터를 모델이 이해할 수 있는 형태로 인코딩했는가
  • 피처 간 값 범위 차이를 스케일링으로 조정했는가
  • 학습용과 테스트용 데이터를 분할한 뒤에 fit을 적용했는가

자주 묻는 질문

결측치는 항상 삭제하는 것이 안전한가요?

아니다. 삭제할 데이터 비율이 크면 정보 손실이 커질 수 있어, 평균이나 중앙값으로 채우는 방법과 비교해 데이터 성격에 맞게 선택하는 편이 좋다.

NumPy와 Pandas 중 무엇을 먼저 배워야 하나요?

표 형태 데이터를 다루는 실무 작업은 Pandas 비중이 크므로 Pandas부터 익히되, Pandas가 내부적으로 NumPy 배열을 사용하므로 기본 배열 연산 개념도 함께 알아두는 편이 이해에 도움이 된다.

이 글은 초보자 기준으로 이해하기 쉽게 정리되었으며, 내용은 운영 과정에서 순차적으로 보완될 수 있습니다.