R의 plotting system에는 크게 (1) Base Graphics, (2) Lattice, (3) ggplot2 의 3가지가 있습니다. 이전 포스팅에서 ggplot2 plotting system을 활용한 그래프 그리기를 소개하였다면, 이제부터는 쉽고 빠르게, 대화형으로 직관적으로 그래프를 단계적으로 그려나갈 수 있는 Base Graphics plotting system에 대해서 알아보겠습니다. 


Base Graphics system 은 기본 뼈대에 해당하는 (1) 높은 수준의 그래프 함수 (High Level Graphics facilities), 여기에 살을 하나, 둘씩 차근 차근 더해가는 (2) 낮은 수준의 그래프 함수 (Low Level Graphics facilities), 색깔이나 모양, 선 형태, 마진 등의 다양한 그래프 특성에 해당하는 옵션을 설정하는 (3) 그래픽 모수 (Graphic Parameters) 를 조합하여 단계적으로 (step by step) 그래프를 대화형으로 그려나가게 됩니다.






아래에 산점도(scatter plot)을 가지고 위에서 소개한 용어들이 의미하는 바를 예를 들어 설명해보도록 하겠습니다.



> library(MASS)
> attach(Cars93)
> 
> # high level graphics facility : plot()
> # graphics parameters : type, pch, col, etc.
> plot(MPG.highway ~ Weight, type = "p", pch = 19, col = "black")
> 
> # low level graphics facility : abline(), title(), text()
> # graphics parameters : labels, cex, pos, col, etc.
> abline(lm(MPG.highway ~ Weight))
> text(Weight, MPG.highway, labels = abbreviate(Manufacturer, minlength = 5), 
+      cex = 0.6, pos = 2, col = "blue")

>

> detach(Cars93)


 





위 그래프의 R함수에서 높은 수준의 그래프 함수, 낮은 수준의 그래프 함수, 그래프 모수에 해당하는 부분을 각 각 표기하면 아래와 같습니다.  높은 수준의 그래프 함수 plot()으로 먼저 뼈대를 잡아놓고, 낮은 수준의 그래프 함수 abline()로 차의 무게(Weight)와 고속도로연비(MPG.highway) 간 회귀선을 적합시킨 선을 추가하고 text()로 차 제조사 이름을 명기하였습니다. 이때 그래프 모수(parameters)로 그래프의 형태(type), 점의 형태(pch), 색깔(col), 레이블(labels), default 대비 확대 배수(cex), 다른 축과 교차되는 좌표(pos) 등을 옵션으로 설정하게 됩니다.







높은 수준의 그래프 함수 (High Level Graphics facilities) 들을 표로 정리해보면 아래와 같습니다. 


Graph

High Level Graphics

Functions of Base Graphics system

histogram

hist()

Box-and-Whiskers Plot

boxplot()

Stem and Leaf Plot

stem()

Bar Plot

barplot()

Cleveland Dot Plot

dotchart()

Pie Plot

pie()

Scatter Plot

plot(x, y)

Scatter Plot Matrix

plot(dataframe)

cf) other package: scatterplotMatrx()

Line Plot

plot(x, y, type=“l”)

High Density Needle Plot

plot(x, y, type=“h”)

Both Dot and Line Plot

plot(x, y, type=“b”)

Overlapped Dot and Line Plot

plot(x, y, type=“o”)

  Step Plot

plot(x, y, type=“s”)

Empty Plot

plot(x, y, type=“n”)




디폴트 모수로 해서 간단하게 그래프를 예로 들어보겠습니다.


일변량 연속형 데이터 그래프 (plot for 1 variable, continuous data)

  • Histogram : hist()
> # histogram : hist()
> hist(Cars93$MPG.highway, main = "histogram : hist()")



 



  • box-and-whisker plot : boxplot()
> # box-and-whisker plot : boxplot()
> boxplot(Cars93$MPG.highway, main = "box-and-whisker plot : boxplot()")



 



  • stem and leaf plot : stem()

 

> # stem and leaf plot : stem()
> stem(Cars93$MPG.highway)

  The decimal point is 1 digit(s) to the right of the |

  2 | 00112233334444
  2 | 55555555666666666667777778888888888999999
  3 | 000000000111111123333333444
  3 | 6667778
  4 | 13
  4 | 6
  5 | 0





일변량 범주형 자료 그래프 (plot for 1 variable, categorical data)
  • bar plot : barplot()

 

> ##-------- plot for one variable, categorical data
> # bar plot : barplot()
> table_cyl <- table(Cars93$Cylinders)
> barplot(table_cyl, main = "bar plot : barplot()")





  • Cleveland dot plot : dotchart()
> # cleveland dot plot : dotchart()
> table_cyl <- table(Cars93$Cylinders) # frequency table
> Cylinders <- names(table_cyl) # names for label
> 
> dotchart(as.numeric(table_cyl), labels = Cylinders, main = "cleveland dot plot")



 




  • pie chart : pie()
> # pie chart : pie()
> table_cyl <- table(Cars93$Cylinders) # frequency table
> Cylinders <- names(table_cyl) # names for label
> 
> pie(table_cyl, labels = Cylinders, main = "pie chart")



 





이변량 연속형변수 그래프 (plot for 2 variables, continuous data)
  • 산점도 (scatter plot)
> ##----- plot for 2 variables, continuous data
> # scatter plot : plot(x, y)
> with(Cars93, plot(Weight, MPG.highway, main = "scatter plot : plot(x, y)"))






  • scatter plot matrix : plot(dataframe), pairs(), scatterplotMatrix(dataframe)

>

> # scatter plot matrix : plot(dataframe)

> > str(Cars93) 'data.frame': 93 obs. of 27 variables: $ Manufacturer : Factor w/ 32 levels "Acura","Audi",..: 1 1 2 2 3 4 4 4 4 5 ... $ Model : Factor w/ 93 levels "100","190E","240",..: 49 56 9 1 6 24 54 74 73 35 ... $ Type : Factor w/ 6 levels "Compact","Large",..: 4 3 1 3 3 3 2 2 3 2 ... $ Min.Price : num 12.9 29.2 25.9 30.8 23.7 14.2 19.9 22.6 26.3 33 ... $ Price : num 15.9 33.9 29.1 37.7 30 15.7 20.8 23.7 26.3 34.7 ... $ Max.Price : num 18.8 38.7 32.3 44.6 36.2 17.3 21.7 24.9 26.3 36.3 ... $ MPG.city : int 25 18 20 19 22 22 19 16 19 16 ... $ MPG.highway : int 31 25 26 26 30 31 28 25 27 25 ... $ AirBags : Factor w/ 3 levels "Driver & Passenger",..: 3 1 2 1 2 2 2 2 2 2 ... $ DriveTrain : Factor w/ 3 levels "4WD","Front",..: 2 2 2 2 3 2 2 3 2 2 ... $ Cylinders : Factor w/ 6 levels "3","4","5","6",..: 2 4 4 4 2 2 4 4 4 5 ... $ EngineSize : num 1.8 3.2 2.8 2.8 3.5 2.2 3.8 5.7 3.8 4.9 ... $ Horsepower : int 140 200 172 172 208 110 170 180 170 200 ... $ RPM : int 6300 5500 5500 5500 5700 5200 4800 4000 4800 4100 ... $ Rev.per.mile : int 2890 2335 2280 2535 2545 2565 1570 1320 1690 1510 ... $ Man.trans.avail : Factor w/ 2 levels "No","Yes": 2 2 2 2 2 1 1 1 1 1 ... $ Fuel.tank.capacity: num 13.2 18 16.9 21.1 21.1 16.4 18 23 18.8 18 ... $ Passengers : int 5 5 5 6 4 6 6 6 5 6 ... $ Length : int 177 195 180 193 186 189 200 216 198 206 ... $ Wheelbase : int 102 115 102 106 109 105 111 116 108 114 ... $ Width : int 68 71 67 70 69 69 74 78 73 73 ... $ Turn.circle : int 37 38 37 37 39 41 42 45 41 43 ... $ Rear.seat.room : num 26.5 30 28 31 27 28 30.5 30.5 26.5 35 ... $ Luggage.room : int 11 15 14 17 13 16 17 21 14 18 ... $ Weight : int 2705 3560 3375 3405 3640 2880 3470 4105 3495 3620 ... $ Origin : Factor w/ 2 levels "USA","non-USA": 2 2 2 2 2 1 1 1 1 1 ... $ Make : Factor w/ 93 levels "Acura Integra",..: 1 2 4 3 5 6 7 9 8 10 ... >

> Cars93_subset <- Cars93[,c("Weight", "Horsepower", "MPG.highway", "MPG.city")]
> plot(Cars93_subset, main = "scatter plot matrix : plot(dataframe)")
> 




>

> # scatter plot matrix : scatterplotMatrix(dataframe)

> library(car) > scatterplotMatrix(Cars93_subset, main = "scatter plot matrix : scatterplotMatrx(dataframe)")

>



 



  • plot by various types : plot(x, y, type = "l, h, b, o, s, n")
> ##--------
> # plot by various type : l, h, b, o, s, n
> # order by Weight
> Cars93_1 <- Cars93[order(Cars93$Weight),]
> 
> # dividing window frame
> par(mfrow = c(3, 2))
> 
> # plots by type
> attach(Cars93_1)


> # line plot
> plot(MPG.highway ~ Weight, type = "l", main = "type = l") 
> 
> # high density needle plot
> plot(MPG.highway ~ Weight, type = "h", main = "type = h") 
> 
> # both dot and line plot
> plot(MPG.highway ~ Weight, type = "b", main = "type = b") 
> 
> # overlapped dot and line plot
> plot(MPG.highway ~ Weight, type = "o", main = "type = o") 
> 
> # step plot
> plot(MPG.highway ~ Weight, type = "s", main = "type = s") 
> 
> # empty plot
> plot(MPG.highway ~ Weight, type = "n", main = "type = n") 
> 
> detach(Cars93_1)




위의 그래프들은 높은 수준의 그래프 함수의 그래프 함수에 대해서 간략하게 소개하기 위해서 모수를 거의 손대지 않고 그린 그래프들입니다. 낮은 수준의 그래프 함수와 주요 모수 (parameter) 설정하는 방법에 대해서는 다음번 포스팅에서 소개하도록 하겠습니다.


많은 도움 되었기를 바랍니다.

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡' 단추를 꾸욱 눌러주세요.^^


 

728x90
반응형
Posted by Rfriend
,

지난번 포스팅에서 벡터의 곱 첫번째로 내적 (inner product, dot product, scalar product, projection product)에 대해서 알아보았습니다.

 

이번에는 벡터의 곱 두번째로 벡터곱(vector product, cross product)과 외적 (outer product)에 대해서 알아보도록 하겠습니다.  

 

아래에는 내적과 벡터곱(vector product, cross product) 비교한 표입니다. 처음 보면 잘 이해가 안갈 수도 있는데요, 아래의 내용을 한번 쭉 보시고 마지막에 요약 정리할 때 참고하시면 도움이 될 듯 합니다. 큰 차이점 하나만 들자면, 내적(inner product)은 계산 결과로 스칼라(scalar)가 되지만, 벡터곱(vector product)은 계산 결과가 두 벡터 a와 b에 수직이 되는 벡터(vector)가 되고, 외적(outer product)은 행렬(matrix)가 된다는 점입니다. 

 

 

