pandas 를 활용한 기본적인 산술과 통계 적용 & 이해
Jul 27, 2019

Pandas를 활용한 통계부분을 좀 더 다뤄보려고 합니다. 평균, 표준 편차, 분산, 중간값등 통계를 전공하셨거나, 조금이라도 공부하신 분들은 물론 익숙하시겠지만, 그렇지 않고 데이터 분석에 뛰어든 분들은 용어만 봐도 머리속에 혼란이 찾아오기 마련입니다.

물론, 통계에 대해 저보다 훨씬 잘 설명되어 있는 통계 블로그들이 많고, 기본적인 내용들은 위키를 찾아보시면 좋습니다. 수학에 좀 더 친숙하신 분들은 공식을 보면서 이해하시면 말보다 훨씬 쉽게 이해하실 수 있습니다.

그래서 밑에 예시들을 활용하여 최대한 쉽게 설명하고자 하였습니다.

pandas, numpy 모듈 import

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(10), columns=['random'])
df1 = pd.DataFrame(np.arange(5), columns=['number'])
df1
number
0 0
1 1
2 2
3 3
4 4
df2 = pd.DataFrame(np.arange(5, 10), columns=['number'])
df2
number
0 5
1 6
2 7
3 8
4 9

산술연산

df1+df2
number
0 5
1 7
2 9
3 11
4 13
df1.add(df2)
number
0 5
1 7
2 9
3 11
4 13
df1-df2
number
0 -5
1 -5
2 -5
3 -5
4 -5
df1*df2
number
0 0
1 6
2 14
3 24
4 36
df1/df2
number
0 0.000000
1 0.166667
2 0.285714
3 0.375000
4 0.444444
df1%df2
number
0 0
1 1
2 2
3 3
4 4

통계

1. 합계

df.head(10)
random
0 0.888090
1 0.076795
2 0.137028
3 0.419894
4 0.986586
5 0.998234
6 0.288578
7 0.173464
8 0.635158
9 0.382467
df.sum(axis=0)
random    4.986294
dtype: float64
df.sum(axis=1)
0    0.888090
1    0.076795
2    0.137028
3    0.419894
4    0.986586
5    0.998234
6    0.288578
7    0.173464
8    0.635158
9    0.382467
dtype: float64

2. 평균

df.mean(axis=0, skipna=False)
random    0.498629
dtype: float64
df.mean(axis=1, skipna=False)
0    0.888090
1    0.076795
2    0.137028
3    0.419894
4    0.986586
5    0.998234
6    0.288578
7    0.173464
8    0.635158
9    0.382467
dtype: float64

3. 누적합계

df.cumsum()
random
0 0.888090
1 0.964884
2 1.101913
3 1.521807
4 2.508393
5 3.506628
6 3.795205
7 3.968670
8 4.603827
9 4.986294

4. 최소값, 최대값이 있는 index 반환

sample = np.random.rand(10)
sample
array([0.99909538, 0.6948032 , 0.04273029, 0.95921207, 0.35761331,
       0.00654028, 0.03060947, 0.93285353, 0.80676698, 0.37974754])
sample = sample.reshape(5, 2)
sample
array([[0.99909538, 0.6948032 ],
       [0.04273029, 0.95921207],
       [0.35761331, 0.00654028],
       [0.03060947, 0.93285353],
       [0.80676698, 0.37974754]])
df1 = pd.DataFrame(sample, columns=['number1', 'number2'])
df1
number1 number2
0 0.999095 0.694803
1 0.042730 0.959212
2 0.357613 0.006540
3 0.030609 0.932854
4 0.806767 0.379748
df1.idxmin()
number1    3
number2    2
dtype: int64
df1.idxmax()
number1    0
number2    1
dtype: int64

5. 중간값

중앙값(median) 또는 중위수는 어떤 주어진 값들을 크기의 순서대로 정렬했을 때 가장 중앙에 위치하는 값을 의미한다. 예를 들어 1, 2, 100의 세 값이 있을 때, 2가 가장 중앙에 있기 때문에 2가 중앙값이다.

값이 짝수개일 때에는 중앙값이 유일하지 않고 두 개가 될 수도 있다. 이 경우 그 두 값의 평균을 취한다. 예를 들어 1, 10, 90, 200 네 수의 중앙값은 10과 90의 평균인 50이 된다.

