기본 콘텐츠로 건너뛰기

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

R의 기본과 벡터

내용

R 기본과 벡터

기본사항

R은 vector, list, dataframe과 같은 데이터 구조에서 작동합니다. 가장 단순한 구조는 숫자 벡터로, 정렬된 숫자 모음으로 구성된 단일 엔터티입니다. 5개의 숫자, 즉 10.4, 5.6, 3.1, 6.4 및 21.7로 구성된 x라는 벡터를 설정하려면 R 명령을 사용합니다.
> x<-c(10.4, 5.6, 3.1, 6.4, 21.7); x
[1] 10.4  5.6  3.1  6.4 21.7
함수 c()는 내부의 요소들을 연결하고 그 결과의 객체를 '<-' 연산자를 통해 객체 x에 할당한 것입니다. '<-': 할당연산자 위의 실행은 assign()함수에 의해 실행될 수 있습니다.
> assign("y", c(10.4, 5.6, 3.1, 6.4, 21.7))
> y
[1] 10.4  5.6  3.1  6.4 21.7
할당연산자의 방향을 반대로 할 수 있습니다.
> c(10.4, 5.6, 3.1, 6.4, 21.7)->z; z
[1] 10.4  5.6  3.1  6.4 21.7
당연히 위 표현(expression)에 의해 생성되는 객체는 다음과 같이 다른 계산에 적용되거나 새로운 객체로 할당될 수 있습니다.
> 1/z
[1] 0.09615385 0.17857143 0.32258065 0.15625000 0.04608295
> zz<-c(z, 0, z); zz
 [1] 10.4  5.6  3.1  6.4 21.7  0.0 10.4  5.6  3.1  6.4 21.7

벡터와 연산

vector의 산술은 요소별로 일어나며 계산의 대상이 모두 같은 길이를 가질 필요는 없습니다. 즉, 짧은 벡터는 대응되는 긴 벡터에 대해 재사용(recycle)됩니다. 재사용은 대응되는 두 벡터의 길이가 배수관계일 경우 실행됩니다.
> 1/z
[1] 0.09615385 0.17857143 0.32258065 0.15625000 0.04608295
> zz<-c(z, 0, z); zz
 [1] 10.4  5.6  3.1  6.4 21.7  0.0 10.4  5.6  3.1  6.4 21.7
벡터의 길이는 lenght() 함수에 의해 확인할 수 있습니다.
> length(x);length(y)
[1] 3
[1] 6
사칙연산외에 거듭제곱 연산자 '^', log(), exp(), sin(), cos(), tan(), sqr() 등등의 연산을 수행할 수 있습니다. 벡터의 최대와 최소는 min(), max()로 반환하며 이는 그 벡터의 범위를 나타내는 것으로 range() 함수를 사용하여 c(min(), max())를 나타낼 수 있습니다. 벡터의 합은 sum(), 곱은 prod() 함수를 적용합니다. 벡터의 평균은 mean()으로 sum()/length()와 같으며 분산은 var()로서 다음과 같습니다. $$\frac{\text{sum(x-mean(x))}^2}{\text{length(x)-1}}$$ var()함수의 인수가 n × p 행렬이면 p × p 공분산행렬을 반환합니다. (n: 샘플수, p: 독립변수의 수) 벡터를 오름차순으로 정렬하기 위해 sort()함수를 적용합니다. 또한 정렬된 결과의 인덱스를 반환하기 위해 order(), sort.list()를 적용합니다.
> set.seed(1)
> x<-sample(1:100, 10);x
 [1] 68 39  1 34 87 43 14 82 59 51
> sort(x)
 [1]  1 14 34 39 43 51 59 68 82 87
> order(x)
 [1]  3  7  4  2  6 10  9  1  8  5
> sort.list(x)
 [1]  3  7  4  2  6 10  9  1  8  5
