매출 순이익 비교: 파이썬 시각화로 쉽게 이해하기

안녕하세요! 이번 포스트에서는 매출 순이익 비교 데이터를 파이썬 시각화로 쉽게 이해하는 방법을 알아보겠습니다. 기업의 매출과 순이익은 경영 성과를 대표하는 중요한 지표인데요. 이 두 가지를 한눈에 비교하면 회사의 수익 구조를 더 잘 파악할 수 있습니다.

여기서는 Python의 대표적인 시각화 도구 두 가지인 MatplotlibPlotly를 활용하여 매출과 순이익 데이터를 그래프로 나타내보겠습니다. 초보자분들도 따라할 수 있도록 코드 예제와 상세 해설을 함께 제공하니, 데이터 시각화에 입문하려는 분들께 도움이 되길 바랍니다.

매출 순이익 비교의 의미

매출은 제품이나 서비스를 판매하여 얻은 총 수익을 말하고, 순이익은 모든 비용을 제외하고 최종적으로 남는 순수한 이익을 의미합니다. 매출과 순이익을 함께 비교하면 수익성을 평가할 수 있는데요. 예를 들어 매출은 늘고 있는데 순이익이 제자리라면 비용 증가로 인해 이익률이 낮아졌다는 신호일 수 있습니다.

반대로 매출 대비 순이익이 크다면 효율적인 경영을 하고 있다는 뜻이겠죠. 이렇게 두 지표를 나란히 놓고 보면 기업의 재무 상태를 직관적으로 이해하는 데 도움이 됩니다. 이제 실제 예시 데이터를 가지고 두 지표를 시각화해보겠습니다.

Matplotlib으로 매출과 순이익 시각화

매출 순이익 비교 그래프

먼저 Matplotlib 라이브러리를 사용해 매출과 순이익 데이터를 위와 같이 시각화해보겠습니다. Matplotlib은 파이썬에서 가장 널리 쓰이는 데이터 시각화 라이브러리로, 다양한 종류의 그래프를 손쉽게 그릴 수 있습니다. 아래 코드와 함께 각 단계별 설명을 덧붙였으니 하나씩 따라와 보세요.

import matplotlib.pyplot as plt
import numpy as np

# 데이터 설정 (단위: 천 달러)
companies = ['Nvidia', 'Apple', 'Meta', 'Alphabet', 'Broadcom', 'Microsoft', 'Tesla', 'Amazon']
revenue_per_employee = [3600, 2400, 2200, 1900, 1400, 1100, 777, 410]
profit_per_employee = [2000, 572, 842, 546, 159, 387, 57, 38]

# 그래프 생성 및 설정
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 8), sharey=True)
fig.suptitle('Tech Companies: Revenue and Net Income Per Employee (2024)', fontsize=24, fontweight='bold', y=0.95)

# 첫 번째 그래프: 직원 1인당 매출
bars1 = ax1.barh(companies, revenue_per_employee, color='green', alpha=0.7)
ax1.set_title('Revenue Per Employee ($K)', fontsize=18, fontweight='bold')
ax1.set_xlabel('Revenue ($K)')
ax1.set_xlim(0, 4000)  # x축 범위 설정
ax1.grid(axis='x', linestyle='--', alpha=0.7)
ax1.invert_yaxis()  # 리스트 순서 반대로 (높은 값이 위로)

# 두 번째 그래프: 직원 1인당 순이익
bars2 = ax2.barh(companies, profit_per_employee, color='lightgreen', alpha=0.7)
ax2.set_title('Net Income Per Employee ($K)', fontsize=18, fontweight='bold')
ax2.set_xlabel('Net Income ($K)')
ax2.set_xlim(0, 4000)  # x축 범위 설정
ax2.grid(axis='x', linestyle='--', alpha=0.7)

# 막대 끝에 값 표시
for ax, bars in zip([ax1, ax2], [bars1, bars2]):
    for bar in bars:
        width = bar.get_width()
        ax.text(width + 50, bar.get_y() + bar.get_height()/2, f'{int(width)}', 
                va='center', fontsize=12)

# 각 막대 그래프에 격자 선 추가
ax1.set_xticks([0, 1000, 2000, 3000])
ax2.set_xticks([0, 1000, 2000, 3000])

