HSEOM GeckoHSEOM
Instagram

흑섬 TECH 블로그 - 데이터 기반 브리딩 기술

레오파드게코 브리딩에 데이터 분석과 AI 기술을 접목합니다. Python, NumPy를 활용한 체중 관리, 성장 추이 분석, 환경 데이터 시각화 등 실무에서 직접 사용하는 기술을 일반인도 이해하기 쉽게 설명합니다.

주요 카테고리

Data Viz 카테고리

NumPy, Pandas를 활용한 데이터 분석과 시각화 기술을 일상 예제로 쉽게 설명합니다.

12개의 글이 있습니다.

[Step 3] 막대 그래프로 범주형 데이터 시각화하기 - pandas + matplotlib

월별 판매량, 제품별 성적, 분기별 매출... 범주로 나눌 수 있는 데이터라면 막대 그래프가 정답입니다. Step 3에서는 막대 그래프 그리는 방법을 배웁니다.

카테고리: Data Viz

작성일: 2026-01-20

예상 읽기 시간: 14

Back to Tech
Data Viz·14min read·

[Step 3] 막대 그래프로 범주형 데이터 시각화하기 - pandas + matplotlib

월별 판매량, 제품별 성적, 분기별 매출... 범주로 나눌 수 있는 데이터라면 막대 그래프가 정답입니다. Step 3에서는 막대 그래프 그리는 방법을 배웁니다.

시작하며 - "비교"를 위한 그래프

Step 1에서는 시간에 따른 변화를 선 그래프로 그렸고, Step 2에서는 두 변수의 관계를 산점도로 확인했습니다. 이번 Step 3에서는 조금 다른 질문에 답해봅니다. "카테고리별로 비교하면 어떨까?"

이런 상황들을 생각해보세요:

  • 1월부터 6월까지, 어느 달 판매량이 가장 많았을까?
  • 제품 A, B, C 중 어떤 제품이 가장 잘 팔렸을까?
  • 분기별 매출을 비교하면 어떤 추세가 보일까?
  • 레오파드 게코 개체들의 월별 체중 증가량은?

이런 질문들에 답할 때 사용하는 게 바로 막대 그래프(Bar Chart)입니다. 카테고리별로 값을 막대로 표현해서, 어느 것이 크고 작은지 한눈에 비교하는 거죠.

이 글은 데이터 시각화 Step 3로, 막대 그래프 그리는 방법론을 다룹니다. 예제로는 월별 판매 데이터를 사용하지만, 핵심은 범주형 데이터 비교 방법입니다.

Google Colab만으로 25분이면 완성할 수 있습니다. Step 1과 2를 해봤다면, Step 3는 더욱 재미있을 거예요!

막대 그래프가 필요한 실생활 상황들

본격적으로 시작하기 전에, 막대 그래프가 실제로 어떻게 쓰이는지 살펴볼게요. "이런 상황에서 쓰는 거구나!" 하고 감을 잡으시면 됩니다.

상황 1: 월별 판매량 비교

카페를 운영한다고 가정해볼게요. 1월부터 6월까지 매달 커피 판매량을 기록했다면, 막대 그래프로 그려보세요. 어느 달에 판매가 급증했는지, 어느 달이 부진했는지 한눈에 보입니다.

  • 가장 높은 막대 → 판매량이 가장 많았던 달
  • 가장 낮은 막대 → 판매량이 가장 적었던 달

상황 2: 제품별 매출 순위

온라인 쇼핑몰을 운영한다면, 제품 A, B, C, D, E 중 어떤 제품이 가장 잘 팔렸는지 막대 그래프로 순위를 매겨보세요. 가로 막대 그래프로 그리면 순위표처럼 보여서 더 직관적입니다.

상황 3: 분기별 실적 비교

사업 보고서를 작성할 때, Q1, Q2, Q3, Q4 분기별 매출을 비교하면 "어느 분기에 실적이 좋았는가?"를 한눈에 파악할 수 있습니다. 제품별로 색상을 다르게 하면 여러 제품의 분기별 매출을 한 그래프에 담을 수 있어요.

상황 4: 브리딩 - 개체별 월간 체중 증가

레오파드 게코를 키우면서 매달 체중 증가량(g)을 기록했다면, 막대 그래프로 "어느 달에 가장 빨리 자랐는가?"를 확인할 수 있습니다. 여러 개체를 비교하면 성장 속도 차이도 한눈에 보이겠죠.

