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

정규분포의 데이터 셋을 생성하는 randn()과 normal()

by 독학박사 2023. 6. 18.

목차


    산업현장에서 얻는 데이터들은 일반적으로 정규분포의 형태를 갖습니다. 이상감지나, 품질 분석을 위한 로직을 개발한 후에 로직을 검증을 위해 데이터가 필요한데, 현장에서 많은 데이터를 얻지 못한다면 데이터를 생성하여 사용해야 합니다. 이번 포스팅은 파이썬에서 정규분포의 데이터 셋을 만들어 주는 함수에 대해 정리합니다.

     

     

    1. 정규분포를 데이터 필요성

    첫 번째로 정규 분포를 따르는 난수가 필요한 통계 모델링 작업에서 numpy.random.randn 함수를 사용하여 무작위 샘플을 생성해야 합니다. 두 번째는 가우시안 분포를 가정하는 데이터를 생성할 때 사용됩니다. 예를 들어, 이미지 생성, 머신러닝 모델의 가중치 초기화 등에 활용될 수 있습니다. 세 번째는 특정 크기와 분포를 가진 더미 데이터를 생성하여 코드를 테스트하거나 디버깅할 때 유용합니다.

     

    정규분포 데이터 셋 만들기
    정규분포 데이터 셋 만들기

     

     

    2. 정규분포 데이터 셋을 만드는 randn과 normal 함수

    이처럼 데이터나 이미지를 처리하는 프로그래밍에서는 정규분포를 갖는 난수를 생성하는 일이 많이 있습니다. numpy.radom 모듈에서 제공하고 있는 randn과 normal 함수에 대해 사용의 차이와 어떻게 사용되는지 살펴보겠습니다.

     

    randn()

    NumPy 라이브러리에서 제공하는 함수 중 하나입니다. 이 함수는 주어진 형태(shape)의 난수 배열을 생성합니다. 생성된 배열의 요소들은 평균이 0이고 표준 편차가 1인 정규 분포(가우시안 분포)로부터 무작위로 샘플링됩니다. d0, d1, ..., dn: 생성할 배열의 차원을 나타내는 정수들입니다. 각 차원의 크기를 지정합니다.

     

    numpy.random.randn(d0, d1, ..., dn)

     

    randn은 평균과 편차의 값을 내부 인자로 변경할 수 없습니다. 외부에서 평균과 편차를 더해주고 곱해줘서 원하는 평균과 편차를 갖는 데이터 셋을 구성할 수 있습니다. 평균을 mean이라 하고 sigma를 편차라고 하면 아래의 코드는 특정 평균과 편차를 갖는 데이터 셋을 구성하게 됩니다.

     

    sigma*np.random.randn(...)+mean

     

    normal()

    함수는 정규 분포(가우시안 분포)를 따르는 난수를 생성하는 NumPy 함수입니다. 이 함수를 사용하여 특정 평균과 표준 편차를 갖는 난수를 생성할 수 있습니다.

     

    numpy.random.normal(loc, scale, size)

     

    loc: 생성할 난수의 평균
    scale: 생성할 난수의 표준 편차.
    size: 생성할 난수의 개수 또는 배열의 형태(shape)를 나타내는 정수, 튜플 또는 정수 배열입니다. (옵션)

     

    3. randn과 normal 함수의 비교

     우선 randn(1000)이 어떠한 결과를 나타내는지 확인해 보도록 하겠습니다. 랜덤 함수의 특성상 평균과 편차는 실행 때마다 달라질 수 있습니다. 각 코드의 출력 결과물에서 x축과 y축을 서로 비교하시면 결과 구분이 쉽습니다.

     

    import numpy as np
    import matplotlib.pyplot as plt
    
    # 평균 0, 표준 편차 1의 정규 분포를 따르는 난수 생성
    random_numbers = np.random.randn(1000)
    
    mean = np.mean(random_numbers)
    std = np.std(random_numbers)
    
    print("평균:", mean)
    print("표준 편차:", std)
    
    # 히스토그램 그리기
    plt.hist(random_numbers, bins=30, density=True, alpha=0.7, color='steelblue')
    
    # 그래프 레이블 설정
    plt.title("Normal Distribution")
    plt.xlabel("Value")
    plt.ylabel("Density")
    
    # 그래프 보여주기
    plt.show()
    
    # 결과
    # 평균: 0.01133494398046992
    # 표준 편차: 0.9928397430257805

     

    randn으로 생성한 1000개 데이터 분포
    randn으로 생성한 1000개 데이터 분포

     

    이제, randn 함수를 이용하여 평균 5, 편차가 2인 데이터 셋을 만들어 보겠습니다. randn(1000)이 있는 곳에 편차를 곱해준 후 평균을 더해 줍니다.

     

    import numpy as np
    import matplotlib.pyplot as plt
    
    # 평균 5, 표준 편차 2의 정규 분포를 따르는 난수 생성
    mean = 5
    std = 2
    random_numbers = np.random.randn(1000)*std + mean
    
    # 히스토그램 그리기
    plt.hist(random_numbers, bins=30, density=True, alpha=0.7, color='steelblue')
    
    # 그래프 레이블 설정
    plt.title("Normal Distribution")
    plt.xlabel("Value")
    plt.ylabel("Density")
    
    # 그래프 보여주기
    plt.show()

     

    randn을 이용한 특정 평균 및 편차를 갖는 데이터 셋
    randn을 이용한 특정 평균 및 편차를 갖는 데이터 셋

     

     

    normal 함수는 내부 인자를 이용하여 평균과 편차의 값을 지정해 줄 수 있어 좀 더 편리하게 사용할 수 있습니다.

     

    import numpy as np
    import matplotlib.pyplot as plt
    
    # 평균과 표준 편차 설정
    mean = 5.0
    std = 2.0
    
    # 평균과 표준 편차를 갖는 정규 분포를 따르는 난수 생성
    random_numbers = np.random.normal(mean, std, 1000)
    
    # 히스토그램 그리기
    plt.hist(random_numbers, bins=30, density=True, alpha=0.7, color='steelblue')
    
    # 그래프 레이블 설정
    plt.title("Normal Distribution")
    plt.xlabel("Value")
    plt.ylabel("Density")
    
    # 그래프 보여주기
    plt.show()

     

    normal 함수를 이용한 데이터 셋
    normal 함수를 이용한 데이터 셋

     

     

    4. 마치며

    파이선의 numpy 라이브러리의 random 모듈에서 정규분포의 데이터 셋을 만들어 주는 randn과 normal 함수에 대해 정리해 보았습니다.  평균이 0과 편차가 1인 정규분포를 만들 때는 randn을 특정 평균과 편차를 갖는 데이터 셋을 만들 때는 normal을 사용하면 됩니다.