기술통계량 (평균, 중앙값, 분산, 표준편차)
기술통계(descriptive statistics)는 데이터를 몇 개의 숫자로 요약하는 것입니다. "이 반 학생들의 점수가 어떤가요?" 라는 질문에 150개의 점수를 나열하는 대신, "평균 82점, 표준편차 8점"이라고 대답하는 방식입니다.
중심 경향 — 데이터의 '중간'은 어디인가
평균 (Mean)
가장 직관적인 중심 측도입니다. 모든 값을 더해서 개수로 나눕니다.
scores <- c(72, 85, 90, 78, 95, 88, 62, 91, 84, 77)
mean(scores) # 82.2
평균의 약점은 극단값(outlier)에 민감하다는 점입니다.
# 극단값이 포함된 경우
incomes <- c(200, 210, 195, 205, 198, 1000) # 단위: 만원
mean(incomes) # 334.7 — 1000만원 한 명 때문에 평균이 크게 올라갑니다
# 결측값이 있는 경우
x <- c(72, 85, NA, 78, 95)
mean(x) # NA
mean(x, na.rm = TRUE) # 82.5
중앙값 (Median)
데이터를 크기 순으로 정렬했을 때 가운데 위치하는 값입니다. 극단값의 영향을 거의 받지 않습니다.
scores <- c(72, 85, 90, 78, 95, 88, 62, 91, 84, 77)
median(scores) # 86.5 — 정렬 후 5번째(84)와 6번째(88) 평균
incomes <- c(200, 210, 195, 205, 198, 1000)
median(incomes) # 202.5 — 극단값의 영향을 받지 않습니다
mean(incomes) # 334.7
평균과 중앙값의 차이가 클수록 데이터가 한쪽으로 치우쳐 있다는 신호입니다. 소득 분포, 부동산 가격처럼 극단값이 많은 데이터에는 중앙값이 더 적합합니다.
최빈값 (Mode)
가장 자주 등장하는 값입니다. R에는 내장 mode() 함수가 없어서 직접 구하거나 별도 패키지를 씁니다.
survey <- c("좋음", "보통", "좋음", "나쁨", "좋음", "보통", "좋음")
# 직접 구하기
table(survey)
# 나쁨 보통 좋음
# 1 2 4 → 최빈값은 "좋음"
# 숫자에서 최빈값
x <- c(1, 2, 2, 3, 3, 3, 4)
as.numeric(names(which.max(table(x)))) # 3
분산과 변동성 — 데이터가 얼마나 흩어져 있는가
두 반의 평균 점수가 모두 80점이어도, 한 반은 모두 80점 근처이고 다른 반은 60점부터 100점까지 고르게 분포할 수 있습니다. 이 '흩어짐'을 측정하는 것이 분산과 표준편차입니다.
분산 (Variance)
각 값이 평균으로부터 얼마나 떨어져 있는지를 제곱해서 평균 낸 값입니다.
scores_a <- c(78, 80, 82, 79, 81) # 점수가 비슷한 반
scores_b <- c(60, 75, 80, 90, 95) # 점수 차이가 큰 반
mean(scores_a) # 80
mean(scores_b) # 80 — 평균은 같습니다
var(scores_a) # 2.5 — 분산이 작습니다
var(scores_b) # 197.5 — 분산이 큽니다
R의 var() 함수는 표본 분산(n-1로 나눔)을 계산합니다. 모집단 분산(n으로 나눔)이 필요하면 직접 계산해야 합니다.
x <- c(78, 80, 82, 79, 81)
# 표본 분산 (R 기본)
var(x) # 2.5
# 모집단 분산
sum((x - mean(x))^2) / length(x) # 2.0
표준편차 (Standard Deviation)
분산의 제곱근입니다. 분산은 단위가 제곱이라 해석이 어렵습니다. 표준편차는 원래 데이터와 같은 단위로 돌아옵니다.
scores_a <- c(78, 80, 82, 79, 81)
scores_b <- c(60, 75, 80, 90, 95)
sd(scores_a) # 1.58 — 평균에서 평균 1.58점 차이
sd(scores_b) # 14.1 — 평균에서 평균 14.1점 차이
표준편차가 0이면 모든 값이 동일합니다. 표준편차가 클수록 값들이 평균에서 멀리 흩어져 있습니다.
범위와 사분위수
범위 (Range)
최댓값과 최솟값의 차이입니다.
x <- c(72, 85, 90, 78, 95, 88, 62, 91, 84, 77)
range(x) # 62 95 — 최솟값과 최댓값
diff(range(x)) # 33 — 범위
사분위수 (Quartile)
데이터를 4등분하는 경계값입니다.
x <- c(72, 85, 90, 78, 95, 88, 62, 91, 84, 77)
quantile(x)
# 0% 25% 50% 75% 100%
# 62 77.25 86.5 89.75 95
# 1사분위수 (Q1): 25% 지점 — 전체의 25%가 이 값 이하
# 2사분위수 (Q2): 50% 지점 — 중앙값과 같습니다
# 3사분위수 (Q3): 75% 지점 — 전체의 75%가 이 값 이하
# 특정 분위수만 구하기
quantile(x, 0.25) # Q1
quantile(x, 0.75) # Q3
quantile(x, c(0.1, 0.9)) # 10%, 90% 분위수
# IQR (사분위 범위) = Q3 - Q1
IQR(x) # 12.5
IQR은 데이터의 가운데 50% 범위를 나타냅니다. 극단값의 영향을 받지 않아서 분산의 대안으로 자주 씁니다.
summary() — 한 번에 보기
x <- c(72, 85, 90, 78, 95, 88, 62, 91, 84, 77)
summary(x)
# Min. 1st Qu. Median Mean 3rd Qu. Max.
# 62.00 77.25 86.50 82.20 89.75 95.00
# 데이터프레임에 적용하면 모든 열을 한 번에 요약합니다
summary(iris)
그룹별 기술통계
library(dplyr)
iris %>%
group_by(Species) %>%
summarise(
n = n(),
mean = mean(Sepal.Length),
median = median(Sepal.Length),
sd = sd(Sepal.Length),
min = min(Sepal.Length),
max = max(Sepal.Length),
IQR = IQR(Sepal.Length)
)
| Species | n | mean | median | sd | min | max | IQR |
|---|---|---|---|---|---|---|---|
| setosa | 50 | 5.01 | 5.0 | 0.35 | 4.3 | 5.8 | 0.4 |
| versicolor | 50 | 5.94 | 5.9 | 0.52 | 4.9 | 7.0 | 0.7 |
| virginica | 50 | 6.59 | 6.5 | 0.64 | 4.9 | 7.9 | 0.7 |
변동계수 — 다른 단위의 데이터 비교
표준편차는 단위가 다른 데이터끼리 비교하기 어렵습니다. 변동계수(CV, Coefficient of Variation)는 표준편차를 평균으로 나눠서 백분율로 표현합니다.
# 키(cm)와 몸무게(kg)의 변동성 비교
height <- c(165, 170, 158, 175, 168)
weight <- c(58, 72, 55, 80, 65)
# 표준편차만 보면 단위가 달라 비교가 어렵습니다
sd(height) # 6.2 cm
sd(weight) # 9.9 kg
# 변동계수: (표준편차 / 평균) × 100
cv <- function(x) sd(x) / mean(x) * 100
cv(height) # 3.7% — 상대적으로 변동이 작습니다
cv(weight) # 15.3% — 상대적으로 변동이 큽니다
변동계수가 크다면 그 변수는 개인차가 크다는 의미입니다.
왜도와 첨도 — 분포의 모양
library(e1071) # install.packages("e1071")
x <- c(72, 85, 90, 78, 95, 88, 62, 91, 84, 77)
skewness(x) # 왜도 — 0에 가까울수록 대칭, 양수면 오른쪽 꼬리
kurtosis(x) # 첨도 — 0이면 정규분포, 양수면 뾰족, 음수면 납작
왜도(skewness)가 양수이면 오른쪽으로 긴 꼬리가 있다는 뜻입니다. 소득 분포가 대표적입니다. 대부분 사람의 소득은 중앙 근처에 몰려 있고, 소수의 고소득자가 오른쪽 꼬리를 만듭니다.
통계량 정리
| 통계량 | 함수 | 측정 대상 |
|---|---|---|
| 평균 | mean() | 중심 (극단값에 민감) |
| 중앙값 | median() | 중심 (극단값에 강건) |
| 분산 | var() | 흩어짐 (단위 제곱) |
| 표준편차 | sd() | 흩어짐 (원래 단위) |
| 최솟값/최댓값 | min(), max() | 범위 |
| 사분위수 | quantile() | 분포 위치 |
| IQR | IQR() | 흩어짐 (극단값에 강건) |
| 요약 | summary() | 전체 요약 |
숫자로 데이터를 파악했다면, 이제 시각화로 분포의 모양을 눈으로 확인할 차례입니다.