이미지 로딩 중...

EDA 개요 및 프로세스 완벽 가이드 - 슬라이드 1/9
A

AI Generated

2025. 11. 24. · 3 Views

EDA 개요 및 프로세스 완벽 가이드

탐색적 데이터 분석(EDA)의 기본 개념부터 실전 프로세스까지 초급 개발자를 위해 친근하게 설명합니다. 데이터의 숨겨진 패턴을 발견하고 인사이트를 도출하는 방법을 배워보세요.


목차

  1. EDA란_무엇인가
  2. 데이터_불러오기와_기본_탐색
  3. 데이터_구조_파악하기
  4. 기술_통계량_분석
  5. 결측치_탐색과_처리
  6. 데이터_분포_시각화
  7. 상관관계_분석
  8. 이상치_탐지

1. EDA란_무엇인가

시작하며

여러분이 처음으로 고객 데이터를 받았을 때 이런 상황을 겪어본 적 있나요? 수천 개의 행과 수십 개의 컬럼이 있는 CSV 파일을 열었는데, 어디서부터 시작해야 할지 막막했던 경험 말이죠.

이런 문제는 실제 데이터 분석 현장에서 가장 자주 발생합니다. 데이터를 제대로 이해하지 못한 채 바로 분석에 들어가면, 잘못된 결론을 내리거나 중요한 패턴을 놓칠 수 있습니다.

바로 이럴 때 필요한 것이 EDA(Exploratory Data Analysis, 탐색적 데이터 분석)입니다. 마치 새로운 도시에 도착했을 때 지도를 펼쳐보고 주변을 둘러보듯이, EDA는 데이터의 전체 지형을 파악하고 숨겨진 보물을 찾아내는 과정입니다.

개요

간단히 말해서, EDA는 데이터를 본격적으로 분석하기 전에 데이터의 특성과 패턴을 탐색하는 과정입니다. 여러분이 새로운 프로젝트를 시작할 때 가장 먼저 해야 할 일이 바로 이 EDA입니다.

예를 들어, 고객 구매 데이터로 매출 예측 모델을 만들어야 한다면, 먼저 고객들의 구매 패턴, 주요 상품, 계절별 변화 등을 파악해야 합니다. 이런 이해 없이 바로 머신러닝 모델을 만들면 쓸모없는 결과만 얻게 됩니다.

전통적인 방법에서는 데이터를 받으면 바로 가설을 세우고 분석에 들어갔다면, EDA는 먼저 데이터가 무엇을 말하는지 귀 기울여 듣는 과정입니다. EDA의 핵심 특징은 첫째, 데이터의 구조와 품질을 확인하고, 둘째, 변수 간의 관계를 파악하며, 셋째, 시각화를 통해 직관적으로 이해하는 것입니다.

이러한 특징들은 이후 모든 분석의 방향을 결정하기 때문에 매우 중요합니다.

코드 예제

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# 주석: 데이터 불러오기 - 실제 프로젝트의 시작점
df = pd.read_csv('customer_data.csv')

# 주석: 데이터의 첫 모습 확인 - 전체 구조를 미리보기
print(df.head())

# 주석: 기본 정보 출력 - 데이터 타입과 결측치 파악
print(df.info())

# 주석: 기술 통계량 - 숫자 데이터의 평균, 표준편차 등
print(df.describe())

설명

이것이 하는 일: EDA는 마치 탐정이 사건 현장을 조사하듯이, 데이터의 모든 측면을 꼼꼼히 살펴보는 체계적인 과정입니다. 첫 번째로, 우리는 pandas와 같은 라이브러리를 사용해 데이터를 불러오고 첫 인상을 확인합니다.

head() 함수로 처음 5개 행을 보면, 각 컬럼이 어떤 종류의 데이터를 담고 있는지 직관적으로 파악할 수 있습니다. 예를 들어, 날짜 형식이 제대로 되어 있는지, 숫자가 문자로 저장되어 있지는 않은지 등을 확인할 수 있죠.

그 다음으로, info() 함수를 사용하면 전체 데이터의 구조가 한눈에 들어옵니다. 총 몇 개의 행과 열이 있는지, 각 컬럼의 데이터 타입은 무엇인지, 결측치는 얼마나 있는지 등을 파악할 수 있습니다.

이 정보는 데이터 전처리 계획을 세우는 데 핵심적인 역할을 합니다. 마지막으로, describe() 함수는 숫자형 컬럼들의 기술 통계량을 보여줍니다.

평균, 중앙값, 최솟값, 최댓값 등을 통해 데이터의 분포와 범위를 이해할 수 있고, 이상치가 있는지도 대략적으로 파악할 수 있습니다. 여러분이 이 코드를 사용하면 데이터에 대한 첫 인상을 체계적으로 정리할 수 있고, 이후 분석 방향을 명확하게 설정할 수 있습니다.

또한 데이터의 문제점을 조기에 발견하여 시간을 절약할 수 있으며, 팀원들과 데이터에 대해 논의할 때 공통의 이해 기반을 마련할 수 있습니다.

실전 팁

💡 항상 데이터를 불러온 직후 shape 속성으로 행과 열의 개수를 확인하세요. 예상과 다르다면 데이터 로딩에 문제가 있을 수 있습니다.

💡 info() 결과에서 Non-Null Count를 주의깊게 보세요. 전체 행 수와 차이가 크다면 해당 컬럼에 많은 결측치가 있다는 신호입니다.

💡 describe()에서 min과 max 값이 이상하다면(예: 나이가 -5 또는 200) 데이터 품질 문제가 있다는 뜻이니 즉시 확인하세요.

💡 대용량 데이터는 head() 대신 sample()을 사용해 무작위로 몇 개의 행을 확인하면 더 다양한 패턴을 볼 수 있습니다.

💡 주피터 노트북에서 작업할 때는 각 탐색 단계마다 마크다운 셀로 메모를 남기면 나중에 다시 볼 때 이해하기 쉽습니다.


2. 데이터_불러오기와_기본_탐색

시작하며

여러분이 새로운 데이터 분석 프로젝트를 시작할 때 이런 경험 있으시죠? CSV 파일을 열었는데 한글이 깨져 있거나, 날짜가 이상한 형식으로 저장되어 있어서 당황했던 순간 말이에요.

