붓스트랩(Bootstrap)

1979년:  미국 Stanforrd 대학교, 브래들리 에프런 (Bradley Efron) 교수 1977년 창안, 붓스트랩 소개

그 후 붓스트랩은 현재 통계학에서는 없어서는 안 될 중요한 주제라고...

붓스트랩은

원 데이터 (개수n)에서 랜덤으로 추출하는데,  

복원 추출하여 (... 데이터가 중복되는 것을 허락)
원래의 데이터 개수n만큼 추출하여 분석하는 방법입니다.

 

일반적으로 표준오차(평균의 표준편차)를 구하는 방법을 다음과 같습니다.
원 데이터에서 표준편차를 구하고(쉽게 구할 수 있습니다)

이 표준편차/ (데이터 갯수의 제곱근) 으로 구합니다.

set.seed(12345) 
norm_x <- rnorm(50,mean=100,sd=5) 
mean(norm_x) 
sd(norm_x) 
sd(norm_x)/sqrt(length(norm_x)) 

(1) set.seed(12345)

# 동일한 난수를 발생하도록 시드 지정

 

(2) norm_x <- rnorm(50,mean=100,sd=5)

# 평균이 100, 표준편차가 5인 난수 50개를 만듬(정규분포가 아니더라도 상관없음)

 

(3) mean(norm_x) 

# 생성된 난수 50개의 평균 구하기, 100.8978

 

(4) sd(norm_x)

# 생성된 난수 50개의 표준편차 구하기 5.48293

 

(5) sd(norm_x)/sqrt(length(norm_x))

# 생성된 난수 50개를 이용하여 표준오차  구하기 0.754034

 

실행결과        r_mod_boot_01

복원 추출하여 붓스트랩(Bootstrap)

set.seed(12345)
mean_val <- numeric(70)
for (i in 1:70) {
  mean_val[i] <- mean(sample(norm_x,replace=T))
}
mean_val
sd(mean_val)  

set.seed(12345)
mean_val <- numeric(70)
for (i in 1:70) {
  mean_val[i] <- mean(sample(norm_x,replace=T))
}

(1) 앞에서의 데이터(50개)를 이용하여 복원추출(중복을 허락하여) 50개의 샘플데이터를 만든 다음

(2) 이 샘플데이터에서 평균을 구하고, 변수 mean_val[i] 에 저장

(3) (1)~(2) 를  평균을 구하기를 70번 반복하고, 그 평균들을 mean_val[i] 에 저장


mean_val
sd(mean_val)  

(4) 평균값 70개를 구한, 평균값들의 표준편차를 구합니다. 0.7344992

(5) 그리하여 앞에서 실행한 표준오차와 비교해 봅니다.

r_mod_boot_02

 

패키지 boot

붓스트렙을 지원하는 패키지 boot가 있습니다. 패키지 boot를 이용하는 방법이 좀 특이합니다.

 

set.seed(12345)
norm_x <- rnorm(50,mean=100,sd=5)  
df01 <- as.data.frame(norm_x)          
str(df01)
my.mean <- function(df,indices=1:NROW(df),x1="norm_x") 
{
(sd(df[,x1])/ sqrt(length(df[,x1])) )
}
avgBoot <- boot(data=df,statistic = my.mean,R=1200)  # 패키지 boot, 함수 boot를 사용 1200 번 붓스트랩 시행
avgBoot
boot.ci(avgBoot,conf=0.95,type="norm")

set.seed(12345)

norm_x <- rnorm(50,mean=100,sd=5)

    50개의 숫자를구함(정규분포가 아니어도 상관없음)

 

df01 <- as.data.frame(norm_x)          
str(df01)

     데이터프레임으로 변환하고 구조를 살펴보기

     50개의 관측치와 norm_x 라는 변수가 있음

     'data.frame': 50 obs. of  1 variable:
     $ norm_x: num  102.9 103.5 99.5 97.7 103 ...

 

my.mean <- function(df,indices=1:NROW(df),x1="norm_x")

{
   (sd(df[,x1])/ sqrt(length(df[,x1])) )

 }

     # my.mean 이라는 함수를 만듬. 표준오차를 만드는 함수

 