[ 내적와 벡터곱 비교 ]

(comparison between inner product and vector product)

 

vector product, cross product, directed area product

 

먼저 벡터곱(vector product, cross product, directed area product)에 대해서 차근차근 설명해 보겠습니다. 그리고 마지막에 외적(outer product) 계산법에 대해서 간략히 소개하겠습니다. 

 

 

(1) 벡터곱의 표기 (notation and symbol of vector product)

 

두 벡터 a, b의 벡터곱은 a x b 라고 쓰고 "a cross b"라고 읽습니다.  벡터곱을 교차곱 (cross product)이라고도 부르는 이유가 여기에 있습니다.  (참고로, 내적은 a·b 로 표기하고 a dot b 라고 읽으며 dot product 이라고도 함)

 

 

 

(2) 벡터곱의 정의 (definition of vector product) 

 

두 벡터 a와 b에 모두 수직이 되는 벡터로서, v와 수직이 되는 두 벡터 a와 b는 공간 속의 평면 위에 있는 한 평행사변형의 두 변을 이루게 되며, 그 벡터의 길이(힘의 크기) |v|는 평행사변형의 면적과 같습니다.

 

 

 

 

 

 

(3) 벡터곱 계산을 쉽게 기억하는 방법 (easy way to memorize vector product calculation)

 

내적 대비 벡터곱 계산하는 방법이 많이 어려워보일 수 있는데요, 아래처럼 벡터 a와 b의 component를 두번씩 세로로 써 놓고 두번재째 행부터 순차적으로 대각선으로 곱하고 빼나가면 v1, v2, v3를 구할 수 있습니다.

 

 

 

 

(4) 벡터곱을 계산하는 R 사용자 정의 함수 (R user-defined function of vector product)

 

벡터곱(vector product, cross product)을 구하는 R 패키지, 함수가 분명 있을 것 같은데요, 제가 아직 못찾았습니다.  그래서 위에 소개한 공식대로 아래에 사용자 정의함수 프로그래밍 한거 소개합니다.  혹시라도 외적 구하는 R 패키지랑 함수 알고 계신분은 댓글로 공유해주시면 감사하겠습니다. 

 

##--------- 
# (2) cross product of vector with 3 components : user defined function 
# a * b = |a|*|b|*sin(theta)*n
 
cross_prod_fun_v3 <- function(a, b) { 
     if(length(a)!=3 | length(b) !=3) stop('number of vector component is not 3') 
     
     c_x <- a[2]*b[3] - a[3]*b[2] 
     c_y <- a[3]*b[1] - a[1]*b[3] 
     c_z <- a[1]*b[2] - a[2]*b[1] 
     cross_prd <- c(c_x, c_y, c_z) 
     
     return(cross_prd) 
 } 

a <- c(2, 3, 4) 
b <- c(5, 6, 7) 

cross_prod_fun_v3(a=a, b=b) 
[1] -3 6 -3

 

 

R의 %*%, crossprod() 함수는 외적이 아니라 내적을 계산한 결과를 내보내주므로 헷갈리지 않도록 해야겠습니다.  아래에 a=(2, 3, 4)와 b=(5, 6, 7) 벡터를 가지고 %*%, crossprod() 함수를 적용해봤더니 내적으로 계산해서 스칼라(scalar)가 나온것을 알 수 있습니다. (not vector, but scalar)

 

# cautions: crossprod() function of R produces dot product, not cross product 
a <- c(2, 3, 4) 
b <- c(5, 6, 7) 

a %*% b 
# dot product [,1] [1,] 56 


crossprod(a, b) 
# is the same with dot product [,1] [1,] 56 


t(a) %*% b # is the same with dot product [,1] [1,] 56

 

 

 

(5) 오른손 법칙 (Right-handed triple), 오른손 직교좌표계 (Right-handed Cartesian coordinate system)

 

a와 b 두 벡터의 벡터곱이 벡터 a와 b에 직교 (right angle)하는 외적 v 벡터의 방향을 알 수 있는 방법으로 오른손 좌표계(Right-handed Cartesian coordinate system)을 사용합니다.  오른손의 엄지가 벡터 a, 오른손의 검지가 벡터 b, 그리고 오른손의 중지를 엄지와 검지랑은 수직이 되게 폈을 때가 외적 벡터 v 가 되겠습니다.  아래 그림을 참고하시지요. 

 

 

오른손 법칙은 오른손 나사를 연상해도 되는데요, 벡터 a를 벡터 b의 방향으로 각도 θ만큼 회전시켰을 때 오른손 나사가 나아가는 방향과 같은 방향이 외적 v의 방향이 되겠습니다. 

 

왼손 좌표계도 있는데요, 오른손 좌표계와는 중지의 방향이 반대가 된다는 점만 다릅니다.

 

 

 

(6) 길이와 싸인함수를 이용한 벡터곱 구하기 (vector product calculation with length and a sine function)

 

내적(inner product)을 계산할 때는 길이(length)와 코사인(cosine)을 사용해서 구하는데요, 벡터곱(vector product)은 벡터의 길이(length)와 싸인(sine) 함수를 이용해서 구할 수 있습니다.  (증명은 생략합니다)

 

 

 

 

(7) 두 벡터로 이루어진 평행사변형의 넓이 계산 (calculation of the area of the parallelogram spanned by vector a and b)

 

두 벡터 a와 b의 벡터곱(vector product, cross product)은 두 벡터로 이루어진 평행사변형의 넓이와 같다고 하였습니다.  두 벡터 a와 b로 이루어진 평행사변형의 넓이를 구해보면 (6)번에서 제시한 두 벡터의 벡터곱 공식과 일치함을 알 수 있습니다.  두 벡터로 이루어진 평행사변형의 넓이를 구하고 싶으면 두 벡터의 벡터곱을 구하면 되겠습니다.

 

 

 

 

 

 

(8) 벡터곱의 성질 (properties of vector product)

 

벡터곱은 내적과 같은 성질도 있고 다른 성질도 있습니다.  임의의 실수와의 곱은 순서에 상관없이 모두 동일하다는 점과 분배법칙(distributive law)을 만족한다는 점은 내적과 벡터곱이 동일합니다. 

 

반면에 내적은 교환법칙(commutative law)이 성립하지만, 벡터곱은 교환법칙이 성립하지 않는다(anti-commutative)는 점에서 차이가 있습니다.  그리고 벡터곱은 결합법칙도 일반적으로 성립하지 않는다(not associative)는 점 때문에 괄호를 생략하면 안됩니다. 내적은 결과가 scalar 이지만 벡터곱은 결과가 vector이므로 서로 다른 성질을 가지게 되는 것입니다.  

 

 

 

 

(9) 벡터곱의 최대, 최소 (max, min of vector product)

 

(6)번에서 벡터곱을 구하는 공식이 v = |a|*|b|*sin(θ)n 이라고 하였는데요, 이 공식에서 두 벡터가 수직(angle between a and b = 90 degree)일 때 벡터곱이 최대(outer product is max), 두 벡터가 평행일 때(angle between a and b = 0 degree) 벡터곱이 최소(outer product is min)임을 유추할 수 있습니다.

 

 

 

(10) 외적 (outer product)

 

위에서 소개한 두 벡터의 벡터곱(vector product, cross product)의 결과는 벡터인 반면에, 두 벡터의 외적(outer product)의 결과는 행렬입니다. 두 벡터의 외적(outper product)은 아래와 같이 계산합니다. 

 

 

 

많은 도움 되었기를 바랍니다.

 

행렬, 벡터 관련 포스팅은 아래 링크를 걸어놓았습니다.

 

행렬 기본 이해

특수한 형태의 행렬

가우스 소거법을 활용한 역행렬 계산

행렬의 기본 연산 (+, -, *, /, ^, %*%, colMeans(), rowMeans(), colSums(), rowSums()) 

벡터의 기본 이해와 연산 (vector: addition, subtraction, multiplication by scalar)

벡터의 곱 (1) 내적 (inner product, dot product, scalar product, projection product)

 

이번 포스팅이 도움이 되었다면 아래의 공감 ♡ 꾸욱~ 눌러주세요. ^^

 

728x90
반응형
Posted by Rfriend
,

지난번 포스팅에서는 벡터의 기본 개념과 벡터의 합, 차, 스칼라배에 대해서 알아보았습니다.


이번 포스팅에서는 2가지의 벡터의 곱중에서 먼저 내적(inner product, dot product, scalar product,  projection product)을 소개하고, 다음번 포스팅에서 외적(outer product, cross product, vector product, directed area product)에 대해서 다루도록 하겠습니다.



[ 벡터 곱 2가지 종류 (2 types of Vector Multiplication) ]



내적(inner product, dot product)과 외적(outer product, cross product)을 비교해보면 아래 표와 같은데요, 처음에 보면 무슨 뜻인가 이해가 안갈 수도 있겠습니다. 내적과 외적의 설명을 다 읽어보시고 마지막으로 종합해서 다시 한번 정리하는데 활용하면 좋겠습니다.



[ 벡터의 내적과 외적 비교 ]

(comparison between inner(or dot) product and outer(or cross) product of vector)






이제 내적(inner product)에 대해서 하나씩 설명해보도록 하겠습니다.



(1) 내적의 표기 (notation and symbol of the inner product)


두 벡터의 내적(inner product)은 아래 그림처럼 「.」(dot)으로 표기하며, 이래서 점곱(dot product)이라고도 말합니다.  혹은 (a, b)와 같이 표기하기도 합니다.  결과값이 스칼라이기 때문에 스칼라곱(scalar product)이라고도 하며, 계산할 때 한쪽 벡터의 코사인값을 사용하기 때문에 (즉, 한쪽 벡터에 직사광선을 쪼였을 때 그 그림자에 해당하는 코사인값을 사용) 영사곱(projection product)이라고도 말합니다.


똑같은 개념을 두고 왜 이리 표현하는 말들이 많은지 의아할 수도 있겠는데요, 대수학, 기하학, 물리학 등의 학문영역별로 명칭, 표기가 다르다는 정도만 이해하면 되겠습니다.  최적화에서도 민감도분석할 때 보면 수학자는 쌍대변수(dual variable)이라고 말하는데 경제학자들은 잠재가격(shadow price)라고 말하거든요.  헛갈리는데 다 같은 말입니다. ^^;







(2) 내적의 정의 (difinition of the inner product)


R^n 내의 두 열 벡터 a, b에 대하여 곱 T(a)b 의 결과인 단일 성분을 갖는 1 * 1 행렬, 즉 하나의 실수인 Scalar 가 내적(inner product)이 되겠습니다.  그 수식을 풀어써보면 아래와 같은 계산식이 되며, 그 output은 스칼라(Scalar)가 됩니다. 


참고로, 외적(outer product)은 output이 벡터(Vector)가 됩니다. 




