Pandas DataFrame 통계 (기초)

상후·2025년 4월 18일
post-thumbnail

시작하기 전에 import 하기

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

최대/최소 (max / min)

DataFrame.max(axis=None, skipna=None, level=None, numeric_only=None, kwargs)
DataFrame.min(axis=None, skipna=None, level=None, numeric_only=None, kwargs)

개요

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

사용법

기본 사용법
※ 자세한 내용은 아래 예시를 참고 바랍니다.
df.max(axis=None, skipna=None, level=None, numeric_only=None, kwargs)
df.min(axis=None, skipna=None, level=None, numeric_only=None, kwargs)
axis : {0 : index / 1 : columns} 계산의 기준이 될 축입니다.
skipna : 결측치를 무시할지 여부입니다.
level : Multi Index의 경우 연산을 수행할 레벨입니다.
numeric_only : 숫자, 소수, 부울만 이용할지 여부입니다.
kwargs : 함수에 전달할 추가 키워드입니다.

예시

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

[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)

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

print(df.max())

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

print(df.max(axis=1))

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

print(df.max(skipna=True))


(사용 예시2)

print(df.max(skipna=False))

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

print(df.groupby(level=0).max())

min메서드의 경우
이 아래는 위 예시와 동일하게 min메서드를 수행한 경우 입니다.
(사용 결과1)

print(df.min())


(사용 결과2)

print(df.min(axis=1))


(사용 결과3)

print(df.min(skipna=True))


(사용 결과4)

print(df.min(skipna=False))


(사용 결과5)

print(df.groupby(level=0).min())


평균 (mean)

DataFrame.mean(axis=None, skipna=None, level=None, numeric_only=None, kwargs)
개요

개요

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

사용법

기본 사용법
※ 자세한 내용은 아래 예시를 참고 바랍니다.
df.mean(axis=None, skipna=None, level=None, numeric_only=None, kwargs)
axis : {0 : index / 1 : columns} 계산의 기준이 될 축입니다.
skipna : 결측치를 무시할지 여부입니다.
level : Multi Index의 경우 연산을 수행할 레벨입니다.
numeric_only : 숫자, 소수, 부울만 이용할지 여부입니다.
kwargs : 함수에 전달할 추가 키워드입니다.

예시

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

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)

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

print(df.mean())

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

print(df.mean(axis=1))

skipna인수의 사용
skipna인수를 이용하여 결측치를 무시할지 정할 수 있습니다.
(사용 결과1)

print(df.mean(skipna=True))


(사용 결과2)

print(df.mean(skipna=False))

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

print(df.groupby(level=0).mean())


중앙값 (median)

DataFrame.median(axis=None, skipna=None, level=None, numeric_only=None, kwargs)

개요

median메서드는 행/열의 값들의 중앙값을 구하는 메서드입니다.
만약 수의 갯수가 짝수이면 중앙값 두 값의 평균값을 반환합니다.

사용법

기본 사용법
※ 자세한 내용은 아래 예시를 참고 바랍니다.
df.median(axis=None, skipna=None, level=None, numeric_only=None, kwargs)
axis : {0 : index / 1 : columns} 계산의 기준이 될 축입니다.
skipna : 결측치를 무시할지 여부입니다.
level : Multi Index의 경우 연산을 수행할 레벨입니다.
numeric_only : 숫자, 소수, 부울만 이용할지 여부입니다.
kwargs : 함수에 전달할 추가 키워드입니다.

예시

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

[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)

기본적인 사용법(+axis)
기본적으로 median을 그대로 사용할 경우 모든 행/열에 대해서 연산을 수행합니다.
만약 수의 갯수가 짝수이면 중앙값 두 값의 평균값을 반환합니다.

print(df.median())

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

print(df.median(axis=1))

skipna인수의 사용
skipna인수를 이용하여 결측치를 무시할지 정할 수 있습니다.
(사용 결과1)

print(df.median(skipna=True))


(사용 결과2)

print(df.median(skipna=False))

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

print(df.groupby(level=0).median())


최빈값 (mode)

DataFrame.mode(axis=0, numeric_only=False, dropna=True)

개요

mode메서드는 대상 행/열의 최빈값을 구하는 메서드입니다.
최빈값이 여러개일 경우 모두 표시합니다.