avgBoot <- boot(data=df01,statistic = my.mean, R=1200) 

     # 패키지 boot, 함수 boot를 사용, data는 dt01, static에는 my.mean 함수를 이용,  1200 번 붓스트랩 시행

avgBoot

r_mod_boot_03

boot.ci(avgBoot,conf=0.95,type="norm")

     신뢰구간 구하기

 

 

주어진 데이터를 이용하여 전 데이터를 이용하여 회귀분석을 하면(lm함수 이용)

회귀계수를 한 번)에 구할 수 있습니다. 

이러기 보다는 주어진 데이터의 일부분을 추출하여 회귀분석을 하고,

또 다시 일부분을 추출하여 회귀분석을 하고 

이와 같이 회귀계수을 여러 번하여 얻는 통계치들을 평균하는 것이 보다 안정(?)적인 것이 아닐까?

이러한 것이 붓스트랩입니다.

 

그러면 이런 개념을 확대 적용해 보면

각종 머신러닝 기법을 적용하여 나온 결과, 모델이 어느 정도 좋은 것인가? 평가하는 모델성능평가를 하는데

정확도, MSE 등을 구하는데 한 번만 하는 것보다 샘플을 추출하여 여러 번 해 보고,

정확도 또는 MSE 등을 평균하는 것이 안정(?)인 것이 아닐까?

 

붓스트랩 개선 - K-fold

그럼 좀 더 나아가 볼까?
붓스트랩처럼 대책없이(?) 복원추출하는 것보다(랜덤으로 복원추출하면 분석에 포함되지 않는 데이터도 발생)

좀 더 세련되게 하는 방법은 없는 것일까?
데이터셋을 10개로 구분하고, 이 중에서 1-9번까지 데이터셋으로 분석하고, 나머지 10번째로 평가하고

2~10번까지 데이터셋으로 분석하고, 1번 데이터셋으로 평가하고... 이런식으로 하면...

이것이 k-fold 입니다. 여기서 관측치를 1/10 이 아니고, 관측치 한개를 제외하고 나머지로 분석하고

하는 식이면 One Leave Out CrossValidation 이라 합니다.

이런 식으로 머신러닝에서 모형평가하는 방법이 점차 개선되어 나갑니다.

 

참고문헌:

데이터분서그로 배우는 알짜 테크닉(인사이트, 제리드 렌더)

THE R BOOK (WILEY, Michael J.Crawley)

SPSS Statistics 비모수적 방법과 붓스트랩 방법(데이터솔루션, 허명회)

 

 

 

  

 

 

2일차 R의 패키지를 사용하는 방법에 대하여 설명하고 있습니다.
R의 수많은 패키지가 있는데, 이 패키지를 다루는데 공통으로 사용되는 함수(function)또는 함수를 설명하고 있습니다.

  • 설치되어 있는 패키지 목록보기 library( )  
  • 메모리에 로드되어 있는 패키지 목록보기 search( )  
  • 패키지를 로드하기 library(패키지이름)  
  • 메모리에 로드되어 있는 패키지를 언로드하기 deatach(package:패키지이름)  
  • 새로운 패키지를 설치하기 install.packages(“패키지이름”)  
  • 설치된 패키지 갱신/제거하기
    update.packages()
    - remove.packages(패키지이름)
  • 패키지내 함수 살펴보기 -help(package=패키지명)
  • 패키지내 데이터셋 살펴보기
    패키지 ‘datasets’에 들어있는 데이터 살펴보기 data( )
    패키지 ‘MASS’ 데이터 살펴보기 data(package=“MASS”)  
  • 데이터셋 분석하기 - iris, Titanoc, mtcars  

 

 

 

 

1일째는 R과 RStudio 설치를 하였습니다.
이번 2일째는
R이 제공하는 패키지들에 대하여 설명합니다.

R에는 16,000 여개가 넘는 수많은 패키지가 있고, 각 패키지에는 여러 가지 함수와 샘플 데이터와 설명 자료가

포함되어 있습니다.

