9 데이터 수집과 전처리
남극 Palmer 연구기지의 차가운 바람이 실험실 창문을 흔들고 있었다. Nelle 박사는 지난 3년간 수집한 펭귄 측정 데이터를 앞에 두고 깊은 고민에 빠져있었다. 344마리 펭귄의 부리 길이, 깊이, 날개 길이, 체중, 성별 등 8가지 특성을 꼼꼼히 기록했지만, 이제 이 원시 데이터를 어떻게 의미 있는 과학적 발견으로 전환할지가 문제였다.
이전 장에서 배운 OSEMN 방법론을 실제 연구에 적용할 때가 왔다. Obtaining(수집)과 Scrubbing(정제)라는 첫 두 단계는 모든 데이터 과학 프로젝트의 기반이 되는 중요한 과정이다. Nelle 박사의 Palmer Penguins 데이터는 실제 현장에서 수집된 생생한 연구 데이터로, 결측치와 측정 오류 등 현실적인 문제들을 모두 포함하고 있어 체계적인 데이터 처리 과정을 학습하기에 이상적이다.
“그동안 배운 유닉스 명령어들이 이제 진짜 연구에 도움이 될 수 있을까?” Nelle 박사는 터미널을 열면서 혼잣말을 했다. 그녀는 아직 모르고 있었다. 앞으로 몇 시간 후면 단순한 파일 관리 도구들이 강력한 데이터 과학 파이프라인으로 변신하는 놀라운 순간을 경험하게 될 것이라는 사실을.
9.1 필수 도구 설치
명령줄 데이터 과학의 핵심은 각 도구가 하나의 작업을 완벽히 수행하는 것이다 (Janssens, 2021). curl은 웹 데이터 수집, jq는 JSON 파싱 (Dolan 기타, 2023), csvkit은 CSV 처리 (Groskopf 기타, 2023), tar/unzip은 압축 해제를 담당한다. 이들을 파이프로 연결하면 강력한 데이터 처리 파이프라인이 완성된다.
# macOS (Homebrew 사용)
brew install curl jq csvkit
# Ubuntu/Linux
sudo apt-get update
sudo apt-get install curl jq
pip install csvkit
# 설치 확인
curl --version
jq --version
csvstat --version
9.2 O(Obtaining): 데이터 수집
Palmer 연구기지에서 3년간 연구하며 Nelle 박사가 깨달은 것은 펭귄 데이터가 생각보다 다양한 형태로 존재한다는 사실이었다. 현장에서 직접 측정한 데이터는 CSV 파일로 저장되지만, 기상청의 날씨 데이터는 API를 통해 JSON 형태로 제공되고, 과거 연구 자료들은 Excel 파일로 압축되어 있었다. 연구의 깊이를 더하려면 이 모든 데이터를 통합해야 했다.
“각각 다른 형식의 데이터를 어떻게 하나로 합칠 수 있을까?” Nelle 박사는 위 다이어그램을 보며 해답을 찾았다. 각 데이터 소스마다 전용 도구가 있지만, 최종 목표는 모두 동일하다. 표준화된 CSV 형태로 변환하여 일관된 방식으로 처리할 수 있게 만드는 것이었다. 이것이야말로 유닉스 철학의 핵심이다. 다양한 입력을 받되, 표준화된 출력을 만들어내는 것이다.
9.2.1 웹에서 데이터 다운로드
Nelle 박사의 첫 번째 도전은 온라인에 공개된 Palmer Penguins 데이터를 다운로드하는 것이었다. 다른 연구팀에서 정리한 표준 데이터셋과 자신의 현장 데이터를 비교하기 위해서였다. 웹브라우저를 열어서 파일을 다운로드할 수도 있지만, 연구 과정의 재현성을 위해서는 모든 단계가 명령어로 기록되어야 했다.
# Palmer Penguins 데이터 다운로드
curl -s "https://raw.githubusercontent.com/mwaskom/seaborn-data/master/penguins.csv" \
-o penguins.csv
# -s: 진행 상황 표시 숨기기 (silent)
# -o: 출력 파일명 지정 (output)
# 파일 확인
head -5 penguins.csv
wc -l penguins.csv # 345 lines (헤더 포함)
9.2.2 Excel 파일 CSV 변환
연구가 진행되면서 Nelle 박사는 예상치 못한 문제에 직면했다. Palmer 연구기지 이전 팀들이 수집한 과거 데이터들이 모두 Excel 파일(.xlsx) 형태로 저장되어 있었던 것이다. “이전 연구자들이 왜 Excel을 사용했을까?” 처음에는 의아했지만, 현장에서는 Excel이 가장 직관적이고 접근하기 쉬운 도구였다는 것을 이해할 수 있었다.
CSV 형식은 텍스트 기반의 단순한 구조로, Unix 철학에 따라 “텍스트는 범용 인터페이스”라는 원칙을 구현한다. 모든 명령줄 도구는 텍스트를 입력받고 텍스트를 출력하므로 파이프라인으로 연결할 수 있다. Excel 데이터를 CSV로 변환하면 awk
, sed
, grep
, jq
, csvkit
등 모든 데이터 처리 도구와 함께 사용할 수 있다.
또한 자동화 측면에서 Excel GUI를 사용한 수동 변환은 확장성이 없고 서버 환경에서 사용할 수 없다. in2csv
를 사용하면 수백 개의 Excel 파일도 스크립트로 일괄 처리할 수 있어 데이터 파이프라인의 핵심 구성요소가 된다.
# Excel을 CSV로 변환
in2csv penguin_adelie.xlsx > penguin_adelie.csv
# 시트 이름 확인
in2csv --names penguin_adelie.xlsx
# Sheet1
# 바로 파이프라인으로 처리
in2csv penguin_adelie.xlsx | cut -d ',' -f 1-3 | csvlook | head -3
# | species | island | bill_length_mm |
# | ------- | --------- | -------------- |
# | Adelie | Torgersen | 39.1 |
위 코드는 in2csv
의 핵심 사용법을 보여준다. 첫 번째 명령어는 Excel 파일을 CSV로 변환하여 파일로 저장하고, --names
옵션으로 시트 이름을 확인할 수 있다. 세 번째 예제는 파이프라인의 진정한 힘을 보여주는데, Excel 파일을 즉석에서 변환하여 cut
으로 필요한 열만 선택하고 csvlook
으로 표 형태로 출력한 후 head
로 상위 3행만 표시한다. 이처럼 중간 파일 생성 없이 한 줄로 복잡한 데이터 처리가 가능하다.
9.2.3 API 데이터 수집
연구의 범위를 넓히기 위해 Nelle 박사는 남극 기상 데이터도 분석에 포함하기로 했다. 펭귄의 서식 패턴과 날씨의 상관관계를 찾기 위해서였다. 하지만 기상청 데이터는 웹사이트에서 직접 다운로드할 수 없었다. 대신 API(Application Programming Interface)를 통해 JSON 형태로 제공되었다.
“API가 뭔지 알겠는데, 이걸 어떻게 펭귄 CSV 데이터와 합칠 수 있지?” Nelle 박사의 고민은 많은 연구자들이 겪는 공통된 문제였다. 서로 다른 형식의 데이터를 통합하는 것이 현대 데이터 과학의 핵심 과제 중 하나이기 때문이다.
curl
과 jq
의 조합은 API 데이터 처리의 황금 조합이다. curl
이 HTTP 요청을 통해 원시 JSON 데이터를 가져오면, jq
가 이를 파싱하여 필요한 필드만 추출하거나 구조를 변환한다. 이 패턴은 Twitter API, GitHub API, 공공데이터 API 등 거의 모든 현대적 API에 적용할 수 있다.
# JSON API 호출
curl -s "https://api.github.com/users/torvalds" | jq '.'
# 특정 필드만 추출
curl -s "https://api.github.com/users/torvalds" | \
jq '{name: .name, company: .company, repos: .public_repos}'
# {
# "name": "Linus Torvalds",
# "company": "Linux Foundation",
# "repos": 8
# }
위 예제는 GitHub API를 통한 실제 데이터 수집과 처리 과정을 보여준다. 첫 번째 명령어는 Linus Torvalds의 GitHub 프로필 전체를 JSON 형태로 가져와서 jq
로 보기 좋게 포매팅한다. 두 번째 명령어는 jq
의 객체 구성 기능을 사용하여 수십 개의 필드 중에서 이름, 회사, 공개 저장소 수만 선택해서 새로운 JSON 객체를 생성한다. 이는 불필요한 데이터를 제거하고 필요한 정보만 추출하는 데이터 정제의 첫 단계이며, 이후 CSV로 변환하거나 다른 도구와 연계하여 추가 분석을 수행할 수 있다.
9.2.4 CSV 데이터 탐색
CSV 데이터 탐색은 Unix 철학의 핵심을 보여주는 영역이다. 각 csvkit 도구는 하나의 작업을 완벽히 수행하며, 파이프라인으로 연결하여 강력한 데이터 처리 워크플로우를 구성할 수 있다.
csvkit의 각 도구는 특정 목적에 최적화되어 있어 데이터 탐색 과정에서 서로 다른 역할을 담당한다. csvlook
은 데이터의 전체 구조를 시각적으로 파악할 수 있게 해주며, csvcut
은 분석에 필요한 특정 열만을 선택적으로 추출한다. csvgrep
는 조건에 맞는 행들을 필터링하여 관심 있는 데이터만 걸러내고, csvstat
은 수치형 데이터의 기본 통계량을 빠르게 계산해준다.
# 1. csvlook: 데이터 구조 파악
csvlook data/penguins.csv | head -5
# 2. csvcut: 필요한 열만 선택
csvcut -c species,bill_length_mm data/penguins.csv | head -3
# species,bill_length_mm
# Adelie,39.1
# Adelie,39.5
# 3. csvgrep: 조건별 필터링
csvgrep -c species -m "Chinstrap" data/penguins.csv | wc -l
# 69 (Chinstrap 펭귄 68개 + 헤더 1줄)
# 4. csvstat: 통계 정보 생성
csvstat -c bill_length_mm data/penguins.csv --mean
# bill_length_mm 평균: 43.9mm
csvstat -c bill_length_mm data/penguins.csv --stdev
# bill_length_mm 표준편차: 5.46mm
이제 개별 도구들을 파이프라인으로 연결하면 훨씬 강력한 데이터 분석이 가능해진다. SVG 다이어그램에서 보여준 통합 파이프라인을 실제로 구현하면 중간 파일을 생성하지 않고도 복잡한 분석을 한 번에 수행할 수 있다.
# Adelie 펭귀ㅣ 종과 부리길이만 추출하여 통계 분석
csvcut -c species,bill_length_mm data/penguins.csv | \
csvgrep -c species -m "Adelie" | \
csvstat
# 결과:
# 1. species,bill_length_mm (152 rows)
# 2. Type of "species": Text
# 3. Type of "bill_length_mm": Number
# 4. bill_length_mm 평균: 38.79mm, 최소: 32.1mm, 최대: 46.0mm
# 더 복잡한 분석: 섬별 Adelie 펭귄 수 계산
csvcut -c species,island data/penguins.csv | \
csvgrep -c species -m "Adelie" | \
csvcut -c island | \
tail -n +2 | \
sort | uniq -c
# 44 Biscoe
# 56 Dream
# 52 Torgersen
위의 파이프라인 예제들은 Unix 철학의 핵심인 “각 도구는 하나의 작업을 완벽히 수행하고, 파이프로 연결하여 복잡한 작업을 해결한다”는 원칙을 보여준다 (Janssens, 2021). 단일 명령어로는 불가능한 복잡한 데이터 분석이 간단한 도구들의 조합으로 가능해진다.
9.3 S(Scrubbing): 데이터 정제
데이터 수집을 마친 Nelle 박사는 곧 현실의 벽에 부딪혔다. 다운로드받은 데이터를 처음 열어봤을 때의 실망감을 그녀는 오래도록 기억할 것이다. “완벽한 데이터는 존재하지 않는다”는 선배 연구자의 말이 이제야 와닿았다.
345행의 펭귄 데이터 중 일부 행에는 부리 길이나 체중이 빠져있었고, 몇몇 데이터에는 명백히 잘못된 값들이 섞여있었다. 예를 들어 Adelie 펭귄의 체중이 10kg으로 기록된 경우가 있었는데, 이는 생물학적으로 불가능한 수치였다. (실제로는 3-5kg 정도가 정상 범위)
“이런 데이터로 어떻게 논문을 쓸 수 있을까?” Nelle 박사는 한숨을 쉬었다. 하지만 이것이야말로 진정한 데이터 과학의 시작이었다. 깨끗하게 정리된 교과서 데이터가 아닌, 현실의 복잡함과 불완전함을 담고 있는 생생한 연구 데이터를 다루는 것이었다.
명령줄 도구들은 이러한 데이터 정제 작업에 특히 강력하다. 대용량 데이터도 메모리 부담 없이 처리할 수 있고, 스크립트로 자동화하여 반복 작업을 효율화할 수 있으며, 각 단계의 결과를 즉시 확인하고 검증할 수 있다.
다음 통합 정제 파이프라인이 그림 9.3 의 각 단계를 구체적으로 구현한 것이다.
9.3.1 통합 데이터 정제 파이프라인
“체계적으로 접근해보자.” Nelle 박사는 다이어그램을 보며 마음을 다잡았다. 문제가 복잡해 보이지만, 실제로는 세 단계로 나눌 수 있었다. 품질 평가 → 결측치 처리 → 이상치 제거. 각 단계를 하나씩 해결한 다음, 전체를 하나의 스크립트로 통합하면 될 것 같았다.
다음 스크립트는 Nelle 박사가 몇 번의 시행착오를 거쳐 완성한 데이터 정제 파이프라인이다. 연구자들이 실제로 사용할 수 있도록 로그 기능과 에러 처리까지 포함되어 있다.
#!/bin/bash
# clean_penguins.sh - Palmer Penguins 데이터 정제 파이프라인
INPUT="data/penguins.csv"
OUTPUT="data/penguins_clean.csv"
LOG="data/cleaning_log.txt"
echo "🐧 Palmer Penguins 데이터 정제 시작" | tee $LOG
echo "===========================================" | tee -a $LOG
# 1. 원본 데이터 현황 파악
echo "1단계: 원본 데이터 분석" | tee -a $LOG
echo "총 행 수: $(wc -l < $INPUT)" | tee -a $LOG
echo "총 열 수: $(head -1 $INPUT | tr ',' '\n' | wc -l)" | tee -a $LOG
# 결측치 현황 분석 (Python을 사용한 간단한 방법)
echo -e "\n결측치 현황:" | tee -a $LOG
python3 -c "
import pandas as pd
df = pd.read_csv('$INPUT')
nulls = df.isnull().sum()
for col, count in nulls.items():
if count > 0:
print(f'- {col}: {count}개')
" | tee -a $LOG
# 2. 필수 측정값 필터링
echo -e "\n2단계: 필수 측정값 필터링" | tee -a $LOG
csvgrep -c bill_length_mm,bill_depth_mm,flipper_length_mm,body_mass_g \
-r ".+" "$INPUT" > temp1.csv
echo "- 측정값 완전 행: $(wc -l < temp1.csv)" | tee -a $LOG
# 3. 생물학적 범위 필터링
echo -e "\n3단계: 생물학적 이상치 제거" | tee -a $LOG
csvgrep -c bill_length_mm -r "^[3-6][0-9](\.[0-9])?$" temp1.csv | \
csvgrep -c flipper_length_mm -r "^1[7-9][0-9]|2[0-4][0-9]$" | \
csvgrep -c body_mass_g -r "^[2-7][0-9]{3}$" > "$OUTPUT"
# 4. 최종 결과 요약
echo -e "\n✅ 데이터 정제 완료" | tee -a $LOG
echo "===========================================" | tee -a $LOG
ORIGINAL=$(wc -l < $INPUT)
CLEANED=$(wc -l < $OUTPUT)
REMOVED=$((ORIGINAL - CLEANED))
echo "원본 데이터: $ORIGINAL 행" | tee -a $LOG
echo "정제된 데이터: $CLEANED 행" | tee -a $LOG
echo "제거된 데이터: $REMOVED 행 ($(echo "scale=1; $REMOVED*100/$ORIGINAL" | bc)%)" | tee -a $LOG
# 5. 샘플 데이터 미리보기
echo -e "\n정제된 데이터 미리보기:" | tee -a $LOG
csvlook "$OUTPUT" | head -5 | tee -a $LOG
# 6. 임시 파일 정리
rm -f temp1.csv
echo -e "\n로그 파일: $LOG에 저장됨" | tee -a $LOG
이 스크립트를 실행하면 다음과 같은 결과를 얻는다.
# 스크립트 실행
bash scripts/clean_penguins.sh
🐧 Palmer Penguins 데이터 정제 시작
===========================================
1단계: 원본 데이터 분석
총 행 수: 345
총 열 수: 7
결측치 현황:
- bill_length_mm: 2개
- bill_depth_mm: 2개
- flipper_length_mm: 2개
- body_mass_g: 2개
- sex: 11개
2단계: 필수 측정값 필터링
- 측정값 완전 행: 343
3단계: 생물학적 이상치 제거
✅ 데이터 정제 완료
===========================================
원본 데이터: 345 행
정제된 데이터: 343 행
제거된 데이터: 2 행 (.5%)
스크립트를 실행한 후 Nelle 박사는 결과를 보며 안도의 한숨을 쉬었다. 345개의 원본 데이터 중 343개가 남았다. 99.5%의 데이터 보존율이었다. “2개만 잃었다면 나쁘지 않아.” 이제 각 단계가 어떻게 작동하는지 자세히 살펴볼 차례였다.
9.3.2 1단계: 데이터 품질 평가
“적을 알고 나를 알면 백전백승이다.” Nelle 박사는 손자병법을 인용하며 웃었다. 데이터 정제도 마찬가지다. 어떤 문제가 있는지 정확히 파악해야 올바른 해결책을 찾을 수 있다.
# 기본 구조 파악
echo "총 행 수: $(wc -l < data/penguins.csv)" # 345
echo "총 열 수: $(head -1 data/penguins.csv | tr ',' '\n' | wc -l)" # 8
# 열 이름 확인
head -1 data/penguins.csv
# species,island,bill_length_mm,bill_depth_mm,flipper_length_mm,body_mass_g,sex,year
# 결측치 세부 분석
for col in species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex; do
missing=$(csvcut -c "$col" data/penguins.csv | grep -c "^$\|^NA$")
echo "$col: $missing개 결측"
done
9.3.3 2단계: 결측치 처리
분석 결과를 본 Nelle 박사는 전략을 세웠다. “성별(sex) 데이터는 11개가 빠져있지만, 생체 측정값은 각각 2개씩만 빠져있네. 일단 필수 측정값이 완전한 개체들만으로 분석을 시작해보자.”
실제 연구에서는 이런 판단이 중요하다. 모든 결측치를 제거할 것인지, 일부는 추정값으로 채울 것인지, 아니면 해당 변수를 제외할 것인지 결정해야 한다.
# 필수 측정값이 모두 있는 행 선별
csvgrep -c bill_length_mm,bill_depth_mm,flipper_length_mm,body_mass_g \
-r ".+" data/penguins.csv > temp_complete.csv
# 성별 데이터는 별도 처리 (선택적)
csvgrep -c sex -r ".+" data/penguins.csv > temp_with_sex.csv
9.3.4 3단계: 이상치 탐지 및 제거
마지막 단계에서 Nelle 박사는 자신의 생물학 지식을 활용했다. “Palmer 지역 펭귄들의 정상 범위를 생각해보자. 부리 길이는 30-70mm, 날개 길이는 170-240mm, 체중은 2000-7000g 정도가 합리적이야.”
이런 도메인 지식의 적용이 바로 데이터 과학과 단순한 통계 분석의 차이점이다. 데이터만으로는 알 수 없는 현실 세계의 제약조건을 반영하는 것이다.
# 정규식 기반 범위 필터링
csvgrep -c bill_length_mm -r "^[3-6][0-9](\.[0-9])?$" temp_complete.csv | \
csvgrep -c flipper_length_mm -r "^1[7-9][0-9]|2[0-4][0-9]$" | \
csvgrep -c body_mass_g -r "^[2-7][0-9]{3}$" > data/penguins_clean.csv
# 비교: 통계적 접근법 (IQR)
python3 -c "
import pandas as pd
import numpy as np
df = pd.read_csv('data/penguins.csv')
for col in ['bill_length_mm', 'body_mass_g']:
Q1, Q3 = df[col].quantile([0.25, 0.75])
IQR = Q3 - Q1
outliers = df[(df[col] < Q1-1.5*IQR) | (df[col] > Q3+1.5*IQR)][col]
print(f'{col} 이상치: {len(outliers)}개')
"
9.3.5 데이터 정제 결과 검증
정제가 완료되면 결과를 검증해야 한다. 원본 데이터와 비교하여 정제의 효과를 확인하고, 예상치 못한 데이터 손실이 없는지 확인한다.
# 정제 전후 비교
echo "원본 vs 정제 데이터 비교:"
echo "원본: $(wc -l < data/penguins.csv) 행"
echo "정제: $(wc -l < data/penguins_clean.csv) 행"
# 종별 분포 비교
echo -e "\n원본 데이터 종별 분포:"
csvcut -c species data/penguins.csv | tail -n +2 | sort | uniq -c
echo -e "\n정제된 데이터 종별 분포:"
csvcut -c species data/penguins_clean.csv | tail -n +2 | sort | uniq -c
# 기본 통계 비교
echo -e "\n체중 통계 비교:"
echo "원본:"
csvstat -c body_mass_g data/penguins.csv --mean --stdev
echo "정제:"
csvstat -c body_mass_g data/penguins_clean.csv --mean --stdev
9.4 AI 강화 데이터 수집과 정제
데이터 정제 스크립트를 완성한 Nelle 박사는 만족감을 느꼈지만, 동시에 새로운 궁금증이 생겼다. “더 똑똑한 방법은 없을까? 내가 놓친 패턴이나 더 좋은 접근법은 없을까?”
바로 그때 동료 연구자가 Claude Code에 대해 알려주었다. AI가 명령줄에서 직접 작동하면서 데이터 과학 작업을 도와준다는 것이었다. “정말로?” Nelle 박사는 반신반의했다. 하지만 첫 번째 시도에서 놀라운 결과를 얻었다.
“이 스크립트를 더 효율적으로 만들 수 있을까?” 라고 자연어로 질문하자, AI가 즉시 개선된 버전을 제안해주었다. 더욱 놀라운 것은 AI가 Nelle 박사가 미처 생각하지 못한 새로운 관점의 분석을 제안한다는 점이었다.
9.4.1 데이터 수집 단계 AI 활용
“남극 기상 데이터 API에서 펭귄 서식지 날씨 정보를 가져와서 CSV로 변환하는 스크립트를 만들어줘”라고 Nelle 박사가 요청하자, AI는 즉시 완성된 스크립트를 제공했다. 단순히 명령어를 생성하는 것을 넘어서, 에러 처리와 데이터 검증 로직까지 포함되어 있었다.
# API 데이터 수집 파이프라인 생성 요청
claude "GitHub API에서 Python 저장소 상위 100개를 가져와서
별의 수, 포크 수, 언어를 CSV로 저장하는 스크립트 작성해줘"
# 복잡한 jq 쿼리 생성
claude "중첩된 JSON에서 commits.author.name과 commits.stats.additions를
추출하는 jq 쿼리 만들어줘"
# 에러 핸들링이 포함된 데이터 수집 스크립트
claude "curl 명령이 실패할 때 재시도 로직과 로그를 포함한
robust한 데이터 다운로드 스크립트 작성해줘"
9.4.2 데이터 정제 단계 AI 활용
가장 감동적인 순간은 AI가 Nelle 박사의 정제 스크립트를 분석한 후 생물학적 타당성을 검토해준 것이었다. “펭귄 체중 범위가 2-7kg로 설정되어 있는데, Gentoo 펭귄은 최대 8.5kg까지 나갈 수 있습니다. 범위를 조정해보세요”라는 제안을 받았을 때, Nelle 박사는 AI가 단순한 코딩 도구가 아니라 연구 파트너가 될 수 있다는 것을 깨달았다.
# 생물학적 제약조건을 반영한 정규식 생성
claude "펭귄 데이터에서 부리 길이는 30-70mm, 체중은 2-7kg 범위에서
유효한 값만 매칭하는 csvgrep 명령어 작성해줘"
# 도메인 특화된 데이터 검증 로직
claude "email 주소 형식과 한국 전화번호 형식을 동시에 검증하는
awk 스크립트 작성해줘"
# 결측치 처리 전략 제안
cat penguins.csv | claude "이 데이터의 결측치 패턴을 분석하고
가장 적절한 결측치 처리 방법을 제안해줘"
몇 주간의 AI 도구 사용 후 Nelle 박사는 놀라운 변화를 경험했다. 이전에는 하루 종일 걸리던 데이터 정제 작업이 이제는 몇 시간 만에 끝났다. 더 중요한 것은 AI가 제안하는 새로운 관점들 덕분에 연구의 깊이가 한층 더해졌다는 점이었다.
“AI는 코딩을 대신해주는 것이 아니라, 내 연구를 더 풍부하게 만들어주는 파트너구나.” 다만 AI가 생성한 모든 명령어는 검증이 필요했고, 펭귄 생태학에 대한 도메인 지식은 여전히 Nelle 박사가 제공해야 했다. AI와 인간의 협업, 이것이 미래 데이터 과학의 모습이었다.
Palmer 연구기지의 실험실에서 노트북을 덮으며 Nelle 박사는 뿌듯한 미소를 지었다. 몇 달 전만 해도 단순한 파일 관리 도구로만 여겼던 유닉스 명령어들이 이제는 강력한 데이터 과학 파이프라인이 되었다. 343마리 펭귄의 깨끗한 데이터가 앞에 놓여있었고, 이제 본격적인 탐색과 분석을 시작할 준비가 되었다.
OSEMN 방법론의 첫 두 단계를 마스터한 것은 단순히 기술적 성취가 아니었다. 데이터 수집(Obtaining)에서는 다양한 소스의 데이터를 통합하는 방법을 배웠고, 데이터 정제(Scrubbing)에서는 현실 세계의 불완전한 데이터를 다루는 지혜를 얻었다. 더 중요한 것은 AI와의 협업을 통해 연구의 새로운 가능성을 발견한 것이었다.
“이제 다음 단계가 진짜 재미있을 거야.” Nelle 박사는 혼잣말을 했다. 탐색적 데이터 분석(Exploring)을 통해 펭귄 데이터 속에 숨겨진 패턴과 인사이트를 찾아내는 것. curl
, csvkit
, jq
가 데이터 수집과 정제의 도구였다면, 이제는 통계와 시각화의 도구들이 기다리고 있었다. 하지만 그 기반이 되는 유닉스 철학은 동일할 것이다. 작은 도구들을 파이프로 연결하여 복잡한 문제를 해결하는 것.