파이썬 코드 2줄로 가능한 탐색적 데이터분석(EDA)
런던 소재 베이즈 경영대 MSc (Master of Science) 과정에서 business analytics 과목을 한 학기 동안 visiting lectuer로 진행하게 됐다. 경영대라 그런지, 실무 경력을 중요하게 생각함과 동시에, 실무에서 분석 이론들이 어떻게 적용되는지에 대한 관점에 집중해서 학생들에게 전달하기를 기대한다.
실무 관점의 데이터 분석 주제로 얘기할 때 부딪히는 첫 번째가 바로 EDA (탐색적 데이터 분석)에 대한 부분이다.
"파이썬에서 데이터를 pandas 라이브러리로 읽고(read) 나서 가장 먼저 해야 될 것이 EDA 과정입니다."
라고 하면, 학생들의 표정이
" 대체 EDA 가 뭔데요?"라는 표정이다. 그중에서도 제법 EDA를 안다고 하는 학생은
"'Exploratory Data Analysis (=탐색적 데이터 분석)'입니다."
라고 대답하기도 한다. 그러면 다시 한번 질문을 한다.
"아주 좋습니다. 그러면 탐색적 데이터 분석 은 뭘 하는 건가요?"
얼굴에 어색한 미소만 감돈다.
탐색적 데이터 분석은 뭘 탐색하는 걸까?
어디서부터 어디까지가 EDA라고 부르는 걸까?
데이터 분석 방법과 코딩에 집중하다 보면, 데이터에 대한 이해를 하지 못하고 방법론에만 치중해서 실제 내가 문제를 풀기 위한 방향을 잃어버릴 때가 있다. 수업을 진행하다가도, 우리가 현재 분석하는 데이터의 숫자에 대한 의미를 콕 집어 물어볼 때가 있다.
예를 들어, 공항의 비행기 이착륙 데이터를 분석할 때, 'Delayed time(=지연된 시간)' 열에서 의미하는 숫자의 단위가 '분'인지, '시간'인지, 그렇다면 여기서 음수(-)로 존재하는 것은 어떤 의미인지, 음수(-)가 의미하는 것이 계획된 일정보다 비행기가 일찍 출발하거나 도착한 것이라면 그것은 0으로 변환해 줘야 될지, 혹은 아예 제외시켜야 할지 등에 대한 질문이다.
기계적으로 코드만 실행한다던지, 문제에 대한 의식 없이 데이터를 읽게 되면 이런 맥락을 놓치게 되고, 아무리 뛰어난 예측모델 혹은 인사이트를 뽑아낸다 하더라도, 실제 담당자와 커뮤니케이션할 때는 내가 설득하고자 하는 결론으로 도달하기도 전에 공격받을 수밖에 없다. 즉, 설득력을 잃어버리게 된다.
1년 전 '데이터 드리븐 리포트'에서 이런 고민들을 책으로 정리했다면, 현재는 대학에서 비슷한 내용을 강의로 풀어내고 있다. 책에서는 나의 생각의 흐름대로 내용을 이끌어 갔다면, 대학에서는 학생들의 질문 흐름으로 내용을 이끌어 가는 것이 크게 다른 점이다. 그러면서 내가 말하려는 것과 그들이 이해하는 것의 격차를 현장에서 해소할 수 있다는 것이 현장강의의 가장 큰 장점이다.(아마도 영어로 설명하는 것이 아직은 분명하게 전달되지 않는 것도 한몫하는 것도 있을 것 같다.) 개인적으로는 '지식의 저주 (Curse of Knowledge)*'를 느끼면서, 책에서 깊게 설명하지 못했던 부분들을 자세히 설명하게 되고, 그렇게 '데이터 드리븐 리포트'의 독자들이 느꼈을 어려움도 이해를 하고 있다. 많이 겸손해지는 과정이다.
(*지식의 저주: 다른 사람의 행동이나 반응을 예상할 때, 자기가 알고 있는 지식을 다른 사람도 알 것이라는 고정관념에 매몰되어 나타나는 편견)
탐색적 데이터 분석(EDA)에 대한 학생들의 혼란은 본질적으로 깊이 있는 데이터 이해의 중요성을 보여준다. EDA는 단순한 통계적 기술이 아니라, 데이터의 숨겨진 이야기를 읽어내는 과정이다.
존 터키(John Tukey)가 1970년대에 제안한 이 방법론은 통계적 가설 검정에 치중하던 기존 관행에서 벗어나, 데이터 자체가 말하는 이야기를 경청하자는 접근이다. 학생들에게 EDA의 핵심은 "데이터와 대화하기"라고 설명한다.
EDA는 단순히 코드를 실행하거나 알고리즘을 적용하는 것이 아니라, 데이터의 맥락을 이해하고, 숨겨진 패턴을 발견하며, 잠재적 가설을 형성하는 창의적인 탐험 과정이라고 할 수 있다. 앞에서 예를 든 공항의 비행 지연 데이터를 예로 들었던 것처럼, 단순히 숫자를 계산하는 것을 넘어 그 숫자가 의미하는 실제 상황과 원인을 탐구하는 것이 EDA의 진정한 목적이다.
특히 비즈니스 애널리틱스 교육에서 EDA는 이론과 실무를 연결하는 중요한 다리 역할을 한다. 학생들에게 데이터는 단순한 숫자의 나열이 아니라, 각각의 숫자와 값이 특정 맥락과 이야기를 담고 있는 살아있는 자료임을 이해시키는 것이 중요하다.
구체적으로 탐색적 데이터분석(EDA)이 어떤 것임을 알아보면,
위 그림을 보면, 데이터 분석(과학)의 절차가 나온다. 지구 모양이 우리가 바라보는 현실이고, 현실의 일부분을 대표하는 데이터를 수집 (Raw data collected)하는 것이 첫 번째 단계이다. 두 번째는 데이터를 정제하는 과정(Data is Processed)인데, 여기는 불필요한 데이터 혹은 중복된 데이터를 삭제하고, 이상치(=outlier)를 처리하는 것, 그리고 칼럼명을 변경하거나 추가하는 것들도 포함된다. 그리고 세 번째는 정제된 데이터(Clean Dataset)를 갖는 것이고, 네 번째 단계는 이제 EDA를 실행하거나 바로 모델링을 하는 것인데, 보통은 이 단계에서 데이터 분석의 목표 혹은 문제해결하고자 하는 문제를 정의하는 것이 필요하다. 내가 가진 데이터로 어떤 문제를 풀 수 있을지 데이터와 대화하는 단계가 여기서 초록색 사각형으로 표현된 EDA라고 할 수 있다. EDA의 자세한 내용은 아래와 같이 정리될 수 있다.
데이터의 패턴과 관계 발견: 각 변수의 분포, 이상치, 상관관계 등을 간단하게 구현해 보면서 (시각화 포함) 예상하는 혹은 예상하지 못한 인사이트를 얻는다.
데이터 품질 문제 파악: 누락값, 오류 등 데이터 품질 이슈를 파악하여 후속 전처리 작업에 활용한다.
잠재적 가설 수립: EDA를 통해 발견한 통찰을 바탕으로 검증 가능한 가설을 세운다.
데이터 준비 방향 결정: EDA 결과는 데이터 변환, 피처 엔지니어링 등 모델링을 위한 데이터 준비 작업을 고민한다.
적절한 분석 기법 선택: 데이터 특성에 따라 어떤 분석 기법이 효과적일지 판단한다.
도표를 보면 알 수 있겠지만, EDA 이후에 데이터 정제과정은 반복적으로 일어날 수 있다. 데이터를 탐색하는 깊이, 혹은 범위에 따라 횟수는 정해진 것이 아니라, 필요에 따라 행해질 수 있다.
이 과정을 도와주는 여러 가지 파이썬 라이브러리가 있지만, 데이터 드리븐 리포트에서도 소개했지만, 필자가 자주 사용하는 라이브러리는 ydata_profiling이다.
참고로 여기서 사용된 데이터셋은 세계행복보고서 데이터이다. (https://www.kaggle.com/datasets/unsdsn/world-happiness)
인스톨은 pip install ydata_profiling으로 하고,
import ydata_profiling
from ydata_profiling import ProfileReport
을 실행한 다음,
업로드한 데이터 프레임을 아래처럼 실행시켜주기만 하면 위에서 말한 5가지를 노코드로 실행할 수 있다.
pr = ProfileReport(df)
다음 그림의 우측 중앙에 각 섹션이 있는데, EDA 할 때 단계별 해당 섹션을 클릭하면 원하는 내용을 볼 수 있다.
1) Sample
위 그림의 빨간색 네모로 표시된 섹션에서 가장 오른쪽에 위치한 ‘Sample’을 클릭하면 파이썬에서 Head(데이터셋의 처음 n개의 행 보기)와 Tail(데이터셋의 마지막 n개의 행 보기)의 기능을 별도의 코드 없이 수행할 수 있다. (아래 그림)
2) Overview
프로파일링 라이브러리 실행 후 스크롤을 아래로 내리면 해당 데이터프레임에 대한 개략적인 정보를 볼 수 있다.
Number of variable (변수 개수) : 9개(열)
Number of observation (관측값 개수) : 156개(행)
Missing cells (누락된 셀) : 0개
Duplicate rows (중복된 행) : 0개
Numeric columns (수치형 열) : 8개
Categorial columns (카테고리형 열) : 1개
3) Alerts
‘Alerts’ 메뉴를 클릭하면 다음 그림과 같이 주의사항이 나타나는 것을 볼 수 있다.
Alerts는 잠재적인 데이터 품질 문제(변수 간 높은 상관관계, 왜도, 0 값, 결측치 등)에 어떤 것들이 있는지를 자동으로 알려주는 편리한 기능이다. 예를 들어 주의사항에서 두 번째 행을 보 면 행복 순위(Overall rank )가 행복지수(Score ) 및 그 외 4개 변수와 상관관계가 높게 나타난다고 한다. 행복 순위가 높으면 행복지수가 높은 것은 필연적이기 때문에 양의 상관관계가 높을 수밖에 없다. 이런 주의사항은 현재 주어진 데이터에서는 활용도가 크지 않아 고려하지 않을 수 있지만, 행복 순위와 상관관계가 높은 다른 독립변수들이 무엇인지 확인해 보고 데이터 분석 시 참고할 필요가 있다. EDA에서 미처 보지 못한 인사이트를 주의사항에서 발견할지도 모른다.
4) 결측치 처리
‘Missing values’ 섹션을 클릭한다. 변수별 결측치 여부를 확인할 수 있다. 현재 주어진 데이터에서는 열별로 결측치 없이 데이터가 완전히 채워져 있는 것을 알 수 있다.
4) 이상치 처리
df.describe() 명령어는 이상치를 약식으로 간단하게 판단할 수 있는 방법이다. std(표준편차)가 3 이상 차이 나면 이상치를 의심할 수 있지만, Overall rank를 제외하고는 std가 높은 열이 없어 보인다. Overall rank는 순위 열이기 때문에 무시한다.
5) 종속변수 분포 확인
Overview 바로 아래에 Variables라는 표가 있는데, 여기서 ‘Select Columns’와 종속변수인 ‘Score’를 선택한다.
6) 종속변수와 독립변수 관계
‘Interactions’ 섹션에서는 종속변수와 독립변수 관계를 시각적으로 볼 수 있는데, 특히 x축과 y축을 변수별로 바꿔가면서 산점도(scatter plot)로 볼 수 있다는 것이 장점이다. 아래 그림의 빨간색으로 표시된 부분에서 위가 x축, 아래가 y축이 된다. y 축에 종속변수 Score를 두고 x축에는 다양한 독립변수를 바꿔가면서 어떤 독립변수가 행복도 에 영향을 끼치는지 살펴본다.
7) 상관관계 분석
‘Correlations’ 섹션에서 상관관계 correlation를 시각화해서 볼 수 있다. 파란색에 가까울수록 양 의 상관관계가 강해지고 빨간색에 가까울수록 음의 상관관계가 강해진다는 의미이다. 예를 들어 Score(행복지수)가 높아질수록 Overall Rank(행복 순위)의 절댓값은 낮아지기 때 문에(순위가 높아진다는 의미는 순위의 절댓값이 낮아진다는 의미다) 음의 상관관계, 즉 빨 간색이 진해진다. 반대로 GDP(국내총생산), Social Support(사회적 지지), Healthy life expectancy(기대수명)이 높을수록 행복 점수도 함께 높아지는, 즉 양의 상관관계가 높아지는(파란색이 진해지는) 것을 알 수 있다. 이 결과는 종속변수와 독립변수 관계를 위에서 산점 도로 살펴본 것과 동일하다.
이렇게 파이썬으로 2줄만 작성해서 코드에 대한 부담 없이 ydata_profiling 라이브러리로 EDA가 가능한 것을 알아봤다. 누가 EDA가 뭔지 물어봤을 때, 머릿속에 이 그림들이 생각나길 바란다.