yon11b

[SK 쉴더스 루키즈] 파이썬 데이터 통계2 (전처리) 본문

보안/SK 쉴더스 루키즈

[SK 쉴더스 루키즈] 파이썬 데이터 통계2 (전처리)

yon11b 2026. 3. 14. 21:44
반응형

전처리

데이터를 분석하거나 머신러닝 모델에 사용하기 전에 깨끗하고 유용한 상태로 준비하는 과정

데이터 수집 후,

  • 비어 있는 값(누락된 값)
  • 엉뚱한 값(오류)
  • 필요 없는 값(중복)

이 있다면, 이를 수정하고 정리하는 과정

전처리 단계에서 특수문자와 HTML 태그를 제거하고 텍스트를 정리한다.

데이터 정제 과정에서 비정상적으로 높은 값을 제거하고 음수 값은 적절히 수정 또는 삭제

 

정형 데이터

행과 열로 구성되어 있는 잘 정리된 데이터(DB나 엑셀파일)

 

과정

수집(필요한 데이터를 모으는 단계)→정제(데이터를 깨끗하게 만드는 단계)→변환(데이터를 모델링에 적합하게 바꾸는 단계)→통합(여러 데이터를 하나로 합치는 단계)

  • 형태 변환: 데이터를 사용 목적에 맞게 바꾸기
    • 문자열 데이터를 숫자로 인코딩
      • 남성→0
      • 여성→1
  • 정규화: 데이터 범위를 일정하게 조정
    • 가격 데이터를 0~1 사이로 변환하여 비교 가능하게 만듦
  • 집계: 데이터를 요약하거나 그룹화
    • 일별 데이터를 월별로 집계
  • 차원 축소: 불필요한 데이터를 제거하여 데이터 크기를 줄임
    • 머신러닝 모델에서 중요하지 않은 열 제거

데이터 통합

밑으로 붙이기 ⇒ pandas의 concat

  • merge: 옆으로 붙이기 ⇒ sql의 join(연관 된 것들을 이어줌)
    • 형식 통일
    • 중복 제거

결측치: 데이터셋에서 특정 값이 누락된 상태

import pandas as pd
data={
    'Name': ['Alice', 'Bob', None],
    'Age': [25, None, 30],
    'Score': [85, 90, None]
    }
df=pd.DataFrame(data)

 

df.dropna(): 결측치가 있는 행을 삭제

df.dropna(axis=1): 결측치가 있는 열을 삭제

 

결측치를 특정 값으로 치환

 

1. 평균값으로 치환

df['Age'] = df['Age'].fillna(df['Age'].mean())

 

2. 중앙값으로 치환

df['Age'] = df['Age'].fillna(df['Age'].median())

 

3. 최빈값으로 치환

df['Score'] = df['Score'].fillna(df['Score'].mode())

 

결측치 처리

  • 간단한 데이터 셋에서는 제거와 평균, 중간값 대체가 유용
  • 하지만 복잡한 데이터에서는 ML 기반 대체를 활용 => 무슨 말???

이상치 처리

이상치: 데이터셋에서 다른 값들과 크게 동떨어져 있는 값

이상치는 분석 결과를 왜곡하거나 모델의 성능을 저하시킬 수 있으므로 적절히 처리해야 함

e.g. 학생의 평균 시험 점수가 70~90점 사이인데 한 학생이 150점을 받은 경우 이상치로 간주

IQR(Interquartile Range) 방법

데이터의 중간 50%를 포함하는 범위를 이용해 이상치를 탐지하는 방법

  • 비대칭 분포 데이터에 적합
  • 극단값에 영향을 덜 받음

4사분위로 나눠서 함.

Q1(1사분위수): 하위 25%의 값(0.25)

Q3(3사분위수): 상위 25%의 값(0.75)

IQR = Q3-Q1

작은 것보다 더 작으면 이상치 (Q1에서 1.5만큼 더 작으면)

큰 것보다 더 크면 이상치(Q3에서 1.5만큼 더 크면)

import pandas as pd
data = {
    'score' : [70,75,80,85,90,150]
}
df = pd.DataFrame(data)
Q1 = df['score'].quantile(0.25) # 하위 25% 위치한 데이터
Q3 = df['score'].quantile(0.75) # 상위 25% 위치한 데이터
IQR = Q3-Q1
print(Q1, Q3, IQR)
# 이상치 데이터를 변경
df['score'] = df['score'].astype(float)
df.loc[df['score'] < low_, 'score'] = low_
df.loc[df['score'] > up_, 'score'] = up_

 

중복 데이터

데이터셋에서 동일한 행이 반복적으로 나타나는 것

중복 데이터가 있으면 분석 결과가 왜곡될 수 있다. 특히 데이터의 크기가 큰 경우 처리 속도와 메모리 사용량에 영향을 줄 수 있다.

  • 완전 중복: 모든 열의 값이 동일한 행
  • 부분 중복: 특정 열의 값만 동일한 행
data = {
    'Name': ['Alice', 'Bob', 'Alice', 'Charlie', 'Bob'],
    'Age': [25, 30, 25, 35, 30],
    'Score': [85, 90, 85, 95, 90]
    }
df = pd.DataFrame(data)
# df.duplicated()         # 중복 찾기
df.duplicated().sum()   # 2 => 중복된 행의 개수

 

 

중복된 행을 추출 (처음 나온 건 중복이 아니고 두번째 나온 얘부터 중복 처리를 해줌)

print(df[df.duplicated()])

 

중복된 행을 삭제

df_cleaned =df.drop_duplicates()
print(df_cleaned)

 

Name 열 기준으로 중복된 행을 제거

df_cleaned3 = df.drop_duplicates(subset=['Name'])

 

중복된 데이터는 다 삭제하기(keep=False) (원래는 두번째 것만 삭제함)

df_cleaned2 = df.drop_duplicates(keep=False)

 

728x90