반응형

[SAS] 변수 계산 (산술 연산) - DATA, SET

 주어진 데이터의 값을 바꾸어 사용해야 할 때가 있다. 이번 포스팅에서는 다음의 연산들을 소개할 것이다.

 

산술 연산

1) 더하기

2) 빼기

3) 곱하기

4) 나누기

5) 제곱 (승)

6) 로그 (log)

7) 지수

 

*실습용 데이터는 아래 링크를 클릭하면 다운로드할 수 있습니다.

2022.08.04 - [공지사항 및 소개] - 분석용 데이터 (update 22.10.06)

 

분석용 데이터 (update 22.10.06)

2022년 08월 29일 버전입니다. 변수는 계속하여 추가될 예정입니다. 다음 카테고리에 있는 글에서 이용된 데이터입니다. - 기술 통계 - 통계 프로그램 사용 방법 1) 엑셀 파일 2) CSV 파일 3) 코드북

medistat.tistory.com

 

시작하기 위해 라이브러리를 만들고, 파일을 불러온다.

라이브러리 만드는 방법: 2022.08.05 - [통계 프로그램 사용 방법/SAS] - [SAS] 라이브러리 만들기 - LIBNAME

파일 불러오는 방법: 2022.08.05 - [통계 프로그램 사용 방법/SAS] - [SAS] 데이터 불러오기 및 저장하기 - PROC IMPORT, PROC EXPORT

 

*라이브러리 지정하기;
LIBNAME hong "C:/Users/User/Documents/Tistory_blog";

*파일 불러오기;
PROC IMPORT
DATAFILE="C:\Users\user\Documents\Tistory_blog\Data.xlsx"
DBMS=EXCEL
OUT=hong.df
REPLACE;
RUN;

 

코드

DATA hong.df_new;
SET hong.df;

*1) 더하기;
LIVER_SUM=AST+ALT;

*2) 빼기;
ALT_DIF=ALT-ALT_POSTMED;

*3) 곱하기;
MALE_ALC=SEX*ALCOHOL;

*4) 나누기;
LIVER_RATIO=AST/ALT;

*5) 거듭제곱 (승);
SBP_SQ=SBP**2;

*6) 로그 (log);
LOG_ALT=LOG(ALT);
LOG10_ALT=LOG10(ALT);
LOG7_ALT=LOG(ALT)/LOG(7);

*7) 지수;
EXP_ALT=EXP(ALT);
EXP10_ALT=EXP(ALT*log(10));

RUN;

DATA hong.df_new; : hong이라는 라이브러리에 df_new라는 이름을 가진 데이터 파일을 새로 만들 것이다. 
SET hong.df; : df_new라는 이름의 데이터파일에는 hong라이브러리에 있는 df파일을 갖다 넣어라.

*1) 더하기;
LIVER_SUM=AST+ALT; : AST와 ALT를 합쳐 그 값을 LIVER_SUM이라는 변수에 저장해라.

*2) 빼기;
ALT_DIF=ALT-ALT_POSTMED; : ALT에서 ALT_POSTMED를 빼서 그 값을 ALT_DIF라는 변수에 저장해라.

*3) 곱하기;
MALE_ALC=SEX*ALCOHOL; : SEX와 ALCOHOL을 곱해 MALE_ALC라는 변수에 저장해라.

*4) 나누기;
LIVER_RATIO=AST/ALT; : AST를 ALT로 나누어 그 값을 LIVER_RAIO라는 변수에 저장해라

*5) 거듭제곱 (승);
SBP_SQ=SBP**2; : SPB를 제곱하여 SBP_SQ에 저장해라. 만약 세제곱을 원한다면 "SBP**3"을 사용하면 된다.

*6) 로그 (log);
LOG_ALT=LOG(ALT); : ALT에 로그를 씌워 LOG_ALT에 저장해라. 이때 로그의 밑은 $e$다.
LOG10_ALT=LOG10(ALT); : ALT에 로그를 씌워 LOG_ALT에 저장해라. 이때 로그의 밑은 $10$이다.

LOG7_ALT=LOG(ALT)/LOG(7); : ALT에 로그를 씌워 LOG_ALT에 저장해라. 이때 로그의 밑은 $7$이다. 원하는 숫자를 밑으로 하고 싶으면 7이 아닌 원하는 숫자를 적으면 된다.

*7) 지수;
EXP_ALT=EXP(ALT); : $e$의 ALT승$\left(e^{ALT} \right)$을 EXP_ALT에 저장해라.
EXP10_ALT=EXP(ALT*log(10)); : $10$의 ALT승$\left(10^{ALT} \right)$을 EXP10_ALT에 저장해라. 만약 $10$이 아닌 $5$의 ALT승$\left(5^{ALT} \right)$를원하면 "log(5)"를 사용하면 된다.

 

 

결과

 SAS내 "탐색기"로 데이터를 보면 다음과 같이 새로운 변수들이 만들어진 것을 확인할 수 있다.

 

 

연산 시 결측치는 어떻게 처리되는가?

 연산 시 가장 중요한 것은 결측치가 어떻게 처리되는 것인가에 대한 내용이다. 왜냐하면 연산자에 따라 결측치를 결측치로 생각하는 경우가 있고, 0으로 생각하는 경우가 있기 때문이다. 추상적이라 이해가 어려울 테니 다음 예시를 보면 이해가 빠를 것이다.

 

변수 AST에는 8개의 결측치가 있음을 다음 코드로 확인할 수 있다. (PROC MEANS에 대한 내용은 다음 링크에서 확인할 수 있다. 2022.09.23 - [기술 통계/SAS] - [SAS] 기술 통계 (평균, 표준편차, 표준오차, 최댓값, 최솟값, 중위수, 분위수 등) - PROC UNIVARIATE, PROC MEANS)

 

결측치 확인 코드

PROC MEANS DATA=hong.df NMISS;
VAR AST;
RUN;

 

결측치  확인 결과

 

그러면 위에서 만든 변수 중 LIVER_SUM(=AST+ALT)은 어떻게 될까? 결측치의 개수를 확인해보자.

 

결측치 확인 코드

PROC MEANS DATA=hong.df_new nmiss;
VAR LIVER_SUM;
RUN;

결측치  확인 결과

 

결측치는 연산 결과도 결측치가 됨을 알 수 있다.

 

하지만 다음 링크에서 확인할 수 있듯이, 비교연산자 중 일부는 결측치를 0으로 인식하므로 코드를 주의해서 작성해야 한다.

2022.10.06 - [통계 프로그램 사용 방법/SAS] - [SAS] 변수 계산 (비교 연산) - DATA, SET, GE, LE, NE, IN, MIN, MAX

 

 

코드 정리

*라이브러리 지정하기;
LIBNAME hong "C:/Users/User/Documents/Tistory_blog";

*파일 불러오기;
PROC IMPORT
DATAFILE="C:\Users\user\Documents\Tistory_blog\Data.xlsx"
DBMS=EXCEL
OUT=hong.df
REPLACE;
RUN;

DATA hong.df_new;
SET hong.df;

*1) 더하기;
LIVER_SUM=AST+ALT;

*2) 빼기;
ALT_DIF=ALT-ALT_POSTMED;

*3) 곱하기;
MALE_ALC=SEX*ALCOHOL;

*4) 나누기;
LIVER_RATIO=AST/ALT;

*5) 거듭제곱 (승);
SBP_SQ=SBP**2;

*6) 로그 (log);
LOG_ALT=LOG(ALT);
LOG10_ALT=LOG10(ALT);
LOG7_ALT=LOG(ALT)/LOG(7);

*7) 지수;
EXP_ALT=EXP(ALT);
EXP10_ALT=EXP(ALT*log(10));

RUN;

 

SAS 변수 계산 (산술 연산) 정복 완료!

작성일: 2022.10.06.

최종 수정일: 2022.11.03.

이용 프로그램: SAS v9.4

운영체제: Windows 10

반응형
반응형

[SAS] 등분산성 검정 (Homogeneity of variance) - PROC GLM

 T-test, ANOVA 등 몇몇 분석에서는 분포들의 분산이 같다는 가정 (등분산성)이 필요하다. 이럴 때에는 등분산성 검정을 해야 하는데, 많이들 사용하는 방법은 크게 다섯 가지가 존재한다.

 

1) Fooled F

2) Levene

3) O'Brien

4) Brown and Forsythe

5) Bartlett

 

이 중 첫 번째 방법인 Fooled F 검정은 PROC TTEST에서 확인할 수 있다. 그리고 Levene의 등분산성 검정은 T-test에 관한 글에서 다루었으므로 본 포스팅에서는 다루지 않겠다. Fooled F와 Levene 등분산성 검정에 관한 내용은 다음 링크에서 확인할 수 있다. 2022.10.04 - [모평균 검정/SAS] - [SAS] 독립 표본 T검정 (Independent samples T-test) - PROC TTEST

 

 결국 우리가 확인하고자 하는 것은, "수축기 혈압 분포의 분산이 고혈압 환자군과 일반인 사이에서 다르다고 할 수 있는가?"이다. 이에 대해 설면하도록 하겠다.

 

*실습용 데이터는 아래 링크를 클릭하면 다운로드할 수 있습니다.

2022.08.04 - [공지사항 및 소개] - 분석용 데이터 (update 22.08.29)

 

분석용 데이터 (update 22.08.29)

2022년 08월 29일 버전입니다. 변수는 계속하여 추가될 예정입니다. 다음 카테고리에 있는 글에서 이용된 데이터입니다. - 기술 통계 - 통계 프로그램 사용 방법 1) 엑셀 파일 2) CSV 파일 3) 코드북

medistat.tistory.com

 

시작하기 위해 라이브러리를 만들고, 파일을 불러온다.

라이브러리 만드는 방법: 2022.08.05 - [통계 프로그램 사용 방법/SAS] - [SAS] 라이브러리 만들기 - LIBNAME

파일 불러오는 방법: 2022.08.05 - [통계 프로그램 사용 방법/SAS] - [SAS] 데이터 불러오기 및 저장하기 - PROC IMPORT, PROC EXPORT

 

