R 그룹별 통계량 - r geulubbyeol tong-gyelyang

doBy가 데이터를 그룹별로 나눈 후 특정 계산을 적용하기 위한 함수들의 패키지인 반면 aggregate( )는 좀 더 일반적인 그룹별 연산을 위한 함수다. aggregate( )를 사용하면 데이터를 그룹으로 묶은 후 임의의 함수를 그룹에 적용할 수 있다.

표 4-31 그룹별 연산

aggregate : 데이터를 분할하고 각 그룹마다 요약치를 계산한다.

aggregate(
  x, # R 객체
  by, # 그룹으로 묶을 값의 리스트
  FUN # 그룹별로 요약치 계산에 사용할 함수
)

aggregate(
  formula, # y ~ x 형태로 y는 계산에 사용될 값이며, x는 그룹으로 묶을 때 사용할 기준값
  data, # formula를 적용할 데이터
  FUN
)

입력이 데이터 프레임인 경우, 반환 값은 그룹 값과 그룹의 요약치를 저장한 데이터 프레임이다.

이 절에서는 aggregate( )에 포뮬러를 적용한 형태의 예를 살펴본다. 다음은 아이리스 데이터에서 종별 Sepal.Width의 평균 길이를 구하는 예다.

> aggregate(Sepal.Width ~ Species, iris, mean)
     Species Sepal.Width
1     setosa       3.428
2 versicolor       2.770
3  virginica       2.974

같은 일을 tapply( )를 통해서 수행하면 다음과 같다.

> tapply(iris$Sepal.Length, iris$Species, mean)
   setosa versicolor virginica
    5.006      5.936     6.588

얻는 결과는 같지만 포뮬러를 사용한 aggregate( ) 쪽이 코드 작성하기 편리하다.

신간 소식 구독하기

뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.

1. 데이터 불러오기

DF<-read.csv("example_salary.csv",stringsAsFactors = F,na="-")
head(DF,5)
##    연령 월급여액..원. 연간특별급여액..원. 근로시간..시간. 근로자수..명.
## 1   -19       1346534              151840           169.5         15042
## 2 20-24       1584214              115375           180.1         74251
## 3 25-29       1922043              268058           178.0        143338
## 4 30-34       2130988              335710           180.8        103585
## 5 35-39       2414345              352816           181.4         65385
##   경력구분 성별
## 1  1년미만   남
## 2  1년미만   남
## 3  1년미만   남
## 4  1년미만   남
## 5  1년미만   남

2. 변수명 바꾸기

colnames(DF)
## [1] "연령"                "월급여액..원."       "연간특별급여액..원."
## [4] "근로시간..시간."     "근로자수..명."       "경력구분"           
## [7] "성별"
colnames(DF)<-c("age","salary","specialsalary","workingtime","numberofworker","carrer","sex")

3. 성별 기준으로 평균구하기(subset)

temp<-tapply(DF$salary,DF$sex,mean,na.rm=T)
temp
##      남      여 
## 2477332 1865823
  • tapply() : 어떤 변수를 기준으로 그룹을 짓고 그룹별로 함수를 적용 (처리할 인자, 기준,사용할 함수)
  • 남자는 247, 여자는 186만원으로 차이가 많이남

4. 그래프 그리기

library("reshape2")
library("ggplot2")
Melt<-melt(temp)
ggplot(Melt,aes(x=Var1,y=value,fill=Var1))+geom_bar(stat="identity")

5.표준편차 구하기

tapply(DF$salary,DF$sex,sd,na.rm=T)
##       남       여 
## 646470.7 468270.6
  • 남자가 월급이 더 높은 반면 격차도 크다. Range()를 확인하면 더 확실할 듯.

6. 범위 확인하기

tapply(DF$salary,DF$sex,range,na.rm=T)
## $남
## [1] 1346534 4064286
## 
## $여
## [1] 1117605 3002440
  • 확실히 남자 범위가 더 넓음

7. 경력별로 평균월급 구하기

temp<-tapply(DF$salary,DF$carrer,mean,na.rm=T)
temp
##  1~3년미만   10년이상    1년미만  3~5년미만 5~10년미만 
##    1905012    2907119    1730835    2028015    2360463
  • 1년 미만일 때 173만원, 5년이 넘어가면 230만원이 평균 월급

8. 그래프 그려보기

Melt<-melt(temp)
ggplot(Melt,aes(x=Var1,y=value,group=1))+geom_line(colour="skyblue2",size=2)+coord_polar()+ylim(0,max(Melt$value))

9. 표준편차 구하기

tapply(DF$salary,DF$carrer,sd,na.rm=T)
##  1~3년미만   10년이상    1년미만  3~5년미만 5~10년미만 
##   421332.8   690976.7   408110.4   460790.9   507244.7
  • 경력이 올라가면서 표준편차도 커빔, 1년 미만일 때는 차이가 많이 안남

10. 경력별 범위

tapply(DF$salary,DF$carrer,range, na.rm=T)
## $`1~3년미만`
## [1] 1172399 2619221
## 
## $`10년이상`
## [1] 1685204 4064286
## 
## $`1년미만`
## [1] 1117605 2414345
## 
## $`3~5년미만`
## [1] 1245540 2827420
## 
## $`5~10년미만`
## [1] 1548036 3309231
  • 각 경력마다 제일 적게 받는 월급 집단

11. 가장 적은 월급 집단 찾기

a1<-DF[which(DF$salary==1172399),]
a2<-DF[which(DF$salary==1685204),]
a3<-DF[which(DF$salary==1117605),]
a4<-DF[which(DF$salary==1245540),]
a5<-DF[which(DF$salary==1548036),]
List<-list(a1,a2,a3,a4,a5)
List
## [[1]]
##    age  salary specialsalary workingtime numberofworker    carrer sex
## 70 60- 1172399        299639       151.2          30253 1~3년미만  여
## 
## [[2]]
##      age  salary specialsalary workingtime numberofworker   carrer sex
## 92 20-24 1685204       1970720       179.4           1886 10년이상  여
## 
## [[3]]
##    age  salary specialsalary workingtime numberofworker  carrer sex
## 60 60- 1117605         10667         148          18737 1년미만  여
## 
## [[4]]
##    age  salary specialsalary workingtime numberofworker    carrer sex
## 80 60- 1245540        423826       155.1          21106 3~5년미만  여
## 
## [[5]]
##    age  salary specialsalary workingtime numberofworker     carrer sex
## 90 60- 1548036        806919       169.1          20282 5~10년미만  여
  • 가장 낮은 월급:60대 이상 여자
  • 10년 이상 경력에서 가장 낮은 월급을 받는 집단:20대 초반 여자(1886명)-> 10년이나 경력 쌓고 168만원을 받음(특이점)