|
⇤ ← 2018-10-24 19:25:02에 수정된 1번째 판
크기: 5238
설명:
|
크기: 7797
설명:
|
| 지워진 줄은 이렇게 표시됩니다. | 추가된 줄은 이렇게 표시됩니다. |
| 줄 23: | 줄 23: |
| str(trees) table(trees) |
|
| 줄 40: | 줄 42: |
| }}} | |
| 줄 41: | 줄 44: |
| # 아몰랑 그림으로 보여줘 | 숫자보다 그림이 데이타를 한눈에 파악하기 편하다. {{{#!highlight r |
| 줄 49: | 줄 53: |
| plot(trees$Girth, trees$Volume, log = "xy") # trees 데이타의 컬럼 이름을 이렇게 지정할 수도 있음 plot(trees[,1], trees[,3], log = "xy") # trees 데이타의 컬럼 번호를 지정할 수도 있음 |
# trees 데이타의 컬럼 이름을 지정하는 방법 plot(trees$Girth, trees$Volume, log = "xy") # trees 데이타의 컬럼 번호를 지정하는 방법 plot(trees[,1], trees[,3], log = "xy") |
| 줄 52: | 줄 58: |
| ## Tip: ## data[row 번호, col 번호] 와 같이 data point의 index로 지정가능 ## 여러개의 숫자(혹은 문자)를 묶을 때는 c( , , ) 혹은 c( : ) 형식을 사용함 |
|
| 줄 57: | 줄 60: |
| }}} Tip: * data[row 번호, col 번호] 와 같이 data point의 index로 지정가능 * 여러개의 숫자(혹은 문자)를 묶을 때는 c( , , ) 혹은 c( : ) 형식을 사용함 |
|
| 줄 58: | 줄 65: |
| ## 궁극의 Tip: ## Console에서 위화살표 키를 누르면 전에 쳤던 명령문이 복사된다. ## #이후의 문장은 실행이 안 된다. 메모/도움말 용도로 사용하자 }}} |
궁극의 Tip: * Console에서 위화살표 키를 누르면 전에 쳤던 명령문이 복사된다. * #이후의 문장은 실행이 안 된다. 메모/도움말 용도로 사용하자 |
| 줄 102: | 줄 108: |
| == 중간고사 문제풀이 in R == | <<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 번째까지 모두 다른 공이 나올 확률은 각 회당 다른 공이 나올 확률의 누적곱이다. |
| 줄 104: | 줄 121: |
| library(foreign) datafile <- file.choose() |
person <- 23 odd <- 1.0 |
| 줄 107: | 줄 124: |
| df <- read.spss(datafile, to.data.frame=TRUE) | for (n in 2:person) { odd = odd * (366 - n) / 365 print((1-odd) * 100) } }}} |
| 줄 109: | 줄 130: |
| colnames(df) | 참고로 python이라면 이렇게 쓴다 {{{#!highlight python person = 23 odd = 1.0 |
| 줄 111: | 줄 135: |
| plot(df$age) | for n in range(2,person+1): odd = odd * (366 - n)/365 print (1-odd) * 100 }}} |
| 줄 113: | 줄 140: |
| hist(df$age) | 수학이 어려우면 무식한 시뮬레이션으로 알아볼 수도 있다 (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) }}} |
| 줄 115: | 줄 158: |
| hist(df$edu) | 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)) |
| 줄 117: | 줄 164: |
| # 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 (오렌지 나무 직경)
trees dataset
- 벗나무 31그루의 직경, 높이, 부피를 구한 데이타이다.
1 # trees란 무엇인가!
2 ?trees
3
4 # trees 데이타를 화면에 띄워보자
5 trees # 혹은 print(trees)
6 str(trees)
7 table(trees)
8
9 # data size(dimension)을 확인해보자.
10 dim(trees)
11
12 # 31 x 3 개의 숫자를 한번에 보려니 눈에도 안 들어오고 의미없다. 일부만 화면에 띄워보자.
13 head(trees) # 첫 6개의 data point만 화면에 출력
14 head(trees,10) # 첫 10개의 data point만 화면에 출력
15 tail(trees,4) # 마지막 4개의 data point만 화면에 출력
16
17 # 데이타의 평균, 최상값, 최소값, 중간값, 상위 25% 값, 하위 25% 값을 보고 싶다면,
18 summary(trees)
19
20 # 나무 높이의 평균, 최상값, 최소값, 중간값, 상위 25% 값, 하위 25% 값을 따로 보고 싶다면,
21 mean(trees$Height) # mean(trees) 은 어떤 결과가 나오나?
22 max(trees$Height) # max(trees) 은 어떤 결과가 나오나?
23 min(trees$Height) # min(trees) 은 어떤 결과가 나오나?
24 quantile(trees$Height) # quantile(trees) 은 어떤 결과가 나오나?
숫자보다 그림이 데이타를 한눈에 파악하기 편하다.
1 boxplot(trees)
2
3 # 통계 계산값 말고, 모든 data point를 다 xy 평면에 찍어줘
4 plot(trees)
5
6 # 특별히 Girth 대비 Volume만 따로 xy 평면에 보여주되, xy 둘다 log scale 로 보겠어
7 plot(Volume ~ Girth, data = trees, log = "xy")
8 # trees 데이타의 컬럼 이름을 지정하는 방법
9 plot(trees$Girth, trees$Volume, log = "xy")
10 # trees 데이타의 컬럼 번호를 지정하는 방법
11 plot(trees[,1], trees[,3], log = "xy")
12
13 trees[c(3:10), c(1,3)]
14 plot(trees[c(3:10), c(1,3)])
Tip:
- data[row 번호, col 번호] 와 같이 data point의 index로 지정가능
- 여러개의 숫자(혹은 문자)를 묶을 때는 c( , , ) 혹은 c( : ) 형식을 사용함
궁극의 Tip:
- Console에서 위화살표 키를 누르면 전에 쳤던 명령문이 복사된다.
- #이후의 문장은 실행이 안 된다. 메모/도움말 용도로 사용하자
iris dataset
붓꽃 150송이의 꽃받침 길이(Sepal.Length), 꽃받침 너비(Sepal.Width), 꽃잎 길이(Petal.Length), 꽃잎 너비(Petal.Width), 종(Species)을 조사한 데이터이다.
생물학자&통계학자인 Ronald Fisher의 1936년 Linear discriminant analysis에 관한 논문에 등장한 이후로 Multivariate statistics의 표준 예제 데이타로 자주 인용된다.
1 # 다음을 실행 해 보자
2 iris
3 dim(iris) # data size(dimension)을 확인해보자.
4 head(iris) # 첫 6개의 data point만 화면에 출력
5 tail(iris,5) # 마지막 5개의 data point만 화면에 출력
6 summary(iris)
7 boxplot(iris)
8 plot(iris) # scatter plot
9
10 # Species에 따라 다른 색을 칠하면 보기 편하다
11 plot(iris, col=c('red','blue','green3')[unclass(iris$Species)])
12
13 # 특정 측정값, 예를 들어 Petal.Length vs. Sepal.Length 만 보고 싶다면,
14 plot(Sepal.Length ~ Petal.Length, data = iris, col=c('red','blue','green3')[unclass(iris$Species)] )
15 plot(iris$Petal.Length, iris$Sepal.Length)
16
17 # 한동안 iris 데이타 가지고 놀 것 같으면 미리 선언할 수 있다.
18 attach(iris) # 앞으로 언급 안 하면 data = iris 라는 뜻임
19 plot(Petal.Length, Sepal.Length, col=c('red','blue','green4')[unclass(Species)])
20 plot(Sepal.Length ~ Petal.Length, col=c('red','blue','green4')[unclass(Species)])
21 detach(iris) # iris 놀이 끝
ChickWeight
병아리 50마리를 대상으로 조사한 다이어트별 성장 속도를 조사한 데이타이다.
- weight: 병아리 몸무게 (numeric 데이타, gram)
- Time: 나이 (numeric 데이타, days)
- Chick: 병아리 일련번호 (ordered factor)
- Diet: 다이어트 종류 (factor)
과제: ChickWeight 데이타를 이용하여, 다이어트 종류별로 다른 색을 사용하여, 시간 vs 몸무게 그래프를 그려라.
Birthday Paradox
Birthday Paradox: 23명이 모이면 그 안에 생일이 같은 사람이 존재할 확률은 50% 이상이다.
계산해보자
- 365개의 공을 중복 가능하게 뽑을 때, 같은 공이 나올 확률 문제이다.
- 같은 공이 나올 확률은 (1 - 다른 공이 나올 확률) 이다.
- 다른 공이 나올 확률은 횟수를 거듭할수록 1/365 씩 줄어든다.
- n 번째까지 모두 다른 공이 나올 확률은 각 회당 다른 공이 나올 확률의 누적곱이다.
참고로 python이라면 이렇게 쓴다
수학이 어려우면 무식한 시뮬레이션으로 알아볼 수도 있다 (brute force algorithm)
- 함수를 하나 만들어서 birthday라고 이름을 붙힌다.
- birthday 함수는 nPeople, num 두 가지 변수를 input으로 받는다.
- input value를 생략하면 두 변수의 default값은 각각 23, 1000이다.
- 함수가 하는 일은 1에서 365 사이에서 중복허용으로 nPeople 개의 숫자를 고른 후, 그 중 중복이 있는지를 판단하는 것을 num번 반복하여, 그 중 몇 %에서 중복이 있는지 출력한다.
for-loop으로 구성된 코드는 가독성(human readability)은 좋지만 처리속도는 불리하다.
- R에서는 for-loop대신 sapply 함수가 선호된다. sapply(이 숫자들을, function(x)에 넣어라) 라는 뜻이다.
과제: 어느 모임에서 생일이 같은 사람이 있을 확률이 99% 이상이 되려면 모임이 몇 명이어야 될까?
| /CentralLimitTheorem /ChiSquared /Clustering /InstallR /InstallRStudio /Lies /NormalDistribution /RBasic /RBasic1 /RBasic2 /RBasic3 /RCloud /RIntro /RKorean /T-Test |
