πŸ”” λΉ„μ§€λ„ν•™μŠ΅ πŸ””

parkeuΒ·2022λ…„ 9μ›” 27일
0

ABCλΆ€νŠΈμΊ ν”„

λͺ©λ‘ 보기
32/55

λΉ„μ§€λ„ν•™μŠ΅

  • μ•Œκ³  μžˆλŠ” 좜λ ₯κ°’μ΄λ‚˜ 정보 없이 ν•™μŠ΅ μ•Œκ³ λ¦¬μ¦˜μ„ κ°€λ₯΄μ³μ•Ό ν•˜λŠ” λͺ¨λ“  μ’…λ₯˜μ˜ λ¨Έμ‹ λŸ¬λ‹

  • 비지도 λ³€ν™˜, ꡰ집

  • 비지도 λ³€ν™˜(unsupervised transformation) : 데이터λ₯Ό μƒˆλ‘­κ²Œ ν‘œν˜„ν•˜μ—¬ μ‚¬λžŒμ΄λ‚˜ λ‹€λ₯Έ λ¨Έμ‹ λŸ¬λ‹ μ•Œκ³ λ¦¬μ¦˜μ΄ μ›λž˜ 데이터보닀 μ‰½κ²Œ 해석할 수 μžˆλ„λ‘ λ§Œλ“œλŠ” μ•Œκ³ λ¦¬μ¦˜μž„
    - λ§Žμ€ 고차원 데이터λ₯Ό νŠΉμ„±μ˜ 수λ₯Ό μ€„μΌλ©΄μ„œ κΌ­ ν•„μš”ν•œ νŠΉμ§•μ„ ν¬ν•¨ν•œ 데이터λ₯Ό ν‘œν˜„ν•˜λŠ” 방법인 μ°¨μ›μΆ•μ†Œμ˜ λŒ€ν‘œμ  μ˜ˆλŠ” μ‹œκ°ν™”λ₯Ό μœ„ν•΄ 데이터셋을 2차원 λ³€κ²½ν•˜λŠ”κ²½μš°
    - 비지도 λ³€ν™˜μœΌλ‘œ 데이터λ₯Ό κ΅¬μ„±ν•˜λŠ” λ‹¨μœ„λ‚˜ 성뢄을 검색 : λ§Žμ€ ν…μŠ€νŠΈ λ¬Έμ„œμ—μ„œ 주제λ₯Ό μΆ”μΆœ ( μ†Œμ…œ λ―Έλ””μ–΄μ—μ„œ μ„ κ±°, 총기규제, νŒμŠ€νƒ€ 같은 주제둜 μΌμ–΄λ‚˜λŠ” 토둠을 좔적할 λ•Œ μ‚¬μš©κ°€λŠ₯)

  • ꡰ집(clustering) : 데이터λ₯Ό λΉ„μŠ·ν•œ 것끼리 그룹으둜 λ¬ΆλŠ” μž‘μ—…
    - μ†Œμ„€ λ―Έλ””μ–΄ μ‚¬μ΄νŠΈμ— 사진을 μ—…λ‘œλ“œν•˜λŠ” 경우의 예
    - μ—…λ‘œλ“œν•œ 사진을 λΆ„λ₯˜ν•˜λ €λ©΄ 같은 μ‚¬λžŒμ΄ 찍힌 사진을 같은 그룹으둜 묢을 수 μžˆμœΌλ‚˜ μ‚¬μ΄νŠΈλŠ” 사진에 찍힌 μ‚¬λžŒμ΄ λˆ„κ΅°μ§€, 전체 사진 앨범에 μ–Όλ§ˆλ‚˜ λ§Žμ€ μ‚¬λžŒμ΄ μžˆλŠ”μ§€ μ•Œμ§€ λͺ»ν•¨
    - μ΄λ•Œ κ°€λŠ₯ν•œ 방법은 사진에 λ‚˜νƒ€λ‚œ λͺ¨λ“  얼꡴을 μΆ”μΆœν•΄μ„œ λΉ„μŠ·ν•œ μ–Όκ΅΄λ‘œ κ·Έλ£Ή μ§“λŠ” 것, 이 얼꡴듀이 같은 μ‚¬λžŒμ˜ 얼꡴이라면 이미지듀을 그룹으둜 잘 묢은 κ²°κ³Ό

  • κ°€μž₯ μ–΄λ €μš΄ 일은 μ•Œκ³ λ¦¬μ¦˜μ΄ λ­”κ°€ μœ μš©ν•œ 것을 ν•™μŠ΅ν–ˆλŠ”μ§€ ν‰κ°€ν•˜λŠ” 일

  • 비지도 ν•™μŠ΅μ€ 보톡 λ ˆμ΄λΈ”μ΄ μ—†λŠ” 데이터에 μ μš©ν•˜κΈ° λ•Œλ¬Έμ— 무엇이 μ˜¬λ°”λ₯Έ 좜λ ₯인지 λͺ¨λ¦„
    - 비지도 ν•™μŠ΅μ˜ κ²°κ³Ό 평가λ₯Ό μœ„ν•΄μ„œλŠ” 직접 ν™•μΈν•˜λŠ” 것이 μœ μΌν•œ 방법일 λ•Œκ°€ 많음
    - 데이터 κ³Όν•™μžκ°€ 데이터λ₯Ό 더 잘 μ΄ν•΄ν•˜κ³  싢을 λ•Œ 탐색적 뢄석 λ‹¨κ³„μ—μ„œ 많이 μ‚¬μš©λ¨
    - 지도 ν•™μŠ΅μ˜ μ „μ²˜λ¦¬ λ‹¨κ³„μ—μ„œλ„ μ‚¬μš©λ¨. 비지도 ν•™μŠ΅μ˜ 결과둜 μƒˆλ‘­κ²Œ ν‘œν˜„λœ 데이터λ₯Ό μ‚¬μš©ν•΄ ν•™μŠ΅ν•˜λ©΄ 지도 ν•™μŠ΅μ˜ 정확도가 μ’‹μ•„μ§€κΈ°λ„ν•˜λ©° λ©”λͺ¨λ¦¬μ™€ μ‹œκ°„μ„ μ ˆμ•½ν•  수 있음
    - μ „μ²˜λ¦¬ λ©”μ„œλ“œ : 지도 ν•™μŠ΅ μ•Œκ³ λ¦¬μ¦˜μ—μ„œ μ „μ²˜λ¦¬μ™€ μŠ€μΌ€μΌ 쑰정을 자주 μ‚¬μš©ν•˜μ§€λ§Œ, μŠ€μΌ€μΌ μ‘°μ • λ©”μ„œλ“œλŠ” 지도정보λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ 비지도 방식

