본문 바로가기
공부 목록/IT & 프로그래밍

데이터의 분포를 가시화 하는 matplotlib 라이브러리의 hist()

by 독학박사 2023. 5. 21.

목차


     막대차트는 x축 값에 상응하는 y값을 나타내어 두 변수의 상관성을 확인할 때 사용합니다. 오늘은 막대바의 그래프를 그리지만 데이터의 분포를 확인할 때 사용되는 hist() 함수에 대해 알아보겠습니다.

     

     

    데이터 분포 확인을 위한 hist() 함수
    데이터 분포 확인을 위한 hist() 함수

     

    1. 데이터 분포 확인을 위한 hist()

     matplotlib hist() 함수는 데이터의 히스토그램을 생성하기 위해 사용됩니다. 히스토그램은 데이터의 분포를 시각화하는 데 사용되며, 각각의 데이터 값 범위를 구간으로 나누고 해당 구간에 속하는 데이터의 빈도를 표시합니다. 이를 통해 데이터의 분포 모양, 중심 경향성, 이상치 여부 등을 파악할 수 있습니다.

     

     

    데이터 가시화가 분석 결과를 나타낼 때 사용하는 반면, hist()는 데이터를 분석하기 전 분석 방향을 잡기 위해 데이터의 생김새를 확인하기 위해 사용됩니다.

     

     

    2. hist() 함수 설명

     hist() 함수에 정의된 인자들은 아래와 같이 많이 존재합니다. log인자의 경우 에러가 발생을 해서 이번 포스팅에서는 다루지 않고 다음에 종합적으로 에러 해결 방안에 대해 정리해 볼 예정입니다.

    matplotlib.pyplot.hist(x, bins=None, range=None, density=False,
    		weights=None, cumulative=False, bottom=None,
            	histtype='bar', align='mid', orientation='vertical',
            	rwidth=None, log=False, color=None, label=None,
            	stacked=False, normed=None, data=None, **kwargs)

     

     

    3. hist() 인자 중 데이터 분석 방법에 응용되는 인자들

    hist() 함수 내 bin, density, cumulative 인자인자들의 특성과 이를 이용한 그래프 설정이 어떻게 다른지 확인해 보겠습니다. 이 인자들은 데이터를 분석하는 시각의 각도를 변화시켜 보다 의미 있게 해석할 수 있도록 도와주는 역할을 합니다.

     

    x: 히스토그램을 생성할 데이터 배열입니다. 이 인자는 필수적으로 제공해야 하는 인자입니다.

    bins: 구간(bin)의 개수를 지정합니다. 기본값은 None이며, 이 경우 알고리즘에 의해 최적의 구간 개수가 자동으로 결정됩니다.

    density: 히스토그램의 막대 높이를 상대적인 빈도로 표시할지(True) 실제 빈도로 표시할지(False) 결정합니다. 기본값은 False입니다.

    cumulative: 누적 히스토그램을 생성할지(True) 단순 히스토그램을 생성할지(False) 결정합니다. 기본값은 False입니다.

     

    기본 히스토그램과 인자값이 변경된 값을 2X2 형태의 subplot으로 구성해 보았습니다.

     

    import numpy as np
    import matplotlib.pyplot as plt
    
    # 데이터 생성
    np.random.seed(1)
    data = np.random.normal(100, 15, 1000)
    
    # 기본 히스토그램
    plt.subplot(2, 2, 1)
    plt.hist(data)
    plt.xlabel('Value')
    plt.ylabel('Frequency')
    plt.title('Default Histogram')
    
    # 구간 개수 조정
    plt.subplot(2, 2, 2)
    plt.hist(data, bins=20)
    plt.xlabel('Value')
    plt.ylabel('Frequency')
    plt.title('Histogram with Custom Bins')
    
    # 상대적인 빈도로 표시
    plt.subplot(2, 2, 3)
    plt.hist(data, density=True)
    plt.xlabel('Value')
    plt.ylabel('Relative Frequency')
    plt.title('Histogram with Density')
    
    # 누적 히스토그램
    plt.subplot(2, 2, 4)
    plt.hist(data, cumulative=True)
    plt.xlabel('Value')
    plt.ylabel('Cumulative Frequency')
    plt.title('Cumulative Histogram')
    
    plt.tight_layout()
    plt.show()

     

    데이터 분석에 도움을 주는 인자들
    데이터 분석에 도움을 주는 인자들

     

    4. 데이터를 이쁘게 꾸며주는 인자들

    orientation, histtype, color, linewidth 인자들은 그래프의 색상과 같이 그래프를 꾸며주는 데 사용합니다.

    orientation: 히스토그램의 방향을 지정합니다. 'vertical' 또는 'horizontal' 중 하나를 선택할 수 있습니다. 기본값은 'vertical'입니다.

    histtype: 히스토그램의 유형을 지정합니다. 가능한 값으로는 'bar', 'barstacked', 'step', 'stepfilled' 등이 있습니다. 기본값은 'bar'입니다.

    color: 히스토그램 막대의 색상을 지정합니다. 단일 색상 또는 색상 목록을 사용할 수 있습니다. 기본값은 None이며, 이 경우 기본 색상이 사용됩니다.

    **kwargs: 추가적인 키워드 인자를 받습니다. 이를 통해 히스토그램 막대의 특정 속성을 설정할 수 있습니다. 예를 들어, alpha, linewidth, edgecolor 등을 지정할 수 있습니다.

     

     위의 인자들을 사용한 예제코드입니다.

     

    import numpy as np
    import matplotlib.pyplot as plt
    
    # 데이터 생성
    np.random.seed(1)
    data = np.random.normal(100, 15, 1000)
    
    # 히스토그램 막대 정렬
    plt.subplot(2, 2, 1)
    plt.hist(data, align='left')
    plt.xlabel('Value')
    plt.ylabel('Frequency')
    plt.title('Histogram with Left Alignment')
    
    # 수평 방향 히스토그램
    plt.subplot(2, 2, 2)
    plt.hist(data, orientation='horizontal')
    plt.xlabel('Frequency')
    plt.ylabel('Value')
    plt.title('Horizontal Histogram')
    
    # 히스토그램 스타일 변경
    plt.subplot(2, 2, 3)
    plt.hist(data, histtype='step', color='red', linewidth=2)
    plt.xlabel('Value')
    plt.ylabel('Frequency')
    plt.title('Histogram with Step Style')
    
    # 누적 히스토그램 스타일
    plt.subplot(2, 2, 4)
    plt.hist(data, histtype='barstacked')
    plt.xlabel('Value')
    plt.ylabel('Frequency')
    plt.title('Histogram with Stacked Bars')
    
    plt.tight_layout()
    plt.show()

     

    그래프를 꾸며주는 인자들
    그래프를 꾸며주는 인자들

     

    5. 그 외의 인자들

     

    그 외의 인자들도 있으니, 아래 설명을 보고 사용하시면 되겠습니다.

    range: 히스토그램을 생성할 데이터의 범위를 지정합니다. 기본값은 None이며, 이 경우 데이터의 최솟값과 최댓값을 기준으로 범위가 설정됩니다.

    weights: 각 데이터 포인트에 대한 가중치를 지정할 수 있는 배열입니다. 기본값은 None입니다.

    bottom: 히스토그램의 막대의 바닥면 위치를 지정합니다. 기본값은 None이며, stacked=True인 경우에 사용됩니다.

    align: 히스토그램 막대의 위치를 조정합니다. 'left', 'mid', 'right' 중 하나를 선택할 수 있습니다. 기본값은 'mid'입니다.

    rwidth: 히스토그램 막대의 너비를 상대적인 값으로 조정합니다. 기본값은 None이며, 이 경우 자동으로 계산됩니다.

    label: 히스토그램에 대한 레이블을 지정합니다. 범례에 표시되는 텍스트로 사용됩니다.

    stacked: 여러 데이터셋이 쌓여 표시되는 경우(stacked=True) 여러 개의 히스토그램을 그리거나 단일 히스토그램을 그릴지(stacked=False) 결정합니다. 기본값은 False입니다.

    normed: density와 동일한 기능을 제공합니다. 이 매개변수는 더 이상 사용되지 않으며, 호환성을 위해 제공됩니다.

    data: 데이터를 제공하는 객체입니다. 일반적으로 사용되지는 않지만, pandas의 DataFrame과 같은 데이터 객체와 함께 사용할 수 있습니다.

    **kwargs: 추가적인 키워드 인자를 받습니다. 이를 통해 히스토그램 막대의 특정 속성을 설정할 수 있습니다. 예를 들어, alpha, linewidth, edgecolor 등을 지정할 수 있습니다.

     

    그 외의 인자들 중에서 그나마 사용할 만한 인자들의 예제 코드입니다.

     

    plt.subplot(2, 2, 1)
    plt.hist(data, range=(80, 120))
    plt.xlabel('Value')
    plt.ylabel('Frequency')
    plt.title('Histogram with Custom Range')
    
    # 투명도 조절
    plt.subplot(2, 2, 2)
    plt.hist(data, alpha=0.5)
    plt.xlabel('Value')
    plt.ylabel('Frequency')
    plt.title('Histogram with Transparency')
    
    # 각 막대의 윤곽선 설정
    plt.subplot(2, 2, 3)
    plt.hist(data, edgecolor='black')
    plt.xlabel('Value')
    plt.ylabel('Frequency')
    plt.title('Histogram with Edgecolor')
    
    # 가중치 적용
    weights = np.ones_like(data) / len(data)
    plt.subplot(2, 2, 4)
    plt.hist(data, weights=weights)
    plt.xlabel('Value')
    plt.ylabel('Frequency')
    plt.title('Histogram with Weights')
    
    plt.tight_layout()
    plt.show()

     

    기타 인자들의 사용
    기타 인자들의 사용

     

     

    6. 마치며

     데이터가 어떻게 분포되어 있는지 한눈에 보기 위해 hist() 함수를 사용한다 했습니다. hist()의 많은 인자 중 데이터 분석에 영향을 줄 수 있는 인자들과, 단순히 그래프의 가독성을 좋게 꾸미기 위해 사용되는 인자가 있습니다. 각 인자들에 대한 설명과 예제 코드를 사용하여 어떻게 그래프가 변하는지도 함께 알아보았습니다. 

    댓글