ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 혼자 공부하는 데이터 분석 CH 06 복잡한 데이터 표현하기
    Study/Data Analysis 2025. 9. 26. 10:46

    목차

    1. 들어가며: Matplotlib 그래프, 더 자유롭게 다루기
    2. 그래프 꾸미기의 시작: 객체지향 API
      • 2-1. Pyplot 방식 vs 객체지향 API 방식
      • 2-2. 한글 폰트 설정하기
    3. 데이터 시각화 실전: 산점도 개선하기
      • 3-1. 기본 산점도 그리기
      • 3-2. 마커 크기와 색상으로 정보 추가하기
      • 3-3. 컬러바(Colorbar) 활용하기
    4. Matplotlib 고급 기능 활용
      • 4-1. 하나의 Figure에 여러 그래프 그리기 (선, 막대)
      • 4-2. 누적 정보를 보여주는 스택 그래프 (영역, 막대)
      • 4-3. 비율을 보여주는 원 그래프 (파이 차트)
      • 4-4. 서브플롯으로 여러 그래프 한 번에 배치하기
    5. 더 간편한 시각화: Pandas 플롯 기능
    6. 마치며: 데이터의 스토리를 만드는 시각화 기술
     


    들어가며: Matplotlib 그래프, 더 자유롭게 다루기

    안녕하세요! 이전에는 Matplotlib의 기본적인 사용법을 알아보았다면,

    이번 시간에는 그래프의 각 요소를 더욱 세밀하게 제어하고 꾸밀 수 있는 객체지향 API 방식과 다양한 고급 시각화 기법에 대해 알아보겠습니다.

     

    단순한 선 그래프를 넘어, 데이터의 다차원적인 정보를 효과적으로 표현하는 산점도, 여러 데이터 시리즈를 비교하는 다중 그래프, 전체에서 각 부분의 비율을 보여주는 스택 그래프와 원 그래프까지 다양한 예제를 통해 배워보겠습니다. 이 글을 통해 Matplotlib를 더욱 자유자재로 다루며 데이터 속에 숨겨진 이야기를 효과적으로 전달하는 능력을 길러보세요.

     


     

    2. 그래프 꾸미기의 시작: 객체지향 API

     

     

    Matplotlib에는 그래프를 그리는 두 가지 주요 방식이 있습니다.

    바로 Pyplot 함수를 직접 사용하는 방식과, Figure와 Axes 객체를 만들어 사용하는 객체지향 API 방식입니다.

    2-1. Pyplot 방식 vs 객체지향 API 방식

    • Pyplot 방식 (함수형): plt.plot(), plt.title()처럼 간단한 함수 호출로 빠르게 그래프를 그릴 수 있습니다. 내부적으로는 현재 활성화된 Figure와 Axes에 그래프를 그리는 방식입니다.
    • 객체지향 API 방식: fig, ax = plt.subplots() 코드로 Figure(그래프 전체 틀)와 Axes(실제 그래프가 그려지는 영역) 객체를 명시적으로 생성합니다. 이를 통해 여러 개의 그래프를 그리거나 각 요소(제목, 축, 범례 등)를 더 세밀하게 제어할 수 있어 복잡한 시각화에 더 적합합니다.
    import matplotlib.pyplot as plt
    
    # Pyplot 방식 - 전역 상태를 사용하는 함수형 접근
    plt.plot([1, 4, 9, 16])
    plt.title('pyplot style')
    plt.show()
    
    # 객체지향 방식 - Figure와 Axes 객체를 직접 제어
    fig, ax = plt.subplots()  # Figure와 Axes 객체 생성
    ax.plot([1, 4, 9, 16])    # Axes 객체의 메서드 사용
    ax.set_title('object-oriented style')  # 제목 설정
    fig.show()
    

    2-2. 한글 폰트 설정하기

    Matplotlib는 기본적으로 한글 폰트를 지원하지 않아, 별도의 설정이 필요합니다.

    코랩(Colab) 환경에서는 나눔 폰트를 설치하고 Matplotlib에 등록하여 사용할 수 있습니다.

     
    # 코랩 환경에서 나눔 폰트 설치 및 Matplotlib 설정
    import sys
    if 'google.colab' in sys.modules:
        !sudo apt-get -qq -y install fonts-nanum
        import matplotlib.font_manager as fm
        font_files = fm.findSystemFonts(fontpaths=['/usr/share/fonts/truetype/nanum'])
        for fpath in font_files:
            fm.fontManager.addfont(fpath)
    
    # plt.rc() 함수로 전역 폰트 설정 (가장 간편)
    plt.rc('font', family='NanumBarunGothic', size=11)
    plt.rcParams['figure.dpi'] = 100 # 그래프 해상도 설정
    
    # 한글 제목으로 테스트
    plt.plot([1, 4, 9, 16])
    plt.title('간단한 선 그래프')
    plt.show() # 한글이 정상적으로 출력됩니다.
    
     


    3. 데이터 시각화 실전: 산점도 개선하기

    이제 객체지향 API를 활용하여 출판사별 도서 데이터를 이용한 산점도를 단계별로 개선해 보겠습니다. 산점도는 두 변수 간의 관계를 파악하는 데 유용하며, 마커의 크기, 색상 등을 추가하여 3차원, 4차원의 정보까지 표현할 수 있습니다.

    3-1. 기본 산점도 그리기

     

    먼저 ax.scatter()를 사용해 발행년도와 출판사를 축으로 하는 기본 산점도를 그립니다.

    # (데이터 준비 과정은 생략)
    fig, ax = plt.subplots(figsize=(10, 8))
    ax.scatter(ns_book8['발행년도'], ns_book8['출판사'])
    ax.set_title('출판사별 발행도서')
    fig.show()
    

    3-2. 마커 크기와 색상으로 정보 추가하기

     

    산점도의 각 점을 마커(marker)라고 합니다.

    마커의 크기를 조절하는 s 매개변수와 색상을 조절하는 c 매개변수를 사용하여 '대출건수'라는 추가 정보를 시각화할 수 있습니다.

    fig, ax = plt.subplots(figsize=(10, 8))
    
    # s: 마커 크기, c: 마커 색상, alpha: 투명도, edgecolors: 테두리색
    ax.scatter(ns_book8['발행년도'], ns_book8['출판사'],
               s=ns_book8['대출건수']*2,      # 대출건수가 많을수록 마커가 커짐
               c=ns_book8['대출건수'],      # 대출건수가 많을수록 색상이 진해짐
               alpha=0.3,
               edgecolors='k',
               linewidths=0.5,
               cmap='jet')                  # 컬러맵 지정
    
    ax.set_title('출판사별 발행도서')
    fig.show()
    

    3-3. 컬러바(Colorbar) 활용하기

     

    마커의 색상이 어떤 값을 의미하는지 명확히 보여주기 위해 컬러바를 추가할 수 있습니다. 

    fig.colorbar() 함수를 사용하며, scatter 함수의 반환값을 인자로 넘겨줍니다.

    fig, ax = plt.subplots(figsize=(10, 8))
    sc = ax.scatter(ns_book8['발행년도'], ns_book8['출판사'],
                    s=ns_book8['대출건수']**1.3, # 거듭제곱으로 크기 차이를 더 강조
                    c=ns_book8['대출건수'],
                    cmap='jet', alpha=0.3, edgecolors='k', linewidths=0.5)
    
    ax.set_title('출판사별 발행도서')
    fig.colorbar(sc) # sc 객체를 이용해 컬러바 생성
    fig.show()
    
     


    4. Matplotlib 고급 기능 활용

    4-1. 하나의 Figure에 여러 그래프 그리기 (선, 막대)

     

    ax.plot()이나 ax.bar()를 여러 번 호출하면 하나의 Axes에 여러 그래프를 겹쳐 그릴 수 있습니다.

    각 그래프를 구분하기 위해 label을 지정하고 ax.legend()를 호출하여 범례를 표시합니다.

    # (데이터 준비 과정 생략)
    
    # 여러 개의 선 그래프
    fig, ax = plt.subplots(figsize=(8, 6))
    for pub in top30_pubs.index[:5]: # 상위 5개 출판사
        line = ns_book9[ns_book9['출판사'] == pub]
        ax.plot(line['발행년도'], line['대출건수'], label=pub)
    
    ax.set_title('년도별 대출건수')
    ax.legend()
    ax.set_xlim(1985, 2025)
    fig.show()
    
    # 나란히 배치된 막대 그래프
    fig, ax = plt.subplots(figsize=(8, 6))
    ax.bar(line1['발행년도']-0.2, line1['대출건수'], width=0.4, label='황금가지')
    ax.bar(line2['발행년도']+0.2, line2['대출건수'], width=0.4, label='비룡소')
    ax.set_title('년도별 대출건수')
    ax.legend()
    fig.show()
    

    4-2. 누적 정보를 보여주는 스택 그래프 (영역, 막대)

     

    스택 그래프는 전체 크기와 함께 각 부분의 기여도를 시간에 따라 보여줄 때 유용합니다.

     ax.stackplot()으로 영역 그래프를, ax.bar()의 bottom 매개변수로 막대 그래프를 그릴 수 있습니다.

    # (데이터 준비 과정 생략)
    
    # 스택 영역 그래프
    fig, ax = plt.subplots(figsize=(8, 6))
    ax.stackplot(year_cols,
                 ns_book10.loc[top10_pubs].fillna(0),
                 labels=top10_pubs)
    ax.set_title('년도별 대출건수')
    ax.legend(loc='upper left')
    ax.set_xlim(1985, 2025)
    fig.show()
    

    4-3. 비율을 보여주는 원 그래프 (파이 차트)

     

    ax.pie()를 사용하면 전체에 대한 각 항목의 비율을 시각적으로 표현할 수 있습니다. 

    autopct로 백분율을 표시하고, explode로 특정 조각을 강조할 수 있습니다.

    data = top30_pubs[:10]
    labels = top30_pubs.index[:10]
    
    fig, ax = plt.subplots(figsize=(8, 6))
    ax.pie(data, labels=labels,
           startangle=90,          # 시작 각도
           autopct='%.1f%%',       # 백분율 표시 (소수점 1자리)
           explode=[0.1]+[0]*9)    # 첫 번째 조각만 분리
    ax.set_title('출판사 도서비율')
    fig.show()
    

    4-4. 서브플롯으로 여러 그래프 한 번에 배치하기

     

    plt.subplots(nrows, ncols)를 사용하면 하나의 Figure를 여러 개의 Axes로 나눌 수 있습니다.

    이를 서브플롯(subplot)이라 하며, 다양한 종류의 그래프를 한눈에 비교할 수 있도록 배치할 때 유용합니다.

    fig, axes = plt.subplots(2, 2, figsize=(20, 16)) # 2x2 서브플롯 생성
    
    # axes[0, 0]에 산점도 그리기
    # axes[0, 1]에 스택 영역 그래프 그리기
    # axes[1, 0]에 스택 막대 그래프 그리기
    # axes[1, 1]에 원 그래프 그리기
    # (상세 코드는 생략)
    
    fig.savefig('all_in_one.png') # 전체 그래프를 이미지 파일로 저장
    fig.show()
    

     


     

    5. 더 간편한 시각화: Pandas 플롯 기능

     

    Pandas의 DataFrame은 Matplotlib을 기반으로 한 자체 플롯 기능을 내장하고 있습니다. 

    df.plot.area(), df.plot.bar()등 직관적인 메서드를 사용하여 데이터를 적절한 형태로 재구성(pivot_table 등)하면 더 간편하게 그래프를 그릴 수 있습니다.

     
    # (데이터 준비 과정 생략)
    
    # Pandas로 스택 영역 그래프 그리기
    fig, ax = plt.subplots(figsize=(8, 6))
    ns_book11[top10_pubs].plot.area(ax=ax,
                                    title='년도별 대출건수',
                                    xlim=(1985, 2025))
    ax.legend(loc='upper left')
    fig.show()
    
     


    마치며: 데이터의 스토리를 만드는 시각화 기술

    이번 포스팅에서는 Matplotlib의 객체지향 API를 중심으로 산점도, 다중 그래프, 스택 그래프, 원 그래프 등 다양한 시각화 기법을 살펴보았습니다. 각 그래프의 특성을 이해하고 데이터에 맞는 시각화 방법을 선택하는 것은 효과적인 데이터 분석의 핵심입니다.

     

    오늘 배운 기능들을 활용하여 여러 그래프를 조합하고 꾸며보면서 자신만의 데이터 스토리를 만들어 보세요.

    잘 만들어진 그래프 하나는 긴 설명보다 더 강력한 설득력을 가집니다!

     

     


     

     

    코드 출처:

     

    https://colab.research.google.com/github/rickiepark/hg-da/blob/main/06-1.ipynb

     

    06-1.ipynb

    Run, share, and edit Python notebooks

    colab.research.google.com

    https://colab.research.google.com/github/rickiepark/hg-da/blob/main/06-2.ipynb

     

    06-2.ipynb

    Run, share, and edit Python notebooks

    colab.research.google.com

     

    강의 출처:

     

    https://www.youtube.com/watch?v=XD65UhBMOiI&list=PLVsNizTWUw7FGzSRCkQrPEEe-ljVXgS7k&index=12

    https://www.youtube.com/watch?v=NTQ5NXelOfw&list=PLVsNizTWUw7FGzSRCkQrPEEe-ljVXgS7k&index=13

     

Designed by Tistory.