2025-04-18

장상희·2025년 4월 18일

파이썬

목록 보기
18/31

평균절대편차 mad함수 만들기

!pip install pandas

import pandas as pd
from pandas import DataFrame
from pandas import Series
import numpy as np
import numba

def mad(data):
  
    avg = np.average(data)#데이터의 평균을 구한다
    abs_deviation = [abs(x - avg) for x in data]#abs_deviation(절대편차)를 구하는 거다 (for x in data는  0부터 훓어준다,abs(x-avg)는 절대값으로 바꿔 x에 평균값을 빼준다)
    return np.average(abs_deviation)#절대편차의 평균을 구한다

data = (2,8,0,7)
print(mad(data))

최대/최소 (max / min)

min / max 메서드는 행/열 의 최대값, 최소값을 구하는 메서드 입니다.

axis : {0 : index / 1 : columns} 계산의 기준이 될 축입니다.

skipna : 결측치를 무시할지 여부입니다.

level : Multi Index의 경우 연산을 수행할 레벨입니다.

numeric_only : 숫자, 소수, 부울만 이용할지 여부입니다.

kwargs : 함수에 전달할 추가 키워드입니다.

[N,T,F]=[np.NaN,True,False]
idx = [['IDX1','IDX1','IDX2','IDX2'],['row1','row2','row3','row4']]
col = [['COL1','COL1','COL2','COL2'],['val1','val2','val3','val4']]
data = [[N,13,3,4],[5,7,10,8],[15,6,N,3],[2,14,9,1]]
df = pd.DataFrame(data,idx,col)
print(df)
>>
           COL1       COL2
           val1 val2  val3 val4
IDX1 row1   NaN   13   3.0    4
     row2   5.0    7  10.0    8
IDX2 row3  15.0    6   NaN    3
     row4   2.0   14   9.0    1

기본적인 사용법(+axis)

기본적으로 df.max( ) / df.min( )를 사용할 경우 모든 행/열에 대해서 최대/최소 값을 찾습니다.

print(df.max())
>>
COL1  val1    15.0
      val2    14.0
COL2  val3    10.0
      val4     8.0
dtype: float64

axis를 설정해 줄 경우 축을 지정할 수 있습니다.

print(df.max(axis=1))
>>
IDX1  row1    13.0
      row2    10.0
IDX2  row3    15.0
      row4    14.0
dtype: float64

skipna인수의 사용

skipna인수를 사용할 경우 계산에 대해서 결측치를 포함하거나 제외시킬 수 있습니다.

print(df.max(skipna=True))
>>
COL1  val1    15.0
      val2    14.0
COL2  val3    10.0
      val4     8.0
dtype: float64
print(df.max(skipna=False))
>>
COL1  val1     NaN
      val2    14.0
COL2  val3     NaN
      val4     8.0
dtype: float64

level의 설정

Multi Index의 경우 연산을 수행할 level을 지정할 수 있습니다.

print(df.max(level=0))
>>
      COL1       COL2
      val1 val2  val3 val4
IDX1   5.0   13  10.0    8
IDX2  15.0   14   9.0    3
# print(df.groupby(level=0).max()) 와 동일한 역할을 수행

min메서드의 경우

이 아래는 위 예시와 동일하게 min메서드를 수행한 경우 입니다.

print(df.min())
>>
COL1  val1    2.0
      val2    6.0
COL2  val3    3.0
      val4    1.0
dtype: float64
print(df.min(axis=1))
>>
IDX1  row1    3.0
      row2    5.0
IDX2  row3    3.0
      row4    1.0
dtype: float64
print(df.min(skipna=True))
>>
COL1  val1    2.0
      val2    6.0
COL2  val3    3.0
      val4    1.0
dtype: float64
print(df.min(skipna=False))
>>
COL1  val1    NaN
      val2    6.0
COL2  val3    NaN
      val4    1.0
