기본 콘텐츠로 건너뛰기

[ML] 결정트리(Decision Tree) 모델

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' 와 같

[matplotlib] 히스토그램(Histogram)

히스토그램(Histogram) 히스토그램은 확률분포의 그래픽적인 표현이며 막대그래프의 종류입니다. 이 그래프가 확률분포와 관계가 있으므로 통계적 요소를 나타내기 위해 많이 사용됩니다. plt.hist(X, bins=10)함수를 사용합니다. x=np.random.randn(1000) plt.hist(x, 10) plt.show() 위 그래프의 y축은 각 구간에 해당하는 갯수이다. 빈도수 대신 확률밀도를 나타내기 위해서는 위 함수의 매개변수 normed=True로 조정하여 나타낼 수 있다. 또한 매개변수 bins의 인수를 숫자로 전달할 수 있지만 리스트 객체로 지정할 수 있다. 막대그래프의 경우와 마찬가지로 각 막대의 폭은 매개변수 width에 의해 조정된다. y=np.linspace(min(x)-1, max(x)+1, 10) y array([-4.48810153, -3.54351935, -2.59893717, -1.65435499, -0.70977282, 0.23480936, 1.17939154, 2.12397372, 3.0685559 , 4.01313807]) plt.hist(x, y, normed=True) plt.show()

R 미분과 적분

내용 expression 미분 2차 미분 mosaic를 사용한 미분 적분 미분과 적분 R에서의 미분과 적분 함수는 expression()함수에 의해 생성된 표현식을 대상으로 합니다. expression expression(문자, 또는 식) 이 표현식의 평가는 eval() 함수에 의해 실행됩니다. > ex1<-expression(1+0:9) > ex1 expression(1 + 0:9) > eval(ex1) [1] 1 2 3 4 5 6 7 8 9 10 > ex2<-expression(u, 2, u+0:9) > ex2 expression(u, 2, u + 0:9) > ex2[1] expression(u) > ex2[2] expression(2) > ex2[3] expression(u + 0:9) > u<-0.9 > eval(ex2[3]) [1] 0.9 1.9 2.9 3.9 4.9 5.9 6.9 7.9 8.9 9.9 미분 D(표현식, 미분 변수) 함수로 미분을 실행합니다. 이 함수의 표현식은 expression() 함수로 생성된 객체이며 미분 변수는 다음 식의 분모의 변수를 의미합니다. $$\frac{d}{d \text{변수}}\text{표현식}$$ 이 함수는 어떤 함수의 미분의 결과를 표현식으로 반환합니다. > D(expression(2*x^3), "x") 2 * (3 * x^2) > eq<-expression(log(x)) > eq expression(log(x)) > D(eq, "x") 1/x > eq2<-expression(a/(1+b*exp(-d*x))); eq2 expression(a/(1 + b * exp(-d * x))) > D(eq2, "x") a * (b * (exp(-d * x) * d))/(1 + b