본문 바로가기
Python/Pandas

pandas에서의 통계함수(메서드)-pandas(36)

by 콩돌 2020. 10. 11.
반응형

파이썬 버전 3.8 기준

pandas 버전 1.1.1 기준


 pandas에서의 통계함수(메서드)


본 포스팅에서는 다음과 같은 pandas에서 제공하는 다양한 통계함수에 대해 설명해보도록 한다.

  ○ count(요소개수), sum(합), mean(평균), mad(평균절대편차), abs(절대값), prod(곱)

  ○ median(중앙값), min(최소값), max(최대값), mode(최빈값)

  ○ std(표준편차), var(편차)

  ○ sem(평균의 표준오차), skew(표본왜도), kurt(표본첨도), quantile(분위수)

  ○ cumsum(누적합), cumprod(누적곱), cummax(누적최대값), cummin(누적최소값)

 

 설명적 통계량(Descriptive statistic) 도출 메서드

 

pandas에는 Series와 DataFrame을 기반으로 기술통계학적 계산과 이와 관련된 연산을 수행하는 많고 다양한 메서드가 존재한다.

  ○ 대부분은 sum(), mean(), quantile()과 같이 더 낮은 차원을 생성하는 집계연산(aggregation)이다. 

  ○ 누적데이터를 출력하는 cumsum()과 cumprod()와 같은 함수는 같은 사이즈의 객체를 생성한다.


일반적으로 이 메서드들은 ndarray와 같이{sum, std, ...} axis 입력변수를 가지며, 이 변수에는 축을 나타내는 정수나 문자열이 입력된다.

  ○ Series의 경우에는 1차원 데이터 객체이기 때문에 axis 입력변수가 없다.

  ○ DataFrame에는 "index"(정수로는 0, 기본값), "columns"(정수로는 1)으로 설정 가능하다.

 

 

 통계 메서드 종류

아래에 각 함수에 대한 요약이 있다. 

이것들은 또한 사용자 필요에 따라 사용될 수도 있는 level 입력변수를 가지며 이는 멀티인덱스에 적용할 수 있다.

  ○ count : 누락데이터(NaN)가 아닌 데이터의 수

  ○ sum : 값들의 합

  ○ mean : 값들의 평균

  ○ mad : 평균 절대 편차

  ○ median : 값의 산술 중앙값

  ○ min : 최소값

  ○ max : 최대값

  ○ mode : 최빈값

  ○ abs : 절대값

  ○ prod : 값의 곱

  ○ std : 베셀 보정 표본 표준 편차

  ○ var : 비편향 편차

  ○ sem : 평균의 표준 오차

  ○ skew : 표본 왜도 (3차 moment)

  ○ kurt : 표본 첨도 (4차 moment)

  ○ quantile : 표본 분위수 (%에서의 값)

  ○ cumsum : 누적 합

  ○ cumprod : 누적 곱

  ○ cummax : 누적 최대값

  ○ cummin : 누적 최소값

 

 

 일반적인 통계 메서드 사용 형식

다음은 일반적인 통계 메서드의 사용 형식을 보여준다.


메서드 사용 형식)

result=Object.method(axis=None, skipna=True, level=None, numeric_only=None)

 

메서드별 공통 입력변수에 대한 설명은 다음과 같다.

  ○ axis: 함수를 적용할 축을 지정한다.

    ▷ Series에 적용될 경우 이 입력변수 0 or ‘index’만 사용할 수 있다.

    ▷ 0 or ‘index’: 함수를 각 열(columns)에 따라 적용한다.

    ▷ 1 or ‘columns’: 함수를 각 행(row)에 따라 적용한다.

  ○ skipna: 기본값은 True이며, NA/null 값들을 제외시킨다. 

    ▷ False일 경우 NaN이 존재할 때 계산이 불가능하므로 NaN을 출력한다.
     count, mode 메서드에는 이 입력변수는 존재하지 않는다. 
      - mode 메서드는 대신에 dropna 입력변수가 존재한다.