상황 5: 비즈니스 - 채널별 유입 고객 수

웹사이트를 운영한다면, Google, Instagram, Facebook, 직접 유입 등 채널별로 유입된 고객 수를 막대 그래프로 그려보세요. "어느 채널에 집중 투자해야 할까?"를 데이터로 판단할 수 있습니다.

이제 감이 오시나요? 막대 그래프는 "카테고리별로 비교해서 누가 더 큰가?"라는 질문에 답하는 가장 직관적인 방법입니다.

환경 세팅 - Google Colab 준비

Step 1, 2를 따라 하셨다면 이미 익숙하실 거예요. 브라우저에서 colab.research.google.com에 접속하고, "+ New notebook"으로 새 노트북을 만드세요.

파일명은 bar_chart.ipynb로 저장하면 됩니다.

Google Colab 초기 화면

Google Colab 시작 화면 - '+ New notebook'으로 새 노트북 생성

라이브러리 설치

첫 번째 셀에 다음 코드를 입력하고 Shift + Enter를 누르세요:

!pip install pandas matplotlib
라이브러리 설치 성공 화면

pip install 실행 결과 - 'Successfully installed' 메시지 확인

각 라이브러리의 역할:

  • pandas: 표 형태 데이터 다루기 (DataFrame)
  • matplotlib: 그래프 그리기 (Step 1, 2에서 사용했던 그 라이브러리!)

데이터 준비 - pandas DataFrame으로 시작하기

막대 그래프는 보통 범주(카테고리)값(숫자)으로 이루어집니다. 예를 들어, "1월: 120개, 2월: 135개, 3월: 142개..." 이런 식이죠. pandas DataFrame을 사용하면 이런 데이터를 깔끔하게 정리할 수 있어요.

월별 판매 데이터 만들기

새 셀에 다음 코드를 입력하세요:

import pandas as pd

# Monthly sales data
data = {
    'Month': ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'],
    'Sales': [120, 135, 142, 158, 171, 165]
}
df = pd.DataFrame(data)
print(df)

Shift + Enter를 누르면 데이터가 표 형태로 출력됩니다.

pandas DataFrame 출력 - 월별 판매 데이터

DataFrame 출력 결과 - 월(Month)과 판매량(Sales) 데이터

보시다시피, 1월부터 6월까지 판매량이 점점 증가하는 것 같죠? 하지만 숫자만 봐서는 확신이 서지 않습니다. 그래프로 그려봐야 명확해집니다!

첫 번째 막대 그래프 그리기 - 세로 막대

이제 드디어 막대 그래프를 그려볼 시간입니다! 새로운 셀에 다음 코드를 입력하세요:

import matplotlib.pyplot as plt

# 한글 폰트 설정 (Google Colab용)
plt.rcParams['font.family'] = 'DejaVu Sans'

plt.figure(figsize=(10, 6))
plt.bar(df['Month'], df['Sales'], color='#3498db')
plt.title('Monthly Sales', fontsize=16, pad=20)
plt.xlabel('Month', fontsize=12)
plt.ylabel('Sales (units)', fontsize=12)
plt.grid(True, alpha=0.3, axis='y')
plt.tight_layout()
plt.show()

Shift + Enter를 누르면... 짜잔! 파란색 막대 그래프가 나타납니다!

첫 번째 막대 그래프 - 월별 판매량

첫 번째 막대 그래프 완성 - 월별 판매량 추이 확인

막대가 점점 높아지는 패턴이 보이죠? 1월부터 5월까지는 꾸준히 증가하다가, 6월에 약간 감소한 모습입니다. 숫자로만 봤을 때보다 훨씬 직관적이죠!

코드 이해하기

plt.bar(x, y): X축에 Month, Y축에 Sales를 막대로 표현
color='#3498db': 막대 색상 (파란색)
grid(axis='y'): Y축 방향으로만 격자선 표시

응용 1: 색상 그라데이션 + 값 표시

기본 막대 그래프도 좋지만, 조금 더 화려하게 만들어볼게요. 막대마다 색상을 다르게 하고, 막대 위에 정확한 값을 표시하면 더 전문적으로 보입니다.

plt.figure(figsize=(10, 6))

# 색상 그라데이션 효과
colors = ['#e74c3c', '#e67e22', '#f39c12', '#f1c40f', '#2ecc71', '#3498db']

