728x90

군집분석(Cluster Analysis)은 관측 대상들 간에 어떤 공통 특징을 찾아 비슷한 특징을 갖는 관측치들 끼리 군집(Cluster)을 형성하는 방법입니다.

서로 상사성(Similarity)이 높은 관측치(객체)들은 같은 군집으로 묶고, 상대적 상사성이 낮은 객체들은 서로 다른 군집으로 묶습니다.

예를 들어 10명을 대상으로 키, 몸무게 등 여러 가지 신체특성을 측정하여 비슷한 신체특성을 갖는 사람들끼리 3 또는 4개의 군집을 구성하여, 각 군집별로 그 군집이 갖는 특유한 성질 즉 키가 크고 몸무게도 큰 군집, 키는 크고 몸무게는 작은 군집 등의 성질을 찾아내는 데 이용됩니다.

군집을 형성하는 과정에는 다음과 같은 방법이 있습니다.

 

병합적 방법

관측대상 각자를 하나의 별개의 군집으로 생각하여 관측대상의 갯수만큼 군집이 있다고 가정합니.

그리하여 이 군집들간에 상사성(Similarity) 혹은 거리를 측정하여 가장 가까운 군집끼리 단계적으로 병합하여

최종적으로 모든 관측대상이 한 군집으로 형성되게끔 하는 과정의 기법입니다.

 

Partitioning 기법

이 기법은 연구자에 의해 군집의 수가 사전에 미리 결정되는 경우에 사용되며, 계보적으로 군집을 형성하는 것이 아니고 관측대상을 군집으로 할당시키는 형태를 취합니.

즉 각 군집에 대한 판정기준(초기치) 결정하고 이에 따라 관측대상을 각 군집에 할당하는 방법을 취합니.

여기서 초기치라 함은 각 관측대상을 군집의 중심(Centroid)으로 하고 이에 따른 오차제곱합에 기초를 두고

구해지는 값으로서, 구하는 공식이나 과정은 상당한 지식과 이해를 요하므로 관련 참고서적을 참조하기 바랍니다.

 

다음은 SAS 메뉴얼에 나와 있는 미국 10개 도시간의 비행거리의 예입니다.

이들 비행거리로 볼 때 가까운(상사성이 높은) 도시끼리 군집을 형성하는 군집분석의 예입니다.

728x90

28.1 군집분석이란 ? https://rsas.tistory.com/508

28.2 군집분석 실습 https://rsas.tistory.com/472

28.3 거리 측정

28.4 군집화하는 방법

28.4.1 최단연결법 Single Linkage Method

28.4.2 최장연결법

28.4.3 평균연결법

28.4.4 중심연결법

28.4.5 WARD 방법

28.5 K-Means 병합적 군집방법

28.6 PROC CLUSTERTREE의 형태

28.6.1 PROC CLUSTER 의 형태

28.6.2 PROC TREE의 형태

28.6.3 도움말 이용하기

28.7 R 프로그램 군집분석

728x90

시계열 데이터를 다룰려면 SAS에서의 날짜 개념과 읽어들이는 INPUT문(정확히는 INFORMAT 문)과

PRINT문(FORMAT문) 대해서 아셔야 합니다.

 

* 날짜를 단순 숫자로 읽어 들이면 에러 => 미싱 처리;

DATA a1;
INPUT nalja;
CARDS;
1970-01-01
;
PROC PRINT;RUN;

 

* 날짜를 그냥 문자로 읽어들이면 => 문자 기본 8자리만 1970-01-;

DATA a1;
INPUT nalja $;
CARDS;
1970-01-01
;
PROC PRINT;RUN;

* 날짜를 문자로 읽어들이면서 문자 10자리 지정 => 1970-01-01 로 읽지만 문자;

DATA a1;
INPUT nalja $10.;
CARDS;
1970-01-01
;
PROC PRINT;RUN;


* INFORMAT 이용하여 문자 10 칸을 지정 => 1970-01-01 로 읽지만 문자;;

DATA a1;
INFORMAT nalja $10.;
INPUT nalja;
CARDS;
1970-01-01
;
PROC PRINT;RUN;

* INFORMAT 이용하여 날짜 지정 yymmdd10 하면 읽는 것 OK, 그러나 출력값 0 ;

DATA a1;
INFORMAT nalja yymmdd10.;
INPUT nalja;
CARDS;
1960-01-01
;
PROC PRINT;RUN;

* FORMAT 이용하여 출력형태 지정 yymmdd10.  => 완벽...

DATA a1;
INFORMAT nalja yymmdd10.;
INPUT nalja;
CARDS;
1960-01-01
;
PROC PRINT;VAR nalja;FORMAT nalja yymmdd10.;
RUN;

 

