카카오클라우드 AIaaS 교육/AIaaS를 위한 머신러닝&AI

[스나이퍼팩토리] AIaaS 마스터 클래스 9주차 DAY 44 - 데이터 전처리

mangji2 2025. 5. 28. 17:20

[1] 데이터 과학 수업 복습 - 전처리,시각화

1-1) 데이터 전처리

 

1. 데이터 전처리란 무엇인가?

데이터 전처리는 원시 데이터를 분석이나 머신러닝에 적합한 형태로 변환하는 과정이다.
데이터 과학 프로젝트의 약 70~80% 시간이 여기에 쓰일 만큼, 분석의 성패를 좌우하는 단계라고 할 수 있다.

2. 왜 전처리가 중요한가?

  • 모델 성능 향상: 정제된 데이터는 머신러닝 모델의 예측력을 높인다.
  • 정확한 분석: 결측치, 이상치, 중복 데이터는 분석 결과를 왜곡
  • 자원 효율성: 불필요한 변수를 제거하면 처리 시간과 비용이 줄어듦
  • 데이터 통합 가능성: 형식이 통일되면 시계열 결합 등 고급 분석이 쉬워짐3. 주요 전처리 단계 및 코드

 

3. 주요 전처리 단계 및 코드

 1) 결측치(Missing Value) 처리

누락된 값을 식별하고 삭제하거나 적절한 값으로 대체한다.

df = pd.DataFrame({
	'A' : [1,2,np.nan,4,5],
    'B' : [np.nan, 2,3,4,5],
    'C' : [1,2,3,np.nan,np.nan]
	})
    
#결측치 확인
print(df.isna())
#결측치 개수 확인
print(df.isna().sum())
#결측치 행 삭제
df_dropped = df.dropna()
#결측치 채우기
df_filled = df.fillna(0)
df_mean = df.fillna(df.mean())

 

2) 이상치(Outlier) 처리

이상치는 통계적 기준을 벗어난 데이터로, 모델을 오염시킬 수 있기 때문에 반드시 처리를 해줘야 한다.

🔸 IQR (Interquartile Range)

def detect_outliers_iqr(data):
    """
    IQR 방법으로 이상치 탐지
    """
    Q1 = data.quantile(0.25)  # 1사분위수
    Q3 = data.quantile(0.75)  # 3사분위수
    IQR = Q3 - Q1             # 사분위 범위

    # 이상치 경계 계산 (일반적으로 1.5 * IQR 사용)
    lower_bound = Q1 - 1.5 * IQR
    upper_bound = Q3 + 1.5 * IQR

    # 이상치 식별
    outliers = (data < lower_bound) | (data > upper_bound)

    return outliers, lower_bound, upper_bound

# 사용 예시
outliers_mask, lower, upper = detect_outliers_iqr(df['Score'])

print(f"\nIQR 방법 - 이상치 경계: {lower:.2f} ~ {upper:.2f}")
print(f"이상치 개수: {outliers_mask.sum()}개")
print("이상치 값들:")
print(df[outliers_mask]['Score'].values)

 

 

 3) 중복(Duplicate) 제거

중복된 행을 제거해 데이터의 무결성을 보장한다.

duplicated()함수로 중복 행을 필터링하고 subset을 사용하면 특정 열의 중복 여부를 알 수 있다.

duplicate_rows = df.duplicated() #모든 열이 동일한 행 탐지
#2. 특정 열 기준 중복 확인
name_duplicates = df.duplicated(subset=['Name']) #이름 기준 중복

 

이렇게 여러 방법으로 중복된 행을제거할 수 있다. 

#방법1: 완전 중복 행 제거
df_no_duplicates = df.drop_duplicates()
# 방법2 : 특정 열 기준 중복 제거
df_unique_names = df.drop_duplicates(subset=['Name'])

#방법3: 조건부 중복 제거
df_max_salary = df.loc[df.groupby('Name')['Salary'].idxmax()]

 4) 데이터 타입 변환

정확한 분석을 위해 숫자, 날짜, 범주형 데이터의 타입을 지정한다.

df['A'] = df['A'].astype(int)
# 문자열 '1', '2' → 정수 1, 2
# 수학적 연산(덧셈, 곱셈 등)이 가능해짐

df['C'] = pd.to_datetime(df['C'])
# 예: '2020-01-01' → datetime 객체로 변환
# 날짜 차이 계산, 월/년 추출 등이 가능

df['D'] = df['D'].astype(bool)
# 주의: 문자열 'False'도 True로 변환됨 (비어있지 않기 때문)

import pandas as pd

df_original = pd.DataFrame({
    'D': ['True', 'False', 'True', 'False', 'True']
})