logical vector의 요소 : TRUE(1), FALSE(0), NA(not available) 논리 연산자: >, >=, <, <=, ==, &(and), |(or), !(not)
벡터의 요소값이 미지일 경우 또는 결측치일 경우 NA(not available)를 할당하여 벡터내의 위치를 예약할 수 있습니다. 일반적으로 NA에 대한 모든 작업은 NA가 됩니다. 함수 is.na(x)는 x의 해당 요소가 NA인 경우에만 값이 TRUE인 x와 동일한 크기의 논리 벡터를 제공합니다.
> z<-c(1:5, NA); z
[1]  1  2  3  4  5 NA
> is.na(z)
[1] FALSE FALSE FALSE FALSE FALSE  TRUE
NaN(Not a Number)은 계산과정에서 발생합니다.
> 0/0
[1] NaN
> Inf-Inf
[1] NaN
NaN 역시 is.na()에서 TRUE로 반환 , is.nan() 함수에서는 NaN만 TRUE로 반환
> z>-c(1:3, NA, NaN); z
[1]   1   2   3  NA NaN
> is.na(z)
[1] FALSE FALSE FALSE  TRUE  TRUE

문자 벡터가 따옴표 없이 인쇄될 때 <NA>로 인쇄되는 경우가 있습니다.

문자는 단일 또는 이중 따옴표로 작성합니다.

paste() 함수는 숫자와 문자(열)을 연결합니다.

> lab<-paste(c("x","y"), 1:10, sep=""); lab
 [1] "x1"  "y2"  "x3"  "y4"  "x5"  "y6"  "x7"  "y8"  "x9"  "y10"
위 결과와 같이 문자벡터의 길이는 숫자길이에 배수가 되므로 재사용됩니다.

인덱스 벡터에 의한 요소의 호출

1. 논리연산자에 의한 인덱스 벡터를 사용하여 호출
> x<-c(sample(-10:10, 5), NA); x  
[1]  4  5 -1 -4  3 NA
> y<-x[!is.na(x)]; y
[1]  4  5 -1 -4  3
> (x+1)[(!is.na(x))& x>0]->z; z
[1] 5 6 4
2. 양의 정수로 인덱스 사용
 c('apple', 'pear')[rep(c(1,2,2,1), times=4)]
 [1] "apple" "pear"  "pear"  "apple" "apple" "pear"  "pear"  "apple" "apple"
[10] "pear"  "pear"  "apple" "apple" "pear"  "pear"  "apple"
3. 음의 정수를 사용하여 요소배제
> x<-c(sample(-10:10, 5), NA); x 
    [1]  3 10  0 -3 -2 NA
    > x[-6]
    [1]  3 10  0 -3 -2
4. 벡터는 names()함수를 사용하여 각 요소에 이름을 할당할 수 있습니다. 그 이름을 인덱스로 사용합니다.
> fruit<-c(5, 10, 1, 20)
    > names(fruit)<-c('orange', 'banana', 'apple', 'peach')
    > fruit
    orange banana  apple  peach 
         5     10      1     20 
    > lunch<-fruit[c('orange', 'peach')]; lunch
    orange  peach 
         5     20 
인덱스를 사용하여 객체의 요소를 호출할 수 있으며 다음과 같이 수정할 수 있습니다.
> x<-c(sample(-10:10, 5), NA); x 
    [1] -2 -3  4 -9 -1 NA
    > x[is.na(x)]<-0; x 
    [1] -2 -3  4 -9 -1  0
    > x[x<0]<-abs(x[x<0]); x
    [1] 2 3 4 9 1 0
rep(객체, each or times=n, length.out)
객체를 n번 반복 (each=n 이면 객체의 각 요소를 n 번 반복, times=n은 객체 자체를 반복, times는 기본인수), length.out은 생성된 객체의 전체 길이를 제어

객체

