1234161139_top50.csv

R 입문 및 기초 프로그래밍

제 4장 행렬 표현 및 연산

<프로그램 소스>

# 4 행렬 표현 및 연산
# 4.1 행렬표현
# 4.1.1. 행렬 객체로의 데이터 변환


score1 <- read.csv("top50.csv", sep=",", header = TRUE)
score1
dim(score1)
names(score1)
mode(score1)
summary(score1)
summary(score1$HiCi)

sapply(score1, is.numeric) # 숫자형 변수는 TRUE
data1 <- score1[sapply(score1, is.numeric)] # 숫자형 변수만 추출
names(data1)

attach(data1) # 변수에 접근할 때 'data1$'을 안 쓰기 위함
summary(HiCi)

mdata2 <- data.matrix(data1) # data frame인 data1을 matrix mdata2로 변환
dim(mdata2)
is.matrix(mdata2)

mdata1 <- data.matrix(score1[,c(1,4:10)]) # raw data에서 바로 숫자형 변수로만 구성된 행렬 만들기
dim(mdata1)
is.matrix(mdata1)

mdata3 <- mdata2[1:10,c(1,6:8)] # mdata2에서 행으로 첫 10해, 열로 1,6,7,8열 추출
dim(mdata3)

# 4.1.2. 여러 형태의 행렬 데이터

mdata4 <- t(mdata3) # transpose of matrix
mdata4

udata1 <- array(1, c(10,4)) # arrray(2차원이면 행렬) 함수를 이용하여 모든 원소가 1인, 10 by 4 행렬 생성
udata1

matrix(1, nrow = 10, ncol = 1) # 10 by 1 vector 생성
array(1, dim = c(10, 1)) # 10 by 1 vector 생성

diag(4) # 4 by 4 identity 행렬 생성

xdata0 <- matrix(c(10,20,30,40,50,60),nrow=2,ncol=3) # matrix 함수의 사용법
xdata0
tdata0 <- matrix(c(10,20,30,40,50,60),nrow=3,ncol=2) # matrix 함수의 사용법
tdata0

tdata1 <- mdata2[1:10,] # 행렬 mdata2의 1행에서 10행까지
tdata2 <- mdata2[21:30,] # 행렬 mdata2의 21행에서 30행까지
tdata12 <- rbind(tdata1, tdata2) # 행렬을 위 아래로 붙이기
tdata12

xdata1 <- mdata2[,1:2] # 행렬 mdata2의 1열에서 2열까지
xdata2 <- mdata2[,4:5] # 행렬 mdata2의 4열에서 5열까지
xdata12 <- cbind(xdata1, xdata2)
xdata12

# 4.2 행렬조작 및 연산에 필요한 함수

# 4.2.1 행렬조작 및 연산에 필요한 함수

x <- matrix(c(5,6,7,8,9,10), nrow=2, ncol=3) # 2 by 3 행렬 만들기
x

y <- array(c(5,6,7,8,9,10), dim=c(2,3)) # 2 by 3 행렬 만들기
y

mean(x[2,]) # x 2행의 평균

apply(x,1,sum) # x 각 행(=1)의 합
rowSums(x) # x 각 행의 합

apply(x,2,sum) # x 각 열(=2)의 합
colSums(x) # x 각 열의 합

apply(x,1,mean) # x 각 행(=1)의 평균
rowMeans(x) # x 각 행의 평균

apply(x,2,mean) # x 각 열(=2)의 평균
colMeans(x) # x 각 열의 평균

data1 <- matrix(c(1,2,3,4), nrow = 2, ncol = 2) # 2 by 2 행렬 만들기
data1

data2 <- matrix(1, nrow = 2, ncol = 2) # 2 by 2 행렬 만들기
data2

new1 <- data1 + data2 # 두 행렬의 합
new1

new2 <- data1 - data2 # 두 행렬의 차
new2

new3 <- data1 %*% data2 # 두 행렬의 곱
new3

new4 <- data1 * data2 # 두 행렬 원소들의 곱
new4

new5 <- data1 %o% data2 # 두 행렬의 outer product
new5
dim(new5)

new6 <- data1 %x% data2 # 두 행렬의 Kronecker product
new6

new7 <- data1 * c(2,4) # 행렬과 벡터의 곱, 벡터를 반복하여 행렬과 크기를 맞춘 후 원소 대 원소 곱
new7

new8 <- data1 * seq(2,4,2) # 행렬과 벡터의 곱, 벡터를 반복하여 행렬과 크기를 맞춘 후 원소 대 원소 곱, seq(2,4,2)는 시작 2, 마지막 4로 하여 2개의 원소를 가진 벡터 생성
new8

new9 <- 1/new8 # 행렬 각 원소들의 역수
new9

new10 <- solve(new8) # 행렬의 역행렬(inverse)
new10
new8 %*% new10 # 역행렬 확인

diag(data1) # 행렬의 대각원소만 뽑아 벡터 만들기
diag(c(4:7)) # 벡터(c(4:7))를 이용하여 대각행렬(diagonal matrix) 만들기

t(data1) # 전치 행렬(transpose)

data1^2 # 각 원소들의 제곱