이런 문제는 데이터 불러오기 단계에서 올바른 옵션을 설정하지 않아서 발생합니다. 첫 단추를 잘못 끼우면 이후 모든 분석이 틀어질 수 있기 때문에, 데이터를 제대로 불러오는 것은 생각보다 훨씬 중요합니다.

바로 이럴 때 필요한 것이 pandas의 다양한 read 함수와 옵션들입니다. 이들을 제대로 활용하면 대부분의 데이터 로딩 문제를 해결할 수 있습니다.

개요

간단히 말해서, 데이터 불러오기는 외부 파일을 pandas DataFrame으로 변환하는 과정이며, 기본 탐색은 불러온 데이터의 첫인상을 확인하는 과정입니다. 실제 업무에서는 CSV, Excel, JSON, 데이터베이스 등 다양한 형식의 데이터를 다루게 됩니다.

예를 들어, 마케팅 팀에서는 Excel로 캠페인 데이터를 주고, 개발팀에서는 JSON 형식의 API 로그를 제공하며, 데이터베이스에서는 SQL 쿼리 결과를 받게 되죠. 각 형식마다 적절한 함수와 옵션을 알고 있어야 합니다.

기존에는 Excel에서 직접 데이터를 열어 확인했다면, 이제는 pandas를 사용해 프로그래밍 방식으로 데이터를 불러오고 자동화할 수 있습니다. 데이터 불러오기의 핵심은 첫째, 올바른 인코딩 설정(한글 깨짐 방지), 둘째, 적절한 데이터 타입 지정(날짜, 숫자 등), 셋째, 결측치 표현 방식 이해입니다.

이러한 설정들이 제대로 되어야 이후 분석이 정확해집니다.

코드 예제

import pandas as pd

# 주석: CSV 파일 불러오기 - 인코딩 지정으로 한글 깨짐 방지
df = pd.read_csv('sales_data.csv', encoding='utf-8-sig')

# 주석: 날짜 컬럼을 자동으로 날짜 타입으로 변환
df = pd.read_csv('sales_data.csv', parse_dates=['order_date', 'ship_date'])

# 주석: 데이터의 크기 확인 - 행과 열의 개수
print(f"데이터 크기: {df.shape}")

# 주석: 컬럼 이름 확인 - 어떤 변수들이 있는지 파악
print(f"컬럼 목록: {df.columns.tolist()}")

# 주석: 무작위 샘플 확인 - 다양한 데이터 패턴 발견
print(df.sample(10))

# 주석: 각 컬럼의 고유값 개수 확인 - 범주형 변수 파악
print(df.nunique())

설명

이것이 하는 일: 데이터를 불러오고 기본적인 특성을 빠르게 파악하여, 분석을 위한 첫 발판을 마련하는 과정입니다. 첫 번째로, read_csv() 함수에서 encoding 매개변수를 지정합니다.

한국어 데이터의 경우 'utf-8-sig'나 'cp949'를 사용하면 한글이 제대로 표시됩니다. 이 단계에서 인코딩을 잘못 지정하면 모든 텍스트가 깨져서 분석이 불가능해지므로, 여러 옵션을 시도해보며 올바른 인코딩을 찾는 것이 중요합니다.

그 다음으로, parse_dates 매개변수를 사용하면 날짜 형식의 문자열을 자동으로 datetime 객체로 변환합니다. 이렇게 하면 나중에 시계열 분석이나 날짜 계산을 할 때 매우 편리합니다.

예를 들어, 주문일과 배송일 사이의 차이를 계산하거나, 월별/분기별 집계를 쉽게 할 수 있죠. 세 번째로, shape 속성으로 데이터의 전체 크기를 확인하고, columns로 어떤 변수들이 있는지 파악합니다.

이는 데이터의 규모를 이해하고 메모리 사용량을 예측하는 데 도움이 됩니다. 대용량 데이터의 경우 샘플링이나 청크 단위 처리를 고려해야 할 수도 있습니다.

마지막으로, nunique()로 각 컬럼의 고유값 개수를 확인하면, 어떤 컬럼이 범주형 변수인지 파악할 수 있습니다. 예를 들어, 고유값이 10개 미만이면 범주형 변수로 간주하고, 수천 개라면 연속형 변수나 고유 ID일 가능성이 높습니다.

여러분이 이 과정을 체계적으로 수행하면 데이터에 대한 전체적인 그림을 빠르게 그릴 수 있고, 어떤 전처리가 필요한지 파악할 수 있으며, 분석 계획을 구체화할 수 있습니다. 또한 데이터 제공자와 소통할 때 명확한 질문을 할 수 있게 됩니다.

실전 팁

💡 대용량 CSV 파일은 nrows 매개변수로 처음 몇 줄만 읽어서 구조를 파악한 후 전체를 읽으세요. 예: pd.read_csv('large.csv', nrows=1000)

💡 Excel 파일의 특정 시트만 읽으려면 sheet_name 매개변수를 사용하세요. 예: pd.read_excel('data.xlsx', sheet_name='Sheet2')

💡 결측치가 다양한 형식으로 표현되어 있다면(예: 'N/A', 'Missing', '-') na_values 매개변수로 지정하세요.

💡 데이터베이스에서 읽을 때는 chunksize를 사용해 메모리 부담을 줄이세요. 특히 수백만 행 이상의 데이터에서 유용합니다.

💡 컬럼명에 공백이나 특수문자가 있으면 나중에 불편하니 columns 속성으로 미리 정리하세요. 예: df.columns = df.columns.str.strip().str.lower()


3. 데이터_구조_파악하기

시작하며

여러분이 데이터 분석 중에 이런 오류를 본 적 있나요? "TypeError: unsupported operand type(s) for +: 'int' and 'str'" 같은 메시지가 뜨면서 계산이 안 되는 상황 말이에요.

이런 문제는 데이터의 타입을 제대로 파악하지 못해서 발생합니다. 겉으로는 숫자처럼 보이지만 실제로는 문자열로 저장되어 있거나, 날짜 같지만 텍스트로 되어 있는 경우가 매우 흔합니다.

바로 이럴 때 필요한 것이 데이터 구조 파악입니다. 각 컬럼의 데이터 타입, 메모리 사용량, 실제 값의 형태를 정확히 이해해야 올바른 분석이 가능합니다.

개요

간단히 말해서, 데이터 구조 파악은 각 컬럼의 데이터 타입, 메모리 사용량, 실제 저장 형태를 이해하는 과정입니다. 실무에서는 다양한 출처에서 온 데이터를 합치거나 변환할 때 타입 문제로 많은 시간을 허비하게 됩니다.