이들 패키지들은 빠른 속도로 추가되고 있고, 각 패키지마다 여러 함수들을 갖고 있어서,

이들 함수들의 기능이나 그 사용법을 익히기는 것은 쉽지 않습니다.

이러한 패키지 사용법들에 대한 전체적인 시각을 가질 수 있도록 설명하고 있습니다.

 

 

2.1. 패키지 살펴보기 36

2.1.1. 설치되어 있는 패키지 목록보기 library( )  

2.2. 패키지를 메모리에 로드하기  

2.2.1. 메모리에 로드되어 있는 패키지 목록보기 search( )  

2.2.2. 패키지를 로드하기 library(패키지이름)  

2.2.3. 메모리에 로드되어 있는 패키지를 언로드하기 deatach(package:패키지이름)  

2.3. 새로운 패키지를 설치하기 install.packages(“패키지이름”)  

2.3.1. install.packages( ) 함수 이용하기  

2.3.2. 메뉴 [패키지] 이용하기  

2.3.3. 설치된 패키지 갱신/제거하기 update.packages()  

2.4. 패키지내 함수 살펴보기  

2.4.1. 함수 리스트 살펴보기 -help(package=패키지명),library(help=패키지명)  

2.4.1.1. 패키지 base의 함수 확인 help(package=base)  

2.4.1.2. 패키지 base의 함수 확인 library(help=base)  

2.4.1.3. 도움말 이용하기 - help( ) 또는 ?를 이용  

2.4.1.4. 샘플 프로그램 실행하기  

2.4.1.5. 함수기능 키워드 검색 - help.search(“키워드명”)  

2.4.1.6. 패키지 stats의 함수 확인 help(package=stats)  

2.5. 패키지내 데이터셋 살펴보기 53

2.5.1. 패키지 ‘datasets’에 들어있는 데이터 살펴보기 data( )  

2.5.2. 패키지 ‘MASS’ 데이터 살펴보기 data(package=“MASS”)  

2.5.3. 데이터셋 분석하기 - iris, Titanoc, mtcars 55

2.5.3.1. iris 데이터셋 살펴보기 55

2.5.3.2. Titanic 데이터셋 살펴보기 57

2.5.3.3. mtcars 데이터셋 살펴보기 58

2.6. 패키지 관련 명령어 정리 59

 

R강좌와 통계컨설팅 강좌 소개 https://youtu.be/llbtY99DpqY

1.R 설치와 실습

2.R 패키지 다루기

3.R 데이터객체(1)

4.R 데이터객체(2)

5.외부파일 이용하기

6.R프로그래밍

7.파일핸들링  

8. 날짜다루기와 문자열다루기

9. 그래픽다루기(1)

10. 그래픽다루기(2)

11. SQL

12. 행렬사용법

13. 통계적 확률분포

14. 정규분포와 신뢰구간

15. 평균에 대한 분석

16. 분산에 대한 분석

17. R과 통계적 분석기법

18. t 검정

19. 분산분석법(ANOVA)

20. 상관분석

21. 회귀분석

22. 로지스틱 회귀분석

23. 카이제곱법

24, 비모수통계분석

25. 주성분분석

26. 요인분석

27. 판별분석

28. 군집분석

29. 시계열분석

30. R 응용(1) - 의사결정나무, ,KNN, 

31. R 응용(2) - 워드클라우드,샤이니, 마크다운

32. 리눅스에서 R 설치하기

 

 

 

 

 

 

 


 SAS강좌 소개: https://www.youtube.com/watch?v=EeXv1veGVBg

"SAS강좌와 통계컨설팅" 강좌를 소개합니다.

SAS강좌는 다음과 같이 15강으로 구성되어 있습니다.

1강부터 12강까지는 SAS 소개와 프로그램 작성법에 대하여 설명하고

13강부터 24까지는 기초통계학에 해당되는 부분을 설명하고

25강부터 28강까지는 통계학의 다변량분석 기법에 대하여 설명합니다.
29강에는 시계열분석, 

30강에서는 SAS 무료버전인 SAS ODA(Ondemand for Academics)에 대해 설명합니다.

31강에는 SAS 실습문제를 설명합니다.