아래에 두개의 성분(2차원, 2 dimension)을 가지는 열벡터 a=(-5, 6), b=(3, 9)의 내적 예와 세 개의 성분(3차원, 3 dimensions)을 가지는 열벡터 c=(5, 3, 6), d=(2, 7, 4)에 대한 내적 계산을 소개하였습니다.  같은 행의 component끼리 각각 곱해서 모두 더하면 됩니다.







위의 2개의 문제를 R의 '%*%' 함수를 사용해서 풀어보면 아래와 같습니다. 

위에서 소개한 공식을 가지고 아래에 사용자정의 함수도 한번 만들어봤습니다.  R에 내적계산을 위한 함수로 '%*%'가 있기 때문에 굳이 사용자정의함수를 사용할 필요는 없겠습니다만, 개념을 이해하는 차원에서 참고하시기 바랍니다.



> ##--------------------------------------
> ## multiplying a vector by a vector
> ##--------------------------------------
> 
> 
> ##---------
> ## (1) dot product
> 
> ## vector with 2 components (dimensions)
> a <- c(-5, 6)
> b <- c(3, 9)
> 
> # dot product of vector with 2 components (dimensions) : (a) %*%
> a %*% b
     [,1]
[1,]   39
> 
> 
> # dot product of vector with 2 components : (b) user defined function
> dot_prod_fun_v2 <- function(a, b) {
+   if(length(a)!=2 | length(b) !=2) stop('number of vector component is not 2')
+   d <- a[1]*b[1] + a[2]*b[2]
+   return(d)
+ }
> 
> dot_prod_fun_v2(a=a, b=b)
[1] 39
> 
> 
> 
> ## vector with 3 components (dimensions)
> c <- c(5, 3, 6)
> d <- c(2, 7, 4)
> 
> # dot product of vector with 3 components (dimensions) : (a) %*%
> c %*% d
     [,1]
[1,]   55
> 
> 
> # dot prduct of vector with 3 components : (b) user defined function
> dot_prod_fun_v3 <- function(c, d) {
+   if(length(c)!=3 | length(d) !=3) stop('number of vector component is not 3')
+   dot_prd <- c[1]*d[1] + c[2]*d[2] + c[3]*d[3]
+   return(dot_prd)
+ }
> dot_prod_fun_v3(c=c, d=d)
[1] 55
 




(3) 내적의 성질 (properties of the inner product)


수학자들이 정의하는 실내적공간(real inner product space, or real pre-Hilbert space)의 정의와 공리는 아래와 같습니다.  실내적의 공리로 교환법칙(commutative law), 임의의 실수 c곱의 자유로운 이동 가능, 분배법칙(distributive law) 등의 공리도 아래에 소개하였습니다.





(4) 내적의 계산 원리, 방법 1 (1st formula of the inner product calculation)


내적을 계산하는 원리, 방법중에 벡터를 성분분해해서 각 성분들의 벡터의 길이(length of vector, norm)를 가지고 곱한 후 더하는 방법으로 구하는 방법이 있습니다.  아래 그림에 벡터 a를 ax, ay로, 벡터 b를 bx, by로 분해한 후에 내적을 구하는 방법을 소개해 보겠습니다. 힘과 방향을 가지는 벡터를 분해할 수 있다는 것은 벡터 연산을 할 때 굉장히 중요한 개념입니다. 참고로, 벡터와 스칼라를 곱했을 때도 분해한 벡터 성분에 스칼라를 각각 구해서 구하게 됩니다.






(5) 내적의 계산 원리, 방법 2 (2nd formula of the inner product calculation)


내적을 계산하는 또 한가지 방법은 벡터의 힘의 크기 또는 길이(magnitude or length of vector, norm)와 각도(angle between vector a and b)를 이용하는 방법입니다.  벡터의 힘의 크기 또는 길이는 "norm" 이라고도 불립니다.  두 개중 한개의 벡터에 빛을 비추었을 때 직각으로 생기는 그림자 (=vector a * cosine(θ))에다가 나머지 다른 한개의 벡터를 곱하는 개념입니다.





위의 내적 구하는 공식에 cos(θ)가 사용이 되었는데요, 참고로 직각삼각형 ABC의 삼각함수(trigonometric functions) sine, cosine, tangent 구하는 공식은 아래와 같습니다. 





참고로 벡터의 힘의 크기 또는 길이(magnitude or length of vector), 또는 다른 말로 "norm" |a|, |b|를 구하는 방법은 아래와 같습니다. 





(6) 내적을 활용한 두 벡터의 각도 계산 (calculating the angle between vector a and b)


위에서 소개한 두 벡터의 내적을 구하는 공식을 사용하면 벡터의 길이(length of vector)를 구하거나 혹은 두 벡터간 각도(angle between vector a and b)를 구할 수 있습니다.  왜 내적을 공부해야 하지, 내적을 어디에 써먹을 수 있지 궁금하셨을 것 같은데요, 위에서 예로 들었던 두 벡터 a=(-5, 6), b=(3, 9)의 각도를 내적을 활용해서 구해보도록 하겠습니다.



참고로, 위 계산 절차의 제일 마지막에 cos^-1(0.526354)*57.3 을 했는데요, inverse(cos(0.526354))를 통해서 계산된 값이 degree 가 아니라 radian 이기 때문에 1 radian 은 약 57.3 이므로 이를 곱해준 것입니다.  degree는 우리가 일반적으로 사용하는 것처럼 원을 0~360도 표기하는 방법이구요, radian은 부채꼴의 호의 길이와 반지름의 길이가 같게 되는 각도를 1 radian이라고 합니다.
180 degree = π radian 이며, 1 radian = 180 degree/ π = 57.3 입니다.

이를 R을 사용해서 계산해보면 아래와 같습니다.  사용자정의함수로 작성했습니다. 참고로, 함수 acos()는 cos()의 inverse 함수입니다.

> # angle between vector a and b
> a <- c(-5, 6)
> b <- c(3, 9)
> 
> angle_theta <- function(a, b){
+   dot.prod <- a%*%b 
+   norm.a <- norm(a, type="2")
+   norm.b <- norm(b, type="2")
+   theta_radian <- acos(dot.prod / (norm.a * norm.b))
+   angle_theta <- 57.3*theta_radian
+   as.numeric(angle_theta)
+   
+   return(angle_theta)
+ }
> 
> angle_theta(a, b)
         [,1]
[1,] 58.24481

 



위의 예에서는 이해를 돕기 위해서 2차원 (구성요소가 2개) 벡터 a, b를 가지고만 설명을 했는데요, 내적은 실벡터공간 내 3차원, 4차원, ..., n차원 벡터 모두에 대해서 가능합니다.  반면 외적은 3차원 유클리디안 공간에서만 가능합니다.


다음 번에는 벡터의 곱 두번째로 외적 (outer product, cross product, vector product, tensor product) 에 대해서 소개하도록 하겠습니다.

많은 도움되었기를 바랍니다.

행렬, 벡터 관련 포스팅은 아래 링크를 걸어놓았습니다.

 

행렬 기본 이해

특수한 형태의 행렬

가우스 소거법을 활용한 역행렬 계산

행렬의 기본 연산 (+, -, *, /, ^, %*%, colMeans(), rowMeans(), colSums(), rowSums()) 

벡터의 기본 이해와 연산 (vector: addition, subtraction, multiplication by scalar)

벡터의 곱 (2) 외적 (outer product, cross product, vector product, tensor product)

 

이번 포스팅이 도움이 되었다면 아래의 공감 ♡ 꾸욱~ 눌러주세요. ^^

 





728x90
반응형
Posted by Rfriend
,

이번 포스팅에서는 벡터(vector)의 정의와 연산에 대해서 알아보겠습니다.

 

벡터는 행렬과 함께 선형대수에서 많이 사용하는 개념이어서 꼭 이해하고 넘어가야 합니다.  벡터 개념과 연산은 중학교 수준의 수학 실력만 있으면 어렵지 않게 이해할 수 있으니 겁먹지 마시기 바랍니다. ^^

 

벡터(vector)는 여러 학문 분야에서 조금씩 다른 뜻으로 사용이 되고 있어서 혼선이 있을 수도 있는데요, 수학(mathemetics)과 컴퓨터 과학(computer science)에서 정의하는 벡터의 정의에 대해서만 살펴보겠습니다.

 

 

[ 수학과 컴퓨터과학에서 벡터의 정의 ]

 

 

[mathematics]

vector : a quantity possessing both magnitude and direction, represented by an arrow the direction of which indicates the direction of the quantity and the length of which is proportional to the magnitude.

 

* compare scalar : a quantity, such as time or temperature, that has magnitude but not direction

 

[computers]

vector : an array of data ordered such that individual items can be located with a single index or subscript

 

* source : http://dictionary.reference.com/browse/vector

 

 

 

수학(mathematics)이나 물리학에서는 벡터(vector)는 힘(magnitude)과 방향(direction)을 함께 가지고 있는 양을 말합니다. 화살표로 표현을 하는데요, 화살표의 길이는 힘(lennth of arrow = magnitude)을, 화살표의 방향은 힘의 방향(direction of arrow = direction)을 나타냅니다. 날아가는 야구공, 미사일 등이 벡터(vector)로 힘과 방향을 표현할 수 있겠습니다. 


벡터는 보통 a, b, c, ... 처럼 소문자굵게(bold) 표기하거나 또는 a = [aj]와 같이 대괄호 안에 성분 표시를 합니다. (참고로, 행렬은 보통 A, B, C, ... 처럼 대문자로 굵게 표기하죠)

 

반면에, 스칼라(scalar)는 시간이나 온도와 같이 힘만 있고 방향은 없는(only magnitude, but not direction) 양을 말합니다. 특별한 가정이 없는 한 실수(real number)로 나타냅니다.

 

컴퓨터(computers) 분야에서는 벡터를 개별적인 요소들이 한개의 index나 subscript에 나열할 수 있는 데이터의 배열이라고 정의합니다. 

 

 

[ 벡터의 정의 ]

 

 

 

벡터의 힘의 크기(magnitude of vector)는 아래 처럼 벡터의 양쪽 바깥쪽에 수직 막대를 한개 또는 두개(절대값 absolute와 혼돈하지 말라고)를 그어주는 것으로 표기합니다.

 

벡터의 힘의 크기는 유클리디안거리(Euclidean distance) 개념으로 계산합니다.

 

 

 

[ 벡터의 힘의 크기 (magnitude of vector) ]

  

 

 

 

 

벡터의 힘의 크기가 1인 벡터를 단위벡터(unit vector)라고 합니다.

 

[ 단위벡터 (unit vector) ]

 

 

 

 

 

열벡터(column vector)는 n by 1 행렬을 말하며, 행벡터(row vector)는 1 by n 행렬을 말합니다. 

 

 

[ n by 1 열벡터(column vector)와 1 by n 행벡터(row vector) ]

 

 

 

 

특히 n by 1 벡터 전체로 이루어지는 집합을 R에 이중선을 추가해서

 이라고 표기합니다.

 선형대수 공부할 때, 최적화 선형계획법 공부할 때 자주 접하게 되는 표기법 중에 하나입니다.

 

 

 [ 2 by 1, 3 by 1, n by 1 column vector ]

 

 

 

 

 

벡터(vector)는 아래와 같이 다양하게 해석할 수 있습니다. 벡터 [3, 5]를 예로 들어서 설명해보겠습니다.

 