예를 들어, 엑셀에서 가져온 매출 데이터는 숫자처럼 보이지만 쉼표가 포함되어 문자열로 저장되어 있을 수 있습니다. 이를 모르고 합계를 내려고 하면 오류가 발생하죠.

기존에는 데이터를 보고 눈으로 판단했다면, 이제는 dtypes, info(), memory_usage() 등으로 정확한 정보를 확인할 수 있습니다. 데이터 구조 파악의 핵심은 첫째, 각 컬럼의 실제 데이터 타입 확인, 둘째, 범주형 변수의 category 타입 활용으로 메모리 최적화, 셋째, 타입 변환이 필요한 컬럼 식별입니다.

이러한 작업들이 데이터 전처리의 기초가 됩니다.

코드 예제

import pandas as pd
import numpy as np

# 주석: 데이터 타입 확인 - 각 컬럼이 어떤 타입인지 파악
print(df.dtypes)

# 주석: 상세 정보 확인 - 타입, 결측치, 메모리 사용량 한번에
df.info(memory_usage='deep')

# 주석: 숫자처럼 보이는 문자열을 실제 숫자로 변환
df['price'] = pd.to_numeric(df['price'], errors='coerce')

# 주석: 문자열을 날짜 타입으로 변환
df['date'] = pd.to_datetime(df['date'], format='%Y-%m-%d')

# 주석: 반복되는 범주형 데이터를 category 타입으로 변환 (메모리 절약)
df['category'] = df['category'].astype('category')

# 주석: 메모리 사용량 비교 - 최적화 전후 확인
print(df.memory_usage(deep=True))

설명

이것이 하는 일: 데이터의 내부 구조를 정확히 파악하여 분석 오류를 방지하고, 메모리 효율을 높이는 작업입니다. 첫 번째로, dtypes 속성으로 각 컬럼의 데이터 타입을 확인합니다.

pandas의 주요 타입으로는 int64(정수), float64(실수), object(문자열), datetime64(날짜), category(범주형) 등이 있습니다. 특히 object 타입은 대부분 문자열을 의미하지만, 때로는 숫자가 문자열로 잘못 저장된 경우도 있으므로 주의깊게 확인해야 합니다.

그 다음으로, info() 함수에 memory_usage='deep' 옵션을 추가하면 각 컬럼이 실제로 사용하는 메모리 양을 정확히 알 수 있습니다. 대용량 데이터를 다룰 때는 이 정보가 매우 중요합니다.

예를 들어, 1억 행의 데이터에서 문자열 컬럼 하나를 category 타입으로 바꾸면 메모리를 수 GB 절약할 수 있습니다. 세 번째로, 타입 변환 함수들을 사용합니다.

to_numeric()은 문자열을 숫자로, to_datetime()은 날짜로 변환합니다. 여기서 중요한 것은 errors='coerce' 옵션인데, 이것은 변환할 수 없는 값을 NaN으로 처리하여 오류로 프로그램이 멈추는 것을 방지합니다.

마지막으로, 범주형 데이터를 category 타입으로 변환하면 메모리를 크게 절약할 수 있습니다. 예를 들어, '서울', '부산', '대구' 같은 지역명이 100만 번 반복된다면, 각 문자열을 매번 저장하는 대신 정수 코드로 저장하고 매핑 테이블만 유지하는 방식으로 메모리를 90% 이상 줄일 수 있습니다.

여러분이 이 과정을 거치면 타입 오류로 인한 분석 실패를 예방하고, 대용량 데이터를 더 효율적으로 처리할 수 있으며, 계산 속도도 향상됩니다. 또한 데이터의 논리적 구조를 명확히 이해하게 되어 더 정확한 분석을 수행할 수 있습니다.

실전 팁

💡 숫자 컬럼의 타입이 object라면 숨어있는 비숫자 문자를 찾으세요. df[col].str.contains(r'[^0-9.]')로 확인할 수 있습니다.

💡 날짜 변환 시 format 매개변수를 명시하면 변환 속도가 10배 이상 빨라집니다. 예: pd.to_datetime(df['date'], format='%Y-%m-%d')

💡 고유값이 전체 행의 50% 미만인 문자열 컬럼은 category 타입으로 변환하면 메모리와 속도 모두 개선됩니다.

💡 int64 대신 int32나 int16을 사용하면 메모리를 절반으로 줄일 수 있습니다. 값의 범위를 확인하고 적절한 타입을 선택하세요.

💡 타입 변환 후에는 항상 샘플을 확인하여 예상대로 변환되었는지 검증하세요. 예: df.head(20) 또는 df.sample(10)


4. 기술_통계량_분석

시작하며

여러분이 수천 개의 고객 구매 데이터를 받았을 때 이런 질문을 받은 적 있나요? "평균 구매 금액이 얼마인가요?", "가격 분포는 어떻게 되나요?" 같은 질문에 일일이 엑셀로 계산하느라 시간을 낭비한 경험 말이에요.

이런 문제는 데이터의 기본적인 통계적 특성을 한눈에 파악하지 못해서 발생합니다. 평균만 보고 판단했다가 극단값 때문에 왜곡된 결론을 내리거나, 표준편차를 무시하고 잘못된 예측을 하는 경우가 많습니다.

바로 이럴 때 필요한 것이 기술 통계량 분석입니다. describe() 함수 하나로 평균, 중앙값, 표준편차, 사분위수 등을 한 번에 확인할 수 있습니다.

개요

간단히 말해서, 기술 통계량 분석은 데이터의 중심 경향성, 분산, 분포 형태를 숫자로 요약하여 데이터의 전체적인 특성을 파악하는 과정입니다. 실무에서는 보고서를 작성하거나 데이터 품질을 점검할 때 기술 통계량이 필수적입니다.

예를 들어, 신규 마케팅 캠페인의 효과를 분석할 때 평균 구매액뿐만 아니라 중앙값, 표준편차, 최댓값, 최솟값 등을 종합적으로 봐야 정확한 판단을 할 수 있습니다. 평균은 높지만 중앙값이 낮다면 소수의 고액 구매자가 평균을 끌어올린 것일 수 있죠.

