
당신의 AI가 수행한 EDA가 맞게 보이는 이유, 그리고 틀렸을 때 구별하는 방법
요약
AI 코딩 어시스턴트가 생성한 EDA(탐색적 데이터 분석) 결과물이 겉보기에는 완벽해 보이지만, 논리적 오류를 포함할 수 있는 위험성을 경고합니다. 데이터 타입 변환 순서, 통계량 선택, 결측치 처리 방식 등 AI가 흔히 범하는 6가지 실패 패턴과 그 해결책을 제시합니다.
핵심 포인트
- 데이터 타입 변환을 통계량 계산 전에 반드시 수행해야 함
- 왜곡된 평균값을 피하기 위해 중앙값, 표준편차 등을 병행 확인 필요
- 결측치 제거(.dropna) 전 데이터의 누락 패턴을 먼저 분석해야 함
- AI의 결과물이 에러 없이 깔끔해 보일수록 비판적 검토가 필수적임
AI 코딩 어시스턴트에게 새로운 데이터셋에 대한 탐색적 데이터 분석 (EDA)을 수행하라고 요청하면, 몇 초 만에 유능한 분석가의 초안처럼 보이는 결과물을 만들어냅니다. .describe(), 상관관계 행렬 (correlation matrix), 몇 가지 분포도 (distribution plots), 한두 개의 groupby, 그리고 발견한 내용을 요약하는 한 단락의 설명 등이 그것입니다.
문제는 이 출력물이 틀렸다는 것이 아닙니다. 종종 그것은 정확합니다. 문제는 그것이 맞든 틀리든 똑같아 보인다는 점입니다. 그리고 그것을 틀리게 만드는 실패 모드 (failure modes)들은 정확히 대충 훑어봐서는 잡아낼 수 없는 것들입니다. 왜냐하면 아무런 에러도 발생하지 않고, 아무것도 불완전해 보이지 않기 때문입니다.
다음은 AI가 생성한 EDA에서 끊임없이 나타나는 6가지 패턴이며, 각각은 깔끔하게 읽히는 출력을 조용히 만들어냅니다.
1. 타입 변환 (type conversion) 전의 프로파일링 (Profiling)
# AI는 흔히 이 순서로 생성합니다 — 문제는 출력물에서 보이지 않습니다
print(df.describe()) # order_date가 제외됨 — 여전히 문자열(string) 상태임
df["order_date"] = pd.to_datetime(df["order_date"]) # 너무 늦음
.describe()는 숫자형이 아닌 컬럼을 조용히 누락시킵니다. 프로파일링을 할 때 날짜 컬럼이 여전히 문자열 객체(string object)로 남아 있다면, 그것은 그냥... 요약에 포함되지 않습니다. 에러는 발생하지 않습니다. 당신은 의도했던 것보다 컬럼 하나가 적은, 깔끔해 보이는 테이블을 얻게 되며, 무엇인가가 누락되었다는 표시도 나타나지 않습니다.
해결책은 코드의 복잡성이 아니라 순서입니다: 타입 변환은 통계량이 계산되기 전, 가장 첫 번째 블록에 위치해야 합니다.
2. 오른쪽으로 치우친 (right-skewed) 컬럼에 .mean() 적용하기
AI 어시스턴트는 기본적으로 거의 모든 "전형적인 값" 질문에 대해 .mean()을 기본값으로 사용합니다. 통계적으로 가장 명백한 첫 번째 단계이기 때문입니다. 매출 (revenue), 지출 (spend), 세션 지속 시간 (session duration) 등 오른쪽 꼬리가 긴(long right tail) 모든 항목에 대해, 이 기본값은 전형적인 수치를 조용히 과장합니다.
df.groupby("channel")["revenue"].mean() # 소수의 대규모 B2B 주문이 이 값을 끌어올림
중앙값 (median), 개수 (count), 표준편차 (std)를 함께 보고하지 않고 평균 (mean)만 보고하는 groupby는 기술적으로는 정확하지만 실질적으로는 오해를 불러일으키는 수치를 생성합니다. 해결 방법은 간단합니다. 항상 이 네 가지를 함께 추출하는 것입니다. 하지만 AI는 자신이 선택한 통계량이 판단의 영역이라는 점을 스스로 알리지 않기 때문에, 사용자가 무엇을 요청해야 하는지 알고 있어야 합니다.
3. 결측치 프로파일링 (profiling the missingness) 전의 .dropna()
df = df.dropna() # "분석을 더 깔끔하게 만들기 위해" 조기에 적용됨
# 남은 데이터에 대해서만 프로파일링이 수행됨
프로파일링의 목적은 값이 어떻게 그리고 어디서 누락되었는지(무작위인지, 특정 세그먼트에 집중되어 있는지, 혹은 다른 컬럼과 상관관계가 있는지)를 특징짓는 데 있습니다. 행을 먼저 삭제해 버리면, 당신이 확인하기도 전에 그 패턴은 사라져 버립니다. 그 이후의 결과물은 완벽해 보일 것입니다. 하지만 그것은 당신이 처음에 시작했던 데이터셋을 더 이상 대표하지 않는 데이터셋에 대해 완벽한 것입니다.
4. 조용한 서브셋 필터 (The silent subset filter)
이것은 당신이 알아차리지 못한 채 결론을 바꿀 가능성이 가장 높은 항목입니다:
df = df[df["status"] == "delivered"] # ← 스크립트 중간에 추가됨, 이후의 어떤 작업에도 라벨이 붙지 않음
이 라인 이후에 실행되는 모든 상관관계 (correlation), 모든 groupby, 모든 차트는 오직 배송 완료된 (delivered) 주문에만 적용되지만, 출력물 어디에도 그 사실이 명시되지 않습니다. "주문의 42%가 엔터프라이즈 채널에서 발생합니다"라는 문구를 읽는 이해관계자는, 누군가 주석이 달리지 않은 필터 라인까지 위로 스크롤해서 올라가 보지 않는 한, 그것이 배송 완료된 주문 중 42%라는 사실을 알 방법이 없습니다.
5. 인과관계를 조용히 단정 짓는 서사적 요약 (Narrative summaries)
AI가 생성한 EDA는 종종 평이한 언어로 작성된 주석 한 단락으로 끝납니다. 그 주석은 상관관계만을 입증했을 뿐인 분석으로부터 "단가가 매출을 견인한다", "강한 상관관계가 X를 확인해 준다"와 같은 인과적 언어가 스며드는 지점입니다. 단락 위의 숫자들은 대개 문제가 없습니다. 문제는 그것을 해석하는 산문(prose)에서 발생하며, 여기서 범위 이탈 (scope creep)이 일어납니다. 왜냐하면 동일한 모델이 한 번의 응답으로 두 가지를 모두 생성하더라도, 서사 생성 (narrative generation)과 통계적 엄밀함 (statistical rigor)은 서로 다른 작업이기 때문입니다.
숫자를 읽으세요. 서사적인 문단은 인용할 결과가 아니라, 수정해야 할 초안으로 취급하십시오.
6. "문제가 발견되지 않음"을 "데이터가 깨끗함"으로 취급하는 것
AI에게 데이터 품질 문제를 확인해 달라고 요청했을 때 아무런 문제가 없다고 보고한다면, 그것은 확증이 아닙니다. 그것은 AI가 실행한 검사에서 아무것도 발견되지 않았음을 의미할 뿐이며, 실행하지 않은 검사에 대해서는 아무것도 말해주지 않습니다. 문자열 컬럼의 기수성 (Cardinality), 구조적 결측 패턴 (structural missingness patterns), 다변량 이상치 (multivariate outliers) 등은 무언가가 그것들을 구체적으로 찾아 나서지 않는 한 나타나지 않습니다.

