Menu

R의 평균, 중앙값, 표준편차

R에서 데이터를 요약하는 방법: mean(), median(), sd(), var(), summary(), quantile() - 각각이 무엇을 계산하는지, sd() 뒤의 n−1 세부 사항, 그리고 R의 mode()가 함정인 이유.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

평균과 중앙값

통계학 전체에서 가장 많이 쓰이는 두 요약값은 각각 함수 호출 한 번입니다:

mean()은 전부 더해 개수로 나눕니다. median()은 값을 정렬해 가운데 값을 고릅니다(개수가 짝수면 가운데 두 값의 평균을 냅니다). mtcars의 자동차 32대에서 평균 연비는 약 20.1 mpg이고 중앙값은 19.2입니다 - 서로 가깝다는 것은 데이터가 심하게 치우쳐 있지 않다는 뜻입니다. 둘이 크게 어긋날 때도 그 자체가 정보이며, 이 글 끝에서 다룹니다.

누구나 놀라는 점이 하나 있습니다: 벡터에 NA가 단 하나라도 있으면 두 함수 모두 NA를 반환합니다:

의도된 동작입니다 - R은 결측값이 없는 척 조용히 넘어가기를 거부합니다. na.rm = TRUE는 "가지고 있는 값으로 계산하라"는 뜻입니다. 이 글의 거의 모든 요약 함수가 이 인자를 받습니다. NA가 어떻게 전파되는지에 대한 전체 이야기는 결측값에 있습니다.

표준편차와 분산

sd()는 산포를 측정합니다: 대략, 전형적인 값이 평균에서 얼마나 떨어져 있는지를 데이터와 같은 단위로 나타냅니다. var()은 그 제곱입니다:

표준편차가 약 6 mpg라는 것은 자동차들이 대체로 평균 20.1에서 6 mpg 이내에 있다는 뜻입니다. sd()는 데이터 자체의 단위를 쓰므로 보고할 때 사용하는 값이고, var()은 주로 다른 공식 안에서 등장합니다.

과제에서 중요한 세부 사항이 있습니다: sd()var()표본 통계량을 계산합니다 - 편차 제곱합을 n이 아니라 n − 1로 나눕니다:

n − 1일까요? 같은 데이터로 평균을 추정했기 때문에 그 추정된 평균 주위의 편차는 체계적으로 조금 작아지는데, n − 1로 나누는 것이 이를 보정합니다. 여러분의 데이터는 거의 언제나 더 큰 무언가에서 뽑은 표본이므로 n − 1 버전이 원하는 값입니다. 정말로 전체 모집단을 갖고 있다면(그 반의 모든 학생, 카탈로그의 모든 제품) 곱해 주세요: var(x) * (n - 1) / n.

평균의 표준오차

표준편차와 표준오차는 끊임없이 혼동되므로 확실히 구분해 두세요: sd는 데이터를 설명하고, SE는 평균에 대한 추정을 설명합니다. R에는 내장 se()가 없지만 공식은 한 줄입니다:

표준오차는 표본이 커질수록 작아집니다 - 데이터를 네 배 모으면 SE는 절반이 됩니다 - 표본이 클수록 평균을 더 정밀하게 짚어 내기 때문입니다. sd는 표본 크기에 따라 작아지지 않습니다. 몇 대를 측정하든 자동차들은 원래 그만큼 다양하니까요. SE는 신뢰구간의 구성 요소이며, 거기서 진가를 발휘합니다.

summary() - 한 번의 호출로 얻는 개요

summary()는 다섯 숫자 요약에 평균을 더해 한 번에 보여 주며, 데이터 프레임 전체에도 동작합니다:

데이터 프레임에 호출하면 모든 열을 요약합니다 - 수치형 열은 최솟값/사분위수/평균/최댓값을, 팩터는 수준별 개수를 보여 줍니다. 방금 불러온 데이터셋이라면 가장 먼저 실행할 것입니다: 불가능한 값(음수인 나이, 9999라는 최댓값)이 즉시 눈에 띕니다.

분위수, 범위, 사분위범위

quantile()은 중앙값을 임의의 절단점으로 일반화합니다:

인자 없이 호출하면 최솟값, 사분위수, 최댓값을 반환합니다. 특정 절단점이 필요하면 probs =를 전달하세요 - 위의 10번째와 90번째 백분위수는 데이터의 대부분이 어디에 사는지를 감쌉니다. IQR()(25번째와 75번째 백분위수 사이의 거리)은 sd()와 달리 이상치에 끌려다니지 않는 산포 측도입니다. range()는 최솟값과 최댓값을 한 쌍으로 반환합니다.