기존에는 엑셀에서 AVERAGE, MEDIAN, STDEV 함수를 각각 써야 했다면, pandas의 describe()는 모든 주요 통계량을 한 번에 계산해줍니다. 기술 통계량 분석의 핵심은 첫째, 중심 경향성(평균, 중앙값, 최빈값), 둘째, 분산 정도(표준편차, 범위, 사분위수), 셋째, 분포의 형태(왜도, 첨도)를 파악하는 것입니다.

이러한 지표들이 데이터의 특성을 다각도로 보여줍니다.

코드 예제

import pandas as pd
import numpy as np

# 주석: 기본 기술 통계량 - 숫자형 컬럼의 주요 통계치 한번에 확인
print(df.describe())

# 주석: 모든 컬럼 포함 (문자열도) - 범주형 변수의 통계도 확인
print(df.describe(include='all'))

# 주석: 중앙값 - 평균보다 이상치에 강건한 중심값
median_price = df['price'].median()

# 주석: 사분위수 - 데이터를 4등분하는 기준점
q1 = df['price'].quantile(0.25)
q3 = df['price'].quantile(0.75)

# 주석: 표준편차 - 데이터가 평균에서 얼마나 흩어져 있는지
std_price = df['price'].std()

# 주석: 왜도와 첨도 - 분포의 비대칭성과 꼬리 두께
print(f"왜도: {df['price'].skew()}, 첨도: {df['price'].kurt()}")

설명

이것이 하는 일: 수천, 수만 개의 데이터 포인트를 몇 개의 핵심 숫자로 압축하여, 데이터의 전체적인 모습을 빠르게 이해하는 작업입니다. 첫 번째로, describe() 함수는 count(개수), mean(평균), std(표준편차), min(최솟값), 25%(1사분위수), 50%(중앙값), 75%(3사분위수), max(최댓값)를 자동으로 계산합니다.

이 8개의 숫자만으로도 데이터의 대략적인 분포를 머릿속에 그릴 수 있습니다. 예를 들어, 평균이 100이고 표준편차가 5라면 대부분의 값이 95~105 사이에 있다는 것을 알 수 있죠.

그 다음으로, 평균과 중앙값을 비교하는 것이 매우 중요합니다. 평균이 중앙값보다 훨씬 크다면 오른쪽으로 긴 꼬리를 가진 분포(양의 왜도)라는 뜻이고, 이는 일부 극단적으로 큰 값들이 존재한다는 신호입니다.

예를 들어, 직원 연봉 데이터에서 평균이 5000만원이지만 중앙값이 3500만원이라면, 소수의 고액 연봉자들이 평균을 끌어올렸다는 것을 알 수 있습니다. 세 번째로, 사분위수를 사용하면 데이터를 4등분하여 분포를 이해할 수 있습니다.

IQR(Inter Quartile Range, Q3-Q1)은 중간 50%의 데이터가 퍼져있는 범위를 나타내며, 이상치를 탐지하는 데도 사용됩니다. 일반적으로 Q1 - 1.5IQR 보다 작거나 Q3 + 1.5IQR 보다 큰 값을 이상치로 간주합니다.

마지막으로, 왜도(skewness)와 첨도(kurtosis)는 분포의 형태를 수치화합니다. 왜도가 0에 가까우면 좌우 대칭, 양수면 오른쪽 꼬리가 긴 분포, 음수면 왼쪽 꼬리가 긴 분포입니다.

첨도가 높으면 극단값이 많다는 의미로, 리스크 분석에서 중요한 지표입니다. 여러분이 이 통계량들을 종합적으로 분석하면 데이터에 대한 깊은 이해를 얻을 수 있고, 이상치나 데이터 품질 문제를 발견할 수 있으며, 어떤 분석 기법이 적합한지 판단할 수 있습니다.

예를 들어, 분포가 심하게 치우쳐 있다면 로그 변환을 고려하거나, 중앙값 기반 분석을 사용할 수 있습니다.

실전 팁

💡 평균과 중앙값의 차이가 크면 이상치가 있거나 분포가 치우쳐 있다는 신호입니다. 반드시 히스토그램으로 확인하세요.

💡 표준편차가 평균보다 크면 데이터가 매우 불안정하다는 뜻입니다. 이런 경우 평균만으로 판단하면 위험합니다.

💡 describe()의 결과를 .T로 전치(transpose)하면 가로로 긴 표를 세로로 바꿔 읽기 편해집니다. df.describe().T

💡 특정 백분위수를 보고 싶다면 quantile()을 사용하세요. 예: df['price'].quantile([0.1, 0.9])로 상위/하위 10% 지점 확인

💡 groupby()와 describe()를 결합하면 그룹별 통계를 한번에 볼 수 있습니다. 예: df.groupby('category')['price'].describe()


5. 결측치_탐색과_처리

시작하며

여러분이 데이터 분석 중에 이런 오류를 만난 적 있나요? 갑자기 계산 결과가 NaN으로 나오거나, 머신러닝 모델이 "Input contains NaN" 오류를 내며 작동을 멈추는 상황 말이에요.

이런 문제는 데이터에 결측치(missing value)가 있는데 이를 제대로 처리하지 않아서 발생합니다. 결측치는 실제 데이터에서 매우 흔하게 나타납니다.

센서 오작동, 설문 미응답, 데이터 수집 실패 등 다양한 이유로 값이 비어있을 수 있죠. 바로 이럴 때 필요한 것이 결측치 탐색과 처리입니다.

결측치가 얼마나 있는지 파악하고, 왜 발생했는지 이해하며, 적절한 방법으로 처리해야 정확한 분석이 가능합니다.

개요

간단히 말해서, 결측치 처리는 데이터에서 비어있는 값을 찾아내고, 그 패턴을 분석한 후, 삭제하거나 적절한 값으로 채우는 과정입니다. 실무에서는 완벽한 데이터를 받는 경우가 거의 없습니다.

예를 들어, 고객 설문조사 데이터에서는 민감한 질문(소득, 나이 등)에 답변하지 않은 경우가 많고, IoT 센서 데이터에서는 통신 장애로 일부 시간대의 데이터가 누락될 수 있습니다. 이런 결측치를 무시하거나 잘못 처리하면 분석 결과가 크게 왜곡됩니다.

기존에는 결측치가 있는 행을 무조건 삭제했다면, 이제는 결측치의 패턴을 분석하고 상황에 맞는 다양한 방법(평균/중앙값 대체, 전방/후방 채우기, 예측 모델 사용 등)을 적용할 수 있습니다. 결측치 처리의 핵심은 첫째, 결측치의 위치와 비율 파악, 둘째, 결측치 발생 패턴 분석(무작위인지 체계적인지), 셋째, 데이터 특성에 맞는 적절한 처리 방법 선택입니다.

