아이티윌_데이터 분석 55기/강의내용 필기_통계 및 분석

#13 13일차_군집분석 및 평가 ·해석, 변수 스케일링, 회귀분석

ecosso 2026. 4. 29. 16:25

01 계층적 군집분석

 -01 계층적 군집분석이란

 -02 군집 간 거리

 -03 실습

 

02 비계층적 군집분석

 -01 비계층적 군집분석이란

 -02 k-means 군집 형성 방법

 -03 k-means와 k-means ++

 -04 실습

 

03 변수 스케일링

 -01 표준화 (Standard scale)

 -02 정규화 (Minmax scale) 

 -03 robust scale

 

04 혼합 분포 군집

 -01 혼합 분포 군집이란

 -02 EM 알고리즘

 

05 DBSCAN

 

06 SOM

 -01 SOM이란

 -02 SOM의 구조

 

07 군집 분석 평가 및 해석

 

08 회귀분석

* 이해를 위해 첨부된 일부 이미지는 chatGPT를 이용해 제작하였음

 


 

01 계층적 군집분석

 -01 계층적 군집분석이란

 계층적 군집분석은 비지도학습의 일종이다.

 모든 학습데이터들끼리의 거리를 계산하여 가장 가까운 데이터들끼리 군집을 순차적으로 형성한다.

 (거리가 가장 짧은 데이터 포인트로부터 인근 데이터 포인트를 포함시키는 방향으로 순차적으로 계층적 트리 구조를 형성한다.)

따라서 군집간 거리 설정이 중요하며, 군집간 거리 설정이 동일하면 군집형성 결과 역시 동일하다.

 

 k(군집의 수)가 정해져있지 않을 때 주로 사용한다.

 (k를 어떻게 정해야할지 알기 어려울 때 계층적 군집분석을 먼저 수행해서 적절한 군집의 수를 파악할 수 있다.)

 

 군집에 한 번 포함된 데이터포인트(개별관측치)는 군집 이동이 불가능하며, 하나의 데이터 포인트는 반드시 하나의 군집에 소속된다.


 -02 군집 간 거리

 군집 간 거리 설정에 따라 군집형성 과정이 달라진다.

  1) 최단연결법 = 단일연결법 (Single Linkage Method)

  - 군집 내 모든 관측치와의 거리 중 가장 짧은 거리를 군집 간 거리로 정의

  - p1과 군집 내 데이터포인트(p2, p3, p4)와의 거리 중 최소를 선택 => min(distance12, distance13, distance14)

 

  2) 최장연결법 = 완결연결법(Complete Linkage Method)

  - 군집 내 모든 관측치와의 거리 중 가장 먼 거리를 군집 간 거리로 정의

  - p1과 군집 내 데이터포인트(p2, p3, p4)와의 거리 중 최대를 선택 => max(distance12, distance13, distance14)

 

  3) 중심연결법 (Centroid Linkage Method)

  - 군집 내 모든 관측치와의 거리를 군집 간 거리로 정의

  - p1과 군집 내 데이터포인트(p2, p3, p4)의 중심과의 거리 선택

 

  4) 평균연결법 (Average Linkage Method)

  - 군집 내 모든 관측치와의 거리를 평균 간 거리로 정의

  - p1과 군집 내 데이터포인트(p2, p3, p4)와의 거리 중 평균을 선택 => mean(distance12, distance13, distance14)

 

  5) 와드연결법 (Ward Linkage Method)

  - 군집 간의 거리에 기반하는 다른 연결과는 다른 군집 내 오차 제곱합에 기초하여 평균 수행

  - 군집 형성 이전 오차 제곱합에 비해 군집 형성 후 오차 제곱합이 작아지는 군집 형성

  - (소속 전 오차제곱합 - 소속 후 오차제곱합)이 작을수록 좋음

  - p1이 소속되기 전 군집 내 오차제곱합과 소속 후 오차제곱합의 차이가 작은쪽으로 소속


 -03 실습

 [ iris 데이터를 사용한 군집분석 수행 ]
 iris 데이터는 원래 분류분석을 수행하기 위한 데이터셋이지만 설명변수들만 사용하여 군집분석을 수행해보기로 한다.

 1) 계층적 군집분석
x <- iris[,-5] # 종속변수 제외

 sstep1) 거리행렬
d1 <- dist(x)

> dist(x)
            1         2         3         4         5         6
