🔥알림🔥
① 테디노트 유튜브 -
구경하러 가기!
② LangChain 한국어 튜토리얼
바로가기 👀
③ 랭체인 노트 무료 전자책(wikidocs)
바로가기 🙌
④ RAG 비법노트 LangChain 강의오픈
바로가기 🙌
⑤ 서울대 PyTorch 딥러닝 강의
바로가기 🙌
#04-Pandas(판다스) 통계
이번 에피소드에서는 Pandas 데이터프레임(DataFrame)의 가장 유용하면서 탐색적 데이터 분석(Exploratory Data Analysis)에서 가장 유용하게 사용되는 기능인 통계 입니다.
numpy를 이미 익히셨다면, Pandas의 통계 함수를 사용함에 있어 크게 이질감이 없을 겁니다. 거의 사용방법이 같거든요.
왜냐하면 Pandas가 numpy 패키지 기반으로 만들어졌기 때문에 그렇습니다.
Pandas에서 제공하는 모든 통계 함수에 대해서는 굳이 알 필요없습니다. 자주 사용되는 통계 함수를 위주로 알아보겠습니다.
모듈 import
from IPython.display import Image
import numpy as np
import pandas as pd
import seaborn as sns
데이터셋 로드
df = sns.load_dataset('titanic')
df.head()
컬럼(columns) 설명
- survivied: 생존여부 (1: 생존, 0: 사망)
- pclass: 좌석 등급 (1등급, 2등급, 3등급)
- sex: 성별
- age: 나이
- sibsp: 형제 + 배우자 수
- parch: 부모 + 자녀 수
- fare: 좌석 요금
- embarked: 탑승 항구 (S, C, Q)
- class: pclass와 동일
- who: 성별과 동일
- adult_male: 성인 남자 여부
- deck: 데크 번호 (알파벳 + 숫자 혼용)
- embark_town: 탑승 항구 이름
- alive: 생존여부 (yes, no)
- alone: 혼자 탑승 여부
통계
통계는 데이터 분석에서 굉장히 중요한 요소입니다.
데이터에 대한 통계 계산식을 Pandas 함수로 제공하기 때문에 어렵지 않게 통계 값을 산출할 수 있습니다.
describe() - 요약통계
전반적인 주요 통계를 확인할 수 있습니다.
기본 값으로 수치형(Numerical) 컬럼에 대한 통계표를 보여줍니다.
- count: 데이터 개수
- mean: 평균
- std: 표준편차
- min: 최솟값
- max: 최대값
df.describe()
문자열 컬럼에 대한 통계표도 확인할 수 있습니다.
- count: 데이터 개수
- unique: 고유 데이터의 값 개수
- top: 가장 많이 출현한 데이터 개수
- freq: 가장 많이 출현한 데이터의 빈도수
df.describe(include='object')
count() - 개수
데이터의 개수
# DataFrame 전체의 개수를 구하는 경우
df.count()
# 단일 column의 데이터 개수를 구하는 경우
df['age'].count()
mean() - 평균
데이터의 평균
# DataFrame 평균
df.mean()
# Column 평균
df['age'].mean()
Mean - 조건별 평균
성인 남성의 나이의 평균 구하기
condition = (df['adult_male'] == True)
df.loc[condition, 'age'].mean()
연습문제
다음 조건을 만족하는 승객의 나이 평균과 조건을 만족하는 데이터의 개수를 구하세요.
fare를 30 이상 40 미만 지불한 승객pclass는 1등급
df.head()
# 코드를 입력해 주세요 (데이터 개수 구하기)
condition1 = (df['fare'] >= 30) & (df['fare'] < 40)
condition2 = (df['pclass'] == 1)
df.loc[condition1 & condition2, 'age'].count()
# 코드를 입력해 주세요 (나이 평균 구하기)
df.loc[condition1 & condition2, 'age'].mean()
skipna=True 옵션
기술 통계 함수에서는 skipna=True가 기본으로 설정 되어 있습니다.
만약, skipna=False로 설정하게 된다면, NaN 값이 있는 column은 NaN 값으로 출력 됩니다.
# skipna=False를 지정한 경우
df.mean(skipna=False)
# skipna=True를 지정한 경우
df.mean(skipna=True)
median() - 중앙값
데이터의 중앙 값을 출력 합니다. 데이터를 오름차순 정렬하여 중앙에 위치한 값입니다.
이상치(outlier)가 존재하는 경우, mean()보다 median()을 대표값으로 더 선호합니다.
pd.Series([1, 2, 3, 4, 5]).median()
pd.Series([4, 5, 1, 2, 3]).median()
짝수개의 데이터가 있는 경우에는 가운데 2개 중앙 데이터의 평균 값을 출력 합니다.
pd.Series([1, 2, 3, 4, 5, 6]).median()
나이의 평균(mean)과 중앙값(median)은 약간의 차이가 있음을 확인할 수 있습니다.
print(f"나이 평균: {df['age'].mean():.5f}\n나이 중앙값: {df['age'].median()}\n차이: {df['age'].mean() - df['age'].median():.5f}")
sum() - 합계
데이터의 합계입니다. 문자열 column은 모든 데이터가 붙어서 출력될 수 있습니다.
df.sum()
단일 column에 대한 합계 출력
df['fare'].sum()
cumsum() - 누적합, cumprod() - 누적곱
누적되는 합계를 구할 수 있습니다.
df['age'].cumsum()
누적되는 곱도 구할 수 있으나, 일반적으로 값이 너무 커지므로 잘 활용하지는 않습니다.
df['age'].cumprod()
var() - 분산
# 평균
fare_mean = df['fare'].values.mean()
# 분산
my_var = ((df['fare'].values - fare_mean) ** 2).sum() / (df['fare'].count() - 1)
my_var
df['fare'].var()
std() - 표준편차
분산(var)의 제곱근
np.sqrt(df['fare'].var())
np.sqrt(my_var)
min() - 최소값, max() - 최대값
# 최소값
df['age'].min()
# 최대값
df['age'].max()
quantile() - 분위
Quantile이란 주어진 데이터를 동등한 크기로 분할하는 지점을 말합니다
10%의 경우 0.1을, 80%의 경우 0.8을 대입하여 값을 구합니다.
# 10% quantile
df['age'].quantile(0.1)
# 60% quantile
df['age'].quantile(0.8)
unique() - 고유값, nunique() - 고유값 개수
고유값과 고유값의 개수를 구하고자 할 때 사용합니다.
unique()
df['who'].unique()
nunique(): 고유값의 개수를 출력합니다.
df['who'].nunique()
mode() - 최빈값
최빈값은 가장 많이 출현한 데이터를 의미합니다.
df['who'].mode()
카테고리형 데이터에도 적용 가능합니다.
df['deck'].mode()
corr() - 상관관계
corr()로 컬럼(column)별 상관관계를 확인할 수 있습니다.
- -1~1 사이의 범위를 가집니다.
- -1에 가까울 수록 반비례 관계, 1에 가까울수록 정비례 관계를 의미합니다.
df.corr()
특정 컬럼에 대한 상관관계를 확인할 수 있습니다.
df.corr()['survived']
댓글남기기