• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    미해결

데이터분석 질문...

20.07.15 15:25 작성 조회수 194

0

pandas-brazilian-ecommerce-EDA2에서 payments 데이터폼을 분석하는 도중에 각 결재수단(payment_type)이 얼마나 이용되었는지에따른 그래프를 그리는 예제에 대한 질문입니다.

현재 payments 파일을 검색해본결과 

전채 행의 개수는 103883개인 반면

payments['order_id'].nunique() 는 99437개인것을 알수있었습니다. 즉 primarykey와 같은 unique한 column이 아닌것같습니다. 따라서 payments[payments.duplicated(['order_id']) == True]로 검색해본결과 4446개의 row를 검색할수있었습니다! 즉, 4446개의 행은 order_id가 한번이상이라도 중복된 값을 가지고있다는 것입니다! 

이에,
payment_type_count = payments.groupby('payment_type')['order_id'].nunique().sort_values(ascending=False)
는 

payment_type
credit_card    76505
boleto         19784
voucher         3866
debit_card      1528
Name: order_id, dtype: int64

라는 결과를 도출하고 해당값들을 sum한결과 103883에 미치지못하고

payment_type_count2 = payments.groupby('payment_type').count()['order_id'].sort_values(ascending=False)
는 

payment_type
credit_card    76795
boleto         19784
voucher         5775
debit_card      1529
Name: order_id, dtype: int64

라는 결과를 보여주며 각 해당값의 합은 103883이 나옵니다.

첫번째 경우, 동일한 order_id가 동일한payment_type에대해서 여러행이 나오면 그 여러행을 한개로 세어버립니다. 두번째 결과로는 각기다른 행들에 대해 해당행의 개수만큼 count를 합니다.

따라서 여쭤보고싶은내용은, order_id와 같이 primary key가 아닌경우 (unique한 값을 가지고있지않은경우) payment_type별 개수를 구하기위한것과같이 사용할때에는 2번째 방법처럼 groupby().count()처리를 하는것이 올바른 방법인가? 입니다!! 물론 order_id가 각 order에 대해 유일한 값으로 사용되었을경우에는 2가지 방법모두 동일한 결과를 도출할것으로 생각하고있습니다! 

항상 성심성의껏 답변해주셔서 감사하게생각합니다..ㅠㅠ 수강후기도 인터넷에 이번주일요일까지 작성해보도록하겠습니다!

답변 1

답변을 작성해보세요.

0

안녕하세요. 가장 열심이신데... 예리하시고, 질문이 정말 고민을 하신 질문이라... 저도 자꾸 빠져들고... 시간이 좀 걸리긴 하는데, 저도 찬찬히 볼수밖에 없네요.

제가 이 문제를 풀었을 때에는 

두 가지 조건을 생각했습니다.

1) 일단 payment_type 이 정의되어 있지 않은 데이터를 일단 삭제한다.

2) order_id 가 동일한 행은 하나로 카운트 한다. order_id 는 각 결재건마다 unique 하게 생성이되고, order_id 가 동일한데 여러 건이 있다는 것은 한번에 여러 물건을 결재하면서 각 물건당 지불금액을 표기한 것으로 정의한다. 즉, order_id 가 동일하다는 말은 결국 결재할 때 한번 결재한 것으로 정의한다. 그래서 말씀하신 첫번째 코드로 작성해서 다음과 같이 진행을 했는데요. 말씀하신 대로 order_id 를 다르게 생각한다면, 이에 따라 두번째 케이스도 의미있겠다는 생각은 듭니다. 다만 첫 번째와 같이 진행해도 본 강의가 분석 기술을 익히는 것이니까, 이 정도로 정의하고 이에 따라 분석한다면, 전체적인 맥락에서 큰 문제가 안될 것 같고요. 첫 번째 건이 보다 일반적인 경우로 보이긴 해요.

payments = payments[payments['payment_type'] != 'not_defined']

payment_type_count = payments.groupby('payment_type')['order_id'].nunique().sort_values(ascending=False)

두 번째 경우는 잘 상상이 안갔어요. 

이것이 총 결재건 수에서 각 지불방법에 따른 비율을 확인하는 것인데요. order_id 가 동일한데, 여러 결재건이 있는 경우는 통상적으로는 여러 물건을 한번에 결재했고, 이 때 각 물건에 대한 값이어야 합리적이긴 해서요. 그래서 브라질 이커머스 데이터에서도 동일한 정의를 하고 진행을 했습니다.

물론 저희가 실제 이 데이터가 어떻게 생성이 되엇는지까지 세세하게 파악할 수 있다면, 이 부분을 파악하면 경우에 따라 두 번째 경우가 맞을 수도 있겠는데요. 그럴 수 없다면, 가장 합리적으로 생각할 수 있는 방안으로 해당 데이터를 정의하고 해당 정의에 따라 분석을 하는 것이 보다 합리적인 접근이 아닐까 생각했습니다.

감사합니다.