Pandas DataFrame 통계 (심화)

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

시작하기 전에 import 하기

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

공분산 (cov)

DataFrame.cov(min_periods=None, ddof=1)

개요

cov 메서드는 결측값을 제외한 쌍별 공분산을 구하는 메서드입니다.
공분산이란 확률변수가 2가지 일때 얼마나 퍼져있는가를 구하는 방법입니다.
즉, 두 값을 X축 Y축으로 놓고 점산도를 그렸을때 퍼진 정도라고 할 수 있습니다.

사용법

기본 사용법
※ 자세한 내용은 아래 예시를 참고 바랍니다.
df.cov(min_periods=None, ddof=1)
min_periods : 공분산을 구할 최소 요소의 갯수 입니다. 요소의 갯수가 모자르면 NaN을 반환합니다.

예시

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

col = ['X','Y']
data1 = [[-6,-3],[-4,-1],[-2,-3],[0,1],[2,2]]
data2 = [[7,-4],[4,-1],[2,0],[-1,3],[-4,9]]
data3 = [[3,-4],[3,-1],[3,0],[3,3],[3,9]]
df1 = pd.DataFrame(data=data1, columns=col)
df2 = pd.DataFrame(data=data2, columns=col)
df3 = pd.DataFrame(data=data3, columns=col)

기본적인 사용법
df1은 좌표평면상에서 x가 증가할때 y도 증가하는 경향을 가집니다.
이때 공분산(cov)값은 0보다 크며 양의 상관관계라고 합니다.

print(df1.cov())

df2은 좌표평면상에서 x가 증가할때 y는 감소하는 경향을 가집니다.
이때 공분산(cov)값은 0보다 작으며 음의 상관관계라고 합니다.

print(df2.cov())

df3은 좌표평면상에서 y가 변하여도 x는 변하지 않습니다.
이처럼 x와 y가 상관 없는경우 공분산(cov)값은 0입니다.

print(df3.cov())

min_periods인수의 사용
min_periods인수는 공분산에 이용될 요소의 최소 갯수를 제한합니다.
이 숫자보다 요소의 수가 적을 경우 NaN을 반환합니다.

print(df3.cov(min_periods=6))


첨도 (kurt / kurtosis)

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

개요

kurt 메서드는 데이터의 첨도를 구하는 메서드 입니다.
첨도란 데이터의 확률분포가 얼마나 뾰족한지를 나타내는 통계언어입니다.

사용법

기본 사용법
※ 자세한 내용은 아래 예시를 참고 바랍니다.
df.kurt(axis=None, skipna=None, level=None, numeric_only=None, kwargs)
axis : 첨도를 구할 축을 지정합니다
skipna : 결측치를 무시할지 여부 입니다. 기본값은 True로 계산시 무시됩니다.
level : 멀티인덱스의 경우 레벨을 지정할 수 있습니다.
numeric_only : float, int, bool 형식만 포함할지 여부 입니다.

예시

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

l = [-9,-5,-1,-1,0,0,0,0,0,1,1,5,9] # leptokurtic
m = np.random.normal(0,1,13) # mesokurtic
p = [-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6] # Platykurtic
data = {"col1":l,"col2":m,"col3":p}
df = pd.DataFrame(data)
print(df)

그래프로 표시

기본적인 사용법
첨도는 정규분포의 m=0 기준으로, 정규분포보다 뾰족한 경우 m>0, 정규분포보다 완만한 경우 m<0으로 값을 계산 할 수 있습니다. m<0 인 경우를 leptokurtic 이라고하고 m=0 인 경우 mesokurtic 이라고하며 m>0 인 경우 platykurtic 이라고 합니다.

col1열의 경우 숫자의 분포가 가장자리가 적고 가운데로 갈수록 많아집니다.
이렇듯 가운데가 뾰족한 경우(정규분포에 비해) 첨도 kurt는 0보다 크게 됩니다.

print(df.kurt())

col2의 경우 numpy를 이용해 평균=0, 표준편차=1 인 정규분포에 근접하는 난수를 출력하였습니다. 따라서 kurt의 값은 0에 근접한 값이 출력됩니다.

print(df.kurt())

col3의 경우 고른 분포를 그리는 수로 구성되어있으므로 뭉툭한(정규분포에 비해) 경우이므로 kurt의 값은 0보다 작게 됩니다.

print(df.kurt())


표준오차 (sem)

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

개요

sem메서드는 값들의 표준오차를 구하는 메서드 입니다.
표준 오차는 표본평균들의 표준편차로, 직관적으로 보면 추정값인 표본평균들과 참값인 모평균(표본평균의 평균)과의 표준차이 라고 할 수 있습니다.
이를 이용하여 표본평균의 정밀도를 표현할 수 있습니다.
편차(변량-평균)의 제곱의 평균의 제곱근값이 표준편차이듯, 오차(추정값-참값)의 제곱의 평균의 제곱근값이 표준오차가 됩니다.

사용법

기본 사용법
※ 자세한 내용은 아래 예시를 참고 바랍니다.
sem(axis=None, skipna=None, level=None, ddof=1, numeric_only=None, kwargs)
axis : 첨도를 구할 축을 지정합니다
skipna : 결측치를 무시할지 여부 입니다. 기본값은 True로 계산시 무시됩니다.
level : 멀티인덱스의 경우 레벨을 지정할 수 있습니다.
ddof : 자유도를 표시합니다.
numeric_only : float, int, bool 형식만 포함할지 여부 입니다.

예시

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

a = [1,1,1,1,1]
b = [1,2,3,4,5]
c = [20,40,60,80,100]
data = {"col1":a,"col2":b,"col3":c}
df = pd.DataFrame(data)
print(df)

