pandas의 기초 통계 함수 [미래 실험실 pYTHON]

안녕하세요. 언제나 휴일에 언휴예요.

이번 강의는 pandas에서 제공하는 기초 통계 함수들을 사용하는 실습입니다.

== 다루는 내용
Series로 기초 통계 함수 사용하기
DataFrame으로 기초 통계 함수 사용하기
== 통계 함수
개수: count
합계: sum
평균: mean
분산: var
표준편차: std
중간값: median
최솟값: min
최댓값: max
4분위값: quantile
누적 합계: cumsum
누적 곱: cumprod
통합: describe

Series와 DataFrame을 사용하여 기초 통계 함수들을 사용해 봅시다.

Series로 기초 통계 함수 사용하기

이번 실습에서 사용할 데이터는 월 별 판매 개수를 예를 들게요.

import  pandas as pd
sales =[12,23,34,12,12,23,12,45,567,89,12,34]
months =[]
for m in range(1,13):
    months.append(m)
ps = pd.Series(sales,index=months)
print(ps)

현재 Series를 출력한 결과는 다음과 같습니다.

1      12
2      23
3      34
4      12
5      12
6      23
7      12
8      45
9     567
10     89
11     12
12     34
dtype: int6

여기에서 다룰 함수는 개수, 합계, 평균, 분산, 표준편차, 중간 값, 최솟값, 최댓값, 사분위 값입니다.

별다른 설명없이 Look & Feel로 이해할 수 있어요.

#판다스를 이용한 기초 통계 함수들
import  pandas as pd

sales =[12,23,34,12,12,23,12,45,567,89,12,34]
months =[]
for m in range(1,13):
    months.append(m)
ps = pd.Series(sales,index=months)
print("개수:",ps.count())
print("합계:",ps.sum())
print("평균:",ps.mean())
print("분산:",ps.var())
print("표준편차:",ps.std())
print("중간값:",ps.median())
print("최솟값:",ps.min())
print("최댓값:",ps.max())
print("10%:",ps.quantile(0.1))
print("50%:",ps.quantile(0.5))
print("70%:",ps.quantile(0.7))

실행 결과는 다음과 같습니다.

개수: 12
합계: 875
평균: 72.91666666666667
분산: 24702.08333333333
표준편차: 157.16896428154425
중간값: 23.0
최솟값: 12
최댓값: 567
10%: 12.0
50%: 23.0
70%: 34.0

평균과 표준편차 값을 확인해 보세요.

표준편차가 평균보다 더 크죠. 이러한 데이터는 평균보다 월등히 큰 값이 존재할 때 발생합니다.

평균은 데이터 중에 참 값이 있다는 가정에서 만들어진 대푯값입니다.

하지만 지금처럼 표준편차가 너무 크면 평균은 참 값이 아닌 몽니 값일 수 있어요.

월 판매 실적으로 가지고 갈 때마다 왜 평균보다 못하냐고 질책만 받게 하거든요.

소위 상위 1%로 나머지 99%를 능가하는 현상에서 나오는 것이죠.

이럴 때는 중간 값을 제시하고 이를 통해 데이터를 분석할 필요가 있어요.

이처럼 데이터 분석은 python이나 프로그래밍 언어를 활용하는 능력도 필요하지만 통계학적 사고가 더 중요할 수 있어요.

틈틈히 통계학에 관해 학습하는 것도 데이터 분석의 질을 높이는 데 큰 도움을 줄 거예요.

잠시 얘기가 python이 아닌 데이터 분석으로 넘어갔었네요.

다시 강의로 돌아갈게요.

전체 통계 정보를 확인할 때는 describe 메서드를 이용하세요.

print(ps.describe())

실행 결과는 다음과 같습니다.

count     12.000000
mean      72.916667
std      157.168964
min       12.000000
25%       12.000000
50%       23.000000
75%       36.750000
max      567.000000
dtype: float64

DataFrame으로 기초 통계 함수 사용하기

pandas의 DataFrame도 마찬가지로 같은 이름의 메서드를 제공하고 있습니다.

3년 동안 월 별 판매 데이터로 사용해 봅시다.

#판다스를 이용한 기초 통계 함수들
import  pandas as pd

sales1 =[12,23,34,12,12,23,12,45,567,89,12,34]
sales2 =[12,23,34,15,12,23,12,25,17,19,12,34]
sales3 =[12,23,34,18,12,43,12,45,37,29,22,34]
years =[2017,2018,2019]
months =[]
for m in range(1,13):
    months.append(m)