*라이브러리 지정하기;
LIBNAME hong "C:/Users/User/Documents/Tistory_blog";

*파일 불러오기;
PROC IMPORT
DATAFILE="C:\Users\user\Documents\Tistory_blog\Data.xlsx"
DBMS=EXCEL
OUT=hong.df
REPLACE;
RUN;

 

 

코드 - 등분산성 검정

등분산성을 검정하는 코드는 다음과 같다.

*O'Brien;
PROC GLM DATA=hong.df;
   CLASS HTN;
   MODEL SBP = HTN;
   MEANS HTN / HOVTEST=OBRIEN(W=0.5);
RUN;
QUIT;

*Brown and Forsythe;
PROC GLM DATA=hong.df;
   CLASS HTN;
   MODEL SBP = HTN;
   MEANS HTN / HOVTEST=BF;
RUN;
QUIT;

*Bartlett;
PROC GLM DATA=hong.df;
   CLASS HTN;
   MODEL SBP = HTN;
   MEANS HTN / HOVTEST=BARTLETT;
RUN;
QUIT;

PROC GLM DATA=hong.df; : 등분산 검정은 PROC GLM이라는 명령문으로 할 수 있다. PROC GLM을 시행하고, 데이터는 hong 라이브러리에 있는 df를 이용한다.
   CLASS HTN; : 고혈압 여부(HTN)에 따라 분산이 같은지 검정할 것이다.
   MODEL SBP = HTN; : 고혈압 여부(HTN)에 따라 수축기 혈압(SBP)의 분산이 같은지 검정할 것이다.
   MEANS HTN / HOVTEST=OBRIEN(W=0.5); : 고혈압의 평균을 구해주어라. 등분산성 검정 (HOmogeneity of Variance TEST)은 O'Brien방법을 사용한다. O'Brien 방법의 parameter는 W가 있는데 원하는 값을 넣어주면 된다. 기본 값은 0.5로 설정되어 있으며, 기본값 그대로 사용하고자 할 때에는 "(W=0.5)"를 통째로 쓰지 않아도 괜찮다.
RUN; : 코드를 실행한다.
QUIT; : GLM코드는 QUIT구문을 실행하거나, 다른 코드를 실행해야만 끝나므로 QUIT을 실행한다.

 

Brown and Forsythe, Bartlett 방법은 각각 "OBRIEN"을 "BF", "BARTLETT"으로 바꾸어 구한 것이다.

 

결과

1) O'Brien 검정 결과

 

2) Brown and Forsythe 검정 결과

 

3) Bartlett 검정 결과

 

약간의 차이들은 있지만 모두 p-value가 0.05 이상으로 귀무가설을 기각하지 못해 모분산이 서로 같다고 결론 내릴 수 있다. 

 

코드 정리

*라이브러리 지정하기;
LIBNAME hong "C:/Users/User/Documents/Tistory_blog";

*데이터 불러오기;
PROC IMPORT
DATAFILE="C:\Users\user\Documents\Tistory_blog\Data.xlsx"
DBMS=EXCEL
OUT=hong.df
REPLACE;
RUN;

*O'Brien;
PROC GLM DATA=hong.df;
   CLASS HTN;
   MODEL SBP = HTN;
   MEANS HTN / HOVTEST=OBRIEN(W=0.5);
RUN;
QUIT;

*Brown and Forsythe;
PROC GLM DATA=hong.df;
   CLASS HTN;
   MODEL SBP = HTN;
   MEANS HTN / HOVTEST=BF;
RUN;
QUIT;

*Bartlett;
PROC GLM DATA=hong.df;
   CLASS HTN;
   MODEL SBP = HTN;
   MEANS HTN / HOVTEST=BARTLETT;
RUN;
QUIT;

 

SAS 등분산성 검정 (Homogeneity of variance) 정복 완료!

작성일: 2022.10.05.

최종 수정일: 2022.10.05.

이용 프로그램: SAS v9.4

운영체제: Windows 10

반응형
반응형

[SAS] 독립 표본 T검정 (Independent samples T-test) - PROC TTEST

 

  세상에 존재하는 모든 사람을 대상으로 연구를 하면 참 좋겠지만, 시간적인 이유로, 그리고 경제적인 이유로 일부를 뽑아서 연구를 진행할 수밖에 없다. 모든 사람을 모집단이라고 하고, 뽑힌 일부를 표본이라고 한다. 우리는 표본으로 시행한 연구로 모집단에 대한 결론을 도출해내고자 할 것이다. 

 1000명에게 피검사를 시행하였고, 간 기능 검사의 일환으로 ALT 수치를 모았다. 이 데이터를 기반으로 1000명이 기원한 모집단 인구에서의 ALT평균이 어떻게 될지 예측하는 것이 T-test이다. T-test는 크게 세 가지로 나눌 수 있다.

 

 1) 일표본 T검정 (One sample T-test) : 2022.09.30 - [모평균 검정/SAS] - [SAS] 일표본 T검정 (One-sample T-test) - PROC TTEST

 : 모집단의 평균이 특정 값이라고 할 수 있는가?

 예) 모집단의 ALT 평균이 50이라고 할 수 있는가?

 

 

 2) 독립 표본 T검정 (Independent samples T-test, Two samples T-test)

 : 두 모집단의 평균이 다르다고 할 수 있는가?

 예) 고혈압 환자와 일반인의 수축기 혈압 평균이 서로 다르다고 할 수 있는가?

 

 3) 대응표본 T검정 (Paired samples T-test) : 2022.10.07 - [반복 측정 자료 분석/SAS] - [SAS] 대응 표본 T검정 (Paired samples T-test) - PROC TTEST

 : 모집단의 짝지어진 변수들의 평균이 다르다고 할 수 있는가?

예) 간기능 개선제 복용 전 ALT 평균은 간기는 개선제 복용 후 ALT 평균과 다르다고 할 수 있는가?

 

이번 포스팅에서는 독립 표본 T검정 (Independent samples T-test, Two samples T-test)에 대해 알아볼 것이다.

 

*실습용 데이터는 아래 링크를 클릭하면 다운로드할 수 있습니다.

2022.08.04 - [공지사항 및 소개] - 분석용 데이터 (update 22.08.29)

 

분석용 데이터 (update 22.08.29)

2022년 08월 29일 버전입니다. 변수는 계속하여 추가될 예정입니다. 다음 카테고리에 있는 글에서 이용된 데이터입니다. - 기술 통계 - 통계 프로그램 사용 방법 1) 엑셀 파일 2) CSV 파일 3) 코드북

medistat.tistory.com

 

시작하기 위해 라이브러리를 만들고, 파일을 불러온다.

라이브러리 만드는 방법: 2022.08.05 - [통계 프로그램 사용 방법/SAS] - [SAS] 라이브러리 만들기 - LIBNAME

파일 불러오는 방법: 2022.08.05 - [통계 프로그램 사용 방법/SAS] - [SAS] 데이터 불러오기 및 저장하기 - PROC IMPORT, PROC EXPORT

 

*라이브러리 지정하기;
LIBNAME hong "C:/Users/User/Documents/Tistory_blog";

*파일 불러오기;
PROC IMPORT
DATAFILE="C:\Users\user\Documents\Tistory_blog\Data.xlsx"
DBMS=EXCEL
OUT=hong.df
REPLACE;
RUN;

 

목표: 고혈압 환자의 수축기 혈압(SBP) 평균은 정상인의 수축기혈압 평균과 다르다고 모집단 수준에서 말할 수 있는가?

 이번 포스팅의 목적은 1000명의 데이터를 가지고, 이 1000명이 기원한 모집단에서 수축기 혈압 평균이 고혈압 유병 여부에 따라 다르다고 할 수 있는지 판단하는 것이다.

 

전제조건 (정규성) - 코드

 독립표본독립 표본 (Indepent samples, Two tamples) T 검정의 전제조건은 각각의 독립 표본의 분포가 정규성을 따른다는 것이다. 즉, 여기에서는 고혈압 유병 여부에 따라 수축기 혈압 (SBP)의 정규성을 검정하도록 하겠다.

 - 정규성 검정에 관한 분석 내용은 다음 글에서 살펴볼 수 있다. 2022.08.12 - [기술 통계/SAS] - [SAS] 정규성 검정 - PROC UNIVARIATE

 - PROC UNIVARIATE명령문에서 "CLASS"옵션을 사용하는 방법은 다음 글에서 살펴볼 수 있다. 2022.09.23 - [기술 통계/SAS] - [SAS] 기술 통계 (평균, 표준편차, 표준오차, 최댓값, 최솟값, 중위수, 분위수 등) - PROC UNIVARIATE, PROC MEANS

 

PROC UNIVARIATE DATA=hong.df NORMAL PLOT;
CLASS HTN;
VAR SBP;
HISTOGRAM SBP/ NORMAL (MU=EST SIGMA=EST);
RUN;

PROC UNIVARIATE : 변수에 대해 알아보는 코드를 작성하겠다.

DATA=hong.df : 데이터는 hong이라는 라이브러리 내에 있는 df를 사용하겠다.

NORMAL : 정규성 검정을 시행해라.

PLOT : 히스토그램과 QQ plot을 그려라

CLASS HTN
VAR SBP : 분석할 변수는 SBP다
HISTOGRAM SBP : SBP의 히스토그램도 그려라

/ NORMAL (MU=EST SIGMA=EST) : 히스토그램에 정규분포 곡선도 덧붙여 그리는데, 정규분포 곡선의 평균은 SBP 데이터로부터 계산한 평균이고, 표준편차도 SBP 데이터의 표준편차다.

 

정규성 검정 - 결과

1) HTN=0 (고혈압을 앓지 않는 정상인 군)

N수가 2,000개 미만이므로 Shapiro-Wilk 통계량의 p-value를 보면 0.05 이상이며, Q-Q Plot은 대부분의 데이터가 선상에 있고, 히스토그램에서도 정규성을 따르는 것처럼 볼 수 있다. 

 

1) HTN=1 (고혈압을 앓는 환자군)

