이번 포스팅에서는 관심 있는 부차집단의 응답값이 부차집단 내에서 차지하는 비중을 기준으로 테이블을 구성하는 방법을 알아 보고 R에서 function 함수를 이용해 테이블 생성작업을 좀 더 간편하게 실행하는 방법에 대해 알아 보겠습니다.
지난 포스팅에서 사용했던 고객 만족도 조사 결과 데이터를 이용해 R에서 테이블을 만들어 보겠습니다. q1_1은 직원의 친절성, q1_2은 직원의 전문성, q1_3은 매장의 청결성, q1_4는 제품의 다양성, q1_5는 제품의 품질을 묻는 질문의 답변이고 q2는 전반적인 만족도의 응답 결과입니다. Head(raw_data,3) raw_data 파일의 세번째 행까지 읽어드리는 명령입니다.
> raw_data=read.csv("raw_data.csv")
> head(raw_data,3)
id sq1 sq2 q1_1 q1_2 q1_3 q1_4 q1_5 q2 x
1 1 남성 30대 5 4 3 5 5 5 전체
2 2 여성 40대 6 4 5 3 5 3 전체
3 3 남성 30대 6 6 7 7 6 6 전체
우선 성별 변수 sq1와 연령별 변수 sq2의 교차통계표를 구성해 보겠습니다. table() 함수를 이용하면 성별·연령별 빈도를 구할 수 있습니다. 빈도가 아니라 비율을 알고 싶다면 prop.table() 함수를 활용하면 됩니다. addmargins()를 활용하면 교차통계표에 주변합을 추가할 수 있습니다.
>fre=table(raw_data$sq1,raw_data$sq2)
>fre=prop.table(fre)
>fre=addmargins(fre)
30대 40대 Sum
남성 0.32 0.27 0.59
여성 0.20 0.21 0.41
Sum 0.52 0.48 1.00
이제 직원의 친절성을 평가한 변수 q1_1의 빈도와 평균을 전체 응답자, 성별, 연령별로 볼 수 있는 교차통계표를 만들어 보겠습니다. 전체 빈도를 보여주기 위해 전체를 표기한 x변수에 대해 table( )함수를 실행합니다.
> raw_data=read.csv("raw_data.csv")
> table1=table(raw_data$q1_1,raw_data$x)
> table1=prop.table(table1)
> table1
전체
3 0.05
4 0.18
5 0.36
6 0.29
7 0.12
다음으로 tapply() 함수를 이용해 전체에 대해 q1_1 변수의 평균을 구한 후 rbind() 함수를 이용해 행 방향으로 q1_1 변수의 빈도표에 합쳐 줍니다.
> mean<-tapply(raw_data$q1_1,raw_data$x,mean)
> table1=rbind(table1,mean)
> table1
total
3 0.05
4 0.18
5 0.36
6 0.29
7 0.12
mean 5.25
다음으로 성별을 구분하는 변수 sq1를 기준으로 빈도와 평균을 구한 다음 전체에 대한 기존 표에 합쳐 줍니다. prop.table(table2,2)에서 파일명 table2 다음의 2는 비율을 열방향으로 합산하기 위한 옵션입니다. 행방향으로 비율을 합치기 위해서는 1을 입력하면 됩니다. rbind()는 행 방향으로 파일을 합쳐주는 함수이고 cblind()는 열 방향으로 파일을 합쳐주는 함수입니다.
>table2<-table(raw_data$q1_1,raw_data$sq1)
>table2<-prop.table(table2,2)
>mean2<-tapply(raw_data$q1_1,raw_data$sq1,mean)
>table2<-rbind(table2,mean2)
>table<-cbind(table1,table2)
마지막으로 연령별 교차통계표를 구해 원래의 교차통계표에 합쳐 줍니다.
>table3<-table(raw_data$q1_1,raw_data$sq2)
>table3<-prop.table(table3,2)
>mean3<-tapply(raw_data$q1_1,raw_data$sq2,mean)
>table3<-rbind(table3,mean3)
>table<-cbind(table,table3)
전체 빈도와 평균에 성별 연령별 자료를 합한 교차통계표의 최종 결과물은 아래와 같습니다. print()함수를 이용해 교차통계표 숫자의 자리수를 조정해 줄 수도 있습니다.
> table
전체 남성 여성 30대 40대
3 0.05 0.05084746 0.04878049 0.07692308 0.02083333
4 0.18 0.11864407 0.26829268 0.19230769 0.16666667
5 0.36 0.37288136 0.34146341 0.32692308 0.39583333
6 0.29 0.32203390 0.24390244 0.32692308 0.25000000
7 0.12 0.13559322 0.09756098 0.07692308 0.16666667
mean 5.25 5.37288136 5.07317073 5.13461538 5.37500000
> print(table,digits=2)
전체 남성 여성 30대 40대
3 0.05 0.051 0.049 0.077 0.021
4 0.18 0.119 0.268 0.192 0.167
5 0.36 0.373 0.341 0.327 0.396
6 0.29 0.322 0.244 0.327 0.250
7 0.12 0.136 0.098 0.077 0.167
mean 5.25 5.373 5.073 5.135 5.375
설문지가 길어지면 교차통계표를 구하기 위해 위와 같은 절차를 각각의 문항에 대해 반복하는 것은 매우 비효율적입니다. function함수를 이용해 미리 위의 절차를 만들어 주면 설문지가 길어지더라도 비교적 효율적으로 교차통계표를 구할 수 있습니다.
>function1=function(a,b,c,d){
+table1<-table(a,b)
+table1<-prop.table(table1,2)
+mean<-tapply(a,b,mean)
+table1<-rbind(table1,mean)
+table2<-table(a,c)
+table2<-prop.table(table2,2)
+mean2<-tapply(a,c,mean)
+table2<-rbind(table2,mean2)
+table<-cbind(table1,table2)
+table3<-table(a,d)
+table3<-prop.table(table3,2)
+mean3<-tapply(a,d,mean)
+table3<-rbind(table3,mean3)
+table<-cbind(table,table3)}
function함수에서 a, b, c, d는 임의로 지정한 변수이고 a, b, c, d 대신 실제 분석 대상이 되는 변수들로 교체만 해주면 손쉽게 교차통계표를 구할 수 있습니다.
>output1=function1(a=raw_data$q1_1,b=raw_data$x,c=raw_data$sq1,d=raw_data$sq2)
> print(output1,digits=2)
전체 남성 여성 30대 40대
3 0.05 0.051 0.049 0.077 0.021
4 0.18 0.119 0.268 0.192 0.167
5 0.36 0.373 0.341 0.327 0.396
6 0.29 0.322 0.244 0.327 0.250
7 0.12 0.136 0.098 0.077 0.167
mean 5.25 5.373 5.073 5.135 5.375
궁금한 점이 있으면 아래 버튼을 클릭해 주십시오. 성실하게 답변 드리겠습니다.