이번 포스팅에서는 벡터(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
,

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

 

앞서의 포스팅에서는 종속변수가 연속형 자료(continuous data)인 경우에 사용하는 검정 방법으로 t-Test와 ANOVA에 대해서 소개하였습니다.

 

이번 포스팅부터는 종속변수가 범주형 자료(categorical data)인 경우에 사용하는 분석기법으로 카이제곱 검정(Chi-Squared Test)에 대해서 알아보도록 하겠습니다.

 

범주형 자료 분석은 크게 적합도 검정(goodness f fit test), 독립성 검정(test of independence), 동질성 검정(test of homogeneity)의 3가지로 분류할 수 있으며, 이번 포스팅에서는 (1) 적합도 검정에 대해서 알아보도록 하겠습니다.

 

 

 

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

 

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

 

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

 

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

 

 

 

 

 

 

적합도 검정(goodness of fit test)은 k개의 범주 (혹은 계급)을 가지는 한 개의 요인(factor)에 대해서 어떤 이론적 분포를 따르고 있는지를 검정하는 방법입니다. 

 

기본 원리는, 도수분포의 각 구간에 있는 관측도수를 O1, O2, ..., Ok 라 하고, 각 범주 ( 혹은 계급)가 일어날 확률을 p1, p2, ..., pk 라고 할 때 기대되는 관측도수 E1, E2, ..., Ek 를 계산하여 실제 관측도수와 기대 관측도수의 차이를 카이제곱 검정 통계량(Chi-squared statistics)을 활용하여 가정한 확률모형에 적합한지를 평가하게 됩니다. 만약 귀무가설 H0가 맞다면 관측도수와 기대도수가 별 차이가 없을 것이므로 검정통계량 X0^2 값이 작을 것이며, 반대로 대립가설 H1이 맞다면 관측도수와 기대도수의 차이가 클 것이므로 검정통계량 X0^2 값이 커질 것입니다.

 

 

 

[ 적합도 검정 가설 및 검정 통계량, 검정 방법 ]

(1) 가설

 

  - 귀무가설 H0 : 관측값의 도수와 가정한 이론 도수(기대 관측도수)가 동일하다
                        ( p1 = p10, p2 = p20, ..., pk = pko )

 

  - 대립가설 H1 : 적어도 하나의 범주 (혹은 계급)의 도수가 가정한 이론 도수(기대 관측도수)와 다르다

                        (적어도 하나의 pi는 가정된 값 pi0과 다르다)

 

 

(2) 검정 통계량

 

 

 

(3) 검정 방법

 

 

 

 

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

 

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

 

 

 

(문제)  유전학자 멘델은 콩 교배에 대한 유전의 이론적 모형으로서 잡종비율을 A : B : C = 2 : 3 : 5 라고 주장하였다.  이 이론의 진위를 가리기 위해 두 콩 종자의 교배로 나타난 100개의 콩을 조사하였더니 A형 19개, B형 41개, C형 40개였다.  이러한 관찰값을 얻었을 때 멘델 유전학자의 이론이 맞다고 할 수 있는지를 유의수준 α = 0.05 에서 검정하여라.

 

 

 

> ##---------------------------------------------------------------------
> ## categorical data analysis - (1) goodness of fit test : chisq.test()
> ##---------------------------------------------------------------------
> 
> obs <- c(19, 41, 40)
> null.probs <- c(2/10, 3/10, 5/10)
> 
> chisq.test(obs, p=null.probs)

	Chi-squared test for given probabilities

data:  obs
X-squared = 6.0833, df = 2, p-value = 0.04776

 

 

위 분석결과를 보면 P-value가 0.04776 이므로 유의수준 α 0.05보다 작으므로 귀무가설 H0를 기각하고 대립가설 H1을 채택하여 "멘델이 주장한 콩의 잡종비율 이론적 분포는 적합하지 않다"고 판단할 수 있겠습니다.

 

 

 참고로, R로 통계분석을 하면 콘솔 창에 보여지는 내용 말고도 실제로 다양한 통계량이 계산이 되어 list 형태로 메모리상에 가지고 있으며 단지 눈에 보이지 않을 뿐인데요, indexing 기법을 활용하면 chisq.test() 함수로 카이제곱 검정 실행한 후에 다양한 통계량들을 선별해서 볼 수도 있고, 통계량을 다른 분석 혹은 애플리케이션에 input으로 넣어 재활용할 수도 있습니다.  R의 큰 장점 중의 하나이니 팁으로 알아두면 좋겠습니다. 주요 통계량 몇 개를 아래에 소개합니다.

 

 

> # To see results of chisquared test
> chisq.test_output_1 <- chisq.test(obs, p=null.probs)
> 
> chisq.test_output_1$observed # observed frequency
[1] 19 41 40
> chisq.test_output_1$expected # expected frequeycy
[1] 20 30 50
> chisq.test_output_1$residuals # residual between observed and expected frequecy
[1] -0.2236068  2.0083160 -1.4142136
> 
> chisq.test_output_1$statistic # chi-squared statistics
X-squared 
 6.083333 
> chisq.test_output_1$parameter # degrees of freedom
df 
 2 
> chisq.test_output_1$p.value # P-value
[1] 0.04775523

 

 

 

참고로 하나더, 검정통계량 X^2는 귀무가설 H0가 참이라는 가정 하에 근사적으로 자유도가 k-1 인 카이제곱분포를 따르는 것으로 알려져 있습니다.  (☞ 카이제곱 분포(Chi-squared distribution) 참고 포스팅)

 

카이제곱 검정에 사용하는 카이제곱 분포는 범주형 자료의 도수 추정에 사용되는데요, 이때 도수가 너무 작으면 "카이제곱 approximation)이 정확하지 않을 수도 있습니다" 라는 경고메시지가 뜹니다.

 

 

> # Warning message when there are not sufficient frequencies > # R will issue a warning message if any of the EFs fall below 5

> obs_2 <- c(5, 5) > null.probs_2 <- c(0.3, 0.7) > > chisq.test(obs_2, p=null.probs_2) Chi-squared test for given probabilities data: obs_2 X-squared = 1.9048, df = 1, p-value = 0.1675 Warning message: In chisq.test(obs_2, p = null.probs_2) : 카이제곱 approximation은 정확하지 않을수도 있습니다

 

 

 

 

  • (b) chisqtest() of data from a table object

위의 문제는 텍스트 문제로 도수와 확률이 주어지면 'x'와 'p'를 직접 입력하였는데요, 데이터가 Table object 형태로 주어졌을 때 카이제곱 검정으로 적합도 검정하는 방법을 소개하겠습니다.

 

R에 내장된 HairEyeColor table 데이터셋에 있는 Hair 요인 변수를 대상으로, Hair의 요인 수준(factor levels, 혹은 계급 class) 별로 생물학자가 주장하기를 확률이 Black 20%, Brown 50%, Red 10%, Blond 20% 라고 하는데요, 유의수준 α 0.05 로 검정을 해보겠습니다.

 

> ##------------
> # chisq.test() of data from a table object
> str(HairEyeColor) 
 table [1:4, 1:4, 1:2] 32 53 10 3 11 50 10 30 10 25 ...
 - attr(*, "dimnames")=List of 3
  ..$ Hair: chr [1:4] "Black" "Brown" "Red" "Blond"
  ..$ Eye : chr [1:4] "Brown" "Blue" "Hazel" "Green"
  ..$ Sex : chr [1:2] "Male" "Female"
> 
> HairEyeColor 
, , Sex = Male

       Eye
Hair    Brown Blue Hazel Green
  Black    32   11    10     3
  Brown    53   50    25    15
  Red      10   10     7     7
  Blond     3   30     5     8

, , Sex = Female

       Eye
Hair    Brown Blue Hazel Green
  Black    36    9     5     2
  Brown    66   34    29    14
  Red      16    7     7     7
  Blond     4   64     5     8

> 
> dimnames(HairEyeColor)
$Hair
[1] "Black" "Brown" "Red"   "Blond"

$Eye
[1] "Brown" "Blue"  "Hazel" "Green"

$Sex
[1] "Male"   "Female"

> 
> margin.table(HairEyeColor, 1) # Hair
Hair
Black Brown   Red Blond 
  108   286    71   127 
> margin.table(HairEyeColor, 2) # Eye
Eye
Brown  Blue Hazel Green 
  220   215    93    64 
> margin.table(HairEyeColor, 3) # Sex
Sex
  Male Female 
   279    313 
> 
> # vector of observed frequencies and probabilities
> Hair_Freq <- c(margin.table(HairEyeColor, 1))
> Hair_Freq
Black Brown   Red Blond 
  108   286    71   127 
> Hair_Prob <- c(0.2, 0.5, 0.1, 0.2)
> 
> chisq.test(x=Hair_Freq, p=Hair_Prob)

	Chi-squared test for given probabilities

data:  Hair_Freq
X-squared = 4.228, df = 3, p-value = 0.2379

 

 

 

  • (c) chisq.test() of data from Data Frame

 

데이터가 텍스트, Table object가 아니고 Data Frame일 경우에 카이제급 검정하는 방법도 소개해드리겠습니다.  MASS 패키지에 내장된 Cars93 Data Frame 을 이용하며, 자동차종(Type)의 이론상 분포 Compact 20%,  Large 10%, Midsize 20%, Small 20%, Sporty  20%, Van 10% 에 대해서 유의수준 α 0.05로 검정해보겠습니다. 

data(data frame, package="xxx"), table() 함수를 이용합니다.

 

> ##------------
> # chisq.test() of data from data frame
> data(Cars93, package="MASS")
> head(Cars93)
  Manufacturer   Model    Type Min.Price Price Max.Price MPG.city MPG.highway            AirBags
1        Acura Integra   Small      12.9  15.9      18.8       25          31               None
2        Acura  Legend Midsize      29.2  33.9      38.7       18          25 Driver & Passenger
3         Audi      90 Compact      25.9  29.1      32.3       20          26        Driver only
4         Audi     100 Midsize      30.8  37.7      44.6       19          26 Driver & Passenger
5          BMW    535i Midsize      23.7  30.0      36.2       22          30        Driver only
6        Buick Century Midsize      14.2  15.7      17.3       22          31        Driver only
  DriveTrain Cylinders EngineSize Horsepower  RPM Rev.per.mile Man.trans.avail Fuel.tank.capacity
1      Front         4        1.8        140 6300         2890             Yes               13.2
2      Front         6        3.2        200 5500         2335             Yes               18.0
3      Front         6        2.8        172 5500         2280             Yes               16.9
4      Front         6        2.8        172 5500         2535             Yes               21.1
5       Rear         4        3.5        208 5700         2545             Yes               21.1
6      Front         4        2.2        110 5200         2565              No               16.4
  Passengers Length Wheelbase Width Turn.circle Rear.seat.room Luggage.room Weight  Origin
1          5    177       102    68          37           26.5           11   2705 non-USA
2          5    195       115    71          38           30.0           15   3560 non-USA
3          5    180       102    67          37           28.0           14   3375 non-USA
4          6    193       106    70          37           31.0           17   3405 non-USA
5          4    186       109    69          39           27.0           13   3640 non-USA
6          6    189       105    69          41           28.0           16   2880     USA
           Make
1 Acura Integra
2  Acura Legend
3       Audi 90
4      Audi 100
5      BMW 535i
6 Buick Century
> 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 ...
> 
> Car_Type <- table(Cars93$Type)
> Car_Type

Compact   Large Midsize   Small  Sporty     Van 
     16      11      22      21      14       9 
> Car_Type_Prob <- c(0.2, 0.1, 0.2, 0.2, 0.2, 0.1)
> 
> chisq.test(x=Car_Type, p=Car_Type_Prob)

	Chi-squared test for given probabilities

data:  Car_Type
X-squared = 2.7527, df = 5, p-value = 0.738

 

 

 

이상으로 다양한 형태의 데이터셋을 활용해서 적합도 검정(goodness of fit test)을 카이제곱 검정 기법을 사용해서 하는 방법을 소개하였습니다.

 

=> 카이제곱 적합도 검정으로 관측치가 포아송분포로 부터의 데이터인지 여부를 검정하는 예시는 http://rfriend.tistory.com/362 를 참고하세요.

 

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

 

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

 

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

 

 

728x90
반응형
Posted by Rfriend
,

2개의 모집단에 대한 평균을 비교, 분석하는 통계적 기법으로 t-Test를 활용하였다면, 비교하고자 하는 집단이 3개 이상일 경우에는 분산분석 (ANOVA : Analysis Of Variance)를 이용합니다. 

 

설명변수는 범주형 자료(categorical data)이어야 하며, 종속변수는 연속형 자료(continuous data) 일 때 3개 이상 집단 간 평균 비교분석에 분산분석(ANOVA) 을 사용하게 됩니다.

 

분산분석(ANOVA)은 기본적으로 분산의 개념을 이용하여 분석하는 방법으로서, 분산을 계산할 때처럼 편차의 각각의 제곱합을 해당 자유도로 나누어서 얻게 되는 값을 이용하여 수준평균들간의 차이가 존재하는 지를 판단하게 됩니다. 

 

지난번 포스팅에서 이원분산분석(two-way ANOVA) 중에서 (1) 관측값이 하나일 경우 (one observation in each cell)의 이원분산분석 에 대해서 알아보았다면, 이번 포스팅에서는 (2) 관측값이 두개 이상일 경우(more than 2 observations in each cell)의 이원분산분석에 대해서 알아보겠습니다.  단, 이때 각 집단 내 관측값의 개수는 동일합니다.

 

관측값이 두개 이상일 경우의 이원분산분석에서는 두 개의 요인 수준별 주 효과(main effect)와 더불어 두 요인이 서로 상호간에 영향을 주고 받으면서 나타나는 반응효과인 교호작용 효과(interaction effect)를 추가로 분석하는 것이 관측값이 하나인 경우와의 차이점입니다.

 

 

[ 관측값의 개수에 따른 이원분산분석의 분석 대상 ]

 

 

 

 

요인 A의 i번째 수준과 요인 B의 j번째 수준에서 측정된 k번째 관측값을 Yijk라고 할 때 데이터셋의 형태는 아래와 같습니다. 

 

 

[ 이원분산분석 - 데이터 형태 ]

(dataset for two-way ANOVA, factor A & B, factor levels a & b, observations k)]

 

 

 

 