사용법

기본 사용법
※ 자세한 내용은 아래 예시를 참고 바랍니다.
df.mode(axis=0, numeric_only=False, dropna=True)
axis : {0 : index / 1 : columns} 최빈값을 구할 축 입니다.
numeric_only : True일 경우 숫자, 소수, 부울값만 있는 열에대해서만 연산을 수행합니다.
dropna : 결측치를 계산에서 제외할지 여부입니다. False일 경우 결측치도 계산에 포함됩니다.

예시

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

[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)

기본적인 사용법
mode메서드를 사용하면 각 열에 대해서 최빈값이 인덱스 0에 출력됩니다.
만약 최빈값이 여러개일 경우 갯수만큼 인덱스가 생성되어 출력됩니다.
이 때, 최빈값 이외의 값은 NaN을 출력합니다.

print(df.mode())

dropna인수의 사용
기본적으로 결측치는 최빈값 계산에서 제외됩니다. dropna= True로 할 경우 결측치도 계산에 포함되며,
결측치가 제일 많을 경우 최빈값은 결측치가 됩니다.

print(df.mode(dropna=False))

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

# col1, col3에는 문자열 형식이 존재하므로 계산에서 제외됨.
print(df.mode(numeric_only=True))


표준편차 (std)

DataFrame.std(axis=None, skipna=None, level=None, ddof=1, numeric_only=None, kwargs)

개요

std 메서드는 행/열에 대한 표본표준편차를 구하는 메서드입니다.
※ 모표준편차가 아니라 표본표준편차입니다.
※ ※ 후술할 ddof=0 일 경우 자유도가 n이므로 모표준편차로 계산이 가능합니다

모집단과 표본표준편차의 차이점을 알아보자!!

표준편차는 각 측정값과 평균의 차이를 측정하여 해당 자료의 산포도를 나타내는 값입니다.
표준편차의 공식은 자료가 모집단인지 아니면 모집단을 대표하는 표본집단인지에 따라 달라집니다.
만약 자료가 모집단인 경우, 데이터 값의 개수
[N]로 나누고,
만약 자료가 모집단을 대표하는 표본집단인 경우, 표본에 있는 자료값의 개수보다 작은
[n-1]로 나눕니다.

모표준편차

표본표준편차

각 공식은 하나를 제외하고는 모두 동일합니다. 표본집단을 사용할 때에는 모든 측정값의 개수보다 하나를 적게 나눕니다.

모표준편차
다음은 모표준편차 공식입니다

이제, 모표준편차 공식을 배워보겠습니다:
1 단계: 주어진 자료의 평균을 구합니다. 이는 공식에서
[\mu]에 해당합니다.
2 단계: 주어진 측정값에서 평균을 뺀 만큼을 편차라 부릅니다. 편차의 값은 음수나 양수가 될 수도 있습니다.
3 단계: 모든 편차를 제곱하여 양수로 만듭니다.
4 단계: 제곱된 편차들을 모두 더합니다.
5 단계: 제곱된 분산의 합을 모집단에 있는 자료의 개수로 나눕니다. 이 단계에서 나온 값을 분산이라고 합니다.
6 단계: 분산에 제곱근을 씌워 표준편차를 구합니다.

표본표준편차
다음은 표본표준편차 공식입니다

이제, 표본표준편차 공식을 배워보겠습니다:
1 단계: 주어진 자료의 평균을 구하고
[\bar{x}]라고 나타냅니다.
2 단계: 주어진 측정값에서 평균을 뺀 만큼을 편차라 부릅니다. 편차의 값은 음수나 양수가 될 수도 있습니다.
3 단계: 모든 편차를 제곱하여 양수로 만듭니다.
4 단계: 제곱된 편차들을 모두 더합니다.
5 단계: 제곱된 분산의 합을 표본집단의 자료 개수에서 하나를 뺀 값으로 나눕니다. 이 단계에서 나온 값을 분산이라고 합니다.
6 단계: 분산에 제곱근을 씌워 표준편차를 구합니다.

사용법

기본 사용법
※ 자세한 내용은 아래 예시를 참고 바랍니다.
df.std(axis=None, skipna=None, level=None, ddof=1, numeric_only=None, kwargs)
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)

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

