값의 범위를 확인
한다.구간(또는 범주)을 확인
한다.category로 데이터타입을 변경
한다.이상치
를 확인 후 조치 방안을 강구한다(feat. boxplot
).결측치
를 확인 후 조치 방안을 강구한다.df.info() / df.isna().sum()
최빈값(보통 범주형에서) / SimpleImputer / KnnImputer 등
비즈니스 관점에서 특이사항을 도출
한다.추가 분석 대상
이 있을지 고민해본다.cf) CDA & EDA 하기 전에 test 셋을 따로 분리시켜둬야한다.
why?
test셋은 정답지와 같은 것으로, 학습할 때 정답지를 보고 한다는 건 말이 안 되기 때문!
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
titanic = pd.read_csv('titanic_train.csv')
# 확인
titanic.tail(2)
데이터 출처:https://www.kaggle.com/c/titanic
target = 'Survived'
x0 = titanic.drop(target, axis=1)
y0 = titanic[target]
# 필요한 라이브러리 불러오기
from sklearn.model_selection import train_test_split
# 필요한 라이브러리 불러오기
x, x_test, y, y_test = train_test_split(x0, y0, test_size=.1, random_state=2022)
x_train, x_val, y_train, y_val = train_test_split(x, y, test_size=80, random_state=2022)
x_train.info()
x_train.describe()
plt.hist(x_train[['Age']], bins=16, edgecolor='gray')
plt.show()
hist = plt.hist(x_train[['Age']], bins=16, edgecolor='gray')
print('빈도수 : ', hist[0]) # y축 경계값
print('구간값 : ', hist[1]) # x축 경계값
plt.hist(x_train[['Age', 'Fare']], bins=16, edgecolor='gray')
plt.legend(['Age', 'Fare'])
plt.show()
sns.kdeplot(data=x_train, x='Age')
plt.show()
sns.kdeplot(data=x_train, x='Age', hue=y_train)
plt.show()
x_train['Age'].plot(kind = 'kde')
plt.show()
수염 끝(fence, 해당 이미지에서 "Minimum"과 "Maximum") 밖의 값
들을 이상치로 봄.정규분포
에 가깝다면 3 * 바깥을 이상치로 본다.cf) plt.boxplot으로 그릴 경우, 결측치(NaN)이 있으면 그래프가 그려지지 않는다.
결측치를 채운 후 그리면 달라
지기때문에, 결측치를 처리한 후 plt.boxplot으로
그리도록 하자.plt.boxplot(x_train['Age'])
plt.show()
sns.boxplot(data=x_train, y='Age')
plt.show()
x_train['Age'] = x_train['Age'].fillna(x_train['Age'].mean())
x_train.isna().sum()
plt.boxplot(x_train['Age'])
plt.show()
plt.violinplot(x_train['Age'], showmeans=True)
plt.show()
plt.violinplot(x_train['Age'], vert=False, showmeans=True)
plt.show()
예측값과 실제값을 비교
할 때 시각화로 사용할 수 있다.air = pd.read_csv('https://bit.ly/3qmthqZ')
air['Date'] = pd.to_datetime(air['Date']) # 날짜 형식으로 변환
plt.plot('Date', 'Ozone', 'g-', data = air, label = 'Ozone')
plt.plot('Date', 'Temp', 'r-', data = air, label = 'Temp')
plt.xlabel('Date', size=10)
plt.legend()
plt.show()
데이터 출처: https://github.com/DA4BAM/dataset
데이터 이해를 하면서 category로 데이터타입을 변경
한다.
가변수화를 위한 사전작업
x_train['Embarked'] = pd.Categorical(x_train['Embarked'], categories=['S', 'Q', 'C'], ordered=False)
titanic.info()
집계 먼저
해야한다.sns.countplot()
을 사용하면 집계를 알아서 해준다.cnt = x_train['Sex'].value_counts() # 집계
# width : 막대의 폭 지정, barh일 때는 사용불가
plt.bar(cnt.index, cnt.values, color = ['b', 'r'], width=0.7)
plt.show()
x_train['Age'].value_counts()
cnt = x_train['Sex'].value_counts() # 집계
plt.barh(cnt.index, cnt.values)
plt.show()
sns.countplot(x='Pclass', data=x_train, palette = sns.color_palette("pastel"),
order = x_train['Pclass'].value_counts().index)
plt.show()
ax = sns.countplot(x='Pclass', data=x_train, palette = sns.color_palette("pastel"),
order = x_train['Pclass'].value_counts().index)
# countplot에 값 표시
for p in ax.patches:
height = p.get_height()
ax.text(p.get_x() + p.get_width() / 2., height + 30, height, ha = 'center', size = 12)
ax.set_ylim(0, 450)
plt.show()
x와 y를 바꿔
준다.ax = sns.countplot(y='Pclass', data=x_train, palette = sns.color_palette("pastel"),
order = x_train['Pclass'].value_counts().index)
for p in ax.patches:
x, y, width, height = p.get_bbox().bounds
ax.text(width*1.01, y+height/2, int(width), va='center')
ax.set_xlim(0, 450)
plt.show()
그래프를 그리기는 이유는 한 눈에 시각화를 하기 위함인데 pie chart의 경우엔 한 눈에 보기 힘든 경우가 많다.
이로 인한 이유때문에 실무에선 잘 안 쓰인다고 한다. 이런 게 있다는 것만 알고 넘어가도록 하자.
cnt = x_train['Sex'].value_counts() # 집계
plt.pie(cnt.values, labels = cnt.index, autopct = '%.2f%%',
colors = sns.color_palette("pastel"), explode = [0.05, 0.05])
plt.show()