기술적으로 R은 객체에서 작동합니다. 예로는 숫자(실수) 또는 복소수 값의 벡터, 논리 값의 벡터 및 문자열의 벡터들은 특정한 저장소에 저장됩니다. 이를 객체(object)라고합니다. 구성 요소가 모두 동일한 유형 또는 모드(mode, 숫자10, 복합, 논리, 문자 및 원시)이기 때문에 이러한 구조를 "원자" 구조라고 합니다.
벡터는 모두 동일한 모드의 값을 가져야 합니다. 따라서 주어진 벡터는 논리적, 숫자, 복소수, 문자 또는 원시(raw) 중 하나여야 합니다. (이 규칙에 대한 유일한 명백한 예외는 사용할 수 없는 수량에 대해 NA로 나열된 특별한 "값"이지만 실제로는 여러 유형의 NA가 있습니다.) 벡터는 비어 있을 수 있습니다. 예를 들어 빈 문자열 벡터는 문자(0)로 나열되고 빈 숫자 벡터는 숫자(0)로 나열됩니다.
R은 또한 list 모드의 객체에 대해 작동합니다. 이들은 그 객체 내부에 포함된 원소들의 모드가 다양할 수 있습니다. 즉, R의 모든 모드를 가질 수 있는 객체이며 각 원소들을 순서를 가지는 시퀀스 객체입니다. list는 다른 list 자체를 원소로 가질 수 있기 때문에 원자 구조가 아닌 "재귀적"이라고 알려져 있습니다.
> c(1, 2, c(3, 4, 5))
    [1] 1 2 3 4 5
    > list(1, 2, list('a', 'b', 'c'))
    [[1]]
    [1] 1
    
    [[2]]
    [1] 2
    
    [[3]]
    [[3]][[1]]
    [1] "a"
    
    [[3]][[2]]
    [1] "b"
    
    [[3]][[3]]
    [1] "c"
다른 재귀 구조는 모드 함수와 표현식의 구조입니다. 함수는 유사한 사용자 작성 함수와 함께 R 시스템의 일부를 형성하는 객체이며 나중에 자세히 설명합니다. 객체로서의 표현식은 R에서 모델링과 함께 사용되는 공식에 대해 논의할 때를 제외하고는 이 가이드에서 논의하지 않을 R의 고급 부분을 형성합니다.
객체의 모드란 그 기본 구성 요소의 기본 유형을 의미합니다. 이것은 객체의 "속성"(attribute)의 특별한 경우입니다. 모든 물체의 또 다른 속성은 길이입니다. 객체의 정의된 구조의 모드와 길이를 찾는 데 mode(object)length(object) 함수를 사용할 수 있습니다. 객체의 추가 속성은 일반적으로 attributes(객체)에 의해 제공됩니다. 이 때문에 모드와 길이는 객체의 "본질 속성"(intrinsic attributes)이라고도 합니다. 얘를들어 다음 객체 z은 10개의 원소를 가지면 수치형입니다. 다른 부가적인 속성은 가지고 있지 않습니다.
> z<-1:10; length(z)
    [1] 10
      > z
     [1]  1  2  3  4  5  6  7  8  9 10
    > mode(z)
    [1] "numeric"
    > attributes(z)
    NULL
객체의 길이는 length() 함수를 사용하여 크기를 자를 수 있습니다.
> length(z)<-3
    > z
    [1] 1 2 3