print(df.std())

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

print(df.std(skipna=False))

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

print(df.std(axis=1))

ddof인수의 사용
ddof인수란 표본표준편차 계산에 사용되는 분모인 n-ddof 값을 말합니다.
이는 자유도 라고 하며 모표준편차와 표본 표준편차에서 반드시 발생하는 괴리율을 줄이기 위해 사용됩니다.
자유도란 통계적 추정을 할 때 표본자료 중 모집단에 대한 정보를 주는 독립적인 자료의 수를 말합니다.
표본표준편차는 정규분포를 그리는 모 표준편차에 비해서 더 좁은 분산값을 갖기 때문에 n이 아닌 n-1로 나누어줍니다.
※ 보다 자세히 설명하자면 추정량에 대한 증명시 표본분산을 구할 때 n-1로 나누면 정확히 σ²가 나오며
이는 n보다 n-1이 더 값의 정확도가 높음을 의미합니다. 자세한것은 추가로 공부하시는걸 추천드립니다.
자유도에 따라 변하는 값을 보겠습니다. 열당 값은 4개로 즉, n이 4이기 때문에 4부터는 값/0이기때문에 값의 지정이 불가해집니다.
자유도가 증가할 수록 표본 표준편차가 넓어지는것을 확인할 수 있습니다.

(실행 결과1)

print(df.std())


(실행 결과2)

print(df.std(ddof=2))

(실행 결과3)

print(df.std(ddof=3))

(실행 결과4)

print(df.std(ddof=4))


분산 (var)

DataFrame.std(axis=None, skipna=None, level=None, ddof=1, numeric_only=None, kwargs)

개요

var 메서드는 행/열에 대한 불편향분산를 구하는 메서드입니다.
※ 모분산이 아니라 불편향분산을 구하는 메서드입니다. 불편향 메서드란 분모에 n이 아닌 n-1나누는 기대값을 적용해 편향을 제거한 분산입니다.
후술할 ddof=0 일 경우 자유도가 n이므로 모분산으로 계산이 가능합니다

사용법

기본 사용법
※ 자세한 내용은 아래 예시를 참고 바랍니다.
df.var(axis=None, skipna=None, level=None, ddof=1, numeric_only=None, kwargs)
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)

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

print(df.var())

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

print(df.var(skipna=False))

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

print(df.var(axis=1))

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

print(df.groupby(level=0).median())


평균절대편차 (mad)

DataFrame.mad(axis=None, skipna=None, level=None)

개요

mad메서드는 지정한 행/열의 평균절대편차를 구하는 메서드입니다.
평균절대편차는 각 측정값과 평균 사이의 거리의 평균입니다. 값들의 산포도를 의미합니다.

사용법

기본 사용법
※ 자세한 내용은 아래 예시를 참고 바랍니다.
df.mad(axis=None, skipna=None, level=None)
axis : 누적합/누적곱을 구할 축을 지정합니다.
skipna : 결측치를 무시할지 여부 입니다
level : Multi Index의 경우 계산할 레벨을 지정할 수 있습니다.

절대 표준 편차 함수를 만들어보기

def MAD(data):
    # 데이터가 비어 있는 경우, None을 반환 (에러 방지용)
    if len(data) == 0:
        return None  # 또는 raise ValueError("데이터가 비어 있습니다.")
    # 데이터의 평균을 계산
    mean = sum(data) / len(data)
    # 각 데이터 값에서 평균을 뺀 절댓값(편차)을 구해서 리스트로 저장
    deviations = [abs(x - mean) for x in data]
    # 절댓값 편차들의 평균을 구함 (이게 평균절대편차)
    mad = sum(deviations) / len(data)
    # 계산된 평균절대편차를 반환
    return mad
data = [1, 2, 3, 4, 5]
mad = MAD(data)
print("평균절대편차:", mad)


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

DataFrame.cummax(axis=None, skipna=True, args, kwargs)
DataFrame.cummin(axis=None, skipna=True, args, kwargs)

개요

cummax / cummin메서드는 행/열의 누적 최대값/최소값을 구하는 메서드입니다.
위에서부터 아래로 한줄씩 검사하여 해당 행/열 까지의 값중 최대/최소값을 반환합니다.

