티스토리 뷰

파이썬 시각화 과정 중 이해가 되지 않았던 부분

고객 세그먼트별(Top 20, Bottom 20, Middle) Fashion News 구독 여부를 비교하는 과정에서 각 세그먼트별로 전체를 100으로 두고 구독 여부를 누적합 형식으로 비율 비교를 하고 싶었는데, 첫번째 줄과 두번째 줄의 코드가 이해가 잘 되지 않았다,,
segment_FN = merged_df.groupby(['Segment','FN']).size().unstack()  # groupby를 하면 두개 컬럼 다 행에 있는데, 피벗테이블처럼 구분하기 위해서 .unstack()을 사용해서 FN 값을 열로 바꿔줌
segment_FN_pct = segment_FN.div(segment_FN.sum(axis=1), axis=0) * 100  # sum(axis=1)으로 여러개 열을 하나로 합침 → segment별로 sum, axis=0 기준으로 div 해서 FN별로 비율 나눔

segment_FN_pct.plot(kind='bar', stacked=True, figsize=(10,6))
plt.title('Segment-FN(%)')
plt.ylabel('Percentage(%)')
plt.legend(title='FN (0 or 1)')
plt.xticks(rotation=0)
plt.show()

 

개념 정리)

개념적으로 axis=0은 행(Row), axis=1은 열(Column)

그런데 왜 함수마다 다르게 느껴지냐면, 판다스에서 이 축 번호를 "대상을 지칭할 때" 쓰느냐, "움직이는 방향을 말할 때" 쓰느냐의 차이 때문이라고 한다.

 

1. sum(axis=1) : "열(Column)들을 가로질러라"

sum이나 mean 같은 집계 함수에서 axis는 "어느 축을 없애버릴(합칠) 것인가?"를 묻는 것

  • axis=1(열)을 선택하면: 여러 개였던 열(Column)들을 하나로 합치면서 가로 방향으로 계산
  • 그 결과, 행(Row)별 합계가 남음

2. div(..., axis=0) : "행(Row)에 주파수를 맞춰라"

나누기(div), 빼기(sub) 같은 연산 함수에서 axis는 "어느 축을 기준으로 정렬해서 계산할 것인가?"를 묻는 것입니다.

  • 위에서 만든 합계 데이터(Series)는 인덱스가 'Top_20', 'Middle' 같은 행 이름으로 되어 있는데
  • 이걸 전체 데이터프레임과 계산하려면, 행(Row, axis=0)끼리 서로 이름이 맞는지 확인하며 나눠야 한다
  • 그래서 "행 축(axis=0)을 기준으로 줄을 세워라"라고 명령하는 것!

💡 헷갈리니까 딱 이렇게만 기억하자!

판다스에서 axis를 이해하는 가장 쉬운 물리적 방법!

  • axis=0 (행 축): 위 ↓ 아래 방향으로 작용 (위아래로 더하거나, 행끼리 비교함)
  • axis=1 (열 축): 왼쪽 → 오른쪽 방향으로 작용 (좌우로 더하거나, 열끼리 비교함)
  • df.sum(axis=0): a+c, b+d (세로로 더함 → 결과는 열별 합계)
  • df.sum(axis=1): a+b, c+d (가로로 더함  결과는 행별 합계)

데이터가 아래와 같은 표(DataFrame) 형태라고 가정해 보자

Segment Channel 1 Channel 2
Top_20 80 20
Bottom_20 30 70

1단계: 행별 합계 구하기 (.sum(axis=1))

먼저 각 세그먼트의 전체 구매 건수를 구한다 (axis=1은 가로 방향으로 더하라는 뜻!)

  • Top_20: 80 + 20 = 100
  • Bottom_20: 30 + 70 = 100

이 결과값은 [100, 100]이라는 형태의 Series(열)가 된다

 

2단계: 줄 맞추기 (.div(..., axis=0))

이제 원본 표의 각 숫자들을 위에서 구한 합계로 나눠야 한다

여기서 axis=0을 쓰는 이유는 "왼쪽에 있는 'Top_20', 'Bottom_20'이라는 행 이름(인덱스)을 기준으로 줄을 맞춰서 나눠라"는 뜻!

판다스는 내부적으로 아래와 같이 계산한다

  • Top_20 행: [80, 20]을 합계인 100으로 각각 나눔 [0.8, 0.2]
  • Bottom_20 행: [30, 70]을 합계인 100으로 각각 나눔 [0.3, 0.7]

3단계: 백분율로 변환 (* 100)

마지막으로 0.8에 100을 곱해 우리가 흔히 아는 80%라는 숫자를 만든다!


커머스 데이터로 시각화하는 과정에서의 사고 흐름 기록

매출 추이는 11월이 제일 높긴하네?
> 색깔별로 분리해서 보니까 그 중에서도 11월에는 빨강이 더 많이 팔렸네
> 그럼 11월에 팔린 빨강, 녹색 중에는 어떤 제품들이 있을까?
> 스웨터나 가디건이 속해있는 Garment Upper body가 월등히 높긴하네
> 근데 11월에 매출이 높은 이유가 블랙 프라이데이 할인 때문일까? 아니면 크리스마스 특수성 때문일까?
> 제일 매출 많았던 6월이랑 빨강, 녹색 옷만 한번 비교해볼까?
> 전체 매출은 6월이 높지만 빨강, 녹색 옷은 11월이 좀 더 높은 것 같은데?
> 판매량(Quantity) 값이 없긴 하지만 하나의 행 당 한개 구매라고 가정하고 판매 개수를 볼까?
> 11월이 더 많긴 한데, 매출이 많이 차이났던 이유는 아무래도 평균 단가가 겨울 옷이 높아서겠구나

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함