as.modename(객체)함수를 사용하여 각 객체의 모드는 변경할 수 있습니다. 그러나 일부는 이러한 변경을 허가하지 않습니다.
> z1<-as.character(z); z1
    [1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10"
   > as.integer(z1)
    [1]  1  2  3  4  5  6  7  8  9 10
위에서 언급한 것과 같이 빈객체는 0으로 표현됩니다. 그 자체로 길이가 지정되지 않았으므로 다음 코드와 같이 임의의 위치에 새로운 값을 입력할 수 있습니다. 이 경우 다른 위치의 값은 지정되지 않으므로 NA가 됩니다.
> e<-numeric()
    > mode(e)
    [1] "numeric"
    > e
    numeric(0)
    > e[3]<-17; e
    [1] NA NA 17
객체를 생성하는 다른 방법으로 scan('')함수를 사용할 수 있습니다. 이 함수를 실행하면 다음 코드와 같이 사용자가 값을 입력할 수 있도록 합니다. 입력 대상이 문자이면 what 인자를 추가합니다.
> x<-scan('')
    1: 2
    2: 6
    3: 1
    4: 
    Read 3 items
    > x
    [1] 2 6 1
    > y<-scan(what='')
    1: 스캔
    2: 객체
    3: 만들기 
    4: 
    Read 3 items
    > y
    [1] "스캔"   "객체"   "만들기"
attributes(객체) 함수는 해당 객체에 대해 현재 정의된 모든 비본질 속성의 목록을 반환합니다. attr(object, name) 함수를 사용하여 특정 속성을 선택할 수 있습니다. 이 함수에서 name은 문자형모드이어야 합니다. 즉, 따옴표와 함께 표시되어야 합니다. 다음은 matrix()함수를 사용하여 생성한 $3 \times 3$ 차원의 행렬입니다. 이 객체에 대한 attributes(), attr()함수를 적용합니다.
> a<-matrix(1:9, ncol=3); a
    [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
> attributes(a)
$dim
[1] 3 3
> attr(a, 'dim')
[1] 3 3
역으로 attr()함수를 사용하여 객체의 모드를 변경할 수 있습니다. 다음은 벡터 객체인 x를 행렬 객체로 변경한 것입니다.
> x<-1:9;x
    [1] 1 2 3 4 5 6 7 8 9
    > attr(x, 'dim')<-c(3,3)
    > x
         [,1] [,2] [,3]
    [1,]    1    4    7
    [2,]    2    5    8
    [3,]    3    6    9
R의 모든 객체에는 class() 함수에 의해 보고되는 클래스(class)가 있습니다. 클래스는 객체에 특정한 상태와 동작을 부여하기 위해 R내에서 영역을 지정합니다. R의 모든 객체는 기본적으로 벡터입니다. 단순 벡터인 "numeric", "logical", "character" 또는 "list"는 객체의 모드가 클래스입니다.
> x; class(x)
    [1] 1 2 3
    [1] "numeric"
    > y; class(y)
    [1] "string"
    [1] "character"
    > z; class(z)
    [1] FALSE
    [1] "logical"
    > ls; class(ls)
    [[1]]
    [1] "apple"
    
    [[2]]
    [1] "bear"
    
    [1] "list"
그러나 여러벡터들의 연결로 생성되는 "matrix", "array", "factor" 및 "data.frame"은 각 객체가 포함되는 모든 클래스들을 반환합니다. 다음은 행렬객체로 array 클래스에 속함을 알 수 있습니다.
> mat<-matrix(1:4, nrow=2); mat
    [,1] [,2]
[1,]    1    3
[2,]    2    4
> class(mat)
[1] "matrix" "array" 
클래스의 효과를 일시적으로 제거하려면 unclass() 함수를 사용하십시오. 다음은 factor 모드의 객체입니다. 이 모드는 데이터와 수준(level)으로구성됩니다.
> x<-sample(1:5, 10); x
    sample.int(length(x), size, replace, prob)에서 다음과 같은 에러가 발생했습니다:
      'replace = FALSE' 일때는 모집단보다 큰 샘플을 가질 수 없습니다
    > x<-sample(1:5, 10, replace=TRUE); x
     [1] 1 3 1 5 1 5 1 5 4 2
    > x1<-factor(x, level=1:5); x1
     [1] 1 3 1 5 1 5 1 5 4 2
    Levels: 1 2 3 4 5
    > attributes(x1)
    $levels
    [1] "1" "2" "3" "4" "5"
    
    $class
    [1] "factor"
이 객체의 자료형은 수치형이지만 levels은 문자로 인식됩니다. 그러므로 위 객체에 대한 평균 계산은 에러를 발생합니다. 이러한 경우 unclass() 함수를 사용하여 객체의 class를 단순 벡터로 변환하여 계산할 수 있습니다.
> mode(x1)
    [1] "numeric"
    > mode(levels(x1))
    [1] "character"
    > mean(x1)
    [1] NA
    경고메시지(들):
    mean.default(x1)에서: 인자가 수치형 또는 논리형이 아니므로 NA를 반환합니다
    > x2<-unclass(x1); x2
    [1] 1 3 1 5 1 5 1 5 4 2
   attr(,"levels")
   [1] "1" "2" "3" "4" "5"
   > mean(x2)
   [1] 2.8
   > class(x2)
   [1] "integer"

댓글

이 블로그의 인기 게시물

[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