요인 A의 i번째 수준과 요인 B의 j번째 수준에서 측정된 k번째 관측값을 Yijk는 요인 A와 B의 주 효과(main effect)와 함께 두 요인의 교호작용 효과(interaction effect)이 존재하게 되며, 편차 는 아래와 같이 4개의 성분합으로 나타낼 수 있습니다.

 

 

[ 편차의 4개 성분합으로의 분해 ]

 


 

 

위의 식의 양변을 제곱하여 모든 관측값에 대하여 더한 후에 정리를 하면

 

SST = SSA + SSB + SSAB + SSE 

 

의 관계식을 얻게 됩니다.

 

이를 요인과 교호작용별로 제곱합, 자유도, 평균제곱, F통계량을 알기 쉽도록 정리한 이원분산분석표는 아래와 같습니다.

 

[ 이원분산분석표 (two-way ANOVA table) ]

 

 요인

제곱합

(squared sum)

자유도

(degrees of freedom) 

평균제곱

(mean squared) 

F statistics 

 요인 A

(factor A)

 SSA

a-1

MSA

MSA/MSE

 요인 B

(factor B)

 SSB

b-1

MSB

MSB/MSE

 교호작용

(interaction effect of A, B)

 SSAB

 (a-1)(b-1)

MSAB

MSAB/MSE 

 오차