- 해석 1 : 점 (4, 5)

- 해석 2 : 원점(0, 0)과 점(4, 5)를 이은 화살표

- 해석 3 : 원점(0, 0)에서 점(4, 5)까지 가는 화살표들의 합

- 해석 4 : 오른쪽으로 4, 위쪽으로 5만큼 이동하는 모든 화살표 (무수히 많음)

 

 

[ 벡터의 다양한 해석 ] 

 

 

 

특히, 4번째 해석은 좀 의아할 수도 있는데요, 두 벡터의 크기와 방향이 같을 때, 즉 평행이동했을 때 서로 겹쳐지는 벡터를 '벡터의 상등(equality)'이라고 말하며, 무수히 많이 존재합니다.

 

 

행렬은 행벡터 또는 열벡터로 구성되며, 벡터는 행 또는 열이 1개인 행렬이라고 할 수 있습니다. 벡터의 계산은 행렬의 계산과 같습니다.

 

아래에 벡터끼리의 합, 차, 스칼라곱, 곱에 대한 예를 들어보겠습니다.

 

 

(1) 벡터의 합 (adding vectors)

 

벡터 aaxay로 분할할 수 있습니다. 두 벡터 ab의 합은 a + b = (ax + bx, ay + by) 로 계산하게 됩니다. 

 

아래에 벡터 a=[4, 5], 벡터 b=[3, 1]의 합 a+b를 예로 들어보았습니다.

 

 

 

 

 

R을 활용한 벡터의 합은 행렬의 합과 동일합니다. 벡터 a, b를 객체로 할당하고 + 하면 됩니다.

 

 

> ## adding vectors
> 
> a <- c(4, 5)
> b <- c(3, 1)
> 
> a
[1] 4 5
> b
[1] 3 1
> 
> a+b
[1] 7 6
 

 

 

두개의 n by 1 열벡터 a와 b의 합은 아래와 같이 나타낼 수 있습니다. 

 

 

[ 열 벡터a와 열 벡터b의 합(adding vectors) ]

 

 

 

 

 

(2) 벡터의 차 (substracting vectors)

 

벡터의 차는 같은 위치의 벡터의 성분끼리 빼주면 됩니다.  화살표로는 기존의 벡터의 방향을 반대로 돌려주는 것이 (-)해주는 의미가 되겠습니다. 벡터의 차는 두 점 사이의 거리를 계산할 때 요긴하게 사용할 수 있습니다. 

 

두 벡터 a=[4, 5], b=[3, 1]의 차이를 아래에 예로 들어보았습니다.

 

 

[ 벡터의 차 (substracting vectors) ]

 

 

 

R로 벡터의 차를 구하는 것도 역시 행렬과 동일하게 두 벡터 객체에 (-) 해주면 됩니다.

 

 

> ## substracting vectors
> a <- c(4, 5)
> b <- c(3, 1)
> 
> a
[1] 4 5
> b
[1] 3 1
> 
> a-b
[1] 1 4

 

 

 

두 개의 m by 1 열벡터 a와 b의 차는 아래와 같이 나나탤 수 있습니다.

 

 

 [ 열열터 a와 b의 차 (substracting vectors) ]

 

 

 

 

 

 

(3) 스칼라배 (multiplying a vector by a scalar)

 

위에서 스칼라를 힘만 있고 방향은 없는 양(a quantity that has only magnitude, but not direction)이라고 정의했었는데요, 벡터에 스칼라를 곱하는 것을 스칼라배라고 하고, 곱한 스칼라이 양만큼 벡터의 크기가 바뀌기 때문에 "벡터를 scaling한다"("scaling a vector")고도 합니다.

 

아래에 벡터 a=[2, 4]에 scalar 2, scalar 1/2 을 곱해보는 예제를 살펴보겠습니다. 방향은 똑같고 스칼라배한만큼 힘의 크기가 달라졌음을 알 수 있습니다.

 

 

 

아래에 위의 예제를 R로 스칼라배 연산해보았습니다.

 

 

> ## multiplying a vector by a scalar
> a <- c(2, 4)
> 
> scala_1 <- c(2)
> scala_2 <- c(1/2)
> 
> a*scala_1
[1] 4 8
> 
> a*scala_2
[1] 1 2

 

 

 

n by 1 벡터a에 c스칼라배 하는 것은 아래와 같이 나타낼 수 있습니다. 

 

 

[ 스칼라배 (multiplying a vector by a scala) ]

 

 



스칼라배는 행렬의 곱이 가지고 있는 특성을 고스란히 가지고 있습니다.



[ 행렬의 스칼라배 성질 (principle of multiplying a vector by a scala) ]




 

벡터의 곱(multiplying a vector by a vector, dot product, cross product)은 다음 포스팅에서 소개하도록 하겠습니다.

 

많은 도움이 되었기를 바랍니다.


행렬, 벡터 관련 포스팅은 아래 링크를 걸어놓았습니다.

 

행렬 기본 이해

특수한 형태의 행렬

가우스 소거법을 활용한 역행렬 계산

행렬의 기본 연산 (+, -, *, /, ^, %*%, colMeans(), rowMeans(), colSums(), rowSums()) 

벡터의 곱 (1) 내적 (inner product, dot product, scalar product, projection product)

벡터의 곱 (2) 외적 (outer product, cross product, vector product, tensor product)


이번 포스팅이 도움이 되었다면 아래의 공감 ♡ 꾸욱~ 눌러주세요. ^^

 

 

728x90
반응형
Posted by Rfriend
,

지난 포스팅에서는 가우스 소거법(Gauss-Jordan elimination method)을 활용한 역행렬 계산방법을 알아보았습니다. (☞ 바로가기)

 

이번 포스팅에서는 여인수(cofactor)를 이용한 역행렬(the inverse of a matrix, invertible matrix) 계산 방법에 대하여 소개하도록 하겠습니다.

 

 

이를 이해하기 위해서는 (1) 소행렬식(minor determinant), (2) 여인수(cofactor), (3) 수반행렬(adjoint matrix)에 대해서 먼저 알아보고 나서, 그 다음에 (4) 여인수를 이용한 역행렬 계산 방법을 소개하겠습니다.

 

 

 

 

(1) 제 (i, j) 소행렬식 (minor determinant)

 

제 (i, j) 소행렬식이란 n차정방행렬의 i행과 j열을 제거하고 만든 부분행렬의 행렬식(determinant)을 말합니다.  i행과 j열이 제거되어서 원래 행렬 A보다 행과 열이 하나씩 작아진 행렬을 가지고 행렬식을구하기 때문에 소행렬식(minor determinant, minor of entry aij)이라고 부릅니다.

 

 

 

아래 3*3 행렬식 A를 예로 들어서 소행렬식을 풀어보겠습니다.

 

 

 

 

위의 9개 소행렬식 중에서 "제(1, 1) 소행렬식"을 어떻게 구했는지에 대해서 이미지로 표시해보면 아래와 같습니다.  아래의 방식을 9개 소행렬식 모두에 차례로 적용한 것입니다.

 

 

R로 행렬식 값 구할 때는 det() 함수를 사용합니다.

 

 
> # determinant : det()
> M11 <- matrix(c(1, 2, 0, 4), byrow = TRUE, nrow = 2)
> det(M11)
[1] 4

 

 

 

참고로, 2차정방행렬과 3차정방행렬의 행렬식(determinant) 구하는 공식은 아래와 같습니다.

 

 

 

(2) 여인수 (cofactor)

 

여인수는 제(i, j) 소행렬식에 (-1)^(i+j)를 곱한 것이며, cofactor의 앞 대문자를 따서 Cij 로 표기합니다.

(Mij 는 소행렬식, minor determinant) 

 

 

[ 여인수 정의 (definition of cofactor) ]

 

 

 

[ 여인수 행렬 (matrix of cofactors) ]

 

아래에 3 by 3 행렬 A의 여인수를 구하는 예를 들어보았습니다.  위에 (1)번에서 구해봤던 소행렬식(minor determinant) Mij에 (-1)^(i+j) 를 곱하면 제(i, j) 여인수가 됩니다.

 

 

 

 

 

 

(3) 수반행렬 (adjoint matrix)

 

수반행렬(adjoint matrix)은 여인수 행렬(matrix of cofactors)의 전치행렬(transpose matrix)를 말하며, adjoint matrix의 앞글자를 따서 adj(A)라고 표기합니다.

 

 

[ 여인수 행렬(matrix of cofactors)과 수반행렬 (adjoint matrix)의 관계 ]

 

 

위의 3 by 3 행렬 A에 대해서 여인수 행렬(matrix of cofactors) Cij를 바로 위에서 풀어보았는데요, 이 여인수행렬의 전치행렬(transpose matrix)인 수반행렬(adjoint matrix) 예시를 아래에 제시해보았습니다.

 

 

 

 

 

(4) 여인수를 활용한 역행렬 계산 (invertible matrix by using cofactors)

 

여인수를 활용한 역행렬 계산 방식은 아래와 같습니다.  아래 공식처럼 역행렬(the inverse of a matrix)은 수반행렬(adjoint matrix)를 행렬식(determinant)으로 나눈 값입니다.  왜 위에서 소행렬식, 여인수, 수반행렬을 먼저 차례로 살펴보았는지 이제야 이해하실 수 있을 것입니다.

 

 

 

 

위에서 줄곧 예시로 들었던 3 by 3 정방행렬 A에 대해 여인수를 활용한 역행렬을 구해보면 아래와 같습니다.

 

 

[ 여인수를 활용한 역행렬 계산 예시

(example of invertible matrix caculation by using cofactor) ]

   

 

 

 

 

위의 역행렬 계산 문제를 R의 MASS패키지 내 ginv() 함수로 풀어보면 아래와 같습니다.

 

 

> # the inverse of a matrix, invertible matrix
> A <- matrix(c(1, 0, 1, 0, 1, 2, -1, 0, 4), byrow = TRUE, nrow = 3)
> A
     [,1] [,2] [,3]
[1,]    1    0    1
[2,]    0    1    2
[3,]   -1    0    4
> library(MASS)
> options(digits=2)
> ginv(A)
     [,1]     [,2] [,3]
[1,]  0.8 -3.3e-16 -0.2
[2,] -0.4  1.0e+00 -0.4
[3,]  0.2  0.0e+00  0.2

 

 

 

R base패키지의 solve() 함수를 이용해서 역행렬을 구해도 결과는 동일합니다.

 

 

> A <- matrix(c(1, 0, 1, 0, 1, 2, -1, 0, 4), byrow = TRUE, nrow = 3)
> A
     [,1] [,2] [,3]
[1,]    1    0    1
[2,]    0    1    2
[3,]   -1    0    4
> solve(A)
     [,1] [,2] [,3]
[1,]  0.8    0 -0.2
[2,] -0.4    1 -0.4
[3,]  0.2    0  0.2

 

 

 

R로 단 1줄이면 풀어지는 문제에 대해서 컴퓨터는 뒤에서 안보이게 위에서 소개했던 절차들, 즉, 소행렬식, 여인수, 수반행렬을 구하고 그 다음에 역행렬을 구하는 과정을 거쳤을 것입니다.  우리 대신 일해주는 컴퓨터가 있어서 얼마나 좋은 세상인지 모르겠습니다. 

 

