본문 바로가기
두두 IT/머신런닝(ML)

중복데이터와 결측값(missing value) 처리

by DoDo's 2026. 5. 17.
반응형

1. 결측값(Missing Value) 처리하기

[이론: 결측값이란 무엇이고 왜 처리해야 할까?] 데이터를 수집하다 보면 기계 오류나 사람의 실수로 값이 비어있는 경우가 생깁니다. Pandas에서는 이를 NaN (Not a Number) 또는 Null로 표현합니다. 대부분의 머신러닝 알고리즘은 데이터에 빈칸(NaN)이 있으면 계산을 하지 못하고 에러를 발생시킵니다. 따라서 학습 전에 반드시 이 빈칸을 해결해야 합니다. 해결 방법은 크게 두 가지입니다.

  1. 삭제(Drop): 빈칸이 포함된 행(데이터) 자체를 지워버립니다. (데이터가 충분히 많을 때 유리)
  2. 대체(Fill): 빈칸을 다른 값(0, 평균값, 최빈값 등)으로 채워 넣습니다. (데이터 손실을 막고 싶을 때 유리)

[코드 & 상세 주석]

Python
 
import pandas as pd

# 1. 30만 건 정도의 대용량 비행 지연 데이터 불러오기
delay_df = pd.read_csv('flight_delays_large.csv')

# 2. 데이터 정보 확인하기 (info 함수를 쓰면 컬럼별 데이터 개수를 통해 결측치 파악이 쉽습니다)
print("--- 원본 데이터 정보 ---")
delay_df.info() 

# 3. [방법 1: 삭제] 결측값이 하나라도 포함된 '행(Row)' 전체를 삭제하기
# inplace=True 를 사용하면 원본 데이터프레임(delay_df)에 바로 덮어쓰기가 됩니다.
delay_df.dropna(inplace=True)

print("\n--- 결측값 삭제 후 데이터 정보 ---")
delay_df.info()

# ---------------------------------------------------------
# 🔥 (영상에 부족했던 부분 보충) [방법 2: 결측값 채우기]
# 무작정 지우면 아까운 데이터들이 날아가게 됩니다. 
# dropna() 대신 fillna()를 사용하면 원하는 값으로 빈칸을 메꿀 수 있습니다.

# 예시 데이터 생성 (결측치가 있는 상태)
sample_data = pd.DataFrame({
    'Flight': ['A1', 'B2', 'C3'],
    'Delay_Time': [15, None, 30] # B2 비행기의 지연 시간이 비어있음(None)
})

# 지연 시간이 비어있다면, 0분 지연된 것으로 간주하고 0으로 채워보겠습니다.
sample_data['Delay_Time'] = sample_data['Delay_Time'].fillna(0)

print("\n--- 결측값을 0으로 채운 결과 ---")
print(sample_data)

[실행 후 결과 값]

Plaintext
 
--- 원본 데이터 정보 ---
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 300000 entries, 0 to 299999
Data columns (total 16 columns):
 #   Column    Non-Null Count   Dtype  
---  ------    --------------   -----  
 0   FL_DATE   300000 non-null  object 
 ...
 15  DELAY     295000 non-null  float64  <-- (주의! 5000건이 비어있음)
dtypes: float64(1), object(15)
memory usage: 36.6+ MB

--- 결측값 삭제 후 데이터 정보 ---
<class 'pandas.core.frame.DataFrame'>
Int64Index: 295000 entries, 0 to 299999  <-- (전체 데이터가 29만 5천 건으로 줄어듦)
Data columns (total 16 columns):
 #   Column    Non-Null Count   Dtype  
---  ------    --------------   -----  
 0   FL_DATE   295000 non-null  object 
 ...
 15  DELAY     295000 non-null  float64  <-- (이제 비어있는 값이 없음!)

--- 결측값을 0으로 채운 결과 ---
  Flight  Delay_Time
0     A1        15.0
1     B2         0.0    <-- (비어있던 NaN 값이 0으로 예쁘게 채워짐!)
2     C3        30.0

2. 중복 데이터(Duplicates) 처리하기

[이론: 중복 데이터는 왜 지워야 할까?] 시스템 오류나 여러 소스에서 데이터를 합치다 보면 완전히 똑같은 데이터(행)가 두 번 이상 들어갈 때가 있습니다. 중복 데이터가 많으면 머신러닝 모델이 특정 패턴에 과도하게 치우쳐서 잘못된 학습을 할 수 있고, 컴퓨터의 메모리와 시간만 낭비하게 됩니다. 따라서 고유한 데이터 하나만 남기고 나머지는 삭제해야 합니다.

[코드 & 상세 주석]

Python
 
# 1. 중복된 값이 의도적으로 들어가 있는 공항 데이터 불러오기
airports_df = pd.read_csv('duplicate_rows.csv')

print("--- 원본 데이터 ---")
print(airports_df)

# 2. 중복 데이터 확인하기 (duplicated)
# 위에서부터 아래로 읽으면서, 이전에 본 적 있는 완전히 똑같은 행이 나타나면 True를 반환합니다.
print("\n--- 중복 여부 확인 (True/False) ---")
print(airports_df.duplicated())

# 3. 중복 데이터 삭제하기 (drop_duplicates)
# 중복된 행 중 첫 번째 행만 남기고 나머지 중복행은 모두 제거합니다.
# inplace=True 로 원본에 바로 반영합니다.
airports_df.drop_duplicates(inplace=True)

print("\n--- 중복 데이터 삭제 후 결과 ---")
print(airports_df)

[실행 후 결과 값]

Plaintext
 
--- 원본 데이터 ---
             Name        City      Country
0  Seattle-Tacoma     Seattle          USA
1          Dulles  Washington          USA
2          Dulles  Washington          USA   <-- (1번 행과 완전히 똑같은 중복 데이터!)
3        Schiphol   Amsterdam  Netherlands

--- 중복 여부 확인 (True/False) ---
0    False
1    False
2     True   <-- (Pandas가 "어? 이거 1번이랑 똑같은 중복 데이터야!"라고 알려줌)
3    False
dtype: bool

--- 중복 데이터 삭제 후 결과 ---
             Name        City      Country
0  Seattle-Tacoma     Seattle          USA
1          Dulles  Washington          USA   <-- (중복된 2번 인덱스의 데이터가 깔끔하게 날아감)
3        Schiphol   Amsterdam  Netherlands

💡 튜터의 마무리 핵심 요약!

  • 데이터에 빈칸(NaN)이 있는지 파악할 때는 df.info()가 최고입니다.
  • 빈칸을 지울 때는 df.dropna(), 빈칸을 유용한 값으로 채울 때는 df.fillna()를 사용하세요. (실무에서는 데이터 성격에 따라 평균이나 최빈값으로 채우는 fillna()를 아주 많이 씁니다!)
  • 똑같은 데이터가 여러 개 섞여 있는지 확인할 때는 df.duplicated(), 지울 때는 df.drop_duplicates()를 사용하세요.
반응형