본문 바로가기
R 실전 고급/예제1

[R 데이터분석 실전] 여러 독립변수와 종속변수가 있는 데이터 분석 (4) Type1: 2수준 독립변수 하나와 종속변수

by 만다린망고 2020. 8. 28.
반응형

[R 데이터분석 실전] 여러 독립변수와 종속변수가 있는 데이터 분석


(4) Type1: 2수준 독립변수 하나와 종속변수


2번강의에서 데이터를 불러온 상태로 진행됩니다. 


남녀 연봉을 비교해보겠습니다. 결과적으로 아래와 같은 표가 그려집니다. 


 

 전체

 남자

여자 

p-value 

 연봉

 평균±표준편차

 평균±표준편차

 평균±표준편차

 p값


R로 이 표를 그려봅시다. 


table의 1행1열에는 남자 연봉의 평균과 표준편차가 들어갑니다. 남자 연봉데이터만 추립니다. 인덱싱 방법은 아래 두가지가 있습니다. 


data[data["성별"]=="M","연봉"]


data[data$"성별"=="M","연봉]


저는 첫번째 방법을 선호합니다. "성별" 자리에 변수를 넣을 수 있기 때문입니다. $뒤에는 변수가 올 수 없습니다. 둘은 결과에서도 차이가 있습니다. 첫번째는 결과를 데이터프레임형태로 반환하고, 두번째는 벡터형태로 반환합니다. 우리는 첫번째 방법을 사용할 것이기 때문에 데이터프레임 형태로 자료가 반환됩니다. 평균, 표준편차등의 함수를 적용하기 위해 벡터로 만들어주겠습니다. unlist 함수를 적용합니다. 결과를 data_m_s 에 저장합니다. male_salary 라는 의미입니다. 


data_m_s=data[data["성별"]=="M","연봉"] %>% unlist()


%>%연산자는 우측 함수를 좌측 데이터에 적용해줍니다. 같은 방법으로 여자 연봉데이터도 변수에 저장합니다. 


data_f_s=data[data["성별"]=="M","연봉"] %>% unlist()


남녀 전체 연봉 데이터도 변수에 저장합시다. 


data_all=data["연봉"] %>% unlist()


아래와 같이 함수를 정의합니다. 데이터를 넣으면 평균,표준편차,최댓값,최솟값을 문자열 형태로 출력해주는 함수입니다. 


MF1=function(data,decimal)

{

  result=paste0(round(mean(data,na.rm=TRUE),decimal),

               "±",round(sqrt(var(data,na.rm=TRUE)),decimal),

               "( ",round(min(data,na.rm=TRUE),decimal),",",

               round(max(data,na.rm=TRUE),decimal),")")

}


이제 표에 들어갈 문자열로 만들어줍시다. C11은 1행1열이라는 의미입니다. 


C11=MF1(data_all) #남녀 전체 연봉 평균±표준편차(최솟값,최댓값)

C12=MF1(data_m_s) #남자 연봉 평균±표준편차(최솟값,최댓값)

C13=MF1(data_f_s) #여자 연봉 평균±표준편차(최솟값,최댓값)


1행3열에는 p값이 들어가야 합니다. p값은 t검정을 통해 구해야하는데 표본 수가 충분하지 않을 수 있습니다. 따라서 아래와 같은 기준으로 검정을 하는 코드를 짜겠습니다. 


1) 표본 크기 10 미만은 무조건 비모수검정(윌콕슨 순위합 검정)

2) 표본 크기 10 이상 30미만은 정규성 검정 후 판단

3) 표본 크기 30 이상은 모수검정(t검정)


if (length(data_m_s)<10 | length(data_f_s)<10) {

  p_value=wilcox.test(data_m_s,data_f_s)$p.value

} else if (length(data_m_s)>=30 & length(data_f_s)>=30){

  p_value=t.test(data_m_s,data_f_s)$p.value

} else {

  if (shapiro.test(data_m_s)$p.value>=0.05 & shapiro.test(data_f_s)$p.value>=0.05)

  {

    p_value=t.test(data_m_s,data_f_s)$p.value

  } else {

    p_value=wilcox.test(data_m_s,data_f_s)$p.value

  }

}


계산된 p값을 1행3열에 해당되는 C13 변수에 넣겠습니다. 


C14=p_value


이제 표를 그릴 수 있습니다. 


table=data.frame(C11,C12,C13,C14)

colnames(table)=c("all","Male","Female","p-value")

rownames(table)="연봉"