dtype: float64
print(df.min(level=0))
>>
     COL1      COL2
     val1 val2 val3 val4
IDX1  5.0    7  3.0    4
IDX2  2.0    6  9.0    1
# print(df.groupby(level=0).min())와 동일

mean(평균)

mean메서드는 행/열의 값들의 평균을 구하는 메서드입니다.

axis : {0 : index / 1 : columns} 계산의 기준이 될 축입니다.

skipna : 결측치를 무시할지 여부입니다.

level : Multi Index의 경우 연산을 수행할 레벨입니다.

numeric_only : 숫자, 소수, 부울만 이용할지 여부입니다.

kwargs : 함수에 전달할 추가 키워드입니다.

idx = [['IDX1','IDX1','IDX2','IDX2'],['row1','row2','row3','row4']]
col = [['COL1','COL1','COL2','COL2'],['val1','val2','val3','val4']]
data = [[N,13,3,4],[5,7,10,8],[15,6,N,3],[2,14,9,1]]
df = pd.DataFrame(data,idx,col)
print(df)
>>
           COL1       COL2
           val1 val2  val3 val4
IDX1 row1   NaN   13   3.0    4
     row2   5.0    7  10.0    8
IDX2 row3  15.0    6   NaN    3
     row4   2.0   14   9.0    1

기본적인 사용법(+axis)

기본적으로 mean을 그대로 사용할 경우 모든 행/열에 대해서 연산을 수행합니다.

print(df.mean())
>>
COL1  val1     7.333333
      val2    10.000000
COL2  val3     7.333333
      val4     4.000000
dtype: float64

axis 인수를 이용하여 대상 축을 지정할 수 있습니다.

print(df.mean(axis=1))
>>
IDX1  row1    6.666667
      row2    7.500000
IDX2  row3    8.000000
      row4    6.500000
dtype: float64

skipna인수의 사용

skipna인수를 이용하여 결측치를 무시할지 정할 수 있습니다.

print(df.mean(skipna=True))
>>
COL1  val1     7.333333
      val2    10.000000
COL2  val3     7.333333
      val4     4.000000
dtype: float64
print(df.mean(skipna=False))
>>
COL1  val1     NaN
      val2    10.0
COL2  val3     NaN
      val4     4.0
dtype: float64

level인수의 사용

Multi Index의 경우 대상 레벨을 지정할 수 있습니다.

print(df.mean(level=0))
>>
     COL1       COL2
     val1  val2 val3 val4
IDX1  5.0  10.0  6.5  6.0
IDX2  8.5  10.0  9.0  2.0
# print(df.groupby(level=0).mean())와 완전히 동일합니다.

중앙값 (median)

median메서드는 행/열의 값들의 중앙값을 구하는 메서드입니다.

만약 수의 갯수가 짝수이면 중앙값 두 값의 평균값을 반환합니다.

axis : {0 : index / 1 : columns} 계산의 기준이 될 축입니다.

skipna : 결측치를 무시할지 여부입니다.

level : Multi Index의 경우 연산을 수행할 레벨입니다.

numeric_only : 숫자, 소수, 부울만 이용할지 여부입니다.

kwargs : 함수에 전달할 추가 키워드입니다.

[N,T,F]=[np.NaN,True,False]
idx = [['IDX1','IDX1','IDX2','IDX2'],['row1','row2','row3','row4']]
col = [['COL1','COL1','COL2','COL2'],['val1','val2','val3','val4']]
data = [[N,13,3,4],[5,7,10,8],[15,6,N,3],[2,14,9,1]]
df = pd.DataFrame(data,idx,col)
print(df)
>>
           COL1       COL2
           val1 val2  val3 val4
IDX1 row1   NaN   13   3.0    4
     row2   5.0    7  10.0    8
IDX2 row3  15.0    6   NaN    3
     row4   2.0   14   9.0    1

기본적인 사용법(+axis)