sum(data1^2) # 각 원소들을 제곱하여 합 즉 스칼라

solve(data1) # 행렬의 역행렬
data1 %*% solve(data1)

upper.tri(data1) # 상삼각행렬 원소는 TRUE
data1[upper.tri(data1)] <- 0 # 상삼각행렬의 원소를 0으로 만듦, 즉 하삼각행렬 만들기
data1

lower.tri(data2) # 하삼각행렬 원소는 TRUE
data2[lower.tri(data2)] <- 0 # 하삼각행렬의 원소를 0으로 만듦, 즉 상삼각행렬 만들기
data2

data1 <- matrix(c(1,2,3,4), nrow = 2, ncol = 2) # 2 by 2 행렬 생성
data1[upper.tri(data1, diag = T)] <- 0 # 상삼각 원소와 대각원소를 0으로 만듦
data1

data1 <- matrix(c(1,2,3,4), nrow = 2, ncol = 2) # 2 by 2 행렬 생성
data1[lower.tri(data1, diag = T)] <- 0 # 하삼각 원소와 대각원소를 0으로 만듦
data1

data1 <- matrix(c(1,2,3,4), nrow = 2, ncol = 2) # 2 by 2 행렬 생성
data2 <- crossprod(data1) # X'X, 즉 t(X) %*% X
data2

e1 <- eigen(data2) # 고유값(eigenvalue), 고유벡터(eigenvector) 구하기
e1
mode(e1) # data type is list

s1 <- svd(data2) # singula value decomposition
s1
mode(s1)

data4 <- data1 %*% t(data1)
data4
q1 <- qr(data4) # QR 분해
q1

c1 <- chol(data4)
c1

library(MASS)
g1 <- ginv(data1)
g1

# 4.2.2 행렬연산 예
score1 <- read.csv("top50.csv", sep=",", header = TRUE)
data1 <- score1[sapply(score1, is.numeric)] # 숫자형 변수만 추출
mdata2 <- data.matrix(data1) # data frame인 data1을 matrix mdata2로 변환
new1 <- mdata2[1:10, 2:7]
new1

sum1 <- t(rep(1,10)) %*% new1 # 각 변수의 합 구하기, apply(new1,2,sum) 또는 colSums(new1)과 동일
sum1

mean1 <- sum1/nrow(new1) # 각 변수의 평균 구하기, colMeans(new1) 또는 apply(new1, 2, mean)과 동일
mean1

xbar <- t(matrix(mean1, 6, 10)) # 각 변수의 평균을 이용하여
xbar
diff <- new1 - xbar # deviation 편차
diff
diff2 <- diff^2 # 편차 제곱
diff2
sumofdiff2 <- t(rep(1,10)) %*% diff2 # 편차 제곱의 합
xvar <- sumofdiff2 / (nrow(new1) - 1) # 각 변수의 분산
xvar

cov1 <- crossprod(diff) / (nrow(new1) - 1) # 분산-공분산 행렬, var(new1)과 동일
cov1

d1 <- diag(cov1) # cov1의 대각원소만 추출
d1

corr <- diag(1/sqrt(d1))%*% cov1 %*% diag(1/sqrt(d1)) # 상관 행렬, cor(new1)과 동일
corr


<실행결과>


R version 2.8.0 (2008-10-20)
Copyright (C) 2008 The R Foundation for Statistical Computing
ISBN 3-900051-07-0

R은 free 소프트웨어이고, [완전하게 무보증]입니다.
일정한 조건에 따르면, 자유롭게 이것을 재배포할수가 있습니다.
배포 조건의 상세한것에 대해서는 'license()' 또는 'licence()' 라고 입력해주십시오