plt.bar(df['Month'], df['Sales'], color=colors, edgecolor='white', linewidth=2)
plt.title('Monthly Sales - Styled', fontsize=16, pad=20)
plt.xlabel('Month', fontsize=12)
plt.ylabel('Sales (units)', fontsize=12)
plt.grid(True, alpha=0.3, axis='y', linestyle='--')

# 막대 위에 값 표시
for i, v in enumerate(df['Sales']):
    plt.text(i, v + 3, str(v), ha='center', fontsize=11, fontweight='bold')

plt.tight_layout()
plt.show()
스타일링된 막대 그래프 - 색상 그라데이션과 값 표시

스타일링 적용 - 색상 그라데이션과 막대 위 값 표시

이제 훨씬 보기 좋아졌죠? 빨간색에서 파란색으로 그라데이션되는 색상과, 막대 위의 정확한 값이 한눈에 들어옵니다. 이런 그래프는 프레젠테이션이나 보고서에 사용하기 딱 좋아요!

색상 코드 이해하기

#e74c3c: 빨간색
#e67e22: 주황색
#f39c12: 노란 주황
#f1c40f: 노란색
#2ecc71: 초록색
#3498db: 파란색

응용 2: 두 제품 비교하기 - 그룹 막대 그래프

이번엔 제품 A와 제품 B의 월별 판매량을 한 그래프에서 비교해볼게요. 막대를 나란히 배치하면 두 제품의 성과를 직접 비교할 수 있습니다.

import numpy as np

# 두 제품 비교 데이터
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun']
product_a = [120, 135, 142, 158, 171, 165]
product_b = [95, 110, 130, 145, 160, 180]

x = np.arange(len(months))
width = 0.35

fig, ax = plt.subplots(figsize=(12, 6))

bars1 = ax.bar(x - width/2, product_a, width, label='Product A', color='#3498db')
bars2 = ax.bar(x + width/2, product_b, width, label='Product B', color='#e74c3c')

ax.set_xlabel('Month', fontsize=12)
ax.set_ylabel('Sales (units)', fontsize=12)
ax.set_title('Product Comparison - Monthly Sales', fontsize=16, pad=20)
ax.set_xticks(x)
ax.set_xticklabels(months)
ax.legend(fontsize=11)
ax.grid(True, alpha=0.3, axis='y', linestyle='--')

plt.tight_layout()
plt.show()
두 제품 비교 막대 그래프 - Product A vs Product B

두 제품 비교 - 파란색(Product A), 빨간색(Product B)

이제 두 제품의 성과를 한눈에 비교할 수 있습니다! 초반에는 Product A가 우세했지만, 6월에는 Product B가 역전한 모습이 명확히 보이죠. 이런 그래프는 경쟁 분석이나 제품 전략 회의에서 유용합니다.

응용 3: 가로 막대 그래프 - 순위 표시에 적합

제품 판매 순위를 표시할 때는 가로 막대 그래프가 더 직관적입니다. 순위표처럼 위에서 아래로 나열되기 때문이죠.

# 제품 판매 순위 (가로 막대)
products = ['Product E', 'Product D', 'Product C', 'Product B', 'Product A']
sales = [145, 158, 165, 171, 189]

plt.figure(figsize=(10, 6))

# 가로 막대 그래프 (barh)
bars = plt.barh(products, sales, color='#3498db', edgecolor='white', linewidth=2)

# 막대 오른쪽에 값 표시
for i, (bar, value) in enumerate(zip(bars, sales)):
    plt.text(value + 3, i, str(value), va='center', fontsize=11, fontweight='bold')

plt.title('Product Sales Ranking', fontsize=16, pad=20)
plt.xlabel('Sales (units)', fontsize=12)
plt.ylabel('Product', fontsize=12)
plt.grid(True, alpha=0.3, axis='x', linestyle='--')

plt.tight_layout()
plt.show()
가로 막대 그래프 - 제품 판매 순위

가로 막대 그래프 - 순위가 한눈에 들어오는 형태

가로 막대는 plt.barh() 함수를 사용합니다. Product A가 1위, Product E가 5위라는 게 명확히 보이죠? 긴 카테고리 이름도 가로로 표시하면 잘립니다!

응용 4: 고급 스킬 - 누적 막대 그래프

