반응형

### 5주차, 3 인자분석 ###

 

아래 자료는 무료 검진프로그램인 PHI 개발하여 프로그램 유효서을 모니터링 자료이다. 11 검진 항목, 128명의 자료가 이으며 R 이용하여 주성분인자법(principal factor method) 이용한 인자분석을 보자.

 

1. 자료 가져오기 요약 통계

> setwd('C:/Rwork')

> med.data = read.table('medFactor.txt',header=T)

> head(med.data)

lung muscle liver skeleton kidneys heart step stamina stretch blow urine

1   20     16    52       10      24    23   19      20      23   29    67

2   24     16    52        7      27    16   16      15      31   33    59

3   19     21    57       18      22    23   16      19      42   40    61

4   24     21    62       12      31    25   17      17      36   36    77

5   29     18    62       14      26    27   15      20      33   29    88

6   18     19    51       15      29    23   19      20      50   37    54

> boxplot(med.data)

 

2. 초기 인자분석 실행하기

> library(psych)

> library(GPArotation) #인자회전

> med.factor = principal(med.data,rotate='none') #rotate ‘none’, ‘varimax’,’quanrtmax’, ‘oblimin’ 방법을 사용

> names(med.factor)

[1] "values"       "rotation"     "n.obs"        "communality"  "loadings"     "fit"        

[7] "fit.off"      "fn"           "Call"         "uniquenesses" "complexity"   "chi"        

[13] "EPVAL"        "R2"           "objective"    "residual"     "rms"          "factors"    

[19] "dof"          "null.dof"     "null.model"   "criteria"     "STATISTIC"    "PVAL"       

[25] "weights"      "r.scores"     "Structure"    "scores"     

> med.factor$values #고유근

[1] 3.3791814 1.4827707 1.2506302 0.9804771 0.7688022 0.7330511 0.6403994 0.6221934 0.5283718 0.3519301

[11] 0.2621928

> plot(med.factor$values,type='b')

 

>> med.factor$values #고유근을 통해 세 번째 인자까지 고유근이 1 이상인 것을 알 수 있다. 스크리 그림에서는 4번째 인자다음부터 그래프의 기울기가 완만해지는 것을 볼 수 있다. 따라서 유효한 인자의 수는 3-4개로 생각할 수 있다.

 

3. 인자 회전

(1) 직교회전(orthogonal rotation)의 Varimax

> med.varimax = principal(med.data,nfactors=3,rotate='varimax')

> med.varimax

 

>> 공통성은 많은 문항(변수) 중에서 서로연관이 있는 일부 문항들을 선택하기 위하여 인자분석을 실시하는 경우 문항선택의 기준으로 이용된다. 예를 들면, 문항 100개를 이용하여 인자분석을 결과 공통성이 0.3 이하인 것이 40개라면 40 문항은 다른 문항들과 공통점이 별로 없는 것으로 판단할 있다.


>> 고유분산은 u2 = 1 – h2(공통성) 공식으로 바로 구할 있다.lung 경우 0.53 = 1 – 0.47


>> ss loading 인자에 의해 설명되는 분산의 양을 나타낸다.

   RC1 2.39 = 0.662 + 0.112 + 0.782 + … + 0.252 + (-0.07)2


>> Proportion Var 인자가 설명하는 분산의 비율을 의미한다. RC1 분산의 22%, RC2 19%, RC3 14%, 아래 Cumulative var 누적값. 세 인자에 의해 설명되어지는 변동은 총 변동의 56%.



>> 회전된 요인에 대한 변수들의 요인 적재값을 보면 번째 인자는 lung, liver, kidneys, heart 높은 값을 가지며, step 상대적으로 높은 적재값을 가진다. (적재값이 뭘 의미하는지 잘 모르겠다 ㅠ)


번째 인자는 stamina, stretch, blow, urine 값이 높다. 마지막으로 세번째 인자는 muscle skeleton에서 높은 값을 가진다. 따라서 번째 인자는 생물의학(biomedical), 두번째 인자는 인체기능(performance), 세번째 인자는 근육골계통력(Muscular – skeletal strength)으로 특정 지을 있다.


