|
크기: 7797
설명:
|
← 2020-09-08 19:29:06에 수정된 3번째 판 ⇥
크기: 9638
설명:
|
| 지워진 줄은 이렇게 표시됩니다. | 추가된 줄은 이렇게 표시됩니다. |
| 줄 8: | 줄 8: |
| R을 설치하면 가지고 놀 수 있는 [[https://stat.ethz.ch/R-manual/R-devel/library/datasets/html/00Index.html|datasets]]가 기본으로 설치된다. [[https://stat.ethz.ch/R-manual/R-devel/library/datasets/html/00Index.html|한번 들여다보자]] * [[https://stat.ethz.ch/R-manual/R-devel/library/datasets/html/trees.html|trees]] (벗나무의 직경, 높이, 부피) |
R을 설치하면 가지고 놀 수 있는 [[https://stat.ethz.ch/R-manual/R-devel/library/datasets/html/00Index.html|datasets]]가 기본으로 설치된다. [[https://stat.ethz.ch/R-manual/R-devel/library/datasets/html/00Index.html|(이런것들이다)]] * [[https://stat.ethz.ch/R-manual/R-devel/library/datasets/html/trees.html|trees]] (벚나무의 직경, 높이, 부피) |
| 줄 15: | 줄 15: |
| 시작하기 전 꿀Tip: * Console에서 위화살표 키를 누르면 전에 쳤던 명령문이 복사된다. * # 이후의 문장은 실행이 안 된다. 메모/주석 용도로 사용하자 * ? 는 도움말 명령이다. ? 이후 키워드를 치면 그 키워드를 검색한다. * R에서는 대소문자를 다르게 인식한다. School과 school은 다른 뜻이다. sChOoL 도 다른 뜻이다. |
|
| 줄 16: | 줄 22: |
| * 벗나무 31그루의 직경, 높이, 부피를 구한 데이타이다. | ==== Data 살펴보기 ==== 벚나무 31그루의 직경, 높이, 부피 데이타를 이용해서 R의 기본 사용법을 익혀보자. |
| 줄 20: | 줄 27: |
| }}} trees 데이타를 보려면 trees 를 입력한다. {{{#!highlight r |
|
| 줄 22: | 줄 32: |
| trees # 혹은 print(trees) | trees # 혹은 print(trees)도 가능하다. print(trees) # "trees 를 출력(print)해 줘" 라고 명시적으로 내린 명령이다. }}} 31 x 3 개의 숫자를 한번에 보려니 눈에도 안 들어오고 의미없다. 일부만 화면에 띄워보자. {{{#!highlight r head(trees) # 첫 6개의 data point만 화면에 출력 head(trees,10) # 첫 10개의 data point만 화면에 출력 tail(trees,4) # 마지막 4개의 data point만 화면에 출력 }}} 어떤 경우는 data 자체를 보는 것보다 data의 구조를 보는 것이 도움이 된다. {{{#!highlight r # structure를 보여주세요. |
| 줄 24: | 줄 49: |
| table(trees) |
}}} 결과: {{{ 'data.frame': 31 obs. of 3 variables: $ Girth : num 8.3 8.6 8.8 10.5 10.7 10.8 11 11 11.1 11.2 ... $ Height: num 70 65 63 72 81 83 66 75 80 75 ... $ Volume: num 10.3 10.3 10.2 16.4 18.8 19.7 15.6 18.2 22.6 19.9 ... }}} * trees는 data.frame 형식이고, 3가지 변수에 대한 31개의 관찰값을 포함한다. * data.frame은 r에서 데이타를 다루는 방법 중 하나로, 여러개의 수열(혹은 문자열)을 포함할 수 있다. * 수열(혹은 문자열)은 vector 라고 부르는데, numeric vector(수열), character vector(문자열) 등이 있다. * 특이한 데이타형으로 범주형(categorical)이 있다. 범주형 데이타로서 1,2,3,4가 저장되어 있다면 이 값은 숫자로서 의미하는 것이 아니고 분류(혹은 기호)의 의미이다. 즉, 범주형 데이터로는 사칙연산이 안된다. * 예를 들어 어떤 학생 조합에 소속된 학생의 학년은 1,2,3,4로 표시되지만, 이 값은 사칙연산이 안되는 범주형 데이터이다. 범주형을 R에서는 factor라고 부른다. * 특별한 종류의 범주형 데이타(factor)로 논리형(True/False)이 있다. 여기서 True는 T,r,u,e 네 글자가 아닌 "참"이라는 의미다. * trees는 Girth, Height, Volume 세가지 numeric vector를 포함하고 각각의 vector는 대충 이렇게 생겼다. 이렇게 자세히 알고 싶었던 게 아니라면 (TMI주의보), 데이타의 차원(dimension)만 단순히 알아보고 싶었다면 이렇게 한다. {{{#!highlight r |
| 줄 28: | 줄 70: |
# 31 x 3 개의 숫자를 한번에 보려니 눈에도 안 들어오고 의미없다. 일부만 화면에 띄워보자. head(trees) # 첫 6개의 data point만 화면에 출력 head(trees,10) # 첫 10개의 data point만 화면에 출력 tail(trees,4) # 마지막 4개의 data point만 화면에 출력 # 데이타의 평균, 최상값, 최소값, 중간값, 상위 25% 값, 하위 25% 값을 보고 싶다면, |
}}} 이 데이타를 한눈에 파악하고 싶은데 `str()`도 `dim()`도 마음에 안 든다면 `summary()` 함수를 써 보자. {{{#!highlight r |
| 줄 36: | 줄 75: |
# 나무 높이의 평균, 최상값, 최소값, 중간값, 상위 25% 값, 하위 25% 값을 따로 보고 싶다면, mean(trees$Height) # mean(trees) 은 어떤 결과가 나오나? max(trees$Height) # max(trees) 은 어떤 결과가 나오나? min(trees$Height) # min(trees) 은 어떤 결과가 나오나? |
# 데이타의 평균, 최상값, 최소값, 중간값, 상위 25% 값, 하위 25% 값을 보여준다. }}} Data.frame에 포함된 특정 vector를 지목하려면 `$` 표식을 이용한다. {{{#!highlight r # 나무 height의 평균, 최상값, 최소값, 중간값, 상위 25% 값, 하위 25% 값을 보고 싶다면, mean(trees$Height) # mean(trees) 은 어떤 결과가 나오나? max(trees$Height) # max(trees) 은 어떤 결과가 나오나? min(trees$Height) # min(trees) 은 어떤 결과가 나오나? |
| 줄 44: | 줄 87: |
| 숫자보다 그림이 데이타를 한눈에 파악하기 편하다. | ==== Plot으로 살펴보기 ==== 숫자보다 그림이 데이타를 한눈에 파악하기 편하다. 그림으로 보자~ * RStudio의 Plots 창에서 Export 메뉴를 클릭하여 그림을 저장할 수 있다. |
| 줄 47: | 줄 92: |
# 통계 계산값 말고, 모든 data point를 다 xy 평면에 찍어줘 |
}}} {{attachment:boxplot.png||height=350em}} 평균값 같은 통계 계산값 말고, 모든 data point를 xy 평면에 찍어줘 {{{#!highlight r |
| 줄 50: | 줄 99: |
# 특별히 Girth 대비 Volume만 따로 xy 평면에 보여주되, xy 둘다 log scale 로 보겠어 |
}}} {{attachment:plot.png||height=350em}} 특별히 Girth 대비 Volume만 따로 xy 평면에 보여줘. * ~ 기호 의미: y ~ x 형식으로 쓰면, "x대비 y의 변화량" 이란 뜻. {{{#!highlight r plot(Volume ~ Girth, data = trees) # 만약 log scale로 보려면, |
| 줄 53: | 줄 110: |
| # trees 데이타의 컬럼 이름을 지정하는 방법 plot(trees$Girth, trees$Volume, log = "xy") # trees 데이타의 컬럼 번호를 지정하는 방법 plot(trees[,1], trees[,3], log = "xy") trees[c(3:10), c(1,3)] plot(trees[c(3:10), c(1,3)]) }}} Tip: * data[row 번호, col 번호] 와 같이 data point의 index로 지정가능 * 여러개의 숫자(혹은 문자)를 묶을 때는 c( , , ) 혹은 c( : ) 형식을 사용함 궁극의 Tip: * Console에서 위화살표 키를 누르면 전에 쳤던 명령문이 복사된다. * #이후의 문장은 실행이 안 된다. 메모/도움말 용도로 사용하자 |
# 만약 y axis만 log scale로 보려면, plot(Volume ~ Girth, data = trees, log = "y") }}} ~ 기호 대신 $기호를 써서 같은 의미를 다르게 표현할 수 있다. {{{#!highlight r plot(trees$Girth, trees$Volume) # trees의 Girth와 Volume을 쓰겠다고 명시했으므로 data = trees 라는 표현도 생략했다. # 앞에 나온 Girth가 x축, 뒤에 나오는 Volume이 y축으로 표시된다. (~ notation과 순서가 반대) }}} trees의 1번 컬럼과 3번 걸럼을 이용해서 plot 찍어달라는 방법으로 표현할 수도 있다. {{{#!highlight r plot(trees[,1], trees[,3]) # 그러나 column 넘버를 정확히 알지 못 하면 낭패다. }}} * data[row 번호, col 번호] 순서로 data point 지정가능 * 빈칸으로 놔두면 그 row(혹은 colume) 전체로 해석됨 |
| 줄 73: | 줄 135: |
| {{{#!highlight r # 다음을 실행 해 보자 |
다음 코드를 실행하면 어떤 결과가 예상되는가? 예상대로 나오는지 실제로 실행 해 본다. {{{#!highlight r |
| 줄 76: | 줄 138: |
| dim(iris) # data size(dimension)을 확인해보자. head(iris) # 첫 6개의 data point만 화면에 출력 tail(iris,5) # 마지막 5개의 data point만 화면에 출력 |
dim(iris) # data size(dimension)을 확인해보자. head(iris) # 첫 6개의 data point만 화면에 출력 tail(iris,5) # 마지막 5개의 data point만 화면에 출력 |
| 줄 81: | 줄 143: |
| plot(iris) # scatter plot # Species에 따라 다른 색을 칠하면 보기 편하다 plot(iris, col=c('red','blue','green3')[unclass(iris$Species)]) |
plot(iris) # scatter plot }}} iris$Species에 붓꽃 종이 저장되어 있다. {{{#!highlight r iris$Species }}} iris$Species vector는 Factor 형식이다. {{{#!highlight r str(iris$Species) }}} * Factor 형식의 vector에 만약 숫자 1이 들어있다면 그것은 1개라는 뜻이 아니고 기호로서의 1이다. 즉, 사칙연산이 불가능하다. * iris$Species에는 setosa, versicolor, virginica 세 가지 단어가 factor로서 들어 있다. * setosa, versicolor, virginica를 다른 기호로 치환해도 된다. 결국 우리에게 중요한건 "분류"일 뿐 {{{#!highlight r c('a','b','c')[iris$Species] # iris$Species에 저장된 분류(Factor)의 순서대로 a,b,c를 지정한다. }}} iris$Species에 저장된 setosa, versicolor, virginica를 red, blue, green으로 바꿔보자 {{{#!highlight r c('red','blue','green')[iris$Species] }}} 그리고 그렇게 변환된 값을 plot()의 col= 옵션으로 지정해보자. {{{#!highlight r plot(iris, col=c('red','blue','green3')[iris$Species]) # green3은 green보다 약간 진한 색이다. |
| 줄 87: | 줄 172: |
| plot(Sepal.Length ~ Petal.Length, data = iris, col=c('red','blue','green3')[unclass(iris$Species)] ) plot(iris$Petal.Length, iris$Sepal.Length) # 한동안 iris 데이타 가지고 놀 것 같으면 미리 선언할 수 있다. attach(iris) # 앞으로 언급 안 하면 data = iris 라는 뜻임 plot(Petal.Length, Sepal.Length, col=c('red','blue','green4')[unclass(Species)]) plot(Sepal.Length ~ Petal.Length, col=c('red','blue','green4')[unclass(Species)]) detach(iris) # iris 놀이 끝 |
plot(Sepal.Length ~ Petal.Length, data = iris, col=c('red','blue','green3')[iris$Species] ) # 혹은 이런 식의 표현도 가능하다. colorMap <- c('red','blue','green3')[iris$Species] plot(iris$Petal.Length, iris$Sepal.Length, col=colorMap ) }}} {{attachment:iris_P_S_color.png||height=250em}} plot() 함수에 매번 data= 옵션을 지정하기 성가시면 attach() 함수로 아예 선언할 수 있다. {{{#!highlight r attach(iris) # 앞으로 detach 되기 전까지 data = iris 라고 자동 입력 plot(Petal.Length, Sepal.Length, col=c('red','blue','green4')[Species]) plot(Sepal.Length ~ Petal.Length, col=c('red','blue','green4')[Species]) detach(iris) # iris 사용 끝 |
| 줄 108: | 줄 200: |
| <<Include(../MidTerm)>> == Birthday Paradox == [[WikiPedia:Birthday Paradox]]: 23명이 모이면 그 안에 생일이 같은 사람이 존재할 확률은 50% 이상이다. * 2014 FIFA 월드컵 본선 진출 32팀(각 팀 23명) 중 생일이 같은 멤버가 있던 팀은 16팀이었음 ([[http://www.bbc.co.uk/news/magazine-27835311|BBC]]) * [[http://betterexplained.com/articles/understanding-the-birthday-paradox/|참고자료]] 계산해보자 * 365개의 공을 중복 가능하게 뽑을 때, 같은 공이 나올 확률 문제이다. * 같은 공이 나올 확률은 (1 - 다른 공이 나올 확률) 이다. * 다른 공이 나올 확률은 횟수를 거듭할수록 1/365 씩 줄어든다. * n 번째까지 모두 다른 공이 나올 확률은 각 회당 다른 공이 나올 확률의 누적곱이다. {{{#!highlight r person <- 23 odd <- 1.0 for (n in 2:person) { odd = odd * (366 - n) / 365 print((1-odd) * 100) } }}} 참고로 python이라면 이렇게 쓴다 {{{#!highlight python person = 23 odd = 1.0 for n in range(2,person+1): odd = odd * (366 - n)/365 print (1-odd) * 100 }}} 수학이 어려우면 무식한 시뮬레이션으로 알아볼 수도 있다 (brute force algorithm) * 함수를 하나 만들어서 birthday라고 이름을 붙힌다. * birthday 함수는 nPeople, num 두 가지 변수를 input으로 받는다. * input value를 생략하면 두 변수의 default값은 각각 23, 1000이다. * 함수가 하는 일은 1에서 365 사이에서 중복허용으로 nPeople 개의 숫자를 고른 후, 그 중 중복이 있는지를 판단하는 것을 num번 반복하여, 그 중 몇 %에서 중복이 있는지 출력한다. {{{#!highlight r birthday <- function(nPeople = 23, num = 1000) { data <- rep(NA,num) for (i in 1:num) { thisGroup <- sample(1:365, nPeople, replace = TRUE) data[i] <- sum(duplicated(thisGroup)) > 0 } print(sum(data)/num) } birthday() birthday(nPeople = 30, num =10000) }}} for-loop으로 구성된 코드는 가독성(human readability)은 좋지만 처리속도는 불리하다. * R에서는 for-loop대신 sapply 함수가 선호된다. sapply(이 숫자들을, function(x)에 넣어라) 라는 뜻이다. {{{#!highlight r birthdays <- sapply(1:10000, function(x){sample(1:365, 23, replace = TRUE)}) sum(sapply(1:10000, function(x) sum(duplicated(birthdays[,x])) > 0)) # nice one-liner birthdays <- function(x){sum(duplicated(sample(1:365, 23, replace = TRUE)))>0} sum(sapply(1:10000, birthdays)) }}} {{{ 과제: 어느 모임에서 생일이 같은 사람이 있을 확률이 99% 이상이 되려면 모임이 몇 명이어야 될까? }}} |
R Basic
기본 of 기본
R을 설치하면 가지고 놀 수 있는 datasets가 기본으로 설치된다. (이런것들이다)
trees (벚나무의 직경, 높이, 부피)
Iris flower data set (붓꽃 길이)
ChickWeight (병아리 몸무게)
Loblolly (Loblolly 소나무 높이)
Orange (오렌지 나무 직경)
시작하기 전 꿀Tip:
- Console에서 위화살표 키를 누르면 전에 쳤던 명령문이 복사된다.
- # 이후의 문장은 실행이 안 된다. 메모/주석 용도로 사용하자
- ? 는 도움말 명령이다. ? 이후 키워드를 치면 그 키워드를 검색한다.
- R에서는 대소문자를 다르게 인식한다. School과 school은 다른 뜻이다. sChOoL 도 다른 뜻이다.
trees dataset
Data 살펴보기
벚나무 31그루의 직경, 높이, 부피 데이타를 이용해서 R의 기본 사용법을 익혀보자.
trees 데이타를 보려면 trees 를 입력한다.
31 x 3 개의 숫자를 한번에 보려니 눈에도 안 들어오고 의미없다. 일부만 화면에 띄워보자.
어떤 경우는 data 자체를 보는 것보다 data의 구조를 보는 것이 도움이 된다.
결과:
'data.frame': 31 obs. of 3 variables: $ Girth : num 8.3 8.6 8.8 10.5 10.7 10.8 11 11 11.1 11.2 ... $ Height: num 70 65 63 72 81 83 66 75 80 75 ... $ Volume: num 10.3 10.3 10.2 16.4 18.8 19.7 15.6 18.2 22.6 19.9 ...
- trees는 data.frame 형식이고, 3가지 변수에 대한 31개의 관찰값을 포함한다.
- data.frame은 r에서 데이타를 다루는 방법 중 하나로, 여러개의 수열(혹은 문자열)을 포함할 수 있다.
- 수열(혹은 문자열)은 vector 라고 부르는데, numeric vector(수열), character vector(문자열) 등이 있다.
- 특이한 데이타형으로 범주형(categorical)이 있다. 범주형 데이타로서 1,2,3,4가 저장되어 있다면 이 값은 숫자로서 의미하는 것이 아니고 분류(혹은 기호)의 의미이다. 즉, 범주형 데이터로는 사칙연산이 안된다.
- 예를 들어 어떤 학생 조합에 소속된 학생의 학년은 1,2,3,4로 표시되지만, 이 값은 사칙연산이 안되는 범주형 데이터이다. 범주형을 R에서는 factor라고 부른다.
- 특별한 종류의 범주형 데이타(factor)로 논리형(True/False)이 있다. 여기서 True는 T,r,u,e 네 글자가 아닌 "참"이라는 의미다.
- trees는 Girth, Height, Volume 세가지 numeric vector를 포함하고 각각의 vector는 대충 이렇게 생겼다.
- trees는 data.frame 형식이고, 3가지 변수에 대한 31개의 관찰값을 포함한다.
이렇게 자세히 알고 싶었던 게 아니라면 (TMI주의보), 데이타의 차원(dimension)만 단순히 알아보고 싶었다면 이렇게 한다.
이 데이타를 한눈에 파악하고 싶은데 str()도 dim()도 마음에 안 든다면 summary() 함수를 써 보자.
Data.frame에 포함된 특정 vector를 지목하려면 $ 표식을 이용한다.
Plot으로 살펴보기
숫자보다 그림이 데이타를 한눈에 파악하기 편하다. 그림으로 보자~
- RStudio의 Plots 창에서 Export 메뉴를 클릭하여 그림을 저장할 수 있다.
1 boxplot(trees)
평균값 같은 통계 계산값 말고, 모든 data point를 xy 평면에 찍어줘
1 plot(trees)
특별히 Girth 대비 Volume만 따로 xy 평면에 보여줘.
- ~ 기호 의미: y ~ x 형식으로 쓰면, "x대비 y의 변화량" 이란 뜻.
~ 기호 대신 $기호를 써서 같은 의미를 다르게 표현할 수 있다.
trees의 1번 컬럼과 3번 걸럼을 이용해서 plot 찍어달라는 방법으로 표현할 수도 있다.
- data[row 번호, col 번호] 순서로 data point 지정가능
- 빈칸으로 놔두면 그 row(혹은 colume) 전체로 해석됨
iris dataset
붓꽃 150송이의 꽃받침 길이(Sepal.Length), 꽃받침 너비(Sepal.Width), 꽃잎 길이(Petal.Length), 꽃잎 너비(Petal.Width), 종(Species)을 조사한 데이터이다.
생물학자&통계학자인 Ronald Fisher의 1936년 Linear discriminant analysis에 관한 논문에 등장한 이후로 Multivariate statistics의 표준 예제 데이타로 자주 인용된다.
다음 코드를 실행하면 어떤 결과가 예상되는가? 예상대로 나오는지 실제로 실행 해 본다.
iris$Species에 붓꽃 종이 저장되어 있다.
1 iris$Species
iris$Species vector는 Factor 형식이다.
1 str(iris$Species)
- Factor 형식의 vector에 만약 숫자 1이 들어있다면 그것은 1개라는 뜻이 아니고 기호로서의 1이다. 즉, 사칙연산이 불가능하다.
- iris$Species에는 setosa, versicolor, virginica 세 가지 단어가 factor로서 들어 있다.
- setosa, versicolor, virginica를 다른 기호로 치환해도 된다. 결국 우리에게 중요한건 "분류"일 뿐
1 c('a','b','c')[iris$Species] # iris$Species에 저장된 분류(Factor)의 순서대로 a,b,c를 지정한다.
iris$Species에 저장된 setosa, versicolor, virginica를 red, blue, green으로 바꿔보자
1 c('red','blue','green')[iris$Species]
그리고 그렇게 변환된 값을 plot()의 col= 옵션으로 지정해보자.
1 plot(iris, col=c('red','blue','green3')[iris$Species]) # green3은 green보다 약간 진한 색이다.
2
3 # 특정 측정값, 예를 들어 Petal.Length vs. Sepal.Length 만 보고 싶다면,
4 plot(Sepal.Length ~ Petal.Length, data = iris, col=c('red','blue','green3')[iris$Species] )
5
6 # 혹은 이런 식의 표현도 가능하다.
7 colorMap <- c('red','blue','green3')[iris$Species]
8 plot(iris$Petal.Length, iris$Sepal.Length, col=colorMap )
plot() 함수에 매번 data= 옵션을 지정하기 성가시면 attach() 함수로 아예 선언할 수 있다.
ChickWeight
병아리 50마리를 대상으로 조사한 다이어트별 성장 속도를 조사한 데이타이다.
- weight: 병아리 몸무게 (numeric 데이타, gram)
- Time: 나이 (numeric 데이타, days)
- Chick: 병아리 일련번호 (ordered factor)
- Diet: 다이어트 종류 (factor)
과제: ChickWeight 데이타를 이용하여, 다이어트 종류별로 다른 색을 사용하여, 시간 vs 몸무게 그래프를 그려라.
| /CentralLimitTheorem /ChiSquared /Clustering /InstallR /InstallRStudio /Lies /NormalDistribution /RBasic /RBasic1 /RBasic2 /RBasic3 /RCloud /RIntro /RKorean /T-Test |
