Menu

R의 산점도: plot(), 회귀선, 그리고 pairs()

R에서 산점도 만드는 방법 - plot()으로 두 변수 그리기, abline(lm())으로 회귀선 추가하기, lowess()로 평활하기, 그리고 pairs() 행렬 만들기.

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

산점도가 보여 주는 것

산점도는 수치형 변수 사이의 관계를 표시합니다: 관측마다 점이 하나씩 생기고, 첫 번째 값은 가로축, 두 번째 값은 세로축 위치를 정합니다. 두 변수가 함께 움직이면 점들이 패턴을 이루고, 그렇지 않으면 형체 없는 구름이 됩니다. 어떤 모형을 적합하기 전에 반드시 거치는 첫 관찰이며, R은 plot() 가이드에서 다룬 것과 같은 plot() 함수로 이를 그립니다.

자동차 32대가 담긴 내장 데이터셋 mtcars를 사용해 물리적인 질문을 던져 봅시다: 무거운 자동차일수록 엔진이 더 강력할까요?

그래프 만들기

wt는 1000파운드 단위의 무게, hp는 마력입니다:

plot(mtcars$wt, mtcars$hp,
     main = "Horsepower vs. weight",
     xlab = "Weight (1000 lbs)",
     ylab = "Horsepower",
     pch  = 19,
     col  = "steelblue")

그림은 이렇습니다: 속이 찬 점 서른두 개가 그래프의 낮은 모서리(무게 척도 1.5 근처의 가벼운 차, 60–90마력쯤)에서 시작해 5를 넘으며 200마력을 훌쩍 넘기는 무거운 차 쪽으로 올라갑니다. 상승세는 분명하지만 깔끔하지는 않습니다 - 같은 무게에서도 점들이 꽤 넓은 마력 구간에 퍼져 있습니다.

스타일 지정은 익숙한 base R 작도 도구입니다: 속이 찬 원에는 pch = 19(기본값인 속 빈 원은 스크린숏에서 사라집니다), 색에는 col, 점을 키우려면 cex = 1.3입니다. 세 번째 범주형 변수로 점 색을 칠하려면 색 벡터를 팩터로 인덱싱하세요 - col = c("tomato", "steelblue", "darkgreen")[factor(mtcars$cyl)]은 실린더 수마다 고유한 색을 부여합니다.

읽는 법: 방향, 강도, 형태

산점도를 볼 때마다 순서대로 던질 세 가지 질문입니다:

  • 방향. 가로축을 따라 훑을 때 점들이 올라가나요(양의 관계) 내려가나요(음의 관계)? 여기서는 올라갑니다: 무거울수록 강력합니다. 대신 mpgwt에 대해 그리면 구름이 내려갑니다 - 무거울수록 연료를 더 먹죠.
  • 강도. 점들이 하나의 경로에 얼마나 바짝 붙어 있나요? 연필처럼 가는 띠는 강한 관계이고, 헐겁게 흩뿌려진 모습은 약한 관계입니다. 이 구름은 적당히 조밀합니다.
  • 형태와 뜻밖의 것들. 경로가 직선인가요 곡선인가요? 군집이 있나요, 나머지에서 멀리 떨어진 점이 있나요? mtcars에서는 Maserati Bora가 무리 위로 눈에 띄게 솟아 있습니다 - 중간 정도 무게에 335마력이죠. 이런 점 하나가 적합된 직선을 눈에 띄게 끌어당길 수 있으며, 그래서 적합하기 전에 먼저 보는 것입니다.

추세선 추가하기

산점도는 관계를 진술하고, 그것을 관통하는 선은 그 주장을 요약합니다. 선형 모형을 적합해 곧바로 abline()에 넘기세요:

plot(mtcars$wt, mtcars$hp,
     pch = 19, col = "steelblue",
     xlab = "Weight (1000 lbs)", ylab = "Horsepower")

abline(lm(hp ~ wt, data = mtcars), col = "tomato", lwd = 2)

lm(hp ~ wt)는 최소제곱 직선을 적합하고 - 수식은 "wt로 설명되는 hp"로 읽으며 세로축 변수가 ~ 앞에 옵니다 - abline()이 그것을 그래프 위에 그립니다. 이 직선은 1000파운드당 약 46마력씩 올라갑니다. 그 모형이 무엇을 뜻하고 요약 결과를 어떻게 읽는지는 선형회귀의 주제입니다.

직선을 가정하고 싶지 않다면 lowess()가 데이터를 따라가는 매끄러운 곡선을 그려 줍니다:

lines(lowess(mtcars$wt, mtcars$hp), col = "darkgreen", lwd = 2, lty = 2)

lowess 곡선과 직선이 대체로 일치하면 선형 요약이 타당합니다. 곡선이 휘어 나간다면 관계가 비선형이며 직선은 그것을 잘못 표현하게 됩니다.

cor()로 숫자 확인하기

그래프가 형태를 주고, cor()이 강도를 숫자 하나로 줍니다. 이 단계는 순전히 텍스트 출력이므로 여기서 실행해 보세요:

