
스터디 날짜: 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()