R는 많은 공헌자에의한 공동 프로젝트입니다
더 자세한것에 대해서는 'contributors()'라고 입력해 주십시오.
또는, R나 R의 패키지를 출판물로 인용할때의 형식에 대해서는
'citation()'라고 입력해주십시오
'demo()'라고 입력하면, demos를 볼수가 있습니다.
'help()'라고 한다면, on-line help가 나옵니다.
'help.start()'로 HTML 브라우저에 의한 help가 보여집니다
'q()'라고 입력하면 R를 종료합니다
> # 4 행렬 표현 및 연산
> # 4.1 행렬표현
> # 4.1.1. 행렬 객체로의 데이터 변환
>
>
> score1 <- read.csv("top50.csv", sep=",", header = TRUE)
> score1
Rank Institution Country Total Alumni Award
1 1 Harvard Univ USA 100.0 98.6 100.0
2 2 Stanford Univ USA 77.2 41.2 72.2
3 3 Univ Cambridge UK 76.2 100.0 93.4
4 4 Univ California - Berkeley USA 74.2 70.0 76.0
5 5 Massachusetts Inst Tech (MIT) USA 72.4 74.1 78.9
6 6 California Inst Tech USA 69.0 59.3 66.5
7 7 Princeton Univ USA 63.6 61.0 76.8
8 8 Univ Oxford UK 61.4 64.4 59.1
9 9 Columbia Univ USA 61.2 77.8 58.8
10 10 Univ Chicago USA 60.5 72.2 81.9
11 11 Yale Univ USA 58.6 52.2 44.5
12 12 Cornell Univ USA 55.5 46.6 52.4
13 13 Univ California - San Diego USA 53.8 17.8 34.7
14 14 Tokyo Univ Japan 51.9 36.1 14.4
15 15 Univ Pennsylvania USA 51.8 35.6 35.1
16 16 Univ California - Los Angeles USA 51.6 27.4 32.8
17 17 Univ California - San Francisco USA 50.8 0.0 37.6
18 18 Univ Wisconsin - Madison USA 50.0 43.1 36.3
19 19 Univ Michigan - Ann Arbor USA 49.3 39.8 19.3
20 20 Univ Washington - Seattle USA 49.1 22.7 30.2
21 21 Kyoto Univ Japan 48.3 39.8 34.1
22 22 Johns Hopkins Univ USA 47.5 48.7 28.3
23 23 Imperial Coll London UK 46.4 20.9 38.1
24 24 Univ Toronto Canada 44.6 28.1 19.7
25 25 Univ Coll London UK 44.3 30.8 32.9
26 25 Univ Illinois - Urbana Champaign USA 43.3 41.7 37.4
27 27 Swiss Fed Inst Tech - Zurich Switzerland 43.2 40.3 37.0
28 28 Washington Univ - St. Louis USA 43.1 25.1 26.6
29 29 Rockefeller Univ USA 40.2 22.7 59.8
30 30 Northwestern Univ USA 39.5 21.8 19.3
31 31 Duke Univ USA 38.9 20.9 0.0
32 32 New York Univ USA 38.7 33.9 25.0
33 33 Univ Minnesota - Twin Cities USA 38.3 36.1 0.0
34 34 Univ Colorado - Boulder USA 37.8 16.6 29.8
35 35 Univ California - Santa Barbara USA 37.0 0.0 28.5
36 36 Univ British Columbia Canada 36.3 20.9 19.3
37 36 Univ Texas Southwestern Med Center USA 36.3 16.6 33.9
38 38 Vanderbilt Univ USA 35.1 12.6 30.2
39 39 Univ Utrecht Netherlands 34.9 30.8 21.4
40 40 Univ Texas - Austin USA 34.8 21.8 17.1
41 41 Univ Paris 06 France 33.9 35.7 23.9
42 42 Univ California - Davis USA 33.6 0.0 0.0
43 43 Pennsylvania State Univ - Univ Park USA 33.5 14.1 0.0
44 44 Rutgers State Univ - New Brunswick USA 33.4 15.4 20.4
45 45 Tech Univ Munich Germany 33.3 43.1 24.1
46 46 Karolinska Inst Stockholm Sweden 33.0 30.8 27.8
47 47 Univ Edinburgh UK 32.9 22.7 17.1
48 48 Univ Paris 11 France 32.5 33.3 34.2
49 48 Univ Southern California USA 32.5 0.0 27.3
50 48 Univ Pittsburgh - Pittsburgh USA 32.5 18.9 0.0
HiCi NS SCI Size
1 100.0 100.0 100.0 60.6
2 96.1 75.2 72.3 68.1
3 56.6 58.5 70.2 73.2
4 74.1 75.6 72.7 45.1
5 73.6 69.1 64.6 47.5
6 64.8 66.7 53.2 100.0
7 65.4 52.1 46.8 67.3
8 53.1 55.3 65.2 59.0
9 57.3 51.6 68.3 37.0
10 55.3 46.6 54.1 32.7
11 63.6 58.1 63.6 50.4
12 60.5 47.2 66.2 33.6
13 63.6 59.4 67.2 47.9
14 44.5 55.0 91.9 49.8
15 61.2 44.6 72.6 34.0
16 60.5 48.1 79.9 24.8
17 59.3 59.5 62.9 48.8
18 55.3 48.0 69.2 19.0
19 64.8 45.7 76.7 20.1
20 57.3 49.6 78.8 16.2
21 40.0 37.2 77.1 46.4
22 43.7 52.6 71.7 14.2
23 46.2 39.4 65.8 44.5
24 39.1 41.2 78.4 42.8
25 41.0 41.0 61.1 42.6
26 46.2 36.0 58.2 17.8
27 39.1 43.2 47.1 41.5
28 41.9 46.8 56.2 44.9
29 31.5 43.6 27.1 38.6
30 47.9 35.8 57.2 37.0
31 48.6 46.8 62.7 36.2
32 43.7 39.3 50.9 19.1
33 53.9 35.9 69.6 12.8
34 43.7 38.3 47.5 27.4
35 45.4 41.4 44.0 36.2
36 36.0 31.6 59.5 34.9
37 33.8 40.5 40.0 34.9
38 37.1 23.8 50.2 41.7
39 31.5 29.9 58.1 22.1
40 50.2 28.8 53.7 12.8
41 23.1 24.7 56.7 32.6
42 48.6 37.2 64.7 20.7
43 50.2 37.7 58.7 14.2
44 38.1 36.1 48.2 19.5
45 27.6 20.4 50.0 32.0
46 32.7 21.6 49.8 21.5
47 27.6 36.7 49.1 31.6
48 21.4 21.3 46.8 31.2
49 41.9 23.0 53.5 20.5
50 42.8 26.5 67.0 20.0
> dim(score1)
[1] 50 10
> names(score1)
[1] "Rank" "Institution" "Country" "Total" "Alumni"
[6] "Award" "HiCi" "NS" "SCI" "Size"
> mode(score1)
[1] "list"
> summary(score1)
Rank Institution Country Total
Min. : 1.00 California Inst Tech: 1 USA :35 Min. : 32.50
1st Qu.:13.25 Columbia Univ : 1 UK : 5 1st Qu.: 35.40
Median :25.00 Cornell Univ : 1 Canada : 2 Median : 43.80
Mean :25.40 Duke Univ : 1 France : 2 Mean : 47.55
3rd Qu.:37.50 Harvard Univ : 1 Japan : 2 3rd Qu.: 53.33
Max. :48.00 Imperial Coll London: 1 Germany: 1 Max. :100.00
(Other) :44 (Other): 3
Alumni Award HiCi NS
Min. : 0.00 Min. : 0.00 Min. : 21.40 Min. : 20.40
1st Qu.: 20.90 1st Qu.: 20.65 1st Qu.: 39.33 1st Qu.: 36.02
Median : 32.05 Median : 31.50 Median : 47.05 Median : 42.30
Mean : 35.68 Mean : 36.28 Mean : 49.63 Mean : 44.48
3rd Qu.: 43.10 3rd Qu.: 42.90 3rd Qu.: 58.80 3rd Qu.: 51.98
Max. :100.00 Max. :100.00 Max. :100.00 Max. :100.00

