판다스 3편

주요 내용

SeriesDataFrame 객체를로부터 기초 통계 자료를 추출하는 방식을 다룬다.

기본 설정

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

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

SeriesDataFrame을 표로 보여줄 때 사용되는 행의 수를 20으로 지정한다. 기본 값은 60이다.

5.3 기초 통계 함수 (p. 226)

기초 통계에서 사용되는 주요 메서드들의 활용법을 살펴본다.

기본적으로 열 단위로 작동하며, 결측치는 행 또는 열의 모든 값이 결측치가 아니라면 기본적으로 무시된다. 행 단위로 작동하게 하려면 축을 axis=1 또는 axis='columns로 지정하고, 결측치를 무시하지 않으려면 skipna=False로 지정한다.

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

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

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

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

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

아래 코드는 행별 최솟값을 갖는 인덱스를 찾아준다.

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

수치형 데이터가 아닐 경우 다른 요약 통계를 보여준다.

5.3.1 상관관계와 공분산 (p. 229)

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

먼저 두 개의 데이터를 불러온다.

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

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

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

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

corr()/cov() 메서드

상관계수와 공분산 모두 두 확률변수 사이의 선형관계를 보여주며 차이점은 다음과 같다.

$$ \begin{align*} Cov(X, Y) & = E((X-\mu_X)(Y-\mu_Y))\\[2ex] \mu_X & = E(X) = \dfrac{\sum X}{n}\\[1.5ex] \mu_Y & = E(Y) = \dfrac{\sum Y}{n} \end{align*} $$

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

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

아래와 같이 속성으로 처리할 수 있으면 보다 깔금하게 보인다.

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

corrwith() 메서드: 다른 시리즈 또는 데이터프레임과의 상관계수 계산

시리즈를 인자로 사용하면 각 열에 대한 상관계수를 계산한다.

데이터프레임을 인자로 사용하면 공통 인덱스를 사용하는 모든 열에 대한 상관계수를 계산한다.

5.3.2 중복과 빈도수 (p. 232)

unique() 메서드

시리즈에서 사용된 값을 중복 없이 확인하려면 unique() 메서드를 이용한다. set() 함수와 유사하게 작동하며, 넘파이 어레이를 반환한다.

value_counts() 메서드

값들의 빈도수를 확인하기 위해 사용한다.

연습문제

아래 코드는 인터넷 데이터 저장소로부터 아이리스(붓꽃) 데이터(iris.data)를 2차원 넘파이 어레이로 불러온다.

iris.data 파일에는 아래 형식의 데이터가 150개 들어 있다.

5.1,3.5,1.4,0.2,Iris-setosa

하나의 데이터에 사용된 값들은 하나의 아이리스(붓꽃)에 대한 꽃잎, 꽃받침과 관련된 특성(features)과 품종을 나타내며, 보다 구체적으로 아래 순서를 따른다.

꽃받침 길이, 꽃받침 너비, 꽃잎 길이, 꽃잎 너비, 품종

길이와 너비를 저장하는 특성들은 숫자로 저장되어 있었지만 위 코드는 문자열로 저장된 품종 특성과의 자료형을 통일시키기 위해 모두 문자열 자료형으로 불러왔다. 처음 5개 데이터를 확인하면 다음과 같다.

참고: '<U15'는 길이가 최대 15인 유니코드 문자열 자료형을 나타낸다.

수치형 데이터와 품종 데이터를 분리해서 각각 (150,4), (150,) 모양의 어레이를 생성하자. 이때 수치형 데이터는 'f8', 즉 'float64' 자료형을 사용하도록 한다.

두 어레이를 판다스의 데이터프레임으로 형변환한다. 이때 각 열의 이름을 사용된 데이터 특성을 반영하도록 지정한다.

레이블은 판다스의 시리즈로 변환한다.

150개의 데이터는 아래 세 개의 품종으로 구분되며, 각각 50개씩 아래 언급된 순서대로 구분되어 있다.

'Iris-setosa', 'Iris-versicolor', 'Iris-virginica'

즉, 0번, 50번, 100번부터 각 품종의 데이터가 시작된다. 넘파이의 경우와는 달리 인덱스를 항상 함께 보여준다.

연습 1. 꽃잎 길이(2번 열)가 1.5보다 크거나 꽃받침 길이(0번 열)가 5.0보다 작은 데이터만 추출하라.

부울 인덱싱은 넘파이의 경우와 기본적으로 동일하다.

조건을 만족하는 샘플의 수는 아래와 같다.