무게와 마력의 상관계수는 약 0.66입니다 - 적당히 조밀하게 상승하는 구름을 숫자로 나타낸 것이죠. 행렬은 mpg가 두 변수 모두와 강한 음의 상관을 가진다는 사실을 덧붙입니다(무게와는 약 −0.87). 다만 작업 순서는 지키세요: 그래프가 먼저, 계수가 나중입니다. 하나의 r 값은 곡선을 감출 수도 있고 이상치 하나로 부풀려질 수도 있습니다 - 오해를 부르는 전형적인 방식은 상관관계를 참고하세요.

산점도 행렬: pairs()

수치형 열이 여럿이면 모든 쌍을 손으로 그리는 일이 금세 지겨워집니다. pairs()가 한 번의 호출로 해 줍니다:

pairs(mtcars[, c("mpg", "wt", "hp")],
      pch = 19, col = "steelblue")

결과는 3 × 3 격자입니다: 대각선을 따라 변수 이름이 놓이고, 대각선이 아닌 각 패널은 한 쌍의 산점도입니다 - mpgwt, mpghp, wthp가 각각 축을 바꿔 두 번씩 나타납니다. 새 데이터셋을 분류하는 가장 빠른 방법입니다: 한 번 보면 어떤 쌍이 관련되어 있는지, 어떤 관계가 휘어 있는지, 이상치가 어디 숨어 있는지 드러납니다. 여기서처럼 먼저 열을 부분집합으로 고르세요 - 변수가 예닐곱 개를 넘으면 패널이 읽을 수 없을 만큼 작아집니다.

ggplot2 버전

ggplot2에서 산점도와 적합선은 두 개의 레이어입니다:

library(ggplot2)

ggplot(mtcars, aes(x = wt, y = hp)) +
    geom_point(color = "steelblue", size = 2) +
    geom_smooth(method = "lm", color = "tomato") +
    labs(title = "Horsepower vs. weight",
         x = "Weight (1000 lbs)", y = "Horsepower")

geom_smooth(method = "lm")은 보너스가 붙은 abline(lm(...))입니다: 선 주위에 음영으로 표시된 신뢰대가 함께 그려집니다. method를 지정하지 않으면 대신 loess 곡선을 적합합니다 - lowess()의 ggplot2 대응물이죠. 빠르게 훑어볼 때는 base R이 타이핑 속도에서 이기고, 점을 그룹별로 칠하고 범례를 자동으로 붙이고 싶은 순간부터는 ggplot2가 이깁니다.

핵심 정리

  • 두 수치형 벡터로 호출한 plot(x, y)가 산점도입니다. pch = 19와 라벨이 붙은 축이 보여 줄 만한 그래프를 만듭니다.
  • 무엇을 계산하기 전에 방향, 강도, 형태를 읽고 이상치를 찾아내세요.
  • abline(lm(y ~ x, data = df))는 회귀선을 추가하고, lines(lowess(x, y))는 직선성을 가정하지 않는 곡선을 추가합니다.
  • cor()은 그래프가 보여 주는 것을 수치화하고, 그래프는 그 숫자를 정직하게 유지해 줍니다.
  • pairs(df[, cols])는 모든 쌍의 산점도를 한 번에 그립니다 - 새 데이터셋을 가장 빠르게 훑는 방법입니다.

다음 주제: 막대그래프 - 수치형 쌍을 뒤로하고 범주별 개수를 비교합니다.

자주 묻는 질문

R에서 산점도는 어떻게 만드나요?

두 수치형 벡터로 plot(x, y)를 호출합니다 - 예를 들면 plot(mtcars$wt, mtcars$hp)입니다. 관측마다 점이 하나씩 생깁니다. 속이 찬 점을 원하면 pch = 19를, 라벨에는 main, xlab, ylab을 추가하세요.

R에서 산점도에 회귀선은 어떻게 추가하나요?

모형을 적합해 abline()에 넘깁니다: abline(lm(hp ~ wt, data = mtcars))가 기존 그래프 위에 최소제곱 직선을 그립니다. 수식 순서에 유의하세요 - 세로축 변수가 ~ 앞에 옵니다.

R에서 여러 변수 쌍을 한 번에 그리려면 어떻게 하나요?

pairs(df)가 산점도 행렬을 그립니다: 모든 열 쌍마다 작은 패널이 하나씩 생깁니다. 먼저 부분집합을 고르세요 - pairs(mtcars[, c("mpg", "wt", "hp")]) - 열이 예닐곱 개를 넘어가면 패널이 너무 작아져 읽을 수 없기 때문입니다.

산점도는 상관계수가 알려 주지 못하는 무엇을 알려 주나요?

형태입니다. 상관계수는 숫자 하나이며, 깔끔한 직선이든 곡선이든 극단적 이상치가 하나 있는 구름이든 같은 값이 나올 수 있습니다. 산점도는 곡률, 군집, 이상치를 직접 보여 줍니다 - 그래서 먼저 그리고 그다음에 cor()을 계산하는 것입니다.

Coddy programming languages illustration

Coddy로 코딩 배우기

시작하기