Notice
Recent Posts
Recent Comments
Link
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

Elevation

R과 통계분석 1편 본문

정리/R

R과 통계분석 1편

aste999 2025. 10. 1. 10:15

표본분포

dbinom(x, size, prob)

$X \sim B(n, p)$에서 $P(X=x)$. x에는 벡터가 들어갈 수 있다.

 

pbinom(x, size, prob)

dbinom의 누적 합이다.

pbinom의 역함수로, 백분위를 x로 바꿔주는 qbinom()도 있다.

 

dnorm(x, mean, sd)

$X \sim N(\mu, \sigma^2)$에서 $P(X=x)$를 계산하고 사용방법은 비슷하다.

for(i in 5:0){
  print(dbinom(i, size = 10, prob = 0.7))
}
pbinom(5, size = 10, prob = 0.7)
sum(dbinom(0:5, size = 10, prob = 0.7))

dnorm(seq(1,5), mean=0, sd=1)

 

 

데이터 불러오기

setwd(dir), getwd()로 working directory를 지정 및 확인한다.

csv 파일을 불러오려면 readr 라이브러리의 read_csv()를 이용한다.

엑셀 파일을 볼러오려면 readxl 라이브러리의 read_excel()을 이용한다.

install.packages("readr")
library("readr")
data <- read_csv("data.csv")

 

 

정규성 확인

먼저 히스토그램을 그려보자.

hist(x)로 그릴 수 있다. 주요 argument들은 다음과 같다.

  • breaks: 계급 구간을 지정한다. 계급 구간의 개수가 들어가거나, seq()로 직접 벡터를 지정해 주거나, "Sturges" 등 알고리즘명이 들어갈 수 있다.
  • prob: TRUE이면 y축이 확률밀도, FALSE면 도수가 된다. 반대로 동작하는 freq 매개변수가 있다.
  • col: 칼럼 색

정규분포 곡선을 그려서 히스토그램과 비교하여 정규성 가정을 만족하는지 확인해볼 수 있다. seq()로 x축에 대응되는 벡터를 만들어서 dnorm()으로 분포값 y를 생성하고, lines(x, y)로 그려준다.

hist(data$BMI, breaks = seq(min(data$BMI)-1, max(data$BMI)+1, by=1), prob=TRUE, col="skyblue")

x <- seq(min(data$BMI),max(data$BMI),length=100)
ND <- dnorm(x,mean=mean(data$BMI),sd=sd(data$BMI))
lines(x, ND, lwd=2, col="green")

 

 

prob=FALSE로 설정하여 y축이 frequency라면, 정규분포 곡선도 그에 맞춰 수정해 주어야 하는데, 히스토그램의 한 단위(bin)의 간격 binwidth와, 전체 데이터 길이를 곱해 주어야 한다.

binwidth <- diff(range(data$BMI)) / 100
ND <- ND * binwidth * length(data$BMI)

 

 

Q-Q plot을 그려서 확인해볼 수도 있다. 간단하게 qqnorm-qqline으로 그릴 수 있다.

qqnorm(data$BMI)
qqline(data$BMI)

 

 

정규성을 검정하는 방법 역시 있다. Shapiro-Wilk test가 대표적이며 Kolmogorov-Smirnov test, K-S test를 개선시킨 Lilliefors test가 있다. 구체적인 검정의 원리를 모르더라도 간단하게 사용할 수 있기 때문에 편리하나, 결과의 해석에 주의하여야 한다.

  • 대립가설이 "정규성을 만족하지 않음"이므로, 일반적인 검정과는 달리 p>0.05이기를 기대한다.
  • 데이터 크기가 너무 크면 분산이 작아져 정규성을 만족할 때에도 p-value가 작아지므로, 앞의 방법들을 이용해 데이터 전반을 함께 확인하는 것이 좋다.
shapiro.test(data$BMI)
ks.test(data$BMI, "pnorm", mean=mean(data$BMI), sd=sd(data$BMI))

#install.packages("nortest")
library("nortest")
lillie.test(data$BMI)