결과는 아래와 같습니다. View(table)로 표를 출력하면 더 보기 좋게 출력됩니다. 


> table

                         all                        Male Female p-value

연봉 5089.4±1138.57(3096,6991) 5136.86±1166.23(3096,6882)      1       0


View(table)로 표를 출력하면 더 보기 좋게 출력됩니다. 



코드를 모아봅시다. 


library(readxl)

data <- read_excel("C:/Users/R_data_ex1.xlsx")

data=as.data.frame(data)


data_all=data[,"연봉"] %>% unlist()

data_m_s=data[data["성별"]=="M","연봉"] %>% unlist()

data_f_s=data[data["성별"]=="M","연봉"] %>% unlist()


#평균,표준편차,최댓값,최솟값 출력 함수 정의

MF1=function(data,decimal)

  

{

  result=paste0(round(mean(data,na.rm=TRUE),decimal),

                "±",round(sqrt(var(data,na.rm=TRUE)),decimal),

                "(",round(min(data,na.rm=TRUE),decimal),",",

                round(max(data,na.rm=TRUE),decimal),")")

}


C11=MF1(data_all) #남녀 전체 연봉 평균±표준편차(최솟값,최댓값)

C12=MF1(data_m_s) #남자 연봉 평균±표준편차(최솟값,최댓값)

C13=MF1(data_f_s) #여자 연봉 평균±표준편차(최솟값,최댓값)


if (length(data_m_s)<10 | length(data_f_s)<10) {

  p_value=wilcox.test(data_m_s,data_f_s)$p.value

} else if (length(data_m_s)>=30 & length(data_f_s)>=30){

  p_value=t.test(data_m_s,data_f_s)$p.value

} else {

  if (shapiro.test(data_m_s)$p.value>=0.05 & shapiro.test(data_f_s)$p.value>=0.05)

  {

    p_value=t.test(data_m_s,data_f_s)$p.value

  } else {

    p_value=wilcox.test(data_m_s,data_f_s)$p.value

  }

}


C14=p_value


table=data.frame(C11,C12,C13,C14)

colnames(table)=c("all","Male","Female","p-value")

rownames(table)="연봉"


이제 위 코드를 이용하여 자동화를 해봅시다. 전체데이터, 독립변수 이름, 종속변수 이름을 입력하면 위와 같은 표를 출력해주는 함수입니다. 함수 이름은 sa.1iv.1dv 이라고 이름 붙이겠습니다. statistical anaylsis of one independent variable and one dependent variable 의 약어입니다. 아래와 같은 형태가 될 것입니다. 


sa.1iv.2lev.1dv(데이터, 독립변수 이름, 종속변수 이름)


코드는 아래와 같습니다. 


sa.1iv.2lev.1dv=function(data,niv,ndv,decimal){

  

  data_all=data[,ndv] %>% unlist()

  data_iv_1=data[data[niv]==unique(data[,niv])[1],ndv] %>% unlist()

  data_iv_2=data[data[niv]==unique(data[,niv])[2],ndv] %>% unlist()

  

  #평균,표준편차,최댓값,최솟값 출력 함수 정의


  C11=MF1(data_all,decimal) 

  C12=MF1(data_iv_1,decimal) 

  C13=MF1(data_iv_2,decimal) 

  

  if (length(data_iv_1)<10 | length(data_iv_2)<10) {

    p_value=wilcox.test(data_iv_1,data_iv_2)$p.value

  } else if (length(data_iv_1)>=30 & length(data_iv_2)>=30){

    p_value=t.test(data_iv_1,data_iv_2)$p.value

  } else {

    if (shapiro.test(data_iv_1)$p.value>=0.05 & shapiro.test(data_iv_2)$p.value>=0.05)

    {

      p_value=t.test(data_iv_1,data_iv_2)$p.value

    } else {

      p_value=wilcox.test(data_iv_1,data_iv_2)$p.value

    }

  }


  C14=p_value

  table=data.frame(C11,C12,C13,C14)

  colnames(table)=c("all",unique(data[,niv])[1],unique(data[,niv])[2],"p-value")

  rownames(table)=ndv

  print(table)

}


함수를 사용해봅시다. 


> sa.1iv.2lev.1dv(data,"성별","연봉",1)

                         all                           F                           M   p-value

연봉 5089.4±1138.5 (3096,6991) 5041.9±1120.0 (3244,6991) 5136.9±1166.2 (3096,6882) 0.6789837


반응형

댓글