N수가 2,000개 미만이므로 Shapiro-Wilk 통계량의 p-value를 보면 0.05 이상이며, Q-Q Plot은 대부분의 데이터가 선상에 있고, 히스토그램에서도 정규성을 따르는 것처럼 볼 수 있다. 

 

 

전제조건이 성립한다. 즉, 고혈압 유병 여부에 따른 수축기 혈압 (SBP)의 분포가 정규성을 따른다고 할 수 있다. 따라서 독립 표본 T 검정 (Independent samples T test, Two samples T test)을 시행할 수 있다.

 

T-Test 코드

PROC TTEST DATA=hong.df;
CLASS HTN;
VAR SBP;
RUN;

PROC TTEST DATA=hong.df; : T-test를 시행하겠다. 데이터는 hong 라이브러리의 df데이터를 이용한다.
CLASS HTN; : 고혈압 여부에 따라 평균의 차이를 검정하겠다.
VAR SBP; : 검정하고자 하는변수는 수축기 혈압 (SBP)이다.

 

결과

독립 표본 T 검정(Independent samples T-test, Two samples T-test)의 검정 결과는 두 단계에 걸쳐 확인해야 한다.

 1) 등분산성 검정

 등분산성 (Equality of Variances)을 확인해야 한다. 즉 두 분포의 분산이 같다고 할 수 있는지 확인해야 한다. 빨간색 박스의 p-value는 0.9994이다. 그러면 귀무가설을 기각할 수 없다. 그러면 귀무가설은 무엇이었는가?

 귀무가설:  $H_0=$ 두 집단의 모분산은 동일하다.

 대립가설:  $H_1=$ 두 집단의 모분산은 동일하지 않다.

 

귀무가설을 기각할 수 없으므로 모분산은 같다고 생각하기로 한다.

 

2) 평균 차이 검정

PROC TTEST는 평균 차이 검정 결과를 두 가지 제공한다. 분산이 같다고 할 수 있을 때 사용하는 Pooled method, 분산이 다르다고 할 수 있을 때 사용하는 Satterthwaite method이다. 위에서 모분산이 같다고 생각하기로 했으므로 Poold method의 p-value를 보면 <0.0001으로 귀무가설을 기각할 수 있다. 그러면 귀무가설은 무엇이었는가?

 귀무가설:  $H_0=$ 두 집단의 평균 SBP는 동일하다.

 대립가설:  $H_1=$ 두 집단의 평균 SBP는 동일하지 않다.

 

고혈압이 있는 군의 평균 SBP는 150.1, 고혈압이 없는 군의 평균 SBP는 120.1이었으므로 고혈압이 있는 환자의 수축기 혈압이 정상군에 비해 유의미하게 높다고 결론지을 수 있다.

 

 

SAS와 SPSS의 차이

그런데, SPSS의 T-test 결과와 비교해보면 약간 서로 다른 것을 알 수 있다.

SPSS에서의 T-test는 다음 링크에서 확인할 수 있다.

2022.11.30 - [모평균 검정/SPSS] - [SPSS] 독립 표본 T검정 (Independent samples T-test)

 

바로, 등분산성 검정 결과가 다르다. SAS에서는 "Fooled F"를 사용하고, SPSS에서는 "Levene의 등분산 검정"을 사용하기 때문이다. 다행히도 SPSS에서도, SAS에서도 모분산이 동일하다는 결론이 났지만, 간혹 서로 다른 결론을 내리기도 한다. 따라서 어떤 등분산성 검정 방법을 사용했는지 알고 있어야 한다. 

 

당연히, SAS에서도 SPSS처럼 Levene의 등분산 검정을 시행할 수 있는데 코드는 다음과 같다.

코드 - Levene의 등분산 검정

PROC GLM DATA=hong.df;
   CLASS HTN;
   MODEL SBP = HTN;
   MEANS HTN / HOVTEST=LEVENE(TYPE=ABS);
RUN;
QUIT;

PROC GLM DATA=hong.df; : Levene의 등분산 검정은 PROC GLM이라는 명령문으로 할 수 있다. PROC GLM을 시행하고, 데이터는 hong 라이브러리에 있는 df를 이용한다.
   CLASS HTN; : 고혈압 여부(HTN)에 따라 분산이 같은지 검정할 것이다.
   MODEL SBP = HTN; : 고혈압 여부(HTN)에 따라 수축기 혈압(SBP)의 분산이 같은지 검정할 것이다.
   MEANS HTN / HOVTEST=LEVENE(TYPE=ABS); : 고혈압의 평균을 구해주어라. 등분산성 검정 (HOmogeneity of Variance TEST)은 Levene방법을 사용 한다. Levene의 등분산 검정은 제곱한 값을 사용하는 SQUARE, 차이를 사용하는 ABS가 있는데 차이를 사용한다.
RUN; : 코드를 실행한다.
QUIT; : GLM코드는 QUIT구문을 실행하거나, 다른 코드를 실행해야만 끝나므로 QUIT을 실행한다.

 

이 방법 이외의 등분산성 검정 방법 (O'Brien, Brwon and Forsythe, Bartlett)에 대한 내용은 다음 링크에서 확인할 수 있다. 

2022.10.05 - [모평균 검정/SAS] - [SAS] 등분산성 검정 (Homogeneity of variance) - PROC GLM

 

결과

p-value는 0.9189로 SPSS와 같음을 알 수 있고, 0.05보다 크므로 귀무가설을 기각하지 못해 모분산이 같다고 결론 내릴 수 있다. 

 

 

코드 정리

*라이브러리 지정하기;
LIBNAME hong "C:/Users/User/Documents/Tistory_blog";

*데이터 불러오기;
PROC IMPORT
DATAFILE="C:\Users\user\Documents\Tistory_blog\Data.xlsx"
DBMS=EXCEL
OUT=hong.df
REPLACE;
RUN;

*고혈압 여부에 따라 정규성 검정하기;
PROC UNIVARIATE DATA=hong.df NORMAL PLOT;
CLASS HTN;
VAR SBP;
HISTOGRAM SBP/ NORMAL (MU=EST SIGMA=EST);
RUN;

*T-test실행하기;
PROC TTEST DATA=hong.df;
CLASS HTN;
VAR SBP;
RUN;

*Levene의 등분산성 검정하기;
PROC GLM DATA=hong.df;
   CLASS HTN;
   MODEL SBP = HTN;
   MEANS HTN / HOVTEST=LEVENE(TYPE=ABS);
RUN;
QUIT;

 

SAS 독립 표본 T검정 (Dependent samples T-test, Two samples T-test) 정복 완료!

작성일: 2022.09.30.

최종 수정일: 2022.11.30.

이용 프로그램: SAS v9.4

운영체제: Windows 10

반응형
반응형

[SAS] 일표본 T검정 (One-sample T-test) - PROC TTEST

  세상에 존재하는 모든 사람을 대상으로 연구를 하면 참 좋겠지만, 시간적인 이유로, 그리고 경제적인 이유로 일부를 뽑아서 연구를 진행할 수밖에 없다. 모든 사람을 모집단이라고 하고, 뽑힌 일부를 표본이라고 한다. 우리는 표본으로 시행한 연구로 모집단에 대한 결론을 도출해내고자 할 것이다. 

 1000명에게 피검사를 시행하였고, 간 기능 검사의 일환으로 ALT 수치를 모았다. 이 데이터를 기반으로 1000명이 기원한 모집단 인구에서의 ALT평균이 어떻게 될지 예측하는 것이 T-test이다. T-test는 크게 세 가지로 나눌 수 있다.

 

 1) 일표본 T검정 (One sample T-test)

 : 모집단의 평균이 특정 값이라고 할 수 있는가?

 예) 모집단의 ALT 평균이 50이라고 할 수 있는가?

 

 2) 독립 표본 T검정 (Independent samples T-test): 2022.10.04 - [모평균 검정/SAS] - [SAS] 독립 표본 T검정 (Independent samples T-test) - PROC TTEST

 : 두 모집단의 평균이 다르다고 할 수 있는가?

 예) 고혈압 환자와 일반인의 수축기 혈압 평균이 서로 다르다고 할 수 있는가?

 

 3) 대응표본 T검정 (Paired samples T-test):2022.10.07 - [반복 측정 자료 분석/SAS] - [SAS] 대응 표본 T검정 (Paired samples T-test) - PROC TTEST

 : 모집단의 짝지어진 변수들의 평균이 다르다고 할 수 있는가?

예) 간기능 개선제 복용 전 ALT 평균은 간기는 개선제 복용 후 ALT 평균과 다르다고 할 수 있는가?

 

이번 포스팅에서는 일표본 T검정 (One sample T-test)에 대해 알아볼 것이다.

 

*실습용 데이터는 아래 링크를 클릭하면 다운로드할 수 있습니다.

 

2022.08.04 - [공지사항 및 소개] - 분석용 데이터 (update 22.08.29)

 

분석용 데이터 (update 22.08.29)

2022년 08월 29일 버전입니다. 변수는 계속하여 추가될 예정입니다. 다음 카테고리에 있는 글에서 이용된 데이터입니다. - 기술 통계 - 통계 프로그램 사용 방법 1) 엑셀 파일 2) CSV 파일 3) 코드북

medistat.tistory.com

 

시작하기 위해 라이브러리를 만들고, 파일을 불러온다.

라이브러리 만드는 방법: 2022.08.05 - [통계 프로그램 사용 방법/SAS] - [SAS] 라이브러리 만들기 - LIBNAME

파일 불러오는 방법: 2022.08.05 - [통계 프로그램 사용 방법/SAS] - [SAS] 데이터 불러오기 및 저장하기 - PROC IMPORT, PROC EXPORT

*라이브러리 지정하기;
LIBNAME hong "C:/Users/User/Documents/Tistory_blog";

*파일 불러오기;
PROC IMPORT
DATAFILE="C:\Users\user\Documents\Tistory_blog\Data.xlsx"
DBMS=EXCEL
OUT=hong.df
REPLACE;
RUN;

 

목표: 모집단의 ALT 평균이 50이라고 할 수 있는가?

 이번 포스팅의 목적은 1000명의 데이터를 가지고, 이 1000명이 기원한 모집단의 ALT평균이 50이라고 할 수 있는지 판단하는 것이다.

 

