WIDA/DACON 분류-회귀

[DACON/김경은] 파이썬을 이용한 EDA

경은 2023. 4. 7. 14:34

EDA 진행

 

라이브러리 불러오기

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

데이터 불러오기 

train = pd.read_csv("C:/Users/twink/Documents/카카오톡 받은 파일/train.csv")
test = pd.read_csv("C:/Users/twink/Desktop/test.csv")
sub = pd.read_csv("C:/Users/twink/Desktop/sample_submission.csv")

 

데이터를 불러와서 어떤 형태의 데이터가 있는지 살펴보기

pandas 의 메서드를 통한 간단한 탐색

  • .head() : 상위 5개, 괄호 안에 숫자로 개수 변경 가능
train_data.head()

각 feature 에 대한 통합적인 정보 2가지

  • .info() 
  • .describe()
train.info()

각 feature에 있는 데이터에 몇 개의 null 이 있고, 각 데이터의 type을 확인할 수 있다.

object 는 수치형이 아닌 자료형으로 이해하면 된다. 대부분 string 이다.

이때 object 인 feature 는 대부분의 머신러닝 모델에 직접적인 입력 값으로 사용할 수 없으니 전처리 과정이 필요하다.

 

 

train.describe()

describe 를 사용하여 수치형 데이터의 통계값을 추출할 수 있고 이상치를 확인한다.

  • count : 개수
  • mean : 평균
  • std : 표준 편차
  • min : 최솟값
  • 25% : 제 1사분위값
  • 50% : 중앙값, 중위값
  • 75% : 제 3사분위값
  • max : 최대

 

결측치 확인

train.isna().sum()

  • 결측치가 없는것을  알 수 있다.

 

 

fiberID 시각화

  • fiberID 가 630 쯤이 되면서 부터 그 수가 확연히 줄어드는 것을 확인할 수 있었다. 

 

type 시각화

  • seaborn 사용하기
  • seaborn 은 matplotlib 기반의 시각화 라이브러리로 통계 그래프를 그리기 위한 고급 인터페이스를 제공한다.
#라이브러리 호출
import seaborn as sns
plt.figure(figsize=(10,8))
sns.countplot(y=train['type'], order=train['type'].value_counts().index)
plt.show()

type 컬럼의 값들을 count 하여 막대그래프를 사용하여 내림차순으로 정렬하였다. 

-> QSO 가 다른 클래스에 비해 월등히 높은 수치로 클래스 간의 심한 불균형 클래스를 가졌다.

 

 

데이터 클래스 불균형 해결하기

 

1. weight balancing

 

train 데이터에서 각 loss 를 계산할때 특정 클래스에 대해서는 더큰 loss 를 계산해준다.

더 큰 정확도가 필요한 클래스에는 더 큰 loss를 취해주는것이다. 

 

2. Oversampling and Undersampling

Undersamling 의 경우 파란색 데이터가 주황색 데이터보다 양이 훨씬 많은 상태이다.

현저히 양이 많은 파란색 데이터를 양이 적은 주황색 데이터에 맞춰주는 것이다.

이때, 양을 줄여버린 파란색 데이터들은 양이 많았던 원본 파란색 데이터의 대표성을 잘 지니고 있어야 하는것이 중요하다.

 

Oversamling 의 경우 양이 적은 주황색 데이터를 양이 많은 파란색 데이터에 맞춰주는 방법이다.

주황색 데이터의 양을 늘려줄 때 원본 주황색 데이터를 복사하는 개념이기 때문에 양이 늘어난 주황색 데이터는 양이 적었던 주황색 원본 데이터의 성질과 동일하다. 

 

 

 

이상치 찾기

 

스케일링이나 feature engineering 을 위해 train 데이터셋과 test 데이터셋을 합쳐서 한번에 처리하고 데이터를 다시 나누어 큰 데이터셋으로 보았을때 이상치로 보이지 않는 데이터는 삭제하거나 가하지 않는다. 

따라서 두개의 데이터셋을 합친뒤 결측치,이상치 수정 및 제거를 거치고 다시 데이터 분리해주기

 

  • train 데이터셋과 test 데이터셋 합치기
total = pd.concat([train,test], axis=0)
  • psfMag_u 과 같이 극단값이 존재하는 변수에서 이상치를 찾기위한 box plot
fig, axes = plt.subplots(2, 1, figsize=(10, 7))
columns = total.filter(regex='psf').columns.tolist()[:2]
for i, column in enumerate(columns):
    sns.boxplot(y='type', x=column, data=total, ax=axes.flat[i])
    axes.flat[i].grid(axis='x', linestyle='--')
    axes.flat[i].set_xlim([-20, 50])

fig.tight_layout()
plt.show()

코드출처 : 매우 간단한 SDSS 데이터 시각화 - DACON

 

정확하게 이상치 값이라고 단정지을 수 없지만 데이콘에 있는 train 데이터셋을 활용한 box plot 과 데이터셋을 합친후의 box plot  크게 차이나지 않는것같다.

 

 

 

 

 

 

 

출처

https://eda-ai-lab.tistory.com/13

https://dacon.io/codeshare/4899

https://www.kaggle.com/code/subinium/kakr-eda/notebook

https://techblog-history-younghunjo1.tistory.com/74

https://www.codeit.kr/community/questions/UXVlc3Rpb246NjBlZTc0YzMyOGRjMDY2Y2ZlYWYwZGE0