# 박스 제거 (프레임 제거)
ax1.spines['top'].set_visible(False)
ax1.spines['right'].set_visible(False)
ax1.spines['left'].set_visible(False)
ax2.spines['top'].set_visible(False)
ax2.spines['right'].set_visible(False)
ax2.spines['left'].set_visible(False)

# y축 틱 레이블 유지하면서 틱 라인 제거
ax1.tick_params(axis='y', which='both', length=0)
ax2.tick_params(axis='y', which='both', length=0)

# 하단에 설명 추가
fig.text(0.5, 0.05, 'Values shown in thousands of dollars ($K) per employee', 
         ha='center', fontsize=12, style='italic')
fig.text(0.5, 0.03, 'Data for 2024 fiscal year', 
         ha='center', fontsize=12, style='italic')

# 레이아웃 조정
plt.tight_layout()
plt.subplots_adjust(top=0.88, bottom=0.1)

# 그래프 표시
plt.show()

코드 해설:

  • import matplotlib.pyplot as plt: 데이터 시각화를 위한 Matplotlib 라이브러리의 pyplot 모듈을 plt라는 이름으로 가져옵니다.
  • import numpy as np: 수치 연산을 위한 NumPy 라이브러리를 np라는 이름으로 가져옵니다.
  • companies = ['Nvidia', 'Apple', ...]: 그래프에 표시할 기술 회사들의 이름을 리스트로 정의합니다.
  • revenue_per_employee = [3600, 2400, ...]: 각 회사별 직원 1인당 매출액을 천 달러 단위로 저장한 리스트입니다.
  • profit_per_employee = [2000, 572, ...]: 각 회사별 직원 1인당 순이익을 천 달러 단위로 저장한 리스트입니다.
  • fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 8), sharey=True): 1행 2열 구조의 서브플롯을 생성합니다. 가로 14인치, 세로 8인치 크기로 설정하고, sharey=True로 두 그래프가 Y축을 공유하도록 합니다.
  • fig.suptitle(...): 전체 그래프의 상단 제목을 설정합니다. 폰트 크기는 24, 굵은 글씨체로 표시합니다.
  • bars1 = ax1.barh(companies, revenue_per_employee, color='green', alpha=0.7): 첫 번째 서브플롯에 회사별 직원 1인당 매출 데이터를 녹색 수평 막대 그래프로 그립니다. 투명도는 0.7로 설정합니다.
  • ax1.set_title(...), ax1.set_xlabel(...): 첫 번째 그래프의 제목X축 라벨을 설정합니다.
  • ax1.set_xlim(0, 4000): X축의 표시 범위를 0부터 4000까지로 제한합니다.
  • ax1.grid(axis='x', linestyle='--', alpha=0.7): X축을 따라 점선 격자를 추가하고, 투명도를 0.7로 설정합니다.
  • ax1.invert_yaxis(): Y축 순서를 역전시켜 데이터 값이 높은 회사가 위쪽에 오도록 합니다.
  • bars2 = ax2.barh(...): 두 번째 서브플롯에 회사별 직원 1인당 순이익 데이터를 연한 녹색 수평 막대 그래프로 그립니다.
  • for ax, bars in zip([ax1, ax2], [bars1, bars2]): ...: 두 그래프의 각 막대 끝에 수치 값을 표시하는 반복문입니다. bar.get_width()로 막대 길이를 가져오고, 그 위치에 정수 형태로 값을 표시합니다.
  • ax1.set_xticks([0, 1000, 2000, 3000]): X축에 눈금을 1000 단위로 표시합니다.
  • ax1.spines['top'].set_visible(False): 그래프 상단의 테두리선(spine)을 제거합니다. 마찬가지로 오른쪽과 왼쪽 테두리선도 제거하여 X축 선만 남도록 합니다.
  • ax1.tick_params(axis='y', which='both', length=0): Y축의 눈금 표시선을 제거하면서도 레이블은 유지합니다.
  • fig.text(...): 그래프 하단에 부가 설명을 이탤릭체로 추가합니다.
  • plt.tight_layout(): 그래프 요소들 간의 간격을 최적화합니다.
  • plt.subplots_adjust(top=0.88, bottom=0.1): 그래프의 상하 여백을 미세 조정합니다.
  • plt.show(): 완성된 그래프를 화면에 표시합니다.

