본문 바로가기

Programming Language/Python_library

파이썬_응용단계 ep.7 정렬과 통계

320x100
서론

 

촘촘히 꽃혀 있는 서류철과 마린 한 부대, 어떤 공통점이 있을까요?

우리는 어지러이 던져져있는 서류 뭉치들을 보다가

누군가에 의해 잘 정리된 서류철을 볼때면

어딘지 모르게 마음이 편안 해질 때가 있습니다.

 

마찬가지로 잘 정렬된 마린 한 부대는 마음이 편하게 합니다.

전술적으로도 유용하구요!

🙈

 

 

이번 일곱번째 시간에는 numpy에서 배열의 정렬과 기술통계를 확인하고

통계에서 쓰이는 공식에 대해서 짧게 설명하겠습니다.

 

개념적인 내용이 나오지만 수학에 대해서 깊게 알고갈 필요는

없기 때문에, 이러한 기능이 있다는 사실만 알고 있다면

충분합니다.

 

 

 

sort. 정렬

 

행렬 안에 있는 수를 일관되게 정리하는 함수입니다!

2차원 이상인 경우에는 행 혹은 열을 따로따로 정렬합니다.

 

구조
sort(x, axis)

 

 

axis의 값에 따라 구분됩니다.

 

 

axis = 0  (세로) 위에서 아래로 정렬
axis = 1 (가로) 좌에서 우로  정렬
axis = -1 가장 안쪽의 차원이 정렬

 

배열 a를 기준으로 보겠습니다.

 

a = np.array([
    [4, 3, 5, 7],
    [1, 12, 11, 9],
    [2, 15, 1, 14]
])
a

 

array([[ 4,  3,  5,  7],
       [ 1, 12, 11,  9],
       [ 2, 15,  1, 14]])

 

위에서 아래로 정렬합니다.

axis = 0인데 왜 행을 기준으로

좌에서 우로 정렬하지 않나, 의문을 품으실 수 있습니다.

 

np.sort(a, axis=0)
array([[ 1,  3,  1,  7],
       [ 2, 12,  5,  9],
       [ 4, 15, 11, 14]])

 

그럴땐, 좌에서 우로 정렬되는 것이 아니라

모든 행이 마치 큐빅스처럼 위아래로

마구 움직인다고 생각하면 좋을 듯 합니다!

 

 

axis 1 = 수평으로 정렬합니다.

 

np.sort(a, axis=1)
array([[ 3,  4,  5,  7],
       [ 1,  9, 11, 12],
       [ 1,  2, 14, 15]])

 

이 경우에도 모든 열이 움직인다고 보면

좋을 것 같네요.

 

가장 안쪽의 차원 정렬

 

np.sort(a, axis=-1)
array([[ 3,  4,  5,  7],
       [ 1,  9, 11, 12],
       [ 1,  2, 14, 15]])

 

현재는 2차원 배열이기 때문에, axis 1 과

동일하게 반환되는 것을 볼 수 있습니다.

 

sort ( )는 배열에 대한 깊은 복사이기 때문에

배열의 원본에는 수정이 가해지지 않습니다.

수정이 모두 되기 위해선, copy ( )라는 메서드를 써야 합니다.

 

b = a.copy()
b
array([[ 4,  3,  5,  7],
       [ 1, 12, 11,  9],
       [ 2, 15,  1, 14]])

 

b로 a배열을 복사했죠?

 

이 경우 b의 정렬을 바꾸면 원본까지

수정된 채 반환됩니다.

 

b.sort(axis=0)
b
array([[ 1,  2,  5,  7],
       [ 1,  4, 11, 12],
       [ 3,  9, 14, 15]])

 

좋습니다.

데이터를 정렬하는 대신 순서만 알고 싶을때

사용하는 메서드도 있습니다.

 

argsort

 

argsort( )를 사용하면 기본적으로 오름차순으로,

데이터가 전개될 수 있도록 된 주소값이 반환됩니다.

 

a = np.array([42, 38, 12, 25])
a
array([42, 38, 12, 25])

 

j로 argsort를 가해보겠습니다.

 

 

j = np.argsort(a) # 오름차순
array([2, 3, 1, 0])

 

배열 자체가 [12, 25, 38, 42]로 반환되는 경우를 상정하여

오름차순으로 바꿔집니다.

 

j를 내림차순으로 가보겠습니다.

j = np.argsort(a)[::-1]
j
array([0, 1, 3, 2])

 

배열 슬라이싱 [::-1]은 [depth:row:column]중