많은 도움 되었기를 바랍니다. 

 

행렬, 벡터 관련 포스팅은 아래 링크를 걸어놓았습니다.

 

행렬 기본 이해

특수한 형태의 행렬

가우스 소거법을 활용한 역행렬 계산

행렬의 기본 연산 (+, -, *, /, ^, %*%, colMeans(), rowMeans(), colSums(), rowSums()) 

벡터의 기본 이해와 연산 (vector: addition, subtraction, multiplication by scalar)

벡터의 곱 (1) 내적 (inner product, dot product, scalar product, projection product)

벡터의 곱 (2) 외적 (outer product, cross product, vector product, tensor product)

 

 

이번 포스팅이 도움이 되었다면 아래의 공감 ♡ 꾸욱~ 눌러주세요. ^^







728x90
반응형
Posted by Rfriend
,

지난번 포스팅에서는 특수한 형태의 행렬, 제로행렬(zero matrix), 전치행렬 (transpose matrix), 대칭행렬 (symmetric matrix), 상삼각행렬 (upper triangular matrix), 하삼각행렬 (lower triangular matrix), 대각행렬 (diagonal matrix), 항등행렬 또는 단위행렬 (identity matrix, I, or unit matrix, U) 등에 대해서 알아보았습니다.

 

이번 포스팅에서는 역행렬(the inverse of a matrix, invertible matrix)에 대해서 소개하겠습니다.  역행렬은 사용처가 많은 중요한 개념이므로, 아래의 정의, 계산 방법, 존재 여부 확인하는 방벙을 숙지하면 좋겠습니다.

 

 

  • 역행렬 (the inverse of a matrix, invertible matrix)

 

역행렬은 n차정방행렬 Amn과의 곱이 항등행렬 또는 단위행렬 In이 되는 n차정방행렬을 말합니다. A*B 와 B*A 모두 순서에 상관없이 곱했을 때 단위행렬이 나오는 n차정방행렬이 있다면 역행렬이 존재하는 것입니다.

 

 

 

아래에 예를  하나 들어봤습니다.

 

 

역행렬은 (1) 가우스 소거법(Gauss-Jordan elimination method), (2) 여인수(cofactor)를 이용해서 풀 수 있습니다. 여인수를 이용한 방법은 복잡해서 보통 가우스 소거법을 주로 사용하는데요, 이번 포스팅에서는 먼저 가우스 소거법을 소개하고, 다음번 포스팅에서 여인수(cofactor)를 이용한 역행렬 구하는 방법을 알아보겠습니다.

 

가우스 소거법은 기본행연산(elementary row operation)을 이용하여 위의 행렬의 곱의 왼쪽 행렬을 단위행렬로 바꾸어가는 과정이라고 보면 되겠습니다. 



[참고] 기본 행연산 (elementary row operation)


   1. 행렬의 한 행을 상수배한다. 

   2. 행렬의 두 행을 맞바꾼다. 

   3. 한 행을 상수배하여 다른 행에 더한다. 


 

 

[ 가우스 소거법 예시 (Gauss-Jordan elimination method) ]

 

 

 

 

 

R로 역행렬을 풀때는 MASS 패키지의 ginv() 함수를 사용합니다.

 

> # the inverse of a matrix, invertible matrix
> raw_data <- c(1, 2, 3, 4)
> A_1 <- matrix(raw_data, byrow=TRUE, nrow=2)
> A_1
     [,1] [,2]
[1,]    1    2
[2,]    3    4
> library(MASS)
> ginv(A_1)
     [,1] [,2]
[1,] -2.0  1.0
[2,]  1.5 -0.5
> A_1%*%ginv(A_1)
             [,1]          [,2]
[1,] 1.000000e+00 -6.661338e-16
[2,] 8.881784e-16  1.000000e+00

 

 

 

base 패키지의 solve() 함수를 사용해도 동일합니다.

 

> solve(A_1)

      [,1] [,2]

[1,] -2.0  1.0

[2,]  1.5 -0.5



 

 

역행렬이 존재하는 n차정방행렬을 정칙행렬(nonsingular matrix)라고 하며, 역행렬이 존재하지 않는 행렬을 특이행렬(singular matrix)라고 합니다.

 

 

역행렬이 존재하는지 여부를 확인하는 방법으로 행렬식(determinant, 줄여서 det)이라는 지표를 사용하는데요, 이 행렬식이 '0'이 아니면 역행렬이 존재하고, 이 행렬식이 '0'이면 역행렬이 존재하지 않습니다.

 

 

[ 역행렬이 존재하는 조건 : det(A) ≠ 0 ]

 

 

 

 

행렬식의 값은 n값에 따라서 달라지는데요, 2차와 3차정방행렬의 행렬식 구하는 공식만 아래에 소개하도록 하겠습니다.

 

 

[ 2차, 3차정방행렬의 행렬식 공식, SARRUS method ]

 

 

 

 

2차정방행렬의 경우 역행렬이 존재하는지를 확인하고 역행렬을 구하는 간단한 공식이 있는데요, 아래 식을 참고하시기 바랍니다.  아래와 같은 공식은 2차정방행렬에만 존재하므로, 3차 이상의 연립방정식을 풀려면 위에서 소개한 가우스 소거법은 알아두시는게 좋겠습니다.

 

 

 

다음번 포스팅에서는 여인수(cofactor)를 이용한 역행렬 계산 방법(☞ 바로가기) 에 대해서 소개하겠습니다.

 

많은 도움이 되었기를 바랍니다.

 

행렬, 벡터 관련 포스팅은 아래 링크를 걸어놓았습니다.

 

행렬 기본 이해

특수한 형태의 행렬

여인수를 활용한 역행렬 계산

행렬의 기본 연산 (+, -, *, /, ^, %*%, colMeans(), rowMeans(), colSums(), rowSums())

벡터의 기본 이해와 연산 (vector: addition, subtraction, multiplication by scalar)

벡터의 곱 (1) 내적 (inner product, dot product, scalar product, projection product)

벡터의 곱 (2) 외적 (outer product, cross product, vector product, tensor product)


 

이번 포스팅이 도움이 되었다면 아래의 공감 ♡ 꾸욱~ 눌러주세요. ^^


728x90
반응형
Posted by Rfriend
,

지난번 포스팅에서는 행렬의 뜻, 형태, 표기법, R로 입력하는 방법에 대해서 소개하였습니다.

 

이번 포스팅에서는 특수한 형태의 행렬, 제로행렬(zero matrix), 전치행렬 (transpose matrix), 대칭행렬 (symmetric matrix), 상삼각행렬 (upper triangular matrix), 하삼각행렬 (lower triangular matrix), 대각행렬 (diagonal matrix), 항등행렬 또는 단위행렬 (identity matrix, I, or unit matrix, U)의 7가지에 대하여 차례대로 알아보겠습니다.  

 

아래에 소개하는 행렬 형태와 표기법도 잘 기억해두시면 나중에 유용할 거예요. 특히 전치행렬, 대각행렬, 단위행렬, 역행렬은 자주 사용하는 편이니 잘 기억해두면 좋겠습니다.

 

 

 

 

(1) 제로행렬 (zero matrix or null matrix)

 

모든 성분이 '0'인 행렬을 제로행렬, 또는 영행렬이라고 합니다.

 

 

 
> # zero matrix
> A_zero <- matrix(c(0, 0, 0, 0, 0, 0, 0, 0, 0), byrow = TRUE, nrow = 3)
> A_zero
     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    0    0
[3,]    0    0    0
> 
> B_zero <- matrix(rep(0, 9), byrow = TRUE, nrow = 3)
> B_zero
     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    0    0
[3,]    0    0    0

 

 

 

 

 

(2) 전치행렬 (transpose matrix)

 

행이 m개, 열이 n개인 m * n 행렬 (m by n matrix) 의 행과 열을 서로 바꾼 n * m 행렬 (n by m matrix)를 전치행렬이라고 합니다. 아래에 동그라미로 표시한 행렬의 성분들이 전치를 했을 때 서로 어디로 위치가 바뀌었는지를 유심히 살펴보시기 바랍니다.

 

 

 

 

전치행렬은 행렬 우측 상단에 대문자 'T'를 표기합니다.  아래 표기 예시를 참조하세요.

 

 

 
> # transpose matrix
> A <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9), byrow = TRUE, nrow = 3)
> A
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9
> 
> A_t <- t(A)
> A_t
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
> 
> 
> B <- matrix(c(4, 5,  6, 7, 8, 9), nc=3)
> B
     [,1] [,2] [,3]
[1,]    4    6    8
[2,]    5    7    9
> 
> B_t <- t(B)
> B_t
     [,1] [,2]
[1,]    4    5
[2,]    6    7
[3,]    8    9

 

 

 

 

 

 

(3) 대칭행렬 (symmetric matrix)

 

대칭행렬이란 대각성분을 중심으로 대칭인 n차정방행렬로서, 원래 행렬과 전치행렬이 동일한 경우를 의미합니다. (* wikipedia : a symmetric matrix is a square matrix that is equal to its transpose)

 

 

 

 

 

 

> # symmetric matrix
> s <- matrix(c(1:25), 5)
> s
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    6   11   16   21
[2,]    2    7   12   17   22
[3,]    3    8   13   18   23
[4,]    4    9   14   19   24
[5,]    5   10   15   20   25
> 
> lower.tri(s, diag=FALSE)
      [,1]  [,2]  [,3]  [,4]  [,5]
[1,] FALSE FALSE FALSE FALSE FALSE
[2,]  TRUE FALSE FALSE FALSE FALSE
[3,]  TRUE  TRUE FALSE FALSE FALSE
[4,]  TRUE  TRUE  TRUE FALSE FALSE
[5,]  TRUE  TRUE  TRUE  TRUE FALSE
> s[lower.tri(s, diag=FALSE)]
 [1]  2  3  4  5  8  9 10 14 15 20
> t(s)[lower.tri(s, diag=FALSE)]
 [1]  6 11 16 21 12 17 22 18 23 24
> 
> s[lower.tri(s, diag=FALSE)] = t(s)[lower.tri(s, diag=FALSE)]
> s
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    6   11   16   21
[2,]    6    7   12   17   22
[3,]   11   12   13   18   23
[4,]   16   17   18   19   24
[5,]   21   22   23   24   25

 

 

 

 

 

(4) 상삼각행렬 (upper triangular matrix)

 

 상삼각행렬은 대각성분 아래의 성분이 모두 '0'인 n차정방행렬입니다.  아래의 색깔 칠해놓은 행렬 예를 보면 금방 이해할 수 있을 거예요.

 

 

R의 base패키지 내 lower.tri(x, diag=FALSE) 함수를 이용하여 상삼각행렬(upper triangular matrix)를 아래에 만들어보았습니다.

 

 

> # upper triangular matrix
> (m_upper <- matrix(1:20, 4, 4))
     [,1] [,2] [,3] [,4]
[1,]    1    5    9   13
[2,]    2    6   10   14
[3,]    3    7   11   15
[4,]    4    8   12   16
> 
> lower.tri(m_upper, diag=FALSE)
      [,1]  [,2]  [,3]  [,4]
