Seongho Jang
Ch.13 비계층적 군집분석 본문
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 |