2   0.5385165                                                  
3   0.5099020 0.3000000                                        
4   0.6480741 0.3316625 0.2449490                              
5   0.1414214 0.6082763 0.5099020 0.6480741                    
6   0.6164414 1.0908712 1.0862780 1.1661904 0.6164414          
7   0.5196152 0.5099020 0.2645751 0.3316625 0.4582576 0.9949874
            7         8         9        10        11        12
2                                                              
3                                                              
4                                                              
5                                                              
6                                                              
7                                                              

 

step2) 학습
hclust(d1,                               # 거리행렬
           method = 'complete')  # 군집간의 거리

m1<- hclust(d1, method = 'single')          # 최단거리법
m2<- hclust(d1, method = 'complete')    # 최장거리법
m3<- hclust(d1, method = 'centroid')      # 중심연결법
m4<- hclust(d1, method = 'average')      # 평균연결법
m5<- hclust(d1, method = 'ward.D')       # 와드연결법 (와드 1)
m6<- hclust(d1, method = 'ward.D2')     # 와드연결법 (와드 2)

 

 step3) 시각화
dev.new()
par(mfrow=c(1,3))

 

# 최단거리법
plot(m1, hang = -1, main = 'Single')
rect.hclust(m1, k = 3)

 

# 최장거리법

plot(m2, hang = -1, main = 'Complete')
rect.hclust(m2, k = 3)

 

# 중심연결법

plot(m3, hang = -1, main = 'Centroid')
rect.hclust(m3, k = 3)   

 

# 평균연결법

plot(m4, hang = -1, main = 'Average')
rect.hclust(m4, k = 3)

 

# 와드연결법 (와드1)

plot(m5, hang = -1, main = 'Ward.D')
rect.hclust(m5, k = 3)

 

# 와드연결법 (와드2)

plot(m6, hang = -1, main = 'Ward.D2')
rect.hclust(m6, k = 3)

 

 step4) 군집 나누기
c1 <- cutree(m4, k = 3)

> c1
  [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 [49] 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 [97] 2 2 2 2 3 2 3 3 3 3 2 3 3 3 3 3 3 2 2 3 3 3 3 2 3 2 3 2 3 3 2 2 3 3 3 3 3 2 3 3 3 3 2 3 3 3 2 3
[145] 3 3 2 3 3 2

 

▲2,3번 집단이 일부 혼재되어 있음을 확인할 수 있다. (1번은 뚜렷히 분리되는 특성이 있으나 2,3번은 어느 정도 유사성이 있다.)

 

iris[c1 == 1, ] # 첫번째 군집
iris[c1 == 2, ] # 두번째 군집
iris[c1 == 3, ] # 세번째 군집

 

step5) 군집의 평가 -> K 결정
* 좋은 군집일수록
1) 군집 내 동질성이 커야함
2) 군집간 이질성이 커야함

* 총분산의 분해
TOTAL_SS = BETWEEN_SS + WITHIN _SS
(총분산) = (군집간분산) + (군집내분산)
=> 좋은 군집일수록 BETWEEN_SS는 커지고, WITHIN_SS는 작아진다.

 

install.packages('NbClust')
library(NbClust)

result <- NbClust(data = x,                   # 데이터 
                            min.nc = 2,               # 최소군집수
                            max.nc = 10,            # 최대군집수
                            method = 'average') # 군집간 거리

> result <- NbClust(data = x,           # 데이터 
+                   min.nc = 2,         # 최소군집수
+                   max.nc = 10,        # 최대군집수
+                   method = 'average') # 군집간 거리리
*** : The Hubert index is a graphical method of determining the number of clusters.
                In the plot of Hubert index, we seek a significant knee that corresponds to a 
                significant increase of the value of the measure i.e the significant peak in Hubert
                index second differences plot. 
 
*** : The D index is a graphical method of determining the number of clusters. 
                In the plot of D index, we seek a significant knee (the significant peak in Dindex
                second differences plot) that corresponds to a significant increase of the value of
                the measure. 
 
******************************************************************* 
* Among all indices:                                                
* 9 proposed 2 as the best number of clusters 
* 11 proposed 3 as the best number of clusters 
* 3 proposed 7 as the best number of clusters 
* 1 proposed 10 as the best number of clusters 

                   ***** Conclusion *****                            
 
* According to the majority rule, the best number of clusters is  3 
 
 
******************************************************************* 

 