pd = pd.DataFrame([sales1,sales2,sales3],index=years,columns=months)
print(pd)

현재 생성한 DataFrame은 다음과 같습니다.

      1   2   3   4   5   6   7   8    9   10  11  12
2017  12  23  34  12  12  23  12  45  567  89  12  34
2018  12  23  34  15  12  23  12  25   17  19  12  34
2019  12  23  34  18  12  43  12  45   37  29  22  34

기초 통계 함수는 Series와 같습니다.

기본적으로 column 별로 통계를 제공합니다.

row별로 통계를 내고자 한다면 axis=1을 입력 인자로 전달하세요.

다음은 월 별 합계와 년도 별 합계를 계산한 예제 코드입니다.

#판다스를 이용한 기초 통계 함수들
import  pandas as pd

sales1 =[12,23,34,12,12,23,12,45,567,89,12,34]
sales2 =[12,23,34,15,12,23,12,25,17,19,12,34]
sales3 =[12,23,34,18,12,43,12,45,37,29,22,34]
years =[2017,2018,2019]
months =[]
for m in range(1,13):
    months.append(m)

pd = pd.DataFrame([sales1,sales2,sales3],index=years,columns=months)
print(pd.sum())
print(pd.sum(axis=1))

실행 결과는 다음과 같습니다.

1      36
2      69
3     102
4      45
5      36
6      89
7      36
8     115
9     621
10    137
11     46
12    102
dtype: int64
2017    875
2018    238
2019    321
dtype: int64

3년 간 전체 합계를 구하는 것은 python의 sum 함수를 이용하면 쉽게 해결할 수 있어요.

print(sum(pd.sum()))

실행 결과는 다음처럼 3년 동안 판매한 전체 개수가 나옵니다.

1434

다른 통계 함수도 Series와 마찬가지입니다.

column별로 통계가 기본이고 입력 인자로 axis=1를 전달하여 row별 통계를 계산하는 것은 기억하세요.

#판다스를 이용한 기초 통계 함수들
import  pandas as pd

sales1 =[12,23,34,12,12,23,12,45,567,89,12,34]
sales2 =[12,23,34,15,12,23,12,25,17,19,12,34]
sales3 =[12,23,34,18,12,43,12,45,37,29,22,34]
years =[2017,2018,2019]
months =[]
for m in range(1,13):
    months.append(m)

pd = pd.DataFrame([sales1,sales2,sales3],index=years,columns=months)
print(pd)

print(pd.sum())
print(pd.sum(axis=1))
print(sum(pd.sum()))
print(pd.mean())
print(pd.mean(axis=1))
print(pd.describe())

실행 결과

      1   2   3   4   5   6   7   8    9   10  11  12
2017  12  23  34  12  12  23  12  45  567  89  12  34
2018  12  23  34  15  12  23  12  25   17  19  12  34
2019  12  23  34  18  12  43  12  45   37  29  22  34
1      36
2      69
3     102
4      45
5      36
6      89
7      36
8     115
9     621
10    137
11     46
12    102
dtype: int64
2017    875
2018    238
2019    321
dtype: int64
1434
1      12.000000
2      23.000000
3      34.000000
4      15.000000
5      12.000000
6      29.666667
7      12.000000
8      38.333333
9     207.000000
10     45.666667
11     15.333333
12     34.000000
dtype: float64
2017    72.916667
2018    19.833333
2019    26.750000
dtype: float64
         1     2     3     4   ...          9          10         11    12
count   3.0   3.0   3.0   3.0  ...    3.000000   3.000000   3.000000   3.0
mean   12.0  23.0  34.0  15.0  ...  207.000000  45.666667  15.333333  34.0
std     0.0   0.0   0.0   3.0  ...  311.929479  37.859389   5.773503   0.0
min    12.0  23.0  34.0  12.0  ...   17.000000  19.000000  12.000000  34.0
25%    12.0  23.0  34.0  13.5  ...   27.000000  24.000000  12.000000  34.0
50%    12.0  23.0  34.0  15.0  ...   37.000000  29.000000  12.000000  34.0
75%    12.0  23.0  34.0  16.5  ...  302.000000  59.000000  17.000000  34.0
max    12.0  23.0  34.0  18.0  ...  567.000000  89.000000  22.000000  34.0

[8 rows x 12 columns]

Process finished with exit code 0