전제조건 (정규성) - 코드

일표본 (One sample) T 검정의 전제조건은 해당 분포가 정규성을 따른다는 것이다. 정규성 검정을 하도록 하겠다. 정규성 검정에 관한 분석 내용은 다음 글에서 살펴볼 수 있다. 2022.08.12 - [기술 통계/SAS] - [SAS] 정규성 검정 - PROC UNIVARIATE

PROC UNIVARIATE DATA=hong.df NORMAL PLOT;
VAR ALT;
HISTOGRAM ALT/ NORMAL (MU=EST SIGMA=EST);
RUN;

 

정규성 검정 - 결과

 

 

 

 N수가 2,000개 미만이므로 Shapiro-Wilk 통계량의 p-value를 보면 0.05 이상이며, Q-Q Plot은 대부분의 데이터가 선상에 있고, 히스토그램에서도 정규성을 따르는 것처럼 볼 수 있다. 따라서 ALT로는 일표본 T검정 (One-sample T-test)를 시행할 수 있다. 

 

 

일표본 T검정 (One sample T test)의 귀무가설과 대립 가설

 

이번 일표본 T검정 (One sample T test)의 귀무가설은 하나다.

귀무가설: $H_0=$ 모집단의 ALT 평균은 50이다.

 

하지만 대립 가설은 3개가 된다.

1) $H_1=$ 모집단의 평균은 50보다 크다. (단측 검정)

2) $H_1=$ 모집단의 평균은 50보다 작다. (단측 검정)

3) $H_1=$ 모집단의 평균은 50보다 크거나 작다. (양측 검정)

 

대립 가설 별로 코드를 보고자 한다.

 

1) $H_1=$ 모집단의 평균은 50보다 크다. (단측 검정)

PROC TTEST DATA=hong.df SIDES=U H0=50;
VAR ALT;
RUN;

PROC TTEST DATA=hong.df SIDES=U H0=50; : T-TEST를 실행할 것이다. 데이터는 hong 라이브러리에 있는 df를 사용할 것이고, 대립 가설은 큰 쪽이며, 검정하고자 하는 모집단의 평균은 50이다.
VAR ALT; : 검정하고자 하는 변수는 ALT다.

 

결과

 

 

P-value는 1.0000이다. 즉, 대립 가설을 선택하는 것이 말이 안 된다는 것이다. 평균이 50보다 크다고 보는 것보다는 50이라고 보는 것이 더 합리적이라는 뜻이다. 실제로 평균은 35.1159라고 적혀있으므로 합당한 통계분석임을 알 수 있다.

 

 

2) $H_1=$ 모집단의 평균은 50보다 작다. (단측 검정)

PROC TTEST DATA=hong.df SIDES=L H0=50;
VAR ALT;
RUN;

PROC TTEST DATA=hong.df SIDES=L H0=50; : T-TEST를 실행할 것이다. 데이터는 hong 라이브러리에 있는 df를 사용할 것이고, 대립 가설은 작은 쪽이며, 검정하고자 하는 모집단의 평균은 50이다.
VAR ALT; : 검정하고자 하는 변수는 ALT다.

 

결과

 

P-value는 <0.0001이다. 즉, 대립 가설을 선택하는 것이 합리적이라는 말이다. 평균이 50이라고 보는 것보다는 50보다 작다고 보는 것이 더 합리적이라는 뜻이다. 실제로 평균은 35.1159라고 적혀있으므로 합당한 통계분석임을 알 수 있다.

 

3) $H_1=$ 모집단의 평균은 50보다 작거나 크다. (양측 검정)

가장 많이 사용하는 양측 검정이다.

PROC TTEST DATA=hong.df SIDES=2 H0=50;
VAR ALT;
RUN;

PROC TTEST DATA=hong.df H0=50;
VAR ALT;
RUN;

위 두 개의 코드는 같은 결과를 내준다. 왜냐하면 양측 검정 (SIDES=2)가 기본 값이어서 SIDES옵션을 지정해주지 않으면 SIDES=2라고 인식하고 코드가 돌아가기 때문이다.

 

PROC TTEST DATA=hong.df SIDES=2 H0=50; : T-TEST를 실행할 것이다. 데이터는 hong 라이브러리에 있는 df를 사용할 것이고, 대립 가설은 양쪽이며, 검정하고자 하는 모집단의 평균은 50이다.
VAR ALT; : 검정하고자 하는 변수는 ALT다.

 

PROC TTEST DATA=hong.df H0=50; : T-TEST를 실행할 것이다. 데이터는 hong 라이브러리에 있는 df를 사용할 것이고, 대립 가설은 양쪽이며, 검정하고자 하는 모집단의 평균은 50이다.
VAR ALT; : 검정하고자 하는 변수는 ALT다.

 

결과

P-value는 <0.0001이다. 즉, 대립 가설을 선택하는 것이 합리적이라는 말이다. 평균이 50이라고 보는 것보다는 50보다 작거나 크다고 보는 것이 더 합리적이라는 뜻이다. 실제로 평균은 35.1159라고 적혀있으므로 합당한 통계분석임을 알 수 있다.

 

 

주로 양측 검정이 이용되나, 사실 일표본 T검정은 거의 시행되지 않고 다음 글로 나올 독립 표본 T검정이 더 많이 사용된다. 

 

코드 정리

*라이브러리 지정하기;
LIBNAME hong "C:/Users/User/Documents/Tistory_blog";

*파일 불러오기;
PROC IMPORT
DATAFILE="C:\Users\user\Documents\Tistory_blog\Data.xlsx"
DBMS=EXCEL
OUT=hong.df
REPLACE;
RUN;

*정규성 검정;
PROC UNIVARIATE DATA=hong.df NORMAL PLOT;
VAR ALT;
HISTOGRAM ALT/ NORMAL (MU=EST SIGMA=EST);
RUN;

*일표본 T검정 - 모집단의 평균은 50보다 크다. (단측검정)
PROC TTEST DATA=hong.df SIDES=U H0=50;
VAR ALT;
RUN;

*일표본 T검정 - 모집단의 평균은 50보다 작다. (단측검정)
PROC TTEST DATA=hong.df SIDES=L H0=50;
VAR ALT;
RUN;

*일표본 T검정 - 모집단의 평균은 50보다 작거나 크다. (양측검정)
PROC TTEST DATA=hong.df SIDES=2 H0=50;
VAR ALT;
RUN;

*일표본 T검정 - 모집단의 평균은 50보다 작거나 크다. (양측검정)
PROC TTEST DATA=hong.df H0=50;
VAR ALT;
RUN;

 

 

SAS 일표본 T검정 (One-sample T-test) 정복 완료!

작성일: 2022.09.30.

최종 수정일: 2022.11.03.

이용 프로그램: SAS v9.4

운영체제: Windows 10

반응형
반응형

[SPSS] 기술 통계 (평균, 표준편차, 표준오차, 최댓값, 최솟값, 중위수, 분위수 등)

 

 1,000명으로 어떤 연구를 했다고 하자. 그들의 키, 몸무게 등 지표들은 서로 다를 것이다. 논문의 저자가 이 모든 것을 독자들에게 보여주고자 한다면 행이 1,000인 표를 제시해야 할 것이다. 그렇게 큰 표를 실어줄 저널이 없기도 하거니와, 독자들이 보기에도 한눈에 들어오지 않는다. 그 대신 키의 '평균', 몸무게의 '평균'을 제시하면 한눈에 들어오니 보기가 좋다. 연속 변수는 평균, 표준편차 등으로 요약을 하여 보여주고, 범주형 자료 (흡연 여부, 음주 여부 등)는 도수분포표 혹은 분할표로 제시하게 된다. 분할표를 작성하는 방법은 다음 링크에서 확인할 수 있다.

2022.09.06 - [기술 통계/SPSS] - [SPSS] 도수분포표 (Frequency table), 분할표 (Contingency table) 만들기

 

어떤 지표로 요약해줄 것인가?

1) 정규성을 따를 때: 평균 및 표준편차

 어떤 변수가 정규 분포를 따른다고 할 수 있다면, 평균과 표준편차만 알면 된다. 단 두 개의 지표만 있으면 전체 분포를 알아낼 수 있기 때문이다. (정규성을 따르는지는 정규성 검정으로 확인할 수 있으며 정규성 검정을 하는 방법은 다음 링크에서 확인할 수 있다.)

2022.08.11 - [기술 통계/SPSS] - [SPSS] 정규성 검정

 

2) 정규성을 따르지 않을 때: 중위수, 최댓값, 최솟값, 분위수, 사분위 범위 등

 정규성을 따르지 않는다면 평균과 표준편차를 안다고 해도 전체 분포를 알아낼 수는 없다. 따라서 분포에 대한 직접적인 정보를 주는데, 예를 들어 '하위 25%에 위치하는 사람의 ALT값은 얼마인가?' 등을 제시하는 것이다. 그런 지표로는 중위수, 최댓값, 최솟값, 분 위수, 사분위 범위 등이 있다.

 

이번 포스팅에서는 이 모든 지표들 (평균, 표준편차, 표준오차, 중위수, 최댓값, 최솟값, 분위수, 사분위 범위 등)을 구하는 법에 대해 소개할 것이다.

 

*실습용 데이터는 아래 링크를 클릭하면 다운로드할 수 있습니다.

2022.08.04 - [공지사항 및 소개] - 분석용 데이터 (update 22.08.29)

 

분석용 데이터 (update 22.08.29)

2022년 08월 29일 버전입니다. 변수는 계속하여 추가될 예정입니다. 다음 카테고리에 있는 글에서 이용된 데이터입니다. - 기술 통계 - 통계 프로그램 사용 방법 1) 엑셀 파일 2) CSV 파일 3) 코드북

medistat.tistory.com

 

먼저 데이터를 불러온다. 데이터를 불러오는 방법은 다음 글을 확인하길 바란다.

2022.08.04 - [통계 프로그램 사용 방법/SPSS] - [SPSS] 데이터 불러오기 및 저장하기

 

