Yours Ever, Data Chronicles

쇼핑몰 데이터 주문 수 분석하기 (월별, 상품별) -2편 / 파이썬 데이터 분석 실무 테크닉 100 본문

Data Science/Analysis Study

쇼핑몰 데이터 주문 수 분석하기 (월별, 상품별) -2편 / 파이썬 데이터 분석 실무 테크닉 100

Everly. 2022. 1. 12. 22:45

저번 포스팅에 이어서 이번에는 본격적으로 쇼핑몰 데이터의 주문 수를 기준으로 분석해 보겠습니다.

저번 포스팅에선 주어진 데이터가 있을 때, 어떻게 데이터들을 결합시키고 필요한 열을 만드는지를 위주로 보았습니다. 이번엔 만든 "join_data"를 가지고, 본격적인 분석을 시작해 보겠습니다!  

 

앞서, 의뢰가 들어온 쇼핑몰에서는 현재 전체 매출액만 알고 있을 뿐, 데이터와 관련한 정보는 하나도 아는 것이 없었습니다. 우리는 이 데이터를 바탕으로 인사이트를 찾아야 하는데, 분석에 앞서 스스로 "질문해보는 것"이 아주 중요합니다. (궁금한 게 있어야 분석을 할 수 있으니까요!) 어떤 점이 궁금한가요?  

 

궁금한 게 마땅히 떠오르지 않는다면, 먼저 데이터의 현 상황부터 파악해 봅시다!

 

