파이썬 넘파이 Numpy 배열에 사용되는 여러가지 통계함수들

파이썬 라이브러리 numpy array 형태의 데이터에 통계를 구해주는 함수들에 대해 알아본다.

import numpy as np

a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
a

array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])

🔺 먼저 1~10을 원소로 가지는 1차원 배열을 가지고 여러 통계함수를 적용해 본다.

합계 sum

a.sum()
55

np.sum(a)
55

🔺 위의 합계 구하는 예시와 같이, numpy array에서 통계함수를 쓰는 두 가지 방법이 있는데

어레이명.함수명() 

np.함수명(어레이명)

이렇게이다.

np.함수명 형태로 하면 numpy안에 분명히 들어있어서 실행이 항상 되지만 가끔 어레이명.함수명() 이렇게 붙이면 실행이 안되는 경우도 있다. 그럴때는 np.함수명(어레이명) 형태로 다시 작성해주도록 한다.

평균 mean

len(a)
10

np.sum(a)/len(a)
5.5

np.mean(a)
5.5

a.mean()
5.5

🔺 a 배열의 길이는 10이고 합을 개수로 나눈것과 평균을 구하는 mean 함수를 사용해서 동일한 값을 얻었다. 이 때도 np.mean() 라고 하던지 a.mean() 형태로 하던지 같은 결과가 나온다.

분산 var, 표준편차 std

np.var(a)
8.25

np.sqrt(np.var(a))
2.8722813232690143

np.std(a)
2.8722813232690143

🔺 numpy array 원소들의 분산 (var) , 분산에 root mean squaure를 한 표준편차, 또는 직접 std 함수로 standard deviation을 구한 예제이다.

분산 :  각 개별치와 평균값의 차이를 제곱한 값을 더한 뒤 개수로 나눈 것. 즉 차이값 제곱의 평균이다.

표준편차 : 데이터가 퍼져있는 정도를 확인하고 싶은데 분산은 데이터의 절대값 스케일이 커져서 그 정도를 알기가 어려운 단점이 있다. 그래서 다시 루트를 씌워서 원래 데이터 스케일에 맞게 줄여준다.

최대 max, 최소 min

np.max(a)
10

np.amax(a)
10

np.min(a)
1

np.amin(a)
1

🔺 넘파이 어레이에서 최대 최소값을 구하는 통계함수로는 max/min을 쓰면 되는데, amax/amin 이라고 해도 동일하다.

최대최소값 인덱스 argmin/argmax

a
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])

np.argmin(a)
0

np.argmax(a)
9

🔺 armin/armax 함수는 최대 최소값을 찾은 후 그 값이 위치한 인덱스를 반환해준다. 최대값 최소값이 어디에 있는지를 알려주는 것이다.

분위수 quantile

np.quantile(a, 0.25)
2.75

np.quantile(a, 0.5)
5.5

np.median(a)
5.5

np.quantile(a, 0.75)
7.25

🔺 boxplot 그래프 그릴때 주로 사용하는 분위수도 구할 수 있다. quantile 함수를 이용해 (배열이름, 구할지점) 형태로 입력하면 값을 도출해준다.

분위수 0.5 (50%) 지점은 중간 즉 중위수이므로 median 이라는 중위수 구하는 함수를 써서 하는것과 같은 값이 나온다.

누적합 cumsum 누적곱 cumprod

np.cumsum(a)
array([ 1,  3,  6, 10, 15, 21, 28, 36, 45, 55, 57, 64])

np.cumprod(a)
array([       1,        2,        6,       24,      120,      720,
           5040,    40320,   362880,  3628800,  7257600, 50803200])

🔺 누적 합을 구해주는 cumsum, 그리고 누적해서 곱을 구해주는 cumprod 함수도 있다.

이제 2차원 배열에서 통계 함수를 사용할 때 축을 지정하는 경우를 살펴보자.

a = np.arange(12).reshape(3,4)
a

array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])


a.shape
(3, 4)

🔺 이렇게 shape(3,4) 3행4열짜리 2차원 어레이를 하나 생성한 뒤,

2차원 축 지정

np.sum(a)
66

np.sum(a, axis=0)
array([12, 15, 18, 21])

np.sum(a, axis=1)
array([ 6, 22, 38])

🔺  그냥 np.sum(어레이이름) 형태로 입력하면 1차원 배열때와 마찬가지로 전체 원소의 합을 구한다. 이 때 axis=0으로 축을 지정해주면 여기서 0은 shape(3,4) 에서 3을 의미하므로 3개로 나눠진 행 방향, 즉 세로방향 vertical 단위로 합계를 구한다.

결과는 0+4+8=12 , 1+5+9=15 , 2+6+10=18 , 3+7+11=21 이렇게이다.

두번째 예시에서 axis=1로 하면 shape(3,4)에서 4를 의미하므로 여기서 4로 나눠진 가로방향 원소들끼리 합계를 구해주게 된다. 0+1+2+3=6 , 4+5+6+7=22 , 8+9+10+11=38 이렇게이다.