여섯 가지 패턴 모두 동일한 형태를 공유합니다: 출력 결과는 완전해 보이며, 완전성 (completeness)은 바로 빠른 검토에서 확인하는 바로 그 요소입니다.
"코드만 검토하면 된다"가 완벽한 답이 아닌 이유
실행하기 전에 AI가 생성한 코드를 검토하면 통계 계산 전의 타입 변환 (type conversions), 평균 대 중앙값 (mean vs. median), 서브셋 필터 (subset filters) 등 일부 문제는 잡아낼 수 있습니다. 왜냐하면 이러한 것들은 스크립트 자체에서 눈에 보이기 때문입니다. 하지만 코드 검토만으로는 #5와 #6을 잡아낼 수 없습니다. 즉, 서사적 요약 속에 숨겨진 인과적 언어 (causal language)와, 깨끗해 보이는 "문제가 발견되지 않음"이 주는 잘못된 확신입니다. 이를 위해서는 단순히 코드를 보는 것이 아니라 _출력 결과(output)_를 읽어야 하며, 이미 알고 있는 도메인 지식에 비추어 이를 대조해 보아야 합니다.
AI의 도움을 받았든 아니든, 방어 가능한 EDA (defensible EDA)란 다음의 모든 질문에 "예"라고 답할 수 있음을 의미합니다:
- 통계가 계산되기 전에 타입 변환 (Type conversions)이 이루어졌는가
- 데이터를 삭제하기 전에 결측 패턴 (Missingness)을 프로파일링했는가
- 모든 그룹 요약에 평균뿐만 아니라 개수 (count)와 산포 (spread)가 포함되었는가
- 문서화되지 않은 채 서브셋 필터 (subset filter)가 범위를 변경하지 않았는가
- 인과관계가 확립되지 않은 곳에서 인과적 언어 (Causal language)가 상관관계 언어 (correlational language)로 대체되었는가
- "발견된 사항 없음"을 "데이터가 깨끗함"이 아니라 "내가 실행한 검사에서 아무것도 발견되지 않음"으로 취급했는가
이 모든 것은 사실 AI에 관한 것이 아닙니다. 이는 방어 가능한 분석 (defensible analysis)과 그럴듯해 보이는 분석 (plausible-looking analysis)을 항상 구분해 온 것과 동일한 원칙에 관한 문제입니다. 변화한 점은 그럴듯해 보이는 결과물이 생성되는 속도이며, 이는 체크리스트가 덜 중요한 것이 아니라 오히려 더 중요해졌음을 의미합니다.
이것은 SophiArch의 탐색적 데이터 분석 (Exploratory Data Analysis) 코스의 기반이 되는 프레임워크입니다. 이 코스에는 AI가 생성한 전체 EDA 노트북을 전달받아, 이해관계자 (stakeholder)에게 전달되기 전에 정확히 이러한 종류의 문제들을 찾아내는 실습 (lab)이 포함되어 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기