>> 인자분석은 주성분분석과 달리 인자들의 결합으로 원변수들을 표현한다.

 Lung = 0.66 x factor1 + 0.12 x facotr2 + 0.16 x factor3 + error

 


인자점수 추정방법은 회귀분석, Barlett 등이 있는데, 아래는 회귀분석을 이용한 인자점수이다.

> head(med.varimax$scores)

             RC1        RC2         RC3

[1,] -0.11970907 -0.2574867 -0.74473196

[2,]  0.05696634 -0.4784611 -1.53199247

[3,] -0.59153602  0.8957933  1.52598533

[4,]  1.20919164  0.3179760 -0.42022213

[5,]  0.82291043  0.1513448 -0.02988744

[6,] -0.08606120  1.1451913  0.76290104 

 


인자분석의 시각화 몇가지 사례


plot(med.varimax)

> plot(med.varimax$loadings[,c(1:2)])

> text(med.varimax$loadings[,c(1:2)],colnames(med.data))


> biplot(med.varimax$scores,med.varimax$loadings)

> fa.diagram(med.varimax)


> omega(med.data)

 





3. 인자 회전

(2) 사곽회전(Oblique rotation) - Oblimin

> med.oblimin = principal(med.data,nfactors=3,rotate='oblimin',scores=T,method='regression')

> med.oblimin

 


>> Oblimin 이용한 인자분석에 대한 결과는 Varimax 마찬가지로 인자에 대해 묶여지는 변수는 같으며 다만 인자 적재값이 차이가 나는 것을 있다. Oblimin 방법을 이용한 결과에 대한 변수의 인자 모형은 아래와 같다.

Lung = 0.66 x factor1 + 0.01 x factor2 + 0.1 x facotr3

 

>> 회귀분석을 이용한 인자점수 함수식은 아래와 같다

Factor1 = 0.66 x lung + 0.02 x muscle + …+ (-0.09) x urine

 

인자점수는 아래와 같다.

> head(med.oblimin$scores)

TC1        TC2         TC3

[1,] -0.2325231 -0.2639103 -0.77351112

[2,] -0.1722964 -0.4641659 -1.54539480

[3,] -0.2852637  0.8308965  1.50251465

[4,]  1.1976234  0.4291411 -0.22225725

[5,]  0.8296036  0.2260879  0.09586509

[6,]  0.1766403  1.1289891  0.83993963 

 

 

4. 행렬도

> biplot(med.varimax)

 

 

참고문헌: 

[1] 다변량분석(김성수, 김현중, 정성석, 이용구 공저)

[2] R 프로그램에 기반한 다변량분석 및 데이터마이닝(이재길)


반응형

'KNOU > 3 다변량분석' 카테고리의 다른 글

2장 주성분분석 - heptathlon data / beer data  (0) 2017.03.27
Posted by 마르띤
,
반응형

[예제1] - heptathlon data



1. 자료 준비

> library(HSAUR2)

> library(tools)

> data("heptathlon")

> head(heptathlon)

> heptathlon R HSAUR2 패키지에 들어있는 자료로서, 1988 서울 올림픽 여성 7 경기에 대한 결과이다. Hurdles(110m 허들), highjump(높이뛰기), shot(포환던지기), run200m(200미터 달리기), longjump(멀리뛰기), javelin(창던지기), run800m(800미터 달리기),score(점수) 구성되어 있다.


2. 자료 변형

> heptathlon$hurdles <- max(heptathlon$hurdles) - heptathlon$hurdles

> heptathlon$run200m <- max(heptathlon$run200m) - heptathlon$run200m

> heptathlon$run800m <- max(heptathlon$run800m) - heptathlon$run800m

작은 값일수록 좋은 점수이기 때문에 최대값에서 빼줌


 

3. 주성분분석

> library(stats)