ꡰ집

  • 데이터셋을 ν΄λŸ¬μŠ€ν„°λΌλŠ” 그룹으둜 λ‚˜λˆ„λŠ” μž‘μ—…
  • ꡰ집 뢄석은 데이터셋 관츑값이 κ°–κ³  μžˆλŠ” μ—¬λŸ¬ 속성을 λΆ„μ„ν•˜μ—¬ μ„œλ‘œ λΉ„μŠ·ν•œ νŠΉμ§•μ„ κ°–λŠ” 관츑값끼리 같은 ν΄λŸ¬μŠ€ν„°(집단)으둜 λ¬ΆλŠ” μ•Œκ³ λ¦¬μ¦˜
    - λ‹€λ₯Έ ν΄λŸ¬μŠ€ν„° κ°„μ—λŠ” μ„œλ‘œ μ™„μ „ν•˜κ²Œ κ΅¬λΆ„λ˜λŠ” νŠΉμ§•μ„ κ°–κΈ° λ•Œλ¬Έμ— μ–΄λŠ ν΄λŸ¬μŠ€ν„°μ—λ„ μ†ν•˜μ§€ λͺ»ν•˜λŠ” 관츑값이 쑴재 ν•  수 있음
    - 관츑값을 λͺ‡κ°œμ˜ μ§‘λ‹¨μœΌλ‘œ λ‚˜λˆˆλ‹€λŠ” μ μ—μ„œ λΆ„μœ  μ•Œκ³ λ¦¬μ¦˜κ³Ό λΉ„μŠ·ν•˜μ§€λ§Œ 정닡이 μ—†λŠ” μƒνƒœμ—μ„œ 데이터 자체의 μœ μ‚¬μ„±λ§Œμ„ κΈ°μ€€μœΌλ‘œ νŒλ‹¨ν•˜λŠ” 점
    - μ‹ μš©μΉ΄λ“œ λΆ€μ • μ‚¬μš© 탐지, ꡬ미 νŒ¨ν„΄ 뢄석 λ“± μ†ŒλΉ„μž 행동 νŠΉμ„± κ·Έλ£Ήν™”
    - μ–΄λ–€ μ†ŒλΉ„μžμ™€ μœ μ‚¬ν•œ νŠΉμ„±μ„ κ°–λŠ” 집단 ꡬ뢄 -> 갖은 집단 λ‚΄μ˜ λ‹€λ₯Έ μ†ŒλΉ„μžλ₯Ό 톡해 μƒˆλ‘œμš΄ μ†ŒλΉ„μžμ˜ ꡬ맀 νŒ¨ν„΄μ΄λ‚˜ 행동 μ˜ˆμΈ‘μ— ν™œμš©
    - K-Means μ•Œκ³ λ¦¬μ¦˜, DBSCAN μ•Œκ³ λ¦¬μ¦˜

