ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CHAPTER 11] 데이터 시각화 | matplotlib
    Deep Learning/인공지능 입문 코딩 2021. 6. 2. 02:00
    728x90

     

    데이터 시각화를 하기위한 파이썬 라이브러리중 하나인 matplotlib 라이브러리를 사용해보자.


    matplotlib

    기본적인 사용법

    matpoltlib을 이용하여 우리나라의 GDP의 변화를 그려봤다.

    import matplotlib.pyplot as plt 
     
    # 우리나라의 연간 1인당 국민소득을 각각 years, gdp에 저장
    years = [1950, 1960, 1970, 1980, 1990, 2000, 2010] 
    gdp = [67.0, 80.0, 257.0, 1686.0, 6505, 11865.3, 22105.3] 
     
    # 선 그래프를 그린다. x축에는 years값, y축에는 gdp 값이 표시된다.
    plt.plot(years, gdp, color='green', marker='o', linestyle='solid') 
     
    # 제목을 설정한다. 
    plt.title("GDP per capita") 
     
    # y축에 레이블을 붙인다. 
    plt.ylabel("dollars") 
    plt.savefig("gdp_per_capita.png", dpi=600)  # png 이미지로 저장 가능
    plt.show() 

    이 코드를 한줄 한줄 살펴보자.

     

    먼저 matplotlib에는 pyplot이라는 서브 패키지가 포함되어 있고, 이것을 이용하여 차트를 그릴 수 있다.

    줄여서 plt로 사용한다.

    import matplotlib.pyplot as plt

     

    연도를 years 리스트에 담고, GDP값은 gdp 리스트에 담는다.

    이 데이터를 기반으로 차트를 그릴 것이다.

    years = [1950, 1960, 1970, 1980, 1990, 2000, 2010] 
    gdp = [67.0, 80.0, 257.0, 1686.0, 6505, 11865.3, 22105.3]

     

    선형 차트를 만들기 위해서 plt의 plot() 함수를 호출한다.

    x축, y축 데이터를 인자로 전달하고 선의 색을 color, 점의 모양을 marker, 선의 두께를 linestyle으로 키워드 인자로 줄 수 있다.

    plt.plot(years, gdp, color='green', marker='o', linestyle='solid') 

     

    차트의 제목은 title() 함수를 호출하여 설정할 수 있다.

    plt.title("GDP per capita") 

     

    ylabel() 함수를 통해 y축 레이블을 넣어주고,

    savefig() 함수를 통해 파일의 이름과 해성도를 dpi단위로 지정하면 이미지 파일 저장도 가능하다.

    show() 함수는 화면에 차트를 표시한다.

    plt.ylabel("dollars")
    plt.savefig("gdp_per_capita.png", dpi=600)
    plt.show()

    그래프를 그리는데 어려운 점은 별로 없는 것 같다. 연습 하다 보면 쉽게 뚝딱뚝딱 할 수 있겠다.

    차트를 구성하는 여러가지 용어

    아래 공식 사이트에서 여러가지 정보들을 확인할 수 있으니 참고하자. 항상 공식 사이트에서 확인 하는 습관을 들이자.

    가장 정확하고 빠르게 확인할 수 있는 방법이다.

    https://matplotlib.org/

     

    Matplotlib: Python plotting — Matplotlib 3.4.2 documentation

     

    matplotlib.org

    공식 사이트에서 가져온 그림이다. 차트를 구성하는 전체적인 용어 정리이다. 외우자!!

    여러 함수 그리기

    아래 세 함수를 동시에 그려보자.

    import matplotlib.pyplot as plt
    
    x = [x for x in range(-20, 20)]  # -20에서 20사이의 수를 1의 간격으로 생성
    y1 = [2 * t for t in x]  # 2*x를 원소로 가지는 y1 함수
    y2 = [t ** 2 + 5 for t in x]  # x**2 + 5를 원소로 가지는 y2 함수
    y3 = [-t ** 2 - 5 for t in x]  # -x**2 - 5를 원소로 가지는 y3 함수
    
    # 빨강색 점선, 녹색 실선과 세모기호, 파랑색 별표와 점선으로 각각의 함수를 표현
    plt.plot(x, y1, 'r--', label="y = 2x")
    plt.plot(x, y2, 'g^-', label="y = x ** 2")
    plt.plot(x, y3, 'b*:', label="y = -x ** 2")
    
    plt.axis([-30, 30, -30, 30])  # 그림을 그릴 영역을 지정함
    
    plt.xlabel('x')  # x축 레이블
    plt.ylabel('y')  # y축 레이블
    plt.title("My plot")  # 제목
    
    plt.legend()  # 디폴트 위치에 범례 표시
    plt.show()
    

    plot()을 호출할때, 'r--', 'g^-', 'b*:'과 같은 포맷을 지정하여 선의 색, 표식의 종류, 선의 형태를 지정할 수 있다.

    r은 red, g는 green, b는 blue를 의미하고, --는 점선, -는 실선, :는 짧은 점선이다. ^는세모, *은 별표 표식을 의미한다.

    이러한 포맷 또한 공식 사이트에서 확인 가능하다.

    plot()에 label인자를 넘겨주어 각 선에 대한 레이블을 지정해 줄 수 있다.

    legend()를 호출하면 범례를 표시한다.


    여러가지 모양의 차트

    막대 차트

    plt.bar()를 이용하여 그릴 수 있다.

    from matplotlib import pyplot as plt 
     
    # 1인당 국민소득 
    years = [1950, 1960, 1970, 1980, 1990, 2000, 2010] 
    gdp = [67.0, 80.0, 257.0, 1686.0, 6505, 11865.3, 22105.3] 
     
    plt.bar(range(len(years)), gdp) 
     
    plt.title("GDP per capita")   # 제목을 설정한다. 
    plt.ylabel("dollars")         # y축에 레이블를 붙인다. 
     
    # y축에 틱을 붙인다. 
    plt.xticks(range(len(years)), years) 
    plt.show()

    산포도 그래프

    산포도 플롯(scatter plot)은 개별 데이터 포인트를 그리는 차트이다.

    plt.scatter()를 이용하여 그릴 수 있다.

    import matplotlib.pyplot as plt 
    import numpy as np 
     
    xData = np.arange(20, 50) 
    yData = xData + 2*np.random.randn(30)   # xData에 randn() 함수로 잡음을 섞는다.
                                            # 잡음은 정규분포로 만들어 질 것이다.
     
    plt.scatter(xData, yData) 
    plt.title('Real Age vs Physical Age') 
    plt.xlabel('Real Age') 
    plt.ylabel('Physical Age') 
     
    plt.show()

    파이 차트

    파이 차트(pie chart)는 데이터의 값에 따라서 원형 비율로 나누어져 있는 차트이다.

    plt.pie()를 이용하여 그릴 수 있다.

    import matplotlib.pyplot as plt 
    
    times = [8, 14, 2] 
    timelabels = ["Sleep", "Study", "Play"]
    
    # autopct로 백분율을 표시할 때 소수점 2번째 자리까지 표시하게 한다.
    # labels 매개 변수에 timelabels 리스트를 전달한다.
    plt.pie(times, labels = timelabels, autopct = "%.2f") 
    plt.show() 

    히스토그램

    히스토그램(histogram)은 주어진 자료를 몇개의 구간으로 나누고 각 구간의 도수(frequency)를 조사하여 나타낸 막대 그래프이다.

    plt.hist()를 이용하여 그릴 수 있다. 몇개의 구간으로 나눌지는 bins를 통해 조절한다.

    import matplotlib.pyplot as plt 
     
    books = [ 1, 6, 2, 3, 1, 2, 0, 2 ] 
    
    # 6개의 빈을 이용하여 books 안에 저장된 자료의 히스토그램 그리기
    plt.hist(books, bins = 6)   
    
    plt.xlabel("books") 
    plt.ylabel("frequency") 
    plt.show()
    

     

    겹처진 히스토 그램도 그릴 수 있다.

    hist() 함수를 x와 y에 대해 호출 하고 alpha 값을 통해 투명도를 조절할 수 있다.

    import numpy as np 
    import matplotlib.pyplot as plt 
     
    n_bins = 10 
    x = np.random.randn(1000) 
    y = np.random.randn(1000) 
     
    plt.hist(x, n_bins, histtype='bar', color= "red"); 
    plt.hist(y, n_bins, histtype='bar', color= "blue", alpha=0.3); 
    plt.show()
    

    상자 차트

    상자 차트(box chart)는 데이터의 최대, 최소, 중간값과 사분위 수 등을 효율적으로 가시화할 수 있는 차트이다.

    import numpy as np
    import matplotlib.pyplot as plt
    
    data1 = [1, 2, 3, 4, 5]
    data2 = [2, 3, 4, 5, 6]
    
    plt.boxplot([data1, data2])
    plt.show()
    

    중간의 상자중앙값을 중심으로 상위 25%와 하위 25%의 값이 모여 있는 구간을 표시한다.

    위쪽 whisker 에서 아래쪽 whisker 까지가 데이터가 분포 하는 범위이다. 그런데 이 범위 밖에 데이터가 존재하는 경우도 있는데 이것을 이상치(outlier)라고한다. 튀는 값은 제외한다는 뜻이다.

     


    한 화면에 여러 그래프 그리기 : subplots()

    subplots() 함수를 이용하여 한 화면에 여러 그래프를 그리는 방법을 살펴보자.

    import matplotlib.pyplot as plt 
    import numpy as np 
     
    np.random.seed(19680801) 
    data = np.random.randn(2, 100) 
     
     # 2 x 2개, 크기가(5, 5) 인치
    fig, axs = plt.subplots(2, 2, figsize=(5, 5)) 
    
    axs[0, 0].hist(data[0]) 
    axs[1, 0].scatter(data[0], data[1]) 
    axs[0, 1].plot(data[0], data[1]) 
    axs[1, 1].hist2d(data[0], data[1]) 
     
    plt.show()

    data는 (2, 100)의 shape을 가지는 정규분포를 따르는 2차원 난수 배열이다.

    subplots() 함수를 호출하며 2 x 2 개의 칸을 만들고 크기는 (5, 5)인치로 지정해 주었다.

    axs[0, 0]이라고 하면 2 x 2 격자에서 첫 번째(왼쪽 위)를 위미한다. 이러한 방식으로 각 격자를 인덱싱하여 서로 다른 차트를 그릴 수 있다.


    지금까지 배운것들로

    닥스훈트, 사모예드, 말티즈의 몸통 길이와 높이의 데이터가 있다.

     

    닥스훈트

    길이 77 78 85 83 73 77 73 80
    높이 25 28 29 30 21 22 17 35

    사모예드

    길이 75 77 86 86 79 83 83 88
    높이 56 57 50 53 60 53 49 61

    말티즈

    길이 34 38 38 41 30 37 41 35
    높이 22 25 19 30 21 24 28 18

    강아지들의 정보를 차트로 나타내어 보자.

    import matplotlib.pyplot as plt
    import numpy as np
    
    dachshund = np.array([
        [77, 78, 85, 83, 73, 77, 73, 80],
        [25, 28, 29, 30, 21, 22, 17, 35]
    ])
    samoyed = np.array([
        [75, 77, 86, 86, 79, 83, 83, 88],
        [56, 57, 50, 53, 60, 53, 49, 61]
    ])
    maltese = np.array([
        [34, 38, 38, 41, 30, 37, 41, 35],
        [22, 25, 19, 30, 21, 24, 28, 18]
    ])
    
    plt.scatter(dachshund[0], dachshund[1], color='r', label='Dachshund')
    plt.scatter(samoyed[0], samoyed[1], color='b', marker='^', label='samoyed')
    plt.scatter(maltese[0], maltese[1], color='g', marker='s', label='maltese')
    
    plt.title('Dog size')
    plt.xlabel('Length')
    plt.ylabel('Height')
    
    plt.legend()
    plt.show()
    

    scatter를 이용하여 그리면 강아지 종에따라 어떠한 분포를 하는지 한눈에 볼 수 있다.

     

    728x90

    'Deep Learning > 인공지능 입문 코딩' 카테고리의 다른 글

    [CHAPTER 13] OpenCV  (0) 2021.06.06
    [CHAPTER 12] 데이터 분석 | pandas  (1) 2021.06.03
    [CHAPTER 10]넘파이(numpy)  (0) 2021.05.30
    [CHAPTER 9] 텍스트 처리  (0) 2021.05.29
    [CHAPTER 8] 딕셔너리와 집합  (0) 2021.05.24

    댓글

Designed by Tistory.