SAS 는 DATA문과 PROC(프로시져)문으로 구분되어 있습니다.

8강까지는 DATA 문과 관련되어 있고

9강과 10강에 걸쳐 PROC  문에 대해서 설명합니다.

 

11강에서는 IT 분야에 많이 사용되는 SQL 문

12강에서는 행렬연산을 지원하는 ,SAS/IML 에 설명합니다.

13강에서는 통계컨설팅편에 해당되는 통계분석기법들에 대하여 설명합니다.

 

 

30강은 SAS 무료버전(연구용이긴 하지만)인 SAS ODA 에 대하여 설명합니다.

31강에서는 SAS를 이용한 실습문제를 실었습니다

 

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

 

 

 

 

 

(Q) 2020년 11월 31일이 “20201131” 과 같이 입력된 숫자형 변수에서

     일별, 월별색인을 구하고자 하려면 어떻게 할까요?

 

날짜형변수를 다루는 date 문이나 yymmdd 문을 사용하기 부담스러우면,

그대로 숫자형이나 문자형으로 읽어 들인 다음, 변형하여 연, , 일을 구하면 됩니다.

우선 20201131 을 100으로 나눈 나머지(여기서는 31)를 구하여 날짜로 하면 됩니다.

그리고 20201131 을 100으로 나눈 몫(여기서는 202011)은 연도와 월별을 합친 값이 됩니다.

여기서 202011 을 다시 100으로 나눈 나머지(여기서는 11)를 구하면 월별 데이터가 됩니다.

연도별을 구하려면 2020113110,000 으로 나눈 몫(여기서는 2020)을 구하면 연도를 구할 수 있습니다.

 

/*-------------------------------------------------*/

/* , , 일을 구하는 프로그램 */

/*------------------------------------------------*/

1 DATA a1;INPUT nal;CARDS;

2 19981211

3 20201131

4 ;

5 DATA a1;SET a1;

6 day=mod(nal,100);

7 mon=int(nal/100);

8 mon1=mod(mon,100);

9 yr=int(nal/10000);

10 PROC PRINT;

11 RUN;

 

[설명]

 

6 day=mod(nal,100);

변수 day 에 19981211을 100으로 나눈 나머지 즉 21을 저장합니다.

 

7 mon=int(nal/100);

변수 mon 에 19981211을 100으로 나눈 몫 즉 198812를 저장합니다.

 

8 mon1=mod(mon,100);

변수 mon1 mon1에 199812를 100 100으로 나눈 나머지 즉 12를 저장합니다.

 

9 yr=int(nal/10000);

변수 yr 에 19981211을 10000으로 나눈 몫 즉 1988을 저장합니다.

 

20201131일이 “20201131”과 같이 문자형 변수로 읽어 들여 일별, 월별색인을 구하고자 할 때

문자형의 일부를 추출하는 SUBSTR 함수를 이용하면 됩니다.

 

/*---------------------------------------------*/

/* , , 일을 구하는 프로그램 */

/*---------------------------------------------*/

1 DATA a1;INPUT nalja $;

2 CARDS;

3 19981211

4 20030102

5 ;

6 DATA a1;SET a1;

7 yr=SUBSTR(nalja,1,4);

8 mon=SUBSTR(nalja,5,2);

9 day=SUBSTR(nalja,7,2);

10 date_01 = yr* 1000 +mon;

11 PROC PRINT;

12 RUN;

 

문자를 숫자로 읽어들이는 INPUT 함수(데이터를 읽어들이는 INPUT 문이 아님)를 이용하여

인수를 yymmdd10.과 같이 날짜형 인수를 사용하면 간단하게 문자를 날짜형으로 변경할 수 있습니다.

 

/*---------------------------------------------*/

/* , , 일을 구하는 프로그램 */

/* 08_date_input.sas */

/*---------------------------------------------*/

1 DATA a1;INPUT nalja $;

CARDS;

2 19600101

3 19610101

4 ;

5 DATA a1;SET a1;

6 date_01=INPUT(nalja,yymmdd10.);

9 PROC PRINT;

10 RUN;

 

 

 

 

+ Recent posts