기본적으로 median을 그대로 사용할 경우 모든 행/열에 대해서 연산을 수행합니다.

만약 수의 갯수가 짝수이면 중앙값 두 값의 평균값을 반환합니다.

print(df.median())
>>
COL1  val1     5.0 # 2, 5, 15의 중앙값인 5
      val2    10.0 # 6, 7, 13, 14 의 중앙값은 7과 13의 평균인 10
COL2  val3     9.0
      val4     3.5
dtype: float64

axis 인수를 이용하여 대상 축을 지정할 수 있습니다.

print(df.median(axis=1))
>>
IDX1  row1    4.0
      row2    7.5
IDX2  row3    6.0
      row4    5.5
dtype: float64

skipna인수의 사용

skipna인수를 이용하여 결측치를 무시할지 정할 수 있습니다.

print(df.median(skipna=True))
>>
COL1  val1     5.0
      val2    10.0
COL2  val3     9.0
      val4     3.5
dtype: float64
print(df.median(skipna=False))
>>
COL1  val1     NaN
      val2    10.0
COL2  val3     NaN
      val4     3.5
dtype: float64

level인수의 사용

Multi Index의 경우 대상 레벨을 지정할 수 있습니다.

print(df.groupby(level=0).median())
>>
     COL1       COL2
     val1  val2 val3 val4
IDX1  5.0  10.0  6.5  6.0
IDX2  8.5  10.0  9.0  2.0

최빈값 (mode)

mode메서드는 대상 행/열의 최빈값을 구하는 메서드입니다.

최빈값이 여러개일 경우 모두 표시합니다.

axis : {0 : index / 1 : columns} 최빈값을 구할 축 입니다.

numeric_only : True일 경우 숫자, 소수, 부울값만 있는 열에대해서만 연산을 수행합니다.

dropna : 결측치를 계산에서 제외할지 여부입니다. False일 경우 결측치도 계산에 포함됩니다.

[N,T,F]=[np.NaN,True,False]
idx = ['row1','row2','row3','row4']
col = ['col1','col2','col3','col4']
data = [['A',2,'x',N],['B',2,'y',N],['C',1,'y',1],['A',N,'z',3]]
df = pd.DataFrame(data,idx,col)
print(df)
>>
     col1  col2 col3  col4
row1    A   2.0    x   NaN
row2    B   2.0    y   NaN
row3    C   1.0    y   1.0
row4    A   NaN    z   3.0

기본적인 사용법

mode메서드를 사용하면 각 열에 대해서 최빈값이 인덱스 0에 출력됩니다.

만약 최빈값이 여러개일 경우 갯수만큼 인덱스가 생성되어 출력됩니다.

이 때, 최빈값 이외의 값은 NaN을 출력합니다.

print(df.mode())
>>
  col1  col2 col3  col4
0    A   2.0    y   1.0
1  NaN   NaN  NaN   3.0
# col4의 최빈값이 1과 3으로 두개이기 때문에 두개 다 출력, 나머지는 최빈값이
# 하나이므로 1행에는 NaN출력

dropna인수의 사용

기본적으로 결측치는 최빈값 계산에서 제외됩니다. dropna= True로 할 경우 결측치도 계산에 포함되며,

결측치가 제일 많을 경우 최빈값은 결측치가 됩니다.

print(df.mode(dropna=False))
>>
  col1  col2 col3  col4
0    A   2.0    y   NaN
# col4에는 NaN이 가장 많으므로 최빈값이 NaN으로 계산됨.

numeric_only인수의 사용

numeric_only인수가 True인 경우 숫자 or bool형태가 아닌 자료형을 갖는 열은 계산에서 제외됩니다.

Copyprint(df.mode(numeric_only=True))
>>
   col2  col4
0   2.0   1.0
1   NaN   3.0
# col1, col3에는 문자열 형식이 존재하므로 계산에서 제외됨.

표준편차 (std)