▲ 24개의 평가지표가 존재한다.

Among all indices 의 경우 9개의 평가지표는 2개의 군집이 가장 좋다고 평가하였고, 11개의 평가지표는 3개의 군집이 가장 좋다고 평가하는 식으로 읽는다.

 

* According to the majority rule, the best number of clusters is 3

 

iris 데이터의 가장 좋은 수는 3개이다.

 

평가지표 중 2개에 대한 그래프를 함께 출력한다. (좌 : 군집 내 분산 | 우 : 차본)

x축은 군집의 수(k)이다.

 

좌 : 기울기가 가장 급변하는 곳은 군집의 수가 3일 때이다. 군집 내 분산은 원래 k가 커지면 감소하나, 기울기가 극단적으로 변환하는 지점에서 적절한 군집의 수를 확인할 수 있다.

우 : 차본(감소량)을 확인할 수 있다. 군집이 3개일 때의 군집감소량이 가장 큼을 확인할 수 있다.


02 비계층적 군집분석

 -01 비계층적 군집분석이란

 초기에 랜덤하게 seed(중심)을 선택하며, 초기 seed를 기준으로 가장 가까이 위치한 데이터들을 군집에 소속한다.

 군집이 형성되면서 이동되는 군집의 중심에 더 가까운 관측치가 존재한다면, 해당 데이터가 다른 군집에 소속했더라도 보다 가까운 군집으로 이동된다. 

  더 이상 각 군집의 중심 이동이 없을 때까지 반복한다.

 

 이상치에 민감하며 군집의 수가 정해져있는 경우에 사용하는 군집분석이다. (ex : k-means)


 -02 k-means 군집 형성 방법

  1) 랜덤하게 k개(군집의 개수)의 초기 seed 값 선택

  2) k개의 초기 seed값을 기준으로 가장 가까운 데이터 군집화

  3) 군집의 중심을 갱신 => seed 값 갱신

  4) 군집의 중심이 이동하지 않을 때까지 위 과정을 반복


 -03 k-means와 k-means ++

 k-means는 랜덤하게 seed를 선택하기 때문에 분석시마다 결과가 달라지게 된다.

 따라서 k-means의 초기 선택값 문제를 개선한 것이 k-means++이다.

 k-means++는 초기 중심점을 랜덤이 아닌, 기존 중심들과 멀리 떨어진 데이터일수록 높은 확률로 선택하여 중심을 고르게 분산시키는 방법이다.
 이를 통해 초기값에 따른 결과 변동을 줄이고, 더 안정적이고 빠르게 좋은 군집 결과를 얻을 수 있다.

구분 k-means k-means++
초기 중심 선택 완전 랜덤 거리 기반 확률 선택
결과 안정성 낮음 (매번 바뀜) 높음
수렴 속도 느릴 수 있음 더 빠름
성능 초기값에 크게 의존 평균적으로 더 좋음


 -04 실습

kmeans(x,           #  학습 데이터
             centers = ,  # k 
             iter.max = , # 중심을 얻기 위한 반복 수
             nstart = )   # 초기 중심을 얻기 위한 샘플링 수 

set.seed(0)
m1 <- kmeans(x, 3)

> m1
K-means clustering with 3 clusters of sizes 38, 50, 62

Cluster means:
  Sepal.Length Sepal.Width Petal.Length Petal.Width
1     6.850000    3.073684     5.742105    2.071053
2     5.006000    3.428000     1.462000    0.246000
3     5.901613    2.748387     4.393548    1.433871

Clustering vector:
  [1] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 [49] 2 2 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
 [97] 3 3 3 3 1 3 1 1 1 1 3 1 1 1 1 1 1 3 3 1 1 1 1 3 1 3 1 3 1 1 3 3 1 1 1 1 1 3 1 1 1 1 3 1 1 1 3 1
[145] 1 1 3 1 1 3

Within cluster sum of squares by cluster:
[1] 23.87947 15.15100 39.82097
 (between_SS / total_SS =  88.4 %)

Available components:

[1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss" "betweenss"   
[7] "size"         "iter"         "ifault"     

 

k-means는 평가점수가 출력된다.

 

K-means clustering with 3 clusters of sizes 38, 50, 62 : 각 군집 별 데이터수는 38, 50, 62개 (관측치, 도수)

Cluster means : 각 군집별, 변수별 평균

Clustering vector : 군집분석 결과

Within cluster sum of squares by cluster : 집단별 WITHIN_SS, 좋은 군집일수록 between_ss가 커지고 within_ss가 감소해야하므로 (1 - within_ss = between_ss), between_ss / totala_ss를 통해 점수를 얻음 

Available components : 추가정보

 

** 추가정보
m1$cluster            # 군집번호
m1$totss               # 총분산
m1$withinss          # 각 군집별 군집 내 분산
m1$tot.withinss    # 군집내 분산 총합 
m1$betweenss    # 군집간 분산

 

 ** k의 변화에 따른 withinss, betweenss 시각화
 (k-means에 들어가는 k가 정확하지 않을 때)

 k를 알아야 사용가능하다는 것은 k-means라는 모델 자체가 k의 수를 요구하기 때문이다.
 (hclust에서는 k를 요구하지 않았음)
 예를 들어 2~4개 군집 중 무엇이 가장 좋은 k가 되는지 애매한 상황이라면  군집의 개수별로 k-means를 돌려보고 결과를 비교하면 된다.

withss <- c() ; betss <- c()

for (i in 2:10) {
  set.seed(0)
  m1 <- kmeans(x, i)
  withss <- c(withss, m1$tot.withinss)
  betss <- c(betss, m1$betweenss)
}

par(mfrow = c(1,2))
plot(2:10, withss, xlab = 'k',
     ylab = 'within_ss', type = 'o')
plot(2:10, betss, xlab = 'k',
     ylab = 'between_ss', type = 'o')

 


03 변수 스케일링

iris 데이터의 경우 변수 간의 최소-최대값의 차이가 크지 않은 편이다.

그러나 단위 혹은 차이가 심한 경우 스케일링 이후 k-means를 사용해야 한다.

 

- 변수의 단위를 조절하는 전처리 기법

- 거리기반 모델, 딥러닝 모델, SVM 모델들은 변수 스케일에 민감

- 회귀분석에서의 회귀 계수 비교 시 변수 스케일링 필요

 

 -01 표준화 (Standard scale)

 - (X - mean) / sd  ( -1 ~ 1 )

 - 평균 0, 표준편차 1로 변경됨

 - 0을 가지고 좌우로 분포하기 때문에 음수의 값 역시 가짐


 -02 정규화 (Minmax scale) 

 - (X - min) / (max - min) ( 0 ~ 1 )


 -03 robust scale

 - (X - Q2) / (Q3 - Q1)


 -04 실습

[ 예제 - iris 데이터의 변수 스케일링 ]

1) 표준화

  (1) 직접구현
# function 만들기
f1 <- function(x) {
  (x - mean(x)) / sd(x)
}
# 컬럼별 반복
apply(iris[,-5], 2, f1)

> apply(iris[,-5], 2, f1)
       Sepal.Length Sepal.Width Petal.Length   Petal.Width
  [1,]  -0.89767388  1.01560199  -1.33575163 -1.3110521482
  [2,]  -1.13920048 -0.13153881  -1.33575163 -1.3110521482
  [3,]  -1.38072709  0.32731751  -1.39239929 -1.3110521482
  [4,]  -1.50149039  0.09788935  -1.27910398 -1.3110521482
  [5,]  -1.01843718  1.24503015  -1.33575163 -1.3110521482
  [6,]  -0.53538397  1.93331463  -1.16580868 -1.0486667950
  [7,]  -1.50149039  0.78617383  -1.33575163 -1.1798594716
  [8,]  -1.01843718  0.78617383  -1.27910398 -1.3110521482
  [9,]  -1.74301699 -0.36096697  -1.33575163 -1.3110521482
 [10,]  -1.13920048  0.09788935  -1.27910398 -1.4422448248

 

  (2) 함수사용

scale(iris[,-5])

> scale(iris[,-5])
       Sepal.Length Sepal.Width Petal.Length   Petal.Width
  [1,]  -0.89767388  1.01560199  -1.33575163 -1.3110521482
  [2,]  -1.13920048 -0.13153881  -1.33575163 -1.3110521482
  [3,]  -1.38072709  0.32731751  -1.39239929 -1.3110521482
  [4,]  -1.50149039  0.09788935  -1.27910398 -1.3110521482
  [5,]  -1.01843718  1.24503015  -1.33575163 -1.3110521482
  [6,]  -0.53538397  1.93331463  -1.16580868 -1.0486667950
  [7,]  -1.50149039  0.78617383  -1.33575163 -1.1798594716
  [8,]  -1.01843718  0.78617383  -1.27910398 -1.3110521482
  [9,]  -1.74301699 -0.36096697  -1.33575163 -1.3110521482
 [10,]  -1.13920048  0.09788935  -1.27910398 -1.4422448248

 