k-평균 ꡰ집

  • κ°€μž₯ κ°„λ‹¨ν•˜κ³  널리 μ‚¬μš©ν•˜λŠ” ꡰ집 μ•Œκ³ λ¦¬μ¦˜
  • λ°μ΄ν„°μ˜ μ–΄λ–€ μ˜μ—­μ„ λŒ€ν‘œν•˜λŠ” ν΄λŸ¬μŠ€ν„° 쀑심 μ°ΎκΈ°

병합 ꡰ집

  • ꡰ집 μ•Œκ³ λ¦¬μ¦˜μ˜ λͺ¨μŒ
  • μ’…λ£Œ μ‘°κ±° λ§Œμ‘±κΉŒμ§€ λΉ„μŠ·ν•œ ν΄λŸ¬μŠ€ν„° ν•©μΉ˜κΈ°

DBSCAN

  • 데이터가 μœ„μΉ˜ν•˜κ³  μžˆλŠ” 곡간 밀집도 κΈ°μ€€μœΌλ‘œ ν΄λŸ¬μŠ€ν„° ꡬ뢄

k-Means(K평균 ꡰ집)

  • λ°μ΄ν„°κ°„μ˜ μœ μ‚¬μ„±μ„ μΈ‘μ •ν•˜λŠ” κΈ°μ€€μœΌλ‘œ 각 ν΄λŸ¬μŠ€ν„°μ˜ μ€‘μ‹¬κΉŒμ§€μ˜ 거리 이용

  • 벑터 곡간에 μœ„μΉ˜ν•œ μ–΄λ–€ 데이터에 λŒ€ν•΄μ„œ k개의 ν΄λŸ¬μŠ€ν„°κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ ν΄λŸ¬μŠ€ν„°μ˜ μ€‘μ‹¬κΉŒμ§€ 거리가 κ°€μž₯ κ°€κΉŒμš΄ ν΄λŸ¬μŠ€ν„°λ‘œ ν•΄λ‹Ή 데이터λ₯Ό ν• λ‹Ή

  • λ‹€λ₯Έ ν΄λŸ¬μŠ€ν„° κ°„μ—λŠ” μ„œλ‘œ μ™„μ „ν•˜κ²Œ κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄ μΌμ •ν•œ 거리 이상 λ–¨μ–΄μ Έμ•Ό 함

  • λͺ‡κ°œμ˜ ν΄λŸ¬μŠ€ν„°λ‘œ 데이터λ₯Ό ꡬ뢄할 것인지 μƒμ„±ν•˜λŠ” k값에 따라 λͺ¨ν˜•μ˜ μ„±λŠ₯ 달라짐

  • 일반적으둜 k값이 클수둝 λͺ¨ν˜•μ˜ 정확도 κ°œμ„  k값이 λ„ˆλ¬΄ 컀지면 선택지가 λ„ˆλ¬΄ λ§Žμ•„μ§€λ―€λ‘œ λΆ„μ„μ˜ νš¨κ³Όκ°€ 사라짐

k-Means 도맀업 고객 ꡰ집 뢄석

🐼 μ€€λΉ„

# 라이브러리 μž„ν¬νŠΈ
import pandas as pd
import matplotlib.pyplot as plt

