이전 시리즈들을 통해 우리는 파이썬(Python)을 활용하여 ArXiv 논문을 자동으로 수집하고, 수십 편의 PDF에서 핵심 문장과 수치를 엑셀(CSV) 파일로 추출하는 강력한 파이프라인을 구축했습니다. 하지만 이렇게 현실 세계(Real-world)에서 막 수집된 원시 데이터(Raw data)를 열어보면 한 가지 심각한 문제에 직면하게 됩니다. 바로 어떤 행에는 수치가 비어있고(결측치), 어떤 논문은 두 번씩 크롤링되어 똑같은 내용이 반복(중복)되어 있다는 것입니다. 컴퓨터 과학에는 "Garbage In, Garbage Out (쓰레기를 넣으면 쓰레기가 나온다)"이라는 유명한 격언이 있습니다. 아무리 뛰어난 머신러닝 모델이나 통계 기법(SciPy)을 사용하더라도 데이터가 더럽다면 그 결과는 신뢰할 수 없습니다. 이번 포스팅에서는 파이썬의 가장 강력한 데이터 분석 라이브러리인 Pandas를 활용하여, 지저분한 엑셀 데이터를 단 3줄의 코드로 무결점의 '황금 데이터'로 정제하는 전처리(Preprocessing) 기초 스킬을 알아보겠습니다.
1. 엑셀 수작업 정제의 치명적인 위험성
연구실에서 데이터를 정리할 때, 여전히 많은 연구자들이 엑셀 창을 띄워놓고 마우스 휠을 굴려가며 빈칸(Blank)을 찾아 행을 삭제하거나, '중복 항목 제거' 버튼을 클릭합니다. 데이터가 100개 미만일 때는 괜찮지만, 스크립트로 긁어온 1만 개의 화합물 데이터셋을 다룰 때는 이야기가 다릅니다. 사람의 눈으로 빈칸을 찾다 보면 필연적으로 실수가 발생하며, 특정 조건에 따라 데이터를 채워 넣는 작업은 엑셀 수식만으로는 한계가 명확합니다. 무엇보다 엑셀에서의 클릭 작업은 '기록'이 남지 않기 때문에, 나중에 데이터가 어떻게 변형되었는지 지도 교수님이나 리뷰어(Reviewer)에게 증명할 방법이 없습니다. 파이썬 Pandas를 이용한 전처리는 모든 정제 과정이 '코드'라는 명확한 수식으로 남기 때문에, 완벽한 재현성(Reproducibility)을 보장합니다.
2. 결측치(NaN) 처리: 과감하게 지울 것인가, 현명하게 채울 것인가?
파이썬은 데이터프레임 내의 빈칸을 `NaN` (Not a Number)이라는 특수한 값으로 인식합니다. 이 NaN이 포함된 열(Column)은 평균이나 표준편차를 구하는 통계 함수를 먹통으로 만듭니다. 이를 해결하는 방법은 크게 두 가지입니다.
첫째, 삭제(Drop)입니다. `dropna()` 함수를 사용하면 빈칸이 하나라도 포함된 행(Row)을 가차 없이 날려버립니다. 실험 데이터가 충분히 많고, 빈칸이 있는 데이터는 아예 분석에서 배제하는 것이 안전할 때 주로 사용합니다.
둘째, 대체(Fill)입니다. 데이터 하나하나가 귀중한 실험 결과라서 함부로 지울 수 없다면 `fillna()` 함수를 사용해야 합니다. 비어있는 밴드갭(Bandgap) 수치에 해당 물질 군의 '평균값(Mean)'이나 '중앙값(Median)'을 채워 넣거나, 혹은 앞뒤 시계열 데이터의 추세를 반영하여 값을 보간(Interpolation)할 수 있습니다.
3. 중복 데이터(Duplicates)의 함정 피하기
웹 크롤링이나 여러 개의 CSV 파일을 하나로 합치는(Merge) 과정에서는 필연적으로 중복 데이터가 발생합니다. 논문 리스트에 동일한 논문이 2번 들어가 있다면, 이후 메타 분석에서 해당 논문의 가중치가 비정상적으로 높아지는 오류가 발생합니다. Pandas의 `drop_duplicates()` 함수는 이러한 중복 데이터를 단숨에 식별하고 제거합니다. 단순히 모든 열이 똑같은 행을 지우는 것뿐만 아니라, 특정 열(예: '논문 제목' 또는 'DOI')만을 기준으로 중복을 판단하고, 가장 처음 수집된 데이터만 남길지 마지막 데이터를 남길지 정밀하게 제어할 수도 있습니다.
4. 실전 파이썬 코드: 더러운 CSV 파일을 1초 만에 깔끔하게
아래의 코드는 가상의 지저분한 논문 데이터 추출 결과 파일(`messy_data.csv`)을 불러와, 중복된 논문을 제거하고, 핵심 수치(예: 온도)가 누락된 행은 지우며, 기타 정보가 누락된 칸은 'Unknown'으로 채워 넣는 완벽한 전처리 파이프라인입니다.
import pandas as pd
# 1. 지저분한 원본 데이터 불러오기
# 예시 컬럼: ['Title', 'Authors', 'Synthesis_Temp', 'Bandgap']
df = pd.read_csv('messy_data.csv')
print(f"초기 데이터 개수: {len(df)}개")
# 2. 중복 데이터 제거
# 'Title'(논문 제목)이 완전히 똑같은 행이 있다면 첫 번째 행만 남기고 제거
df_clean = df.drop_duplicates(subset=['Title'], keep='first')
print(f"중복 제거 후 데이터 개수: {len(df_clean)}개")
# 3. 결측치(NaN) 처리 - 삭제 (Drop)
# 분석에 치명적인 'Bandgap' 수치가 없는 행은 과감히 삭제
df_clean = df_clean.dropna(subset=['Bandgap'])
# 4. 결측치(NaN) 처리 - 대체 (Fill)
# 'Synthesis_Temp'의 빈칸은 해당 열의 평균값(mean)으로 채워 넣기
mean_temp = df_clean['Synthesis_Temp'].mean()
df_clean['Synthesis_Temp'] = df_clean['Synthesis_Temp'].fillna(mean_temp)
# 'Authors' 열의 빈칸은 'Unknown'이라는 텍스트로 채워 넣기
df_clean['Authors'] = df_clean['Authors'].fillna('Unknown')
print(f"결측치 정제 완료 후 최종 데이터 개수: {len(df_clean)}개")
# 5. 정제된 데이터를 새로운 CSV 파일로 저장
output_file = 'cleaned_golden_data.csv'
df_clean.to_csv(output_file, index=False, encoding='utf-8-sig')
print(f"성공적으로 정제된 데이터가 '{output_file}'로 저장되었습니다.")
결론: 데이터 분석의 성패는 전처리에서 결정됩니다
화려한 시각화 그래프나 복잡한 딥러닝 모델의 이면에는 항상 누군가의 고독하고 철저한 '데이터 정제' 작업이 숨어 있습니다. Pandas를 활용한 파이썬 전처리 스크립트는 이 고독한 작업을 가장 빠르고, 정확하고, 재현 가능하게 만들어 줍니다. 오늘 다룬 `drop_duplicates()`, `dropna()`, `fillna()` 이 세 가지 함수는 데이터 과학자와 계산 과학자들이 매일같이 숨 쉬듯 사용하는 핵심 무기입니다. 앞선 시리즈에서 추출해 두었던 여러분만의 CSV 파일을 이 스크립트에 통과시켜 보십시오. 데이터가 한결 가볍고 깨끗해지는 것을 두 눈으로 확인하실 수 있을 것입니다.