Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Seongho Jang

Ch.13 비계층적 군집분석 본문

Data Science Lv.2

Ch.13 비계층적 군집분석

seonghojang 2023. 1. 1. 18:44

1) 정규화/표준화

from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import StandardScaler

 

 

nor_minmax = MinMaxScaler().fit(df_1.iloc[:,:-1]) 
nor_minmax.transform(df_1.iloc[:,:4])
df_minmax = pd.DataFrame(nor_minmax.transform(df_1.iloc[:,:-1]),
                         columns = df_1.columns[:4])

MinMax Scaler를 사용

fit: 입력 데이터의 형태에 맞춰 데이터를 변환하기 위해 사전 구조를 맞추는 작업

transform: 실제 작업을 수행하는 함수

둘다 뒤에 수행할 데이터셋이 들어간다.

맨 마지막 코드는 array 형태를 dataframe으로 바꾸는 코드 (columns를 사용)

 

2)  KMeans 군집분석

from sklearn.cluster import KMeans
model = KMeans(n_clusters = 3, random_state = 123).fit(df.iloc[:,:-1])

cluster의 개수, seed 설정

model.cluster_centers_
model.labels_

clulster_centers_: 각 군집의 중심점을 보여줌

model.labels_ : 각 데이터가 어떤 군집에 속하는지를 보여줌

df["cluster"] = model.labels_
df.groupby("cluster").mean()

군집분석 결과를 컬럼으로 추가해서 mean을 뽑는 코드

 

 

3) 문제풀이

 

   (1) BMI가 0이 아닌 사람 데이터를 대상으로 k-means 군집 분석을 실시하는 경우 군집 개수가 가장 큰 군집의

        insulin 평균은 얼마인가? (n=4, seed=123)

df_sub = df.loc[df["BMI"] != 0]
model = KMeans(n_clusters = 4, random_state = 123).fit(df_sub)
df_sub["cluster"] = model.labels_
df_sub["cluster"].value_counts()
df_sub.groupby("cluster")["Insulin"].mean()

영상이랑 똑같이 했는데 답이 다르게 나온다. 왜지...?ㅠ

 

   (2) BMI가 0이 아닌 사람 데이터를 대상으로 k-means 군집 분석을 실시하는 경우 군집 개수가 가장 큰 군집의

        나이 평균은 얼마인가? (n=4, seed=123, min-max 정규화 실시)

df = pd.read_csv('diabetes.csv')
df_sub = df.loc[df["BMI"] != 0]

nor_minmax = MinMaxScaler().fit(df_sub)
df_sub_nor = nor_minmax.transform(df_sub)
df_sub_nor = pd.DataFrame(data = nor_minmax.transform(df_sub), columns = df_sub.columns)

model = KMeans(n_clusters = 4, random_state = 123).fit(df_sub_nor)
df_sub["cluster"] = model.labels_

df_sub["cluster"].value_counts()

df_sub.groupby("cluster")["Age"].mean()

   (3) BMI가 0이 아닌 사람 데이터를 대상으로 k-means 군집 분석을 실시하고 군집의 중심점 간 유클리드 거리가 가장

        가까운 그룹간 거리는? (n=3, seed=123)

df_sub = df.loc[df["BMI"] != 0]

model = KMeans(n_clusters=3, random_state = 123).fit(df_sub)
df_centers = pd.DataFrame(data = model.cluster_centers_, columns = df_sub.columns)

df_centers2 = df_centers.transpose()

d1 = (sum((df_centers2.iloc[:,0] - df_centers2.iloc[:,1]))** 2) ** 0.5
d2 = (sum((df_centers2.iloc[:,1] - df_centers2.iloc[:,2]))** 2) ** 0.5
d3 = (sum((df_centers2.iloc[:,2] - df_centers2.iloc[:,3]))** 2) ** 0.5

print(d1)
print(d2)
print(d3)

transpose : 입력 배열의 전치를 반환(x, y를 바꿔서 반환)

 

transpose를 하면 이렇게 x, y가 전치되고,

 

d1 = (sum((df_centers2.iloc[:,0] - df_centers2.iloc[:,1])) ** 2) ** 0.5

위의 유클리드 거리를 구하기 위해서,

각 컬럼값들을 빼주면 이렇게 차이가 나온다.

이걸 제곱한 뒤에 루트를 씌운다.

"거리"라는 용어를 쓰기에 좀 생소한 느낌이긴 하지만... 그냥 단순히 x좌표 차 제곱 + y좌표 차 제곱으로 알아야겠다.

 

 

 

참고

https://nonmeyet.tistory.com/entry/Python-Kmeans-clustering-%EA%B5%AC%ED%98%84

 

[Python] K-means clustering 구현

K-means Clustering에 대한 설명은 위 영상을 참고하면 된다. 간단히 설명하면 K개의 센트로이드를 기준으로 클러스터링을 진행하여 K개의 집단을 만든다는 것이다.Clustering은 비지도 학습중 하나로

nonmeyet.tistory.com

 

'Data Science Lv.2' 카테고리의 다른 글

Ch.6 - 7 데이터 전처리(1): 결측치, 이상치, 파생변수 생성  (0) 2023.01.06
Ch.18 의사결정나무  (0) 2023.01.03
Ch.17 KNN  (0) 2023.01.02
Ch.15 로지스틱 회귀분석  (0) 2023.01.02
Ch.16 나이브 베이즈 분류  (0) 2023.01.02