본문 바로가기
ML&DATA/python for data analysis

pandas - (기술 통계 계산)

by sun__ 2020. 7. 21.

5.3 기술 통계 계산과 요약

 

pandas 객체의 수학,통계 메서드 대부분은 하나의 Series나 DataFrame의 로우나 컬럼에서 단일 값(합,평균 등)을 구하는 축소(reduction)혹은 요약 통계(summary statistics)에 속한다. 계산 시 NaN데이터를 제외하도록 설계됨

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

DataFrame의 sum 메서드를 호출하면 각 로우의 합을 담은 Series를 반환한다. axis=1을 넘기면 각 컬럼의 합을 반환한다.

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

df.sum(axis='columns')
#a    1.40
#b    2.60
#c    0.00
#d   -0.55
#dtype: float64

 

skipna옵션을 False로 주면 NaN값을 포함하여 계산한다.

 

 

idxmin, idxmax 메서드는 최솟값 혹은 최댓값을 가지는 색인값을 반환한다.

df.idxmax()
#one    b
#two    d
#dtype: object

df.idxmax(axis=1)
#a    one
#b    one
#c    NaN
#d    one
#dtype: object

 

cumsum 메서드는 누산 값을 반환한다.

df.cumsum()
df.cumsum(axis=1)

 

describe메서드는 한 번에 여러 통계 결과를 보여준다. (axis 정해주지 못함)

df.describe()

 

 

5.3.1 상광관계와 공분산

AAPL(apple), IBM, MSFT(microsoft), GOOG(google)의 주식가격 price와 시가총액 volume의 날짜별 DataFrame을 생각해보자.

(좌)price  (우)volume

 

a와 b의 공분산이란 a가 증가할 때 b가 증가 혹은 감소하는 경향이 있는지, 두 a,b의 변화가 무관한지에 대한 정보를 갖는 변수다. 단위의 크기에 따라 값이 천차만별이다.

 

상관계수란 공분산을 보완하기 위한 개념이다.

-1~1값을 갖으며 1에 가까울수록 같이 증가, 0에 가까울수록 무관하다는 의미가 있다.

 

returns를 날짜의 변화에 따른 주식가격의 변동(퍼센트 변화율)이라고 하면 다음과 같다.

returns = price.pct_change()

returns.tail()

 

 

마이크로소프트와 IBM의 퍼센트변화율의 상관계수,

마이크로스프트와 google의 퍼센트변화율의 상관계수는 다음과 같다.

returns.MSFT.corr(returns.IBM)
#0.5932757131783176
returns.MSFT.corr(returns.GOOG)
#0.7820240206528357

 

DataFrame의 corrwith 메서드를 사용하면 다른 Series나 DataFrame과의 상관관계를 계산한다. 

Series를 넘기면 각 컬럼에 대해 계산한 상관관계를 담고 있는 Series를 반환한다.

returns.corrwith(returns.IBM)
#AAPL    0.527319
#IBM     1.000000
#MSFT    0.593276
#GOOG    0.542109
#dtype: float64

 

DataFrame을 넘기면 맞아딸어지는 컬럼 이름에 대한 상관관계를 계산한다. 

시가총액의 퍼센트 변화율에 대한 상관관계

returns.corrwith(volume)
#AAPL   -0.132944
#IBM    -0.105303
#MSFT   -0.061838
#GOOG   -0.147565
#dtype: float64

 

axis=1 옵션을 넘기면 각 컬럼에 대한 상관관계와 공분산을 계싼한다. 모든 경우 데이터는 상관관계를 계산하기 전에 색인의 이름순으로 정렬된다.

 

 

5.3.2 유일값, 값 세기, 멤버십

 

1차원 Series의 정보를 추출하는 메서드

 

Series의 unique 메서드는 중복값을 제거하고 유일값만 담고 있는 array를 반환한다. 

obj = pd.Series(['c', 'a', 'd', 'a', 'a', 'b', 'b', 'c', 'c'])
obj.unique()
#array(['c', 'a', 'd', 'b'], dtype=object)

 

value_counts 메서드는 값의 도수를 계산하여 Series 객체를 반환한다.

obj.value_counts()
#a    3
#c    3
#b    2
#d    1
#dtype: int64

 

value_counts에서 반환하는 Series는 담고 있는 값(도수)을 내림차순으로 정렬한다. pandas의 최상위 메서디이므로 어떤 순차 자료구조에서도 사용할 수 있다. sort옵션에 False를 넘기면 값이 정렬되지 않은 채로 반환된다.

pd.value_counts(obj.values, sort=False)
#c    3
#a    3
#d    1
#b    2
#dtype: int64

 

isin 메서드는 어떤 값이 Series에 존재하는지 나타내는 불리언 Series를 반환하는데, Series나 DataFrame의 컬럼에서 값을 골라내고 싶을 때 유용하게 사용할 수 있다.

obj
#0    c
#1    a
#2    d
#3    a
#4    a
#5    b
#6    b
#7    c
#8    c
#dtype: object

mask
#0     True
#1    False
#2    False
#3    False
#4    False
#5     True
#6     True
#7     True
#8     True
#dtype: bool

obj[mask]
#0    c
#5    b
#6    b
#7    c
#8    c
#dtype: object

 

Index객체의 get_indexer메서드는 여러 값이 들어 있는 배열에서 유일한 값의 색인 배열을 구할 수 있다.

to_match = pd.Series(['c', 'a', 'b', 'b', 'c', 'a'])
unique_vals = pd.Series(['c', 'b', 'a'])

pd.Index(unique_vals).get_indexer(to_match)
#array([0, 2, 1, 1, 0, 2], dtype=int64)

 

 

 

DataFrame의 여러 컬럼에 대해 히스토그램을 구해야 하는 경우가 있다.

data = pd.DataFrame({'Qu1': [1, 3, 4, 3, 4],
                     'Qu2': [2, 3, 1, 2, 3],
                     'Qu3': [1, 5, 2, 4, 4]})
                     
result = data.apply(pd.value_counts).fillna(0)

data
result

result결과를 보면, data상 qu1에서 1,2,3,4,5가 각각 1회 0회 2회 2회 0회등장했음을 알 수 있다.

이 정보로 나중에 matplotlib등을 사용해서 히스토그램으로 시각화 할 수 있다.