# 데이터 μ€€λΉ„ν•˜κΈ°
# Wholesale customers 데이터셋 κ°€μ Έμ˜€κΈ°(좜처 : UCI ML Repository)
# https://archive.ics.uci.edu/ml/datasets/wholesale+customers
# clients of a wholesale distributor 각 ν’ˆλͺ©μ— λŒ€ν•œ μ—°κ°„ μ§€μΆœ
uci_path = 'https://archive.ics.uci.edu/ml/machine-learning-databases/\
00292/Wholesale%20customers%20data.csv'
df = pd.read_csv(uci_path, header=0)

데이터 ν™•μΈν•˜κΈ°

1) FRESH: annual spending (m.u.) on fresh products (Continuous);
2) MILK: annual spending (m.u.) on milk products (Continuous);
3) GROCERY: annual spending (m.u.)on grocery products (Continuous);
4) FROZEN: annual spending (m.u.)on frozen products (Continuous)
5) DETERGENTS_PAPER: annual spending (m.u.) on detergents and paper products (Continuous)
6) DELICATESSEN: annual spending (m.u.)on and delicatessen products (Continuous);
7) CHANNEL: customersÒ€ℒ Channel - Horeca (Hotel/Restaurant/Café) or Retail channel (Nominal)
8) REGION: customersÒ€ℒ Region Γ’β‚¬β€œ Lisnon, Oporto or Other (Nominal)

데이터 μ „μ²˜λ¦¬

X = df.iloc[:,:]

# 데이터 μ •κ·œν™” -> μŠ€μΌ€μΌλ§
from sklearn import preprocessing
X = preprocessing.StandardScaler().fit(X).transform(X)

k-Means ꡰ집 λͺ¨λΈ μ„€μ •

from sklearn import cluster 
kmeans = cluster.KMeans(n_clusters=5, random_state=7)

# λͺ¨λΈ ν•™μŠ΅ν•˜κΈ°
kmeans.fit(X)
cluster_label = kmeans.labels_ # 0~4κΉŒμ§€ ꡰ집

# ν΄λŸ¬μŠ€ν„° 데이터 μ‹œκ°ν™”
df['Cluster'] = cluster_label
df

채널과 μ§€μ—­μ˜ 연관관계

# 채널과 μ§€μ—­μ˜ 연관관계 
# 2 Cluster Channel 2 (Retail Channel), Region 1,2,3
# 1 Cluster Channel 1, Region 3
# 0 Cluster Channel 1, Region 1,2
df.plot(kind='scatter',x='Channel', y='Region',c='Cluster',cmap='Set1', figsize=(10,10))

ν’ˆλͺ©λ“€κ°„μ˜ 연관관계 Milk, Fresh

# 2 Cluster Channel 2 (Retail Channel), Region 1,2,3
# 1 Cluster Channel 1, Region 3
# 0 Cluster Channel 1, Region 1,2
df.plot(kind='scatter',x='Milk', y='Fresh',c='Cluster',cmap='Set1', figsize=(10,10))

ν’ˆλͺ©λ“€κ°„μ˜ 연관관계 Frozen, Detergents_Paper

# 2 Cluster Channel 2 (Retail Channel), Region 1,2,3
# 1 Cluster Channel 1, Region 3
# 0 Cluster Channel 1, Region 1,2
df.plot(kind='scatter',x='Frozen', y='Detergents_Paper',c='Cluster',cmap='Set1', figsize=(10,10))

νŠΉμ • ν΄λŸ¬μŠ€ν„°λ§Œ 보기

# 2, 3 ν΄λŸ¬μŠ€ν„°λ§Œ 더 μžμ„Έν•˜κ²Œ 보고싢닀면
mask = (df['Cluster']==2) | (df['Cluster']==3)
ndf = df[mask]
ndf.Cluster.unique()
ndf.plot(kind='scatter',x='Frozen', y='Detergents_Paper',c='Cluster',cmap='Set1', figsize=(10,10))

# 2,3 ν΄λŸ¬μŠ€ν„°λ₯Ό μ œμ™Έν•œ 0,1,4 더 μžμ„Έν•˜κ²Œ 보고싢닀면
mask = (df['Cluster']==2) | (df['Cluster']==3)
ndf = df[~mask]
ndf.Cluster.unique()
ndf.plot(kind='scatter',x='Frozen', y='Detergents_Paper',c='Cluster',cmap='Set1', figsize=(10,10))


