기본 콘텐츠로 건너뛰기

벡터와 행렬에 관련된 그림들

R factor(요인)

Factor

변수는 명목형(nominal), 순서형(ordinal) 또는 연속형(continumous)으로 설명할 수 있습니다. 명목 변수는 암시적 순서 없이 범주형입니다. 당뇨병(Type1, Type2)은 명목 변수의 예입니다. 데이터에서 Type1이 1로 코딩되고 Type2가 2로 코딩되더라도 순서를 의미하지 않습니다. 순서 변수는 순서를 의미하지만 양은 의미하지 않습니다. 상태(나쁨, 개선됨, 우수함)는 각각의 순서를 지정할 수 있지만 그 순서간의 차이는 명확하지 않습니다. 연속 변수는 특정 범위 내에서 임의의 값을 취할 수 있으며 순서와 양이 모두 암시됩니다. 연령(년)은 연속 변수이며 14.5 또는 22.8 및 그 사이의 값들을 사용할 수 있습니다. 15세인 사람이 14세인 사람보다 한 살 많다는 것을 알고 있습니다. R의 범주형 및 순서형 변수를 요인(factor)이라고 합니다. 요인은 데이터를 시각적으로 분석하고 표시하는 방법을 결정하기 때문에 R에서 중요하며 R의 factor() 함수는 범주형(순서형을 포함) 값을 [1... k] 범위의 정수 벡터로 저장하고(여기서 k는 명목 변수의 고유값 수) 문자열의 내부 벡터(원래 값) 이 정수에 매핑됩니다. 다음 벡터 diabetes는 두 개의 범주로 목록화 할 수 있습니다. 이렇게 데이터의 고유값들을 수준(level)이라고 합니다. factor()함수는 벡터의 값들과 level을 함께 반환합니다.
diabetes<-c('type1', 'type2', 'type1', 'type1')
diafact<-factor(diabetes); diafact
[1] type1 type2 type1 type1
Levels: type1 type2
순서형 변수의 경우 인자 ordered=TRUE를 첨가하여 각 목록의 순서를 지정합니다. 이 경우 순서는 기본적으로 알파벳 순으로 지정됩니다. 예를 들어 다음의 경우 excellent=1, improved=2, poor=3으로 순서가 지정됩니다.
status<-c('poor', 'improved', 'excellent', 'poor')
statfac<-factor(status, ordered=TRUE); statfac
[1] poor improved  excellent poor     
Levels: excellent < improved < poor
많은 경우 default인 알파벳 정렬은 데이터의 목록화에 불충분합니다. 대신에 factor()함수에서 그 순서를 지정합니다.
factor(벡터, order=TRUE, levels=수준벡터
statfac<-factor(status, order=TRUE, levels=c('poor','improved', 'excellent')); statfac
[1] poor      improved  excellent poor     
Levels: poor < improved < excellent
위 두 요인들을 데이터프레임으로 묶어 봅니다.
da<-data.frame(diafact, statfac); da
 diafact   statfac
1   type1      poor
2   type2  improved
3   type1 excellent
4   type1      poor
위 객체의 정보는 str()함수에 의해 확인할 수 있습니다.
str(da)
'data.frame':   4 obs. of  2 variables:
$ diafact: Ord.factor w/ 2 levels "type1"<"type2": 1 2 1 1
$ statfac: Ord.factor w/ 3 levels "poor"<"improved"<..: 1 2 3 1
summary() 함수는 객체의 요약 통계량을 반환합니다. 요인변수인 경우는 각 levle의 빈도수를 나타냅니다.
summary(da)
diafact       statfac 
type1:3   poor     :2  
type2:1   improved :1  
            excellent:1  
위 결과 역시 데이터프레임 구조이므로 인덱스에 의해 각 요소를 호출할 수 있습니다.
summary(da)[,1]
type1:3  " "type2:1  "          NA 
summary(da)[,2]
"poor     :2  " "improved :1  " "excellent:1  " 
다음은 숫자형 벡터를 요인으로 목록화 한 것입니다. 1에서 4번의 공들 중에서 무작위로 10개를 선택한 것이라고 합시다.
x<-sample(1:4, 10, replace=TRUE); x
[1] 2 3 3 1 2 4 2 4 2 4
위 객체는 각각 1번 공, 2번 공, 3번 공, 그리고 4번 공으로 그룹화할 수 있습니다. 이 경우 1,2,3,4를 데이터의 수준(level)으로 합니다.
xf<-factor(x); xf
[1] 2 3 3 1 2 4 2 4 2 4
Levels: 1 2 3 4
attributes(xf)
$levels
[1] "1" "2" "3" "4"

$class
[1] "factor"
factor 객체의 levels은 인덱스 1이나 levels() 함수로 확인할 수 있습니다.
xf[1]
[1] 2
Levels: 1 2 3 4
levels(xf)
[1] "1" "2" "3" "4"
다음은 'languag', 'math', 'science'의 시험 결과들 중 25개를 선택하여 각 과목의 평균을 계산해 봅니다.
dep<-sample(c('language', 'math', 'science'), 25, replace=TRUE); dep
[1] "math"     "language" "science"  "language" "math"     "science" 
[7] "math"     "science"  "math"     "language" "language" "language"
[13] "language" "math"     "math"     "math"     "science"  "science"
[19] "math"     "language" "language" "science"  "language" "language"
[25] "language"
이 경우 위 세 학과를 level로 하는 요인(factor) 객체를 생성할 수 있습니다.
depf<-factor(dep);depf
[1] math    .... language 
Levels: language math science
y<-sample(c('a', 'c', 'v'), 10, replace=TRUE); y
[1] "a" "a" "c" "a" "v" "c" "a" "c" "v" "v"
yf<-factor(y); yf
[1] a a c a v c a c v v
Levels: a c v
levels(yf)
[1] "a" "c" "v"
선택한 시험의 값들로 구성한 객체는 다음과 같습니다.
score<-sample(65:100, 25); score
[1]  89  96  85  70  88  98  79  73  71  78  75  69  87  76  65  95  93  80  74
[20]  68  94  77  90  72 100
객체 score의 각 요소에 이름을 names() 함수를 사용하여 부여 할 수 있습니다.
score1<-score              
names(score1)<-unclass(dep)
score1
math language  science language     math  science     math  science 
    89       96       85       70       88       98       79       73
math language language language language     math     math     math
    71       78       75       69       87       76       65       95
science  science     math language language  science language language
    93       80       74       68       94       77       90       72
language
    100
객체 score의 각 원소들을 'language','math','science'로 그룹화하여 각 그룹의 평균을 계산하기 위해 tapply(vector, factor, 함수) 함수를 적용합니다. 이 함수는 vector를 factor의 level로 그룹화하여 각 그룹에 함수를 적용합니다.
tapply(score, dep, mean)
language     math  science 
81.72727 79.62500 84.33333
같은 그룹에 대한 표준오차를 계산합니다. 표준오차는 분산과 길이를 반환하는 함수 var()length()를 사용하여 다음과 같이 정의할 수 있습니다. 
stdErr<-function(x)sqrt(var(x)/length(x))
tapply(score, dep, stdErr)
language     math  science 
3.600735 3.605242 3.929942 

댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. $$\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B $$ 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. \begin{align}\tag{식 2} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align} 식 2의 행렬식은 식 3과 같이 정리됩니다. \begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \textsf{det}(I)\end{aligned}\end{align} 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같...

