WIDA/DACON 분류-회귀

[DACON/김민혜] 파이썬을 이용한 EDA

알 수 없는 사용자 2023. 4. 7. 01:25

글을 작성하기에 앞서... 사실 EDA를 이렇게 진행하는 것이 맞는지 확실하지는 않으나 최대한 열심히 공부해보았습니다.. 하하

 

EDA(Exploratory Data Analysis, 탐색적 데이터 분석)

참고: https://jalynne-kim.medium.com/데이터분석-기초-eda의-개념과-데이터분석-잘-하는-법-a3cac2cc5ebc


개념

벨연구소의 수학자 ‘존 튜키’가 개발한 데이터분석 과정에 대한 개념으로, 데이터를 분석하고 결과를 내는 과정에 있어서 지속적으로 해당 데이터에 대한 ‘탐색과 이해’를 기본으로 가져야 한다는 것을 의미

처음에 로우데이터(raw data)를 접할 때부터 데이터를 잘 이해하고 파악한 다음, 어떤 결과를 만들어낼 지 ‘이 feature(column)로 필터해보고, 저 feature로 해보고..’ 이렇게 데이터를 여러 측면으로 쪼개고, 출력해보면서 인사이트를 얻어내는 것. 그것이 EDA적 데이터분석

How?

1. raw data 의 description, dictionary 를 통해 데이터의 각 column들과 row의 의미를 이해

데이터분석 연습 시에 많이 사용되는 사이트에서 데이터의 각 칼럼과 로우(row)에 대한 설명이 잘 나와있다고 함.

2. 결측치 처리 및 데이터필터링 기술

데이터 분석을 본격적으로 들어가기 전, 반드시 데이터에 결측치가 없는지 확인하고, 있다면 제거해줘야 함.

분석 시 필요한 데이터가 수치형 데이터(numerical data)인데 범주형(categorical data)으로 되어 있다면 (데이터 타입이 ‘object’로 뜸) 수치형으로 변환(ex. astype 활용)해줘야 함.

3. 누구나 이해하기 쉬운 시각화를 하는 기술

데이터 분석을 통해 말하고자 하는 바를 제대로 전달할 수 있는 기술이 데이터분석가로서 가장 잘 갖춰야 하는 기술

시각화

아래와 같은 코드로 train.csv 데이터셋을 시각화 시켜보았다.

from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import BaggingClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import pandas as pd
import warnings
warnings.filterwarnings('ignore')

# Random Forest 모델 가져오기
rf_clf = RandomForestClassifier()
bag_clf = BaggingClassifier(rf_clf)

# training dataset 불러오기
train_data = pd.read_csv("drive/MyDrive/Colab Notebooks/train.csv")

# 맞춰야 하는 것은 type이기 때문에 type과 나머지 데이터들을 분리해줌 (슬라이싱)
X = train_data.iloc[:, 2:]
y = train_data.iloc[:, 1] #type 열

# training dataset과 test dataset으로 쪼개기
# training과 test의 비율은 0.3 [7:3으로 쪼갠다]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=11)

# 랜덤 포레스트 학습 및 별도의 테스트 세트로 예측 성능 평가
rf_flf = RandomForestClassifier(criterion='entropy', bootstrap=True, random_state=42, max_depth=5)
rf_clf.fit(X_train, y_train)
pred = rf_clf.predict(X_test)
accuracy = accuracy_score(y_test, pred)
print('랜덤 포레스트 정확도: {0:.4f}'.format(accuracy))

# 막대그래프 시각화
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

ftr_importances_values = rf_clf.feature_importances_
ftr_importances = pd.Series(ftr_importances_values, index=X_train.columns)
ftr_top20 = ftr_importances.sort_values(ascending=False)[:20]

plt.figure(figsize=(8,6))
plt.title('Feature importances Top 20')
sns.barplot(x=ftr_top20, y=ftr_top20.index)
plt.show()

 

DACON 천체 유형 분류 모델


데이터 특성

블로그 참고→ 🔗LINK : RandomForest 사용

import pandas as pd
from sklearn.ensemble import RandomForestClassifier
  • pd라는 이름으로 pandas 라이브러리를 임포트한다.
  • 사이킷런에서 제공하는 앙상블 모듈에서 랜덤포레스트 분류 모델을 불러온다.
# matplotlib and seaborn for plotting
import matplotlib.pyplot as plt
%matplotlib inline

import seaborn as sns
import matplotlib.patches as patches
  • matplot library에서 함수의 모음(pyplot)을 plt 이름으로 임포트.
  • matplotlib.pypot
    : 명령어 스타일로 동작하는 함수의 모음 
    • 모듈의 각각의 함수를 사용해서 간편하게 그래프를 만들고 변화를 줄 수 있음
      • ex. 그래프 영역을 만들기, 선 표현, 레이블 꾸미기 등
  • seaborn 패키지 추가
  • seaborn
    : Matplotlib을 기반으로 다양한 색상 테마와 통계용 차트 등의 기능을 추가한 시각화 패키지
  • matplot library에서 patches 추가
  • matplotlib.patches
    : 모든 시각화 요소들을 담고 있는 Artist 서브클래스 밑에 속해 있는 표면색과 테두리색을 나타낸다.

data_path = '/Users/hansung.dev/Github/kaggle_Data/천체유형분류-월간데이콘2/'