(error)

 SSE

ab(n-1)

MSE

 

 계

(total)

 SST

 nab-1

 

 

 * SST : Total Sum of Squares,  SSE : Error Sum of Squares

 

 

검정통계량으로는 F 통계량(요인A 효과 검정 = MSA/MSE, 요인B 효과 검정 = MSB/MSE, 교호작용 효과 검정 = MSAB/MSE)을 사용하며, 요인 A의 효과와 요인 B, 교호작용 효과에 대한 검정 절차 및 방법은 아래와 같습니다.

 

[ 이원분산분석 검정 방법 ]

 

 

(1) 교호작용 효과 (interaction effect)

   - 귀무가설 H0 : (αβ)ij = 0

   - 대립가설 H1 : 모든 (αβ)ij는 0이 아니다

   - 검정통계량 : F0 = MSAB/MSE

   - 판정 : P-value가 유의수준(α)보다 작으면 귀무가설 H0를 기각하고, 대립가설 H1을 채택

 

 

(2) 요인 A의 주 효과 (main effect of factor A)

   - 귀무가설 H0 : α1 = ... = αa = 0

   - 대립가설 H1 : 모든 αi 는 0이 아니다

   - 검정통계량 : F0 = MSA/MSE

   - 판정 : P-value가 유의수준(α)보다 작으면 귀무가설 H0를 기각하고, 대립가설 H1을 채택

 

 

