> x <- c(2.5, 1.1)

> x

[1] 2.5 1.1

> x <- c(TRUE, FALSE)

> x

[1]  TRUE FALSE

> x <- c("x", "y", "z")

> x

[1] "x" "y" "z"



암묵적 변환 예시이다.


실수와 문자는 문자열로.. 

> # implicit coercion

> x <- c(1.0, "a")

> x

[1] "1" "a"


불린과 integer는 integer로..

> x <- c(TRUE, 1)

> x

[1] 1 1



문자열과 불린은 문자열로..

> x <- c("a", TRUE)

> x

[1] "a"    "TRUE"




명시적 변환 예시이다.

as.xxx()를 이용한다.


> # explict coercion

> x<-"100"

> x

[1] "100"

> class(x)

[1] "character"

> x <- as.integer(x)

> class(x)

[1] "integer"


Posted by '김용환'
,

[R] 평균 구하는 함수

R 2016. 1. 22. 21:41


R에서 평균을 구하는 함수는 다음과 같다.


1. mean


> mean(mylm$effects)

[1] -3.500665



2. 메모리에 올려서 컬럼이름만 쓰는 경우

> attach(mylm)

> mean(effects)

[1] -3.500665

> detach(mylm)



3. with 

> with(mylm, mean(effects))

[1] -3.500665



'R' 카테고리의 다른 글

[R] NA  (0) 2016.02.14
[R] 묵시적 변환, 명시적 변환 예시  (0) 2016.02.14
[R] Error in plot.new() : figure margins too large 해결하기  (0) 2016.01.14
[R] k-means 알고리즘  (0) 2016.01.12
로지스틱 회귀 분석 공부  (0) 2016.01.11
Posted by '김용환'
,



복잡한 문제인 줄 알았는데, 아래 처럼 해봐도 문제가 되었다.



> plot(x)

Error in plot.new() : figure margins too large



 memory 청소하니. 잘 된다.

'R' 카테고리의 다른 글

[R] 묵시적 변환, 명시적 변환 예시  (0) 2016.02.14
[R] 평균 구하는 함수  (0) 2016.01.22
[R] k-means 알고리즘  (0) 2016.01.12
로지스틱 회귀 분석 공부  (0) 2016.01.11
[R] 문자열을 토큰으로 나누기 (strsplit)  (0) 2016.01.06
Posted by '김용환'
,

[R] k-means 알고리즘

R 2016. 1. 12. 20:35




k means 알고리즘은 k 개의 평균(means) 벡터를 이용한 클러스터링(군집화) 알고리즘이다. 데이터들의 분산을 최소화하는 k개의 평균 벡터를 구한다. 


k means 알고리즘은 다음과 같다

1. (처음 중심 값 선택) 랜덤하게 초기 중심 값(centroid)을 선택한다.

2. (클러스터 할당) k 개의 중심 값과 각 개별 데이터간의 거리(distance)를 측정한다. 가장 가까운 클러스터에 해당 데이터를 할당(assign)한다.

3. (새 중심 값 선택) 클러스터마다 새로운 중심 값을 계산한다.

4. (범위 확인-convergence) 선택된 중심 값이 변화가 어느 정도 없다면 멈춘다. 만약 계속 변화가 있다면 1 번부터 반복한다.




그림으로 이해할 수 있는 알고리즘으로서,

 http://ai-times.tistory.com/158에 올려놓은 PPT를 참조하면 다음과 같다. (이해가 가장 쉬운 그림이었다.)


* 랜덤하게 중심 값(centroid) 잡기




* 만약 특이한 데이터(noise)가 끼면, k means 알고리즘(k=2)은 아래와 같이 진행한다.





http://stanford.edu/~cpiech/cs221/handouts/kmeans.html 에 보면 고급 알고리즘이다.





R은 kmeans() 함수를 제공한다. 다음은 이해할 수 있는 쉬운 예제이다. 


> c <- c(3, 4, 1, 5, 7, 9, 5, 4, 6, 8)
> row <- c("A", "B", "C", "D", "E")
> col <- c("X", "Y")
> data <- matrix(c, nrow=5, ncol=2, byrow=TRUE, dimnames=list(row, col))
> data
  X Y
A 3 4
B 1 5
C 7 9
D 5 4
E 6 8
> plot(data)
> km <- kmeans(data, 2, 15)
> km
K-means clustering with 2 clusters of sizes 3, 2

Cluster means:
    X        Y