[1,] FALSE FALSE FALSE FALSE
[2,]  TRUE FALSE FALSE FALSE
[3,]  TRUE  TRUE FALSE FALSE
[4,]  TRUE  TRUE  TRUE FALSE
> m_upper[lower.tri(m_upper, diag=FALSE)] <- c(0)
> m_upper
     [,1] [,2] [,3] [,4]
[1,]    1    5    9   13
[2,]    0    6   10   14
[3,]    0    0   11   15
[4,]    0    0    0   16

 

 

 

 

 

(5) 하삼각행렬 (lower triangular matrix)

 

하삼각행렬은 대각성분 위의 성분이 모두 '0'인 n차정방행렬로서, 상삼각행렬과 '0'이 있는 위치가 대각선으로 반대임을 알 수 있습니다.

 

 

R의 base패키지 내 upper.tri(x, diag=FALSE) 함수를 이용하여 하삼각행렬(lower triangular matrix)를 아래에 만들어보았습니다. 

 

 
> # lower triangular matrix
> (m_lower <- matrix(1:20, 4, 4))
     [,1] [,2] [,3] [,4]
[1,]    1    5    9   13
[2,]    2    6   10   14
[3,]    3    7   11   15
[4,]    4    8   12   16
> 
> upper.tri(m_lower, diag=FALSE)
      [,1]  [,2]  [,3]  [,4]
[1,] FALSE  TRUE  TRUE  TRUE
[2,] FALSE FALSE  TRUE  TRUE
[3,] FALSE FALSE FALSE  TRUE
[4,] FALSE FALSE FALSE FALSE
> m_lower[upper.tri(m_lower, diag=FALSE)] <- c(0)
> m_lower
     [,1] [,2] [,3] [,4]
[1,]    1    0    0    0
[2,]    2    6    0    0
[3,]    3    7   11    0
[4,]    4    8   12   16

 

 

 

 

 

(6) 대각행렬 (diagonal matrix)

 

대각행렬은 대각성분 이외의 모든 성분이 모두 '0'인 n차정방행렬을 말하며, 아래 예의 대각행렬의 경우 대각성분만을 따다가 diag(1, 2, 3, 4)로 표기합니다.

(* wikipedia : a diagonal matrix is a matrix (usually a square matrix) in which the entries outside the main diagonal (↘) are all zero. The diagonal entries themselves may or may not be zero.)

 

 

 

위에서 소개했던 제로행렬(zero matrix)과 바로 아래에 소개할 단위행렬(unit matrix) 또는 항등행렬(identity matrix)도 대각행렬(diagonal matrix)에 속한다고 할 수 있겠습니다.

 

그리고 대각행렬은 상삼각행렬(upper triangular matrix) 또는 하삼각행렬(lower triangular matrix)에 속한다고도 할 수 있겠습니다.

 

 

R의 diag(A) 함수를 사용해서 위의 diag(1, 2, 3, 4) 대각행렬을 만들어보겠습니다.

 

 

 

> # diagonal matrix
> A <- c(1, 2, 3, 4)
> diag(A)
     [,1] [,2] [,3] [,4]
[1,]    1    0    0    0
[2,]    0    2    0    0
[3,]    0    0    3    0
[4,]    0    0    0    4
 

 

 

 

대각행렬의 곱셉, P승은 아래와 같이 각 성분의 P승이 되는 재미있는, 유용한 특성을 가지고 있습니다.

 

 

 

 

 

(7) 항등행렬 또는 단위행렬 (identity matrix, I, or unit matrix, U)

 

항등행렬 또는 단위행렬은 대각성분이 모두 '1'이고 그 이외의 모든 성분은 '0'인 n차정방행렬을 말하며, identity matrix 의 첫 대문자를 따서 'I' 로 표기하거나 unit matrix의 첫 대문자를 따서 'U'로 표기합니다. (일부 수학책에서는 독일어 Einheits matrix의 첫 대문자를 따서 'E'로 표기하기도 함)

 

(* wikipedia : the identity matrix or unit matrix of size n is the n × n square matrix with ones on the main diagonal and zeros elsewhere)

 

 

 

항등행렬 또는 단위행렬 In을 행렬 Amn 에 곱하면 그대로 Amn이 됩니다.  어떤 수에 '1'을 곱하면 그대로 원래의 수가 되기 때문입니다.

 

 

 

 

R의 diag(k) 함수로 k by 항등행렬 또는 단위행렬을 만들 수 있습니다.

 

 

> # identity matrix or unit matrix : diag(k) > diag(4) [,1] [,2] [,3] [,4] [1,] 1 0 0 0 [2,] 0 1 0 0 [3,] 0 0 1 0 [4,] 0 0 0 1

> 

> diag(6) [,1] [,2] [,3] [,4] [,5] [,6] [1,] 1 0 0 0 0 0 [2,] 0 1 0 0 0 0 [3,] 0 0 1 0 0 0 [4,] 0 0 0 1 0 0 [5,] 0 0 0 0 1 0 [6,] 0 0 0 0 0 1

 

 

 

 

항등행렬 또는 단위행렬의 역행렬(inverse matrix, 바로 아래에 설명)은 단위행렬입니다.  단위행렬과 역행렬은 매우 중요한 행렬이므로 꼭 잘 이해를 해두시는게 좋습니다.

 

 

다음번 포스팅에서는 역행렬(the inverse of a matrix, invertible matrix)에 대해서 소개하겠습니다.

 

많은 도움이 되었기를 바랍니다.

 

행렬, 벡터 관련 이전 포스팅은 아래 링크를 걸어놓았습니다.

 

행렬 기본 이해

가우스 소거법을 활용한 역행렬 계산

여인수를 활용한 역행렬 계산

행렬의 기본 연산 (+, -, *, /, ^, %*%, colMeans(), rowMeans(), colSums(), rowSums())

벡터의 기본 이해와 연산 (vector: addition, subtraction, multiplication by scalar)

벡터의 곱 (1) 내적 (inner product, dot product, scalar product, projection product)

벡터의 곱 (2) 외적 (outer product, cross product, vector product, tensor product)


 

이번 포스팅이 도움이 되었다면 아래의 공감 ♡ 꾸욱~ 눌러주세요. ^^

 

728x90
반응형
Posted by Rfriend
,

경영과학/최적화, 다변량 통계분석, 머신러닝을 제대로 이해하고 활용하려면 선형대수(linear algebra)와 미적분(differential and integral)에 대한 이해가 필요합니다. 상호 연결되어 있고 영향을 미치는 복잡한 세상에서 단변량만을 가지고 문제를 풀기에는 역부족이기 때문에 다수의 변수를 가진 문제를 풀어야 하는 경우가 대부분입니다.

 

따라서, 경영과학/최적화에 들어가기 전에 그 기초가 되는 행렬(matrix)에 대한 기초와 행렬 연산에 대해서 알아보도록 하겠습니다.  행렬을 사용하면 1차 연립방정식을 시각적으로 보기에 깔끔하고 편리하게 나타낼 수 있으며, 최적화 기법 중에 선형계획법을 풀 때 이를 사용할 수 있고, 컴퓨터로 해를 찾을 때도 행렬식으로 목적함수와 제약조건을 입력하게 됩니다.  왜 행렬에 대한 기본 개념과 연산에 대해서 먼저 짚고 넘어가야 하는지 이해가 되셨을 겁니다.  

 

이공계 계열을 전공한 분이라면 기본적으로 선형대수, 미적분은 배웠을 텐데요, 문과생들은 그렇지 못하다보니 처음에 최적화, 다변량 통계분석에 나오는 수식을 보고는 이게 무슨 소리인지 이해를 못해서 어려움을 겪고, 심하면 좌절하고 포기하기도 쉽답니다. (제가 처음에 그랬습니다. 시계열분석 공부하다가 수식에 질려서 토할 것 같은 어지럼증을...^^;)

 

 

행렬(matrix)이란 숫자나 상징, 표현을 직사각형 또는 정사각형 모양으로 m행과 n열로 배열하고 괄호로 묶은 것을 말합니다(* Wikipedia : "In mathematics, a matrix (plural matrices) is a rectangular array of numbers, symbols, or expressions, arranged in rows and columns").  괄호 안의 각각의 수를 성분(entries)이라고 하며, m행 n열로 구성된 행렬은 'm x n 행렬'이라고 말하며, 아래와 같이 표기합니다.

 

 

[ m * n 행렬 (m * n matrix) ]

 

 

 

 

행(column)과 열(row)의 개수가 n개로 같은 행렬을' n차 정방행렬(a square matrix of order n)'이라고 하며, 아래와 같이 표기합니다.

 

 

[ n차 정방행렬 (a square matrix of order n) ]

 

 

 

 

1차 연립방정식을 행렬을 이용해서 표기하면 아래와 같이 할 수 있습니다. 왼쪽의 연립방정식 대비 오른쪽의 행렬이 많이 깔끔해보이지요?  (경영과학 처음 배울 때 가우스 소거법에 아래 행렬 표기를 사용한답니다.)

 

 

[ 1차 연립방정식(simultaneous equations) 의 행렬 표기 ]

 

 

R을 활용하여 행렬(matrix)를 입력하는 방법에는 (1) rbind(), (2) cbind(), (3) matrix()의 3가지가 있습니다.  아래에 차례대로 소개하였습니다.

 

 

 

> ##---------------------------------------------------------------------
> ## matrix algebra
> ##---------------------------------------------------------------------
> 
> # data key-in way 1 : rbind()
> row_1 <- c(1, 2, 3, 4)
> row_2 <- c(5, 6, 7, 8)
> 
> data_rbind <- rbind(row_1, row_2)
> data_rbind
      [,1] [,2] [,3] [,4]
row_1    1    2    3    4
row_2    5    6    7    8
> 
> # column naming
> colnames(data_rbind) <- paste("col_", 1:4, sep="")
> 
> data_rbind
      col_1 col_2 col_3 col_4
row_1     1     2     3     4
row_2     5     6     7     8
> 
> 
> # data key-in way 2 : cbind()
> column_1 <- c(1, 5)
> column_2 <- c(2, 6)
> column_3 <- c(3, 7)
> column_4 <- c(4, 8)
> 
> data_cbind <- cbind(column_1, column_2, column_3, column_4)
> data_cbind
     column_1 column_2 column_3 column_4
[1,]        1        2        3        4
[2,]        5        6        7        8
> 
> # row naming
> rownames(data_cbind) <- paste("row_", 1:2, sep="")
> data_cbind
      column_1 column_2 column_3 column_4
row_1        1        2        3        4
row_2        5        6        7        8
> 
> 
> # data key-in way 3 : matrix()
> raw_data <- c(1, 2, 3, 4, 5, 6, 7, 8)
> data_matrix <- matrix(raw_data, byrow=TRUE, nrow=2)
> data_matrix
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
> 
> # giving names to the rows and columns of the data table : dimnames()
> dimnames(data_matrix) <- list("row" = c("row_1", "row_2"), 
+                               "column" = c("col_1", "col_2", "col_3", "col_4"))
> 
> data_matrix
       column