(3) 요인 B의 주 효과 (main effect of factor B)

   - 귀무가설 H0 : α1 = ... = αb = 0

   - 대립가설 H1 : 모든 αj 는 0이 아니다

   - 검정통계량 : F0 = MSB/MSE

   - 판정 : P-value가 유의수준(α)보다 작으면 귀무가설 H0를 기각하고, 대립가설 H1을 채택

 

 

 

 

 

그럼, 아래 예제에 대해서 R의 aov() 함수를 활용해서 문제를 풀어보도록 하겠습니다.

 

 

(문제)  학급과 성별에 따른 통계학 성적이 아래와 같다고 할 때(각 cell 별 3명의 학생 성적 측정), 유의수준 α = 0.05 에서 학급과 성별 요인의 주효과와 교호작용효과에 대해 검정하시오.

 

[학급과 성별에 따른 통계학 점수표]

 

         Factor B (class)

 

Factor A (gender)

Class 1 

Class 2 

Class 3 

Mean 

남성 (M) 

 71, 77, 78

76, 77, 78 

71, 70, 69 

 75.33

 여성 (F)

 76, 76, 80

79, 78, 77

71, 71, 70 

 74.11

 Mean

76.33 

77.50 

70.33 

74.72 

 

 

 

아래에 요약통계량과 교호작용 여부를 가늠해볼 수 있는 그래프 생성 R 함수도 일부 추가하였습니다. 만약 교호작용효과 그래프(Interaction Effect Plot) 가 서로 교차를 하면 교호작용이 있다고 보면 되며, 서로 평행선을 이룬다면 교호작용이 없다고 해석하면 되겠습니다.  (교호작용도는 엑셀로 치면 "꺽은선형 차트"가 되겠습니다)

 

 