SPSS에서는 기술 통계량을 구하는 곳이 세 군데로 나누어져 있다. 일부 기술 통계량은 중복되어 있어서 여러 곳에서 구할 수도 있다. 

 

분석(A)>기술통계량(E)>

 1) 빈도분석(F)

 2) 기술통계(D)

 3) 데이터 탐색(E)

 

각 기술 통계량을 구할 수 있는 곳을 정리해놓은 표는 다음과 같다.

 

  빈도분석 기술통계 데이터 탐색
대상자 수 O O O
결측치 수 O X O
평균 O O O
표준편차 O O O
분산 O O O
표준오차 O O O
최솟값 O O O
최댓값 O O O
중위수 O X O
최빈값 O X X
평균의 신뢰구간 X X O
사분위수 O X O
사분위범위 X X O
백분위수 O X △ (숫자 지정불가)

 

각 방법에 따라 하나씩 살펴보도록 한다.

빈도분석

1) 분석(A)>기술통계량(E)>빈도분석(F)

 

2) 분석하고자 하는 변수 (ALT)를 오른쪽으로 옮기고 "통계량(S)"를 누른다.

 

3) 원하는 통계량 박스를 체크한다. 백분위수를 구하고자 한다면 원하는 백분위 숫자를 입력한 뒤 "추가(A)"를 누른다. 그다음 "계속(C)"를 누른다.

 

4) 연속 변수를 분석하는 경우 "빈도표 표시(D)"박스는 반드시 해제하고, "확인" 버튼을 누른다.

 

결과

 

나와있는 값은 위에서부터 순서대로 다음과 같다.

대상자수

결측치

평균

표준오차

중위수

최빈값

표준편차

분산

최솟값

최댓값

1사분위수

46백분위수

2사분위수(=중위수)

3사분위수

 

하지만 최빈값의 경우 유의해야 한다. 최빈값이 여러 개일 경우 아래 footnote와 같이 "a. 여러 최빈값이 있습니다. 가장 작은 값이 나타납니다."라고 나온다. 즉 지금 표기된 최빈값은 최빈값이 아니므로 신뢰해서는 안 된다는 이야기다.

최빈값이 여러 개라는 것은 다음과 같은 상황을 의미한다.

5개의 숫자 (1, 2, 3, 4, 5)가 있다면 모두 1개씩 있으므로 어떠한 것도 최빈값이라고 할 수 없다.

5개의 숫자 (1, 2, 2, 3, 3)가 있다면 2와 3 둘 다 2개씩 있으므로 2와 3 둘 다 최빈값은 아니다. 즉 최빈값이 없다.

 

사분위수는 SAS, SPSS, R의 결과가 서로 다를 수 있다. 왜냐하면 각 프로그램에서 사분위수를 구하는 방법이 다를 수 있기 때문이다. 각 프로그램에는 사분위수를 구하는 여러가지 방법이 내장되어 있으며, 골라서 사용할 수도 있다.

SAS의 사분위수 확인하기: 2022.09.23 - [기술 통계/SAS] - [SAS] 기술 통계 (평균, 표준편차, 표준오차, 최댓값, 최솟값, 중위수, 분위수 등) - PROC UNIVARIATE, PROC MEANS

R의 사분위수 확인하기: 2022.09.27 - [기술 통계/R] - [R] 기술 통계 (평균, 표준편차, 표준오차, 최댓값, 최솟값, 중위수, 분위수 등)

 

기술통계

1) 분석(A)>기술통계량(E)>기술통계(D)

 

2) 분석하고자 하는 변수 (ALT)를 오른쪽으로 옮기고 "옵션(O)"를 누른다.

 

3) 원하는 통계량 박스를 체크하고 "계속(C)"를 누른다.

4) "확인" 버튼을 누른다.

 

결과

왼쪽에서부터 나오는 통계량을 차례대로 적으면 다음과 같다.

대상자 수

최솟값

최댓값

평균

표준오차

표준편차

분산

 

 

데이터 탐색

1) 분석(A)>기술통계량(E)>데이터 탐색(E)

 

2) 분석하고자 하는 변수 (ALT)를 오른쪽으로 옮기고 "통계량(S)"를 누른다.

 

3) "백분위수(P)" 박스를 체크하고 "계속(C)"을 누른다. 신뢰구간 %를 바꾸고 싶다면 원하는 숫자를 적으면 된다.

 

4) "확인"을 누른다

 

결과

 

조건에 따른 기술 통계량 산출하기

만약 음주 여부에 따른 ALT의 기술 통계량을 산출하고자 한다면 "데이터 탐색"의 "요인"을 사용해야 한다. 요인에 "ALCOHOL"을 넣어주면 된다.

 

결과

결과가 ALCOHOL 값에 따라 따로따로 산출되는 것을 알 수 있다.

 

 

 

만약 데이터 탐색에서 제공하지 않는 "최빈값"이나 "백분위수"를 음주 여부에 따라 구하고자 한다면 어떻게 해야 할까? SPSS의 "케이스 선택" 기능을 사용하여 ALCOHOL=0 혹은 ALCOHOL=1인 사람만 추려내어 빈도 분석을 시행하면 된다.

케이스 선택을 하는 방법은 다음 글에서 확인할 수 있다.

2022.09.29 - [통계 프로그램 사용 방법/SPSS] - [SPSS] 조건에 맞는 데이터만 선택하기

 

SPSS 기술통계 정복 완료!

 

작성일: 2022.09.29.

최종 수정일: 2022.09.29.

이용 프로그램: IBM SPSS v26

운영체제: Windows 10

반응형
반응형

 

[SPSS] 조건에 맞는 데이터만 선택하기

 

 연구를 하다 보면 특정 조건에 맞는 사람들(데이터, 케이스)만을 대상으로 분석하고 싶어질 때가 있다. 즉 하위그룹(subgroup)을 만들어 분석을 하거나, 층화(stratification) 분석을 하고 싶을 때가 있다. 예를 들어, 남성만을 대상으로 하거나, 음주자만을 대상으로 하는 경우가 그렇다. 이렇듯 조건에 맞는 행, 데이터만 추출하는 법에 대해 알아보고자 한다.

 

*실습용 데이터는 아래 링크를 클릭하면 다운로드할 수 있습니다.

2022.08.04 - [공지사항 및 소개] - 분석용 데이터 (update 22.08.29)

 

분석용 데이터 (update 22.08.29)

2022년 08월 29일 버전입니다. 변수는 계속하여 추가될 예정입니다. 다음 카테고리에 있는 글에서 이용된 데이터입니다. - 기술 통계 - 통계 프로그램 사용 방법 1) 엑셀 파일 2) CSV 파일 3) 코드북

medistat.tistory.com

 

먼저 데이터를 불러온다. 데이터를 불러오는 방법은 다음 글을 확인하길 바란다.

2022.08.04 - [통계 프로그램 사용 방법/SPSS] - [SPSS] 데이터 불러오기 및 저장하기

 

 

하는 방법

1) 데이터(D)> 케이스 선택(S)

 

2) 조건을 만족하는 케이스(C)를 누르고 "조건(I)"버튼을 누른다.

 

3) 조건을 입력하면 된다. 여기에서는 음주자만 추출해보고자 한다. 음주자는 ALCOHOL 변수가 1로 코딩되어 있으므로 ALCOHOL=1이라고 적는다. "계속(C)"를 누른다.

 

4) "확인" 버튼을 누른다.

 

결과

위에서 볼 수 있듯이 ALCOHOL=0인 사람들은 사선 처리되어있는 것을 알 수 있다. 이 상태에서 다른 분석 (평균, 빈도, 회귀분석 등)을 시행하면 사선 처리가 되어있는 비음주자는 분석에 이용되지 않는다.

 

다중 조건 (AND)

조건이 하나가 아닌 여러 개를 걸고 싶을 때가 있다. 예를 들어 음주자 (ALCOHOL=1)이면서 현재 흡연자 (SMOK=2)인 데이터(행)만 추출하고 싶을 때다. 이럴 때에는 "&"연산자를 사용하여 다음과 같이 적으면 된다.

"ALCOHOL=1  &  SMOK=1"

 

결과

음주자가 아니거나 (ALCOHOL=0) 과거 흡연자(SMOK=1), 비흡연자(SMOK=0)인 경우 모두 사선 처리가 되어있는 것을 확인할 수 있다.

 

다중 조건 (OR)

만약 비흡연자를 제외하고 과거 흡연자(SMOK=1)이거나 현재 흡연자(SMOK=2)인 사람만 선택하고 싶다면 어떻게 해야 할까? 위와 같이 &를 사용할 수는 없다. 왜냐하면 SMOK=1이면서 SMOK=2일 수는 없기 때문이다. 이럴 때에는 OR에 해당하는 "|" 연산자를 사용해야 한다. 

"|"연산자는 직접 써도 되고, 익숙하지 않은 사람을 위해서 SPSS에서는 빨간 상자 안에 버튼을 만들어 놓았다.

 

결과

SMOK=0인 사람만 사선 처리되어있는 것을 알  수 있다.

 

 

다중 조건 (AND, OR)

만약, 음주자이면서 비흡연자가 아닌 (현재 흡연자 혹은 과거 흡연자)인 사람을 선택하려면 어떻게 해야 할까?

ALCOHOL=1 & (SMOK=1  |  SMOK=2)

AND연산자는 OR에 우선하기 때문에 반드시 괄호 처리를 해주어야 한다. 수학에서 $\times$가 $+$보다 우선하기 때문에 필요한 경우 괄호를 씌우는 것과 동일하다.

결과

비음주자이면서 비흡연자는 모두 사선 처리된 것을 알 수 있다.

 

다시 되돌아가고 싶다면?

케이스 선택에서 "모든 케이스(A)"를 클릭하고 확인을 누르면 된다.

 

결과

모든 사선이 사라진 것을 확인할 수 있다.

 

SPSS 케이스 선택 정복 완료!

작성일: 2022.09.29.

최종 수정일: 2022.09.29.

이용 프로그램: IBM SPSS v26

운영체제: Windows 10

 
반응형
반응형

 

