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

My_oyster_house·2024년 11월 20일

[2유형] 데이터 분석 : 비지도학습 학습 (교재 178p ~ 187p)
[3유형] 통계적 가설 검정 : 통계적 가설 검정 학습 (교재 190p ~ 199p)
[3유형] 통계적 가설 검정 : 통계적 가설 검정 기법 실습 학습 (교재 200p ~ 220p)
과제

비지도학습

01. 군집분석

  • 1) K-means 알고리즘
    • 서로 유사한 데이터는 동일 그룹으로, 유사하지 않은 데이터는 다른 그룹으로 분류
    • K(그룹화 하는 클러스터 개수)
    • means(각 클러스터 중심-centroid과 데이터 들의 평균 거리)
    • 데이터셋에서 K개의 임시 centroids 지정 > 각 데이터 들을 가장 가까운 centroid가 속한 그룹에 할당 > 다시 centroid 업데이트 > centroid가 변하지 않을 때 까지 반복
    • 각 클러스터와 거리 차이의 분산을 최소화 하는 방식으로 동작

붖꽃 데이터 사용해서 K-means 분석하기

  • 라벨이 없다는 가정하에 k-means 알고리즘으로 데이터를 그룹화 시킨다.
  • 사이킥런의 KMeans 패키지 사용
# 패키지 임포트
import numpy as np
import pandas as pd 
import matplotlib.pyplot as plt

from sklearn.cluster import KMeans 

# 데이터 불러오기
df = pd.read_csv("iris.csv")

# 데이터 전처리
## species 컬럼의 데이터는 object > 레이블 인코딩으로 0,1,2 정수형으로 변경
from sklearn.preprocessing import LabelEncoder
df['species'] = LableEncoder().fit_transform(df['species'])

# 분석 데이터셋 준비 (특성만 사용, species 제외)
X = df.drop('species', axis=1)

# K-means 클러스터 객체 생성
cluster1 = KMeans(n_clusters=3, n_init=10, max_iter=500, random_state=42)

# 생성 모델로 데이터 학습
cluster1.fit(X)

# 결과 값을 변수에 저장
cluster_center = cluster1.cluster_centers_ # 각 군집의 중심점 결과 저장
cluster_prediction = cluster1.predict(X) # 각 예측군집 결과 저장
print(pd.DataFrame(cluster_center))
print(cluster_prediction)

# 기존 데이터에 예측된 군집 결과 붙여서 출력해보기
df['cluster'] = cluster_prediction
df

# 적정한 K에 대해 붓꽃 데이터프레임을 넣어 K에 따른 inertia를 비교
# 값(3)이 적합한 변화 시점 임을 알 수 있음
scope = range(1,10)
inertias=[]

for k in scope:
	model = KMeans(n_clusters=k, n_init=10, max_iter=500, random_state=42)
    model.fit(X)
    inertias.append(model.inertia_)
    print(k,inertias[k-1])

inertia : 각 군집별 오차의 제곱의 합 = 군집 내 분산
K가 증가하게 되면 샘플이 할당된 centroid에 근접하므로 inertia가 감소하게 된다.
elbow 기법은 inertia가 빠르게 줄어드는 변화시점을 최적의 K로 설정하는 방법이다.

  • 2) 연관분석
    • 하나의 거래나 사건에 포함된 항목 간의 관련성을 파악하여 둘 이상의 항목들로 구성된 연관성 규칙을 도출한다.
    • 장바구니 분석이라고 알려져 있음
    • 연관성을 비교할 수 있는 평가 척도: 지지도, 신뢰도, 향상도