SCI Size
Min. : 27.10 Min. : 12.80
1st Qu.: 51.48 1st Qu.: 20.90
Median : 61.90 Median : 34.90
Mean : 61.54 Mean : 36.55
3rd Qu.: 69.50 3rd Qu.: 45.05
Max. :100.00 Max. :100.00

> summary(score1$HiCi)
Min. 1st Qu. Median Mean 3rd Qu. Max.
21.40 39.33 47.05 49.63 58.80 100.00
>
> sapply(score1, is.numeric) # 숫자형 변수는 TRUE
Rank Institution Country Total Alumni Award
TRUE FALSE FALSE TRUE TRUE TRUE
HiCi NS SCI Size
TRUE TRUE TRUE TRUE
> data1 <- score1[sapply(score1, is.numeric)] # 숫자형 변수만 추출
> names(data1)
[1] "Rank" "Total" "Alumni" "Award" "HiCi" "NS" "SCI" "Size"
>
> attach(data1) # 변수에 접근할 때 'data1$'을 안 쓰기 위함
> summary(HiCi)
Min. 1st Qu. Median Mean 3rd Qu. Max.
21.40 39.33 47.05 49.63 58.80 100.00
>
> mdata2 <- data.matrix(data1) # data frame인 data1을 matrix mdata2로 변환
> dim(mdata2)
[1] 50 8
> is.matrix(mdata2)
[1] TRUE
>
> mdata1 <- data.matrix(score1[,c(1,4:10)]) # raw data에서 바로 숫자형 변수로만 구성된 행렬 만들기
> dim(mdata1)
[1] 50 8
> is.matrix(mdata1)
[1] TRUE
>
> mdata3 <- mdata2[1:10,c(1,6:8)] # mdata2에서 행으로 첫 10해, 열로 1,6,7,8열 추출
> dim(mdata3)
[1] 10 4
>
> # 4.1.2. 여러 형태의 행렬 데이터
>
> mdata4 <- t(mdata3) # transpose of matrix
> mdata4
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
Rank 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0
NS 100.0 75.2 58.5 75.6 69.1 66.7 52.1 55.3 51.6 46.6
SCI 100.0 72.3 70.2 72.7 64.6 53.2 46.8 65.2 68.3 54.1
Size 60.6 68.1 73.2 45.1 47.5 100.0 67.3 59.0 37.0 32.7
>
> udata1 <- array(1, c(10,4)) # arrray(2차원이면 행렬) 함수를 이용하여 모든 원소가 1인, 10 by 4 행렬 생성
> udata1
[,1] [,2] [,3] [,4]
[1,] 1 1 1 1
[2,] 1 1 1 1
[3,] 1 1 1 1
[4,] 1 1 1 1
[5,] 1 1 1 1
[6,] 1 1 1 1
[7,] 1 1 1 1
[8,] 1 1 1 1
[9,] 1 1 1 1
[10,] 1 1 1 1
>
> matrix(1, nrow = 10, ncol = 1) # 10 by 1 vector 생성
[,1]
[1,] 1
[2,] 1
[3,] 1
[4,] 1
[5,] 1
[6,] 1
[7,] 1
[8,] 1
[9,] 1
[10,] 1
> array(1, dim = c(10, 1)) # 10 by 1 vector 생성
[,1]
[1,] 1
[2,] 1
[3,] 1
[4,] 1
[5,] 1
[6,] 1
[7,] 1
[8,] 1
[9,] 1
[10,] 1
>
> diag(4) # 4 by 4 identity 행렬 생성
[,1] [,2] [,3] [,4]
[1,] 1 0 0 0
[2,] 0 1 0 0
[3,] 0 0 1 0
[4,] 0 0 0 1
>
> xdata0 <- matrix(c(10,20,30,40,50,60),nrow=2,ncol=3) # matrix 함수의 사용법
> xdata0
[,1] [,2] [,3]
[1,] 10 30 50
[2,] 20 40 60
> tdata0 <- matrix(c(10,20,30,40,50,60),nrow=3,ncol=2) # matrix 함수의 사용법
> tdata0
[,1] [,2]
[1,] 10 40
[2,] 20 50
[3,] 30 60
>
> tdata1 <- mdata2[1:10,] # 행렬 mdata2의 1행에서 10행까지
> tdata2 <- mdata2[21:30,] # 행렬 mdata2의 21행에서 30행까지
> tdata12 <- rbind(tdata1, tdata2) # 행렬을 위 아래로 붙이기
> tdata12
Rank Total Alumni Award HiCi NS SCI Size
[1,] 1 100.0 98.6 100.0 100.0 100.0 100.0 60.6
[2,] 2 77.2 41.2 72.2 96.1 75.2 72.3 68.1
[3,] 3 76.2 100.0 93.4 56.6 58.5 70.2 73.2
[4,] 4 74.2 70.0 76.0 74.1 75.6 72.7 45.1
[5,] 5 72.4 74.1 78.9 73.6 69.1 64.6 47.5
[6,] 6 69.0 59.3 66.5 64.8 66.7 53.2 100.0
[7,] 7 63.6 61.0 76.8 65.4 52.1 46.8 67.3
[8,] 8 61.4 64.4 59.1 53.1 55.3 65.2 59.0
[9,] 9 61.2 77.8 58.8 57.3 51.6 68.3 37.0
[10,] 10 60.5 72.2 81.9 55.3 46.6 54.1 32.7
[11,] 21 48.3 39.8 34.1 40.0 37.2 77.1 46.4
[12,] 22 47.5 48.7 28.3 43.7 52.6 71.7 14.2
[13,] 23 46.4 20.9 38.1 46.2 39.4 65.8 44.5
[14,] 24 44.6 28.1 19.7 39.1 41.2 78.4 42.8
[15,] 25 44.3 30.8 32.9 41.0 41.0 61.1 42.6
[16,] 25 43.3 41.7 37.4 46.2 36.0 58.2 17.8
[17,] 27 43.2 40.3 37.0 39.1 43.2 47.1 41.5
[18,] 28 43.1 25.1 26.6 41.9 46.8 56.2 44.9
[19,] 29 40.2 22.7 59.8 31.5 43.6 27.1 38.6
[20,] 30 39.5 21.8 19.3 47.9 35.8 57.2 37.0
>
> xdata1 <- mdata2[,1:2] # 행렬 mdata2의 1열에서 2열까지
> xdata2 <- mdata2[,4:5] # 행렬 mdata2의 4열에서 5열까지
> xdata12 <- cbind(xdata1, xdata2)
> xdata12
Rank Total Award HiCi
[1,] 1 100.0 100.0 100.0
[2,] 2 77.2 72.2 96.1
[3,] 3 76.2 93.4 56.6
[4,] 4 74.2 76.0 74.1
[5,] 5 72.4 78.9 73.6
[6,] 6 69.0 66.5 64.8
[7,] 7 63.6 76.8 65.4
[8,] 8 61.4 59.1 53.1
[9,] 9 61.2 58.8 57.3
[10,] 10 60.5 81.9 55.3
[11,] 11 58.6 44.5 63.6
[12,] 12 55.5 52.4 60.5
[13,] 13 53.8 34.7 63.6
[14,] 14 51.9 14.4 44.5
[15,] 15 51.8 35.1 61.2
[16,] 16 51.6 32.8 60.5
[17,] 17 50.8 37.6 59.3
[18,] 18 50.0 36.3 55.3
[19,] 19 49.3 19.3 64.8
[20,] 20 49.1 30.2 57.3
[21,] 21 48.3 34.1 40.0
[22,] 22 47.5 28.3 43.7
[23,] 23 46.4 38.1 46.2
[24,] 24 44.6 19.7 39.1
[25,] 25 44.3 32.9 41.0
[26,] 25 43.3 37.4 46.2
[27,] 27 43.2 37.0 39.1
[28,] 28 43.1 26.6 41.9
[29,] 29 40.2 59.8 31.5
[30,] 30 39.5 19.3 47.9
[31,] 31 38.9 0.0 48.6
[32,] 32 38.7 25.0 43.7
[33,] 33 38.3 0.0 53.9
[34,] 34 37.8 29.8 43.7
[35,] 35 37.0 28.5 45.4
[36,] 36 36.3 19.3 36.0
[37,] 36 36.3 33.9 33.8
[38,] 38 35.1 30.2 37.1
[39,] 39 34.9 21.4 31.5
[40,] 40 34.8 17.1 50.2
[41,] 41 33.9 23.9 23.1
[42,] 42 33.6 0.0 48.6
[43,] 43 33.5 0.0 50.2
[44,] 44 33.4 20.4 38.1
[45,] 45 33.3 24.1 27.6
[46,] 46 33.0 27.8 32.7
[47,] 47 32.9 17.1 27.6
[48,] 48 32.5 34.2 21.4
[49,] 48 32.5 27.3 41.9
[50,] 48 32.5 0.0 42.8
>
> # 4.2 행렬조작 및 연산에 필요한 함수
>
> # 4.2.1 행렬조작 및 연산에 필요한 함수
>
> x <- matrix(c(5,6,7,8,9,10), nrow=2, ncol=3) # 2 by 3 행렬 만들기
> x
[,1] [,2] [,3]
[1,] 5 7 9
[2,] 6 8 10
>
> y <- array(c(5,6,7,8,9,10), dim=c(2,3)) # 2 by 3 행렬 만들기
> y
[,1] [,2] [,3]
[1,] 5 7 9
[2,] 6 8 10
>
> mean(x[2,]) # x 2행의 평균
[1] 8
>
> apply(x,1,sum) # x 각 행(=1)의 합
[1] 21 24
> rowSums(x) # x 각 행의 합
[1] 21 24
>
> apply(x,2,sum) # x 각 열(=2)의 합
[1] 11 15 19
> colSums(x) # x 각 열의 합
[1] 11 15 19
>
> apply(x,1,mean) # x 각 행(=1)의 평균
[1] 7 8
> rowMeans(x) # x 각 행의 평균
[1] 7 8
>
> apply(x,2,mean) # x 각 열(=2)의 평균
[1] 5.5 7.5 9.5
> colMeans(x) # x 각 열의 평균
[1] 5.5 7.5 9.5
>
> data1 <- matrix(c(1,2,3,4), nrow = 2, ncol = 2) # 2 by 2 행렬 만들기
> data1
[,1] [,2]
[1,] 1 3
[2,] 2 4
>
> data2 <- matrix(1, nrow = 2, ncol = 2) # 2 by 2 행렬 만들기
> data2
[,1] [,2]
[1,] 1 1
[2,] 1 1
>
> new1 <- data1 + data2 # 두 행렬의 합
> new1
[,1] [,2]
[1,] 2 4
[2,] 3 5
>
> new2 <- data1 - data2 # 두 행렬의 차
> new2
[,1] [,2]
[1,] 0 2
[2,] 1 3
>
> new3 <- data1 %*% data2 # 두 행렬의 곱
> new3
[,1] [,2]
[1,] 4 4
[2,] 6 6
>
> new4 <- data1 * data2 # 두 행렬 원소들의 곱
> new4
[,1] [,2]
[1,] 1 3
[2,] 2 4
>
> new5 <- data1 %o% data2 # 두 행렬의 outer product
> new5
, , 1, 1