[ R aov() 함수 사용 방법 ]

 

 
> # (2) two-way ANOVA when there are more than one observation per cell (different treatment groups)
> #     (the number of observations in each cell must be equal)
> 
> gender.fac <- as.factor(c(rep("M", 9), rep("F", 9)))
> gender.fac
 [1] M M M M M M M M M F F F F F F F F F
Levels: F M
> 
> class <- c("class_1", "class_1", "class_1", "class_2", "class_2", "class_2", "class_3", "class_3", "class_3")
> class.fac <- as.factor(c(rep(class, 2)))
> class.fac
 [1] class_1 class_1 class_1 class_2 class_2 class_2 class_3 class_3 class_3 class_1 class_1
[12] class_1 class_2 class_2 class_2 class_3 class_3 class_3
Levels: class_1 class_2 class_3
> 
> score_stats <- c(71, 77, 78, 76, 77, 78, 71, 70, 69, 80, 76, 80, 79, 78, 77, 73, 71, 70)
> 
> 
> # summary statistics
> score.df <- data.frame(gender.fac, class.fac, score_stats)
> score.df
   gender.fac class.fac score_stats
1           M   class_1          71
2           M   class_1          77
3           M   class_1          78
4           M   class_2          76
5           M   class_2          77
6           M   class_2          78
7           M   class_3          71
8           M   class_3          70
9           M   class_3          69
10          F   class_1          80
11          F   class_1          76
12          F   class_1          80
13          F   class_2          79
14          F   class_2          78
15          F   class_2          77
16          F   class_3          73
17          F   class_3          71
18          F   class_3          70
> 
> install.packages("doBy")

Installing package into ‘C:/Users/user/Documents/R/win-library/3.2’
(as ‘lib’ is unspecified)
trying URL 'http://cran.rstudio.com/bin/windows/contrib/3.2/doBy_4.5-13.zip'
Content type 'application/zip' length 3431466 bytes (3.3 MB)
downloaded 3.3 MB