잘못된 처리 방법은 오히려 데이터를 망칠 수 있으므로 신중해야 합니다.

코드 예제

import pandas as pd
import numpy as np

# 주석: 결측치 개수 확인 - 각 컬럼별로 몇 개의 결측치가 있는지
print(df.isnull().sum())

# 주석: 결측치 비율 확인 - 전체 대비 몇 %가 비어있는지
print(df.isnull().sum() / len(df) * 100)

# 주석: 결측치 시각화 - 결측치 패턴을 한눈에 파악
import missingno as msno
msno.matrix(df)

# 주석: 결측치가 있는 행만 확인 - 어떤 데이터에 결측이 많은지
print(df[df.isnull().any(axis=1)])

# 주석: 평균으로 채우기 - 숫자형 컬럼의 결측치 처리
df['price'].fillna(df['price'].mean(), inplace=True)

# 주석: 최빈값으로 채우기 - 범주형 컬럼의 결측치 처리
df['category'].fillna(df['category'].mode()[0], inplace=True)

설명

이것이 하는 일: 데이터의 완결성을 확보하고, 결측치로 인한 분석 오류와 편향을 최소화하는 작업입니다. 첫 번째로, isnull()과 sum()을 결합하여 각 컬럼의 결측치 개수를 파악합니다.

이 정보는 어느 변수에 문제가 많은지 우선순위를 정하는 데 도움이 됩니다. 예를 들어, 어떤 컬럼의 80% 이상이 결측치라면 해당 컬럼은 분석에서 제외하는 것이 나을 수 있습니다.

반면 5% 미만의 결측치라면 간단한 대체 방법으로도 충분합니다. 그 다음으로, 결측치의 패턴을 분석하는 것이 매우 중요합니다.

missingno 라이브러리를 사용하면 결측치가 무작위로 분산되어 있는지, 아니면 특정 행이나 시간대에 집중되어 있는지 시각적으로 확인할 수 있습니다. 만약 특정 패턴이 있다면(예: 주말에만 데이터 누락), 이는 시스템적 문제를 나타내므로 데이터 수집 프로세스 자체를 개선해야 할 수 있습니다.

세 번째로, 결측치를 채우는 방법을 선택합니다. fillna() 함수는 다양한 옵션을 제공합니다.

숫자형 데이터의 경우 평균이나 중앙값으로 채우는 것이 일반적이지만, 평균은 이상치에 민감하므로 이상치가 있다면 중앙값이 더 안전합니다. 범주형 데이터는 최빈값(mode)으로 채우거나, 'Unknown'이라는 새로운 카테고리를 만드는 것도 좋은 방법입니다.

마지막으로, 시계열 데이터의 경우 앞이나 뒤의 값으로 채우는 방법(forward fill, backward fill)이 효과적입니다. 예를 들어, 센서 데이터에서 짧은 시간 동안 값이 누락되었다면, 바로 직전의 값을 사용하는 것이 합리적입니다.

또는 더 고급 기법으로 보간(interpolation)을 사용하여 전후 값을 고려한 중간값을 계산할 수도 있습니다. 여러분이 결측치를 체계적으로 처리하면 분석의 정확성이 크게 향상되고, 모델의 성능이 개선되며, 데이터 품질 문제를 조기에 발견할 수 있습니다.

또한 결측치 처리 방법을 문서화하면 분석의 재현성과 투명성이 높아집니다.

실전 팁

💡 결측치를 처리하기 전에 항상 백업을 만드세요. df_clean = df.copy() 로 원본을 보존하면 실수를 되돌릴 수 있습니다.

💡 결측치가 10% 미만이고 무작위로 분포되어 있다면 해당 행을 삭제(dropna())해도 크게 문제없습니다. 하지만 10% 이상이면 정보 손실이 큽니다.

💡 머신러닝 모델에 넣기 전에는 반드시 모든 결측치를 처리해야 합니다. df.isnull().sum().sum()으로 전체 결측치가 0인지 확인하세요.

💡 시계열 데이터에서는 ffill()(forward fill)이나 bfill()(backward fill)을 사용하면 시간적 연속성을 유지할 수 있습니다.

💡 고급 방법으로 KNN이나 회귀 모델로 결측치를 예측하여 채울 수도 있습니다. scikit-learn의 SimpleImputer나 IterativeImputer를 활용하세요.


6. 데이터_분포_시각화

시작하며

여러분이 데이터를 숫자로만 보다가 이런 경험 있으시죠? 평균과 표준편차를 계산했는데 막상 그래프를 그려보니 완전히 다른 모양이 나와서 당황했던 순간 말이에요.

같은 평균과 표준편차를 가진 데이터도 실제 분포는 전혀 다를 수 있습니다. 이런 문제는 숫자만으로는 데이터의 실제 모습을 완전히 파악할 수 없어서 발생합니다.

통계량은 요약 정보만 제공하지만, 시각화는 데이터의 전체 이야기를 보여줍니다. 이상치, 다봉분포, 왜도 등은 그래프로 보면 한눈에 들어오지만 숫자만으로는 놓치기 쉽습니다.

바로 이럴 때 필요한 것이 데이터 분포 시각화입니다. 히스토그램, 박스플롯, 밀도그래프 등을 활용하면 데이터의 실제 모습을 직관적으로 이해할 수 있습니다.

개요

간단히 말해서, 데이터 분포 시각화는 데이터가 어떤 값에 얼마나 많이 분포되어 있는지를 그래프로 표현하여 전체적인 패턴을 파악하는 과정입니다. 실무에서는 의사결정권자에게 데이터를 설명할 때 시각화가 필수적입니다.

예를 들어, "고객 연령 분포가 이중봉(bimodal) 형태를 보입니다"라고 말하는 것보다 히스토그램을 보여주는 것이 훨씬 명확합니다. 20대와 50대에 봉우리가 두 개 있다는 것을 그래프로 보면 즉시 이해되고, 이에 따라 연령대별 마케팅 전략을 다르게 가져가야 한다는 인사이트를 얻을 수 있죠.