아래의 입력변수는 cumsum()과 cumprod()와 같이 같은 사이즈의 결과를 출력하는 메서드에는 없다.

  ○ level: 멀티인덱스인 경우 메서드가 적용되는 특정 레벨을 선택한다.

     mode 메서드에는 해당 입력변수는 존재하지 않는다.

  ○ numeric_only: 숫자 자료형(int, float, boolean) 등만 계산하는지 여부를 결정한다.

    ▷ None일 경우 모든 자료형을 연산을 수행하는 것을 시도한다. 

    ▷ True일 경우 숫자형 자료인 경우에만 계산을 수행한다.

     mad 메서드에는 이 입력변수는 존재하지 않는다.

이외 각각의 메서드의 다른 입력변수를 보고싶다면 pandas 공식 홈페이지에서 직접 검색해서 확인해보도록 하자.
 

 예외적인 사용형식의 통계 메서드

위의 형식과는 다르게 사용되는 통계메서드들이 존재한다.


quantile() 메서드

quantile() 메서드는 %분위수를 계산해야하는 메서드 이므로 분위수를 입력하는 변수가 있다.

또한 분위수 결과값 출력 시 보간(interpolation) 방식을 설정하는 변수 역시 존재한다.


메서드 사용 형식)

result=Object.quantile(q=0.5, axis=0, numeric_only=True, interpolation='linear')


위에 함수와 중복되는 입력변수(axis, numeric_only)는 본 섹션에선 설명을 생략한다.

  ○ q: 출력하는 분위수를 입력받는다.

    ▷ 기본값은 0.5이며 즉 50% 분위수이다.

  ○ interpolation: 분위수 결과가 두 데이터 i와 j 사이에 존재할때 보간하는 방식을 결정한다.

    ▷ 'linear': i+(j-i)*fraction 방식으로 계산한다. (기본값)

      - fraction은 인덱스 데이터를 이용하여 계산되는 값이다.

    ▷ 'lower': i를 취한다.

    ▷ 'higher': j를 취한다.

    ▷ 'nearest': i랑 j 중 가까운 데이터를 취한다.

    ▷ 'midpoint': (i+j)/2 방식으로 계산한다.

 

abs() 메서드

abs() 메서드와 같은 경우 입력변수가 존재하지 않으며 아래와 같이 입력변수 입력 없이 바로 적용하면 된다.

 

abs 메서드 사용 형식)

result=Object.abs()

 


 통계 메서드 사용 예제

 

예제를 수행하기 위해 다음과 같이 기본적인 셋업을 수행한다.


모듈의 임폴트)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np

 

skipna 의 사용

통계 메서드들은 skipna 옵션이 존재하며, 이를 통해 누락데이터들을 처리할 수 있다.

  ○ 대부분 기본값은 skipna가 True로 설정되어있다.


skipna의 사용 예제)

# 예제용 DataFrame의 정의

In[4]: sample_df= pd.DataFrame([[9.1, 1.2, 1.3, np.nan], [2.1, 9.2, 9.3, 2.4], [np.nan, 3.2, 3.3, 3.4]], index=['a', 'b', 'c'], columns=['A','B','C','D'])


# ex1: skipna 사용 예제

In[5]: sample_df.sum(axis=0, skipna=False)

Out[5]: 

A     NaN

B    13.6

C    13.9

D     NaN

dtype: float64


In[6]: sample_df.sum(axis=0, skipna=True)

Out[6]: 

A    11.2

B    13.6

C    13.9

D     5.8

dtype: float64

 

 

통계 메서드 사용 예제

브로드캐스팅(broadcasting)과 산술메서드들을 조합하여, 다양한 통계적 절차를 묘사할 수 있다. 

대표적인 예로 표준화(standarization) 등이 있다.

  ○ 데이터를 영평균으로 만들고 표준편차를 1로 만든다. 

 

표준화 사용 예제)

# 예제용 DataFrame의 정의

