Pandas4

지두의 개발자 도전기·2025년 3월 12일

Pandas

목록 보기
5/9
post-thumbnail

판다스 활용: 기초 통계

기본 설정

pandas 라이브러리는 보통 pd 라는 별칭으로 사용됨.

import pandas as pd
import numpy as np

랜덤 시드, 어레이 내부에 사용되는 부동소수점 정확도, 도표 크기 지정 옵션 등은 이전과 동일함.

np.random.seed(12345)
np.set_printoptions(precision=4, suppress=True)

import matplotlib.pyplot as plt
plt.rc('figure', figsize=(10, 6))

Series와 DataFrame을 표로 보여줄 때 사용되는 행의 수를 20으로 지정함.

기본값=60

pd.options.display.max_rows # 원래 60이 기본.

기본값(60)을 20으로 변경함.

pd.set_option("display.max_rows",20)

데이터 탐색

주요 메서드

  • head()
  • tail()
  • info()

예시를 위한 아래 데이터프레임 이용

dict = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada', 'NY', 'NY', 'NY'],
         'year': [str(num) for num in [2000, 2001, 2002, 2001, 2002, 2003, 2002, 2003, 2004]],
         'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2, 8.3, 8.4, 8.5],
         'debt':np.linspace(0, 1, 9)}

frame = pd.DataFrame(dict, columns=['year', 'state', 'pop', 'debt'],
                      index=['one', 'two', 'three', 'four',
                             'five', 'six', 'seven', 'eight', 'nine'])
frame
	   year	 state 	pop	 debt
one	 2000	Ohio	  1.5	 0.000
two	 2001	Ohio	  1.7	 0.125
three2002	Ohio	  3.6	 0.250
four 2001	Nevada	2.4	 0.375
five 2002	Nevada	2.9	 0.500
six	 2003	Nevada	3.2	 0.625
seven2002	NY	    8.3	 0.750
eight2003	NY	    8.4	 0.875
nine 2004	NY	    8.5	 1.000

#표 형태임.

head() 메서드

head() 메서드는 지정된 크기만큼의 행을 보여줌.

인자를 지정하지 않으면 처음 5개의 행을 보여줌.

frame.head() #처음_5개행만
frame.head(3)

tail() 메서드

tail() 메서드는 지정된 크기만큼의 행을 뒤에서부터 보여줌.

인자를 지정하지 않으면 뒤에서부터 5개의 행을 보여줌.

frame.tail() #마지막부터_5개행만
frame.tail(3)

info() 메서드

열(columns) 별로 결측치가 아닌 항목의 수와 자료형을 확인해줌.

  • 9 non-null: 결측치가 아닌 항목이 9개 있음을 의미함.
  • object: 일반적으로 문자열 자료형을 가리킴.