마지막으로, 프로페셔널한 그래프를 만들어볼게요. 누적 막대 그래프(Stacked Bar Chart)는 여러 제품의 분기별 매출을 한 막대에 쌓아서 전체 합계와 비율을 동시에 보여줍니다.

# 분기별 제품 판매 (누적)
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
product_a = [120, 135, 150, 165]
product_b = [95, 110, 125, 140]
product_c = [80, 90, 100, 115]

x = np.arange(len(quarters))
width = 0.5

fig, ax = plt.subplots(figsize=(12, 7))

# 누적 막대 그래프
bar1 = ax.bar(x, product_a, width, label='Product A', color='#3498db')
bar2 = ax.bar(x, product_b, width, bottom=product_a, label='Product B', color='#e74c3c')
bar3 = ax.bar(x, product_c, width, bottom=np.array(product_a)+np.array(product_b),
              label='Product C', color='#2ecc71')

# 총합 값 표시
totals = [a+b+c for a, b, c in zip(product_a, product_b, product_c)]
for i, total in enumerate(totals):
    ax.text(i, total + 5, str(total), ha='center', fontsize=12, fontweight='bold')

ax.set_xlabel('Quarter', fontsize=12)
ax.set_ylabel('Sales (units)', fontsize=12)
ax.set_title('Quarterly Sales by Product - Stacked View', fontsize=16, pad=20)
ax.set_xticks(x)
ax.set_xticklabels(quarters)
ax.legend(fontsize=11, loc='upper left')
ax.grid(True, alpha=0.3, axis='y', linestyle='--')

plt.tight_layout()
plt.show()
누적 막대 그래프 - 분기별 제품 판매 비교

누적 막대 그래프 - 전체 합계와 비율을 동시에 확인

이 그래프가 강력한 이유는 뭘까요? 각 분기별 총 매출을 보면서, 동시에 제품별 기여도도 확인할 수 있거든요. 파란색(Product A)이 가장 많이 기여하고, 초록색(Product C)은 비중이 작지만 꾸준히 증가하는 모습이 보이죠.

누적 막대 그래프의 활용

  • 비즈니스 보고서: 제품별 매출 기여도 + 전체 추세 한눈에
  • 예산 분석: 항목별 지출 비율 + 총 예산 변화
  • 브리딩 기록: 개체별 월간 급여량 + 총 급여량 추이

마무리 - 이제 뭘 할 수 있을까?

축하합니다! 이제 할 수 있는 것:

  • 범주형 데이터를 막대 그래프로 시각화할 수 있고
  • 세로/가로 막대를 상황에 맞게 선택할 수 있고
  • 여러 제품을 비교하고 누적 그래프도 만들 수 있습니다

다음 단계로 나아가기

기본을 마스터했으니, 이제 더 재미있는 것들을 시도해볼 수 있습니다:

  • 오차 막대 추가: 각 값의 표준편차를 오차 막대로 표시할 수 있습니다
  • 애니메이션: matplotlib.animation으로 시간에 따라 막대가 자라는 애니메이션 가능
  • 실제 데이터 활용: CSV 파일을 pandas로 불러와서 실전 데이터를 분석해보세요
  • 인터랙티브 그래프: Plotly 라이브러리로 마우스 호버 가능한 그래프를 만들 수 있습니다

흑섬 브리딩에서의 활용

저는 이 방법으로 레오파드 게코의 월별 체중 증가량 비교를 하고 있습니다. "어느 달에 가장 빨리 자랐을까?"라는 질문에, 막대 그래프가 명확한 답을 줍니다. 여러 개체를 비교하면 성장 패턴의 차이도 한눈에 보이고요.

막대 그래프는 "카테고리별로 누가 더 큰가?"라는 질문에 답하는 가장 직관적인 방법입니다. 판매 데이터, 시험 성적, 운동 기록, 브리딩 기록—다양한 분야에 적용할 수 있어요.

다음 시리즈 예고

다음 글에서는 "히스토그램으로 데이터 분포 파악하기" (Step 4)를 다뤄볼 예정입니다. 텍스트에서 단어 빈도를 추출하고, 워드클라우드 이미지를 만드는 방법을 배워볼 거예요.

궁금한 점이 있거나, 이런 내용도 다뤄줬으면 좋겠다는 의견이 있다면 인스타그램 DM 주세요!

#막대그래프#pandas#matplotlib#python#데이터시각화#googlecolab