✔Table of Contents

     

    Tech 7. 각종 통계량을 파악하자.

    이러한 케이스처럼 데이터로 정말 아무 것도 모를 때! 그럴 때엔 먼저 통계량을 보고 데이터에 관한 질문거리를 생각해보는 것도 좋아요. 통계량 파악은 2가지가 있습니다.

     

    첫째, 결측치가 있는지 파악한다!

    둘째, 기초통계량을 파악한다! 

     

    두 가지는 파이썬에서 정말 간단한 코드로 확인 가능합니다.

    #결측치
    join_data.isnull().sum()

     

    결측치는 모든 열에서 (다행히) 나타나지 않네요. 결측치가 꽤 많은 데이터라면 손이 많이 갑니다. 결측치가 많을 때 필요한 힘든 전처리는 그 다음 챕터(2장)에서 알아보도록 하고, 여기선 그냥 넘어갑니다.

     

    #기초통계량
    join_data.describe()

     

    기초통계량은 describe라는 메서드를 활용해 아주 간단하게 알아볼 수 있습니다. 숫자값을 갖는 연속형 데이터에 관련한 다양한 통계량이 뽑힙니다. 평균(mean), 표준편차(std), 최대값, 최솟값, percentile 등.. 

    위의 기초통계를 해석하는 것이 데이터 사이언티스트의 의무입니다.(정말 간단한 거라도 좋아요!) 예를 들면 이런 식으로 생각해봐야 합니다. 그리고 궁금한 것, 새로운 것들을 뽑아서 이후 분석에 활용합니다!
    - price에선 가장 비싼 게 42만원(-> 가장 높은 단가 21만원 컴퓨터 2대를 샀군?). 평균은 13.6만원 정도네. 
    - quantity를 보면 평균적으로 1.2대, 75% percentile은 1이므로, 보통 1대 정도를 사는구나.
    - age 평균은 50세. 좀 나이가 많은 분들이 구매를 하는 듯.. 나이 범위는 20세~80세로 넓다.
    - item_price(상품가격)은 평균이 12만원, 가장 싼거는 5만원~비싼건 21만원.

     

    참, 데이터의 산정 기간이 언제인지도 꼭! 알아봐야 해요!! 

     

     

    여기서는 2019년 2월부터 7월까지의 데이터만 있네요.

     

    위에서 살펴본 바를 바탕으로 한번 데이터에 관해 궁금한 점들을 스스로 생각해봅니다. 

    예를 들면 이런 것들이 있습니다.

    Q. 가장 잘 팔린 시기가 있는지 궁금해요. (사계절 중 언제 가장 잘 팔리나? 시계열의 영향을 받는가?)

    Q. 가장 잘 팔린/안 팔린 상품은 무엇인지 궁금해요.

    Q. 어떤 상품이 매출에 가장 큰 영향을 주는지/안 주는지 궁금해요.

    Q. 가장 많이 산 고객은 누구인지, 이러한 헤비 유저들은 어떤 특성을 갖고 있는지 궁금해요.

    Q. 많이 안 산 고객은 누구고, 언제를 마지막으로 더 이상 사지 않았는지 궁금해요.(얘네는 왜 안 샀을까?)  

    등등...

    정말 질문할 것들은 많죠!  

    오늘은 이 중에서도, 가장 기본인 월별, 상품별 주문과 관련한 데이터 분석을 어떻게 하는지를 알아봅니다.

     

     

    Tech 8. 월별 데이터 집계하기 (날짜형: datetime)

    전체적인 분위기를 파악했으므로, 월별로 매출현황이 어떻게 되는지를 알아봅니다. 
    월별로 전체적으로 매출이 늘어나고 있는지, 줄어들고 있는지를 파악해봅시다.

     

    월을 떼기 위해선 날짜형 변수에서 '연-월'을 떼어낼 것입니다. 날짜형 변수인 payment_date의 데이터 타입은 object로 문자형이네요. 추후 활용을 위해 이를 날짜형 타입(datetime)으로 바꿔줍니다. (object to datetime)

     

    join_data['payment_date'] = pd.to_datetime(join_data['payment_date'])
    join_data.dtypes

     

    잘 바뀌었네요!

    현재 payment_date의 형식은 2019-02-01 01:36:57 처럼 되어 있는데, 이걸 '2019-02'로 떼어내고자 합니다. 파이썬에선 datetime 타입인 경우는 dt 연산자를 사용하여 연-월만 떼어낼 수 있습니다.

     

    join_data['payment_ym'] = join_data['payment_date'].dt.strftime("%Y-%m")
    join_data.head()

     

    이제 payment_ym 이라는 새로운 열은 '2019-02'처럼 연-월로만 되어있는 형태가 되었습니다.

     

     

    dt 연산자는 아주 유용해서 날짜형 변수이면 꼭! datetime 형태로 데이터 타입을 변화해주는 게 좋습니다.

    dt 연산자 뒤에 여러 메서드를 붙여 새롭게 가공할 수 있는데요! 여기선 strftime을 활용해 연-월만 떼주었지만 이것 말고도 month만 쓰면 월만 떼고 day만 쓰면 일만 떼주는 등 다양한 쓰임새가 있습니다. 

     

    이제는 그럼 연월을 기준으로, price의 합계가 얼마인지를 알아봅니다. groupby 메서드를 사용하면 되겠죠?

     

     

    보면, 5월에 가장 적고 7월에 가장 많은 것 같네요. 

    그런데 이렇게 숫자로만 나타내면 보기가 좀 힘드므로, 시각화해줍니다. (데싸라면 남들에게 공유할 땐 언제나 가장 쉽고, 이해하기 좋게 보여주는 게 가장 중요합니다.)

     

    #눈으로 보기 쉽게 하기 위해 시각화 
    import matplotlib.pyplot as plt
    plt.plot(join_data.groupby('payment_ym')['price'].sum())

     

    5월에 가장 적고 7월에 가장 매출이 크다는 게 확 들어옵니다.

    보통 1억 6천 정도의 매출이 나오는 것 같네요.

     

    이번엔 월별뿐 아니라, 상품별로도 어떤 것이 가장 잘 팔리는지를 알아봅니다.

     

     

    Tech 9. 월별, 상품별로 데이터를 집계해 보자. (pivot_table)

    사실 얼핏 보면 쉬운데요! 이번엔 groupby의 대상에 연월(payment_ym)과 상품명(item_name)만 넣으면 되는 거 아니야? 하겠지만..

     

     

    이처럼 봤을 때 이해하기 어려운 형태로 출력됩니다.(너무 길어서 사진 잘랐음) 좀 더 직관적으로 이해하기 쉬운 형태는 없을까요?

    있습니다! 바로 pivot_table 메서드를 활용합니다.

    가로열(index)로는 item_name(상품명)을 넣고, 세로열(columns)로는 payment_ym(연월)을 넣어 price와 quantity의 합계값을 표 형식으로 만들어줍니다. -> 즉, 상품 및 연월별 price / quantity 합계를 표시해줍니다.

     

    #df.pivot_table(index, columns, values, aggfunc)
    join_data.pivot_table(index = 'item_name', columns = 'payment_ym', values = ['price', 'quantity'], aggfunc = 'sum')

     

    위의 표를 보면, 그래도 어떤 상품이 언제 많이 팔렸는지를 좀 더 한 눈에 볼 수 있죠? 가장 많이 팔리는 것은 PC-A이고, 가장 적게 팔리는 것은 PC-C와 D 군요(quantity(개수) 참고). 

    매출인 price를 봤을 땐 PC-E가 가장 효자 역할을 하고 있네요. 

     

    하지만 그래도 역시 한 눈에 들어오지 않기 때문에, 시각화가 필요합니다.

     

     

    Tech 10. 상품별 매출 추이를 시각화하자.

    이번엔 피벗테이블의 위치를 좀 바꿉니다. price에 대해서만 집계하고, 가로열(index)를 연월, 세로열(column)을 상품명으로 합니다. 

     

     

    월별, 상품별 price의 합계입니다. 이를 그래프로 만드는 방법은 여러 가지인데요! 

    가장 간단한 방법은 위 데이터 전체를 plot에 넣어주는 방법입니다.

     

    plt.figure(figsize=(8,5))
    plt.plot(graph_data)

     

    하지만 어떤 상품명인지를 몰라서 알아보기 힘듭니다. legend(범례)를 달아줍니다.

     

    plt.figure(figsize=(8,5))
    plt.plot(graph_data)
    plt.legend(graph_data.columns) #이렇게 legend에 라벨 달아주기

     

    이렇게 그냥 데이터프레임인 graph_data 자체를 plt.plot에 넣어줘도 그래프가 그려지는 이유는 무엇일까요?  

    graph_data라는 데이터프레임이 피벗테이블이기 때문인데요!

    이 피벗테이블은 인덱스는 연월(가로축), 컬럼은 상품명(세로축)입니다. 그래서 그냥 plot을 써도 가로축엔 연월이, 세로축엔 상품별 price합계가 선그래프로 그려지는 것인데요. 

    graph_data의 컬럼값엔 상품명이 들어가 있으니 plt.legend에 컬럼값을 인자로 넣어주면 범례가 달리는 것입니다.

     

    책에 나온 방식처럼, 일일이 그래프를 상품별로 하나씩(총 5개) 그려줘도 됩니다.

     

    plt.figure(figsize=(8,5))
    plt.plot(list(graph_data.index), graph_data['PC-A'], label = 'PC-A')
    plt.plot(list(graph_data.index), graph_data['PC-B'], label = 'PC-B')
    plt.plot(list(graph_data.index), graph_data['PC-C'], label = 'PC-C')
    plt.plot(list(graph_data.index), graph_data['PC-D'], label = 'PC-D')
    plt.plot(list(graph_data.index), graph_data['PC-E'], label = 'PC-E')
    plt.legend()

     

    이 방법은 굳이 graph_data라는 데이터프레임 전체를 넣지 않고, 따로 떼어서 넣어준 것입니다.

    가로축엔 graph_data의 인덱스(연월), 세로축엔 graph_data의 컬럼(상품명) 을 넣어준 것이죠! 

    이 코드 한 줄 실행시 그래프가 하나씩 그려지게 됩니다. 그래서 총 5번 그려져서 위 그래프가 그려집니다.

     

    저는 이를 좀 더 응용하여 자동화해봤습니다.

     

    #자동화 
    plt.figure(figsize=(8,5))
    sy = list(graph_data.columns)
    for ind, value in enumerate(sy):
        plt.plot(list(graph_data.index), graph_data[value], label=value)
    plt.legend()

     

    원리는 같은데, 총 5번 그릴 것을 for문을 활용해 1줄로 압축했습니다. 만일 범례 수가 5개를 넘어간다면 일일이 치기 귀찮으니 활용하기 좋은 방법이겠죠?

     

    참! 이 그래프를 보여주면서 해석을 잊으면 절대로 안 됩니다. 이렇게 해석할 수 있겠습니다.

    그래프를 보면 PC-E가 가장 매출을 견인하는 기종입니다. 이 기종은 5월에 잠깐 매출이 안 나왔다가 6월에 회복, 7월에 다시 상승세를 보이며, 그렇기에 전체 상품 매출액 또한 5월엔 매출이 적었다가 6월부터 회복하는 양상을 보입니다.

     

    이렇게 '파이썬 데이터 분석 실무 테크닉 100' 책의 1장 공부는 마무리합니다! 다음 포스팅에선 2장 공부로 찾아뵙겠습니다 :) 

    반응형