πŸ’‘ WIDA/DACON λΆ„λ₯˜-νšŒκ·€

[DACON/μ΅œλ‹€μ˜ˆ] νŒŒμ΄μ¬μ„ μ΄μš©ν•œ EDA

λ‹€μ˜ˆλ» 2023. 4. 7. 18:26

EDA

Exploratory Data Analysis : 탐색적 데이터 뢄석

  • μˆ˜μ§‘ν•œ 데이터λ₯Ό λ‹€μ–‘ν•œ κ°λ„μ—μ„œ κ΄€μ°°ν•˜κ³  μ΄ν•΄ν•˜λŠ” κ³Όμ •

ν•„μš”ν•œ 이유

  • λ°μ΄ν„°μ˜ 뢄포 및 값을 κ²€ν†  → 데이터가 ν‘œν˜„ν•˜λŠ” ν˜„μƒμ„ 더 잘 μ΄ν•΄ν•˜κ³  데이터에 λŒ€ν•œ 잠재적인 문제 발견 κ°€λŠ₯
  • 본격적인 뢄석에 λ“€μ–΄κ°€κΈ° μ „, λ°μ΄ν„°μ˜ μˆ˜μ§‘ κ²°μ • κ°€λŠ₯
  • λ‹€μ–‘ν•œ κ°λ„μ—μ„œ μ‚΄νŽ΄λ³΄λŠ” κ³Όμ • → 문제 μ •μ˜ λ‹¨κ³„μ—μ„œ λ°œκ²¬ν•˜μ§€ λͺ»ν•œ λ‹€μ–‘ν•œ νŒ¨ν„΄μ„ λ°œκ²¬ν•˜κ³  이λ₯Ό λ°”νƒ•μœΌλ‘œ 가섀을 μˆ˜μ •ν•  수 있음

κ³Όμ •

  1. λΆ„μ„μ˜ λͺ©μ , λ³€μˆ˜ 확인
  2. κ°œλ³„ λ³€μˆ˜μ˜ μ΄λ¦„μ΄λ‚˜ μ„€λͺ… 확인
  3. 데이터에 λ¬Έμ œκ°€ μžˆλŠ”μ§€ μ „μ²΄μ μœΌλ‘œ μ‚΄νŽ΄λ³΄κΈ°
    • headλ‚˜ tail
    • μ΄μƒμΉ˜, 결츑치 확인 λ“± λ‹€μ–‘ν•œ 탐색
  4. λ°μ΄ν„°μ˜ κ°œλ³„ 속성 κ°’ κ΄€μ°°λ§Œμ•½ 그렇지 μ•Šλ‹€λ©΄, 이유 μ°ΎκΈ°
  5. 각 속성 값이 μ˜ˆμΈ‘ν•œ λ²”μœ„μ™€ 뢄포λ₯Ό κ°–λŠ”μ§€ 확인
  6. 속성 κ°„μ˜ 관계에 μ΄ˆμ μ„ λ§žμΆ”μ–΄, κ°œλ³„ 속성 κ΄€μ°°μ—μ„œ 찾아내지 λͺ»ν–ˆλ˜ νŒ¨ν„΄μ„ 발견 (상관관계, μ‹œκ°ν™” λ“±)

졜적의 Kκ°’ μ°ΎκΈ°

# ν•„μš”ν•œ νŒ¨ν‚€μ§€ import
import pandas as pd
from sklearn.model_selection import cross_val_score, train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

# 데이터 λ‘œλ“œ
train_data = pd.read_csv("C:/Users/allye/Desktop/DSOB/WIDA Dacon/DCSTree/train.csv")

# typeκ³Ό λ‚˜λ¨Έμ§€ 데이터듀을 λΆ„λ¦¬ν•΄μ€Œ
X = train_data.iloc[:, 2:]
y = train_data.iloc[:, 1]

# 데이터셋 λΆ„ν•  (ν•™μŠ΅μš© 데이터와 κ²€μ¦μš© 데이터)
# trainingκ³Ό test의 λΉ„μœ¨μ€ 0.3
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# K-fold Cross Validation을 μ΄μš©ν•˜μ—¬ 졜적의 k 값을 찾음
k_candidates = [1, 3, 5, 7, 9]
cv_scores = []
for k in k_candidates:
    knn = KNeighborsClassifier(n_neighbors=k)
    scores = cross_val_score(knn, X_train, y_train, cv=10, scoring='accuracy')
    cv_scores.append(scores.mean())