조건을 만족하는 샘플들은 다음과 같다. 예를 들어 0번 4번 인덱스의 붓꽃은 조건에 맞지 않아 부울 인덱싱에서 걸러진다. 하지만 아래에서 볼 수 있듯이 다른 붓꽃의 인덱스가 조정되지는 않는다. 즉, 인덱스는 한 번 정해지면 절대 변하지 않는다.

연습 2. 꽃받침 길이(0번 열)와 꽃잎 길이(2번 열) 사이의 피어슨 상관계수를 계산하라.

힌트: 넘파이의 적절한 함수를 활용한다. 상관계수에 대한 설명은 위키백과: 상관분석을 참고한다. 상관계수를 구하는 여러 방식이 있지만 판다스의 corr() 함수는 피어슨 상관계수를 기본으로 계산한다. 다른 방식의 상관계수를 구하려며 method 키워드 인자를 다르게 지정해야 한다. 보다 자세한 사항은 판다스: corr() 함수 문서를 참조하라.

데이터프레임의 corr() 메서드는 모든 특성들 사이의 피어슨 상관계수로 이루어진 데이터프레임을 반환환다.

따라서 '꽃받침길이'와 다른 특성들 사이의 상관계수를 역순으로 정렬하면 다음과 같다.

따라서 '꽃받침길이'와 '꽃잎길이' 사이의 상관계수가 가장 높으며 아래처럼 인덱싱을 두 번 사용하면 해당 값을 확인할 수 있다.

연습 3. 아래 식으로 계산된 값을 갖는 새로운 열(column)이 추가된 데이터프레임 iris_features_added를 생성하라. 열의 이름은 '길이속성1'으로 지정한다.

$$\frac{\text{원주율} \times \text{꽃잎길이} \times \text{꽃받침길이}^2}{3} $$

시리즈를 생성하면서 동시에 name='길이특성1' 이라는 키워드 인자를 사용하는 이유는 이어서 iris_features 데이터프레임과 합칠 때 새로 추가되는 열의 이름으로 사용되도록 하기 위함이다.

연습 4. Iris_versicolor 품종에 해당하는 데이터만 iris_features로부터 추출하라.

부울 인덱싱을 사용한다.

정확히 50개의 샘플에 대해서만 True이다.

보다 정확히는 50번부터 99번까지 붓꽃만 선택된다.

연습 5. 꽃받침 길이(0번 열)의 평균값(mean), 중앙값(median), 표준편차(standard deviation)를 구하라.

참고: 데이터프레임의 메서드는 기본적으로 열(columns)에 대한 속성을 다룬다. 즉, axis=0을 기본 축으로 사용한다.

따라서 for 반복문을 이용하여 간단하게 세 개의 평균을 확인할 수 있다.

참고: 특정 객체의 메소드로 이루어진 리스트에 포함된 메소드에 대한 반복문을 활용할 수 있다. 아래 코드는 통계와 관련해서 데이터프레임 객체가 제공하는 세 개의 메서드에 대한 반복문을 적용하는 방식을 보여준다.

연습 6. 세 개의 품종 별 꽃받침 너비(1번 열)의 평균값을 계산하여 아래 모양의
데이터프레임과 시리즈(Series) iris_mean_sepal_length를 생성하라.

평균 꽃받침 너비
Iris-setosa 3.418
Iris-versicolor 2.770
Iris-virginica 2.974

데이터프레임을 만들려면 indexcolumns 키워드를 인자를 적절하게 지정해야 한다.

시리즈를 만들려면 indexname 키워드를 인자를 적절하게 지정해야 한다.

연습 7. 꽃잎 너비(3번 열)에 사용된 값을 모두 0과 1사이의 값으로 변환하라.

힌트: 하나의 특성, 여기서는 꽃잎 너비,에 속하는 값을 모두 0과 1사이의 값으로 변환하는 작업을 정규화(normalization)이라 한다. 정규화에 대한 설명은 정규화/표준화을 참고하라.

넘파이의 경우와 동일하게 작동한다. 하지만 데이터프레임의 메서드는 기본적으로 축을 0으로 지정해서 열 단위로 작동하기에 조금 더 간단하게 구현할 수 있다.

이제 꽃잎 너비에 대한 정보만 인덱싱으로 추출하면 된다.

연습 8. iris_features에 사용된 모든 값을 특성 별로 표준화(standardization)하라.

힌트: 표준화에 대한 설명은 정규화/표준화을 참고하라.

mean(), std() 메서드도 기본적으로 축을 0으로 지정해서 작동한다.