> hep.data <- heptathlon[,-8] #주성분점수에서 예외

> heptathlon.pca <- princomp(hep.data,cor=T,scores=T) #cor = T, 상관계수 행령, F 공분산 행렬, scores=T 주성분점수

> heptathlon.pca #변수가 7개이니, 주성분도 7

Call:

  princomp(x = hep.data, cor = T, scores = T)

 

Standard deviations:

  Comp.1    Comp.2    Comp.3    Comp.4    Comp.5    Comp.6    Comp.7

2.1119364 1.0928497 0.7218131 0.6761411 0.4952441 0.2701029 0.2213617

 

7  variables and  25 observations.

> summary(heptathlon.pca)

> 주성분의 표준편차, 분산비율을 알수 있다. 번째 주성분이 63.72%, 번째 성분이 17.06% 분산 비율을 나타내고 있으며, 2개의 주성분이 변이의 80.8% 정보를 가지고 있다.

 

> eig.val = heptathlon.pca$sdev^2 #주성분의 표준편차를 제곱

> eig.val #주성분 분산

Comp.1     Comp.2     Comp.3     Comp.4     Comp.5     Comp.6     Comp.7

4.46027516 1.19432056 0.52101413 0.45716683 0.24526674 0.07295558 0.04900101

> 1주성분의 분산이 4.46, 2주성분이 1.19, 3주성분이 0.52 유효한 주성분의 수는 2개임을 있다.

 

> par(mfrow=c(1,2))

> screeplot(heptathlon.pca)

> screeplot(heptathlon.pca,type='line',pch=19,main='Scree Plot of heptathlon.pca')

 

> 스크리 그림은 주성분의 고유값 크기 순으로 그린 것으로, 고유값이 1보다 주성분값이 2개임을 있다.

 

> heptathlon.pca$loadings[,1:2]

             Comp.1      Comp.2

hurdles  -0.4528710  0.15792058

highjump -0.3771992  0.24807386

shot     -0.3630725 -0.28940743

run200m  -0.4078950 -0.26038545

longjump -0.4562318  0.05587394

javelin  -0.0754090 -0.84169212

run800m  -0.3749594  0.22448984

> 상관계수행렬을 이용한 경우 1, 2주성분은 다음과 같다.

PC1 = -0.453 x hurldes – 0.377 x highjump - ․․․ - 0.374 x rum800m

PC2 = 0.157 x hurldes + 0.248 x highjump + ․․․ + 0.224 x rum800m

 

여기서 1주성분은 jvelin(창던지기) 제외한 모든 변수의 절대값이 값을 가지는 것으로 , 전반적인 체력 정도를 나타내는 성분이라고 있고, 2성분은 jvelin 계수가 다른 변수에 비해 상대적으로 절대값이 것을 , 창던지기와 밀접한 관련이 있는 성분으로 파악할 있다.

 


4. 주성분 점수 행렬도 (biplot)

> head(heptathlon.pca$scores[,1:2])

                         Comp.1      Comp.2

Joyner-Kersee (USA) -4.206435 -1.26802363

John (GDR)          -2.941619 -0.53452561

Behmer (GDR)        -2.704271 -0.69275901

Sablovskaite (URS)  -1.371052 -0.70655862

Choubenkova (URS)   -1.387050 -1.78931718

Schulz (GDR)        -1.065372  0.08104469

> biplot(heptathlon.pca,cex=0.7,col=c('red','blue'),main='Biplot')

 

> 첫번째 주성분을 x, 번째 주성분을 y축에 위치. Highjump, run800m, hurldes, longjump 서로 

가까운 곳에 위치하고 벡터의 방향(화살표) 또한 비슷하다. Ru200m, shot 가깝게 위치하고 있고, javelin 다른 변수들과 다른 방향에 위치하고 있다.





[예제2] - beer data


99명의 소비자가 맥주 구매에 중요하게 생각하는 요인에 대해 점수를 준 엑셀 자료이다. 독립변수는 7, 케이스 수는 99개인 자료이다. 점수는 0~100으로 되어 있다.

