programming/파이썬으로 배우는 통계학

[파이썬/통계] Python에 의한 기술 통계 : scipy의 기본

Jofresh 2023. 5. 5. 22:07
728x90
반응형

안녕하세요! 조신선입니다.

 

오늘은 scipy라이브러리에 대해서 배워보고 앞전에 배웠던 넘파이,판다스와 같이 사용하는 방법에 대해서 포스팅 해보도록 하겠습니다!

 

오늘도 역시나 주피터 환경으로 시작하겠습니다.

 

scipy란?

Scipy는 과학, 공학, 경제학 등에서 자주 사용되는 여러 기능을 제공하는 파이썬 라이브러리 중 하나입니다. Scipy는 다양한 부분 패키지로 구성되어 있으며, 이들 패키지는 고성능 선형 대수, 최적화, 통계 분석, 푸리에 변환, 신호 처리 등 다양한 과학 기술 계산에 사용됩니다. Scipy는 NumPy와 같이 작동하기 때문에 두 라이브러리를 함께 사용하여 다양한 과학, 공학 및 경제학 문제를 해결할 수 있습니다.

 

 

필요한 라이브러리 임포트

import numpy as np
import scipy as sp

%precision 3

 

예시 데이터

- 물고기 데이터로 예시를 들겠습니다.

- array에는 물고기의 몸길이를 임의대로 넣도록 합니다.

 

fish_data = np.array([2,3,3,4,4,4,4,5,5,6])
fish_data

 

scipy 함수

합계

아래 다섯 줄의 코드는 모두 fish_data 배열의 합계 또는 길이를 계산합니다.

sp.sum(fish_data): Scipy 라이브러리의 sum 함수를 사용하여 fish_data의 합계를 계산합니다.
np.sum(fish_data): Numpy 라이브러리의 sum 함수를 사용하여 fish_data의 합계를 계산합니다.
fish_data.sum(): Numpy 배열의 메서드를 사용하여 fish_data의 합계를 계산합니다.
sum(fish_data): 파이썬 기본 내장 함수인 sum을 사용하여 fish_data의 합계를 계산합니다.
len(fish_data): fish_data 배열의 길이(데이터 포인트 수)를 계산합니다.

 

평균

fish_data 배열의 평균값을 구하는 함수입니다.

 

표본 분산

표본분산(sample variance)은 주어진 데이터 샘플의 분산을 계산하는 통계량으로, 데이터 포인트들 간의 거리(편차)를 이용하여 데이터의 변동성(산포도)을 계산합니다. 표본분산은 다음과 같이 계산됩니다.

각 데이터 포인트에서 전체 데이터의 평균을 뺍니다.
1에서 구한 값을 제곱합니다.
2에서 구한 값을 모두 더한 후, 데이터의 개수로 나눕니다.
즉, 표본분산은 데이터가 평균에서 얼마나 떨어져 있는지를 나타내는 값으로, 값이 클수록 데이터가 평균에서 멀리 떨어져 있다는 것을 의미합니다.

아래 코드는 표본분산을 계산하기 위한 공식을 코드로 표현한 것입니다.

sp.sum((fish_data - mu) ** 2) : 각 데이터에서 평균을 뺀 차이값을 제곱한 값을 모두 더합니다.
/ N : 모든 데이터의 개수 N으로 나누어 표본분산을 계산합니다.
sp.var(fish_data, ddof=0)은 N으로 나누는 대신, 분모에 (N-ddof)를 사용하여 비편향 추정량으로 계산합니다.


여기서 ddof는 자유도를 의미하는데, 분산을 계산할 때 모분산을 계산하는 식에는 분모에 N이 사용됩니다. 하지만 우리가 가지고 있는 데이터는 모집단의 모든 값을 수집한 것이 아니라 일부 샘플 데이터입니다. 그래서 우리는 모집단에서 뽑은 샘플 데이터를 가지고 모분산을 추정하게 됩니다. 이 때, 전체 데이터 수(N)에서 1을 뺀 값(N-ddof)으로 나누어주는 것이 바람직합니다. 대부분의 경우 ddof=1로 지정합니다.

 

