ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [3강] 데이터의 중심 측정(scipy, numpy 사용)
    기초지식/Quantopian(강의노트) 2024. 11. 7. 07:59
    반응형

    산술평균

    scipy 와 numpy 라이브러리

    scipy와 numpy는 기본적인 수치 연산 기능을 지원하고, 행렬의 연산 기능을 제공하는 라이브러리이다. numpy를 바탕으로 과학 및 공학계산 등 추가적인 복잡한 계산기능을 추가한 것이 scipy 이므로 기본적으로 numpy를 이용해서 계산하되 numpy 라이브러리에서 해결되지 않는 것들을 scipy를 이용해서 처리하면 된다. 두 라이브러리 모두 설치하고자 하는 가상환경에 들어가서 아래와 같은 설치 명령어를 입력하면 설치가 가능하다. 

    pip install numpy
    pip install scipy

    산술평균의 정의

    산술평균은 관측값의 합을 관측값의 개수로 나눈 값이다. 아래와 같이 8 개의 숫자배열이 있다고 가정하자. 숫자배열의 합을(np.sum(숫자배열)) 숫자배열의 개수(len(숫자배열))로 나누면  3.625라는 산술평균을 얻을 수 있다. numpy 라이브러리의 mean 함수를 사용해도 3.625라는 같은 결과를 얻을 수 있다.

    숫자배열 = [1, 2, 2, 3, 4, 5, 5, 7]
    산술평균 = np.sum(숫자배열) / len(숫자배열)
    numpy산술평균 = np.mean(숫자배열)
    print(산술평균, numpy산술평균) # 3.625 출력됨

    중간값

    데이터를 오름차순 또는 내림차순으로 정렬했을 때 리스트의 중간에 위치하는 값이다. 중앙값은 위에서 정의한 산술평균보다 데이터의 극단 값에 덜 영향을 받는다는 특징을 갖고 있다. 중간값을 구하는 방법은 먼저 숫자배열의 개수(n = len(숫자배열))을 파악하고, 숫자배열을 오름차순으로 정렬한 배열을 얻는 것부터 시작한다. 만약 숫자배열의 개수가 홀수이면 즉, 2로 나눴을 때 1이 남는다면 "n / 2"번째 항목을 뽑아내면 중간값이다.(파이썬의 배열은 0부터 시작한다는 것을 생각하면 쉽다.) 그리고 숫자배열의 개수가 짝수이면, "n / 2 - 1"번째 항목과 "n / 2"번째 항목 값의 중간값을 구하면 된다. numpy 라이브러리의 median 함수를 사용해도 3.5라는 같은 결과를 얻을 수 있다. 

    오름차순정렬 = sorted(숫자배열)
    n = len(숫자배열)
    # 리스트 길이가 홀수인 경우 중간값을 반환
    if n % 2 == 1:
        중간값 = 오름차순정렬[int(n / 2)]
    # 리스트 길이가 짝수인 경우 중간 두 값의 평균을 반환
    else:
        중간1 = int(n / 2 - 1)
        중간2 = int(n / 2)
        중간값 = (오름차순정렬[중간1] + 오름차순정렬[중간2]) / 2
    
    numpy중간값 = np.median(숫자배열)
    print(중간값, numpy중간값)

    최빈값

    데이터 집합에서 가장 자주 나타나는 값을 의미한다. 최빈값이 유용하게 사용되는 경우는 각각의 결과가 독립적인 경우이다. 각각의 제품 판매는 독립적이므로 가장 많이 팔린 제품을 찾는 경우, 가장 많이 팔린 옷 사이즈를 찾는 경우 등을 예로 들 수 있다. 최빈값은 숫자배열2의 항목들로 딕셔너리 데이터(파이썬 : 데이터 형식(&Pandas 데이터) 참조)를 만들어서 구할 수 있다. 숫자배열2의 숫자들 각각에 대해서 키값이 존재하지 않으면 최초의 값이니까 value를 1로 넣고, 존재하면 기존 value에 1을 더하는 식으로 딕셔너리를 만들어 나갈 수 있다. 숫자배열2 = [1,2,2,3,4,5,5,5,7] 이라는 데이터를 통해서 딕셔너리= {1: 1, 2: 2, 3: 1, 4: 1, 5: 3, 7: 1}  데이터를 만들 수 있다. 딕셔너리에서 value가 가장 높은 key 값이 숫자배열2에서 가장 많이 등장한 값이므로 최빈값이 된다. 즉, 3의 value를 가진 5가 최빈값이 된다. scipy의 stats 클래스의 mode 함수를 이용해도 5라는 최빈값을 구할 수 있다.

    숫자배열2 = [1, 2, 2, 3, 4, 5, 5, 5, 7]
    딕셔너리 = {}
    
    for 숫자 in 숫자배열2:
        if 숫자 in 딕셔너리:
            딕셔너리[숫자] += 1
        else: 
            딕셔너리[숫자] = 1
    최빈값 = max(딕셔너리, key=딕셔너리.get)
    scipy최빈값 = stats.mode(숫자배열2)
    print(최빈값, scipy최빈값)

    기하평균

    산술평균이 덧셈을 이용하여 평균을 구하는 반면, 기하 평균은 곱셈을 이용하여 평균을 구한다. 산술평균은 관측값의 합을 관측값의 개수로(n개) 나눈 것인데 반해 기하평균은 관측값의 곱에 대해 n 제곱근을 취한 값이다. 기하평균은 prod(숫자배열) 함수를 통해서 숫자배열의 각 항목을 곱하고, **(1/len(숫자배열)) 함수를 통해서 n 제곱근을 취한 값을 찾으면 구할 수 있다. scipy 의 stats 클래스의 gmean 함수를 이용해도 3.094...이라는 기하평균값을 구할 수 있다.

    기하평균 = (np.prod(숫자배열))**(1/len(숫자배열))
    scipy기하평균 = stats.gmean(숫자배열)
    print(기하평균, scipy기하평균)

    조화평균

    조화평균은 사용빈도가 낮은 평균으로 역수의 산술평균의 역수이다. 평균 속도를 계산하는 경우, 여러 비율의 평균을 구할 때 주로 사용한다. 조화평균은 식 그대로 분자에 len(숫자배열)을 통해서 항목의 개수를 넣고, 분모에 sum( 1 / 숫자 for 숫자 in 숫자배열)을 통해서 역수의 합을 구하는 식을 넣어주면 구할 수 있다. scipy의 stats 클래스의 hmean 함수를 이용해도 2.5590...이라는 조화평균값을 구할 수 있다.

    조화평균 = len(숫자배열) / sum(1 / 숫자 for 숫자 in 숫자배열)
    scipy조화평균 = stats.hmean(숫자배열)
    print(조화평균, scipy조화평균)

     

    반응형
Designed by Tistory.