# 방법 1: map() 사용
df_original['D_correct1'] = df_original['D'].map({'True': True, 'False': False})

# 방법 2: 조건문 사용
df_original['D_correct2'] = (df_original['D'] == 'True')

 5) 정규화(Normalization) & 표준화(Standardization) 스케일링

서로 다른 범위의 데이터를 일관된 스케일로 맞춥니다. sklearn 라이브러리를 사용한다.

구조는 둘 다 똑같다고 볼 수 있다.

우선 라이브러리를 임포트 해주고 

어떤 전처리,함수를 쓸건지 정의하고 기준을 정해서 그 기준으로 변환하는 방식이다.

 

fit()함수는 정의했던 방식으로 기준을 정하고

transform()함수는 정의한 기준으로 데이터를 변환하는 역할을 한다.

🔹 표준화 (StandardScaler)

처음 데이터를 fit() 해줬으면 다음 valid 데이터를 정규화 시킬때는 transform()으로만 적용시켜줘도 된다.

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
scaler.fit_transform(x_train)
scaler.transform(x_valid)

🔹 정규화 (MinMaxScaler)

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler() #우선 정의해주고
scaler.fit_transform(x_train)
scaler.transform(x_valid)

 

 

 

1-2) 데이터 전처리

1. 데이터 시각화란?

데이터 시각화는 숫자나 표로 표현된 데이터를 시각적인 형태로 표현하여,
데이터 안에 숨겨진 패턴, 추세, 관계를 쉽게 파악할 수 있게 해준다.

2. 시각화의 목적

  • 변화 추적: 시간에 따른 추세 (예: 매출 그래프)
  • 패턴 인식: 이상치나 군집 파악 (예: 박스 플롯, 산점도)
  • 비교 분석: 범주 간 비교 (예: 막대 그래프, 파이 차트)
  • 분포 파악: 데이터가 어떻게 분포되어 있는지 (예: 히스토그램)

3. 파이썬 시각화 도구

 

라이브러리 특징
Matplotlib 기본 도구. 자유도 높고 다양한 커스터마이징 가능
Seaborn 통계적 시각화에 특화. 스타일 예쁨
Pandas Plot 간단한 시각화는 바로 .plot()으로 가능
Plotly 인터랙티브한 웹 기반 시각화 가능

4. Matplotlib의 구성 요소

구성 요소 설명
Figure 전체 그래프 영역 (캔버스 전체)
Axes 실제 그래프가 그려지는 구역 (x/y축 포함)
Axis 숫자가 적히는 축 그 자체 (x축, y축)
Artist 선, 점, 텍스트, 레이블 등 시각화 구성요소
 

5. 기본 사용법 예제

 
import matplotlib.pyplot as plt 
x = [1, 2, 3, 4] y = [10, 20, 25, 30] 
plt.plot(x, y, label='가격 추이', color='blue', linestyle='--', marker='o') 
plt.title('시간별 가격 변화') 
plt.xlabel('시간') 
plt.ylabel('가격') 
plt.legend() 
plt.grid(True) 
plt.show()

6. 주요 차트별 설명 & 코드

● 선 그래프 (Line Plot)

시계열 데이터 연속적인 데이터의 추세 파악에 사용한다.

 

plt.plot(months, sales, linestyle='-', marker='o', color='green') plt.title('월별 매출 변화')

● 막대 그래프 (Bar Chart)

범주형 데이터의 비교에 적합하다.

labels = ['A사', 'B사', 'C사'] 
values = [100, 250, 130] 
plt.bar(labels, values, color='skyblue', edgecolor='black', width=0.6) 
plt.title('회사별 매출 비교')

● 히스토그램 (Histogram)

데이터의 분포를 확인할 때 사용

plt.hist(df['Age'], bins=10, color='lightgreen', edgecolor='black', alpha=0.7)
plt.title('연령 분포') plt.xlabel('나이') plt.ylabel('빈도수')​
주요 옵션: bins, range, density, alpha, histtype, cumulative

 

● 박스 플롯 (Boxplot)

데이터의 분포와 이상치를 시각적으로 표현한다.

plt.boxplot(df['Salary'], vert=False) plt.title('급여 분포')

 

● 산점도 (Scatter Plot)

두 변수 간의 관계 탐색할 때 사용한다.

 
주요 옵션: s (점 크기), c (색상), alpha (투명도), cmap (컬러맵)

 

 


본 후기는 [카카오엔터프라이즈x스나이퍼팩토리] 카카오클라우드로 배우는 AIaaS 마스터 클래스 (B-log) 리뷰로 작성 되었습니다.