# 2025-06-20

rm(list=ls())
ls()
## character(0)
#SOM자기조직화지도
#패키지설치(처음한번만실행)
# install.packages("kohonen")
#패키지불러오기
library(kohonen)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# 1.데이터준비
data(iris)
iris_data<- iris[, 1:4] #수치형변수만사용
# 범주형변수 som 가능하지 않음
iris_labels<- iris$Species

#2.데이터정규화(SOM은거리기반이므로스케일중요)
iris_scaled<- scale(iris_data)

#3. SOM격자구성(예: 5x5격자)
set.seed(42)
som_grid<- somgrid(xdim=5, ydim=5, topo= "rectangular") #25개뉴런(바둑판)
#25개(5x5)는단지예시일뿐,꼭고정할필요없습니다.
#데이터크기와목적(빠른시각화vs정교한군집화)에따라격자크기를조절하세요

#4. SOM학습(반복학습포함)
iris_som<- som(iris_scaled,
               grid= som_grid,
               rlen= 100, #반복횟수(Epoch수)
               alpha=c(0.05, 0.01), #학습률시작→끝
               keep.data=TRUE) #SOM학습에사용한데이터를결과객체에함께저장

#5.시각화군집구조및차원축소결과

plot(iris_som, type= "codes",main= "SOM코드북벡터")

#￿ 부채꼴이크면→해당변수값이크다
#￿ 부채꼴이작으면→해당변수값이작다
#예:왼쪽위에있는원들은Sepal.Length와Petal.Length가큼
#아래쪽중앙의원들은Petal.Length가작고Sepal.Width가큼
#꽃종류를미리몰라도비슷한것끼리자동으로군집됨

plot(iris_som, type= "changes",main= "학습오차변화")

#그래프가점점내려간다→좋은학습
#학습이반복될수록뉴런들이입력데이터를더잘반영하고있다는뜻입니다

plot(iris_som, type= "count",main= "각뉴런에매핑된데이터수")

#SOM격자판에데이터가얼마나몰려있는지보여주는히트맵느낌의지도
#고객군집분석:어떤그룹이큰군집인지확인가능
#이상치탐지:거의안쓰이는뉴런(빈칸)에매핑된데이터는이상치일가능성

plot(iris_som, type= "dist.neighbours",main= "이웃뉴런간거리")

#SOM격자에서서로이웃한뉴런들사이의거리(차이)를색으로표현한지도입니다
#주황~빨강영역
#→이웃한뉴런들이비슷한데이터를대표
#→즉,같은군집안에있음가능성높음
#노랑~흰색영역
#→이웃한뉴런들끼리값이많이다름
#→즉,서로다른군집의경계

plot(iris_som, type = "mapping", main = "데이터분포(클래스별)", labels =
       as.integer(iris_labels))

#각점위에1, 2, 3숫자가찍혀서어떤클래스가어느뉴런에모였는지보여줍니다.