[R] 기술 통계 (평균, 표준편차, 표준오차, 최댓값, 최솟값, 중위수, 분위수 등)

 

 1,000명으로 어떤 연구를 했다고 하자. 그들의 키, 몸무게 등 지표들은 서로 다를 것이다. 논문의 저자가 이 모든 것을 독자들에게 보여주고자 한다면 행이 1,000인 표를 제시해야 할 것이다. 그렇게 큰 표를 실어줄 저널이 없기도 하거니와, 독자들이 보기에도 한눈에 들어오지 않는다. 그 대신 키의 '평균', 몸무게의 '평균'을 제시하면 한눈에 들어오니 보기가 좋다. 연속 변수는 평균, 표준편차 등으로 요약을 하여 보여주고, 범주형 자료 (흡연 여부, 음주 여부 등)는 도수분포표 혹은 분할표로 제시하게 된다. 분할표를 작성하는 방법은 다음 링크에서 확인할 수 있다.

2022.08.31 - [기술 통계/R] - [R] 도수분포표 (Frequency table), 분할표 (Contingency table) 만들기 - table(), prop.table(), xtabs(), margin.table()

2022.08.31 - [기술 통계/R] - [R] 도수분포표 (Frequency table), 분할표 (Contingency table) 만들기 - CrossTable()

 

어떤 지표로 요약해줄 것인가?

1) 정규성을 따를 때: 평균 및 표준편차

 어떤 변수가 정규 분포를 따른다고 할 수 있다면, 평균과 표준편차만 알면 된다. 단 두 개의 지표만 있으면 전체 분포를 알아낼 수 있기 때문이다. (정규성을 따르는지는 정규성 검정으로 확인할 수 있으며 정규성 검정을 하는 방법은 다음 링크에서 확인할 수 있다.)

2022.08.11 - [기술 통계/R] - [R] 정규성 검정 (1) : Q-Q plot - qqnorm(), qqline()

2022.08.11 - [기술 통계/R] - [R] 정규성 검정 (2) : 히스토그램 - hist(), dnorm()

2022.08.11 - [기술 통계/R] - [R] 정규성 검정 (3) : 정량적 검정 (Shapiro-Wilk, Kolmogorov-Smirnov) - shapiro.test(), ks.test()

2022.08.12 - [기술 통계/R] - [R] 정규성 검정 (4) : 정량적 검정 (Lilliefors test) - lillie.test()

 

2) 정규성을 따르지 않을 때: 중위수, 최댓값, 최솟값, 분위수, 사분위 범위 등

 정규성을 따르지 않는다면 평균과 표준편차를 안다고 해도 전체 분포를 알아낼 수는 없다. 따라서 분포에 대한 직접적인 정보를 주는데, 예를 들어 '하위 25%에 위치하는 사람의 ALT값은 얼마인가?' 등을 제시하는 것이다. 그런 지표로는 중위수, 최댓값, 최솟값, 분 위수, 사분위 범위 등이 있다.

 

이번 포스팅에서는 이 모든 지표들 (평균, 표준편차, 표준오차, 중위수, 최댓값, 최솟값, 분위수, 사분위 범위 등)을 구하는 법에 대해 소개할 것이다.

 

*실습용 데이터는 아래 링크를 클릭하면 다운로드할 수 있습니다.

2022.08.04 - [공지사항 및 소개] - 분석용 데이터 (update 22.08.29)

 

분석용 데이터 (update 22.08.29)

2022년 08월 29일 버전입니다. 변수는 계속하여 추가될 예정입니다. 다음 카테고리에 있는 글에서 이용된 데이터입니다. - 기술 통계 - 통계 프로그램 사용 방법 1) 엑셀 파일 2) CSV 파일 3) 코드북

medistat.tistory.com

 

 

코드를 보여드리기에 앞서 워킹 디렉토리부터 지정하겠다.

워킹 디렉토리에 관한 설명은 다음 링크된 포스트에서 볼 수 있다.

2022.08.05 - [통계 프로그램 사용 방법/SAS] - [SAS] 라이브러리 만들기 - LIBNAME

setwd("C:/Users/user/Documents/Tistory_blog")

 

데이터를 불러와 df에 객체로 저장하겠다.

데이터 불러오는 방법은 다음 링크에서 볼 수 있다.

2022.08.05 - [통계 프로그램 사용 방법/R] - [R] 데이터 불러오기 : EXCEL - read_excel(), read.xlsx()

2022.08.10 - [통계 프로그램 사용 방법/R] - [R] 데이터 저장하기 : CSV 파일 - write.csv(), write_csv()

2022.08.10 - [통계 프로그램 사용 방법/R] - [R] 데이터 불러오기 : SAS file (.sas7bdat) - read.sas7bdat(), read_sas()

install.packages("readr")
library("readr")
df<-read_csv("Data.csv")

 

코드

이번 포스팅을 일일이 이해하기는 귀찮고 코드만 가져가고 싶은 사람은 다음 코드를 사용하면 된다. :

#기술통계 함수 작성
univariate<-function(x){
  n<-length(x)-sum(is.na(x))
  missing<-sum(is.na(x))
  mean<-mean(x)
  sd<-sd(x)
  var<-var(x)
  se<-sqrt(var/n)
  min<-min(x)
  max<-max(x)
  median<-median(x)
  mode <- function(x) {
    nodup <- unique(x)
    if (length(which(tabulate(match(x, nodup))==max(tabulate(match(x, nodup)))))>=2 )
    {NA}
    else{nodup[which.max(tabulate(match(x, nodup)))]}
  }
  mode<-mode(x)
  lclm<-mean-qt(0.975, n-1)*se
  uclm<-mean+qt(0.975, n-1)*se
  
  P25<-data.frame(quantile(x)[2])[1,1]
  P50<-data.frame(quantile(x)[3])[1,1]
  P75<-data.frame(quantile(x)[4])[1,1]
  qrange<-data.frame(quantile(x)[4])[1,1]-data.frame(quantile(x)[2])[1,1]
  name<-c("N", "N of missing","Mean", "Standard Deviation", "Variation", "Standard Error", "Minimum", 
          "Maximum", "Median", "Mode", "95% Lower limit of mean (two-sided)", "95% Upper limit of mean(two-sided)", "P25", "P50", "P75", "Quantile Range")
  value<-c(n, missing, mean, sd, var, se, min, max, median, mode, lclm, uclm, P25, P50, P75, qrange)
  result<-cbind(name, value)
  print(result)
}

#기술 통계량 계산: "df$ALT"자리에 원하는 변수를 넣으면 된다.
univariate(df$ALT)

 

결과

      name                                  value              
 [1,] "N"                                   "1000"             
 [2,] "N of missing"                        "0"                
 [3,] "Mean"                                "35.11593830339"   
 [4,] "Standard Deviation"                  "5.00643005419849" 
 [5,] "Variation"                           "25.0643418875819" 
 [6,] "Standard Error"                      "0.158317219175875"
 [7,] "Minimum"                             "19.61781834"      
 [8,] "Maximum"                             "49.03881459"      
 [9,] "Median"                              "35.13945912"      
[10,] "Mode"                                NA                 
[11,] "95% Lower limit of mean (two-sided)" "34.8052658601898" 
[12,] "95% Upper limit of mean(two-sided)"  "35.4266107465902" 
[13,] "P25"                                 "31.7559160525"    
[14,] "P50"                                 "35.13945912"      
[15,] "P75"                                 "38.5879822725"    
[16,] "Quantile Range"                      "6.83206622"

"N" : 분석 대상의 수

"N of missing" : 결측치 수

"Mean" : 평균

"Standard Deviation" : 표준 편차

"Variation" : 분산

"Standard Error" : 표준 오차

"Minimum" : 최솟값
"Maximum" : 최댓값

"Median" : 중위수

"Mode" : 최빈값 (최빈값이 여러개인 경우 NA로 표기됨)

"95% Lower limit of mean (two-sided)" : 평균의 95% 신뢰구간의 하한

"95% Upper limit of mean(two-sided)" : 평균의 95% 신뢰구간의 상한

"P25" : 1사분위수

"P50" : 2사분위수 (중위수)

"P75" : 3사분위수

"Quantile Range" : 사분위 범위
 

 

코드 (분석 대상의 수, 결측치 수, 평균, 표준 편차, 분산, 표준 오차)

코드를 하나씩 뜯어 살펴보면 다음과 같다.

univariate<-function(x){
  n<-length(x)-sum(is.na(x))
  missing<-sum(is.na(x))
  mean<-mean(x)
  sd<-sd(x)
  var<-var(x)
  se<-sqrt(var/n)
  }