기존에는 엑셀에서 간단한 막대 그래프만 그렸다면, 이제는 matplotlib, seaborn을 활용해 전문적이고 정보가 풍부한 시각화를 만들 수 있습니다. 데이터 분포 시각화의 핵심은 첫째, 히스토그램으로 빈도 분포 파악, 둘째, 박스플롯으로 사분위수와 이상치 확인, 셋째, 밀도 그래프로 부드러운 분포 곡선 관찰입니다.

이러한 시각화들이 서로 보완하며 데이터의 다양한 측면을 보여줍니다.

코드 예제

import matplotlib.pyplot as plt
import seaborn as sns

# 주석: 스타일 설정 - 깔끔한 seaborn 스타일 적용
sns.set_style('whitegrid')

# 주석: 히스토그램 - 데이터가 어떤 값에 집중되어 있는지 확인
plt.figure(figsize=(10, 6))
plt.hist(df['price'], bins=30, edgecolor='black', alpha=0.7)
plt.xlabel('가격')
plt.ylabel('빈도')
plt.title('가격 분포')
plt.show()

# 주석: 박스플롯 - 중앙값, 사분위수, 이상치를 한눈에
plt.figure(figsize=(8, 6))
sns.boxplot(y=df['price'])
plt.title('가격 박스플롯')
plt.show()

# 주석: 밀도 그래프 - 부드러운 분포 곡선으로 패턴 파악
plt.figure(figsize=(10, 6))
df['price'].plot(kind='kde')
plt.xlabel('가격')
plt.title('가격 확률 밀도')
plt.show()

설명

이것이 하는 일: 수천 개의 데이터 포인트를 시각적 패턴으로 변환하여, 사람의 뇌가 빠르게 패턴을 인식하고 이해할 수 있게 만드는 작업입니다. 첫 번째로, 히스토그램은 데이터를 여러 구간(bin)으로 나누고 각 구간에 속하는 데이터의 개수를 막대로 표현합니다.

bins 매개변수를 조절하면 구간의 개수를 변경할 수 있는데, 너무 많으면 과도하게 세밀해지고 너무 적으면 패턴이 뭉개집니다. 보통 30~50개가 적당합니다.

히스토그램을 보면 데이터가 정규분포를 따르는지, 치우쳐 있는지, 여러 개의 봉우리가 있는지 즉시 파악할 수 있습니다. 그 다음으로, 박스플롯은 다섯 개의 주요 통계량(최솟값, Q1, 중앙값, Q3, 최댓값)을 하나의 그래프로 표현합니다.

상자의 중간선은 중앙값, 상자의 범위는 IQR(Q3-Q1), 그리고 상자 밖의 점들은 이상치를 나타냅니다. 박스플롯의 강점은 여러 그룹을 나란히 비교할 때 빛을 발합니다.

예를 들어, 지역별 소득을 박스플롯으로 그리면 어느 지역이 소득이 높고, 어느 지역의 소득 격차가 큰지 한눈에 비교할 수 있습니다. 세 번째로, 밀도 그래프(KDE, Kernel Density Estimate)는 히스토그램을 부드럽게 만든 곡선입니다.

히스토그램의 계단 모양이 거슬린다면 밀도 그래프가 더 보기 좋습니다. 또한 여러 분포를 겹쳐서 그릴 때도 밀도 그래프가 히스토그램보다 가독성이 좋습니다.

예를 들어, 남성과 여성의 키 분포를 비교할 때 두 개의 밀도 곡선을 반투명하게 겹치면 차이가 명확히 보입니다. 마지막으로, 이러한 시각화들을 해석할 때 주의할 점이 있습니다.

정규분포(종 모양)라면 대부분의 통계 기법을 안전하게 사용할 수 있지만, 심하게 치우쳐 있거나 다봉분포라면 데이터 변환이나 다른 분석 방법을 고려해야 합니다. 또한 이상치가 많이 보인다면 그 원인을 조사해야 합니다.

단순 오류일 수도 있고, 중요한 특수 케이스일 수도 있기 때문입니다. 여러분이 분포 시각화를 활용하면 데이터의 특성을 직관적으로 이해하고, 적절한 분석 기법을 선택하며, 이해관계자에게 효과적으로 인사이트를 전달할 수 있습니다.

또한 데이터 전처리가 필요한 부분을 빠르게 식별할 수 있습니다.

실전 팁

💡 히스토그램의 bins 개수는 Sturges 공식(k = log2(n) + 1)이나 Rice 공식(k = 2*n^(1/3))을 참고하되, 직접 보면서 조정하세요.

💡 박스플롯에서 이상치가 많이 보인다고 무조건 제거하지 마세요. 실제로 의미있는 극단값일 수 있으니 먼저 조사하세요.

💡 여러 분포를 비교할 때는 sns.violinplot()을 사용하면 박스플롯과 밀도 그래프의 장점을 모두 얻을 수 있습니다.

💡 색상을 의미있게 사용하세요. 예를 들어, 빨간색은 위험이나 높은 값, 파란색은 정상이나 낮은 값을 나타내는 관례가 있습니다.

💡 그래프에 항상 제목, 축 레이블, 범례를 추가하세요. 나중에 보거나 다른 사람이 볼 때 맥락을 이해하는 데 필수적입니다.


7. 상관관계_분석

시작하며

여러분이 매출 데이터를 분석할 때 이런 궁금증을 가진 적 있나요? "광고비를 늘리면 매출이 정말 오를까?", "기온이 높아지면 아이스크림 판매량이 늘어날까?" 같은 질문들 말이에요.

이런 질문들은 모두 두 변수 사이의 관계에 대한 것입니다. 이런 관계를 단순히 추측하거나 몇 개의 사례만 보고 판단하면 잘못된 결론에 이를 수 있습니다.

실제로는 관계가 없는데 우연히 비슷한 패턴을 보이거나, 반대로 강한 관계가 있는데 일부 데이터만 보고 놓치는 경우가 많습니다. 바로 이럴 때 필요한 것이 상관관계 분석입니다.

두 변수 간의 선형 관계를 숫자로 정량화하고 시각화하여, 데이터 기반의 객관적인 판단을 할 수 있습니다.

개요

간단히 말해서, 상관관계 분석은 두 변수가 함께 변하는 패턴을 측정하여, 한 변수가 증가할 때 다른 변수도 증가하는지(양의 상관), 감소하는지(음의 상관), 아니면 관계가 없는지(무상관)를 파악하는 과정입니다. 실무에서는 마케팅 최적화, 리스크 관리, 예측 모델링 등 다양한 영역에서 상관관계 분석을 활용합니다.