* 숫자(일, 월, 연) 인 경우 MDY( ) 함수를 이용 => 날짜로 변경

DATA a1;
INPUT day1 mon1 year1;
CARDS;
31 01 1960
;
DATA a2;SET a1;
nalja =MDY(mon1,day1,year1);
PROC PRINT;VAR mon1 day1 year1 nalja;
FORMAT nalja yymmdd10.;
RUN;

728x90

참으로 오래전에 시계열분석을 했었습니다. 30여년전의 일입니다. 

이 당시에는 시계열분석에 대하여 아는 사람들이 많지 않았습니다.

그 유명한 Box와 Jenkins가 쓴 Time Series 책을 대학원과정에서 공부를 하긴 했지만...

 

초창기인지라 ARMA 에 대하여 열심히 파고 들었던 기억이 납니다.

/제가 쓴 "SAS강좌와 통계컨설팅"에도 마지막 장인 30장에 시계열분석을 넣기도 했습니다.

 

시계열 분석 프로젝트는 2번 정도 밖에 하지 않았습니다. ARIMA를 많이 사용했지만

저는 ARIMA 모형으로 인한 예측하는 것을 좋아하지 않습니다.

ARIMA를 이용하여 모델링을 하고 모델결과를 가지고 과거자료와 fitting 을 하면

엄청 잘 맞아 떨어집니다. 가끔 (아니 현실에서는 대부분) 모형은 그럴 듯 해 보이지만

예측을 하기가 쉽지가 않습니다.

 

그러면 ARIMA 를 쓸 필요가 없느냐? 하면 그렇지도 않습니다.

먼저 plot 을 해 보고 모형을 적용시키면 시계열 데이터의 성격을 파악하는데 많은

도움이 됩니다.

 

시계열분석은 이론으로 공부하기에 만만찮습니다. 그래서 어느 것보다 먼저

실습을 해 보고 감을 잡는 것을 추천합니다.

그런 후 시계열분석에 대한 공부를 하시길 바랍니다.  시계열분석은 이론을 모르면 

해석하기 어려운 부분도 많습니다.

그리고 현업에 대한 지식이 극히 필요합니다  ^^^ 

 

 

728x90

벡터를 이용하여 시계열 데이터를 직접 만들어 보자. 시계열 데이터를 만들 때에는 ts(time series) 객체를 이용한다.

 

 

#=== 3. 시계열분석 데이터 만들기 - ts()

# (1) ts() 함수 사용

vect01 <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)

ts01 <- ts(vect01,start=2001,frequency=4)

ts01

 

ts02 <- ts(vect01,start=2001,frequency=12)

ts02

 

ts03 <- ts(vect01,start=2001,frequency=1)

ts03

 

(ts04 <- ts(vect01,end=2001,frequency=4))

(ts05 <- ts(vect01,end=2001,frequency=12))

?ts

 

length : 원소들의 갯수

mode : 원소들의 종류

tsp : 시계열 시작, 종료, 간격

dim : 다중시계열의 행과 열의 수

dimnames : 다중시계열의 행과 열의 이름

 

분기별 데이터 만들기

vect01 <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)

ts01 <- ts(vect01,start=2001,frequency=4)

ts01

 

> ts01

Qtr1 Qtr2 Qtr3 Qtr4

2001 1 2 3 4

2002 5 6 7 8

2003 9 10 11 12

2004 13 14 15 16

 

length(ts01) # 16

class(ts01) # ts

mode(ts01) # numeric

help(ts)

 

 

월별 데이터 만들기

ts02 <- ts(vect01,start=2001,frequency=12)

ts02

 

> ts02

Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec

2001 1 2 3 4 5 6 7 8 9 10 11 12

2002 13 14 15 16

 

연도별 데이터 만들기

ts03 <- ts(vect01,start=2001,frequency=1)

ts03

 

> ts03

Time Series:

Start = 2001

End = 2016

Frequency = 1