마지막 항목이 반대로 시작하기 때문에

내림차순으로 인덱싱 됩니다.

 

a 배열 반대로

 

a[j]
array([42, 38, 25, 12])

 

내림차순으로 되었습니다.

 

자 이제 기술통계를 잠깐 진행하겠습니다.

 

기술통계 (descriptive statistics)

 

기술적으로 통계를 이용한다?

technical statistics?

 

아닙니다😢

데이터의 정리, 요약, 표현을 통해 자료의 특성을 규명하는 통계죠!

정량적인 요약, 통계치의 분석에 가깝습니다.

 

numpy와 후에 나올 pandas는 이러한 통계 분석에

상당히 특화되어 있습니다.

 

주로 데이터 집합에 대한 통계를 계산하고,

당연히 쉽게 가공할 수 있도록 만들어 줍니다.

일단 들어가기에 앞서, 배열을 임시로 생성하겠습니다.

 

x = np.array([18,   5,  10,  23,  19,  -8,  10,   0,   0,   5,   2,  15,   8,
              2,   5,   4,  15,  -1,   4,  -7, -24,   7,   9,  -6,  23, -13])
x
array([ 18,   5,  10,  23,  19,  -8,  10,   0,   0,   5,   2,  15,   8,
         2,   5,   4,  15,  -1,   4,  -7, -24,   7,   9,  -6,  23, -13])

 

 

 

가장 쉬운 데이터 갯수세기

 

데이터의 갯수는 len ( ) 을 이용합니다. 지난 파이썬 기초시간에

이미 선보였던 것으로 알고있습니다!

 

len(x)
26

 

 

 

표본 평균
평균은 파이썬 기초단계에서 합계/ 갯수로 배웠습니다.

 

다만 numpy를 사용하면서 mean ( ) 을 사용할 수 있습니다.

 

통계용어로는 표본평균 (sample average, sample mean)이라

합니다.

 

np.mean(x)
4.8076923076923075

 

표본 분산

 

표본 분산(sample variance)란 데이터와 표본 평균간의 거리의 제곱의 평균

입니다. 쉽게 보자면, 표본 분산이 작으면 데이터가 모여있는 것.

크면 흩어져 있는 것입니다.

 

var (  )를 사용하면 배열의 표본 분산이 반환됩니다.

 

np.var(x)
115.23224852071006

 

표본 표준편차

 

표본 표준편차(sample standard variance)는 표본 분산의 양의 제곱근 값

입니다. 요컨대, 자료값들이 서로 얼마나 떨어져 분포되어 있는지

나타내는 값 입니다.

 

np.std(x)
10.734628476137871

 

최댓값과 최솟값

 

이 부분은 자주 반복되는 부분입니다.

기본 연산과 큰 다른점은 없습니다.

 

np.max(x), np.min(x)
(23, -24)

 

중앙값

 

평균, 중앙값, 최빈값은 모두 다르죠?

데이터를 크기대로 정렬했을 때, 가장 가운데에 있는 수 입니다.

 

np.median(x)
5.0

 

행여나, 배열 수가 짝수라면 가장 가운데 있는 두 수의

평균을 사용합니다.

 

사분위수

 

사분위수(quartile)은 데이터를 가장 작은 수부터 - 가장 큰 수까지

크기가 커지는 순서대로 정렬했을 때 [1/4  ,  2/4  , 3/4  [위치에 

있는 수 입니다. 각각 [1사분위수, 2사분위수, 3사분위수] 라고 합니다.

 

 

1 / 4 의 위치는 전체 데이터의 수가  만약 100 개이면

25번째 순서 즉, 하위 25%를 뜻하죠.

 

np.percentile(x, 25)  # 1사분위 수
0.0

 

따라서 2사분위수는 중앙값과 같습니다.

 

np.percentile(x, 50)
5.0

 

3사분위수는 상위 25% 입니다

 

np.percentile(x, 75)
10.0

 

자 사분위수의 0과 100은 어떻게 될까요?

 

np.percentile(x, 0)
-24.0
np.percentile(x, 100)
23.0

 

바로 배열의 최솟값과 최댓값이 나타나게 됩니다.

 

이렇게 하여, 기술통계까지 잠깐 알아보았네요.

사실 pandas까지 얼마 남지 않았습니다.

위 개념들은 계속 활용하게 되니 익숙하게 인식하는 것이

좋겠습니다.

 

다음에는 난수 발생과 데이터 카운팅을 보겠습니다!

 

 

728x90