최빈값: R의 mode()는 그 일을 하지 않습니다

이것은 누구나 정확히 한 번은 걸리는 함정입니다. R에는 mode()라는 함수가 있지만 통계와는 아무 상관이 없습니다 - 객체의 저장 타입을 알려 줍니다:

기억할 관용구는 이렇습니다: table(x)가 각 값이 몇 번 나타나는지 세고, which.max()가 가장 큰 도수를 찾고, names()가 그 값 자체를 꺼냅니다. 반환값이 문자열이라는 점에 유의하세요(테이블 이름은 언제나 문자열입니다). 그 값으로 계산해야 한다면 as.numeric()으로 감싸세요. 두 값이 동점이면 which.max()는 조용히 첫 번째만 반환하므로, 동점이 있을 법하면 테이블을 직접 확인하세요.

평균 vs 중앙값: 무엇을 보고할까

평균은 모든 값을 사용하는데, 이는 장점이자 약점입니다 - 극단값 하나가 평균을 끌고 갑니다. 중앙값은 가운데만 신경 쓰므로 이상치가 거의 영향을 주지 못합니다:

값 하나가 추가되자 평균이 약 49,300에서 155,000 이상으로 밀려납니다 - 데이터 안의 누구도 설명하지 못하는 숫자죠 - 반면 중앙값은 48,000에서 49,500으로 조금 움직일 뿐입니다. 소득, 집값, 입원 기간을 중앙값으로 보고하는 이유가 이것입니다: 꼬리가 긴 치우친 데이터는 평균을 오해하게 만듭니다. 대체로 대칭인 데이터라면 둘이 일치하고 평균이 적절합니다(통계적으로도 더 효율적입니다). 어느 상황인지는 간단한 히스토그램이 알려 주며, 평균과 중앙값을 비교하는 것 자체가 한 줄짜리 왜도 점검입니다.

핵심 정리

  • mean(x)median(x) - 결측값이 있으면 na.rm = TRUE를 추가하세요.
  • sd(x)var(x)표본 통계량(n − 1 분모)을 계산하며, 대개 그것이 원하는 값입니다.
  • 표준오차는 sd(x) / sqrt(length(x))입니다 - 데이터가 얼마나 퍼져 있는지가 아니라 평균을 얼마나 잘 아는지를 측정합니다.
  • 갓 불러온 데이터 프레임에 summary()를 실행하는 것이 R에서 가장 빠른 점검입니다.
  • 최빈값은 names(which.max(table(x)))입니다 - R의 mode()는 저장 타입에 대한 함수입니다.
  • 치우친 데이터나 이상치가 있으면 중앙값을 보고하고, 대칭인 데이터라면 평균으로 충분합니다.

다음 주제: 두 변수가 함께 움직이는 정도 측정하기 - cor()cor.test()로 하는 상관분석입니다.

자주 묻는 질문

R에서 표준편차는 어떻게 계산하나요?

sd(x)로 계산합니다. 이 함수는 표본 표준편차를 계산한다는 점에 유의하세요 - n이 아니라 n − 1로 나눕니다. 실제 분석에서는 데이터가 거의 언제나 전체 모집단이 아니라 표본이므로 대부분의 경우 이것이 원하는 값입니다.

R에서 평균과 중앙값은 어떻게 구하나요?

mean(x)median(x)입니다. 벡터에 결측값이 있으면 둘 다 NA를 반환하므로, 존재하는 값으로 계산하려면 na.rm = TRUE를 추가하세요: mean(x, na.rm = TRUE).

R에서 최빈값은 어떻게 구하나요?

mode()로는 안 됩니다 - 그 함수는 가장 자주 나타나는 값이 아니라 객체의 저장 타입을 반환합니다. 대신 테이블 관용구를 쓰세요: names(which.max(table(x)))가 가장 자주 나타나는 값을 반환합니다.

R에서 표준오차는 무엇인가요?

내장 함수가 없습니다. sd(x) / sqrt(length(x))로 계산하세요. 표준편차는 데이터의 산포를 설명하고, 표준오차는 평균을 얼마나 정밀하게 추정했는지를 설명하며 표본이 커질수록 작아집니다.

Coddy programming languages illustration

Coddy로 코딩 배우기

시작하기