본문 바로가기
IT이야기/R 언어

R언어 - 기초 통계 분석

by 행복찾아3만리 2021. 8. 21.
반응형

이번 글에서는 R언어를 활용하여 기초 통계 분석 하는법에 대해 정리 했습니다.

#데이터 샘플링
data<-iris
str(data)

idx<-sample(1:nrow(data), nrow(data)*0.7, replace = FALSE)
train_data<-data[idx,]
nrow(train_data)
test_data<-data[-idx,]
nrow(test_data)

#sampling 패키지
#install.packages("sampling")
library(sampling)
#층화 임의 추출
#Species가 setosa인 데이터를 20개 versicolor인 데이터를 15개 versinica인 데이터를 15개
sample<-strata(data=iris, c("Species"), size=c(20,15,15), method="srswor")
#mehod
#"srswor" : 비복원 단숨 임의 추출
#"srswr" : 복원 단순 임의 추출
#"poisson" ; 포아송 추출
#"systematic" : 계통 추출

iris_sampe<-getdata(iris, sample) #위에서 추출된 샘플로 데이터 추출
table(iris_sampe$Species)
#setosa versicolor  virginica 
#    20         15         15 

#T-검정
#일표본 T-검정
#"단일모집단"에서 관심이 있는 연속형 변수의 "평균값"을 특정 기준값과 비교
#귀무가설 H0 : m=m0
#대립 가설 H1 : m!=m0(양측검정), m>m0(우단측검정), m<m0(좌단측검정)
#p-value<유의수준 : 귀무가설을 기각 하고 대립가설 채택
#p-value>유의수준 : 귀무가설을 기각 하지 않는다.

#일표본 T-검정을 수행하기전 표본에 대한 정규성 검정
#샤피로-월크 검정에따라 정규성 검정
#정규분포를 따른다는 가정을 만족하면 t.test라는 함수를 이용하여 일표본-T검정 수행
#정규성을 만족하지 않는 경우 wilcox.test함수를 이용하여 T-검정을 수행
#MASS library를 이용하여 cats 데이터 불러옴
library(MASS)
str(cats)
#귀무가설 : 고양이의 평균 몸무게는 2.6이다
#대립가설 : 고양이의 평균 몸무게는 2.6이 아니다.

#Bwt(고양이무게) 변수에 대한 정규선 검정 수행
shapiro.test(cats$Bwt)
#p-value가 6.731e-05로 유의수준 0.05보다 작기 때문에 '데이터가 정규분포를 따른다'라는 귀무가설을 기각한다.
#즉 cats 데이터의 Bwt변수는 정규분포를 따르지 않으므로 wilcox.test 함수를 이용하여 T-검정을 수행한다.
wilcox.test(cats$Bwt, mu = 2.6, alternative ='two.sided')
#p-value가 0.02532이므로 유의수준 0.05보다 작기에 귀무가설을 기긱한다. 따라서 고양이의 평균 몸무게는 2.6이 아니다.


#대응표본 T-검정
#"단일모집단"에 대해 두 번의 처리를 가했을 때, 두 개의 처리에 따른 평균의 차이를 비교

#가정
#모집단의 관측값이 정규성(정규분포를 만족하는 가정)을 만족해야 한다.
#종속변수는 연속형 변수여야 한다.

#귀무가설 : 두 개의 모평균간에 차이가 없다
#대립가설 : 두개의 모평균간에는 차이가 있다. 차이는 0보다 크다, 차이는 0보다 작다.

#코로나 치료제 복용전 코로나 치료 기간 : 7,5,6,8,10,12,8,9
#코로나 치료제 복용후 코로나 치료 기간 : 6,5,4,10,4,5,7,9

#귀무가설 : 치료제 복용전과 후 치료기간의 차이는 없다 mx-my=D=0
#대립가설 : 치료제 복용전과 후 치료기간의 차이는 0보다 크다 mx-my>D

data<-data.frame(before=c(7,5,6,8,10,12,8,9), after=c(6,5,4,10,4,5,7,9))
t.test(data$before, data$after, alternative = "greater", paired = TRUE)
#alternative 양측 검정 "two.sided", 단측 검정 "less", "greater"
#paired 대응표본 t-검정을 수행할지에 대한 여부 (기본값은 false이지만 대응표본 t-검정을 수행할 시 인자값을 TRUE로 지정해야 한다.)
#p-value = 0.06496로 유의수준 0.05보다 크기에 귀무가설을 채택한다. 치료제 복용전과 후 치료기간의 차이는 없다.

#독립표본 T 검정
#두개의 독립된 표본의 모집단의 평균을 비교

#가정
#두모집단의 정규성 만족
#두개의 모집단은 서로 독립적이어야 한다.
#두 모집단의 분산이 서로 같음을 의미하는 등분산성 가정을 확인 해야 한다.
#독립 변수는 범주형, 종속변수는 연속형이여야 한다.

#귀무가설 : 고양이의 성별에 따른 평균 몸무게에는 통계적으로 유의한 차이가 없다.
#대립가설 : 고양이의 성별에 따른 평균 몸무게에는 통계적으로 유의한 차이가 있다.