package ‘doBy’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
	C:\Users\user\AppData\Local\Temp\RtmpWOKfji\downloaded_packages

 

 

> library(doBy)
> summaryBy(score_stats ~ gender.fac, data=score.df, FUN = c(mean, sd, min, max))
  gender.fac score_stats.mean score_stats.sd score_stats.min score_stats.max
1          F         76.00000       3.807887              70              80
2          M         74.11111       3.756476              69              78
> summaryBy(score_stats ~ class.fac, data=score.df, FUN = c(mean, sd, min, max))
  class.fac score_stats.mean score_stats.sd score_stats.min score_stats.max
1   class_1         77.00000       3.346640              71              80
2   class_2         77.50000       1.048809              76              79
3   class_3         70.66667       1.366260              69              73
> summary(score_stats, data=score.df)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  69.00   71.00   76.50   75.06   78.00   80.00 
> 
 
> # box plot and interaction plot
> par(mfrow = c(2, 2))
> plot(score_stats ~ gender.fac, main="box plot by gender")
> plot(score_stats ~ class.fac, main="box plot by class")
> interaction.plot(gender.fac, class.fac, score_stats, bty='l', main="interaction effect plot")
> interaction.plot(class.fac, gender.fac, score_stats, bty='l', main="interaction effect plot")
> 

 


> 
> # two-way ANOVA : aov()
> # replicates, interaction effect
> aov_model = aov(score_stats ~ gender.fac + class.fac + gender.fac:class.fac)
> summary(aov_model)
                     Df Sum Sq Mean Sq F value   Pr(>F)    
gender.fac            1  16.06   16.06   3.853 0.073249 .  
class.fac             2 174.11   87.06  20.893 0.000123 ***
gender.fac:class.fac  2   4.78    2.39   0.573 0.578354    
Residuals            12  50.00    4.17                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

 

 

 

R 분석 결과 중에서 제일 아래에 있는 이원분산분석표를 가지고 해석을 해보겠습니다.  먼저 (1) 교호작용이 있는지를 살펴보면, 성별과 학급별에 따른 교호작용효과에 대한 P-value가 0.578354로서 유의수준 α 0.05보다 크므로 귀무가설 H0를 채택하여 "성별과 학급의 교호작용에 의한 효과는 없다"고 판단할 수 있습니다.

 

두번째로 (2) 성별 요인(factor A levels of "M", "F")에 대한 P-value는 0.073249로서 유의수준 α 0.05 보다 크므로 귀무가설 H0를 채택하게 되어 "성별에 따른 통계학 성적 차이는 없다"고 판단할 수 있습니다.

 

세번째로 (3) 학급 요인(factor B levels of "class_1", "class_2", "class_3")에 따른 P-value는 0.000123으로서 유의수준 α 0.05보다 작으므로 귀무가설 H0를 기각하고 대립가설 H1을 채택하여 "학급에 따른 통계학 성적의 차이가 있다"고 판단할 수 있습니다.

 

 

학급 요인에 대해서는 유의수준 α 0.05에서 차이가 있다고 나왔으므로, 어떤 학급 간에 차이가 있는지를 알아보고 싶다면, 사후 쌍을 이룬 다중 비교 분석(post-hoc pair-wise multiple comparison)을 하면 됩니다.  이에 대한 자세한 설명은 아래의 링크를 참조하시기 바랍니다.

  • 쌍을 이룬 집단 간 평균 다중비교 (multiple comparison)

Tukey's HSD(honestly significant difference) test 참조

Duncan's LSR(least significant range) test 참고

 

 

  • 대비 (contrast)

샤페 검정법 (scheffe test) 참고

 

 

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

 

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

 

728x90
반응형
Posted by Rfriend
,

2개의 모집단에 대한 평균을 비교, 분석하는 통계적 기법으로 t-Test를 활용하였다면, 비교하고자 하는 집단이 3개 이상일 경우에는 분산분석 (ANOVA : Analysis Of Variance)를 이용합니다. 

 