In[7]: sample_df= pd.DataFrame([[9.1, 1.2, 1.3, 1.4], [2.1, 9.2, 9.3, 2.4], [3.1, 3.2, 3.3, 3.4]], index=['a', 'b', 'c'], columns=['A','B','C','D'])


# ex2-1: 산술연산을 병행한 표준화 수행 예제

In[7]: sample_df_stand=(sample_df-sample_df.mean())/ sample_df.std()

In[8]: sample_df_stand

Out[8]: 

          A         B         C    D

a  1.144586 -0.800641 -0.800641 -1.0

b -0.704361  1.120897  1.120897  0.0

c -0.440225 -0.320256 -0.320256  1.0


In[9]: sample_df_stand.std()

Out[9]: 

A    1.0

B    1.0

C    1.0

D    1.0

dtype: float64


In[10]: sample_df_stand.mean()

Out[10]: 

A    1.850372e-17

B    2.220446e-16

C   -5.551115e-17

D    0.000000e+00

dtype: float64


# ex2-2: 산술메서드를 활용한 표준화 수행 예제

In[11]: sample_df_stand2=sample_df.sub(sample_df.mean(axis=1), axis=0).div(sample_df.std(axis=1), axis=0)

In[12]: sample_df_stand2

Out[12]: 

          A         B         C         D

a  1.499671 -0.525526 -0.499890 -0.474255

b -0.902680  0.853218  0.877949 -0.828487

c -1.161895 -0.387298  0.387298  1.161895


In[13]: sample_df_stand2.std(axis=1)

Out[13]: 

a    1.0

b    1.0

c    1.0

dtype: float64


In[14]: sample_df_stand2.mean(axis=1)

Out[14]: 

a    0.000000e+00

b    0.000000e+00

c   -3.386180e-15

dtype: float64

 

 

누적 데이터 출력 메서드

cumsum()과 cumprod()와 같은 메서드들은 기본적으로 NaN 값들의 위치를 보존한다.

  ○ 단 skipna 변수를 통해 NaN 발생시 데이터의 출력 방식을 조절할 수 있다.

 

누적 데이터 출력 메서드 사용 예제)

# 예제용 DataFrame의 정의

In[15]: sample_df= pd.DataFrame([[9.1, 1.2, 1.3, np.nan], [2.1, 9.2, 9.3, 2.4], [np.nan, 3.2, 3.3, 3.4]], index=['a', 'b', 'c'], columns=['A','B','C','D'])


# ex3: 누적 데이터 출력 메서드 사용 예제

In[16]: sample_df.cumsum()

Out[16]: 

      A     B     C    D

a   9.1   1.2   1.3  NaN

b  11.2  10.4  10.6  2.4

c   NaN  13.6  13.9  5.8


In[17]: sample_df.cumsum(axis=1)

Out[17]: 

     A     B     C     D

a  9.1  10.3  11.6   NaN

b  2.1  11.3  20.6  23.0

c  NaN   3.2   6.5   9.9


In[18]: sample_df.cumsum(axis=1, skipna=False)

Out[18]: 

     A     B     C     D

a  9.1  10.3  11.6   NaN

b  2.1  11.3  20.6  23.0

c  NaN   NaN   NaN   NaN

 

 

Series의 Numpy 함수로의 적용

NumPy 함수에 Series를 입력할 경우 누락데이터를 자동으로 제거시키고 계산을 수행한다.

 

모듈의 임폴트)

# ex4: numpy 함수로의 적용 예제

In[19]: np.sum(sample_df['A'])

Out[19]: 11.2

In[20]: np.sum(sample_df['A'].to_numpy())

Out[20]: nan

 

 

누락값이 아닌 데이터 숫자의 개수 반환

Series.nunique() 는 누락값들이 아닌 데이터의 숫자를 반환한다.


nunique() 메서드 사용 예제)

# ex5: nunique 메서드 사용 예제

In[21]: sample_df['A'].nunique()

Out[21]: 2

 


 

 

 

 

 참고자료

  https://pandas.pydata.org/docs/user_guide/basics.html

 

 

 

 

 

반응형

댓글