1 3.0 4.333333
2 6.5 8.500000

Clustering vector:
A B C D E 
1 1 2 1 2 

Within cluster sum of squares by cluster:
[1] 8.666667 1.000000
 (between_SS / total_SS =  78.6 %)

Available components:

[1] "cluster"      "centers"      "totss"        "withinss"    
[5] "tot.withinss" "betweenss"    "size"         "iter"        
[9] "ifault"      
> km$cluster
A B C D E 
1 1 2 1 2 
> km$centers
    X        Y
1 3.0 4.333333
2 6.5 8.500000
> plot(data, col = km$cluster)



 

> points(km$centers, col = 1:2, pch = 9)




데이터가 많으면, kmeans 함수는 데이터가 많아서 잘 안맞는 경우가 있다고 한다. ykmeans 함수를 추천한다고 한다.

https://cran.r-project.org/web/packages/ykmeans/index.html


Posted by '김용환'
,

(통계 어렵다..)

연속적인 데이터(종속변수)일 때는 회귀 분석을 쓰지만, 범위형 데이터일 때는 로지스틱 회귀 분석을 사용한다. 



<로지스틱 회귀 분석>


https://www.youtube.com/watch?v=bNt4xH_GxFk


http://bigsalt.tistory.com/entry/%EB%A1%9C%EC%A7%80%EC%8A%A4%ED%8B%B1-%ED%9A%8C%EA%B7%80%EB%B6%84%EC%84%9Dmultiple-logistic-regression

일반적으로 종속변수가 이분형일 경우 종속변수와 독립변수의 관계는 S-shape이 형태를 띄게 된다. s-shape의 관계에서 종속변수에 logit 변환을 취하게 되면 종속변수와 독립변수의 관계가 선형으로 바뀌게 되는데 이 모형을 로지스틱회귀모형이라 한다


http://www.iexceller.com/MyXls/External_lectures/OnRainbow/OnRainbow_91.asp


http://blog.naver.com/libido1014/120122772781


http://wolfpack.hnu.ac.kr/2012_Spring/LM/LM_Ch12%20Logistic.pdf



<ODDS 개념>


http://wolfpack.hnu.ac.kr/2012_Spring/LM/LM_Ch12%20Logistic.pdf

ODDs  p/1 -p로 정의되며 p 임의의 사건이 발생할(성공) 확률로 이것은 도박의 기준이 된다. 한국이 2002 년 16 강에 들어갈 확률 0.1 이면 1/9 이 Odds 이다. 즉 한국 승리에 1$을 걸은 사람은 한국이 이길 경우 9$을 상금으로 받게 된다. 브라질이 2002 년 16 강에 들어갈 확률 0.8 이면 4 가 Odds 이다. 그러므로 4$을 걸면 1$을 상금으로 받게 된다.


http://tip.daum.net/openknow/65887671


http://dohwan.tistory.com/entry/Odds%EC%99%80-Odds-Ratios-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0