편분산&표준편차

표준편차(standard deviation)는 자료의 분산(variance)의 양의 제곱근으로 계산됩니다. 즉, 표준편차는 분산과 동일한 의미를 지니며, 데이터가 평균으로부터 얼마나 흩어져 있는지를 나타내는 지표입니다. 평균값과 함께 사용되며, 편차(각 데이터와 평균간의 차이)들의 제곱근의 평균으로 계산되므로, 이상치(outlier)에 민감하지 않습니다. 표준편차가 작을수록 데이터가 평균 근처에 모여 있고, 클수록 흩어져 있는 것으로 해석할 수 있습니다.

아래 코드에서 sigma_2는 편향되지 않은 표본 분산, sigma는 편향되지 않은 표본 표준편차를 계산합니다.  ddof는 "자유도 감소(degree of freedom)"를 나타내며, 분모에서 빼주는 값으로, 표본 통계량이 모집단 통계량과 얼마나 다를지를 보정하는 데 사용됩니다.

 

따라서 sp.var(fish_data, ddof=1)은 fish_data의 편향되지 않은 표본 분산을 계산하고, sp.std(fish_data, ddof=1)은 fish_data의 편향되지 않은 표본 표준편차를 계산합니다.

 

표준화

fish_data - mu : fish_data에서 평균(mu)을 뺀 값들을 반환합니다. 이를 통해 각 데이터 포인트들이 평균에서 얼마나 떨어져 있는지를 알 수 있습니다.

sp.mean(fish_data - mu) : fish_data - mu의 평균을 계산합니다. 이 값은 0이 나와야 합니다. 이를 통해 fish_data에서 평균 mu를 뺀 값들이 전체적으로 얼마나 평균적으로 떨어져 있는지를 확인할 수 있습니다.

fish_data / sigma : fish_data에서 표준편차 sigma로 나눈 값을 반환합니다. 이는 fish_data의 값들을 표준화한 값으로, 각 데이터 포인트가 평균에서 몇 개의 표준편차만큼 떨어져 있는지를 알 수 있습니다.

sp.std(fish_data / sigma, ddof = 1) : fish_data를 표준화한 값들의 표준편차를 계산합니다. 이 값은 1이 나와야 합니다. 이를 통해 fish_data의 분산이 표준화한 값들에서 1이 된다는 것을 확인할 수 있습니다.

standard = (fish_data - mu) / sigma : fish_data의 각 데이터 포인트를 표준화한 값을 standard 변수에 저장합니다.

sp.mean(standard) : standard의 평균을 계산합니다. 이 값은 0이 나와야 합니다. 이를 통해 fish_data의 값들을 표준화했을 때, 전체적으로 평균에서 얼마나 떨어져 있는지를 확인할 수 있습니다.

sp.std(standard, ddof = 1) : standard의 표준편차를 계산합니다. 이 값은 1이 나와야 합니다. 이를 통해 fish_data의 값들을 표준화했을 때, 데이터 포인트들이 평균으로부터 얼마나 퍼져 있는지를 확인할 수 있습니다.

scipy.stats와 사분위점

stats.scoreatpercentile(data, percentile) 함수는 데이터에서 주어진 백분위수에 해당하는 값을 계산해줍니다. data 인수는 데이터 배열을 의미하며, percentile은 0에서 100 사이의 백분위수 값을 의미합니다.

위 코드에서는 fish_data_3 데이터의 25번째 백분위수와 75번째 백분위수를 각각 계산하고 출력합니다. fish_data_3 배열에서 25%와 75%에 해당하는 값이 각각 3과 7입니다. 따라서 stats.scoreatpercentile(fish_data_3, 25)는 3을 출력하고, stats.scoreatpercentile(fish_data_3, 75)는 7을 출력합니다.

728x90
반응형