best_k = k_candidates[cv_scores.index(max(cv_scores))]
print("Best k value:", best_k)

# 졜적의 k 값을 μ΄μš©ν•˜μ—¬ λͺ¨λΈ 생성, ν•™μŠ΅, 검증
model = KNeighborsClassifier(n_neighbors=best_k)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

K값이 5일 λ•Œ κ°€μž₯ 높은 정확도λ₯Ό 가짐

μ΄μƒμΉ˜ μ°ΎκΈ°

  1. κ°œλ³„ 데이터 κ΄€μ°°λ°μ΄ν„°μ˜ μ•ž, λ’€ or λ¬΄μž‘μœ„λ‘œ ν‘œλ³Έμ„ μΆ”μΆœν•΄μ„œ κ΄€μ°°ν•΄μ•Ό 함.
  2. 단, μ΄μƒμΉ˜λ“€μ€ μž‘μ€ 크기의 ν‘œλ³Έμ— λ‚˜νƒ€λ‚˜μ§€ μ•Šμ„ 수 있음
  3. 눈으둜 μ­‰ ν›‘μ–΄λ³΄λ©΄μ„œ 전체적인 좔세와 νŠΉμ΄μ‚¬ν•­ κ΄€μ°°
train_data.head()
train_data.tail()

train_data.isnull().sum()

  1. 톡계 κ°’ ν™œμš©

μ μ ˆν•œ μš”μ•½ 톡계 μ§€ν‘œ(summary statistics)λ₯Ό μ‚¬μš©

  • λ°μ΄ν„°μ˜ 쀑심 → 평균(mean), 쀑앙값(median), μ΅œλΉˆκ°’(mode)
  • λ°μ΄ν„°μ˜ λΆ„μ‚° → λ²”μœ„(range), λΆ„μ‚°(variance)

톡계 μ§€ν‘œλ₯Ό μ΄μš©ν•  λ•ŒλŠ” λ°μ΄ν„°μ˜ νŠΉμ„±μ— μ£Όμ˜ν•΄μ•Ό 함

  • ν‰κ· μ—λŠ” 집합 λ‚΄ λͺ¨λ“  데이터 값이 반영되기 λ•Œλ¬Έμ—, μ΄μƒμΉ˜κ°€ 이에 영ν–₯을 λ―ΈμΉ¨
  • μ€‘μ•™κ°’μ—λŠ” κ°€μš΄λ° μœ„μΉ˜ν•œ κ°’ ν•˜λ‚˜κ°€ μ‚¬μš©λ˜κΈ° λ•Œλ¬Έμ—, μ΄μƒμΉ˜κ°€ μ‘΄μž¬ν•΄λ„ λŒ€ν‘œμ„±μ΄ μžˆλŠ” κ²°κ³Όλ₯Ό 얻을 수 있음
train_data.describe()

count : null값을 μ œμ™Έν•œ λ°μ΄ν„°μ˜ 총 개수

mean : 평균

std : ν‘œμ€€νŽΈμ°¨

# 쀑앙값
train_data.median()

# λΆ„μ‚°
train_data.var()

  1. μ‹œκ°ν™” ν™œμš©
  2. 일단은 μ‹œκ°μ μœΌλ‘œ ν‘œν˜„μ΄ λ˜μ–΄μžˆλŠ” 것을 보면, 뢄석에 도움이 많이 λ©λ‹ˆλ‹€. μ‹œκ°ν™”λ₯Ό 톡해 주어진 λ°μ΄ν„°μ˜ κ°œλ³„ 속성에 μ–΄λ–€ 톡계 μ§€ν‘œκ°€ μ μ ˆν•œμ§€ κ²°μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ‹œκ°ν™” λ°©λ²•μ—λŠ” ν™•λ₯ λ°€λ„ ν•¨μˆ˜, νžˆμŠ€ν† κ·Έλž¨, 점 ν”Œλ‘―(dotplot), μ›Œλ“œ ν΄λΌμš°λ“œ, μ‹œκ³„μ—΄ 차트, 지도 등이 μžˆμŠ΅λ‹ˆλ‹€.