산점도 ν–‰λ ¬

# 데이터 ν”„λ ˆμž„μ„ μ‚¬μš©ν•΄ df['Cluster'] λ”°λΌμ„œ μƒ‰μœΌλ‘œ κ΅¬λΆ„λœ 산점도 ν–‰λ ¬
pd.plotting.scatter_matrix(df, c=df['Cluster'], figsize=(20,20), marker='o', hist_kwds={'bins':20}, s=60, alpha=0.8)
plt.tight_layout()

import numpy as np
plt.imshow([np.unique(df['Cluster'])])
plt.show()


βž•


DBSCAN

  • λ°€λ„κΈ°λ°˜ ν΄λŸ¬μŠ€ν„°λ§
  • 가지λ₯Ό μ€‘μ‹¬μœΌλ‘œ λ°˜μ§€λ¦„ R의 곡간에 μ΅œμ†Œ M개의 ν¬μΈνŠΈκ°€ μ‘΄μž¬ν•˜λŠ” 점을 μ½”μ–΄ν¬μΈνŠΈλΌκ³  함
  • λ°˜μ§€λ¦„ Rμ•ˆμ— λ‹€λ₯Έ μ½”μ–΄ ν¬μΈνŠΈκ°€ μžˆλŠ” 경우 κ²½κ³„ν¬μΈνŠΈλΌκ³  함
  • μ½”μ–΄ 포인트, 경계 ν¬μΈνŠΈλ„ μ†ν•˜μ§€ μ•ŠλŠ” 점을 Noise(or outlier)둜 λΆ„λ₯˜
  • k-Means와 같이 ν΄λŸ¬μŠ€ν„°μ˜ 수λ₯Ό μ •ν•˜μ§€ μ•Šμ•„λ„ 됨
  • Noise pointλ₯Ό ν†΅ν•˜μ—¬ outlier κ²€μΆœμ΄ κ°€λŠ₯
  • ν΄λŸ¬μŠ€ν„°μ˜ 밀도에 λ”°λΌμ„œ ν΄λŸ¬μŠ€ν„°λ₯Ό μ„œλ‘œ μ—°κ²°ν•˜κΈ° λ•Œλ¬Έμ— κΈ°ν•˜ν•™μ μΈ λͺ¨μ–‘을 κ°–λŠ” ꡰ집도 잘 찾을 수 있음

μ„œμšΈμ‹œ 쀑학ꡐ μ‘Έμ—…μƒμ˜ μ§„λ‘œ ν˜„ν™© 데이터셋을 μ‚¬μš©ν•œ 밀도 기반 ν΄λŸ¬μŠ€ν„°λ§

  • ν•™κ΅μ•Œλ¦¬λ―Έ 곡개용 데이터 쀑 μ„œμšΈμ‹œ 쀑학ꡐ μ‘Έμ—…μƒμ˜ μ§„λ‘œ ν˜„ν™© λ°μ΄ν„°μ…‹μ—μ„œ 고등학ꡐ 진학λ₯  데이터λ₯Ό ν™œμš©ν•˜μ—¬ 속성이 λΉ„μŠ·ν•œ μ€‘ν•™κ΅κΉŒμ§€ ν΄λŸ¬μŠ€ν„°λ§
  • ν΄λŸ¬μŠ€ν„°λ§ν•œ κ²°κ³Όλ₯Ό μ§€λ„μ‹œκ°ν™”

🐼 μ€€λΉ„

# 라이브러리 μž„ν¬νŠΈ
import pandas as pd
import folium

# 데이터 μ€€λΉ„
df = pd.read_excel('/content/2016_middle_shcool_graduates_report.xlsx', index_col=0, header=0, engine='openpyxl') # μ—‘μ…€νŒŒμΌ μ—΄κΈ°μœ„ν•œ μ½”λ“œ
df.head()

쀑학ꡐ μœ„μΉ˜ 지도 μ‹œκ°ν™”

# 쀑학ꡐ μœ„μΉ˜ 지도 μ‹œκ°ν™”
mschool_map = folium.Map(location=[37.55, 126.98], tiles='Stamen Terrain', zoom_start=12)