row     col_1 col_2 col_3 col_4
  row_1     1     2     3     4
  row_2     5     6     7     8

 

 

 

 

행렬에서 행이나 열을 하나만 인덱싱하게 되면 벡터로 바뀌게 되는데요, 벡터가 아니라 행렬로 계속 차원을 유지하고 싶을 경우에는 drop=FALSE 옵션을 써주면 됩니다.

 

> # make it sure to be a matrix : drop = FALSE > data_index <- data_matrix[,2] > data_index row_1 row_2 2 6 > > class(data_matrix) [1] "matrix" > class(data_index) [1] "numeric" > > str(data_matrix) num [1:2, 1:4] 1 5 2 6 3 7 4 8 - attr(*, "dimnames")=List of 2 ..$ row : chr [1:2] "row_1" "row_2" ..$ column: chr [1:4] "col_1" "col_2" "col_3" "col_4" > str(data_index) Named num [1:2] 2 6 - attr(*, "names")= chr [1:2] "row_1" "row_2" > > > data_drop_false <- data_matrix[, 2, drop = FALSE] > data_drop_false column row col_2 row_1 2 row_2 6 > > class(data_drop_false) [1] "matrix" > str(data_drop_false) num [1:2, 1] 2 6 - attr(*, "dimnames")=List of 2 ..$ row : chr [1:2] "row_1" "row_2" ..$ column: chr "col_2"

 

 

 

 

다음번 포스팅에서는 특수한 형태의 행렬에 대해서 알아보도록 하겠습니다. 

 

많은 도움 되었기를 바랍니다.  

 

행렬, 벡터 관련 포스팅은 아래 링크를 걸어놓았습니다.

 

특수한 형태의 행렬

가우스 소거법을 활용한 역행렬 계산

여인수를 활용한 역행렬 계산

행렬의 기본 연산 (+, -, *, /, ^, %*%, colMeans(), rowMeans(), colSums(), rowSums())

벡터의 기본 이해와 연산 (vector: addition, subtraction, multiplication by scalar)

벡터의 곱 (1) 내적 (inner product, dot product, scalar product, projection product)

벡터의 곱 (2) 외적 (outer product, cross product, vector product, tensor product)

 

 

이번 포스팅이 도움이 되었다면 아래의 공감 ♡ 꾸욱~ 눌러주세요. ^^

 

728x90
반응형
Posted by Rfriend
,

관측값이 질적 자료(qualitative data) 또는 어떤 속성에 따라 분류되어 범주(category)에 속하는 도수(frequency)로 주어질 경우 이를 범주형 자료(categorical data) 라고 합니다. 범주형 자료의 예로는 학력(초등졸, 중등졸, 고등졸, 대졸, 대학원졸), 연수익(극빈, 하, 중, 상, 극상) 등이 있습니다.

 

지난 포스팅에서는 범주형 자료분석 중에서 (1) 적합도 검정, (2) 독립성 검정 (test of independence)에 대해서 소개하였다면, 이번 포스팅에서는 (3) 동질성 검정(test of homogeneity)을 다루도록 하겠습니다.

 

범주형 자료 분석 유형별 간략한 소개는 아래와 같습니다.

 

 

 

 

[ 범주형 자료 분석 (categorical data test) ]

 

(1) 적합도 검정(goodness of fit test) : 관측값들이 어떤 이론적 분포를 따르고 있는지를 검정. 한 개의 요인을 대상으로 함 

 

(2) 독립성 검정(test of independence) : 서로 다른 요인들에 의해 분할되어 있는 경우 그 요인들이 관찰값에 영향을 주고 있는지 아닌지, 요인들이 서로 연관이 있는지 없는지를 검정. 두 개의 요인을 대상으로 함.

 

(3) 동질성 검정(test of homogeneity) : 관측값들이 정해진 범주 내에서 서로 비슷하게 나타나고 있는지를 검정. 속성 A, B를 가진 부모집단(subpopulation) 각각으로부터 정해진 표본의 크기만큼 자료를 추출하는 경우에 분할표에서 부모집단의 비율이 동일한가를 검정. 두 개의 요인을 대상으로 함.  

 

 

 

 

 

 

 

독립성 검정과 동질성 검정의 이해를 돕기 위해 서로 비교를 해보자면,

 

(1) 독립성 검정이 두 변수 X와 Y가 서로 독립인지 아닌지에 대한 판단이라면, 동질성 검정은 r개의 행과 c개의 열을 가진 두 변수 X와 Y로부터 작성된 분할표의 각 열분포에서 행들이 균일한 값을 가지는지 즉, 각 열에서 행들의 동질성(homegeneity)를 검정하는 것입니다. 두 검정법의 이런 차이점은 개념상의 차이일 뿐이며 검정을 하는 방법은 카이제곱 검정을 이용해서 동일합니다.

 

(2) 독립성 검정은 하나의 모집단에서 표본을 무작위로 추출한 후 추출된 표본을 두가지 속성(변수)에 따라 분류합니다.  반면에 동질성 검정은 부모집단(subpopulation)을 먼저 설정한 후 각 부모집단으로부터 정해진 표본의 크기만큼 무작위로 추출하여 분할표에서 부모집단의 비율이 동일한가를 검정하게 됩니다. 가령, 소득수준에 따라 지지 정당이 동일한지 여부를 검정한다고 할 때, 우선 소득수준을 부모집단으로 설정하고, 각 소득수준별로 정해진 크기의 표본을 무작위로 추출하는 식입니다.

 

 

r개의 행과 c개의 열을 가진 두 변수 X와 Y로부터 작성된 r*c 분할표를 이용한 동질성 검정을 위한 데이터셋 구조는 아래와 같습니다.

 

 

[ 동질성 검정 자료 구조 (dataset for test of homogeneity) ]

 

 

 

동질성 검정을 위한 가설과 검정통계량, 검정방법은 아래와 같습니다. 검정통계량 X^2 는 귀무가설 H0가 사실일 때 근사적으로 자유도 (r-1)(c-1)인 카이제곱 분포를 따르는 것으로 알려져있습니다.

 

 

[ 동질성 검정 가설 및 검정 통계량, 검정 방법 ]

 

(1) 가설

 

  - 귀무가설 H0 : p1j = p2j = ... = prj,   j = 1, ..., c

 

  - 대립가설 H1 : H0가 아니다

 

 

(2) 검정 통계량

 

 

(3) 검정 방법

 

 

 

이제 아래의 문제를 R의 chisq.test() 함수를 이용해서 풀어보도록 하겠습니다.

 

 

(문제) 초등학교 1학년 남학생 100명과 여학생 200명을 무작위로 추출하여 TV 프로그램 선호도를 조사하였다. 유의수준 α 0.05 에서 남학생의 TV 프로그램 선호도와 여학생의 TV프로그램 선호도가 동일한지 검정하여라.

 

 

선호 TV 프로그램 

row total 

 뽀로로

짱구는 못말려 

로봇카 폴리 

 남학생

 50

30

20 

100

 여학생

 50

80

70 

200

 column total

100

110

90

300

 

 

 

 

[가설]
- H0 : 남학생과 여학생별로 TV 선호도는 동일하다
         (p1j = p2j,   j = 뽀로로, 짱구는 못말려, 로봇카 폴리)

- H1 : H0가 아니다

 

 

아래 분석에 사용한 R chisq.test() 함수는 이전 포스팅의 독립성 검정과 동일합니다.

 

 

> ##---------------------------------------------------------------------
> ## categorical data analysis - (3) test of homogeneity : chisq.test()
> ##---------------------------------------------------------------------
> 
> ##-------------
> # (a) textbook problem
> 
> ## data key-in
> # data key-in way 1 : rbind()
> row_1 <- c(50, 30, 20)
> row_2 <- c(50, 80, 70)
> 
> data_rbind <- rbind(row_1, row_2)
> data_rbind
      [,1] [,2] [,3]
row_1   50   30   20
row_2   50   80   70
> 
> 
> # data key-in way 2 : matrix()
> raw_data <- c(50, 30, 20, 50, 80, 70)
> data_matrix <- matrix(raw_data, byrow=TRUE, nrow=2)
> data_matrix
     [,1] [,2] [,3]
[1,]   50   30   20
[2,]   50   80   70
> 
> 
> # giving names to the rows and columns of the data table : dimnames()
> dimnames(data_matrix) <- list("Gender" = c("Boys", "Girls"), 
+                               "TV_Preferences" = c("Pororo", "JJangGu", "RobotCar"))
> 
> data_matrix
       TV_Preferences
Gender  Pororo JJangGu RobotCar
  Boys      50      30       20
  Girls     50      80       70
> 
> 
> ## exploratory data analysis
> # marginal distribution : addmargins()
> addmargins(data_matrix)
       TV_Preferences
Gender  Pororo JJangGu RobotCar Sum
  Boys      50      30       20 100
  Girls     50      80       70 200
  Sum      100     110       90 300
> 
> 
> # proportional distribution : prop.table()
> prop.table(data_matrix)
       TV_Preferences
Gender     Pororo   JJangGu   RobotCar
  Boys  0.1666667 0.1000000 0.06666667
  Girls 0.1666667 0.2666667 0.23333333
> 
> addmargins(prop.table(data_matrix))
       TV_Preferences
Gender     Pororo   JJangGu   RobotCar       Sum
  Boys  0.1666667 0.1000000 0.06666667 0.3333333
  Girls 0.1666667 0.2666667 0.23333333 0.6666667
  Sum   0.3333333 0.3666667 0.30000000 1.0000000
> 
> 
> # bar plot : barplot()
> barplot(t(data_matrix), beside=TRUE, legend=TRUE, 
+         ylim=c(0, 120), 
+         ylab="Observed frequencies in sample", 
+         main="TV viewing preferences by gender")
> 

 

> 
> ## chisquared test : chisq.test()
> chisq.test(data_matrix)

	Pearson's Chi-squared test

data:  data_matrix
X-squared = 19.318, df = 2, p-value = 6.384e-05

> 
> 
> # indexing statistics of chisq.test()
> chisq.test_output_2 <- chisq.test(data_matrix)
> 
> chisq.test_output_2$observed # observed frequency
       TV_Preferences
Gender  Pororo JJangGu RobotCar
  Boys      50      30       20
  Girls     50      80       70
> chisq.test_output_2$expected # expected frequeycy
       TV_Preferences
Gender    Pororo  JJangGu RobotCar
  Boys  33.33333 36.66667       30
  Girls 66.66667 73.33333       60
> chisq.test_output_2$residuals # residual between observed and expected frequecy
       TV_Preferences
Gender     Pororo    JJangGu  RobotCar
  Boys   2.886751 -1.1009638 -1.825742
  Girls -2.041241  0.7784989  1.290994
> 
> chisq.test_output_2$statistic # chi-squared statistics
X-squared 
 19.31818 
> chisq.test_output_2$parameter # degrees of freedom
df 
 2 
> chisq.test_output_2$p.value # P-value
[1] 6.384253e-05

 

 

 

위의 분석 결과를 해석해보자면, 카이제곱 통계량 값이 19.318이 나왔고 P-value가 6.384e-05 로서 유의수준 α 0.05 보다 훨씬 작기때문에 귀무가설 H0 를 기각하고 대립가설 H1을 채택하여 "남학생/여학생별 선호하는 TV프로그램은 동일하지 않다"고 판단할 수 있겠습니다.

 