install.packages('caret')
library(caret)
m_sc1 <- preProcess(iris[,-5], method = c("center", "scale")) # 평균, 표준편차 계산 (기준만 찾아줌)
predict(m_sc1, iris[,-5])                                                           # 데이터 변환(평균으로 빼고 표준편차로 나누는 작업)

> predict(m_sc1, iris[,-5])
    Sepal.Length Sepal.Width Petal.Length   Petal.Width
1    -0.89767388  1.01560199  -1.33575163 -1.3110521482
2    -1.13920048 -0.13153881  -1.33575163 -1.3110521482
3    -1.38072709  0.32731751  -1.39239929 -1.3110521482
4    -1.50149039  0.09788935  -1.27910398 -1.3110521482
5    -1.01843718  1.24503015  -1.33575163 -1.3110521482
6    -0.53538397  1.93331463  -1.16580868 -1.0486667950
7    -1.50149039  0.78617383  -1.33575163 -1.1798594716
8    -1.01843718  0.78617383  -1.27910398 -1.3110521482
9    -1.74301699 -0.36096697  -1.33575163 -1.3110521482
10   -1.13920048  0.09788935  -1.27910398 -1.4422448248


2) 정규화

  (1) 직접구현
# function 만들기
f2 <- function(x) {
  (x-min(x))/(max(x)-min(x))
}
# 컬럼별 반복
apply(iris[,-5], 2, f2)

> apply(iris[,-5],2,f2)
       Sepal.Length Sepal.Width Petal.Length Petal.Width
  [1,]   0.22222222  0.62500000   0.06779661  0.04166667
  [2,]   0.16666667  0.41666667   0.06779661  0.04166667
  [3,]   0.11111111  0.50000000   0.05084746  0.04166667
  [4,]   0.08333333  0.45833333   0.08474576  0.04166667
  [5,]   0.19444444  0.66666667   0.06779661  0.04166667
  [6,]   0.30555556  0.79166667   0.11864407  0.12500000
  [7,]   0.08333333  0.58333333   0.06779661  0.08333333
  [8,]   0.19444444  0.58333333   0.08474576  0.04166667
  [9,]   0.02777778  0.37500000   0.06779661  0.04166667
 [10,]   0.16666667  0.45833333   0.08474576  0.00000000

 

  (2) 함수사용

library(caret)
m_sc2 <- preProcess(iris[,-5], method = 'range')
predict(m_sc2, iris[,-5])

> predict(m_sc2, iris[,-5])
    Sepal.Length Sepal.Width Petal.Length Petal.Width
1     0.22222222  0.62500000   0.06779661  0.04166667
2     0.16666667  0.41666667   0.06779661  0.04166667
3     0.11111111  0.50000000   0.05084746  0.04166667
4     0.08333333  0.45833333   0.08474576  0.04166667
5     0.19444444  0.66666667   0.06779661  0.04166667
6     0.30555556  0.79166667   0.11864407  0.12500000
7     0.08333333  0.58333333   0.06779661  0.08333333
8     0.19444444  0.58333333   0.08474576  0.04166667
9     0.02777778  0.37500000   0.06779661  0.04166667
10    0.16666667  0.45833333   0.08474576  0.00000000

 3) robust
summary(iris$Sepal.Length) [2] # Q1
summary(iris$Sepal.Length) [5] # Q3

> summary(iris$Sepal.Length) [2]
1st Qu. 
    5.1 
> summary(iris$Sepal.Length) [5] # Q3
3rd Qu. 
    6.4 

 

quantile(iris$Sepal.Length) ['25%'] # Q1
quantile(iris$Sepal.Length) ['75%'] # Q3

> quantile(iris$Sepal.Length) ['25%']
25% 
5.1 
> quantile(iris$Sepal.Length) ['75%']
75% 
6.4 

 

# function 만들기
f3 <- function(x) {
  q1 <- quantile(x) ['25%']
  q2 <- quantile(x) ['50%']
  q3 <- quantile(x) ['75%']
  (x - q2) / (q3 - q1)
}