# 쀑학ꡐ μœ„μΉ˜ 정보 CircleMarker둜 ν‘œμ‹œ -> popup은 학ꡐλͺ… -> ν•„μš”ν•œ 컬럼 -> μœ„λ„, 경도, 학ꡐλͺ…
for name, lat, lng in zip(df.학ꡐλͺ…, df.μœ„λ„, df.경도):
  folium.CircleMarker([lat, lng], # μœ„λ„ 경도
                      radius=5, # λ°˜μ§€λ¦„
                      color='brown', # λ‘˜λ ˆ 색상
                      fill=True, fill_color='coral', # 원 μ•ˆ 색상
                      fill_opacity=0.7, # 투λͺ…도
                      popup='<pre>'+name+'</pre>').add_to(mschool_map)
mschool_map


πŸ‘€ 이 지도에 ν΄λŸ¬μŠ€ν„°λ§μ„ μ μš©ν•˜κ³  μ‹ΆμŒ


데이터 μ „μ²˜λ¦¬

  • λ²”μ£Όν˜• 데이터 -> Dtype -> Object -> μœ ν˜•['ꡭ립', '곡립', '사립'], μ£Όμ•Ό[μ£Όκ°„], 지역 25개의 ꡬ
# -> 인코딩 -> 라벨링(μˆ«μžν˜•νƒœλ‘œ λ³€κ²½) -> μ„±λŠ₯ -> 원핫인코딩(λ°œμ „κ°€λŠ₯)
from sklearn import preprocessing

label_encoder = preprocessing.LabelEncoder()

l_location = label_encoder.fit_transform(df['지역']) # 25 -> 0 ~ 24
l_code = label_encoder.fit_transform(df['μ½”λ“œ']) # array([3,5,9]) -> 0,1,2 λ‹€μ‹œλΌλ²¨λ§(λ²”μœ„ 쑰절)
l_type = label_encoder.fit_transform(df['μœ ν˜•']) # ['ꡭ립', '곡립', '사립'] -> 0,1,2
l_day = label_encoder.fit_transform(df['μ£Όμ•Ό']) # [μ£Όκ°„] - > 0

# df μƒˆλ‘œμš΄ 컬럼으둜 μΆ”κ°€(κ΅μ²΄λŠ” μ•ˆν•¨)
df['location'] = l_location
df['code'] = l_code
df['type'] = l_type
df['day'] = l_day
df.head()

# ν΄λŸ¬μŠ€ν„°λ§μ— ν•„μš”ν•œ 속성을 선택 -> κ³Όν•™κ³ , μ™Έκ³ κ΅­μ œκ³ , 체고, μžμ‚¬κ³ 
# 인덱슀 번호둜 κ°€μ Έμ˜΄
columns_list = [9, 10, 11, 13]
X = df.iloc[:, columns_list] #[row_index, columns_index]
X.head()
  • df.info()둜 인덱슀 번호 확인!
  • X.head() κ²°κ³Ό
# μ •κ·œν™”
X = preprocessing.StandardScaler().fit(X).transform(X)
X


DBSCAN ꡰ집 λͺ¨λΈ μ„€μ •

# DBSCAN λͺ¨λΈ μ„€μ •
from sklearn import cluster
# ν•œ 데이터 ν¬μΈνŠΈμ—μ„œ eps 거리 μ•ˆμ— 데이터가 min_samples 개수만큼 ν¬ν•¨λ˜μ–΄ 있으면 ν΄λŸ¬μŠ€ν„°λ‘œ 포함
# eps 핡심 포인트λ₯Ό μ€‘μ‹¬μœΌλ‘œ μΈ‘μ •λ˜λŠ” μœ ν΄λ¦¬λ””μ–Έ 거리값
# min_samples : 핡심 포인트λ₯Ό μ€‘μ‹¬μ μœΌλ‘œ κ°„μ£Όν•˜λŠ” μ£Όλ³€ μ§€μ—­μ˜ ν‘œλ³Έ 수
dbm = cluster.DBSCAN(eps=0.2, min_samples=5)

λͺ¨λΈ ν•™μŠ΅, λͺ¨λΈ μ˜ˆμΈ‘ν™•μΈ

dbm.fit(X)
import numpy as np
cluster_label = dbm.labels_ # dbm.labels_ 쀑 -1은 noise
# 예츑 κ²°κ³Ό 데이터 ν”„λ ˆμž„μ— μΆ”κ°€
df['Cluster'] = cluster_label
df.head(10)