[sympy] Sympy객체의 표현을 위한 함수들

Sympy객체의 표현을 위한 함수들 General simplify(x): 식 x(sympy 객체)를 간단히 정리 합니다. import numpy as np from sympy import * x=symbols("x") a=sin(x)**2+cos(x)**2 a $\sin^{2}{\left(x \right)} + \cos^{2}{\left(x \right)}$ simplify(a) 1 simplify(b) $\frac{x^{3} + x^{2} - x - 1}{x^{2} + 2 x + 1}$ simplify(b) x - 1 c=gamma(x)/gamma(x-2) c $\frac{\Gamma\left(x\right)}{\Gamma\left(x - 2\right)}$ simplify(c) $\displaystyle \left(x - 2\right) \left(x - 1\right)$ 위의 예들 중 객체 c의 감마함수(gamma(x))는 확률분포 등 여러 부분에서 사용되는 표현식으로 다음과 같이 정의 됩니다. 감마함수는 음이 아닌 정수를 제외한 모든 수에서 정의됩니다. 식 1과 같이 자연수에서 감마함수는 factorial(!), 부동소수(양의 실수)인 경우 적분을 적용하여 계산합니다. $$\tag{식 1}\Gamma(n) =\begin{cases}(n-1)!& n:\text{자연수}\\\int^\infty_0x^{n-1}e^{-x}\,dx& n:\text{부동소수}\end{cases}$$ x=symbols('x') gamma(x).subs(x,4) $\displaystyle 6$ factorial 계산은 math.factorial() 함수를 사용할 수 있습니다. import math math.factorial(3) 6 a=gamma(x).subs(x,4.5) a.evalf(3) 11.6 simpilfy() 함수의 알고리즘은 식에서 공통사항을 찾아 정리하...

sympy.solvers로 방정식해 구하기

sympy.solvers로 방정식해 구하기 대수 방정식을 해를 계산하기 위해 다음 함수를 사용합니다. sympy.solvers.solve(f, *symbols, **flags) f=0, 즉 동차방정식에 대해 지정한 변수의 해를 계산 f : 식 또는 함수 symbols: 식의 해를 계산하기 위한 변수, 변수가 하나인 경우는 생략가능(자동으로 인식) flags: 계산 또는 결과의 방식을 지정하기 위한 인수들 dict=True: {x:3, y:1}같이 사전형식, 기본값 = False set=True :{(x,3),(y,1)}같이 집합형식, 기본값 = False ratioal=True : 실수를 유리수로 반환, 기본값 = False positive=True: 해들 중에 양수만을 반환, 기본값 = False 예 $x^2=1$의 해를 결정합니다. solve() 함수에 적용하기 위해서는 다음과 같이 식의 한쪽이 0이 되는 형태인 동차식으로 구성되어야 합니다. $$x^2-1=0$$ import numpy as np from sympy import * x = symbols('x') solve(x**2-1, x) [-1, 1] 위 식은 계산 과정은 다음과 같습니다. $$\begin{aligned}x^2-1=0 \rightarrow (x+1)(x-1)=0 \\ x=1 \; \text{or}\; -1\end{aligned}$$ 예 $x^4=1$의 해를 결정합니다. solve() 함수의 인수 set=True를 지정하였으므로 결과는 집합(set)형으로 반환됩니다. eq=x**4-1 solve(eq, set=True) ([x], {(-1,), (-I,), (1,), (I,)}) 위의 경우 I는 복소수입니다.즉 위 결과의 과정은 다음과 같습니다. $$x^4-1=(x^2+1)(x+1)(x-1)=0 \rightarrow x=\pm \sqrt{-1}, \; \pm 1=\pm i,\; \pm1$$ 실수...