Plotly로 대화형 시각화 하기

plotly 이용 매출 순이익 비교 그래프

이번에는 Plotly를 사용하여 같은 데이터를 시각화해보겠습니다. Plotly는 대화형(interactive) 그래프를 손쉽게 만들 수 있는 파이썬 라이브러리입니다. Matplotlib이 정적인 이미지 그래프를 그린다면, Plotly는 마우스로 값을 확인하거나 그래프 영역을 확대하는 등의 상호작용이 가능한 그래프를 만들어줍니다.

import plotly.graph_objects as go
from plotly.subplots import make_subplots

# 데이터 설정 (단위: 천 달러)
companies = ['Nvidia', 'Apple', 'Meta', 'Alphabet', 'Broadcom', 'Microsoft', 'Tesla', 'Amazon']
revenue_per_employee = [3600, 2400, 2200, 1900, 1400, 1100, 777, 410]
profit_per_employee = [2000, 572, 842, 546, 159, 387, 57, 38]

# 서브플롯 생성
fig = make_subplots(
    rows=1, cols=2,
    subplot_titles=('Revenue Per Employee ($K)', 'Net Income Per Employee ($K)'),
    shared_yaxes=True,
    horizontal_spacing=0.05
)

# 첫 번째 그래프: 직원 1인당 매출
fig.add_trace(
    go.Bar(
        y=companies,
        x=revenue_per_employee,
        orientation='h',
        text=revenue_per_employee,
        textposition='outside',
        marker=dict(color='green', opacity=0.7),
        hovertemplate='<b>%{y}</b><br>Revenue: $%{x}K per employee<extra></extra>'
    ),
    row=1, col=1
)

# 두 번째 그래프: 직원 1인당 순이익
fig.add_trace(
    go.Bar(
        y=companies,
        x=profit_per_employee,
        orientation='h',
        text=profit_per_employee,
        textposition='outside',
        marker=dict(color='lightgreen', opacity=0.7),
        hovertemplate='<b>%{y}</b><br>Net Income: $%{x}K per employee<extra></extra>'
    ),
    row=1, col=2
)

# 전체 레이아웃 설정
fig.update_layout(
    title=dict(
        text='Tech Companies: Revenue and Net Income Per Employee (2024)',
        font=dict(size=24, family='Arial', color='black'),
        x=0.5
    ),
    height=600,
    width=1000,
    showlegend=False,
    annotations=[
        dict(
            text="Values shown in thousands of dollars ($K) per employee<br>Data for 2024 fiscal year",
            showarrow=False,
            xref="paper",
            yref="paper",
            x=0.5,
            y=-0.15,
            font=dict(size=12, style='italic')
        )
    ]
)

# X축 설정
fig.update_xaxes(
    range=[0, 4000],
    gridcolor='lightgray',
    gridwidth=1,
    griddash='dash',
    showline=True,
    linecolor='black',
    row=1, col=1
)

fig.update_xaxes(
    range=[0, 4000],
    gridcolor='lightgray',
    gridwidth=1,
    griddash='dash',
    showline=True,
    linecolor='black',
    row=1, col=2
)

# Y축 설정 (프레임 제거)
fig.update_yaxes(
    showline=False,
    showgrid=False,
    zeroline=False,
    autorange='reversed'  # 높은 값이 위에 오도록 역순 정렬
)

# 그래프 표시
fig.show()