ν΄λŸ¬μŠ€ν„° κ²°κ³Ό 확인

# 각 ν΄λŸ¬μŠ€ν„°μ˜ 데이터 건수
df['Cluster'].value_counts()

ν΄λŸ¬μŠ€ν„° κ°’μœΌλ‘œ κ·Έλ£Ήν™”, 좜λ ₯

# ν΄λŸ¬μŠ€ν„° κ°’μœΌλ‘œ κ·Έλ£Ήν•˜κ³  κ·Έλ£Ήλ³„λ‘œ λ‚΄μš© 좜λ ₯(5개 좜λ ₯)
group_cols = [0, 1, 3] + columns_list # 지역, 학ꡐλͺ…, μœ ν˜• + cols
# groupby -> key, value 
grouped = df.groupby('Cluster')
# grouped['Cluster'].value_counts()

# index(key), group(value)
for index, group in grouped:
  print('Cluster : ', index)
  print(' * len : ', len(group))
  print(group.iloc[:,group_cols].head())
  print('\n')

ν΄λŸ¬μŠ€ν„°λ§ κ²°κ³Ό 지도 μ‹œκ°ν™”

# 쀑학ꡐ μœ„μΉ˜ 지도 μ‹œκ°ν™”
cluster_map = folium.Map(location=[37.55, 126.98], tiles='Stamen Terrain', zoom_start=12)
colors = {-1:'gray', 0:'coral', 1:'blue', 2:'green', 3:'red', 4:'purple', 5:'orange'}
# 쀑학ꡐ μœ„μΉ˜ 정보 CircleMarker둜 ν‘œμ‹œ -> popup은 학ꡐλͺ… -> ν•„μš”ν•œ 컬럼 -> μœ„λ„, 경도, 학ꡐλͺ…, Cluster
for name, lat, lng, clus in zip(df.학ꡐλͺ…, df.μœ„λ„, df.경도, df.Cluster):
  folium.CircleMarker([lat, lng], # μœ„λ„ 경도
                      radius=5, # λ°˜μ§€λ¦„
                      color=colors[clus], # λ‘˜λ ˆ 색상
                      fill=True, fill_color=colors[clus], # 원 μ•ˆ 색상
                      fill_opacity=0.7, # 투λͺ…도
                      popup='<pre>'+name+'</pre>').add_to(cluster_map)
cluster_map


비지도 ν•™μŠ΅ μš”μ•½ 및 정리

  • 탐색적 데이터뢄석과 데이터 μ „μ²˜λ¦¬μ— μ‚¬μš©ν•  수 μžˆλŠ” μ—¬λŸ¬κ°€μ§€ 비지도 ν•™μŠ΅ μ•Œκ³ λ¦¬μ¦˜ 이해
  • 데이터λ₯Ό μ˜¬λ°”λ₯΄κ²Œ ν‘œν˜„ν•˜λŠ” 것은 μ§€λ„ν•™μŠ΅κ³Ό 비지도 ν•™μŠ΅μ„ 잘 μ μš©ν•˜κΈ° μœ„ν•΄ ν•„μˆ˜μ 
  • μ „μ²˜λ¦¬μ™€ λΆ„ν•΄ 방법은 데이터 μ€€λΉ„ λ‹¨κ³„μ—μ„œ μ•„μ£Ό μ€‘μš”ν•œ λΆ€λΆ„
  • 지도 ν•™μŠ΅μ—μ„œλ„ 데이터 탐색 λ„κ΅¬λŠ” λ°μ΄ν„°μ˜ νŠΉμ„±μ„ 잘 μ΄ν•΄ν•˜λŠ”λ° μ€‘μš”ν•¨
  • 정보가 없을 λ•Œ 데이터λ₯Ό λΆ„μ„ν•˜λŠ” μœ μΌν•œ 방법
  • 2차원 예제 데이터와 scikit-learn에 μžˆλŠ” μ‹€μ œ 데이터 셋인 digits, iris, cancer데이터셋에 직접 ꡰ집과 λΆ„ν•΄ μ•Œκ³ λ¦¬μ¦˜μ„ μ μš©ν•˜λŠ” μ—°μŠ΅μ΄ 도움됨
profile
배고파용.

0개의 λŒ“κΈ€