예를 들어, 쇼핑몰을 운영한다면 고객 나이, 방문 빈도, 평균 구매액, 할인 쿠폰 사용 여부 등 여러 변수가 있을 텐데, 이 중 어떤 변수들이 서로 관련이 있는지 파악해야 효과적인 전략을 세울 수 있습니다. 만약 방문 빈도와 구매액이 강한 양의 상관관계를 보인다면, 재방문을 유도하는 전략에 집중해야겠죠.

기존에는 두 변수씩 일일이 비교하며 관계를 찾았다면, 이제는 상관계수 행렬과 히트맵으로 모든 변수 쌍의 관계를 한눈에 파악할 수 있습니다. 상관관계 분석의 핵심은 첫째, 피어슨 상관계수로 선형 관계의 강도 측정(-1~1 사이), 둘째, 산점도로 관계의 형태 시각화, 셋째, 히트맵으로 다변량 관계 한눈에 파악하기입니다.

중요한 것은 "상관관계는 인과관계가 아니다"라는 점을 항상 기억해야 합니다.

코드 예제

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 주석: 상관계수 행렬 계산 - 모든 숫자 변수 쌍의 상관계수
corr_matrix = df.corr()
print(corr_matrix)

# 주석: 히트맵으로 시각화 - 색으로 상관관계 강도 표현
plt.figure(figsize=(12, 8))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', center=0,
            fmt='.2f', square=True, linewidths=1)
plt.title('변수 간 상관관계 히트맵')
plt.show()

# 주석: 두 변수 간 산점도 - 관계의 패턴을 직접 확인
plt.figure(figsize=(10, 6))
plt.scatter(df['advertising_cost'], df['sales'], alpha=0.5)
plt.xlabel('광고비')
plt.ylabel('매출')
plt.title('광고비와 매출의 관계')
plt.show()

# 주석: 특정 변수와 가장 상관관계 높은 변수 찾기
print(corr_matrix['sales'].sort_values(ascending=False))

설명

이것이 하는 일: 수많은 변수 중에서 서로 관련이 있는 변수들을 식별하고, 그 관계의 강도와 방향을 정량화하여 데이터 기반 의사결정을 지원하는 작업입니다. 첫 번째로, corr() 함수는 모든 숫자형 컬럼 쌍에 대해 피어슨 상관계수를 계산합니다.

이 값은 -1에서 1 사이이며, 1에 가까우면 강한 양의 상관관계(한 변수가 증가하면 다른 변수도 증가), -1에 가까우면 강한 음의 상관관계(한 변수가 증가하면 다른 변수는 감소), 0에 가까우면 선형 관계가 없음을 의미합니다. 실무에서는 보통 절댓값이 0.7 이상이면 강한 상관관계, 0.3~0.7이면 중간 정도, 0.3 미만이면 약한 상관관계로 해석합니다.

그 다음으로, seaborn의 히트맵은 상관계수 행렬을 색상으로 표현합니다. annot=True 옵션으로 각 셀에 숫자를 표시하고, cmap='coolwarm'으로 양의 상관은 빨간색, 음의 상관은 파란색으로 표현합니다.

변수가 10개만 되어도 45개의 상관계수가 생기는데(10*9/2), 이를 숫자로만 보는 것은 힘들지만 히트맵으로 보면 한눈에 패턴이 들어옵니다. 예를 들어, 대각선은 항상 1(자기 자신과의 상관)이고, 대칭 구조를 가지므로 한쪽만 봐도 됩니다.

세 번째로, 산점도(scatter plot)는 두 변수의 실제 데이터 포인트를 x-y 평면에 점으로 찍은 그래프입니다. 상관계수는 하나의 숫자로 요약하지만, 산점도는 관계의 실제 형태를 보여줍니다.

이것이 중요한 이유는, 상관계수가 0이어도 비선형 관계(예: 포물선 모양)가 있을 수 있고, 이상치 몇 개가 상관계수를 크게 왜곡시킬 수 있기 때문입니다. 따라서 항상 상관계수와 산점도를 함께 봐야 합니다.

마지막으로, 주의할 점은 높은 상관관계가 반드시 인과관계를 의미하지는 않는다는 것입니다. 유명한 예로, 아이스크림 판매량과 익사 사고는 강한 양의 상관관계를 보이지만, 아이스크림이 익사를 일으키는 것은 아닙니다.

둘 다 기온(제3의 변수)에 영향을 받기 때문이죠. 이를 가짜 상관(spurious correlation)이라고 합니다.

따라서 상관관계는 "관계가 있을 수 있다"는 힌트일 뿐, 추가적인 분석과 도메인 지식으로 검증해야 합니다. 여러분이 상관관계 분석을 제대로 수행하면 중요한 변수를 식별하여 모델링에 활용하고, 다중공선성 문제를 발견하여 해결하며, 데이터의 숨겨진 패턴을 발견할 수 있습니다.

또한 비즈니스 가설을 데이터로 검증하는 시작점이 됩니다.

실전 팁

💡 상관계수 행렬에서 대각선 근처를 주의깊게 보세요. 비슷한 변수끼리는 서로 높은 상관관계를 보이는 경향이 있습니다.

💡 머신러닝 모델을 만들 때 상관관계가 0.9 이상인 변수들은 다중공선성 문제를 일으킬 수 있으니 하나만 선택하세요.

💡 범주형 변수와 숫자형 변수의 관계는 피어슨 상관계수 대신 Point-biserial correlation이나 ANOVA를 사용하세요.

💡 비선형 관계를 찾으려면 스피어만 상관계수(method='spearman')나 켄달 상관계수(method='kendall')를 사용하세요.

💡 pairplot()을 사용하면 모든 변수 쌍의 산점도를 한번에 그릴 수 있어 탐색에 매우 유용합니다. sns.pairplot(df)


8. 이상치_탐지

시작하며

여러분이 데이터를 분석하다가 이런 황당한 값을 발견한 적 있나요? 고객 나이가 -5세이거나 200세, 월급이 1억원인 신입사원, 하루 수면 시간이 25시간 같은 명백히 잘못된 데이터 말이에요.

이런 이상치(outlier)는 데이터 입력 오류, 측정 오류, 시스템 버그 등으로 발생하며, 분석 결과를 심각하게 왜곡시킬 수 있습니다. 평균을 계산할 때 극단값 하나가 전체 평균을 크게 변화시키거나, 머신러닝 모델이 이상치에 과적합되어 엉뚱한 패턴을 학습할 수 있죠.