코드 해설:

  • import plotly.graph_objects as go: 대화형 시각화를 위한 Plotly 라이브러리의 graph_objects 모듈을 go라는 이름으로 가져옵니다.
  • from plotly.subplots import make_subplots: Plotly에서 여러 개의 서브플롯을 만들기 위한 함수를 가져옵니다.
  • companies = ['Nvidia', 'Apple', ...]: 그래프에 표시할 기술 회사들의 이름을 리스트로 정의합니다.
  • revenue_per_employee = [3600, 2400, ...]: 각 회사별 직원 1인당 매출액을 천 달러 단위로 저장한 리스트입니다.
  • profit_per_employee = [2000, 572, ...]: 각 회사별 직원 1인당 순이익을 천 달러 단위로 저장한 리스트입니다.
  • fig = make_subplots(...): 1행 2열 구조의 서브플롯을 생성합니다. subplot_titles로 각 그래프의 제목을 설정하고, shared_yaxes=True로 Y축을 공유하도록 합니다.
  • fig.add_trace(go.Bar(...), row=1, col=1): 첫 번째 서브플롯에 수평 막대 그래프를 추가합니다. orientation='h'로 수평 방향을 지정하고, texttextposition으로 값을 막대 바깥에 표시합니다.
  • marker=dict(color='green', opacity=0.7): 막대 차트의 색상투명도를 설정합니다.
  • hovertemplate='<b>%{y}</b><br>Revenue: $%{x}K per employee<extra></extra>': 마우스를 올렸을 때 표시되는 호버 정보의 형식을 지정합니다.
  • fig.add_trace(..., row=1, col=2): 두 번째 서브플롯에 순이익 데이터를 동일한 방식으로 추가합니다.
  • fig.update_layout(...): 그래프의 전체 레이아웃을 설정합니다. 제목, 크기, 범례 표시 여부 등을 지정합니다.
  • annotations=[dict(...)]: 그래프 하단에 부가 설명을 추가합니다. xref="paper"yref="paper"로 전체 그래프 영역 기준으로 위치를 지정합니다.
  • fig.update_xaxes(...): X축의 범위, 격자선 스타일, 선 색상 등을 설정합니다. griddash='dash'로 점선 격자를 구현합니다.
  • fig.update_yaxes(showline=False, ...): Y축의 테두리선을 제거하고, 격자선과 영점선도 숨깁니다. autorange='reversed'로 데이터 값이 높은 회사가 위쪽에 오도록 역순 정렬합니다.
  • fig.show(): 완성된 대화형 그래프를 표시합니다. 이 그래프는 마우스 호버 기능, 확대/축소, 이미지 저장 등 Plotly의 대화형 기능을 모두 지원합니다.

결론: 데이터 시각화의 중요성

매출과 순이익 같이 중요한 비즈니스 지표를 시각화하면 숫자 표만 볼 때보다 훨씬 쉽게 내용을 이해할 수 있습니다. 위에서 살펴본 것처럼 Python의 Matplotlib과 Plotly를 이용하면 초보자도 비교적 간단한 코드로 멋진 그래프를 그릴 수 있습니다.

Matplotlib은 정적 이미지로서 보고서나 문서에 넣기 좋고, Plotly는 인터랙티브 차트로 웹에서 실시간 분석에 유용합니다. 둘 다 장단점이 있으니 상황에 맞게 활용하면 좋겠습니다. 🙂 데이터 시각화는 많은 양의 정보를 효과적으로 전달하고 인사이트를 얻는 강력한 도구입니다.

앞으로 다양한 데이터에 적용해 보면서 더 복잡한 그래프 그리기나 다른 라이브러리(예: Seaborn, ggplot 등)도 도전해 보세요. 지속적인 연습와 학습이 데이터를 이해하는 눈을 더욱 키워줄 것입니다!

용어 해설

  • 매출 (Revenue): 기업이 제품이나 서비스를 판매하고 얻은 총 수입입니다. 예를 들어 물건을 100만 원어치 팔았다면 매출은 100만 원입니다.
  • 순이익 (Net Profit): 매출에서 비용을 모두 빼고 최종적으로 남는 이익입니다. 순이익은 매출에서 원가, 운영비, 세금 등 모든 지출을 제외한 금액입니다.
  • 데이터 시각화: 데이터를 표나 문장이 아닌 차트나 그래프 형태로 표현하는 것을 말합니다. 시각화를 통해 복잡한 데이터도 쉽게 이해하고 인사이트를 얻을 수 있습니다.
  • Matplotlib: 파이썬에서 사용하는 대표적인 데이터 시각화 라이브러리입니다. 선 그래프, 막대 그래프 등 다양한 차트를 그릴 수 있으며, 튜닝과 커스터마이징이 자유롭습니다.
  • Plotly: 대화형 데이터 시각화 라이브러리의 하나로, 웹 기반의 인터랙티브 차트를 쉽게 만들 수 있습니다. 줌인/줌아웃이나 마우스오버 정보 표시 등 상호작용 기능을 제공하여 데이터 분석 결과를 동적으로 탐색할 수 있습니다.
테리 이모티콘
( 즐겁게 코딩을 합시다! )

유사한 게시물