ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 혼자 공부하는 데이터 분석 CH 05 데이터 시각화
    Study/Data Analysis 2025. 9. 25. 10:37

     

    목차

    1. 들어가며
    2. 맷플롯립 기본 요소 알아보기
      • Figure 클래스
      • rcParams 객체
      • 여러 개의 서브플롯 출력하기
    3. 선, 막대 그래프 그리기
      • 데이터 준비: 연도별/주제별 도서 개수 구하기
      • 선 그래프 그리기
      • 막대 그래프 그리기
      • 이미지 출력하고 저장하기
    4. 마치며

     


     

    1. 들어가며

    데이터 분석에서 시각화는 데이터의 특징과 패턴을 직관적으로 파악하는 데 매우 중요한 역할을 합니다.

    파이썬의 대표적인 시각화 라이브러리인 맷플롯립(Matplotlib)은 다양한 종류의 그래프를 만들 수 있는 강력한 도구입니다.

    이번 포스팅에서는 맷플롯립의 기본적인 구성 요소를 알아보고, 이를 활용하여 선 그래프막대 그래프를 그리는 방법에 대해 자세히 살펴보겠습니다.

     


     

    2. 맷플롯립 기본 요소 알아보기

    맷플롯립으로 그래프를 그리기 전에 기본적인 구성 요소인 Figure 클래스, rcParams 객체, 그리고 여러 그래프를 함께 그리는 서브플롯(Subplot)에 대해 알아보겠습니다.

    2. 1  Figure 클래스

    Figure 클래스는 그래프가 그려지는 전체 캔버스나 창을 의미합니다. 이 Figure 객체의 크기나 해상도를 조절하여 그래프의 전체적인 모양을 설정할 수 있습니다.

     

    기본 산점도 그리기

     

    먼저 '도서권수'와 '대출건수' 데이터를 사용하여 기본적인 산점도를 그려보겠습니다.

    import pandas as pd
    import matplotlib.pyplot as plt
    
    ns_book7 = pd.read_csv('ns_book7.csv', low_memory=False)
    
    plt.scatter(ns_book7['도서권수'], ns_book7['대출건수'], alpha=0.1)
    plt.show()
    

     

    Figure 크기 및 해상도 조절

     

    plt.figure() 함수의 figsize 매개변수를 사용하여 그래프의 가로, 세로 크기(인치 단위)를 지정할 수 있고, dpi (Dots Per Inch) 매개변수로는 그래프의 해상도를 설정할 수 있습니다.

    # 가로 9인치, 세로 6인치로 크기 조절
    plt.figure(figsize=(9, 6))
    plt.scatter(ns_book7['도서권수'], ns_book7['대출건수'], alpha=0.1)
    plt.show()
    
    # DPI를 144로 설정하여 해상도 높이기
    plt.figure(dpi=144)
    plt.scatter(ns_book7['도서권수'], ns_book7['대출건수'], alpha=0.1)
    plt.show()
    

     

     

    2. 2 rcParams 객체

     

    rcParams는 맷플롯립의 기본 스타일을 전역적으로 설정할 수 있는 딕셔너리 객체입니다. 이를 통해 그래프의 기본 DPI, 마커 모양 등을 모든 그래프에 일괄적으로 적용할 수 있습니다.

    # 기본 산점도 마커를 '*'로 변경
    plt.rcParams['scatter.marker'] = '*'
    
    plt.scatter(ns_book7['도서권수'], ns_book7['대출건수'], alpha=0.1)
    plt.show()
    

     

    물론, 개별 그래프를 그릴 때 scatter 함수의 marker 매개변수를 직접 지정하여 기본 설정을 일시적으로 변경하는 것도 가능합니다.

    # 마커를 '+'로 임시 변경
    plt.scatter(ns_book7['도서권수'], ns_book7['대출건수'], alpha=0.1, marker='+')
    plt.show()
    

     

     

    2. 3 여러 개의 서브플롯 출력하기

     

    하나의 Figure 안에 여러 개의 그래프(서브플롯)를 배치하고 싶을 때는 plt.subplots() 함수를 사용합니다. 이 함수는 Figure 객체와 서브플롯들의 배열(Axes 객체)을 반환합니다.

     

    세로로 2개 서브플롯 배치

    # 2개의 행을 가지는 서브플롯 생성
    fig, axs = plt.subplots(2, figsize=(6, 8))
    
    # 첫 번째 서브플롯 (산점도)
    axs[0].scatter(ns_book7['도서권수'], ns_book7['대출건수'], alpha=0.1)
    axs[0].set_title('scatter plot')
    
    # 두 번째 서브플롯 (히스토그램)
    axs[1].hist(ns_book7['대출건수'], bins=100)
    axs[1].set_title('histogram')
    axs[1].set_yscale('log')
    
    fig.show()
    

     

    가로로 2개 서브플롯 배치 및 세부 설정

     

    subplots() 함수에 행과 열의 개수를 지정하고, 각 서브플롯의 제목(title), 축 이름(xlabel, ylabel) 등을 개별적으로 설정할 수 있습니다.

    fig, axs = plt.subplots(1, 2, figsize=(10, 4))
    
    # 첫 번째 서브플롯
    axs[0].scatter(ns_book7['도서권수'], ns_book7['대출건수'], alpha=0.1)
    axs[0].set_title('scatter plot')
    axs[0].set_xlabel('number of books')
    axs[0].set_ylabel('borrow count')
    
    # 두 번째 서브플롯
    axs[1].hist(ns_book7['대출건수'], bins=100)
    axs[1].set_title('histogram')
    axs[1].set_yscale('log')
    axs[1].set_xlabel('borrow count')
    axs[1].set_ylabel('frequency')
    
    fig.show()
    

     

     


     

    3. 선, 막대 그래프 그리기

     

    이제 데이터를 가공하여 시계열 변화를 나타내는 선 그래프와 범주별 비교에 유용한 막대 그래프를 그려보겠습니다.

    3. 1 데이터 준비: 연도별/주제별 도서 개수 구하기

    연도별 발행 도서 개수

    value_counts()와 sort_index()를 사용하여 발행년도별 도서 수를 계산하고 정렬합니다.

    # 발행년도별 도서 수를 계산하고 인덱스(연도) 기준으로 정렬
    count_by_year = ns_book7['발행년도'].value_counts().sort_index()
    # 2030년 이후의 비정상적인 데이터 제외
    count_by_year = count_by_year[count_by_year.index <= 2030]
    

     

    주제별 도서 개수

     

    '주제분류번호'의 첫 글자를 기준으로 도서 수를 집계합니다.

    import numpy as np
    
    def kdc_1st_char(no):
        if no is np.nan:
            return '-1' # NaN 값은 -1로 처리
        else:
            return no[0]
    
    count_by_subject = ns_book7['주제분류번호'].apply(kdc_1st_char).value_counts()
    

    3. 2 선 그래프 그리기

    plt.plot() 함수를 사용하여 시간에 따른 데이터 변화를 시각화합니다.

    마커, 선 스타일, 색상 등을 지정하고 annotate() 함수로 특정 지점에 텍스트 주석을 추가할 수 있습니다.

    plt.plot(count_by_year, '*-g') # 마커(*), 선스타일(-), 색상(green)
    plt.title('Books by year')
    plt.xlabel('year')
    plt.ylabel('number of books')
    plt.xticks(range(1947, 2030, 10)) # x축 눈금 10년 단위로 설정
    
    # 5년 단위로 데이터 값 표시
    for idx, val in count_by_year[::5].items():
        plt.annotate(val, (idx, val), xytext=(2, 2), textcoords='offset points')
    
    plt.show()
    

    3. 3 막대 그래프 그리기

     

     

    plt.bar()(세로)와 plt.barh()(가로) 함수를 사용하여 범주형 데이터의 크기를 비교합니다.

     

    세로 막대 그래프

    plt.bar(count_by_subject.index, count_by_subject.values, width=0.7, color='blue')
    plt.title('Books by subject')
    plt.xlabel('subject')
    plt.ylabel('number of books')
    
    # 막대 위에 값 표시
    for idx, val in count_by_subject.items():
        plt.annotate(val, (idx, val), xytext=(0, 2), textcoords='offset points',
                     fontsize=8, ha='center', color='green')
    plt.show()
    

     

    가로 막대 그래프

    plt.barh(count_by_subject.index, count_by_subject.values, height=0.7, color='blue')
    plt.title('Books by subject')
    plt.xlabel('number of books')
    plt.ylabel('subject')
    
    for idx, val in count_by_subject.items():
        plt.annotate(val, (val, idx), xytext=(2, 0), textcoords='offset points',
                     fontsize=8, va='center', color='green')
    plt.show()
    

    3. 4 이미지 출력하고 저장하기

    맷플롯립은 그래프뿐만 아니라 일반 이미지 파일도 다룰 수 있습니다.

     

    이미지 출력

     

    plt.imread()로 이미지를 NumPy 배열로 읽어온 후 plt.imshow()로 출력합니다. plt.axis('off')로 불필요한 축을 숨길 수 있습니다.

    # !wget https://bit.ly/3wrj4xf -O jupiter.png # 코랩에서 이미지 다운로드
    img = plt.imread('jupiter.png')
    
    plt.imshow(img)
    plt.axis('off') # 축 숨기기
    plt.show()
    

     

    그래프를 이미지로 저장

     

    plt.savefig() 함수를 사용하면 현재 Figure에 그려진 그래프를 원하는 이름의 이미지 파일로 저장할 수 있습니다.

    plt.barh(count_by_subject.index, count_by_subject.values, height=0.7, color='blue')
    plt.title('Books by subject')
    # ... (그래프 꾸미는 코드) ...
    plt.savefig('books_by_subject.png') # png 파일로 저장
    plt.show()
    

     

     


     

    마치며

    이번 포스팅에서는 맷플롯립의 기본 요소를 이해하고, 이를 바탕으로 선 그래프와 막대 그래프를 그리는 방법을 다루었습니다.

     

    Figure 객체를 통해 그래프의 크기와 해상도를 조절하고, subplots를 이용해 여러 그래프를 한 번에 시각화하는 방법을 익혔습니다. 또한, plot, bar 등의 함수를 활용하여 데이터를 효과적으로 표현하고 savefig를 통해 결과물을 이미지로 저장하는 과정까지 살펴보았습니다. 이러한 시각화 기술은 복잡한 데이터를 명확하게 전달하는 데 큰 도움이 될 것입니다.

     

     

    코드 출처:

     

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

     

    05-1.ipynb

    Run, share, and edit Python notebooks

    colab.research.google.com

     

     

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

     

    05-2.ipynb

    Run, share, and edit Python notebooks

    colab.research.google.com

     

    이미지 및 내용 출처:

     

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

     

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

     

Designed by Tistory.