기본적인 사용법
col1의 경우 모든 요소가 같기 때문에 표본평균의 평균과 표본편균이 완벽하게 일치하여 표준오차가 없기 때문에 sem=0 을 반환하게 됩니다.

print(df.sem())

col2와 col3의 경우를 비교해보면 표준평균의 차이는 각 값들이 더 조밀한 col2가 더 작기 때문에 표준오차의 경우 표본평균의 표준편차도 더 작을수 밖에없습니다. 즉, col2의 sem값이 col3의 sem값보다 작습니다.

print(df.sem())


왜도비대칭도(skew)

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

개요

skew는 왜도 또는 비대칭도 라고도 하며, 평균에 대해 최빈값이 얼마나 치우쳐져있는지를 나타내는 척도입니다.
왜도는 우측으로 치우칠수록 음의값, 좌측으로 치우칠수록 양의 값을 가집니다.

사용법

기본 사용법
※ 자세한 내용은 아래 예시를 참고 바랍니다.
df.skew(axis=None, skipna=None, level=None, numeric_only=None, kwargs)
axis : 왜도를 구할 축을 지정합니다
skipna : 결측치를 무시할지 여부 입니다. 기본값은 True로 계산시 무시됩니다.
level : 멀티인덱스의 경우 레벨을 지정할 수 있습니다.
numeric_only : float, int, bool 형식만 포함할지 여부 입니다.

예시

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

a = [-5,-4,-3,-3,-2,-2,-1,-1,-1,0,0,0,0,0,1,1,1,2]
b = [-3,-2,-1,-1,-1,-1,0,0,0,0,0,0,1,1,1,1,2,3]
c = [-2,-1,-1,-1,0,0,0,0,0,1,1,1,2,2,3,3,4,5,]
data = {"col1":a,"col2":b,"col3":c}
df = pd.DataFrame(data)

기본적인 사용법
col1의 경우 최빈값이 우측으로 치우쳐져 있기 때문에, 왜도값은 음수를 가집니다.

print(df.skew())

col2의 경우 대칭구조를 가지기 때문에 왜도값은 0이 됩니다.

print(df.skew())

col3의 경우 좌측으로 치우쳐져있기 때문에, 왜도값은 양수를 가집니다.

print(df.skew())


상관계수 (corr / corrwith)

DataFrame.corr(method='pearson', min_periods=1)
DataFrame.corrwith(other, axis=0, drop=False, method='pearson')

개요

corr메서드는 각 열 간의 상관 계수를 반환하는 메서드입니다.
corrwith메서드는 두 DataFrame객체의 동일한 행/열 간의 상관 계수를 반환하는 메서드입니다.
상관계수 산정 방식에는 피어슨 상관계수, 켄달-타우 상관계수, 스피어먼 상관계수를 사용합니다.
[피어슨 상관계수]
피어슨 상관계수는 두 변수 간의 선형 상관관계를 계량화 한 수치입니다. 코시-슈바르츠 부등식에 의해 +1과 -1사이의 값을 가집니다.
+1의 경우 완벽한 양의 선형 상관 관계, -1의 경우 완벽한 음의 상관관계, 0의 경우 선형 상관관계를 갖지 않습니다.

사용법

기본 사용법
※ 자세한 내용은 아래 예시를 참고 바랍니다.
df.corr(method='pearson', min_periods=1)
method : {pearson / kendall / spearman} 적용할 상관계수 방식입니다.
min_periods : 유효한 결과를 얻기위한 최소 값의 수 입니다. (피어슨, 스피어먼만 사용가능)
df.corrwith(other, axis=0, drop=False, method='pearson')
other : 동일한 이름의 행/열을 비교할 다른 객체입니다.
axis : {0 : index / 1 : columns} 비교할 축 입니다. 기본적으로 0으로 인덱스끼리 비교합니다.
drop : 동일한 이름의 행/열이 없을경우 NaN을 출력하는데, 이를 출력하지 않을지 여부입니다.
method : {pearson / kendall / spearman} 적용할 상관계수 방식입니다.

예시1 [corr]
먼저 corr 메서드의 기본적인 사용법 예시를 위해 6x3짜리 객체를 생성하겠습니다.

col1 = [1,2,3,4,5,6]
col2 = [1,4,2,8,16,32]
col3 = [6,5,4,3,2,1]
data = {"col1":col1,"col2":col2,"col3":col3}
df = pd.DataFrame(data)
print(df)

피어슨 상관계수
피어슨 상관계수의 경우 method='pearson'을 사용하며, 두 변수의 선형 상관계수를 의미합니다.

print(df.corr(method='pearson'))


col1이 증가할 경우 col2는 대체로 증가하는 경향을 가지기에 0<p<1의 값을 가지며,
col1이 증가할 경우 col3은 완벽히 감소하기 때문에 p=-1의 값을 가집니다

예시2 [corrwith]
corrwith 메서드의 기본적인 사용법 예시를 위해 6x2짜리 객체 2개를 생성하겠습니다.

data1 = {"col1":[1,2,3,4,5,6],"col2":[1,4,2,8,16,32]}
data2 = {"col1":[6,5,4,3,2,1],"col3":[3,6,1,2,5,9]}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)

기본적인 사용법
df1과 df2는 col1이라는 열을 갖지만 모두가 col2, col3을 갖진 않습니다.
이 상태에서 corrwith을 사용할 경우 col1에 대해서만 상관관계 계산이 진행됩니다.

print(df1.corrwith(other = df2, method = 'pearson'))

drop = True를 할 경우 쌍을 이루지 못하여 NaN을 반환한 열을 제외하고 출력합니다.

print(df1.corrwith(other = df2, method = 'pearson', drop = True))


profile
개발자를 꿈꾸는 학생

0개의 댓글