[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

>

(ts04 <- ts(vect01,end=2001,frequency=4))

(ts05 <- ts(vect01,end=2001,frequency=12))

 

> help(ts)

728x90

다음과 같은 데이터가 있습니다. 그냥(?) 60개의 데이터입니다.

이것은 그냥 단순한 60개의 데이터입니다.

향후 10개의 데이터를 예측해 보기로 합니다.

 

그런데 60개이니까,  혹시 12개월 5년 치 데이터가 아닐까? 하며 월별 데이터로도 생각할 수도 있습니다.

그럴 수도 있고, 그렇지 않을 수도 있습니다.

아무런 의미도 없는 그냥 단순한 데이터인데, 뜬금없이 60개니까 월별(^) 데이터로 

한정하는 것은 때로는 잘못된 경우가 되기도 합니다.

 

644 546 515 506 468 729 719 626 677 679 654 630 662 539 419 592 376 390 292 340
457 254 368 376 254 85 198 212 262 368 554 538 478 623 522 404 360 619 524 562
438 327 311 466 423 515 367 340 279 264 411 409 436 468 409 275 265 301 423 405
384 557 474 519 459 504 349 312 303 423 384 425 391 317 404 368 516 558 537 579
567 606 554 335 367 447 354 257 237 212 283 318 439 611 598 586 602 558 541 527

 

(1) 그래도 혹시 12개월 마다 계절성이 있는 것 아닌가?
(2) 아예 별 의미도 없는 데이터,  제멋대로 된 데이터가 아닐까?
     뭐 분석할 것도 없는 것 아닌가? 생각해 보시는 것도 필요합니다.

 

[실습]

 

(1) 일단 데이터를 읽어 온다. read.csv, read.table 등을 이용하기도 하고...

d:\r_stat\ar1.dat 

(2) 시계열로 바꾸기 전에 데이터 그림을 그려 본다.

... 흠..

setwd("d:/r_stat")
(ts01 <- scan("ar1.dat",what="")) # 데이터 읽어오기
ts01
plot(ts01)

시계열이 있는 것 같기도 하고, Random 하게 움직이는 데이터이기도 하고...
상관분석, 회귀분석을 할 때에도 그림을 그려보는 것이 필요합니다.

물론 전처리 과정에서는 필수적인 코스입니다 ^^^

 

(3) 도대체 이 숫자들이 시간에 따른 데이터이라면 데이터 내에 어떤 패튼이 있기나 한 건가?

     사실 이 데이터는 AR(1) 모형이 적합한 데이터입니다.

     그런데 사전에 알려 주지 않으면 어떻게 알 수 있을까?

 

(4) 이때 별 생각없이 ACF, PACF 를 구해 봅니다. 아까 (2)에서 별 생각없이 그래프로 그려 보는 것과 같은 개념입니다.

    ACF    Autocorrelation Function

    PACF  Partial Autocorrelation Function

 

acf(ts01)     # ts01 데이터를 이용하여 ACF 를 구해 봅니다.
Error in acf(ts01) : 'x'는 반드시 수치형이어야 합니다

ts01 <- as.numeric(ts01)    # ts01 을 수치형으로 바꿉니다.

acf(ts01)

pacf(ts01)

 

ACF 그림 - ACF가 천천히 감소하니까 일단 AR 모형인 듯
PACF 그림 - 1차에서만 의미가 있고 2차부터는 의미가 없어 AR(1) 인 듯

(5) ACF와  PACF를 보면 AR(1) 이 맞겠구나... (3)에서 언급한 내용이 조금 해결됩니다.

 

(6) AR(1) 모형이란 것을 알면, Z(t) = a + b1 Z(t-1) 와 같은 모형인데
    이제 계수(parameter) a와 b1의 값을 구하면 되겠네요.
    회귀분석과 비슷하게 구하면 됩니다.

 

arima(ts01,order=c(1,0,0))

arima 함수를 이용하는데, 처음 인수는 시계열데이터, 그 다음은 order 인수인데 (p,d,q) 형태로 들어갑니다.

p:AR 의 차수

d: difference 의 차수

q: MA 의 차수

여기서는 AR(1) 이니까 (1,0,0)  이 됩니다.

 

(7) 이렇게 구한 a와 b1 이 의미가 있는지를 살펴봅니다. 이때 하는 것이 표준편차의 1.96배 보다 크면
     a, b1 이 의미가 있고, 1.96 배 보다 작으면 a, b1 이 별로 의미가 없다...라고 결론을 내립니다.

     사실 이때 계수 a는 별로 따지지를 않습니다. 이는 회귀분석에서도 비슷한 개념입니다.

 

(8) (7)에서 계수가 의미가 있는 것이 알려지면 모형 확립은 완성되었습니다.

    이제 이 모형으로 예측(prediction)을 하면 됩니다.

 

predict(arima(ts01,order=c(1,0,0)),n.ahead=10 )

 

다음은 AR(2) 그리고 MA 모형에 대해서 설명드리겠습니다 ^^^

 

* 혹시 광고가 뜨는 경우가 있는데 관심이 있으시면 클릭해 보시면 감사
  구글에서 랜덤으로 들어가는 모양 ^^^

+ Recent posts