바로 이럴 때 필요한 것이 체계적인 이상치 탐지입니다. 통계적 방법과 시각화를 활용하여 이상치를 찾아내고, 그것이 오류인지 의미있는 극단값인지 판단한 후 적절히 처리해야 합니다.

개요

간단히 말해서, 이상치 탐지는 전체 데이터의 일반적인 패턴에서 벗어난 비정상적인 값을 찾아내고, 그 원인을 파악하여 적절히 처리하는 과정입니다. 실무에서는 이상치가 단순한 오류일 수도 있지만, 때로는 중요한 통찰을 제공하기도 합니다.

예를 들어, 신용카드 이상거래 탐지 시스템에서 이상치는 사기 거래를 의미할 수 있고, 제조 공정에서 이상치는 장비 고장의 전조 증상일 수 있습니다. 따라서 이상치를 무조건 제거하는 것이 아니라, 먼저 이해하고 판단해야 합니다.

기존에는 눈으로 보이는 이상한 값만 찾았다면, 이제는 IQR 방법, Z-score, 박스플롯 등 다양한 통계적 기법으로 체계적으로 이상치를 탐지할 수 있습니다. 이상치 탐지의 핵심은 첫째, 박스플롯과 산점도로 시각적 확인, 둘째, IQR 방법으로 통계적 기준 설정, 셋째, 이상치의 원인 파악 후 처리 방법 결정입니다.

중요한 것은 이상치를 발견했다고 바로 삭제하지 말고, 왜 발생했는지 이해하려는 자세입니다.

코드 예제

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# 주석: 박스플롯으로 이상치 시각적 확인
plt.figure(figsize=(10, 6))
sns.boxplot(x=df['price'])
plt.title('가격 박스플롯 - 이상치 확인')
plt.show()

# 주석: IQR 방법으로 이상치 탐지 - 가장 널리 쓰이는 방법
Q1 = df['price'].quantile(0.25)
Q3 = df['price'].quantile(0.75)
IQR = Q3 - Q1

# 주석: 이상치 범위 계산 - Q1-1.5*IQR 미만 또는 Q3+1.5*IQR 초과
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

# 주석: 이상치 필터링 - 정상 범위 내의 데이터만 선택
outliers = df[(df['price'] < lower_bound) | (df['price'] > upper_bound)]
print(f"이상치 개수: {len(outliers)}")
print(outliers)

# 주석: 이상치 제거한 깨끗한 데이터셋 생성
df_clean = df[(df['price'] >= lower_bound) & (df['price'] <= upper_bound)]

설명

이것이 하는 일: 데이터의 품질을 높이고, 분석 결과의 신뢰성을 확보하기 위해 비정상적인 값들을 체계적으로 식별하고 관리하는 작업입니다. 첫 번째로, 박스플롯을 그리면 이상치가 상자 밖의 점으로 표시됩니다.

이는 가장 직관적인 이상치 확인 방법입니다. 상자는 IQR(Q1~Q3)을 나타내고, 상자에서 뻗어나온 선(whisker)은 정상 범위를 표시하며, 그 밖의 점들이 이상치입니다.

여러 그룹을 비교할 때는 그룹별 박스플롯을 나란히 그리면 어느 그룹에 이상치가 많은지 한눈에 파악할 수 있습니다. 그 다음으로, IQR(Inter Quartile Range) 방법은 가장 널리 사용되는 이상치 탐지 기법입니다.

사분위수를 기반으로 하므로 데이터의 분포에 대한 가정이 필요없고, 극단값에 강건합니다. Q1 - 1.5IQR을 하한선, Q3 + 1.5IQR을 상한선으로 설정하고, 이 범위를 벗어나는 값을 이상치로 간주합니다.

1.5라는 계수는 관례적으로 사용되는 값이지만, 더 엄격하게 하려면 1.0을, 더 관대하게 하려면 3.0을 사용할 수도 있습니다. 세 번째로, 이상치를 발견했다면 무조건 삭제하기 전에 반드시 확인해야 할 것들이 있습니다.

첫째, 명백한 입력 오류인가? (예: 나이 -5세, 수면 25시간).

이 경우는 수정하거나 결측치로 처리합니다. 둘째, 측정 오류나 시스템 오류인가?

원천 데이터를 확인하여 정정합니다. 셋째, 실제로 극단적이지만 의미있는 값인가?

(예: VIP 고객의 1억원 구매). 이 경우는 별도로 분석하거나 로그 변환 등으로 처리합니다.

마지막으로, 이상치 처리 방법은 여러 가지가 있습니다. 삭제(가장 간단하지만 정보 손실), 캡핑(상하한선으로 값을 제한), 변환(로그 변환으로 극단값의 영향 감소), 별도 처리(이상치만 따로 분석), 그대로 유지(모델이 강건하다면) 등입니다.

어떤 방법을 선택할지는 데이터의 특성, 분석 목적, 이상치의 원인에 따라 달라집니다. 여러분이 이상치를 체계적으로 관리하면 분석의 정확성과 신뢰성이 크게 향상되고, 데이터 품질 문제를 조기에 발견하며, 예측 모델의 성능이 개선됩니다.

또한 이상치 분석 과정을 문서화하면 분석의 투명성과 재현성이 높아집니다.

실전 팁

💡 이상치를 제거하기 전에 항상 백업을 만들고, 제거한 개수와 비율을 기록하세요. 나중에 보고할 때 필요합니다.

💡 Z-score 방법(|Z| > 3)은 데이터가 정규분포를 따를 때 효과적입니다. df['z_score'] = np.abs((df['price'] - df['price'].mean()) / df['price'].std())

💡 다변량 이상치는 각 변수가 정상 범위여도 조합이 이상할 수 있습니다. Mahalanobis distance나 Isolation Forest를 사용하세요.

💡 시계열 데이터의 이상치는 rolling window로 국소적 평균과 비교하는 것이 효과적입니다. 갑작스러운 급등락을 감지할 수 있습니다.

💡 로그 변환은 오른쪽 꼬리가 긴 분포의 이상치 영향을 줄이는 효과적인 방법입니다. df['log_price'] = np.log1p(df['price'])


#Python#EDA#Pandas#DataVisualization#DataAnalysis#Data Science

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.