univariate<-function(x){ :입력되는 값이 x인 함수를 만들건데 함수의 내용은 { }안에 들어있으니 살펴봐라. 그리고 함수의 이름은 univariate이다. 
  n<-length(x)-sum(is.na(x)) : 분석 대상의 수[n]는 전체 개체의 수[length(x)]에서 결측치의 개수 [sum(is.na(x))]를 뺀 값이다.
  missing<-sum(is.na(x)) : 결측된 것을 TRUE로, 결측되지 않은 것을 FALSE로 반환한다 [is.na(x)]. TRUE인 것을 모두 합친다 [sum(is.na(x))]. 그 값이 결측치의 개수이다.
  mean<-mean(x) : 평균은 mean() 함수를 이용한다.
  sd<-sd(x) : 표준편차는 sd() 함수를 이용한다.
  var<-var(x) : 분산은 var() 함수를 이용한다.
  se<-sqrt(var/n) : 표준오차(se)는 분산(var)을 분석 대상의 수(n)로 나눈 뒤 루트를 씌운 값이다.

 

  min<-min(x)
  max<-max(x)
  median<-median(x)
  mode <- function(x) {
    nodup <- unique(x)
    if (length(which(tabulate(match(x, nodup))==max(tabulate(match(x, nodup)))))>=2 )
    {NA}
    else{nodup[which.max(tabulate(match(x, nodup)))]}
  }
  mode<-mode(x)

  min<-min(x) : 최솟값은 min() 함수를 이용한다.
  max<-max(x) : 최댓값은 max() 함수를 이용한다.
  median<-median(x) : 중앙값은 median() 함수를 이용한다.
  mode <- function(x) { : 최빈값은 구하는 함수가 R에 내장되어있지 않으므로 함수를 따로 만들어야 한다. 데이터(x)를 입력받아 최빈값을 구하는 함수를 만들 것이고 그 함수의 이름은 mode이다.
    nodup <- unique(x) : 중복되는 값을 모두 삭제하고 한 개씩만 대표적으로 남긴다. 대표들로 이루어진 벡터를 nodup이라고 하자.
    if (length(which(tabulate(match(x, nodup))==max(tabulate(match(x, nodup)))))>=2 ) 
    {NA}
    else{nodup[which.max(tabulate(match(x, nodup)))]}

여기까지의 내용이 복잡하니 하나씩 코드를 살펴보기로 한다.

(1) 큰 구성은 if (A) {B} else {C} 이다. A라는 조건이 만족하면 B를 반환하고, A를 만족하지 않으면 C를 반환한다는 것이다.

(2) match(x, nodup):  x가 nodup에서 몇 번째 데이터와 일치하는지를 반환하는 함수다.

Example) 예를 들어 x가 (1,5,2,3,3,4,2)라고 하자.

nodup은 중복되는 값을 삭제했을 터이니 (1,5,2,3,4)일 것이다.

그렇다면 match(x,nodup)은 (1,2,3,4,4,5,3)이 된다.

(3) tabulate(match(x,nodup)): tabulate는 각 정수가 나타난 횟수를 세준다. (1,2,3,4,4,5,3)에서 1은 1개, 2는 1개, 3은 2개, 4는 2개, 5는 1개다. 따라서 tabulate(match(x,nodup))은 (1,1,2,2,1)이 된다. 

최빈값은 가장 흔한 단 한 개의 값이어야 하는데, 여기에서 3과 4는 2개, 나머지는 1개이므로 이 데이터의 최빈값은 없다. 즉, tabulate(match(x,nodup))인 (1,1,2,2,1)의 최댓값(2)이 tabulate(match(x,nodup))인 (1,1,2,2,1)에 2개 이상 존재한다면 최빈값이 없다고 반환해야 한다. 

(4) tabulate(match(x, nodup))==max(tabulate(match(x, nodup))): tabulate(match(x,nodup))인 (1,1,2,2,1)이 tabulate(match(x,nodup))인 (1,1,2,2,1)의 최댓값(2)과 같은지를 확인해주는 코드다 결과는 (FALSE, FALSE, TRUE, TRUE, FALSE)이다. 

(5) which(tabulate(match(x, nodup))==max(tabulate(match(x, nodup))))는 TRUE인 위치를 반환하므로 (3,4)를 보여준다. 

(6) length(which(tabulate(match(x, nodup))==max(tabulate(match(x, nodup)))))는 (3,4)에 있는 숫자의 개수, 즉 2를 반환한다. 

이렇게 함으로써 최빈값'같은' 값이 2개 이상 존재할 때 NA를 반환하도록 하였다.

 

그렇지 않을 때 (즉, 단 한 개의 최빈값이 존재할 때)는 다음과 같은 로직에 의해 구해진다고 생각하면 된다.

Example) x가 (1,5,2,2,3)이라고 하자.

nodup은 (1,5,2,3)이 된다.

match(x,nodup)은 (1,2,3,3,4)이 된다.

tabulate(match(x,nodup))는 (1,1,2,1)이 된다. 여기에서 횟수가 가장 많아 '2'라고 표현된 값의 근원을 찾아가야 한다.

which.max(tabulate(match(x, nodup)))는 (1,1,2,1)에서 최댓값이 존재하는 위치를 반환하므로 3이 된다.

(1,1,2,1)의 2는 match(x,nodup)인 (1,2,3,3,4)에서 온 것이다. 1이 1개, 2가 1개, 32개, 4가 1개. 즉, tabulate는 개수를 세어주므로 중복된 값을 빼는 효과가 있다. 즉 23번째에 위치한 이유는 nodup (1,5,2,3)의 2가 nodup에서 3번째에 위치해있기 때문이다. 따라서 nodup의 3번째 값을 반환해야 최빈값을 구할 수 있다. 그러므로 nodup[which.max(tabulate(match(x, nodup)))]이라는 코드를 쓰게 된다.

  }
  mode<-mode(x)

 

  lclm<-mean-qt(0.975, n-1)*se
  uclm<-mean+qt(0.975, n-1)*se
  
  P25<-data.frame(quantile(x)[2])[1,1]
  P50<-data.frame(quantile(x)[3])[1,1]
  P75<-data.frame(quantile(x)[4])[1,1]
  qrange<-data.frame(quantile(x)[4])[1,1]-data.frame(quantile(x)[2])[1,1]
  name<-c("N", "N of missing","Mean", "Standard Deviation", "Variation", "Standard Error", "Minimum", 
          "Maximum", "Median", "Mode", "95% Lower limit of mean (two-sided)", "95% Upper limit of mean(two-sided)", "P25", "P50", "P75", "Quantile Range")
  value<-c(n, missing, mean, sd, var, se, min, max, median, mode, lclm, uclm, P25, P50, P75, qrange)
  result<-cbind(name, value)
  print(result)
}

 

  lclm<-mean-qt(0.975, n-1)*se : t 분포에서 자유도(n-1)에 걸맞게 2.5%에 해당하는 값을 찾고, 표준오차를 곱하여 평균에서 빼면 95% 신뢰구간의 하한이 구해진다. 
  uclm<-mean+qt(0.975, n-1)*se : t 분포에서 자유도(n-1)에 걸맞게 2.5%에 해당하는 값을 찾고, 표준오차를 곱하여 평균에서 더하면 95% 신뢰구간의 상한이 구해진다.
  
  P25<-data.frame(quantile(x)[2])[1,1] : quantile() 함수의 2번째 값은 1사분위수를 의미한다. 데이터프레임으로 바꾸고 값만을 취한다.
  P50<-data.frame(quantile(x)[3])[1,1] : quantile() 함수의 2번째 값은 2사분위수를 의미한다. 데이터프레임으로 바꾸고 값만을 취한다.
  P75<-data.frame(quantile(x)[4])[1,1] : quantile() 함수의 2번째 값은 3사분위수를 의미한다. 데이터프레임으로 바꾸고 값만을 취한다.
  qrange<-data.frame(quantile(x)[4])[1,1]-data.frame(quantile(x)[2])[1,1] : 3사분위수에서 1사분위수를 빼어 값을 구한다.
  name<-c("N", "N of missing","Mean", "Standard Deviation", "Variation", "Standard Error", "Minimum", 
          "Maximum", "Median", "Mode", "95% Lower limit of mean (two-sided)", "95% Upper limit of mean(two-sided)", "P25", "P50", "P75", "Quantile Range") : 각 값의 이름을 지정하여 name이라는 벡터에 저장한다.
  value<-c(n, missing, mean, sd, var, se, min, max, median, mode, lclm, uclm, P25, P50, P75, qrange) : 위에서 구한 값들로 벡터를 만들고 value라는 이름을 붙인다.
  result<-cbind(name, value) : name과 value를 열 별로 합치고 result에 저장한다.
  print(result) : result를 출력한다.
}

 

 

만약 25%, 50%, 75%가 아닌 임의의 n% 백분위수를 구하고 싶다면 Pn을 사용하면 된다.

64%백분위수를 보고싶다면 P64를 사용하면 된다.

 

사분위수는 SAS, SPSS, R의 결과가 서로 다를 수 있다. 왜냐하면 각 프로그램에서 사분위수를 구하는 방법이 다를 수 있기 때문이다. 각 프로그램에는 사분위수를 구하는 여러가지 방법이 내장되어 있으며, 골라서 사용할 수도 있다.

SAS의 사분위수 확인하기:2022.09.23 - [기술 통계/SAS] - [SAS] 기술 통계 (평균, 표준편차, 표준오차, 최댓값, 최솟값, 중위수, 분위수 등) - PROC UNIVARIATE, PROC MEANS

SPSS의 사분위수 확인하기: 2022.09.29 - [기술 통계/SPSS] - [SPSS] 기술 통계 (평균, 표준편차, 표준오차, 최댓값, 최솟값, 중위수, 분위수 등)

 

 

R 기술 통계량 정복 완료!

 

작성일: 2022.09.27.

최종 수정일: 2022.09.29.

이용 프로그램: R 4.1.3

RStudio v1.4.1717

RStudio 2021.09.1+372 "Ghost Orchid" Release 

운영체제: Windows 10, Mac OS 10.15.7

반응형
반응형

[SAS] 기술 통계 (평균, 표준편차, 표준오차, 최댓값, 최솟값, 중위수, 분위수 등) - PROC UNIVARIATE, PROC MEANS

 

 1,000명으로 어떤 연구를 했다고 하자. 그들의 키, 몸무게 등 지표들은 서로 다를 것이다. 논문의 저자가 이 모든 것을 독자들에게 보여주고자 한다면 행이 1,000인 표를 제시해야 할 것이다. 그렇게 큰 표를 실어줄 저널이 없기도 하거니와, 독자들이 보기에도 한눈에 들어오지 않는다. 그 대신 키의 '평균', 몸무게의 '평균'을 제시하면 한눈에 들어오니 보기가 좋다. 연속 변수는 평균, 표준편차 등으로 요약을 하여 보여주고, 범주형 자료 (흡연 여부, 음주 여부 등)는 도수분포표 혹은 분할표로 제시하게 된다. 분할표를 작성하는 방법은 다음 링크에서 확인할 수 있다. 2022.08.18 - [기술 통계/SAS] - [SAS] 도수분포표 (Frequency table), 분할표 (Contingency table) 만들기 - PROC FREQ

 

 

어떤 지표로 요약해줄 것인가?

1) 정규성을 따를 때: 평균 및 표준편차

 어떤 변수가 정규 분포를 따른다고 할 수 있다면, 평균과 표준편차만 알면 된다. 단 두 개의 지표만 있으면 전체 분포를 알아낼 수 있기 때문이다. (정규성을 따르는지는 정규성 검정으로 확인할 수 있으며 정규성 검정을 하는 방법은 다음 링크에서 확인할 수 있다.) 2022.08.12 - [기술 통계/SAS] - [SAS] 정규성 검정 - PROC UNIVARIATE

 