사용법

기본 사용법
※ 자세한 내용은 아래 예시를 참고 바랍니다.
df.cummax(axis=None, skipna=True, args, kwargs)
df.cummin(axis=None, skipna=True, args, kwargs)
axis : 누적 최대/최소값을 구할 축을 지정합니다.
skipna : 결측치를 무시할지 여부 입니다

예시

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

[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)

기본적인 사용법
cummax / cummin을 사용할 경우 해당 행/열 까지의 값중 최대/최소값을 반환합니다.
(실행 결과1)

print(df.cummax())


(실행 결과2)

print(df.cummin())

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

print(df.cummax(skipna=False))


누적합/누적곱 (cumsum / cumprod)

DataFrame.cumsum(axis=None, skipna=True, args, kwargs)
DataFrame.cumprod(axis=None, skipna=True, args, kwargs)

개요

cumsum / cumprod메서드는 행/열의 누적합/누적곱을 구하는 메서드입니다.
위에서부터 아래로 한줄씩 덧셈/곱셈을 누적하여 수행합니다.

사용법

기본 사용법
※ 자세한 내용은 아래 예시를 참고 바랍니다.
df.cumsum(axis=None, skipna=True, args, kwargs)
df.cumprod(axis=None, skipna=True, args, kwargs)
axis : 누적합/누적곱을 구할 축을 지정합니다.
skipna : 결측치를 무시할지 여부 입니다

예시

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

[N,T,F]=[np.nan,True,False]
df = pd.DataFrame({'col1':[1,-2,5,3,-1,7],'col2':[3,4,N,9,2,5]})
print(df)

기본적인 사용법
cumsum / cumprod을 사용할 경우 해당 행/열 까지의 누적합/누적곱을 반환합니다.
(실행 결과1)

print(df.cumsum())


(실행 결과2)

print(df.cumprod())

skipna 인수의 사용
skipna=False일 경우 결측값이 발생하면 반환값을 결측값으로 반환하게됩니다.

print(df.cumsum(skipna=False))


분위수 (quantile)

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

개요

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

사분위수의 범위를 알아보자(IQR)

다음은 사분위수 범위를 구하는 방법입니다:
1 단계: 측정값들을 최소부터 최대까지 순서대로 나열하세요.
2 단계: 중앙값을 구하세요. 자료의 개수가 홀수이면, 중앙에 위치한 자료가 중앙값이고, 자료의 개수가 짝수이면 중앙에 있는 두 자료의 평균이 중앙값입니다.
3 단계: 제 1사분위수
[(\text{Q}_3)]는 자료의 중앙값을 기준으로 왼쪽 값들의 중앙값을 의미합니다. 제 1사분위수를 구하세요.
4 단계: 제 3사분위수
[(\text{Q}_3)]는 자료의 중앙값을 기준으로 오른쪽 값들의 중앙값을 의미합니다. 제 3사분위수를 구하세요.
5 단계:
[\text{Q}_3-\text{Q}_1]을 계산하여 사분위수 범위를 구하세요.

사용법

기본 사용법
※ 자세한 내용은 아래 예시를 참고 바랍니다.
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)

기본적인 사용법
q의 값에 따라 해당 분위수를 출력하게 됩니다.
0분위수의 경우

# 0분위수인 가장 작은수를 출력
print(df.quantile(q=0))

0.5분위수의 경우

# 0.5분위수인 중간값을 출력
print(df.quantile(q=0.5))

1분위수의 경우

# 1분위수인 가장 큰 값 출력
print(df.quantile(q=1))

interpolation인수의 사용
interpolation은 분위수의 해당하는 값이 없는 경우 어떤 수를 출력할지 정하는 보간법입니다.
linear의 경우 i + (j - i) x 비율입니다.

print(df.quantile(q=0.75, interpolation='linear'))

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

print(df.quantile(q=0.75, interpolation='lower'))

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

print(df.quantile(q=0.75, interpolation='higher'))

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

print(df.quantile(q=0.75, interpolation='midpoint'))

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

print(df.quantile(q=0.75, interpolation='nearest'))


profile
개발자를 꿈꾸는 학생

0개의 댓글