많은 도움이 되었기를 바랍니다.

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡'를 꾸욱 눌러주세요. ^^

 

728x90
반응형
Posted by Rfriend
,

지난 포스팅에서는 범주형 자료분석 중에서 (1) 적합도 검정에 대해서 소개하였다면, 이번 포스팅에서는 (2) 독립성 검정 (test of independence)에 대해서 알아보겠으며, 다음번 포스팅에서는 (3) 동질성 검정을 다루도록 하겠습니다.

 

 

범주형 자료 분석 유형별 간략한 소개는 아래와 같습니다.

 

 

 

[ 범주형 자료 분석 (categorical data test) ]

 

(1) 적합도 검정(goodness of fit test) : 관측값들이 어떤 이론적 분포를 따르고 있는지를 검정. 한 개의 요인을 대상으로 함 

 

(2) 독립성 검정(test of independence) : 서로 다른 요인들에 의해 분할되어 있는 경우 그 요인들이 관찰값에 영향을 주고 있는지 아닌지, 요인들이 서로 연관이 있는지 없는지를 검정. 두 개의 요인을 대상으로 함.

 

(3) 동질성 검정(test of homogeneity) : 관측값들이 정해진 범주 내에서 서로 비슷하게 나타나고 있는지를 검정. 속성 A, B를 가진 부모집단(subpopulation) 각각으로부터 정해진 표본의 크기만큼 자료를 추출하는 경우에 분할표에서 부모집단의 비율이 동일한가를 검정. 두 개의 요인을 대상으로 함.

 

 

 

 

 

 

 

 

 

독립성 검정(test of independence)은 두 개의 범주형 변수/요인(2 factors)이 서로 연관성이 있는지, 상관이 있는지, 독립적인지를 카이제곱 검정(chisquared test)을 통해 통계적으로 판단하는 방법입니다.

 

가령, 학력(초등졸, 중등졸, 고등졸, 대졸, 대학원졸)이라는 범주형 변수(variable X)/요인(factor 1)와 연소득(하, 중, 상)이라는 범주형 변수(variable Y)/요인(factor 2) 간에 서로 관련성이 있는 것인지 아니면 관련이 없이 독립적인지를 판단하는 것과 같은 문제에 독립성 검정을 사용합니다.

 

참고로, 두 변수가 양적변수(qualitative variable)인 경우 두 변수 간 상관관계 분석을 위해서는 공분산 분석, 상관계수 분석, 회귀분석 등을 활용합니다.

 

범주형 자료분석의 경우 두 변수의 관련성을 보려면 분할표를 만들어서 카이제곱 검정을 하게 되는데요, 두 변수간의 관련성을 양적변수 분석할 때처럼 숫자로 얼마나 관련성이 큰지를 알 수 있는 통계량을 제공하지는 않습니다.  (범주형 자료분석에서 두 변수 간 관련성 측도로 파이계수, 속성계수, 크레머 V 등의 통계량이 있는데요, 이번 포스팅에서는 이에 대한 설명은 건너뛰겠습니다.)

 

 

자료를 분류하는 두 변수를 x와 Y라고 하고, 변수 X는 m개, 변수 Y는 n개의 범주(혹은 계급 class, 혹은 요인 수준 factor level)를 가진다고 했을 때 관측도수 Oij 는 m개와 n개의 층으로 이루어진 아래와 같은 표로 정리할 수 있습니다.  이를 m*n 분할표 (m*n contingency table)이라고 부릅니다.

 

 

[ 독립성 검정 자료 구조 (dataset for test of independence) ]

 

 

 

 

독립성 검정에는 카이제곱 X^2 통계량을 사용하는데요, 귀무가설 H0 가 사실일 때 자유도 (m-1)(n-1)인 카이제곱분포에 근사하는 것으로 알려져 있습니다. (☞ 카이제곱 분포(Chi-squared distribution) 참고 포스팅

 

검정통계량 카이제곱 X^2 은 각 범주의 기대도수가 5 이상인 경우에 사용하는 것이 바람직하며, 기대도수가 5 미만인 경우에는 주의를 요합니다. (5보다 작으면 인접 범주와 합치는 것도 방법)

 

기본 원리는, 관측도수 O11, O21, ..., Omn 이 기대도수 E11, E21, ..., Emn 과 차이가 없다면 검정통계량 X0^2 값이 '0'이 되고, 반대로 관측도수와 기대도수가 차이가 크다면 검정통계량 값 또한 커지게 된다는 것입니다.

 

 

 

 

 

[ 독립성 검정(test of independence) 가설 및 검정 통계량, 검정 방법 ]

 

(1) 가설 (hypothesis)

 

  - 귀무가설 H0 : 두 변수 X와 Y는 서로 독립이다 (관련성이 없다)
                        ( pij = pim * pnj,   i = 1, 2, .., m,   j = 1, 2, ..., n )

 

  - 대립가설 H1 : 두 변수 X와 Y는 서로 독립이 아니다 (관련성이 있다)

 

 

 

(2) 검정 통계량 (chisquared test statistics)

 

 

 

(3) 검정 방법 (test method)

 

 

  • (a) chisq.test() of data from text problem

 

아래 문제에 대해서 R의 chisq.test() 함수를 사용해서 풀어보도록 하겠습니다. 

 

 

(문제)  학급 (class 1, class 2, class 3)과 수학 성적 (math score High, Middle, Low, Fail) 간의 관련성이 있는지를 조사한 아래의 분할표를 사용하여 유의수준 α 0.05 로 검정하여라.  

 

 

학급과 수학성적 분할표 (contingency table of class & math score)

 

 

score High 

score Middle 

score Low 

Fail 

Class 1

7

13

9

12

 Class 2

13

21

10

19

 Class 3

11

18

12

13

 

 

 

먼저 데이터 입력 및 탐색적 분석을 위한 R 함수입니다.

 

 

> ##---------------------------------------------------------------------
> ## categorical data analysis - (2) test of independence : chisq.test()
> ##---------------------------------------------------------------------
> 
> ##-------------
> # (a) textbook problem
> 
> ## data key-in
> # data key-in way 1 : rbind()
> row_1 <- c(7, 13, 9, 12)
> row_2 <- c(13, 21, 10, 19)
> row_3 <- c(11, 18, 12, 13)
> 
> data_rbind <- rbind(row_1, row_2, row_3)
> data_rbind
      [,1] [,2] [,3] [,4]
row_1    7   13    9   12
row_2   13   21   10   19
row_3   11   18   12   13
> 
> 
> # data key-in way 2 : matrix()
> raw_data <- c(7, 13, 9, 12, 13, 21, 10, 19, 11, 18, 12, 13)
> data_matrix <- matrix(raw_data, byrow=TRUE, nrow=3)
> data_matrix
     [,1] [,2] [,3] [,4]
[1,]    7   13    9   12
[2,]   13   21   10   19
[3,]   11   18   12   13
> 
> 
> # giving names to the rows and columns of the data table : dimnames()
> dimnames(data_matrix) <- list("Class" = c("Class_1", "Class_2", "Class_3"), 
+                               "Score" = c("Score_H", "Score_M", "Score_L", "Fail"))
> 
> data_matrix
         Score
Class     Score_H Score_M Score_L Fail
  Class_1       7      13       9   12
  Class_2      13      21      10   19
  Class_3      11      18      12   13
> 
> 
> ## exploratory data analysis
> # marginal distribution : addmargins()
> addmargins(data_matrix)
         Score
Class     Score_H Score_M Score_L Fail Sum
  Class_1       7      13       9   12  41
  Class_2      13      21      10   19  63
  Class_3      11      18      12   13  54
  Sum          31      52      31   44 158
> 
> 
> # proportional distribution : prop.table()
> prop.table(data_matrix)
         Score
Class        Score_H    Score_M    Score_L       Fail
  Class_1 0.04430380 0.08227848 0.05696203 0.07594937
  Class_2 0.08227848 0.13291139 0.06329114 0.12025316
  Class_3 0.06962025 0.11392405 0.07594937 0.08227848
> 
> addmargins(prop.table(data_matrix))
         Score
Class        Score_H    Score_M    Score_L       Fail       Sum
  Class_1 0.04430380 0.08227848 0.05696203 0.07594937 0.2594937
  Class_2 0.08227848 0.13291139 0.06329114 0.12025316 0.3987342
  Class_3 0.06962025 0.11392405 0.07594937 0.08227848 0.3417722
  Sum     0.19620253 0.32911392 0.19620253 0.27848101 1.0000000
> 
> 
> # bar plot : barplot()
> barplot(t(data_matrix), beside=TRUE, legend=TRUE, 
+         ylim=c(0, 30), 
+         ylab="Observed frequencies in sample", 
+         main="Frequency of math score by class")
> 

 

 

 

 

 

다음으로 카이제곱 검정 및 통계량 indexing 방법입니다.

 

 

> 
> ## chisquared test : chisq.test()
> chisq.test(data_matrix)

	Pearson's Chi-squared test

data:  data_matrix
X-squared = 1.3859, df = 6, p-value = 0.9667

> 
> 
> # indexing statistics of chisq.test()
> chisq.test_output_2 <- chisq.test(data_matrix)
> 
> chisq.test_output_2$observed # observed frequency
         Score
Class     Score_H Score_M Score_L Fail
  Class_1       7      13       9   12
  Class_2      13      21      10   19
  Class_3      11      18      12   13
> chisq.test_output_2$expected # expected frequeycy
         Score
Class       Score_H  Score_M   Score_L     Fail
  Class_1  8.044304 13.49367  8.044304 11.41772
  Class_2 12.360759 20.73418 12.360759 17.54430
  Class_3 10.594937 17.77215 10.594937 15.03797
> chisq.test_output_2$residuals # residual between observed and expected frequecy
         Score
Class        Score_H     Score_M    Score_L       Fail
  Class_1 -0.3681990 -0.13439170  0.3369579  0.1723221
  Class_2  0.1818200  0.05837794 -0.6714739  0.3475383
  Class_3  0.1244439  0.05404747  0.4316649 -0.5255380
> 
> chisq.test_output_2$statistic # chi-squared statistics
X-squared 
 1.385926 
> chisq.test_output_2$parameter # degrees of freedom
df 
 6 
> chisq.test_output_2$p.value # P-value
[1] 0.966709

  

 

 

위 분석결과를 보면 P-value가 0.966709 로서 유의수준 α 0.05보다 크므로 귀무가설 H0를 채택하여 "학급과 수학성적 간에는 서로 관련성이 없다. 즉, 독립적이다"고 판단할 수 있겠습니다.

 

 

 

이상으로 독립성 검정(test of independence)을 카이제곱 검정 기법을 사용해서 하는 방법을 소개하였습니다.

 

 

 

 

다음번 포스팅에서는 (3) 동질성 검정(test of homegeneity)에 대해서 알아보도록 하겠습니다.

 

많은 도움이 되었기를 바랍니다.

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡'를 꾸욱 눌러주세요. ^^

 

 

 

 

728x90
반응형
Posted by Rfriend
,