척도정의 및 예시수식의미
지지도 (Support)- 전체 거래 중에서 특정 항목이나 항목 집합이 등장하는 비율.
- 예시: 전체 거래 수가 1000건이고, 그 중 200건에서 빵과 버터가 함께 구매되면, 지지도는 2001000=0.2\frac{200}{1000} = 0.2. 즉, 20%의 거래에서 두 항목이 함께 등장.
A와 B가 함께 등장한 거래 수전체 거래 수\frac{\text{A와 B가 함께 등장한 거래 수}}{\text{전체 거래 수}}- A와 B를 모두 포함하는 거래 비율.
- 값이 클수록 두 항목 간의 연관도가 높음.
신뢰도 (Confidence)- 항목 A가 있을 때 항목 B가 등장할 확률.
- 예시: 빵을 구매한 300건 중 200건에서 버터도 구매했다면, 신뢰도는 200300=0.67\frac{200}{300} = 0.67. 즉, 빵을 구매한 고객 중 67%가 버터도 구매.
A와 B가 함께 등장한 거래 수A가 등장한 거래 수\frac{\text{A와 B가 함께 등장한 거래 수}}{\text{A가 등장한 거래 수}}- A가 구매되었을 때 B가 함께 구매될 확률.
- 두 항목 간의 관계가 강할수록 값이 큼.
향상도 (Lift)- A와 B가 독립적일 때보다 함께 등장할 확률이 얼마나 향상되었는지를 측정.
- 예시: 신뢰도가 0.67이고 버터의 지도가 0.2라면, 향상도는 0.670.2=3.35\frac{0.67}{0.2} = 3.35. 즉, 빵과 버터는 독립적일 때보다 3.35배 더 자주 함께 구매됨.
Confidence(A→B)Support(B)\frac{\text{Confidence}(A \rightarrow B)}{\text{Support}(B)}- A와 B가 독립적인 관계일 때보다 함께 등장할 확률이 얼마나 향상되었는지.
- 값이 1보다 크면 두 항목은 독립적이지 않음.

장바구니 구매 물품 데이터 셋으로 물품들간의 연관관계를 파악하고 성능 평가하기

  • 데이터셋: 장바구니 분석을 위한 식자재 구매 물품 목록으로 0~6까지 최대 7개 물품 구매가 가능하다
  • Apriori 알고리즘으로 연관분석 적용
import numpy as np
import pandas as pd

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

# 데이터 불러오기
df = pd.read_csv('retail_dataset.csv')

# 장바구니 데이터 고유항목 구분 출력
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 = [0] * len(itemset)
    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

통계적 가설 검정 및 실습

가설 검정의 단계

  1. 귀무가설(H0) 확인
  2. 유의수준 확인
  3. 검정 방향 확인
  4. 검정 통계량 값 계산
  5. 기각역 설정 및 p-value 산출
  6. 가설 검증 수행

1. 표본의 평균 검정

모집단의 분산(표준편차)을 알고 있는 경우: Z-test (양측)

  • 모집단의 분산(표준편차)을 알고 있을 때 Z-검정을 수행하며, 정규분포를 따르는 경우 사용.
  • 예제에서는 평균과 표준편차를 기반으로 검정통계량을 계산하고, 임계값 및 p-value를 산출하여 가설을 검증한다.

모집단의 분산(표준편차)을 모르는 경우: t-test (양측)

  • 모집단의 분산(표준편차)을 모르는 경우 t-검정을 수행하며, 정규분포를 따르는 경우 사용.
  • Scipy의 ttest_1samp 함수를 활용하여 검정 통계량과 p-value를 구한다.
  • 신뢰구간 계산에는 t.interval 함수를 사용한다.

2. 두 독립 표본의 평균 차이 검정

  • 목적: 두 개의 독립적인 그룹의 평균 차이를 비교.
  • 방법:
    • t-test: 정규분포를 따르는 경우.
    • Mann-Whitney U 검정: 정규분포를 따르지 않는 경우.
  • 정규성 검정:
    • Shapiro-Wilk 검정(SciPy의 shapiro)을 통해 데이터의 정규성을 확인.

3. 대응 표본의 평균 차이 검정

  • 동일한 집단의 두 조건(예: 전후 변화)을 비교할 때 사용.
  • Scipy의 ttest_rel 함수를 사용하여 평균 차이를 검정.

4. 단일 표본 모분산 검정

  • 목적: 표본 분산이 특정 값과 동일한지 확인.
  • Chi-제곱 통계량을 계산하고 chi2.cdf를 통해 p-value를 산출.

5. 두 모분산의 비에 대한 가설 검정 (F 검정)

  • 두 표본의 분산 비율을 검정하여 분산이 동일한지 확인.
  • F-분포를 기반으로 검정 통계량과 p-value를 계산한다.

6. 독립성 검정

  • 목적: 두 범주형 변수 간의 독립성 여부 확인.
  • SciPy의 chi2_contingency 함수로 관찰 빈도와 기대 빈도 간 차이를 기반으로 검정 수행.
  • 예제:
    • 타이타닉 데이터셋에서 성별과 생존 여부 간 독립성 검정.
    • 연령대와 생존 여부 간 독립성 검정.
    • 교차표 생성은 pandas.crosstab을 사용.
profile
kwonhs.alice@gmail.com

0개의 댓글