데이터 과학의 7가지 기둥: 현업에서 배운 진짜 이야기
데이터 과학의 7가지 기둥: 현업에서 배운 진짜 이야기
AI, 머신러닝, 빅데이터… 근데 실상은 데이터 청소부에 가깝다. 내가 경험한 데이터 과학의 7가지 핵심 요소를 솔직하게 풀어보고자 한다.
1. 데이터 수집: 깨끗한 데이터는 환상
# 이상적인 상황
clean_data = pd.read_csv('perfect_dataset.csv')
# 현실
try:
data1 = pd.read_excel('최종_진짜최종_v3.xlsx', sheet_name='Sheet1')
data2 = scrape_from_unreliable_api() # 자주 503 에러 뜸
data3 = connect_to_legacy_database() # 접근 권한 문제
# 어떻게든 합치기
except Exception as e:
print(f"또 실패: {e}")
# 결국 수동으로...
첫 프로젝트에서 클라이언트가 “데이터는 다 준비되어 있어요”라고 했는데… 엑셀 파일 수백 개가 각기 다른 형식으로 저장되어 있더라. 그것도 어떤 건 2019년 형식, 어떤 건 97-2003 호환 형식. 순간 멘탈이 붕괴되는 것 같았다.
현업에서 자주 마주치는 상황들:
- API가 갑자기 다운됨
- DB 접근 권한 없음
- 중요 데이터가 누군가의 이메일에 첨부파일로만 존재
- 데이터 소스마다 같은 정보가 다르게 기록됨
이런 상황이 일상이다.
2. 데이터 전처리: 데이터 과학의 80%는 청소다
데이터 과학에서 가장 많은 시간을 쏟는 부분이 바로 전처리다. 학교나 강의에선 깨끗한 데이터셋으로 실습하지만, 현실은? 말도 안 되게 더럽다.
# 현실의 데이터 전처리
def my_data_cleaning_hell(df):
# 결측치 처리
df = df.fillna({'numeric_col': df['numeric_col'].median(),
'categorical_col': '알 수 없음'})
# 이상치 제거 (갑자기 매출이 1000배 뛴 날 등)
q1, q3 = df['value'].quantile(0.25), df['value'].quantile(0.75)
iqr = q3 - q1
df = df[(df['value'] > q1 - 1.5*iqr) & (df['value'] < q3 + 1.5*iqr)]
# 날짜 형식 통일
df['date'] = pd.to_datetime(df['date'], errors='coerce')
# 컬럼명 정리 (공백, 특수문자 등)
df.columns = [col.strip().lower().replace(' ', '_') for col in df.columns]
return df # 실제로는 이 함수가 훨씬 길다
내가 맞닥뜨린 흔한 문제들:
- 날짜가 “2023년 3월 5일”, “05/03/2023”, “2023-03-05” 등 다양한 형식으로 섞여있음
- 숫자 필드에 “N/A”, “-”, “확인중” 같은 텍스트가 섞여있음
- 동일 제품이 “아이폰”, “iphone”, “iPhone 13” 등 다양하게 표기됨
- 중복 데이터가 대량으로 존재
이런 삽질을 줄이려면 데이터 품질 체크 함수를 만들어두는 게 좋다. 나중에 또 써먹을 수 있으니까.
3. 탐색적 데이터 분석(EDA): 호기심이 무기다
EDA를 얼마나 꼼꼼히 하느냐가 프로젝트 성패를 좌우한다. 그냥 상관관계 매트릭스 하나 띄우고 끝내는 게 아니라, 데이터에 진짜 호기심을 가져야 한다.
# 기본적인 EDA 코드
import seaborn as sns
import matplotlib.pyplot as plt
# 상관관계 확인
plt.figure(figsize=(10, 8))
sns.heatmap(df.corr(), annot=True, cmap='coolwarm')
plt.title('변수 간 상관관계')
plt.show()
# 분포 확인
plt.figure(figsize=(15, 10))
for i, col in enumerate(df.select_dtypes(include=['number']).columns[:9]):
plt.subplot(3, 3, i+1)
sns.histplot(df[col], kde=True)
plt.title(f'{col} 분포')
plt.tight_layout()
plt.show()
근데 진짜 통찰은 여기서 더 파고들 때 나온다. 나는 이런 질문들을 자주 던져본다:
- 시간에 따른 패턴이 있나? (주말/평일, 계절성)
- 특정 세그먼트별로 행동이 다른가? (연령대, 지역)
- 이상치가 정말 에러인가, 중요한 신호인가?
- 데이터가 비즈니스 현실과 일치하는가?
한번은 요일별로 데이터를 그룹화해서 보았더니, 금요일에 특정 이벤트가 비정상적으로 많이 발생하는 패턴을 발견했다. 알고보니 영업사원들이 월말 성과 측정 때문에 실적을 몰아서 입력하는 관행이 있었던 거였다. 데이터만 봤으면 절대 몰랐을 인사이트.
4. 모델링: 복잡한 모델보다 설명 가능한 모델이 더 가치 있다
한때 최신 딥러닝 모델에 푹 빠져있었다. 논문 나오자마자 구현해보고, 파라미터 튜닝하면서 정확도 0.1% 올리는데 밤샜지. 근데 회사에서는?
# 학교에서 쓰던 모델
from super_complex_package import TransformerQuantumNeuralNetwork
model = TransformerQuantumNeuralNetwork(
layers=42,
attention_heads=16,
dropout=0.1,
activation='quantum_swish'
)
# 회사에서 실제로 쓰는 모델
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier() # 심플 이즈 베스트
현업에서는 설명 가능성이 정확도보다 더 중요한 경우가 많다. 특히 비즈니스 의사결정자들에게 “이 모델이 왜 이런 예측을 했는지”를 설명할 수 있어야 한다.
내 경험상 랜덤 포레스트나 그래디언트 부스팅 같은 트리 기반 모델이 실무에서 더 많이 쓰인다. SHAP value나 feature importance로 설명하기가 훨씬 쉽기 때문이다.
물론 이미지나 텍스트 같은 비정형 데이터는 딥러닝이 필수지만, 일반적인 정형 데이터에서는 해석 가능한 모델로 시작하는 게 훨씬 현명하다.
5. 해석 및 커뮤니케이션: 분석도 전달 못하면 쓸모없다
이건 정말 뼈저리게 느꼈다. 처음 회사에서 발표할 때 기술적인 내용으로 PPT를 꽉 채워갔는데, 임원들 표정이 다들… 😐
비즈니스 가치로 바로 연결되지 않는 기술적 설명은 아무리 뛰어나도 의미가 없다. 지금은 이렇게 접근한다:
- 결론부터 말하기: “이 모델을 도입하면 고객 이탈률을 15% 줄일 수 있습니다.”
- 시각화에 투자하기: 복잡한 통계표 대신 명확한 차트로 표현
- 스토리텔링 접근: 데이터가 말하는 ‘이야기’에 집중
# 임원용 시각화는 단순하고 명확해야 한다
plt.figure(figsize=(10, 6))
top_segments = df.groupby('segment')['value'].sum().nlargest(3).index
sns.barplot(x='segment', y='value', data=df[df['segment'].isin(top_segments)])
plt.title('가장 가치 있는 상위 3개 세그먼트')
plt.axhline(df['value'].mean(), color='red', linestyle='--',
label='평균 가치')
plt.legend()
plt.show()
6. 도메인 지식: 데이터만으로는 충분하지 않다
데이터 과학의 함정 중 하나는 “데이터가 모든 것을 말해준다”는 착각이다. 실제로는 도메인 지식 없이 데이터만 분석하면 엉뚱한 결론에 도달하기 쉽다.
금융 분야 프로젝트 할 때였다. 데이터만 보면 특정 상품이 월말에 급격히 팔리는 패턴이 있었는데, 이걸 마케팅 효과로 해석했었다. 알고보니 월말 성과 측정 때문에 영업사원들이 실적을 몰아서 입력하는 관행이 있었던 거였다. 데이터는 거짓말을 하지 않지만, 맥락 없는 데이터는 오해를 부른다.
도메인 전문가와 협업하는 팁:
- 분석 전에 도메인 전문가와 인터뷰 진행하기
- 중간 결과물을 공유하고 피드백 받기
- “이상해 보이는 패턴”에 대해 적극적으로 질문하기
- 비즈니스 프로세스를 직접 경험해보기
7. 윤리적 고려사항: 할 수 있다고 해서 해야 하는 건 아니다
데이터 과학자로서 가장 중요한 책임 중 하나는 윤리적 판단이다. 특히 요즘처럼 AI가 발전할수록 더 그렇다.
고객 행동 예측 모델을 만들던 중이었다. 기술적으로는 개인정보를 활용해 더 정확한 모델을 만들 수 있었지만, 그게 과연 옳은 일인지 팀에서 많은 고민을 했다.
실무에서 자주 마주치는 윤리적 질문들:
- 이 데이터를 수집하는 것이 합법적이고 윤리적인가?
- 알고리즘의 편향성을 충분히 테스트했는가?
- 이 분석 결과가 특정 그룹에 불이익을 줄 가능성은 없는가?
- 고객이 자신의 데이터가 어떻게 사용되는지 알고 동의했는가?
# 알고리즘 편향성 체크 예시
from aif360.datasets import BinaryLabelDataset
from aif360.metrics import BinaryLabelDatasetMetric
# 보호 속성(예: 성별, 연령대)에 따른 편향성 체크
protected_attribute = 'gender'
privileged_groups = [{'gender': 1}]
unprivileged_groups = [{'gender': 0}]
dataset = BinaryLabelDataset(df=df,
label_names=['target'],
protected_attribute_names=[protected_attribute])
metric = BinaryLabelDatasetMetric(dataset,
unprivileged_groups=unprivileged_groups,
privileged_groups=privileged_groups)
# 통계적 편향 지표 계산
print(f"격차 비율: {metric.disparate_impact()}")
print(f"통계적 평등 차이: {metric.statistical_parity_difference()}")
결론: 데이터 과학은 기술보다 사고방식이다
결국 데이터 과학은 끊임없이 배우고 성장하는 분야다. 내가 5년 전에 배웠던 기술 스택과 지금은 많이 다르고, 5년 후에는 또 어떻게 변할지 모른다.
근데 이 7가지 핵심 요소의 중요성은 변하지 않을 거다. 알고리즘만 배우는 것보다 이 핵심 요소들을 균형 있게 발전시키는 게 더 중요하다. 그리고 무엇보다… 데이터에 대한 호기심과 비판적 사고를 잃지 마라.
여러분은 데이터 과학 프로젝트에서 가장 어려운 부분이 뭐라고 생각하는가?