반응형
1. 결측값(Missing Value) 처리하기
[이론: 결측값이란 무엇이고 왜 처리해야 할까?] 데이터를 수집하다 보면 기계 오류나 사람의 실수로 값이 비어있는 경우가 생깁니다. Pandas에서는 이를 NaN (Not a Number) 또는 Null로 표현합니다. 대부분의 머신러닝 알고리즘은 데이터에 빈칸(NaN)이 있으면 계산을 하지 못하고 에러를 발생시킵니다. 따라서 학습 전에 반드시 이 빈칸을 해결해야 합니다. 해결 방법은 크게 두 가지입니다.
- 삭제(Drop): 빈칸이 포함된 행(데이터) 자체를 지워버립니다. (데이터가 충분히 많을 때 유리)
- 대체(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()를 사용하세요.
반응형
'두두 IT > 머신런닝(ML)' 카테고리의 다른 글
| scikit-learn으로 선형회귀(linear regression) 모델 머신러닝 트레이닝 수행 (1) | 2026.05.17 |
|---|---|
| scikit-learn으로 트레이닝 데이터와 테스트 데이터 분할 (0) | 2026.05.17 |
| Pandas DataFrame 컬럼(column) 분할(split)과 삭제(remove) (0) | 2026.05.17 |
| Pandas DataFrame으로 CSV 파일 읽고 쓰기 (0) | 2026.05.17 |
| 머신러닝 전체 프로세스 (1) | 2026.05.15 |