
1. EDA란?
EDA는 Exploratory Data Analysis의 줄임말이며, 우리말로는 탐색적 데이터 분석이라고 합니다.
EDA는 본격적으로 모델링을 하기 전에 데이터를 다양한 관점에서 살펴보는 과정입니다.
즉, 데이터를 바로 모델에 넣기 전에 데이터의 구조, 분포, 결측치, 이상치, 변수 간 관계 등을 확인하는 작업입니다.
데이터 분석이나 머신러닝에서는 모델을 만드는 것만큼 데이터 이해가 중요합니다.
데이터를 제대로 이해하지 못한 상태에서 모델을 만들면 성능이 낮거나, 잘못된 결론을 내릴 수 있습니다.
EDA의 핵심은 다음과 같습니다.
데이터가 어떻게 생겼는지 확인합니다.
결측치와 이상치를 찾습니다.
숫자형 변수와 범주형 변수를 구분합니다.
변수의 분포를 확인합니다.
변수 간 관계를 확인합니다.
모델링에 필요한 전처리 방향을 정합니다.
2. EDA를 해야 하는 이유
실제 데이터는 대부분 깔끔하지 않습니다.
CSV나 데이터베이스에서 가져온 데이터에는 다양한 문제가 숨어 있을 수 있습니다.
예를 들면 다음과 같습니다.
값이 비어 있는 결측치가 있을 수 있습니다.
같은 데이터가 중복되어 있을 수 있습니다.
숫자 데이터가 문자열로 저장되어 있을 수 있습니다.
날짜 형식이 제각각일 수 있습니다.
이상하게 큰 값이나 작은 값이 있을 수 있습니다.
카테고리 값이 잘못 입력되어 있을 수 있습니다.
EDA를 하면 이런 문제를 미리 찾을 수 있습니다.
또한 EDA를 통해 다음과 같은 판단을 할 수 있습니다.
어떤 컬럼을 사용할지 판단할 수 있습니다.
어떤 컬럼을 제거할지 판단할 수 있습니다.
결측치를 어떻게 처리할지 결정할 수 있습니다.
이상치를 제거할지 유지할지 결정할 수 있습니다.
변수 변환이나 파생 변수가 필요한지 판단할 수 있습니다.
어떤 모델이 적합할지 감을 잡을 수 있습니다.
따라서 EDA는 데이터 분석과 머신러닝의 출발점이라고 볼 수 있습니다.
3. EDA 전체 흐름
EDA는 정해진 하나의 정답이 있는 과정은 아닙니다.
하지만 일반적으로 다음 순서로 진행하면 좋습니다.
1. 데이터 불러오기
2. 데이터 크기와 구조 확인
3. 컬럼명과 데이터 타입 확인
4. 결측치 확인
5. 중복 데이터 확인
6. 숫자형 변수와 범주형 변수 구분
7. 기초 통계 확인
8. 단변량 분석
9. 이상치 확인
10. 이변량 분석
11. 상관관계 분석
12. 타깃 변수와의 관계 분석
13. 파생 변수 생성
14. 분석 결과 정리
15. 전처리 방향 결정
처음에는 이 순서를 체크리스트처럼 따라가면 됩니다.
4. 실습에 사용할 라이브러리
EDA에서는 보통 pandas, numpy, matplotlib, seaborn을 함께 사용합니다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
각 라이브러리의 역할은 다음과 같습니다.
| 라이브러리 | 역할 |
|---|---|
| pandas | 표 형태 데이터 처리 |
| numpy | 수치 계산 |
| matplotlib | 기본 시각화 |
| seaborn | 통계 시각화 |
한글 그래프를 그릴 경우에는 폰트 설정이 필요할 수 있습니다.
import matplotlib.pyplot as plt
plt.rcParams["font.family"] = "Malgun Gothic"
plt.rcParams["axes.unicode_minus"] = False
윈도우 환경에서는 Malgun Gothic을 많이 사용합니다.
Mac이나 Linux 환경에서는 사용하는 한글 폰트 이름에 맞게 변경해야 합니다.
5. 예제 데이터 불러오기
이번 글에서는 Seaborn에서 제공하는 titanic 예제 데이터셋을 사용하겠습니다.
import seaborn as sns
df = sns.load_dataset("titanic")
데이터가 잘 불러와졌는지 확인합니다.
df.head()
titanic 데이터셋은 타이타닉 탑승객 정보를 담고 있는 데이터입니다.
생존 여부, 좌석 등급, 성별, 나이, 요금 등의 컬럼을 포함합니다.
대표적인 컬럼은 다음과 같습니다.
| 컬럼 | 설명 |
|---|---|
| survived | 생존 여부 |
| pclass | 객실 등급 |
| sex | 성별 |
| age | 나이 |
| sibsp | 함께 탑승한 형제/배우자 수 |
| parch | 함께 탑승한 부모/자녀 수 |
| fare | 요금 |
| embarked | 탑승 항구 |
| class | 객실 등급명 |
| who | 남성/여성/아이 구분 |
| alone | 혼자 탑승 여부 |
6. 데이터 크기 확인하기
먼저 데이터가 몇 행, 몇 열인지 확인합니다.
df.shape
결과 예시는 다음과 같습니다.
(891, 15)
이 결과는 891행 15열이라는 뜻입니다.
EDA를 시작할 때 데이터 크기를 먼저 확인하는 이유는 데이터의 전체 규모를 파악하기 위해서입니다.
print("행 개수:", df.shape[0])
print("열 개수:", df.shape[1])
7. 데이터 미리보기
상위 데이터를 확인합니다.
df.head()
하위 데이터를 확인합니다.
df.tail()
무작위 데이터를 확인할 수도 있습니다.
df.sample(5)
head()만 보면 앞쪽 데이터만 보이기 때문에 전체 데이터의 느낌을 놓칠 수 있습니다.
그래서 sample()을 함께 사용하면 좋습니다.
8. 컬럼명 확인하기
데이터에 어떤 컬럼이 있는지 확인합니다.
df.columns
컬럼명을 리스트로 보고 싶다면 다음과 같이 작성합니다.
list(df.columns)
컬럼명이 너무 길거나 의미가 불명확하면 분석하기 어렵습니다.
필요하다면 컬럼명을 변경할 수 있습니다.
df = df.rename(columns={
"survived": "is_survived",
"pclass": "passenger_class"
})
다만 예제에서는 원래 컬럼명을 그대로 사용하겠습니다.
9. 데이터 타입 확인하기
각 컬럼의 데이터 타입을 확인합니다.
df.dtypes
또는 전체 정보를 한 번에 확인할 수 있습니다.
df.info()
info()를 보면 다음 내용을 확인할 수 있습니다.
전체 행 개수
컬럼 개수
컬럼별 결측치 여부
컬럼별 데이터 타입
메모리 사용량
데이터 타입은 EDA에서 매우 중요합니다.
예를 들어 숫자처럼 보이는 컬럼이 문자열 타입이면 평균이나 분산을 바로 계산할 수 없습니다.
날짜 컬럼이 문자열 타입이면 날짜 계산을 하려면 datetime 타입으로 변환해야 합니다.
10. 숫자형 변수와 범주형 변수 구분하기
EDA에서는 숫자형 변수와 범주형 변수를 구분해서 분석하는 것이 좋습니다.
숫자형 변수는 평균, 분산, 표준편차 같은 통계량을 확인할 수 있습니다.
범주형 변수는 값의 종류와 개수를 확인하는 것이 중요합니다.
numeric_cols = df.select_dtypes(include=["int64", "float64"]).columns
category_cols = df.select_dtypes(include=["object", "category", "bool"]).columns
print("숫자형 컬럼:")
print(numeric_cols)
print("범주형 컬럼:")
print(category_cols)
숫자형 변수 예시는 다음과 같습니다.
survived
pclass
age
sibsp
parch
fare
범주형 변수 예시는 다음과 같습니다.
sex
embarked
class
who
adult_male
deck
embark_town
alive
alone
11. 기초 통계 확인하기
숫자형 변수의 기초 통계를 확인합니다.
df.describe()
describe()는 숫자형 컬럼에 대해 다음 값을 보여줍니다.
| 항목 | 의미 |
|---|---|
| count | 결측치를 제외한 데이터 개수 |
| mean | 평균 |
| std | 표준편차 |
| min | 최솟값 |
| 25% | 1사분위수 |
| 50% | 중앙값 |
| 75% | 3사분위수 |
| max | 최댓값 |
범주형 변수의 기초 통계도 확인할 수 있습니다.
df.describe(include="object")
범주형 변수에서는 다음 값을 확인할 수 있습니다.
| 항목 | 의미 |
|---|---|
| count | 결측치를 제외한 데이터 개수 |
| unique | 고유값 개수 |
| top | 가장 많이 등장한 값 |
| freq | 가장 많이 등장한 값의 빈도 |
전체 타입에 대해 확인하려면 다음과 같이 작성합니다.
df.describe(include="all")
12. 결측치 확인하기
결측치는 값이 비어 있는 데이터를 의미합니다.
pandas에서는 보통 NaN으로 표시됩니다.
컬럼별 결측치 개수를 확인합니다.
df.isnull().sum()
결측치 비율을 확인하면 더 좋습니다.
missing_ratio = df.isnull().mean() * 100
missing_ratio.sort_values(ascending=False)
결측치가 있는 컬럼만 보고 싶다면 다음과 같이 작성합니다.
missing = df.isnull().sum()
missing[missing > 0]
결측치를 시각화할 수도 있습니다.
plt.figure(figsize=(10, 5))
sns.heatmap(df.isnull(), cbar=False)
plt.title("Missing Values")
plt.show()
결측치 처리 방법은 데이터의 성격에 따라 달라집니다.
결측치가 적으면 행을 제거할 수 있습니다.
숫자형 변수는 평균이나 중앙값으로 채울 수 있습니다.
범주형 변수는 최빈값이나 'Unknown'으로 채울 수 있습니다.
결측 자체가 의미 있을 수 있으므로 별도 컬럼으로 표시할 수도 있습니다.
13. 중복 데이터 확인하기
중복 데이터가 있는지 확인합니다.
df.duplicated().sum()
중복 데이터가 있다면 다음과 같이 확인할 수 있습니다.
df[df.duplicated()]
중복을 제거하려면 다음과 같이 작성합니다.
df = df.drop_duplicates()
다만 무조건 제거하면 안 됩니다.
도메인에 따라 같은 값이 여러 번 등장하는 것이 정상일 수도 있기 때문입니다.
14. 단변량 분석이란?
단변량 분석은 변수 하나를 기준으로 데이터를 분석하는 방법입니다.
즉, 각 컬럼이 어떤 분포를 가지고 있는지 확인하는 과정입니다.
단변량 분석은 크게 두 가지로 나눌 수 있습니다.
숫자형 변수 분석
범주형 변수 분석
숫자형 변수는 평균, 중앙값, 표준편차, 분포, 이상치를 확인합니다.
범주형 변수는 값의 종류와 빈도를 확인합니다.
15. 숫자형 변수 분포 확인하기
숫자형 변수의 분포를 확인할 때는 히스토그램을 많이 사용합니다.
sns.histplot(data=df, x="age", bins=30, kde=True)
plt.title("Age Distribution")
plt.show()
위 코드는 나이 분포를 보여줍니다.
kde=True를 설정하면 분포를 부드러운 곡선으로 함께 볼 수 있습니다.
요금 분포도 확인할 수 있습니다.
sns.histplot(data=df, x="fare", bins=30, kde=True)
plt.title("Fare Distribution")
plt.show()
분포를 확인할 때는 다음 내용을 봅니다.
값이 한쪽으로 치우쳐 있는지 확인합니다.
정규분포와 비슷한지 확인합니다.
특정 구간에 값이 몰려 있는지 확인합니다.
이상하게 큰 값이나 작은 값이 있는지 확인합니다.
16. 범주형 변수 분포 확인하기
범주형 변수는 값별 개수를 확인합니다.
df["sex"].value_counts()
시각화는 countplot()을 사용할 수 있습니다.
sns.countplot(data=df, x="sex")
plt.title("Count by Sex")
plt.show()
객실 등급별 개수도 확인할 수 있습니다.
sns.countplot(data=df, x="class")
plt.title("Count by Class")
plt.show()
범주형 변수에서는 다음 내용을 확인합니다.
어떤 값이 있는지 확인합니다.
각 값이 몇 개씩 있는지 확인합니다.
특정 값에 데이터가 지나치게 몰려 있는지 확인합니다.
오타나 잘못된 카테고리가 있는지 확인합니다.
17. 이상치 확인하기
이상치는 일반적인 범위에서 크게 벗어난 값을 의미합니다.
이상치를 확인할 때는 박스플롯을 많이 사용합니다.
sns.boxplot(data=df, x="age")
plt.title("Age Boxplot")
plt.show()
요금 컬럼도 확인해보겠습니다.
sns.boxplot(data=df, x="fare")
plt.title("Fare Boxplot")
plt.show()
박스플롯에서 상자 밖의 점들은 이상치 후보입니다.
이상치를 수치적으로 확인할 때는 IQR 방식을 사용할 수 있습니다.
Q1 = df["fare"].quantile(0.25)
Q3 = df["fare"].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
outliers = df[(df["fare"] < lower_bound) | (df["fare"] > upper_bound)]
print("이상치 개수:", len(outliers))
print("하한값:", lower_bound)
print("상한값:", upper_bound)
다만 이상치를 무조건 제거하면 안 됩니다.
실제로 중요한 의미를 가진 값일 수 있기 때문입니다.
예를 들어 요금이 매우 높은 승객은 1등석 승객일 수 있습니다.
이런 값은 오류가 아니라 중요한 정보일 수 있습니다.
18. 이변량 분석이란?
이변량 분석은 두 변수 사이의 관계를 확인하는 과정입니다.
분석할 수 있는 조합은 다음과 같습니다.
숫자형 변수 vs 숫자형 변수
범주형 변수 vs 숫자형 변수
범주형 변수 vs 범주형 변수
각 조합마다 사용하는 방법이 조금씩 다릅니다.
19. 숫자형 변수와 숫자형 변수 관계
숫자형 변수끼리의 관계는 산점도를 사용해서 확인할 수 있습니다.
sns.scatterplot(data=df, x="age", y="fare")
plt.title("Age and Fare")
plt.show()
산점도를 보면 두 변수 사이에 어떤 패턴이 있는지 확인할 수 있습니다.
x가 증가할 때 y도 증가하는지 확인합니다.
x가 증가할 때 y가 감소하는지 확인합니다.
특정 구간에 데이터가 몰려 있는지 확인합니다.
이상치가 있는지 확인합니다.
20. 범주형 변수와 숫자형 변수 관계
범주형 변수에 따라 숫자형 값이 어떻게 달라지는지 확인할 때는 박스플롯이나 막대 그래프를 사용할 수 있습니다.
성별에 따른 요금 분포를 확인해보겠습니다.
sns.boxplot(data=df, x="sex", y="fare")
plt.title("Fare by Sex")
plt.show()
객실 등급에 따른 요금 분포도 확인할 수 있습니다.
sns.boxplot(data=df, x="class", y="fare")
plt.title("Fare by Class")
plt.show()
평균값을 비교하고 싶다면 barplot()을 사용할 수 있습니다.
sns.barplot(data=df, x="class", y="fare")
plt.title("Average Fare by Class")
plt.show()
주의할 점은 Seaborn의 barplot()은 기본적으로 합계가 아니라 평균을 보여준다는 것입니다.
21. 범주형 변수와 범주형 변수 관계
범주형 변수끼리의 관계는 교차표를 사용해서 확인할 수 있습니다.
pd.crosstab(df["sex"], df["survived"])
비율로 확인하려면 다음과 같이 작성합니다.
pd.crosstab(df["sex"], df["survived"], normalize="index")
시각화는 countplot()에 hue를 사용할 수 있습니다.
sns.countplot(data=df, x="sex", hue="survived")
plt.title("Survival Count by Sex")
plt.show()
객실 등급별 생존 여부도 확인할 수 있습니다.
sns.countplot(data=df, x="class", hue="survived")
plt.title("Survival Count by Class")
plt.show()
이런 분석을 통해 어떤 범주가 타깃 변수와 관련이 있는지 확인할 수 있습니다.
22. 상관관계 분석하기
상관관계는 두 숫자형 변수 사이의 관계를 수치로 나타낸 것입니다.
상관계수는 보통 -1에서 1 사이의 값을 가집니다.
1에 가까움 : 강한 양의 상관관계
0에 가까움 : 상관관계가 약함
-1에 가까움 : 강한 음의 상관관계
숫자형 컬럼만 선택해서 상관관계를 계산합니다.
corr = df.corr(numeric_only=True)
corr
히트맵으로 시각화하면 더 쉽게 볼 수 있습니다.
plt.figure(figsize=(8, 6))
sns.heatmap(corr, annot=True, cmap="coolwarm", fmt=".2f")
plt.title("Correlation Heatmap")
plt.show()
상관관계를 볼 때는 다음을 주의해야 합니다.
상관관계가 높다고 해서 반드시 인과관계가 있는 것은 아닙니다.
상관관계는 주로 선형 관계를 보여줍니다.
이상치가 상관계수에 큰 영향을 줄 수 있습니다.
범주형 변수는 별도 인코딩 없이는 상관계산에 포함되지 않습니다.
23. 타깃 변수 분석하기
머신러닝을 위한 EDA라면 타깃 변수를 반드시 분석해야 합니다.
titanic 데이터에서는 survived가 타깃 변수입니다.
먼저 생존 여부 비율을 확인합니다.
df["survived"].value_counts()
비율로 확인합니다.
df["survived"].value_counts(normalize=True)
시각화합니다.
sns.countplot(data=df, x="survived")
plt.title("Survival Count")
plt.show()
타깃 변수의 분포를 확인하는 이유는 데이터 불균형 여부를 보기 위해서입니다.
예를 들어 한쪽 클래스가 너무 많고 다른 클래스가 너무 적으면 모델이 다수 클래스만 잘 맞히는 문제가 생길 수 있습니다.
24. 타깃 변수와 입력 변수 관계 확인하기
성별에 따른 생존율을 확인해보겠습니다.
df.groupby("sex")["survived"].mean()
시각화는 다음과 같이 할 수 있습니다.
sns.barplot(data=df, x="sex", y="survived")
plt.title("Survival Rate by Sex")
plt.show()
객실 등급별 생존율도 확인합니다.
df.groupby("class")["survived"].mean()
sns.barplot(data=df, x="class", y="survived")
plt.title("Survival Rate by Class")
plt.show()
나이와 생존 여부의 관계는 박스플롯으로 볼 수 있습니다.
sns.boxplot(data=df, x="survived", y="age")
plt.title("Age by Survival")
plt.show()
이런 분석을 통해 어떤 변수가 예측에 중요할 가능성이 있는지 감을 잡을 수 있습니다.
25. 파생 변수 만들기
EDA를 하다 보면 기존 컬럼을 조합해서 새로운 변수를 만들 수 있습니다.
이런 변수를 파생 변수라고 합니다.
예를 들어 함께 탑승한 가족 수를 만들 수 있습니다.
df["family_size"] = df["sibsp"] + df["parch"] + 1
가족 수와 생존율의 관계를 확인합니다.
df.groupby("family_size")["survived"].mean()
시각화합니다.
sns.barplot(data=df, x="family_size", y="survived")
plt.title("Survival Rate by Family Size")
plt.show()
나이를 구간으로 나누는 파생 변수도 만들 수 있습니다.
df["age_group"] = pd.cut(
df["age"],
bins=[0, 12, 18, 35, 60, 100],
labels=["Child", "Teen", "Young Adult", "Adult", "Senior"]
)
나이 그룹별 생존율을 확인합니다.
sns.barplot(data=df, x="age_group", y="survived")
plt.title("Survival Rate by Age Group")
plt.xticks(rotation=30)
plt.show()
파생 변수는 모델 성능을 높이는 데 도움이 될 수 있습니다.
다만 너무 많은 파생 변수를 만들면 오히려 모델이 복잡해질 수 있으므로 주의해야 합니다.
26. EDA 결과 정리하기
EDA는 그래프를 많이 그리는 것에서 끝나면 안 됩니다.
마지막에는 분석 결과를 정리해야 합니다.
예시는 다음과 같습니다.
age 컬럼에는 결측치가 존재합니다.
deck 컬럼은 결측치가 많아 제거를 고려할 수 있습니다.
fare 컬럼은 오른쪽으로 치우친 분포를 보입니다.
fare 컬럼에는 매우 큰 값이 존재하지만 1등석 요금일 가능성이 있습니다.
성별에 따라 생존율 차이가 큽니다.
객실 등급이 높을수록 생존율이 높게 나타납니다.
family_size 파생 변수가 생존율과 관련이 있을 가능성이 있습니다.
이렇게 정리하면 다음 단계인 전처리와 모델링 방향을 잡기 쉬워집니다.
27. EDA 후 전처리 방향 정하기
EDA 결과를 바탕으로 전처리 계획을 세웁니다.
예시는 다음과 같습니다.
age 결측치는 중앙값으로 대체합니다.
embarked 결측치는 최빈값으로 대체합니다.
deck 컬럼은 결측치가 너무 많으므로 제거를 고려합니다.
fare는 분포가 치우쳐 있으므로 로그 변환을 고려합니다.
sex, embarked, class 같은 범주형 변수는 인코딩합니다.
family_size, age_group 같은 파생 변수를 추가합니다.
중복 데이터가 있다면 제거 여부를 검토합니다.
EDA는 단순한 시각화 작업이 아니라 전처리와 모델링 전략을 세우기 위한 과정입니다.
28. EDA 체크리스트
EDA를 할 때 아래 체크리스트를 참고하면 좋습니다.
데이터 크기를 확인했는가?
컬럼명을 확인했는가?
데이터 타입을 확인했는가?
숫자형 변수와 범주형 변수를 구분했는가?
결측치 개수와 비율을 확인했는가?
중복 데이터를 확인했는가?
기초 통계량을 확인했는가?
숫자형 변수의 분포를 확인했는가?
범주형 변수의 빈도를 확인했는가?
이상치를 확인했는가?
변수 간 관계를 확인했는가?
상관관계를 확인했는가?
타깃 변수의 분포를 확인했는가?
타깃 변수와 입력 변수의 관계를 확인했는가?
필요한 파생 변수를 검토했는가?
전처리 방향을 정리했는가?
29. EDA에서 자주 사용하는 pandas 함수
| 함수 | 설명 |
|---|---|
df.head() |
상위 데이터 확인 |
df.tail() |
하위 데이터 확인 |
df.sample() |
무작위 데이터 확인 |
df.shape |
행과 열 개수 확인 |
df.columns |
컬럼명 확인 |
df.info() |
데이터 구조 확인 |
df.dtypes |
데이터 타입 확인 |
df.describe() |
기초 통계 확인 |
df.isnull().sum() |
결측치 개수 확인 |
df.duplicated().sum() |
중복 개수 확인 |
df.value_counts() |
값별 개수 확인 |
df.groupby() |
그룹별 집계 |
df.corr() |
상관관계 확인 |
pd.crosstab() |
교차표 생성 |
pd.cut() |
구간형 변수 생성 |
30. EDA에서 자주 사용하는 시각화 함수
| 함수 | 설명 |
|---|---|
sns.histplot() |
숫자형 변수 분포 확인 |
sns.kdeplot() |
분포를 곡선으로 확인 |
sns.boxplot() |
이상치와 분포 확인 |
sns.countplot() |
범주형 변수 개수 확인 |
sns.barplot() |
그룹별 평균 비교 |
sns.scatterplot() |
두 숫자형 변수 관계 확인 |
sns.heatmap() |
상관관계 시각화 |
sns.pairplot() |
여러 변수 간 관계 확인 |
plt.title() |
그래프 제목 설정 |
plt.xlabel() |
x축 이름 설정 |
plt.ylabel() |
y축 이름 설정 |
plt.show() |
그래프 출력 |
31. EDA 기본 템플릿 코드
아래 코드는 EDA를 시작할 때 기본 템플릿으로 사용할 수 있습니다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 데이터 불러오기
df = sns.load_dataset("titanic")
# 데이터 기본 확인
print(df.shape)
print(df.head())
print(df.info())
print(df.describe())
# 결측치 확인
missing = df.isnull().sum()
print(missing[missing > 0])
# 중복 확인
print("중복 개수:", df.duplicated().sum())
# 숫자형 / 범주형 컬럼 구분
numeric_cols = df.select_dtypes(include=["int64", "float64"]).columns
category_cols = df.select_dtypes(include=["object", "category", "bool"]).columns
print("숫자형 컬럼:", numeric_cols)
print("범주형 컬럼:", category_cols)
# 숫자형 변수 분포 확인
for col in numeric_cols:
plt.figure(figsize=(6, 4))
sns.histplot(data=df, x=col, kde=True)
plt.title(f"{col} Distribution")
plt.show()
# 범주형 변수 분포 확인
for col in category_cols:
plt.figure(figsize=(6, 4))
sns.countplot(data=df, x=col)
plt.title(f"{col} Count")
plt.xticks(rotation=30)
plt.show()
# 상관관계 확인
corr = df.corr(numeric_only=True)
plt.figure(figsize=(8, 6))
sns.heatmap(corr, annot=True, cmap="coolwarm", fmt=".2f")
plt.title("Correlation Heatmap")
plt.show()
이 템플릿을 바탕으로 데이터에 맞게 분석을 확장하면 됩니다.