많은 의사들에게 있어 승산(Odds)과 승산비(Odds Ratios, 이하 OR)는 이해하기 어렵다. Odds는 "어떤 사건이 일어날 확률을 그 사건이 일어나지 않을 확률로 나눈 것"이다. Odds Ratio는 "한 그룹에서의 odds를 다른 그룹에서의 odds로 나눠준 것이다" (예를 들어 약을 복용한 그룹의 odds/약을 복용하지 않은 그룹의 Odds


확률(Probability)이 낮을 때(예를 들어 10% 이하일 때)는 OR은 실제의 relative risk(상대위험도, RR)를 반영한다. 그러나 사건의 확률이 높아질수록 OR은 점점 더 RR보다 과장되어 OR이 더 이상 RR을 대체하지 못한다. OR은 association(연관성)을 측정하는 데에는 항상 좋지만, RR을 대체하기에 항항 좋은 것은 아니다. OR을 이해하는 것이 어렵기 때문에, 그 활용은 OR이 연관성의 측정 용도로 적절한 Case-Control study와 logistic regression에 제한되어 사용되는 것이 좋다.



로지스틱 회귀 분석은 log(odds)를 모형화한 것..



<R>

glm은 generalized linear model의 약자이다. 

family의 값은 binomial(이항 분포, 0아니면 1)로 정해야  (family = binomial) 로직스틱 회귀분석을 진행할 수 있다.


출처: http://www.cookbook-r.com/Statistical_analysis/Logistic_regression/





> data(mtcars)

> dat <- subset(mtcars, select=c(mpg, am, vs))

> dat

                     mpg am vs

Mazda RX4           21.0  1  0

Mazda RX4 Wag       21.0  1  0

Datsun 710          22.8  1  1

Hornet 4 Drive      21.4  0  1

Hornet Sportabout   18.7  0  0

Valiant             18.1  0  1

Duster 360          14.3  0  0

Merc 240D           24.4  0  1

Merc 230            22.8  0  1

Merc 280            19.2  0  1

Merc 280C           17.8  0  1

Merc 450SE          16.4  0  0

Merc 450SL          17.3  0  0

Merc 450SLC         15.2  0  0

Cadillac Fleetwood  10.4  0  0

Lincoln Continental 10.4  0  0

Chrysler Imperial   14.7  0  0

Fiat 128            32.4  1  1

Honda Civic         30.4  1  1

Toyota Corolla      33.9  1  1

Toyota Corona       21.5  0  1

Dodge Challenger    15.5  0  0

AMC Javelin         15.2  0  0

Camaro Z28          13.3  0  0

Pontiac Firebird    19.2  0  0

Fiat X1-9           27.3  1  1

Porsche 914-2       26.0  1  0

Lotus Europa        30.4  1  1

Ford Pantera L      15.8  1  0

Ferrari Dino        19.7  1  0

Maserati Bora       15.0  1  0

Volvo 142E          21.4  1  1

> logr_vm <- glm(vs ~ mpg, data=dat, family=binomial)

> logr_vm


Call:  glm(formula = vs ~ mpg, family = binomial, data = dat)


Coefficients:

(Intercept)          mpg  

    -8.8331       0.4304  


Degrees of Freedom: 31 Total (i.e. Null);  30 Residual

Null Deviance:    43.86 

Residual Deviance: 25.53 AIC: 29.53

>

> logr_vm <- glm(vs ~ mpg, data=dat, family=binomial(link="logit"))

> logr_vm


Call:  glm(formula = vs ~ mpg, family = binomial(link = "logit"), data = dat)


Coefficients:

(Intercept)          mpg  

    -8.8331       0.4304  


Degrees of Freedom: 31 Total (i.e. Null);  30 Residual

Null Deviance:    43.86 

Residual Deviance: 25.53 AIC: 29.53

> library(ggplot2)

> ggplot(dat, aes(x=mpg, y=vs)) + geom_point() + 

+   stat_smooth(method="glm", family="binomial", se=FALSE)

> plot(dat$mpg, dat$vs)

> curve(predict(logr_vm, data.frame(mpg=x), type="response"), add=TRUE) 

> logr_va <- glm(vs ~ am, data=dat, family=binomial)

> logr_va


Call:  glm(formula = vs ~ am, family = binomial, data = dat)


Coefficients:

(Intercept)           am  

    -0.5390       0.6931  


Degrees of Freedom: 31 Total (i.e. Null);  30 Residual

Null Deviance:    43.86 

Residual Deviance: 42.95 AIC: 46.95

> summary(logr_va)


Call:

glm(formula = vs ~ am, family = binomial, data = dat)


Deviance Residuals: 

    Min       1Q   Median       3Q      Max  

-1.2435  -0.9587  -0.9587   1.1127   1.4132  


Coefficients:

            Estimate Std. Error z value Pr(>|z|)

(Intercept)  -0.5390     0.4756  -1.133    0.257

am            0.6931     0.7319   0.947    0.344


(Dispersion parameter for binomial family taken to be 1)


    Null deviance: 43.860  on 31  degrees of freedom

Residual deviance: 42.953  on 30  degrees of freedom

AIC: 46.953


Number of Fisher Scoring iterations: 4

> library(ggplot2)

> ggplot(dat, aes(x=am, y=vs)) + 

+   geom_point(shape=1, position=position_jitter(width=.05,height=.05)) + 

+   stat_smooth(method="glm", family="binomial", se=FALSE)

> plot(jitter(dat$am, .2), jitter(dat$vs, .2))

> curve(predict(logr_va, data.frame(am=x), type="response"), add=TRUE) 

> logr_vma <- glm(vs ~ mpg + am, data=dat, family=binomial)

> logr_vma


Call:  glm(formula = vs ~ mpg + am, family = binomial, data = dat)


Coefficients:

(Intercept)          mpg           am  

   -12.7051       0.6809      -3.0073  


Degrees of Freedom: 31 Total (i.e. Null);  29 Residual

Null Deviance:    43.86 

Residual Deviance: 20.65 AIC: 26.65

> summary(logr_vma)


Call:

glm(formula = vs ~ mpg + am, family = binomial, data = dat)


Deviance Residuals: 

     Min        1Q    Median        3Q       Max  

-2.05888  -0.44544  -0.08765   0.33335   1.68405  


Coefficients:

            Estimate Std. Error z value Pr(>|z|)   

(Intercept) -12.7051     4.6252  -2.747  0.00602 **

mpg           0.6809     0.2524   2.698  0.00697 **

am           -3.0073     1.5995  -1.880  0.06009 . 

---

Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


(Dispersion parameter for binomial family taken to be 1)


    Null deviance: 43.860  on 31  degrees of freedom

Residual deviance: 20.646  on 29  degrees of freedom

AIC: 26.646


Number of Fisher Scoring iterations: 6



참조할만한 좋은 R 소스


http://charlieya.tistory.com/10

Posted by '김용환'
,


R에서 strsplit()으로 문자열을 토큰으로 나눌 수 있다. 

strsplit()이 벡터도 처리할 수 있어서 list로 리턴한다. 이를 unlist() 호출해서 배열로 바꾸고, index로 접근한다.




> string <- "I like starwars"

> splat <- strsplit(string, " ")

> splat

[[1]]

[1] "I"        "like"     "starwars"

> typeof(splat)

[1] "list"

> data <- unlist(splat)

> data

[1] "I"        "like"     "starwars"

> data[0]

character(0)

> data[1]

[1] "I"

> data[2]

[1] "like"

> strings <- c("2015:starwars", "2014:rings")

> splats <- strsplit(strings, ":")

> splats

[[1]]

[1] "2015"     "starwars"


[[2]]

[1] "2014"  "rings"


> data <- unlist(splat)

> data

[1] "I"        "like"     "starwars"

> data[0]

character(0)

> data[1]

[1] "I"

> data[2]

[1] "like"




Posted by '김용환'
,


R언어에서 숫자로 된 문자여을 숫자로 변환하기 (string 에서 integer로)



string<-"123"


strtoi(string)

as.integer(123)







Posted by '김용환'
,

(며칠동안 공부하면서 정리한 내용이라 많이 틀릴 수 있다..)



* 카이제곱 소개

 

데이터의 중심 위치는 평균인데, 치우침을 표현하는 것이 분산이나 표준편차(standard deviation)이다.

퍼져 있는 분산을 분포(distribution)로 만는데. 

(데이터의 결과를 집합적으로 나타내는 특징이 집합적으로 나타난다.

랭킹 데이터나 추천 데이터 만들 때 분포로 나타나는 현상이 나온다.)

그 중의 하나가 카이제곱 분포이다. x^2 분포이다.




* 분포 


참고로, 분포는 여러 개가 있다.

- 정규 분포(normal distribution) : 가운데가 복록 나온 완벽한 좌우 대칭의 형태의 분포

- 표준 정규 분포 (standard normal distribution), z 분포 : 평균이 0이고, 표준 편차가 1인 정규 분포

- t 분포 : 정규 분포의 평균을 측정할 때 사용되는 분포

- 카이제곱 분포 

- F 분포

- 포아송 분포 


검정(test)는 분포와 연관이 있다.

- z 검정 (표준 정규 분포, z 분포와 연관) : 두 집단이 정규 분포이면, 평균을 통해 크기를 비교하는 것

- t 검정 (t분포) : t 분포를 이용하여 두 집단을 비교하는 방법, z 검정 대신 사용하는 이유는 표본수가 적어서..

- 카이제곱 검정 : 관찰된 빈도가 기대되는 빈도와 의미있게 다른지의 여부를 검증하기 위해 사용되는 검증방법. 교차 분석 또는 카이 자승 검정이라고 하기도 한다.

(z 검정, t 검정은 평균 값의 가설 검정에 쓰이고, 카이제곱은 확률을 검정) 





*카이제곱  분포


chi 는 '카이'로 발음하며, 그리스 문자이다. 보통 x로 쓴다. 그래서 카이제곱 = x^2 인 셈이다.
참고로, R에서 카이제곱 검정 함수는 chisq.test() 이다.


x^2이니까 +x이든, -x이든 x*x 가 된다. 따라서 분포도상 큰 분포도가 된다. (이런게 진짜 실제 세계의 분포 같기도 하다.)


출처: http://grants.hhp.coe.uh.edu/doconnor/PEP6305/chisquare.htm



그래프를 보면, 0에서 멀어지면 분포가 감소하고, 0으로 가까워지면, 분포가 많아진다. 
변수(x)와 특정 현상(y) 사이의 연관성을 보고 싶을 때이다. 순수한 값만 가지고 접근하기 때문에 % 값이 아니다. 



* 카이제곱 검정

카이제곱 검정은 구간 별로 관측된 빈도와 기대 빈도의 차이를 살펴 봄으로서, 확률 모형이 얼마나 자료를 잘 설명하는지 사용한다. 3 개 이상의 범주가 존재할 때 사용된다. 


카이제곱은 기본자료, 확률모형, 도수 분포표(따로 정의된 표)이 존재하며 
카이제곱 통계량, 자유도를 측정하여 관찰 유의 수준(관찰될 가능성 또는 p값)을 얻을 수 있다고 한다.

(출처 : http://www-users.york.ac.uk/~mb55/msc/ytustats/chiodds.htm)
자유도 4인 값이 p값이 5% 확률로 관찰될 수 있음


귀무가설(H0, 두 변수는 연관성이 없다.)과 대립가설(H1, 두 변수는 연관성이 없다.)로 가설을 검증한다.
귀무 가설하에서 카이제곱 통계량이 크면 관측된 유의 수준은 작아진다고 한다.

이상한 통계예일 수 있는데, 성별과 오른손/왼손 잡이와 관련이 있는걸까? 관련있다고 나온다면 우연일까 아닐까? 
관측 도수와 기대도수, 카이제곱 통계량을 계산 후 편차로부터 얻은 자유도 값으로 '카이제곱 검정표'를 찾아 p값을 찾는다. p값이 작게 나오면(0.05보다 작다면) 서로 연관성이 없다는 귀무가설이 기각된다. 성별과 오른손/왼손 잡이와는 연관성이 있다라고 분석할  수 있다.
(참조하기 좋은 내용 : http://math7.tistory.com/58http://www.6025.co.kr/statistics/ka.asp)


* 관측도수와 기대도수

 

 녹색

빨간 색 

계 

 좋아요

a + b 

 좋아하지 않아요

c + d 

 

a + c 

b + d 

a + b + c + d  


a의 기대도수  = (a+b) (a+c) / (a+b+c+d)

b의 기대도수  = (a+b) (c+d) / (a+b+c+d)

c의 기대도수  = (c+d) (a+c) / (a+b+c+d)

d의 기대도수  = (c+d) (b+d) / (a+b+c+d)


모든 기대도수의 값은 5보다 커야 한다. 기대도수가 5보다 작은 경우는 전체 기대 도수 값 개수보다 1/4보다 작아야 한다.


R에서도 기대도수 값 및 각종 통계 지표를 뽑아낼 수 있다. 





* R 이용하기

- 적합성 검정

빨간 색을 좋아하는 사람이 녹색을 같이 좋아할까? 라는 예시코드를 chisq() 함수로 써본다.


> likeStat <- matrix(c(5,10,12,3),nrow=2)
> likeStat
     [,1] [,2]
[1,]    5   12
[2,]   10    3
> dimnames(likeStat) <- list("L"=c("Like","Not Like"), "stat"=c("Red", "Green"))
> likeStat
          stat
L          Red Green
  Like       5    12
  Not Like  10     3
> addmargins(likeStat)
          stat
L          Red Green Sum
  Like       5    12  17
  Not Like  10     3  13
  Sum       15    15  30
> chisq.test(likeStat)

Pearson's Chi-squared test with Yates' continuity
correction

data:  likeStat
X-squared = 4.8869, df = 1, p-value = 0.02706


카이제곱은 4.8869 이고, 자유도 값은 1이며, p 값은 0.027 이다. 0.05보다 작으므로 연관성이 없다.
빨간 색을 좋아하는 사람과 녹색을 좋아하는 사람은 연관이 없다. 

> likeStat <- matrix(c(5,10,3,12),nrow=2)
> likeStat
     [,1] [,2]
[1,]    5    3
[2,]   10   12
> dimnames(likeStat) <- list("L"=c("Like","Not Like"), "stat"=c("Red", "Green"))
> likeStat
          stat
L          Red Green
  Like       5     3
  Not Like  10    12
> addmargins(likeStat)
          stat
L          Red Green Sum
  Like       5     3   8
  Not Like  10    12  22
  Sum       15    15  30
> chisq.test(likeStat)

Pearson's Chi-squared test with Yates' continuity
correction

data:  likeStat
X-squared = 0.17045, df = 1, p-value = 0.6797

경고메시지(들): 
In chisq.test(likeStat) :
  카이제곱 approximation은 정확하지 않을수도 있습니다


카이제곱은 0.17이고, p값은 0.67이다. 0.05보다 크므로 연관성이 있음을 볼 수 있다. 귀무가설 적합.



만약 색깔이 녹색, 빨간, 노란색이 있다고 가정하고 다시 한번 카이제곱 검증 chisq.test()를 사용하면 결과는 다음과 같다.
> likeStat <- matrix(c(5,18,12,11,18,7),nrow=2)
> chisq.test(likeStat)


Pearson's Chi-squared test

data:  likeStat
X-squared = 12.22, df = 2, p-value = 0.002221



카이제곱 검정 함수 리턴값의 속성을 확인할 수 있다.

> likeStat <- matrix(c(5,18,12,11,18,7),nrow=2)
> likeStat
     [,1] [,2] [,3]
[1,]    5   12   18
[2,]   18   11    7
> result <- chisq.test(likeStat)
> result$statistic
X-squared 
 12.21964 
> result$observed
     [,1] [,2] [,3]
[1,]    5   12   18
[2,]   18   11    7
> result$p.value
[1] 0.002220946
> result$expected
         [,1]     [,2]     [,3]
[1,] 11.33803 11.33803 12.32394
[2,] 11.66197 11.66197 12.67606
> result$residuals
          [,1]       [,2]      [,3]
[1,] -1.882285  0.1965942  1.616858
[2,]  1.855958 -0.1938445 -1.594243
> result$parameter
df 
 2

- xtabs를 이용한 적합성 검정 

chisq.test() 없이 xtabs와 summary를 통해서도 카이제곱 검정 값을 구할 수 있다. 
담배피는 사람과 체중간의 연관성 확인하기
> stat <- matrix(c(23,50,42,10,67,23,22,90,25),ncol=3)
> stat
     [,1] [,2] [,3]
[1,]   23   10   22
[2,]   50   67   90
[3,]   42   23   25
> dimnames(stat) <- list("smoking"=c("over","none", "regular"), "wight"=c("over", "under", "regular"))
> stat
         wight
smoking   over under regular
  over      23    10      22
  none      50    67      90
  regular   42    23      25
> apply(stat, 1, sum)
   over    none regular 
     55     207      90 
> apply(stat, 2, sum)
   over   under regular 
    115     100     137 
> summary(xtabs(under~over+regular, data=stat))
Call: xtabs(formula = under ~ over + regular, data = stat)
Number of cases in table: 100 
Number of factors: 2 
Test for independence of all factors:
Chisq = 200, df = 4, p-value = 3.757e-42
Chi-squared approximation may be incorrect





* 추가
- 카이제곱 한계
표본수가 적거나 너무 치우치면 카이제곱의 결과가 부정확할 수 있으니.
피셔의 정확 검정-fisher.test()을 사용한다. 
(고급스럽게 말하면, 앞에서 얘기한 기대도수의 값이 5 이하인 것이 전체 기대도수 값들 중 1/4이 넘으면.. 피셔 검정을 사용한다.)


- R의 카이제곱 함수 중 다양한 함수가 있다.
1. 밀도 함수 dchisq
2. 누적분포함수 pchisq
3. 분위수 함수 qchisq
4. 난수 발생 rchisq 

(출처 : http://rfriend.tistory.com/112)

Posted by '김용환'
,



R에는 간단히 테스트할 수 있는 예제 data frame(list)가 있다. cars 는 그 중 하나로서, 아주 심플하지만, 테스트하기 좋다.

cars$speed는 차량의 속도를 의미하며, cars$dist는 차를 멈추려고 브레이크를 밟았을 때, 차량이 얼마나 갔는지 기록한 값이다. (당연히 속도가 높다면 더 길이가 나갈 것이다.)



> data(cars)

> head(cars)

  speed dist

1     4    2

2     4   10

3     7    4

4     7   22

5     8   16

6     9   10



표준 편차는 단순하게 하나의 변수를 설명하는 척도이다. 따라서 단순하게 산술 평균의 분포를 나타낸다. 동일한 단위 기준인 셈이다.



> sd(cars$speed)

[1] 5.287644

> sd(cars$dist)

[1] 25.76938


이것만 가지고 insight을 얻을 수 없는게.. 변수 요인에 따른 기준 값을 찾을 때 쓰는 것이 선형 회기 공식(Linear regression)이다. 


cars의 필드 dist와 speed 간의 상관도를 함수로 표현할 수 있다. y = ax + b 이런 느낌으로 만들어주는 선형 회기 공식을 생각할 수 있다. 


처음에 설명한 대로.. cars$speed는 차량의 속도를 의미하며, cars$dist는 차를 멈추려고 브레이크를 밟았을 때, 차량이 얼마나 갔는지 기록한 값인데, 이를 간단하게 수학식으로 표현할 수 있다. 


R에서는  lm 함수를 이용한다.


> mylm <- lm(dist ~ speed, cars)

> summary(mylm)


Call:

lm(formula = dist ~ speed, data = cars)


Residuals:

    Min      1Q  Median      3Q     Max 

-29.069  -9.525  -2.272   9.215  43.201 


Coefficients:

            Estimate Std. Error t value Pr(>|t|)    

(Intercept) -17.5791     6.7584  -2.601   0.0123 *  

speed         3.9324     0.4155   9.464 1.49e-12 ***

---

Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


Residual standard error: 15.38 on 48 degrees of freedom

Multiple R-squared:  0.6511, Adjusted R-squared:  0.6438 

F-statistic: 89.57 on 1 and 48 DF,  p-value: 1.49e-12


* 공식은 lm(formula = dist ~ speed, data = cars) 로 표현된다. 


Coefficient 값을 살펴보면, (intercept) 값과 speed 값을 이용하면, 다음과 같은 선형 회기 공식을 얻을 수 있다.

cars$dist = -17.5791 + cars$speed * 3.932  


coef()를 이용할 수 도 있다.

> coef(mylm)

(Intercept)       speed 

 -17.579095    3.932409 


* y = ax + b 라는 선형 회귀 공식이 있다면, a를 기울기, b를 절편이라고 부른다. 





이 선형 회기 공식으로 fitted() 함수를 사용하면 앞으로를 예측할 수 있다. 


> fitted(mylm)

        1         2         3         4         5         6         7 

-1.849460 -1.849460  9.947766  9.947766 13.880175 17.812584 21.744993 

        8         9        10        11        12        13        14 

21.744993 21.744993 25.677401 25.677401 29.609810 29.609810 29.609810 

       15        16        17        18        19        20        21 

29.609810 33.542219 33.542219 33.542219 33.542219 37.474628 37.474628 

       22        23        24        25        26        27        28 

37.474628 37.474628 41.407036 41.407036 41.407036 45.339445 45.339445 

       29        30        31        32        33        34        35 

49.271854 49.271854 49.271854 53.204263 53.204263 53.204263 53.204263 

       36        37        38        39        40        41        42 

57.136672 57.136672 57.136672 61.069080 61.069080 61.069080 61.069080 

       43        44        45        46        47        48        49 

61.069080 68.933898 72.866307 76.798715 76.798715 76.798715 76.798715 

       50 

80.731124 





그럴싸한데.. 값은 약간 곡선화되어서 딱 선형 회귀 곡선에 맞지 않는다. 그래서 이런 오차를 Residual(잔차 분포)이라 한다. 

선형 회귀 공식과 잔차 분포 값을 더하면 original y 값이 나온다고 할 수 있다. 

이런 공식이 나온다. 


cars$dist = fitted(mylm) + residuals(mylm) 



실제 확인하면 정확하게 들어맞는다. 


> fitted(mylm) [1:10] + residuals(mylm) [1:10]

 1  2  3  4  5  6  7  8  9 10 

 2 10  4 22 16 10 18 26 34 17 

> cars$dist[1:10]

 [1]  2 10  4 22 16 10 18 26 34 17



이번에는 정밀도(precision) 관점에서 해보면, RMS(제곱 평균 제곱근) 오차를 확인할 수 있다. https://ko.wikipedia.org/wiki/%ED%8F%89%EA%B7%A0_%EC%A0%9C%EA%B3%B1%EA%B7%BC_%ED%8E%B8%EC%B0%A8

시그마, 잔차 표준 오차, RMS 오차, 제곱 평균 제곱근 오차 라고 한다. 


> summary(mylm)$sigma

[1] 15.37959



summary(mylm)의 결과와 비교하면 동일하다.

Residual standard error: 15.38



그 동안 오차와 관련된 정밀도(precision)과 잔차(residuals)를 보았다.




아까 coef()로 살펴본, 수식은 사실상 그냥 숫자이지. 공식 함수는 아니다..

이를 확인해보려면, predict() 함수를 사용한다. 기가 막히게 함수화 되었다. 



> coef(mylm)

(Intercept)       speed 

 -17.579095    3.932409 

> predict(mylm, newdata=data.frame(speed=10))

       1 

21.74499 



예측 값은 항상 오차가 발생하기 마련인데, 이를 신뢰구간에 들어가는 값인지 아닌지를 interval="confidence" 매개변수를 주어 확인할 수 있다.



> predict(mylm, newdata=data.frame(speed=10),interval="confidence")

       fit      lwr      upr

1 21.74499 15.46192 28.02807


lwr는 신뢰구간의 하한, upr는 신뢰구간의 상한을 의미한다. 



돌려 생각하면, 오차항(e)을 추가하는 형태가 될 수 있다.


cars$dist = -17.5791 + cars$speed * 3.932   + e


interval="prediction" 매개변수를 주어 오차항을 확인한다.


predict(mylm, newdata=data.frame(speed=10),interval="prediction") 

       fit       lwr      upr

1 21.74499 -9.809601 53.29959




summary로 돌아간다.

> summary(mylm)


Call:

lm(formula = dist ~ speed, data = cars)


Residuals:

    Min      1Q  Median      3Q     Max 

-29.069  -9.525  -2.272   9.215  43.201 


Coefficients:

            Estimate Std. Error t value Pr(>|t|)    

(Intercept) -17.5791     6.7584  -2.601   0.0123 *  

speed         3.9324     0.4155   9.464 1.49e-12 ***

---

Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


Residual standard error: 15.38 on 48 degrees of freedom

Multiple R-squared:  0.6511, Adjusted R-squared:  0.6438 

F-statistic: 89.57 on 1 and 48 DF,  p-value: 1.49e-12


Pr(>|t|)    는  t 분포*를 사용한 유의성을 알려준다.  (t 분포* : 추리통계 분포)

다음은 모델의 결정계수와 F 통계량이다. 

Multiple R-squared는 모델의 데이터 분산도를 의미한다. 

F-statistic는 모델의 유의성을 의미한다. 





그외 전차 제곱의 합의 다음과 같이 구한다. 

> deviance(mylm)

[1] 11353.52

> sum((cars$dist - predict(mylm, newdata=cars))^2)

[1] 11353.52





참고로 단순 선형 회귀 공식은 조건에 다라 나눌 수 있다. 즉, 특정 값을 기준으로 바꿔서 선형 회귀 공식을 구간별로 얻을 수 있다.



> yourlm <- lm(dist[dist > 50] ~ speed[dist > 50], cars)

> summary(yourlm)


Call:

lm(formula = dist[dist > 50] ~ speed[dist > 50], data = cars)


Residuals:

    Min      1Q  Median      3Q     Max 

-24.672 -10.865  -1.903  11.135  39.135 


Coefficients:

                 Estimate Std. Error t value Pr(>|t|)  

(Intercept)        28.245     23.880   1.183   0.2553  

speed[dist > 50]    2.192      1.169   1.875   0.0804 .

---

Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


Residual standard error: 17.01 on 15 degrees of freedom

Multiple R-squared:  0.1899, Adjusted R-squared:  0.1359 

F-statistic: 3.517 on 1 and 15 DF,  p-value: 0.08035



anova() 함수를 사용하면 분산분석표를 구할 수 있다.  

> anova(mylm)

Analysis of Variance Table


Response: dist

          Df Sum Sq Mean Sq F value   Pr(>F)    

speed      1  21186 21185.5  89.567 1.49e-12 ***

Residuals 48  11354   236.5                     

---

Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1





Posted by '김용환'
,


R에서 data frame에서 한 조건를 바탕으로 하는 정보를 보고 싶을 때 유용하다.


select table.a from table where table.b = 10 와 같은 느낌으로 코딩할 수 있다. 



employees <- read.csv("employees.csv",header=TRUE)


typeof(employees)

[1] "list"


> sd(employees$a[employees$b==TRUE])

[1] 3.077446



> summary(employees$a[employees$b==FALSE])

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 

  1.700   4.300   5.000   4.994   5.700   8.100 



이외 histgram에서도 쓸 수 있기 때문에, 편리하게 그림으로 볼 수도 있다.


> hist(employees$a[employees$b==TRUE], breaks=50, plot = TRUE)




Posted by '김용환'
,