R) 전처리 - 그룹핑-01

R) 전처리 - 그룹핑-01

A 공장에서 사용하는 인쇄 장비의 인쇄물 중 불량이 확인되었다. 보다 상세한 내용을 확인하기 위해 몇 번 카트리지에서 문제가 발생했는지 알기 위해 코드를 작성해보자.

데이터 준비

인쇄물 고유 ID와 작업단위(unit)가 기록된 예시 데이터프레임을 다음과 같이 준비하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
df = data.frame(id = 1:10,
unit = c(2, 3, 5, 2, 1, 1, 1, 4, 1, 5))
df
## id unit
## 1 1 2
## 2 2 3
## 3 3 5
## 4 4 2
## 5 5 1
## 6 6 1
## 7 7 1
## 8 8 4
## 9 9 1
## 10 10 5

문제 상황

A 공장에서 사용하는 인쇄 장비의 인쇄물에는 고유 ID가 적혀있다고 한다. 인쇄물의 품질 유지를 위해서는 인쇄 카트리지 제조사의 권장사항에 근거하여 5작업단위마다 카트리지를 교체해주어야 한다. 그런데 낮에 작업한 인쇄물에 불량을 발견하여 몇 번 카트리지에서 문제가 발생했는지 알아보고자 한다. 각 인쇄작업에 소요된 작업단위를 기반으로 몇 번 카트리지가 몇 번 인쇄물의 인쇄에 사용되었는지 알아보자.

상기 문제 상황은 “데이터프레임의 특정 수치형 column의 누적값을 기준으로 새로운 그룹 정보가 있는 파생변수를 생성하는 방법” 으로 좀 더 일반화 할 수 있다.

풀이

반복문 활용

대충 어떻게 해야할지 개념은 머릿속에 있는데 코드 구현이 힘들다면 그냥 반복문이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
cart_no = 1
unit_sum = 0
for(n in 1:nrow(df)){
unit_sum = sum(unit_sum, df[n, "unit"]) # 1
df[n, "cart"] = cart_no
if(unit_sum == 5){
cart_no = cart_no + 1 # 2
unit_sum = 0 # 3
}
}
df
## id unit cart
## 1 1 2 1
## 2 2 3 1
## 3 3 5 2
## 4 4 2 3
## 5 5 1 3
## 6 6 1 3
## 7 7 1 3
## 8 8 4 4
## 9 9 1 4
## 10 10 5 5

카트리지 번호는 cart_no, 작업단위 합계는 unit_sum 객체를 활용하여 연산을 한다. 문제에서 5 작업단위라고 했기 때문에 “unit” 변수의 합이 5가 되는 순간 조치를 취해야 한다. 그리하여 1번 코드에서 sum() 함수를 활용하여 “unit” 변수 값을 순차적으로 더하고 있고 이후 조건문 함수 if() 로 검사하는 방식을 택했다. unit_sum 객체가 5가 되면 2번 코드와 3번 코드에서 볼 수 있듯 카트리지 번호(cart_no)를 +1 하고 작업단위 합계(unit_sum)는 초기화 한다.

기본 함수의 활용

앞의 반복문에서 누적합의 개념이 사용되었는데 누적합은 cumsum() 이라는 기본함수가 있다. 이를 활용해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
df[, "unit_csum"] = cumsum(df$unit)
df
## id unit cart unit_csum
## 1 1 2 1 2
## 2 2 3 1 5
## 3 3 5 2 10
## 4 4 2 3 12
## 5 5 1 3 13
## 6 6 1 3 14
## 7 7 1 3 15
## 8 8 4 4 19
## 9 9 1 4 20
## 10 10 5 5 25

“unit_csum” 변수에서 “unit” 변수의 누적합을 확인할 수 있다. 이제 5 작업단위마다 카트리지를 교체한다고 했기 때문에 “unit_csum” 변수를 5로 나눠보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
df[, "unit_csum_div5"] = df$unit_csum / 5
df
## id unit cart unit_csum unit_csum_div5
## 1 1 2 1 2 0.4
## 2 2 3 1 5 1.0
## 3 3 5 2 10 2.0
## 4 4 2 3 12 2.4
## 5 5 1 3 13 2.6
## 6 6 1 3 14 2.8
## 7 7 1 3 15 3.0
## 8 8 4 4 19 3.8
## 9 9 1 4 20 4.0
## 10 10 5 5 25 5.0

“unit_csum_div5” 변수를 “cart” 변수와 같은 값으로 만들고자 한다면 어떻게 해야할까? 어림하기 중 올림을 실시할 수 있는 ceiling() 함수를 사용해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
df[, "cart_2"] = ceiling(df$unit_csum_div5)
df
## id unit cart unit_csum unit_csum_div5 cart_2
## 1 1 2 1 2 0.4 1
## 2 2 3 1 5 1.0 1
## 3 3 5 2 10 2.0 2
## 4 4 2 3 12 2.4 3
## 5 5 1 3 13 2.6 3
## 6 6 1 3 14 2.8 3
## 7 7 1 3 15 3.0 3
## 8 8 4 4 19 3.8 4
## 9 9 1 4 20 4.0 4
## 10 10 5 5 25 5.0 5

“cart_2” 변수를 만들었던 코드를 한 줄로 합치면 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
df[, "cart_3"] = ceiling(cumsum(df$unit) / 5)
df
## id unit cart unit_csum unit_csum_div5 cart_2 cart_3
## 1 1 2 1 2 0.4 1 1
## 2 2 3 1 5 1.0 1 1
## 3 3 5 2 10 2.0 2 2
## 4 4 2 3 12 2.4 3 3
## 5 5 1 3 13 2.6 3 3
## 6 6 1 3 14 2.8 3 3
## 7 7 1 3 15 3.0 3 3
## 8 8 4 4 19 3.8 4 4
## 9 9 1 4 20 4.0 4 4
## 10 10 5 5 25 5.0 5 5

보다 난이도 높은 전처리 예제를 원한다면 다음 포스팅인 R) 전처리 - 그룹핑-02를 참고하도록 하자.

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×