std 메서드는 행/열에 대한 표본표준편차를 구하는 메서드입니다.

※ 모표준편차가 아니라 표본표준편차입니다.

  • *※ ※ 후술할 ddof=0 일 경우 자유도가 n이므로 모표준편차로 계산이 가능합니다 **모표준편차표본표준편차 σ(모표준편차)=Σ|x−μ|2ns(표본표준편차)=Σ|x−μ|2n−ddof

axis : 표본표준편차를 구할 축을 지정합니다.

skipna : 결측치를 무시할지 여부입니다.

level : Multi Index의 경우 대상 레벨을 지정할 수 있습니다.

ddof : 표본표준편차 계산의 분모가되는 자유도를 지정합니다. 산식은 n - ddof값으로 기본값은 n-1입니다.

numeric_only : 숫자, 소수, bool로 구성된 열만 대상으로할지 여부입니다.

kwargs : 함수의 경우에 추가적으로 적용할 키워드입니다.

[N,T,F]=[np.NaN,True,False]
idx = [['IDX1','IDX1','IDX2','IDX2'],['row1','row2','row3','row4']]
col = ['col1','col2','col3','col4']
data = [[1,5,7,13],[5,2,19,1],[13,6,4,12],[8,N,0,8]]
df = pd.DataFrame(data,idx,col)
print(df)
>>
           col1  col2  col3  col4
IDX1 row1     1   5.0     7    13
     row2     5   2.0    19     1
IDX2 row3    13   6.0     4    12
     row4     8   NaN     0     8

기본적인 사용법

인수입력 없이 std메서드를 사용할 경우 각 열의 요소들의 표본표준편차를 계산합니다.

print(df.std())
>>
col1    5.057997
col2    2.081666
col3    8.185353
col4    5.446712
dtype: float64

skipna인수의 사용

skipna=False인 경우 결측값이 포함된 경우 NaN을 출력합니다.

print(df.std(skipna=False))
>>
col1    5.057997
col2         NaN
col3    8.185353
col4    5.446712
dtype: float64

axis인수의 사용

axis 인수를 통해 계산의 대상이 될 축을 지정할 수 있습니다.

print(df.std(axis=1))
>>
IDX1  row1    5.000000
      row2    8.341663
IDX2  row3    4.425306
      row4    4.618802
dtype: float64

level인수의 사용

Multi Index의 경우 level 인수를 이용해 레벨을 지정할 수 있습니다.

print(df.std(level=0))
>>
          col1     col2      col3      col4
IDX1  2.828427  2.12132  8.485281  8.485281
IDX2  3.535534      NaN  2.828427  2.828427
print(df.std())
>>
col1    5.057997
col2    2.081666
col3    8.185353
col4    5.446712
dtype: float64
print(df.std(ddof=2))
>>
col1     6.194756
col2     2.943920
col3    10.024969
col4     6.670832
dtype: float64
print(df.std(ddof=3))
>>
col1     8.760708
col2          NaN
col3    14.177447
col4     9.433981
dtype: float64
print(df.std(ddof=4))
>>
col1   NaN
col2   NaN
col3   NaN
col4   NaN분산 (var)

분산(var)

var 메서드는 행/열에 대한 불편향분산를 구하는 메서드입니다.

※ 모분산이 아니라 불편향분산을 구하는 메서드입니다. 불편향 메서드란 분모에 n이 아닌 n-1나누는 기대값을 적용해 편향을 제거한 분산입니다.

  • *※ ※ 후술할 ddof=0 일 경우 자유도가 n이므로 모분산으로 계산이 가능합니다 **모분산불편향분산 σ2(모분산)=Σ|x−μ|2nS2(불편향분산)=Σ|x−μ|2n−ddof

axis : 불편향분산을 구할 축을 지정합니다.

skipna : 결측치를 무시할지 여부입니다.

level : Multi Index의 경우 대상 레벨을 지정할 수 있습니다.