2) 정규성을 따르지 않을 때: 중위수, 최댓값, 최솟값, 분위수, 사분위 범위 등

 정규성을 따르지 않는다면 평균과 표준편차를 안다고 해도 전체 분포를 알아낼 수는 없다. 따라서 분포에 대한 직접적인 정보를 주는데, 예를 들어 '하위 25%에 위치하는 사람의 ALT값은 얼마인가?' 등을 제시하는 것이다. 그런 지표로는 중위수, 최댓값, 최솟값, 분 위수, 사분위 범위 등이 있다.

 

이번 포스팅에서는 이 모든 지표들 (평균, 표준편차, 표준오차, 중위수, 최댓값, 최솟값, 분위수, 사분위 범위 등)을 구하는 법에 대해 소개할 것이다.

 

*실습용 데이터는 아래 링크를 클릭하면 다운로드할 수 있습니다.

2022.08.04 - [공지사항 및 소개] - 분석용 데이터 (update 22.08.29)

 

분석용 데이터 (update 22.08.29)

2022년 08월 29일 버전입니다. 변수는 계속하여 추가될 예정입니다. 다음 카테고리에 있는 글에서 이용된 데이터입니다. - 기술 통계 - 통계 프로그램 사용 방법 1) 엑셀 파일 2) CSV 파일 3) 코드북

medistat.tistory.com

 

시작하기 위해 라이브러리를 만들고, 파일을 불러온다.

라이브러리 만드는 방법: 2022.08.05 - [통계 프로그램 사용 방법/SAS] - [SAS] 라이브러리 만들기 - LIBNAME

파일 불러오는 방법: 2022.08.05 - [통계 프로그램 사용 방법/SAS] - [SAS] 데이터 불러오기 및 저장하기 - PROC IMPORT, PROC EXPORT

 

*라이브러리 지정하기;
LIBNAME hong "C:/Users/User/Documents/Tistory_blog";

*파일 불러오기;
PROC IMPORT
DATAFILE="C:\Users\user\Documents\Tistory_blog\Data.xlsx"
DBMS=EXCEL
OUT=hong.df
REPLACE;
RUN;


초보자용 (PROC UNIVARIATE)

제목에서도 알 수 있듯이 SAS에서 기술 통계량을 확인하는 방법은 대표적으로 PROC UNIVARIATE와 PROC MEANS가 있다. 둘 다 유용하지만 별다른 설정이 필요 없는 PROC UNIVARIATE가 초보자에게는 권장된다. 

 

 

코드

PROC UNIVARIATE DATA=hong.df ;
VAR ALT ;
RUN;

PROC UNIVARIATE DATA=hong.df : 기술 통계량을 산출하는 코드를 시작할 것이고, 데이터는 hong 라이브러리에 있는 df를 쓰겠다.
VAR ALT : 변수 "ALT"에 대한 기술 통계량을 보여달라.

결과

 

일반적으로 원하는 대부분의 통계량을 확인할 수 있다.

N(대상자수) 1000명

평균: 35.1159383

표준 편차: 5.00643005

분산: 25.0643419

표준 오차: 0.15831722

사분위수 범위(IQR, InterQuartile Range): 6.83472

 - 이 값은 Q3 (75 백분위수)에서 Q1 (25 백분위수)를 뺀 값과 같다.

최댓값: 49.0388

Q3 (75 백분위수): 38.5897

중위수 (50 백분위수): 35.1395

Q1 (25 백분위수): 31.7550

최솟값: 19.6178

 

사분위수는 SAS, SPSS, R의 결과가 서로 다를 수 있다. 왜냐하면 각 프로그램에서 사분위수를 구하는 방법이 다를 수 있기 때문이다. 각 프로그램에는 사분위수를 구하는 여러가지 방법이 내장되어 있으며, 골라서 사용할 수도 있다.

R의 사분위수 확인하기: 2022.09.27 - [기술 통계/R] - [R] 기술 통계 (평균, 표준편차, 표준오차, 최댓값, 최솟값, 중위수, 분위수 등)

SPSS의 사분위수 확인하기: 2022.09.29 - [기술 통계/SPSS] - [SPSS] 기술 통계 (평균, 표준편차, 표준오차, 최댓값, 최솟값, 중위수, 분위수 등)

 

코드

만약, 음주 여부에 따라 기술 통계량을 보고 싶다면 다음과 같이 "CLASS"구문을 추가하면 된다.

PROC UNIVARIATE DATA=hong.df ;
CLASS ALCOHOL;
VAR ALT ;

PROC UNIVARIATE DATA=hong.df : 기술 통계량을 산출하는 코드를 시작할 것이고, 데이터는 hong 라이브러리에 있는 df를 쓰겠다.

CLASS ALCOHOL : 음주 여부에 따라서 각각 결과를 산출하라
VAR ALT : 변수 "ALT"에 대한 기술 통계량을 보여달라.

 

결과

 

경력자용 (PROC MEANS)

 PROC UNIVARIATE은 정말 훌륭한 코드이지만 단점은 출력되는 결괏값이 너무 많다는 것이다. 그중에 필요한 것만 골라서 보고 싶다면 PROC MEANS가 더욱 적절하다. 물론 SAS에 익숙하지 않다면 코드가 복잡하게 느껴질 수도 있다.

 

기본 코드

PROC MEANS DATA=hong.df ;
VAR ALT ;
RUN;

PROC MEANS DATA=hong.df : 기술 통계량을 산출하는 코드를 시작할 것이고, 데이터는 hong 라이브러리에 있는 df를 쓰겠다.
VAR ALT : 변수 "ALT"에 대한 기술 통계량을 보여달라.

 

결과

보고 싶은 통계량을 지정해놓지 않으면 표본의 수, 평균, 표준편차, 최솟값, 최댓값을 보여준다.

 

코드

보고 싶은 통계량이 있다면 데이터 지정 후 모두 다 적어주면 된다.

예를 들어 표본의 수는 N, 평균은 MEAN, 표준편차는 STD인데 이 세 가지를 넣은 코드는 다음과 같다.

PROC MEANS DATA=hong.df N MEAN STD;
VAR ALT ;
RUN;

PROC MEANS DATA=hong.df N MEAN STD : 기술 통계량을 산출하는 코드를 시작할 것이고, 데이터는 hong 라이브러리에 있는 df를 쓰겠다. 통계량은 표본의 수, 평균, 표준편차만 보여달라.
VAR ALT : 변수 "ALT"에 대한 기술 통계량을 보여달라.

결과

 

비교적 자주 쓰는 통계량의 코드는 다음과 같다.

통계량 코드 통계량 코드
표본 수 N 평균의 신뢰구간 CLM
결측 수 NMISS 25백분위수 (1사분위수) P25 (Q1)
평균 MEAN 75백분위수 (3사분위수) P75 (Q3)
표준편차 STD 사분위 범위  QRANGE
표준오차 STDERR 1백분위수 P1
최솟값 MIN 5백분위수 P5
최댓값 MAX n0백분위수 Pn0 (i.e. P10, P20, P30, ...)
중위수 MEDIAN 95백분위수 P95
최빈값 MODE 99백분위수 P99

*CLM은 양측(two-sided) 신뢰구간을 구해준다. 만약 단측 (one-sided)신뢰구간을 구하고자 한다면 신뢰구간의 상한은 UCLM을, 하한은 LCLM을 사용하면 된다.

코드

만약, 음주 여부에 따라 기술 통계량을 보고 싶다면 다음과 같이 "CLASS"구문을 추가하면 된다.

PROC MEANS DATA=hong.df N MEAN STD;
CLASS ALCOHOL;
VAR ALT ;
RUN;

PROC MEANS DATA=hong.df N MEAN STD : 기술 통계량을 산출하는 코드를 시작할 것이고, 데이터는 hong 라이브러리에 있는 df를 쓰겠다. 통계량은 표본의 수, 평균, 표준편차만 보여달라.

CLASS ALCOHOL : 음주 여부에 따라서 각각 결과를 산출하라
VAR ALT : 변수 "ALT"에 대한 기술 통계량을 보여달라.

 

결과

 

코드

만약, 음주 여부에 따라 ALT와 수축기 혈압을 동시에 보고 싶다면 변수 자리에 수축기 혈압 변수를 같이 쓰면 된다.

PROC MEANS DATA=hong.df N MEAN STD;
CLASS ALCOHOL;
VAR ALT SBP;
RUN;

PROC MEANS DATA=hong.df N MEAN STD : 기술 통계량을 산출하는 코드를 시작할 것이고, 데이터는 hong 라이브러리에 있는 df를 쓰겠다. 통계량은 표본의 수, 평균, 표준편차만 보여달라.

CLASS ALCOHOL : 음주 여부에 따라서 각각 결과를 산출하라
VAR ALT SBP : 변수 "ALT"와 "SBP"에 대한 기술 통계량을 보여달라.

 

결과

코드 정리

*라이브러리 지정하기;
LIBNAME hong "C:/Users/User/Documents/Tistory_blog";

*파일 불러오기;
PROC IMPORT
DATAFILE="C:\Users\user\Documents\Tistory_blog\Data.xlsx"
DBMS=EXCEL
OUT=hong.df
REPLACE;
RUN;

*초보자용;
PROC UNIVARIATE DATA=hong.df ;
VAR ALT ;
RUN;

*(초보자용) 음주 여부에 따른 기술 통계량;
PROC UNIVARIATE DATA=hong.df ;
CLASS ALCOHOL;
VAR ALT ;

*경력자용;
PROC MEANS DATA=hong.df ;
VAR ALT ;
RUN;

*(경력자용) 음주 여부에 따른 기술 통계량;
PROC MEANS DATA=hong.df N MEAN STD;
CLASS ALCOHOL;
VAR ALT ;
RUN;

 

SAS 기술 통계량 정복 완료!

 

작성일: 2022.09.23.

최종 수정일: 2022.09.29.

이용 프로그램: SAS v9.4

운영체제: Windows 10

반응형

+ Recent posts