[,1] [,2]
[1,] 1 3
[2,] 2 4

, , 2, 1

[,1] [,2]
[1,] 1 3
[2,] 2 4

, , 1, 2

[,1] [,2]
[1,] 1 3
[2,] 2 4

, , 2, 2

[,1] [,2]
[1,] 1 3
[2,] 2 4

> dim(new5)
[1] 2 2 2 2
>
> new6 <- data1 %x% data2 # 두 행렬의 Kronecker product
> new6
[,1] [,2] [,3] [,4]
[1,] 1 1 3 3
[2,] 1 1 3 3
[3,] 2 2 4 4
[4,] 2 2 4 4
>
> new7 <- data1 * c(2,4) # 행렬과 벡터의 곱, 벡터를 반복하여 행렬과 크기를 맞춘 후 원소 대 원소 곱
> new7
[,1] [,2]
[1,] 2 6
[2,] 8 16
>
> new8 <- data1 * seq(2,4,2) # 행렬과 벡터의 곱, 벡터를 반복하여 행렬과 크기를 맞춘 후 원소 대 원소 곱, seq(2,4,2)는 시작 2, 마지막 4로 하여 2개의 원소를 가진 벡터 생성
> new8
[,1] [,2]
[1,] 2 6
[2,] 8 16
>
> new9 <- 1/new8 # 행렬 각 원소들의 역수
> new9
[,1] [,2]
[1,] 0.500 0.1666667
[2,] 0.125 0.0625000
>
> new10 <- solve(new8) # 행렬의 역행렬(inverse)
> new10
[,1] [,2]
[1,] -1.0 0.375
[2,] 0.5 -0.125
> new8 %*% new10 # 역행렬 확인
[,1] [,2]
[1,] 1 0
[2,] 0 1
>
> diag(data1) # 행렬의 대각원소만 뽑아 벡터 만들기
[1] 1 4
> diag(c(4:7)) # 벡터(c(4:7))를 이용하여 대각행렬(diagonal matrix) 만들기
[,1] [,2] [,3] [,4]
[1,] 4 0 0 0
[2,] 0 5 0 0
[3,] 0 0 6 0
[4,] 0 0 0 7
>
> t(data1) # 전치 행렬(transpose)
[,1] [,2]
[1,] 1 2
[2,] 3 4
>
> data1^2 # 각 원소들의 제곱
[,1] [,2]
[1,] 1 9
[2,] 4 16
>
> sum(data1^2) # 각 원소들을 제곱하여 합 즉 스칼라
[1] 30
>
> solve(data1) # 행렬의 역행렬
[,1] [,2]
[1,] -2 1.5
[2,] 1 -0.5
> data1 %*% solve(data1)
[,1] [,2]
[1,] 1 0
[2,] 0 1
>
> upper.tri(data1) # 상삼각행렬 원소는 TRUE
[,1] [,2]
[1,] FALSE TRUE
[2,] FALSE FALSE
> data1[upper.tri(data1)] <- 0 # 상삼각행렬의 원소를 0으로 만듦, 즉 하삼각행렬 만들기
> data1
[,1] [,2]
[1,] 1 0
[2,] 2 4
>
> lower.tri(data2) # 하삼각행렬 원소는 TRUE
[,1] [,2]
[1,] FALSE FALSE
[2,] TRUE FALSE
> data2[lower.tri(data2)] <- 0 # 하삼각행렬의 원소를 0으로 만듦, 즉 상삼각행렬 만들기
> data2
[,1] [,2]
[1,] 1 1
[2,] 0 1
>
> data1 <- matrix(c(1,2,3,4), nrow = 2, ncol = 2) # 2 by 2 행렬 생성
> data1[upper.tri(data1, diag = T)] <- 0 # 상삼각 원소와 대각원소를 0으로 만듦
> data1
[,1] [,2]
[1,] 0 0
[2,] 2 0
>
> data1 <- matrix(c(1,2,3,4), nrow = 2, ncol = 2) # 2 by 2 행렬 생성
> data1[lower.tri(data1, diag = T)] <- 0 # 하삼각 원소와 대각원소를 0으로 만듦
> data1
[,1] [,2]
[1,] 0 3
[2,] 0 0
>
> data1 <- matrix(c(1,2,3,4), nrow = 2, ncol = 2) # 2 by 2 행렬 생성
> data2 <- crossprod(data1) # X'X, 즉 t(X) %*% X
> data2
[,1] [,2]
[1,] 5 11
[2,] 11 25
>
> e1 <- eigen(data2) # 고유값(eigenvalue), 고유벡터(eigenvector) 구하기
> e1
$values
[1] 29.8660687 0.1339313