apply(iris[,-5], 2, f3)

> apply(iris[,-5], 2, f3)
       Sepal.Length Sepal.Width Petal.Length Petal.Width
  [1,]  -0.53846154         1.0  -0.84285714 -0.73333333
  [2,]  -0.69230769         0.0  -0.84285714 -0.73333333
  [3,]  -0.84615385         0.4  -0.87142857 -0.73333333
  [4,]  -0.92307692         0.2  -0.81428571 -0.73333333
  [5,]  -0.61538462         1.2  -0.84285714 -0.73333333
  [6,]  -0.30769231         1.8  -0.75714286 -0.60000000
  [7,]  -0.92307692         0.8  -0.84285714 -0.66666667
  [8,]  -0.61538462         0.8  -0.81428571 -0.73333333
  [9,]  -1.07692308        -0.2  -0.84285714 -0.73333333
 [10,]  -0.69230769         0.2  -0.81428571 -0.80000000

04 혼합 분포 군집

 -01 혼합 분포 군집이란

 혼합 분포 군집은 k개의 데이터가 k개의 혼합 모형으로부터 나왔다는 가정 하에 자료로부터 모수와 가중치를 추정하는 방법이다. 

 따라서 k를 알고 있어야하며, 만약 2개의 집단으로 나누고 싶다면 2개의 분포를 가정해야 한다.

 k개의 각 모형은 군집을 의미하며, 각 데이터는 추정된 k개의 모형 중 어느 모형으로부터 나왔을 확률이 높은지에 따라서 군집의 분류가 이루어진다.

 

 군집의 크기가 너무 작으면 추정이 어렵거나 정확도가 떨어지며, 데이터가 커질수록 수렴에 시간이 많이 걸리는 단점이 존재한다.

 이상값에 민감하다.

                                                       

 또한 혼합 분포 군집은 경험적 반복을 통한 분포의 모수를 추정한다.

 이 경험적 반복을 EM 알고리즘이라고 한다.


 -02 EM 알고리즘

 관측되지 않은 잠재변수에 의존하는 확률 모델에서 최대 우도likelihood)나 최대 사후 확률을 갖는 모수의 추정값을 찾는 반복적인 알고리즘을 말한다.

 

  1) 초기화(Initialization)

  평균, 분산 등의 추정 모수에 대해 임의의 초기값 할당

 

  2) E-step (Expectation)

  현재 파라미터 값을 사용하여 사후 확률을 계산

 

  3) M-step (Maximization)

  E-step에서 계산한 사후확률을 이용하여 모수 재추정

 

  4) Iterative

  최대 우도값에 수렴할 때까지 E-step, M-step 반복 실행

 

 * 우도(liklihood)

  어떤 시행의 결과가 주어졌다고 할 때, 주어진 가설이 참일 때 결과가 나오는 정도

 * 최대 우도 추정법 (MLE : maximum Likelihood Estimation)

  어떤 모수가 주어졌을 때, 원하는 값들이 나올 가능도를 최대로 만드는 모수를 선택하는 방법 (모수의 점 추정)

  혼합 분포 군집, 로지스틱 회귀에서 사용한다.

 

 ↔ 최소제곱법(오차를 가공하여 모두 더한 값이 최소가 되는 회귀식을 구함) : 회귀분석, 신경망에서 사용

 

  > 따라서 회귀분석은 최소제곱법에 의해 모수를 추정하며,

                로지스틱 회귀분석은 최대 우도 추정법에 의해 모수를 추정한다.


05 DBSCAN

밀도 (반경)를 기존으로 군집을 찾는 알고리즘으로, 복잡한 형태의 군집을 잘 찾으며 이상값을 구별할 수 있는 군집 알고리즘이다.

어느 점을 기준으로 ε 반경 내 점이 n개 이상 있으면 하나의 군집으로 인식하기에 군집의 수 (k)를 미리 지정할 필요가 없다.

 - 모든 포인트마다 ε의 반경을 그리고 그 안에 포함되는 포인트의 수를 센다. 

 - 반경 내 포함되는 포인트의 수가 n개 이상일 시 기준이 되었던 포인트는 core point라고 한다.

 - 반경 내 n개 미만의 포인트가 존재할 시, 기준이 되었던 포인트는 border point라고 한다.

 - 서로의 반경에 core point가 들어올 시 반경은 합쳐진다.

 