중앙값(median)은 전체 데이터 중 가운데에 있는 수이다. 직원이 100명인 회사에서 직원들 연봉 평균은 5천만원인데 사장의 연봉이 100억인 경우, 회사 전체의 연봉 평균은 1억 4,851만원이 된다. 이처럼 극단적인 값이 있는 경우 중앙값이 평균값보다 유용하다.

df1.median()
number1    0.357613
number2    0.694803
dtype: float64

평균 절대편차, 분산, 표준편차에 들어가기에 앞서…

평균 절대편차, 분산, 표준편차 모두 얼마나 값들이 퍼져있는 지 정도를 표현했다고 볼 수 있다.

6. 평균 절대편차

평균 절대 편차(average absolute deviation 또는 mean absolute deviation, AAD, MAD) 또는 평균 편차(mean deviation) 또는 절대 편차(absolute deviation)는 산포도의 하나로, 평균과 개별 관측치 사이 거리의 평균이다. 각 측정치에서 전체 평균을 뺀 절댓값으로 표시되는 편차의 산술평균을 말한다. 매우 크거나 작은 어느 하나의 값인 이상치로 인한 문제점을 보완할 수 있는 방법으로 사용되고 있다. 평균편차에는 모집단 평균편차와 표본 평균편차 두 가지 종류가 있다.

평균 대신 중앙값을 쓸 경우 중앙값 절대 편차이다.

MAD = median( Yi – median(Yi )

예제) 다음과 같은 숫자들의 MAD를 구하세요: 3, 8, 8, 8, 8, 9, 9, 9, 9.

STEP 1: 먼저, Median을 찾습니다. 여기서 Median은 8 입니다.

STEP 2: 다음의 공식을 이용하여 값들과 Median의 절대값을 찾습니다.
|yi – median|.

|3 – 8| = 5
|8 – 8| = 0
|8 – 8| = 0
|8 – 8| = 0
|8 – 8| = 0
|9 – 8| = 1
|9 – 8| = 1
|9 – 8| = 1
|9 – 8| = 1


STEP 3: 구한 값들 중 Median을 찾습니다. (0,0,0,0,1,1,1,1,5) 의 Median은 1입니다.

df1.mad()
number1    0.364454
number2    0.321190
dtype: float64

7. 분산

통계학에서 분산(variance) 또는 변량은 관측값에서 평균을 뺀 값을 제곱하고, 그것을 모두 더한 후 전체 갯수로 나눠서 구한다.

즉, 차이값의 제곱의 평균이다. 관측값에서 평균을 뺀 값인 편차를 모두 더하면 0이 나오므로 제곱해서 더한다.

나무위키 - 분산 참고.

df1.var()
number1    0.194761
number2    0.162343
dtype: float64

8. 표준편차

표준편차는 해당 집단 내 각 표본의 측정값이 평균에서 어느 정도 떨어져 있는지를 나타내는 지표입니다.

표준 편차(standard deviation)는 분산을 제곱근한 것이다. 제곱해서 값이 뻥튀기 된 분산을 제곱근해서 다시 원래 크기로 만들어준다

나무위키 - 표준편차 참고.

df1.std()
number1    0.441318
number2    0.402919
dtype: float64

9. 표본 비대칭도

df1.skew()
number1    0.363677
number2   -0.797255
dtype: float64

10. 표본 첨도 (4차 적률)

df1.kurt()
number1   -2.516925
number2   -0.762427
dtype: float64

11. 퍼센트 변화량

df1.pct_change()
number1 number2
0 NaN NaN
1 -0.957231 0.380552
2 7.369082 -0.993182
3 -0.914406 141.632008
4 25.356776 -0.592918

정보 출력

df.count()
random    10
dtype: int64
df.describe()
random
count 10.000000
mean 0.498629
std 0.355320
min 0.076795
25% 0.202243
50% 0.401181
75% 0.824857
max 0.998234


관련 글 더보기

- 나라장터 입찰공고 데이터 분석 및 머신러닝 예측

- Pandas를 활용한 결측치 보간(interpolation) 하기

- [pandas] 공공데이터(csv) 활용시 한글 깨짐 현상 해결

- 10분만에 pandas 정복하기 - 대한민국 부동산 데이터 활용편

데이터 분석, 머신러닝, 딥러닝의 대중화를 꿈 꿉니다.