설명변수는 범주형 자료(categorical data)이어야 하며, 종속변수는 연속형 자료(continuous data) 일 때 3개 이상 집단 간 평균 비교분석에 분산분석(ANOVA) 을 사용하게 됩니다.

 

분산분석(ANOVA)은 기본적으로 분산의 개념을 이용하여 분석하는 방법으로서, 분산을 계산할 때처럼 편차의 각각의 제곱합을 해당 자유도로 나누어서 얻게 되는 값을 이용하여 수준평균들간의 차이가 존재하는 지를 판단하게 됩니다.  

 

이전 포스팅에서 '일원분산분석(one-way ANOVA)'에 대해서 알아봤는데요, 이번 포스팅에서는 '이원분산분석(two-way ANOVA)'에 대해서 소개하도록 하겠습니다. 

 

 

[ 분산분석(ANOVA)의 분류 ]

 

 

 

일원분산분석(one-way ANOVA)이 1개의 요인(factor) 내의 요인 수준(factor levels)들이 각각의 집단(group)/처리(treatment)이 되어서 이들 집단/처리 간의 평균 차이를 비교하는 것이라면, 이원분산분석(two-way ANOVA)은 2개의 요인(2 factors) 내의 요인 수준(factor levels) 간의 조합(combination)들 각 각을 개별 집단/처리(groups, treamments)로 간주하고 이들간에 평균을 비교하게 됩니다.

 

가령, 요인(factor) A '온도'가 3개의 요인 수준(factor levels, 온도 상, 중, 하)을 가지고 요인(factor) B '압력'이 2개의 요인 수준(factor levels, 압력 강, 약)을 가진다고 할 경우, 총 그룹/처리의 수는 (A.온도) 3 x (B.압력) 2 = 6 개가 됩니다.

 

이원분산분석은 (1) 관측값이 하나일 경우와 (2) 관측값이 2개 이상일 경우 (반복 실험을 할 경우)로 나누어볼 수 있습니다.  비용이나 시간 여건이 허락한다면 분석의 신뢰도를 높이기 위해서는 반복 실험 혹은 관찰을 통해 관측값을 2개 이상 확보하는 것이 좋겠습니다.

 

우선 이번 포스팅에서는 (1) 관측값이 하나일 경우의 이원분산분석(two-way ANOVA when there is one observation in each cell (different treatment groups)) 에 대해서 소개하고, 다음번 포스팅에서 (2) 관측값이 2개 이상일 경우(반복 실험을 할 경우)의 이원분산분석에 대해서 순차적으로 소개하도록 하겠습니다.

 

이원분산분석을 위한 데이터셋의 구조는 아래와 같습니다.

 

 

[ 이원분산분석을 위한 데이터셋 구조 (Dataset for two-way ANOVA) ]

 

 

 

요인 A가 i=1, 2, ..., a 개의 요인 수준(factor levels)을 가지고, 요인 B가 j=1, 2, ..., b 개의 요인 수준(factor levels)을 가진다고 했을 때, A와 B라는 2개의 요인 처리(treatment) 내의 관측값이 하나일 경우의 이원분산분석모형은 편차 (Yij - Y..bar)를 다음과 같이 3개의 성분합으로 나타낼 수 있습니다. 


 

이 식의 양변을 제곱하여 모든 관측값에 대해 더하면 다음과 같은 식을 얻게 됩니다.

 

 

 

관측값이 하나일 경우의 이원분산분석을 실시할 경우 통계패키지에서는 아래와 같은 형태로 정리된 이원분산분석표를 제시하여 줍니다.

 

 

 [ 이원분산분석표 (two-way ANOVA table) ]

 

 요인

제곱합

(squared sum)

자유도

(degrees of freedom) 

평균제곱

(mean squared) 

F statistics 

 요인 A

 SSA

a-1

MSA

MSA/MSE

 요인 B

 SSB

b-1

MSB

MSB/MSE

 오차

 SSE

(a-1)(b-1) 

MSE 

 

 계

 SST

 ab-1

 

 

 

 

검정통계량으로는 F 통계량(요인A 효과 검정 = MSA/MSE, 요인B 효과 검정 = MSB/MSE)을 사용하며, 요인 A의 효과와 요인 B의 효과에 대한 검정 방법은 아래와 같습니다.

 

 