ε (반경), n (최소이웃개수_minpoint) 설정에 매우 민감하다.

k-means는 평면에 위치한 군집을 잘 분리하며, DBSCAN은 고차원 데이터에서의 군집 분류에 유리하다.


06 SOM

 -01 SOM이란

SOM (Self Organizing Map)은 인공신경망 기반 군집 분석방법으로써 고차원의 벡터를 시각화할 수 있는 2차원의 저차원으로 표현한다.

자율 학습 방법에 의한 클러스터링 방법을 적용하며 비슷한 데이터는 가까운 위치에 배치되도록 학습하는 비지도 신경망이다.

입력 변수의 위치 관계 그대로를 보존하며 군집의 수를 정하지 않고, 코호넨 맵이라고도 불린다.


 -02 SOM의 구조

SOM은 입력층, 경쟁층으로 구성되어 있다.

 

 1) 입력층

 - 입력 벡터를 받는 층으로 유니트(뉴런, 노드)의 개수는 설명변수의 개수와 동일하게 설정된다..

 - 입력층에 있는 각 뉴런은 경쟁층의 모든 뉴런과 완전 연결되어 있다.

 - 입력 데이터는 학습 과정을 통해 경쟁층의 격자 구조 위에 정렬되며, 이 구조를 지도(map)라고 한다.

 

 2) 경쟁층

 - 경쟁층은 2차원 격자(Grid)형태로 구성되며, 그리드(mXm(하이퍼파라미터)) 역시 유니트의 수에 의해 결정된다.

 - 각 유니트는 입력 벡터와 동일한 차원의 가중치 벡터를 가진다.

 - 학습 과정에서 입력 벡터와 각 유니트 간의 거리(유사도)를 계산하고, 가장 가까운 유니트가 승자(BMU : Best Matching Unit)으로 선택된다.

 - 선택된 뉴런과 그 주변 이웃 뉴런들은 입력 벡터 방향으로 가중치가 조정되며, 해당 과정을 반복하면서 유사한 입력 데이터는 지도 상에서 가까운 위치에 배열된다.


07 군집 분석 평가 및 해석

적절한 군집의 수를 결정할 때 다양한 평가지표를 활용한다.

 

 -01 총 분산의 분해

총 분산(TOTAL_SS) = 군집 내 분산(WITHIN_SS) + 군집 간 분산(BETWEEN_SS)

좋은 군집일수록 그룹 내 분산 ↓ 그룹간 분산 ↑

elbow point를 사용하여 적절한 군집의 수를 결정할 수 있다.

 

 - 군집의 수 ↑ 군집 내 분산 ↓  군집 간 분산 ↑

 - 따라서  분산이 갑자기 감소 혹은 증가하는 지점이 가장 효과적인 군집의 수 


 -02 실루엣 계수

군집 내 거리와 군집 간의 거리를 기준으로 군집을 평가

실루엣 계수가 1에 가까울수록 데이터가 잘 분리된 군집에 속해 있다는 의미

0.5보다 크면 결과가 타당한 것으로 평가


 -03 Dunn index(DI)

 DI = 군집간 거리 중 최솟값 / 군집 내 거리 중 최댓값

 변동량(거리)에 초점을 맞춘 평가 지표이며, DI가 클수록 좋은 군집이다.


08 회귀분석

지도학습의 하나이며, 하나 이상의 독립변수들이 종속변수에 미치는 영향을 추정할 수 있는 통계기법이다.

(ex : 주택가격 예측, 소비량 예측, 매출액 예측 등...)

변수 사이의 인과관계를 밝히는 모델로써, 상관관계와 다르다.

연속형, 이상형에 관계없이 종속변수가 수치형이여야 하며 통계적 가정에 의해 설계되어 통계적으로 모델의 적합도를 평가할 수 있다.

 

y = β0 + β1x + ε

y(종속변수, 반응변수, 결과변수 : 수치형이여야 한다.)  =

β0(절편) + (β1(기울기)x(독립변수, 설명변수, 예측변수))(회귀계수) + ε(오차항, 잔차)

* β, x => x가 Δ1 증가할 때 β1( ΔY)의 변화

 

y가 수치형일 때의 분석기법을 회귀분석이라 명칭하기도 하고, 회귀를 도와주는 알고리즘(RF_reg, DI_reg, 릿지, 랏쏘, 엘라스틱넷 등...) 역시 회귀분석이라고 한다.