데이터를 파워풀하게 만드는 방법
혼자 하는 일이 아니다
직장생활을 소재로 한 역대 걸작 드라마 미생에 나오는 한 대사입니다.
드라마 대사처럼 우리 주변의 일들은 휴대폰 안에 있는 지인들의 연락처 정리와 같이 혼자 하는 일이 아닙니다. 기획, 홍보, 마케팅, 원가, 인사노무, 사업, 설계, 구매, 생산, 운송까지 작은 회사도 보통 10개가 넘는 부서로 이뤄져 있고, 대기업의 경우 100개 이상의 부서가 협업을 하게 됩니다.
안타깝지만 실제로는 그 반대의 경우가 대부분입니다. 아주 유사한(심지어 같은) 데이터라고 해도 부서마다 서로 다른 모양과 방법으로 관리하고 있습니다.
드라마에서처럼 우리가 데이터로 풀고자 하는 문제 역시 마찬가지로 혼자서 해결할 수 있는 일은 많지 않습니다. 예를 들어, 판매량이 줄어들었다면 홍보와 마케팅의 데이터를 살펴보아야 할 것입니다. 또 구매단계 원자재 값이 올랐다면 총원가가 얼마나 올랐는지, 다른 단계에서 줄일 수 있는 비용은 없는지 분석해봐야 합니다.
이렇듯 데이터도 마찬가지로 혼자서, 하나의 부서 단위의 활용을 넘어서는 경우가 많습니다.
문제와 그 목적에 맞게 데이터를 활용해야 한다고 이해했습니다. 그렇다면 우리 문제와 목적에 맞는 데이터를 어떻게 구할까요? 애초부터 우리 입맛에 딱 맞는 데이터가 존재하면 얼마나 좋을까요? 아쉽게도 실무에서 그런 문제와 데이터를 바로 얻기는 어렵습니다. 그래서 우리는 그 데이터를 직접 만들어야 합니다.
이렇게 목적에 맞는 데이터를 직접 만드는 과정에서 필요한 사고방식은 3가지가 있습니다. 바로 데이터를 붙이기, 짝짓기, 집계하기입니다. 제가 필요한 '사고'라고 말씀드린 이유는 프로그래밍 또는 코딩에서 저마다 명령어가 다르기 때문입니다. 하지만 데이터를 활용하는 입장에서 보면 그 프로그래밍 명령어는 크게 중요하지 않습니다.
왜냐하면 SQL, R, Pyhton에서 명령어는 다르더라도 데이터를 다루는 방식, 즉 사고방식은 공통적이기 때문입니다. 그래서 코딩보다는 '사고'가 중요하다고 말씀드리고 있습니다.
그렇다면 우리 머릿속에서 필요한 데이터 활용 사고 ①붙이기 ②짝짓기 ③집계하기를 쉬운 예를 통해 구체적으로 알아보겠습니다. 준비되셨죠?^^
서로 다른 두 개의 데이터를 한 데 붙이는 것을 병합이라고 합니다. 병합이라고 하는 것은 서로 다른 데이터 A와 데이터 B 가 있을 때, 두 데이터에서 공통된 값을 기준으로 데이터 A와 B를 합쳐서 하나의 데이터로 만드는 작업을 말합니다.
2개 빵집의 데이터를 묶어줘
최근 2호점을 오픈한 빵집 사장님은 고민이 많아졌습니다. 2개 빵집의 판매량, 매출, 재료비 등을 통합 관리하고 싶기 때문입니다.
예를 들어, 같은 사장님이 운영하시는 뚜루뚜루 빵집 2개가 있다고 가정해보겠습니다. 뚜루뚜루 빵집 1호점에서는 소보로빵 30개, 도넛 20개, 식빵 10개를 팔았고, 2호점에서는 소보로빵은 하나도 안 팔리고, 도넛 30개, 식빵 20개, 머핀 10개를 팔았습니다.
뚜루뚜루 빵집 사장님이 원하는 것은 2개 점포의 통합관리를 통해 재료비 등을 아끼고, 점포 간에 빵 물량 조정에도 용이할 것 같습니다. 그렇다면 기본적으로 사장님은 빵 종류별로 몇 개나 팔았는지 궁금하다면 다음과 같이 나타낼 수 있을 거예요.
1호점과 2호점 빵 종류별 판매량 데이터를 하나로 묶음으로써 빵 종류별 1호점과 2호점의 판매량 데이터를 만들 수가 있습니다. 이렇게 보면 2호점에서 제고로 남을 것 같은 소보로 빵을 1호점으로 보내고, 1호점에서 잘 팔리지 않는 머핀을 2호점으로 보낼 수가 있겠네요!
이처럼 2개 이상의 데이터 프레임(표나 엑셀 형태의 데이터라고 이해해요)을 공통된 값을 기준으로 하나로 합치는 것을 병합(Merge)이라고 합니다. 이때 데이터를 합치는 기준이 되는 공통 값을 키(Key)라고 하고, 두 데이터 프레임에서 별도로 참조되는 2개 이상의 데이터들을 값(Value)이라고 합니다.
보다 구체적으로 살펴보면, 데이터 병합(Merge) 방법 4가지가 있습니다. 여기서도 그 용어보다는 개념에 유의하면서 알아보도록 해요.
첫 번째는 2개의 데이터 프레임에서 공통되는 부분만 뽑고, 나머지 부분은 삭제하는 방식입니다. 우리에게 흔한 개념은 바로 교집합이 있겠네요. 교집합은 두 집합에서 공통적으로 들어간 데이터를 뽑아내는 방식입니다.
얘를 들어, 다음 애니메이션에서처럼 왼쪽의 데이터 프레임 1,2,3에 x값이 들어있고, 오른쪽 데이터 프레임 1,2,4에 y값이 들어있다면, 교집합(inner) 방식은 왼쪽과 오른쪽 데이터 프레임에서 공통적으로 포함된 데이터 1,2의 x, y값만을 병합시켜주고, 포함되지 않은 3,4는 버려주는 방식입니다.
두 번째는 2개의 데이터 프레임에서 공통되는 부분뿐만 아니라, 나머지 부분까지도 합쳐주는 방식입니다. 우리에게 흔한 개념은 바로 합집합이 되겠습니다. 합집합은 두 집합에서 왼쪽 집합에만 포함된 데이터 + 공통적으로 들어간 데이터 + 오른쪽에만 포함된 데이터 모두를 뽑아내는 방식입니다.
다음 애니메이션에서 설명해보겠습니다. 아까와 마찬가지로 왼쪽의 데이터 프레임 1,2,3에 x값이 들어있고, 오른쪽 데이터 프레임 1,2,4에 y값이 들어있다면, 합집합(Outer) 방식은 왼쪽과 오른쪽 데이터 프레임에서 공통적으로 포함된 데이터 1,2의 x, y값뿐만 아니라 다른 한쪽에 포함되지 않은 3,4도 함께 합쳐주는 방식입니다. 이때 한쪽에만 값이 있고 다른 쪽에는 값이 없는 부분은 NaN(Not a Number)로 값이 표시됩니다.
이 방식이 바로 아까 뚜루뚜루 빵집의 1, 2호 점 빵 종류별 판매량 데이터를 병합한 방식입니다.
세 번째 방식은 왼쪽에 있는 데이터 프레임의 값을 기준으로 데이터를 병합하는 방식입니다. 따라서 왼쪽에는 없고 오른쪽에만 있는 값인 4번(보라색)은 삭제됩니다. 반대로 왼쪽에 있는 2번의 값이 오른쪽 데이터 프레임에 2개의 값이 존재한다면, 왼쪽의 2: x2 값이 복사되어 둘로 표시가 됩니다.
마지막으로 오른쪽에 있는 데이터 프레임의 값을 기준으로 데이터를 병합하는 방식입니다. 세 번째 왼쪽 기준 방식과 반대가 되겠습니다. 따라서 오른쪽에는 없고 왼쪽에만 있는 값인 3번(초록색)은 삭제됩니다.
그런데 사장님께서는 이런 생각이 들었어요. '빵이 팔리는 데이터를 시간대별로 분석해 볼 수는 없을까? 그것도 1, 2호점 다 합쳐서 데이터를 길게 붙여보고 싶어!'
1호점과 2호점 판매 데이터를
붙일 수는 없나요?
그래서 1호점 시간대별 빵 판매 데이터와 2호점 시간대별 빵 판매 데이터를 세로로 붙어보기로 합니다. 각각의 데이터에서 시간, 빵 종류, 판매량을 열 이름으로 갖고, 시간 순서대로 판매가 기록된 데이터를 얻었습니다.
그리고 동일하게 생긴 2개의 데이터 프레임을 세로로 붙어봅니다.
이렇게 2개의 데이터 프레임을 서로 연결하여 합치는 것을 '데이터 잇기'라고 합니다. 많은 프로그래밍 언어에서는 Concatenate(사슬 같이 잇다) 줄여서 Concat(컨캣)으로 표현합니다.
이렇게 1호점과 2호점의 시간대별 빵 판매 데이터를 이어서 연결해주었습니다. 그리고 '시간' 열을 기준으로 아침부터 저녁까지 오름차순으로 정렬을 해보았습니다.
그랬더니 사장님이 의도했던 대로 오전 시간에는 아침식사용으로 쓸 수 있는 식빵이 많이 팔렸고, 오후 시간에는 피곤을 달래줄 달콤한 도넛이 많이 팔렸습니다. 사장님은 각 지점장에게 지시합니다. "오전에는 식빵을, 오후에는 도넛을 좀 더 준비해주세요!" 그리고 이렇게 생각합니다.
데이터를 연결해보니 생각보다 유용한 걸!
데이터를 기반으로 빵의 수요와 공급관리를 했더니 빵집의 매출 성장세가 눈에 띄게 좋아졌습니다. 그리하여 사장님의 빵집의 꽃인 "케이크"에 대한 데이터 관리에 도전합니다. 그런데 문제가 발생했습니다. 케이크에 대한 데이터가 우리가 흔히 아는 이름의 케이크와는 많이 달랐습니다.
[판매 데이터] ≠ [공급 데이터]
케이크명 ≠ 케이크 코드
이를 어쩌죠? 실컷 판매를 했는데, 케이크 판매 데이터에는 "베리베리 후레쉬"와 같이 새로 붙인 케이크명 이름만 나와 있고, 케이크 공급업체에서 받은 데이터에는 "생크림 3호"와 같은 케이크 코드만 있었습니다. 아니 이걸 다 어떻게 고치지?!! 또 중간에 바뀐 코드가 있는지도 미지수였습니다.
이럴 때 등장하는 개념이 바로 데이터 매핑(Mapping)입니다. 데이터 매핑은 두 개의 서로 다른 데이터가 만들어지고 이러한 데이터 간의 연결이 정의되는 프로세스입니다.
사실 이러한 데이터 매핑 작업은 데이터가 표준화되어 있지 않은 회사에서 자주 발생하는 상황입니다.
데이터 맵핑을 위해서는 서로 다른 데이터 간에 연결을 해주기 위한 정의가 필요합니다. 여기서 말하는 데이터의 정의가 바로 "베리베리 후레쉬 : 생크림 3호" , "하얀 눈꽃송이 : 생크림 2호"와 같은 또 다른 데이터 프레임입니다. 우리는 이렇게 별도로 데이터 정의를 내린 데이터를 메타 데이터라고 합니다.
제가 다양한 데이터 분석을 통해 경험한 사례에서 실제 많이 발생하는 예는 이렇습니다.
사내에 영업팀과 제작팀이 있다고 가정해 보겠습니다. 영업팀은 제품 1, 2, 3에 대해 분류코드를 다음과 같이 3단계로 관리하고 있습니다.
제품 1 : 전자> TV> LCD
제품 2 : 컴퓨터> 프린터> 잉크젯
반면에 제작팀은 제품 1, 2, 3을 다음과 같이 2단계로 분류합니다.
제품 1 : 가전제품> 텔레비전
제품 2 : 사무용품> 프린터
이렇게 팀별로 분류코드가 단계도 다르고 분류명도 다를 때 어떻게 접근해야 할까요? 정답은 바로 데이터 표준화입니다. 데이터 표준화는 기업의 시스템별로 산재해 있는 데이터에 대한 용어, 정의, 구조, 타입에 대한 기준을 수립하고 전사적으로 동일한 해당 기준을 적용하는 것입니다. 이렇듯 데이터 매핑은 여러 데이터의 통합을 위한 초기 단계 역할을 합니다.
데이터 파워풀하게 활용하는 사고방법인 ①붙이기(Merge & Concat) ②짝짓기(Mapping) ③집계하기(Groupby & Aggregation) 중 첫 번째와 두 번째에 대해 알아보았습니다. 다음 시간에는 데이터 집계하기에 대해서 마저 배워보도록 할게요. 감사합니다.