상관관계가 아닌 공분산을 활용해보자.

 

1. 자료 읽기

> beer<-read.csv('beer.csv',header=T)

> head(beer)

   cost size alcohol reputat color aroma taste

1   10   15      20      85    40    30    50

2  100   70      50      30    75    60    80

3   65   30      35      80    80    60    90

4    0    0      20      30    80    90   100

5   10   25      10     100    50    40    60

6   25   35      30      40    45    30    65

 

 

2. 상관계수행렬 산점도 행렬 보기

> round(cor(beer),2)

cost  size alcohol reputat color aroma taste

cost     1.00  0.88    0.88   -0.17  0.32 -0.03  0.05

size     0.88  1.00    0.82   -0.06  0.01 -0.29 -0.31

alcohol  0.88  0.82    1.00   -0.36  0.40  0.10  0.06

reputat -0.17 -0.06   -0.36    1.00 -0.52 -0.52 -0.63

color    0.32  0.01    0.40   -0.52  1.00  0.82  0.80

aroma   -0.03 -0.29    0.10   -0.52  0.82  1.00  0.87

taste    0.05 -0.31    0.06   -0.63  0.80  0.87  1.00

> 맥주의 가격(cost),크기(size), 알코올(alcohol)함량의 상관계수가 높아 서로 양의 상관관계가 있을 것으로 보인다. 또한 (color), (aroma), taste() 서로 상관계수가 높게 나타났다. 반면 평판(reputation) 비교적 다른 변수들과 상관계수가 높지 않으며, 다른 변수들과 모두 음의 상관 계수를 나타냈다.

 

> plot(beer[1:3])

 

 


3. 주성분분석 실행하기

> library(stats)

> beer.pca = princomp(beer,cor=F, scores=T) #cor = F 공분산

> beer.pca

Call:

  princomp(x = beer, cor = F, scores = T)

 

Standard deviations:

  Comp.1    Comp.2    Comp.3    Comp.4    Comp.5    Comp.6    Comp.7

39.117489 34.783073 17.974805  8.456192  6.479111  4.381410  2.579257

 

7  variables and  99 observations.

> summary(beer.pca)

 

 

> screeplot(beer.pca,type='l',pch=19)

> beer.pca$loadings[,1:3] #주성분계수

Comp.1      Comp.2     Comp.3

cost     0.7344197  0.31868378 -0.1902272

size     0.3942553  0.34017182  0.1274959

alcohol  0.2831873  0.06888179  0.0370581

reputat -0.3356901  0.49057105 -0.7861697

color    0.2657171 -0.34379889 -0.3862210

aroma    0.1398211 -0.48510439 -0.3693624

taste    0.1488354 -0.42871339 -0.2062207

> screeplot 보면 4번째 주성분부터 완만해짐로 유효한 주성분을 3개로 판단하여, 3개의 주성분 계수를 보자. 1주성분을 보면 cost, size, alcohol 점수가 높다. 비용, 크기, 알코올이 서로 연관이 있고, color, aroma, taste 주성분점수가 상대적으로 낮게 측정되어 있다. , , 맛이 서로 연관되어 있다.

PC1 = 0.734 x cost + 0.397 x size + … + 0.148 x taste

 


4. 주성분 분석 점수 행렬도

> head(beer.pca$scores[,1:3])

Comp.1    Comp.2     Comp.3

[1,] -41.435562  40.03360   4.340612

[2,]  91.264626  23.06214   7.798284

[3,]  31.574345  15.79053 -34.501270

[4,]  -9.770913 -59.53112  -0.351844

[5,] -39.816498  37.52890 -16.165598

[6,]  -1.035114  22.08072  34.760924

> biplot(beer.pca,col=c('red','blue'),main = 'Biplot of Beer.pca')

 

 


참고 문헌

[1] R을 이용한 다변량 분석, 김성수 김현중 정성석 이용구 공저

반응형
Posted by 마르띤
,