#등분산성 검정
var.test(Bwt~Sex, data=cats)
#유의확률(p-value)이 0.0001157로 유의수준 0.05보다 매우 작기에 귀무가설을 기각한다. 따라서 A,B 두 집단의 데이터는 등분산 가정을 만족할수 없다.

#성별에 따른 몸무게가 등분산성을 만족하지 않는다는 조건 하에 독립 T 검정 수행
t.test(Bwt~Sex, data=cats, alternative="two.sided", var.equal=FALSE)
#var.equal 등분산성 만족 여부
#유의확률(p-value)이 8.831e-15로 유의수준 0.05보다 매우 작기에 귀무가설을 기각한다. 따라서 고양이들의 성별에 따른 평균몸무게에는 통계적으로 유의한 차이가 있다.


#적합성 검정
#모집단 분포에 대한 가정이 옳게 됐는지를 관측 자료와 비교하여 검정

#귀무가설 : 전체 응답자 중 왼손잡이의 비율이 20%, 오른손잡이의 비율이 80%이다.
#대립가설 : 전체 응답자 중 왼손잡이의 비율이 20%, 오른손잡이의 비율이 80%라고 할 수 없다.

str(survey)#survey 데이터
data<-table(survey$W.Hnd)
chisq.test(data,p=c(0.2,0.8))
#귀무가설 기각

#독립성 검정
#모집단이 두개의 변수 A,B에 의해 범주화되었을 때, 이 두 변수들 사이의 관계가 독립인지 아닌지를 검정하는 것을 의미 한다.
#귀무가설 : W.Hnd와 Excer는 독립이다.
#대립가설 : W.Hnd와 Excer는 독립이 아니다.
data<-table(survey$W.Hnd, survey$Exer)
chisq.test(data)
#귀무가설 채택

#동질성 검정(독립성 검정과 같은 방법)

#분산분석

#일원배치 분산분석
#가정
#각 집단의 측정치는 서로 독립적이며, 정규분포를 따른다.
#각 집단 측정치의 분산은 같다.

#사후 검정
#사후 검정이란 분산분석의 결과 귀무가설이 기각되어 적어도 한 집단에서 평균의 차이가 있음이 통계적으로 증명되었을 경우
#어떤 집단들에 대해서 차이가 존재하는지를 알아보기 위해 실시하는 분석

#귀무가설 : 세 가지 종에 대해 Sepal.Width의 평균은 모두 같다.
#대립가설 : 적어도 하나의 종에 대한 Sepal.Width의 평균값에는 차이가 있다.
result<-aov(Sepal.Width~Species, data=iris)
summary(result)
#유의확률(p-value)이 2e-16로 유의수준 0.05보다 매우 작기에 귀무가설을 기각한다. 즉 적어도 하나의 종에 대한 Sepal.width의 평균 값의 차이가 있다.

#세가지 종들 중 특히 어떠한 종들 간에 Sepal.Width의 차이가 있는지 파악 하기 위해 사후 검정 실시
TukeyHSD(aov(Sepal.Width~Species, data=iris))
#사후 분석 결과 p adj(수정된 p-value값)이 0.05보다 작으므로 각각의 비교에 대한 귀무가설을 모두 기각한다. 즉 모든 종들에 대해서 Sepal.width의 평균값은 통계적으로 유의한 차이가 있다.
#또한 diff는 하이픈의 왼쪽 집단과 오른쪽 집단 간 반응 값의 차이를 나타내는데. versicolor보다 setosa일대 sepal.width가 통계적으로 유의하게 큰 값을 가진다.

#이원배치 분산분석
#가정
#정규성, 등분산성
#귀무가설 : 실린더 개수에 따른 주행거리 차이는 존재하지 않는다.
#대립가설 : 실리더 갠수에 따른 주행거리 차이는 존재한다.
#귀무가설 : 변속기 종류에 따른 주행거리 차이는 존재하지 않는다.
#대립가설 : 변속기 종류에 따른 주행거리의 차이는 존재한다.
#귀무가설 : 변속기 종류와 실린더 개수 간에는 상호작용 효과가 없다.
#대립가설 : 변속기 종류와 실린더 개수 간에는 상호작용 효과가 있다.
str(mtcars)
#aov 함수를 사용하기 위해 독립변수인 cyl,am를 팩터형으로 변환
mtcars$cyl<-as.factor(mtcars$cyl)
mtcars$am<-as.factor(mtcars$am)
car<-mtcars[,c('cyl','am','mpg')]
str(car)
car_aov<-aov(mpg~cyl*am, car)
summary(car_aov)
#첫번째 귀무가설 기각, 두번째 귀무가설 채택, 세번째 귀무가설 채택
#cyl와 am사이에 상호작용 효과가 있는지 없는지 시각화
interaction.plot(car$cyl, car$am, car$mpg, col=c("red","blue"))
#두선이 서로 교차하고 있을 시에는 x축에 있는 독립변수와 그래프에서 시각화된 독립변수간에는 상호작용이 존재한다고 해석 할 수 있다.

 

여기까지 R언어를 활용한 기초 통계 분석 방법 이였습니다.

 

도움이 되었으면 합니다.

 

 

반응형

댓글