기획자, 혼자서 해보는 매출 데이터 분석하기
도자기 제조업은 코로나 타격을 크게 받은 업종이다. 영업 시간, 인원 제한 등으로 식당들의 영업이 예전만 못하고 새로 오픈하는 식당도 없기에, 그릇 판매량도 덩달아 낮아졌다. 도자기 공장을 운영하시는 부모님을 뵈러 설 연휴에 본가에 내려갔다. 몇 달 전부터 조금씩 늘어나는 주문량에 다행이라는 부모님을 뵈니, 뭔가 도와드릴 방법이 없을까 고민했다.
공장에서 만드는 제품의 폭은 매우 넓은데, 제품 그룹만 해도 12개 정도가 된다. 하지만, 코로나 펜데믹 이후로 공장에 상시 출근하는 직원 수가 줄어들 수 밖에 없었고, 이전만큼의 속도로 제품 생산은 힘들었다. 생산 리소스가 줄어들었다면, 제품을 효율적으로 생산해야만 한다. 지금까지 매출 데이터를 분석해 인사이트를 제공하면, 부모님의 공장 운영에 도움이 되지 않을까? 참고로 필자는 데이터 분석가는 아니고, PM이 메인이다. 데이터 분석 공부를 독학한 수준이니, 조금만 공부해도 이 정도는 누구나 할 수 있다!
데이터 분석 과정은 크게 아래와 같다. 가장 먼저 '분석 목표'를 설정해야 한다. 목표를 정하지 않은 체, 무턱대고 분석을 시작하면 데이터 바다에 매몰되기 쉽다. 무엇을 검증하고 싶은지 명확히 해야지, 이후의 분석 과정이 효율적으로 진행된다. 목표를 설정했으면, 관련된 데이터를 수집하고 전처리를 한다. 분석에 용이하도록 재가공된 데이터를 뜯어보고, 시각화를 통해 핵심 인사이트를 수집한다.
총 12개의 브랜드 중에서 어떤 브랜드가 주력인지 알아내는 걸 목표로 삼았다. 분석은 python의 pandas와 seaborn library를 활용한다. pandas와 seaborn이 뭔지 모르겠다면, 아래 링크를 참고하자!
분석에 활용할 데이터를 매출 관리 시스템에서 csv에서 추출하고, 이를 pandas로 읽어왔다. 로우 데이터를 곧바로 분석하기 힘들니, 분석에 용이한 형태로 바꾸기 위해 전치리를 진행했다.
직접 데이터를 훑어본 결과, 칼럼명과 일부 상품명에 오탈자를 찾았다. 칼럼명의 경우, '상품명'을 '상 품 명'으로 적힌 것처럼, 불필요한 띄어쓰기가 있다. 일부 상품명에서 '라이트'를 '라이드'로 쓰기도 했고, '흰색'과 '화이트'를 혼용해서 사용했다. 칼럼명은 깔끔하게 바꾸고, 상품명은 같은 단어로 통일했다.
데이터의 상품명 칼럼은 2가지 정보를 담고 있는데 (1) 브랜드 이름과 (2) 품목명이다. 예를 들어, '불뚝 뚝배기'에서 '불뚝'은 브랜드고, '뚝배기'는 품목을 뜻한다. 앞으로 '브랜드', '품목', '상품(브랜드 + 품목)'을 구분해서 쓸 예정이다. 분석 목표가 '주력 브랜드'를 찾는 것이므로 '상품명' 칼럼을 '브랜드' 칼럼과 '품목' 칼럼으로 쪼개야 한다. 또한, 데이터 시각화를 돕는 seaborn이 문자 데이터를 받지 못하기 때문에, 각 브랜드마다 id 값을 부여한다.
pandas로 읽은 csv 파일 내 데이터는 모두 object(=string) 타입이므로, 각 데이터를 적절한 타입으로 다시 바꿔줘야 한다. 데이터 타입까지 설정이 완료되면, 전처리 과정이 끝난다. 최종적으로 12개의 브랜드에서 10,608의 판매 건 수를 확인할 수 있다.
전처리가 끝났으니, 이제 데이터를 분석할 차례다. 같은 브랜드에 속한 품목의 판매가를 쭉 나열해서 가격 탄막을 확인해보자. 정석대로라면 매출 데이터가 아닌 상품 데이터를 봐야하지만, 매출 데이터에서도 상품 단가가 적혀있고, 모든 상품이 1번 쯤은 팔렸으니 데이터 누락은 없을 것이다. 사실 이러면 안 된다. 제대로 된 분석을 하고 싶다면, 상품 데이터를 보도록 하자 가격 탄막을 알기 위해서 '브랜드', '품목', '품목의 원가' 정보가 필요하다.
동일 품목의 중복 집계를 막기 위해, 매출 데이터에서 상품명을 기준으로 한 고유 데이터를 추출한다. 가격 탄막을 boxplot으로 그려보고, 탄막을 이루는 개별치를 stripplot으로 시각화한다. boxplot은 상자 수염이라는 그래프를 보여주며, 여기서 백분위를 기준으로 데이터 분포를 확인할 수 있다. 박스는 1분위와 3분위를 가리키고, 박스 안에 있는 선은 2분위(중앙값)을 가르킨다. 상자 위와 아래에 있는 선은 최솟값, 최대값을 나타내고, 이 선 너머의 값은 아웃라이어로 분류된다.
박스 그래프를 보면, 가격 탄막이 낮은 브랜드와 높은 브랜드가 확실히 구분된다. 중앙값을 기준으로 본다면, 브랜드를 크게 5 천원 이하, 5 천원 ~ 8 천원 사이, 8 천원 이상으로 나눌 수 있다.
가격 탄막를 알았으니, 이제 판매량을 보자. 각 브랜드가 하루에 몇 개나 팔리는지 집계하고, 일 별 판매량의 분포도를 보면 꾸준히 팔리는 브랜드를 알아낼 수 있다. groupby 메소드를 이용해 브랜드와 날짜를 기준으로 그룹핑해, 브랜드 별 일별 판매량을 알아낼 수 있다.
그래프를 보면, 불뚝 브랜드가 타 브랜드보다 일 판매량이 높은 것을 알 수 있다. 불뚝을 제외하고, 가격 탄막이 높은 브랜드는 낮은 판매량을, 가격 탄막이 낮은 브랜드는 높은 판매량을 보여주고 있다. 단가가 낮은 상품은 많이 팔리고, 단가가 높은 상품은 적게 팔리는 국룰적 상황이다.
앞선 과정과 동일하게, 브랜드별 일별 매출을 나열해서, 꾸준히 매출을 내는 브랜드를 찾을 수 있다. 확인 결과, 타 브랜드 대비 불뚝이 압도적으로 높음을 볼 수 있다.
그렇다면, 불뚝을 잇는 상품은 뭐가 있을까? 불뚝에 이어 투톤이 가장 높은 위치에 있지만, 데이터 포인트를 보면 알 수 있듯이 적은 표본으로 인한 오류다. 표본 수를 고려해 본다면, 화이트, 설중매와 고백자가 불뚝의 뒤를 잇는 브랜드임을 알 수 있다.
최종적으로, 공장의 주력 브랜드는 불뚝임을 알 수 있다. 역시 한국인은 뚝배기다.
투두몰 OBT App에서 데이터 시각화 클래스를 오픈할 예정입니다! 관심이 있다면, 지금 바로 OBT 사전 신청을 등록해주세요.