train = pd.read_csv(data_path + 'data/train.csv', index_col=0)
test = pd.read_csv(data_path + 'data/test.csv', index_col=0)
sample_submission = pd.read_csv(data_path + 'data/sample_submission.csv', index_col=0)
  • 불러올 데이터의 경로를 적어줌.
  • pd.read_csv - pandas library에서 분석할 데이터 자료(train.csv & test.csv & submission.csv)를 읽어 각 변수에 할당. 행 레이블은 0으로 지정.
    • index_col=None : int, str, sequence of int / str, or False, optional, default
    • 데이터프레임에서 행 레이블로 사용하기 위해 쓰임. 또는 문자열 이름이나 column 인덱스로 주어짐.

EDA

print('Size of train data', train.shape)
print('Size of test data', test.shape)

#출력결과
Size of train data (199991, 22)
Size of test data (10009, 21)
  • train.shape을 통해 train.csv, tst.csv를 다중인덱싱 한 자료의 shape을 출력 (행 개수, 열 개수)
  • pandas.Dataframe.shape
    : Return a tuple representing the dimensionality of the DataFrame. 데이터프레임의 차원을 나타내는 튜플 값을 알려줌.
train.info()

#출력결과

<class 'pandas.core.frame.DataFrame'>
Int64Index: 199991 entries, 0 to 199990  #인덱스 번호는 0~9까지 (#부분)
Data columns (total 22 columns):         #데이터 열은 총 22개
 #   Column      Non-Null Count   Dtype  
---  ------      --------------   -----  
 0   type        199991 non-null  object 
 1   fiberID     199991 non-null  int64  
 2   psfMag_u    199991 non-null  float64
 3   psfMag_g    199991 non-null  float64
 4   psfMag_r    199991 non-null  float64
 5   psfMag_i    199991 non-null  float64
 6   psfMag_z    199991 non-null  float64
 7   fiberMag_u  199991 non-null  float64
 8   fiberMag_g  199991 non-null  float64
 9   fiberMag_r  199991 non-null  float64
 10  fiberMag_i  199991 non-null  float64
 11  fiberMag_z  199991 non-null  float64
 12  petroMag_u  199991 non-null  float64
 13  petroMag_g  199991 non-null  float64
 14  petroMag_r  199991 non-null  float64
 15  petroMag_i  199991 non-null  float64
 16  petroMag_z  199991 non-null  float64
 17  modelMag_u  199991 non-null  float64
 18  modelMag_g  199991 non-null  float64
 19  modelMag_r  199991 non-null  float64
 20  modelMag_i  199991 non-null  float64
 21  modelMag_z  199991 non-null  float64
dtypes: float64(20), int64(1), object(1)  #데이터 타입은 float64, int64, object
memory usage: 35.1+ MB

train.describe()
#실행결과 (그림) 8 rows × 21 columns

train_desc_df = train.describe()
train_desc_df

train.head()
#실행결과(그림) 5 rows × 22 columns
  • Dataframe.describe()
    : Generate descriptive statistics. 묘사형 통계를 생성하는 함수 
    • NaN 값을 제외한 데이터 세트 분포의 중심 경향, 분산 및 모양을 요약함.
    • 요약 통계량을 반환한다.
    DataFrame.describe(percentiles=None, include=None, exclude=None)
  • Dataframe.head()
    : Return the first n rows. 첫 번째 n개의 행들을 반환한다.

☝🏻 데이터 타입을 일치시켜야 하지 않을까?

 

 

  • 그 외

Corr

 

# 전체 데이터에 대한 상관관계 HeatMap 시각화
corr = train.corr()
cmap = sns.color_palette("Blues")
f, ax = plt.subplots(figsize=(10, 7))
sns.heatmap(corr, cmap=cmap)

<matplotlib.axes._subplots.AxesSubplot at 0x1a31854390>

 

 

  • Dataframe.corr()
  • : 데이터셋에 대하여 상관관계를 나타냄
  • palette의 색을 파란 계열로 선택함
  • subplots 은 설정을 어떻게 하는지 모르겠다…

 

type

# Log_ID
fig = plt.figure(figsize=(18,9))
plt.subplots_adjust(hspace=.5)

plt.subplot2grid((3,3), (0,0), colspan = 3)
train['type'].value_counts()[:100].plot(kind='bar', alpha=0.7)
plt.title('type Values in the Training Set - train ()')

Text(0.5, 1.0, 'type Values in the Training Set - train ()')

train['type'].value_counts()
QSO                    49680
GALAXY                 37347
SERENDIPITY_BLUE       21760
SPECTROPHOTO_STD       14630
REDDEN_STD             14618
STAR_RED_DWARF         13750
STAR_BHB               13500
SERENDIPITY_FIRST       7132
ROSAT_D                 6580
STAR_CATY_VAR           6506
SERENDIPITY_DISTANT     4654
STAR_CARBON             3257
SERENDIPITY_RED         2562
STAR_WHITE_DWARF        2160
STAR_SUB_DWARF          1154
STAR_BROWN_DWARF         500
SKY                      127
SERENDIPITY_MANUAL        61
STAR_PN                   13
Name: type, dtype: int64
  • 특징
    • QSO의 개수가 앞도적으로 많다.

 

fiber ID

# Log_ID
fig = plt.figure(figsize=(18,9))
plt.subplots_adjust(hspace=.5)

plt.subplot2grid((3,3), (0,0), colspan = 3)
train['fiberID'].value_counts()[:100].plot(kind='bar', alpha=0.7)
plt.title('fiberID Values in the Training Set - train ()')

Text(0.5, 1.0, 'fiberID Values in the Training Set - train ()')

 

☝🏻 코드를 전반적으로 뜯어보았는데, 문제점이나 해결방안을 분석하는 건 눈에 잘 보이지 않는다.. 다른 분들의 의견을 함께 들어보고 싶다..!