ddof : 불편향분산 계산의 분모가되는 자유도를 지정합니다. 산식은 n - ddof값으로 기본값은 n-1입니다.

numeric_only : 숫자, 소수, bool로 구성된 열만 대상으로할지 여부입니다.

kwargs : 함수의 경우에 추가적으로 적용할 키워드입니다.

먼저 기본적인 사용법 예시를 위해 4x4짜리 Multi Index 객체를 생성하겠습니다.

[N,T,F]=[np.NaN,True,False]
idx = [['IDX1','IDX1','IDX2','IDX2'],['row1','row2','row3','row4']]
col = ['col1','col2','col3','col4']
data = [[1,5,7,13],[5,2,19,1],[13,6,4,12],[8,N,0,8]]
df = pd.DataFrame(data,idx,col)
print(df)
>>
           col1  col2  col3  col4
IDX1 row1     1   5.0     7    13
     row2     5   2.0    19     1
IDX2 row3    13   6.0     4    12
     row4     8   NaN     0     8

기본적인 사용법

인수입력 없이 var메서드를 사용할 경우 각 열의 요소들의 불편향분산을 계산합니다.

int(df.var())
>>
col1    25.583333
col2     4.333333
col3    67.000000
col4    29.666667
dtype: float64

skipna인수의 사용

skipna=False인 경우 결측값이 포함된 경우 NaN을 출력합니다.

print(df.var(skipna=False))
>>
col1    25.583333
col2          NaN
col3    67.000000
col4    29.666667
dtype: float64

axis인수의 사용

axis 인수를 통해 계산의 대상이 될 축을 지정할 수 있습니다.

print(df.var(axis=1))
>>

IDX1  row1    25.000000
      row2    69.583333
IDX2  row3    19.583333
      row4    21.333333
dtype: float64

level인수의 사용

Multi Index의 경우 level 인수를 이용해 레벨을 지정할 수 있습니다.

print(df.groupby(level=0).var())
>>
      col1  col2  col3  col4
IDX1   8.0   4.5  72.0  72.0
IDX2  12.5   NaN   8.0   8.0

누적 최대/최소 (cummax / cummin)

cummax / cummin메서드는 행/열의 누적 최대값/최소값을 구하는 메서드입니다.

위에서부터 아래로 한줄씩 검사하여 해당 행/열 까지의 값중 최대/최소값을 반환합니다.

axis : 누적 최대/최소값을 구할 축을 지정합니다.

skipna : 결측치를 무시할지 여부 입니다

[N,T,F]=[np.NaN,True,False]
df = pd.DataFrame({'col1':[1,-2,5,3,0,7],'col2':[3,4,N,9,2,5]})
print(df)
>>
   col1  col2
0     1   3.0
1    -2   4.0
2     5   NaN
3     3   9.0
4     0   2.0
5     7   5.0

기본적인 사용법

cummax / cummin을 사용할 경우 해당 행/열 까지의 값중 최대/최소값을 반환합니다.

print(df.cummax())
>>
   col1  col2
0     1   3.0
1     1   4.0
2     5   NaN # col1에서 최대값 5발생
3     5   9.0 # col2에서 최대값 9발생
4     5   9.0
5     7   9.0 # col1에서 최대값7 발생
print(df.cummin())
>>
   col1  col2
0     1   3.0
1    -2   3.0 # col1에서 최소값 -2발생
2    -2   NaN
3    -2   3.0
4    -2   2.0 # col2에서 최소값 2 발생
5    -2   2.0

skipna 인수의 사용

skipna=False일 경우 결측값이 발생하면 최대/최소값을 결측값으로 반환하게됩니다.

print(df.cummax(skipna=False))
>>
   col1  col2
0     1   3.0
1     1   4.0
2     5   NaN # col2에서 결측값 발생
3     5   NaN
4     5   NaN
5     7   NaN
#결측값이 반환되면 쭉 반환된