(1) 요인 A의 효과

   - 귀무가설 H0 : α1 = ... = αa = 0

   - 대립가설 H1 : 모든 αi 는 0이 아니다

   - 검정통계량 : F0 = MSA/MSE

   - 판정 : P-value가 유의수준(α)보다 작으면 귀무가설 H0를 기각하고, 대립가설 H1을 채택

 

 

(2) 요인 B의 효과

   - 귀무가설 H0 : α1 = ... = αb = 0

   - 대립가설 H1 : 모든 αj 는 0이 아니다

   - 검정통계량 : F0 = MSB/MSE

   - 판정 : P-value가 유의수준(α)보다 작으면 귀무가설 H0를 기각하고, 대립가설 H1을 채택

 

 

 

그럼, 아래 예제에 대해서 R의 aov() 함수를 활용해서 문제를 풀어보도록 하겠습니다.

(예제는 'Excel을 이용한 실용통계분석', 배현웅 저, 교우사, 에서 인용함)

 

 

(문제) K와 M 두 보험회사의 차종 (1,000cc 이하, 1,500cc, 1,800cc)에 따른 분기별 보험료(단위: 천원)가 아래 표와 같다고 할 때 유의수준 α=0.05 로 차종(요인 A)과 회사(요인 B)의 효과에 대한 검정을 하여라.

 

[ 보험회사와 차종에 따른 보험료 ]

 

              보험회사

 차종

K 회사 

M 회사

평균 

1,000 cc 이하 

140

100

120

 1,500 cc

 210

180

 195

 1,800 cc

 220

200

 210

 평균

 190

160

 175

 

 

 

> ##--------------------------------------------------------------
> ## two-way ANOVA : aov()
> ##--------------------------------------------------------------
> 
> # (1) two-way ANOVA when there is one observation in each cell (different treatment groups)
> 
> car_type <- rep(c('1000', '1500', '1800'), 2)
> car_type <- as.factor(car_type) # transformation into factor
> car_type
[1] 1000 1500 1800 1000 1500 1800
Levels: 1000 1500 1800
> 
> insurance <- as.factor(c(rep('K', 3), rep('M', 3))) # transforamtion into factor
> insurance
[1] K K K M M M
Levels: K M
> 
> y <- c(140, 210, 220, 100, 180, 200)
> 
> 
> # two way ANOVA
> two_way_aov_model_1 <- aov(y ~ car_type + insurance) # no replicates, no interaction
> 
> # statistics of two-way ANOVA
> summary(two_way_aov_model_1)
            Df Sum Sq Mean Sq F value Pr(>F)  
car_type     2   9300    4650      93 0.0106 *
insurance    1   1350    1350      27 0.0351 *
Residuals    2    100      50                 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

 

 

위의 분석결과를 해석해보면, 먼저 요인A 차종에 따른 분산분석 결과 P-value가 0.0106으로서 유의수준(significance level) 0.05보다 작으므로 우리는 "차종에 따라서 보험료에 차이가 있다"는 대립가설(H1)을 채택할 수 있게 되었습니다.

 

또한, 요인B 보험회사에 따른 분산분석 결과 P-value가 0.0351로서 유의수준(significance level, α) 0.05보다 역시 작으므로 "보험회사에 따라서 보험료에 차이가 있다"는 대립가설(H1)을 채택할 수 있겠습니다.

 

다음번 포스팅에서는 (2) 관측값이 2개 이상일 경우(반복 실험일 경우)의 이원분산분석에 대해서 알아보겠습니다.

 

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

 

 

일원분산분석 및 사후분석(post-hoc multiple comparison)에 대해서는 아래 링크를 참조하세요.

  • 1개 요인(factor)에 대한 3 집단 이상 집단의 평균 비교 (ANOVA)

one-way ANOVA

 

 

  • 쌍을 이룬 집단 간 평균 다중비교 (multiple comparison)

Tukey's HSD(honestly significant difference) test 참조

Duncan's LSR(least significant range) test 참고

 

  • 대비 (contrast)

샤페 검정법 (scheffe test) 참고

 

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

 

 

728x90
반응형
Posted by Rfriend
,