frame.info()
<class 'pandas.core.frame.DataFrame'>
Index: 9 entries, one to nine
Data columns (total 4 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   year    9 non-null      object 
 1   state   9 non-null      object 
 2   pop     9 non-null      float64
 3   debt    9 non-null      float64
dtypes: float64(2), object(2)
memory usage: 360.0+ bytes

합, 평균, 표준편차

기초 통계에서 사용되는 주요 메서드

  • sum()
  • mean()
  • std()
  • idxmax()/idxmin()
  • cumsum()
  • describe()

기본적으로 열 단위로 작동, 결측치는 행 또는 열의 모든 값이 결측치가 아니라면 기본적으로 무시함.

행 단위로 작동하게 하려면 축을 axis=1 또는 axis='columns'로 지정하고, 결측치를 무시하지 않으려면 skipna=False로 지정한다.

df = pd.DataFrame([[1.4, np.nan], [7.1, -4.5],
                   [np.nan, np.nan], [0.75, -1.3]],
                  index=['a', 'b', 'c', 'd'],
                  columns=['one', 'two'])
df
	 one	two
a	1.40	NaN
b	7.10	-4.5
c	NaN	  NaN
d	0.75	-1.3
#표 형태임.

sum() 메서드

행/열 단위 합 계산

df.sum()
# one 9.25
# two -5.80
# dtype: float64

결측치를 무시하지 않으면, 결측치가 포함된 행/렬에 대한 계산은 하지 않음.

df.sum(skipna=False)
# one NaN
# two NaN
# dtype: float64
df.sum(axis='columns')
# a 1.40
# b 2.60
# c 0.00
# d -0/55
#dtype: float64

시리즈는 하나의 열을 갖는 데이터프레임처럼 작동함.

df['one']
# a 1.40
# b 7.10
# c NaN
# d 0.75
# Name: one, dtype: float64
df['one'].sum()
#9.25

mean() 메서드

평균값 계산

df.mean()
# one 3.083333
# two -2.90000
# dtype: float64
df.mear(axis='columns')
#a    1.400
#b    1.300
#c    NaN
#d   -0.275
#dtype: float64

결측치를 무시하지 않으면, 결측치가 포함된 행/렬에 대한 계산은 하지 않음.

df.mean(skipna=False)
#one   NaN
#two   NaN
#dtype: float64
df.mean(axis='columns', skipna=False)
#a      NaN
#b    1.300
#c      NaN
#d   -0.275
#dtype: float64

시리즈의 경우도 동일하게 작동함.

df['one'].mean()
#3.0833333333333335
df['one'].mean(skipna=False)
#NaN

std() 메서드

표준편차 계산

df.std()
#one    3.493685
#two    2.262742
#dtype: float64
df.std(axis='columns',skipna=False)
#a    NaN
#b    8.202439
#c    NaN
#d    1.449569
#dtype: float64

idxmax()/idxmin()

최댓값/최솟값을 갖는 인덱스 확인

아래 코드는 열별 최댓값을 갖는 인덱스를 찾아줌.

df.imax()
#one b
#two b
#dtype: object

cumsum()

누적 합 계산

df.cumsum()
	 one	 two
a	 1.40	 NaN
b	 8.50	 -4.5
c	 NaN	 NaN
d	 9.25	 -5.8
#표 형태임

describe()

요약 통계 보여주기

수치형 데이터의 경우 평균값, 표준편차, 사분위수 등의 통계 정보를 요약해서 보여줌.

df.describe()
	     one	     two
count	3.000000 	 2.000000
mean	3.083333	-2.900000
std	  3.493685	 2.262742
min	  0.750000	-4.500000
25%	  1.075000	-3.700000
50% 	1.400000	-2.900000
75%	  4.250000	-2.100000
max 	7.100000	-1.300000
#표 형태임

상관관계와 공분산

금융 사이트에서 구한 4 개 회사의 주가(price)와 거래량(volume)을 담고 있는 두 개의 데이터를 이용하여 상관계수와 공분산을 계산할 것임.

이를 위해 먼저 바이너리 파일 두 개를 다운로드해서 지정된 하위 디렉토리에 저장해야 함.

  • 파일 저장 디렉토리 지정 및 생성
from pathlib import Path

data_path = Path() / "examples"

data_path.mkdir(parents=True, exist_ok=True)
  • 특정 서버에서 파일 다운로드 함수
import requests

# 파일 서버 기본 주소
base_url = "https://raw.githubusercontent.com/codingalzi/datapy/master/jupyter-book/examples/"

def myWget(filename):
    # 다운로드 대상 파일 경로
    file_url = base_url + filename

    # 저장 경로와 파일명
    target_path = data_path / filename

    data = requests.get(file_url)

    with open(target_path, 'wb') as f:
        f.write(data.content)

두 개의 픽클 파일 다운로드.

  • pkl 파일: 판다스에서 제공하는 객체를 to_pickle() 메서드를 이용하여 컴퓨터에 파일로 저장할 때 사용되는 바이너리 파일.
myWget("yahoo_price.pkl")
myWget("yahoo_volume.pkl")

다운로드한 두 개의 데이터를 불러옴.

  • read_pickle(): 저장된 pkl 파일을 파이썬으로 불러오는 함수

아래 코드는 일별 주가 데이터를 불러온다. 2010년 1월 4일부터 2016년 10월 21일까지의 데이터 1714개를 담고 있음.

price=pd.read_pickle('examples/yahoo_price.pkl')
price

아래 코드는 동일 회사, 동일 날짜의 1일 거래량(volume) 담고 있는 데이터를 불러옴.

volume = pd.read_pickle('examples/yahoo_volume.pkl')
volume

주가의 일단위 변화율을 알아보기 위해 퍼센트 변화율을 확인함.

참고: 증권분야에서 return은 이익율을 의미함.

returns = price.pct_change()
returns.tail()

corr()/cov() 메서드

상관계수와 공분산 모두 두 확률변수 사이의 선형관계를 보여줌

상관계수와 공분산의 차이점

| 공분산 | 두 확률변수 X, Y 사이의 선형관계를 계량화함.
양/음수 여부에 따른 선형관계를 보이며, 절댓값이 클수록 선형관계가 강함.
but 사용되는 확률변수의 척도(scale)에 많은 영향을 받음.
#정규화한 값인 상관계수를 사용하는 이유 | Cov(X,Y)=E((X−μX)(Y−μY))
μX=E(X)=∑X/n
μY=E(Y)=∑Y/n
|
| --- | --- | --- |
| 상관계수 | 두 확률변수 사이의 선형관계를 -1과 1 사이의 값으로 표현함.
양/음수 여부에 따른 선형관계로 절댓값이 1에 가까울수록 선형관계가 강함. | ρ=Cov(X,Y)/σX⋅σY
σX=√Var(X)
Var(X)=∑(X−μX)^2/n
Var(Y)=∑(X−μY)^2/n |

'MSFT'와 'IBM' 사이의 공분산은 다음과 같음.

returns['MSFT'].cov(returns['IBM'])
#8.870655479703546e-05

'MSFT'와 'IBM' 사이의 상관계수는 다음과 같음.

returns['MSFT'].corr(returns['IBM'])
#0.49976361144151144

전체 회사를 대상으로 하는 상관계수와 공분산을 계산할 수도 있음.

returns.cov()
returns.corr()

중복과 빈도

unique() 메서드

시리즈에서 사용된 값을 중복 없이 확인

 set() 함수와 유사하게 작동하며, 넘파이 어레이를 반환.

obj = pd.Series(['c', 'a', 'd', 'a', 'a', 'b', 'b', 'c', 'c'])
obj
0    c
1    a
2    d
3    a
4    a
5    b
6    b
7    c
8    c
dtype: object
uniques = obj.unique()
uniques
array(['c', 'a', 'd', 'b'], dtype=object)

value_counts() 메서드

값들의 빈도수를 확인

obj.value_counts()
c    3
a    3
b    2
d    1
Name: count, dtype: int64

0개의 댓글