$vectors
[,1] [,2]
[1,] 0.4045536 -0.9145143
[2,] 0.9145143 0.4045536

> mode(e1) # data type is list
[1] "list"
>
> s1 <- svd(data2) # singula value decomposition
> s1
$d
[1] 29.8660687 0.1339313

$u
[,1] [,2]
[1,] -0.4045536 -0.9145143
[2,] -0.9145143 0.4045536

$v
[,1] [,2]
[1,] -0.4045536 -0.9145143
[2,] -0.9145143 0.4045536

> mode(s1)
[1] "list"
>
> data4 <- data1 %*% t(data1)
> data4
[,1] [,2]
[1,] 10 14
[2,] 14 20
> q1 <- qr(data4) # QR 분해
> q1
$qr
[,1] [,2]
[1,] -17.2046505 -24.4120041
[2,] 0.8137335 0.2324953

$rank
[1] 2

$qraux
[1] 1.5812382 0.2324953

$pivot
[1] 1 2

attr(,"class")
[1] "qr"
>
> c1 <- chol(data4)
> c1
[,1] [,2]
[1,] 3.162278 4.4271887
[2,] 0.000000 0.6324555
>
> library(MASS)
> g1 <- ginv(data1)
> g1
[,1] [,2]
[1,] -2 1.5
[2,] 1 -0.5
>
> # 4.2.2 행렬연산 예
> score1 <- read.csv("top50.csv", sep=",", header = TRUE)
> data1 <- score1[sapply(score1, is.numeric)] # 숫자형 변수만 추출
> mdata2 <- data.matrix(data1) # data frame인 data1을 matrix mdata2로 변환
> new1 <- mdata2[1:10, 2:7]
> new1
Total Alumni Award HiCi NS SCI
[1,] 100.0 98.6 100.0 100.0 100.0 100.0
[2,] 77.2 41.2 72.2 96.1 75.2 72.3
[3,] 76.2 100.0 93.4 56.6 58.5 70.2
[4,] 74.2 70.0 76.0 74.1 75.6 72.7
[5,] 72.4 74.1 78.9 73.6 69.1 64.6
[6,] 69.0 59.3 66.5 64.8 66.7 53.2
[7,] 63.6 61.0 76.8 65.4 52.1 46.8
[8,] 61.4 64.4 59.1 53.1 55.3 65.2
[9,] 61.2 77.8 58.8 57.3 51.6 68.3
[10,] 60.5 72.2 81.9 55.3 46.6 54.1
>
> sum1 <- t(rep(1,10)) %*% new1 # 각 변수의 합 구하기, apply(new1,2,sum) 또는 colSums(new1)과 동일
> sum1
Total Alumni Award HiCi NS SCI
[1,] 715.7 718.6 763.6 696.3 650.7 667.4
>
> mean1 <- sum1/nrow(new1) # 각 변수의 평균 구하기, colMeans(new1) 또는 apply(new1, 2, mean)과 동일
> mean1
Total Alumni Award HiCi NS SCI
[1,] 71.57 71.86 76.36 69.63 65.07 66.74
>
> xbar <- t(matrix(mean1, 6, 10)) # 각 변수의 평균을 이용하여
> xbar
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 71.57 71.86 76.36 69.63 65.07 66.74
[2,] 71.57 71.86 76.36 69.63 65.07 66.74
[3,] 71.57 71.86 76.36 69.63 65.07 66.74
[4,] 71.57 71.86 76.36 69.63 65.07 66.74
[5,] 71.57 71.86 76.36 69.63 65.07 66.74
[6,] 71.57 71.86 76.36 69.63 65.07 66.74
[7,] 71.57 71.86 76.36 69.63 65.07 66.74
[8,] 71.57 71.86 76.36 69.63 65.07 66.74
[9,] 71.57 71.86 76.36 69.63 65.07 66.74
[10,] 71.57 71.86 76.36 69.63 65.07 66.74
> diff <- new1 - xbar # deviation 편차
> diff
Total Alumni Award HiCi NS SCI
[1,] 28.43 26.74 23.64 30.37 34.93 33.26
[2,] 5.63 -30.66 -4.16 26.47 10.13 5.56
[3,] 4.63 28.14 17.04 -13.03 -6.57 3.46
[4,] 2.63 -1.86 -0.36 4.47 10.53 5.96
[5,] 0.83 2.24 2.54 3.97 4.03 -2.14
[6,] -2.57 -12.56 -9.86 -4.83 1.63 -13.54
[7,] -7.97 -10.86 0.44 -4.23 -12.97 -19.94
[8,] -10.17 -7.46 -17.26 -16.53 -9.77 -1.54
[9,] -10.37 5.94 -17.56 -12.33 -13.47 1.56
[10,] -11.07 0.34 5.54 -14.33 -18.47 -12.64
> diff2 <- diff^2 # 편차 제곱
> diff2
Total Alumni Award HiCi NS SCI
[1,] 808.2649 715.0276 558.8496 922.3369 1220.1049 1106.2276
[2,] 31.6969 940.0356 17.3056 700.6609 102.6169 30.9136
[3,] 21.4369 791.8596 290.3616 169.7809 43.1649 11.9716
[4,] 6.9169 3.4596 0.1296 19.9809 110.8809 35.5216
[5,] 0.6889 5.0176 6.4516 15.7609 16.2409 4.5796
[6,] 6.6049 157.7536 97.2196 23.3289 2.6569 183.3316
[7,] 63.5209 117.9396 0.1936 17.8929 168.2209 397.6036
[8,] 103.4289 55.6516 297.9076 273.2409 95.4529 2.3716
[9,] 107.5369 35.2836 308.3536 152.0289 181.4409 2.4336
[10,] 122.5449 0.1156 30.6916 205.3489 341.1409 159.7696
> sumofdiff2 <- t(rep(1,10)) %*% diff2 # 편차 제곱의 합
> xvar <- sumofdiff2 / (nrow(new1) - 1) # 각 변수의 분산
> xvar
Total Alumni Award HiCi NS SCI
[1,] 141.4046 313.5716 178.6071 277.8179 253.5468 214.9693
>
> cov1 <- crossprod(diff) / (nrow(new1) - 1) # 분산-공분산 행렬, var(new1)과 동일
> cov1
Total Alumni Award HiCi NS SCI
Total 141.40456 93.79978 116.31756 163.09989 177.0446 148.88133
Alumni 93.79978 313.57156 154.54933 -23.75089 59.4420 133.71733
Award 116.31756 154.54933 178.60711 95.83022 106.5731 96.48956
HiCi 163.09989 -23.75089 95.83022 277.81789 235.2099 163.04867
NS 177.04456 59.44200 106.57311 235.20989 253.5468 190.39356
SCI 148.88133 133.71733 96.48956 163.04867 190.3936 214.96933
>
> d1 <- diag(cov1) # cov1의 대각원소만 추출
> d1
Total Alumni Award HiCi NS SCI
141.4046 313.5716 178.6071 277.8179 253.5468 214.9693
>
> corr <- diag(1/sqrt(d1))%*% cov1 %*% diag(1/sqrt(d1)) # 상관 행렬, cor(new1)과 동일
> corr
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1.0000000 0.44545289 0.7319210 0.82289014 0.9350220 0.8539261
[2,] 0.4454529 1.00000000 0.6530545 -0.08046952 0.2108123 0.5150283
[3,] 0.7319210 0.65305451 1.0000000 0.43020259 0.5008057 0.4924279
[4,] 0.8228901 -0.08046952 0.4302026 1.00000000 0.8862300 0.6671890
[5,] 0.9350220 0.21081234 0.5008057 0.88622996 1.0000000 0.8155206
[6,] 0.8539261 0.51502833 0.4924279 0.66718902 0.8155206 1.0000000
>
>

+ Recent posts