분위수 (quantile)

cumsum / cumprod메서드는 행/열의 누적합/누적곱을 구하는 메서드입니다.

위에서부터 아래로 한줄씩 덧셈/곱셈을 누적하여 수행합니다.

axis : 누적합/누적곱을 구할 축을 지정합니다.

skipna : 결측치를 무시할지 여부 입니다

quantile메서드는 해당 행/열의 분위수의 해당하는 값을 반환하는 메서드입니다.

사용법

기본 사용법

※ 자세한 내용은 아래 예시를 참고 바랍니다.

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

q : 분위수 입니다. 소수로 표현합니다. (예 : 75% = 0.75)

aixs : 분위수의 값을 구할 축입니다.

numeric_only : 수(소수)만 대상으로할지 여부입니다. False일 경우 datetime 및 timedelta 데이터의 분위수도 계산됩니다.

interpolation : 분위수에 값이 없을때 보간하는 방법입니다. 방식은 아래와 같습니다.

liner : i + (j - i) x 비율 [분위수 앞, 뒤 수 간격 * 비율]

lower : i [분위수 앞, 뒤수 중 작은수]

higher : j [분위수 앞, 뒤수 중 큰수]

midpoint : (i+j)÷2 [분위수 앞, 뒤수의 중간값]

nearest : i or j [분위수 앞, 뒤수중 분위수에 가까운 수]

예시

먼저 기본적인 사용법 예시를 위해 3x3짜리 객체를 생성하겠습니다.

idx = ['row1','row2','row3']
col = ['col1','col2','col3']
data= [[0,1,32],[50,10,-9],[100,100,18]]

df = pd.DataFrame(data,idx,col)
print(df)
>>
      col1  col2  col3
row1     0     1    32
row2    50    10    -9
row3   100   100    18

기본적인 사용법

q의 값에 따라 해당 분위수를 출력하게 됩니다.

0분위수의 경우

print(df.quantile(q=0))
# 0분위수인 가장 작은수를 출력
>>
col1    0.0
col2    1.0
col3   -9.0
Name: 0.0, dtype: float64

0.5분위수의 경우

print(df.quantile(q=0.5))
# 0.5분위수인 중간값을 출력
>>
col1    50.0
col2    10.0
col3    18.0
Name: 0.5, dtype: float64

1분위수의 경우

print(df.quantile(q=1))
# 1분위수인 가장 큰 값 출력
>>
col1    100.0
col2    100.0
col3     32.0
Name: 1.0, dtype: float64

interpolation인수의 사용

interpolation은 분위수의 해당하는 값이 없는 경우 어떤 수를 출력할지 정하는 보간법입니다.

linear의 경우 i + (j - i) x 비율입니다.

print(df.quantile(q=0.75, interpolation='linear'))
>>
col1    75.0
col2    55.0
col3    25.0
Name: 0.75, dtype: float64

lower의 경우 i [분위수 앞, 뒤수 중 작은수] 입니다.

print(df.quantile(q=0.75, interpolation='lower'))
>>
col1    50
col2    10
col3    18
Name: 0.75, dtype: int64

higher의 경우 j [분위수 앞, 뒤수 중 큰수] 입니다.

col1    100
col2    100
col3     32
Name: 0.75, dtype: int64

midpoint의 경우 (i+j)÷2 [분위수 앞, 뒤수의 중간값] 입니다.

print(df.quantile(q=0.75, interpolation='midpoint'))
>>
col1    75.0
col2    55.0
col3    25.0
Name: 0.75, dtype: float64

nearest의 경우 i or j [분위수 앞, 뒤수중 분위수에 가까운 수] 입니다.

print(df.quantile(q=0.75, interpolation='nearest'))
>>
col1    100
col2    100
col3     32
Name: 0.75, dtype: int64
profile
프로그래머 꿈나무

0개의 댓글