카테고리 없음

[BDA x 영진닷컴] 3주차 빅분기 실기 스터디 기록

서히! 2025. 11. 24. 23:28

 

스터디 날짜: 11/17(월)~11/21(금)

스터디범위: Part04~Part06, 모의고사 3, 4회 제 1, 2유형 복습

이번주 스터디 하면서 느낀 점: 3유형이 통계라서 너무 힘들었고 기출을 풀수록 개념 이론과 실습이 완전히 달라서 실습 위주로 마지막 주를 준비해야겠다.

 

1. 군집분석을 이용한 문제 해결

  • K-means 알고리즘: 서로 유사한 데이터는 동일 그룹으로, 유사하지 않은 데이터는 다른 그룹으로 분류하는 대표적인 군집분석
    목표: iris 데이터셋으로 K-means 클러스터링을 사용하여 비슷한 붓꽃끼리 그룹화하고 성능을 평가한다.
# 1. 패키지 임포트
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

from sklearn.cluster import KMeans
from sklearn.preprocessing import LabelEncoder



# 2. 데이터 불러오기
df = pd.read_csv("https://raw.githubusercontent.com/YoungjinBD/dataset/main/iris.csv")
df 

# 3. 데이터 살펴보기
# 결측치 존재하는지 확인
df.info() 
# 기술통계 보기 
df.describe()
# 4. 데이터 전처리

# species 컬럼은 문자열으로 레이블인코딩을 통해 정수형으로 변경
import sklearn.preprocessing
print(sklearn.preprocessing.__all__)

from sklearn.preprocessing import LabelEncoder
df['species'] = LabelEncoder().fit_transform(df['species'])
df.head()

# 5. 분석 데이트 셋 준비 - 학습용 데이터 셋과 테스트용 데이터 셋으로 분리 
X = df[['sepal_length', 'sepal_width', 'petal_length', 'petal_width']]
y = df[['species']]

# 6. 데이터 분석 실행
cluster1 = KMeans(n_clusters = 3, n_init = 10, max_iter = 500)
cluster1.fit(X)
print(dir(cluster1))
cluster_center = cluster1.cluster_centers_
pred = cluster1.predict(X)
print(cluster_center)
print(pred)

# 7. 성능평가
inertias = []
# 군집별 오차의 제곱합. 빠르게 줄어드는 변화의시점을 K로 설정. 
# K = 3일때 빠르게 줄어들기 시작한다. 
for k in range(1, 10):
    model = KMeans(n_clusters = k, n_init = 10, max_iter = 500)
    model.fit(X)
    inertias.append(model.inertia_)
    print(k, inertias[k-1])

2. 연관분석을 이용한 문제해결

  • 연관분석은 하나의 거래나 사건에 포함된 항목 간의 관련성을 파악하여 둘 이상의 항목들로 구성된 연관성 규칙을 도출
  • 지지도, 신뢰도, 향상도
  • 최대 7개의 물품이 가능하다. 구매가능 항목은 9개
import numpy as np
import pandas as pd

# apriori, association_rules 모듈 호출
from mlxtend.frequent_patterns import apriori, association_rules

# pandas의 read_csv 함수 통한 csv 데이터 로드
df = pd.read_csv('https://raw.githubusercontent.com/YoungjinBD/dataset/main/retail_dataset.csv', sep=',')

# 장바구니 데이터 고유항목 구분 출력
items = set()
for col in df:
    items.update(df[col].unique())

# 장바구니 목록 값(텍스트)을 수치로 표현-각 항목당 매칭될 경우 1로, 아니면 0으로 표시(one-hot encoding)
itemset = set(items)
encoding = []
for index, row in df.iterrows():
    rowset = set(row)
    labels = {}
    dismatching = list(itemset - rowset)
    matching = list(itemset.intersection(rowset))
    for i in dismatching:
        labels[i] = 0
    for j in matching:
        labels[j] = 1
    encoding.append(labels)
encoding[0]
result = pd.DataFrame(encoding)

result

#첫째 NaN 열항목 삭제
result = result.drop(result.columns[0], axis=1)

result

# apriori 함수 적용
freq_items = apriori(result, min_support=0.2, use_colnames=True)

# association_rules로 규칙 도출(신뢰도 임계치 0.6 기반)
rules = association_rules(freq_items, metric="confidence", min_threshold=0.6)
rules.head()