Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
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 31
Tags
more
Archives
Today
Total
관리 메뉴

BASEMENT

R 프로그래밍 5주차 본문

Programming/R

R 프로그래밍 5주차

2_34 2020. 7. 18. 14:43

 

 

* rJava jdk8 설치하기 *

제어판 - 윈도우 고급 설정 - 환경변수 - 시스템변수- JAVA_HONE, PATH 설정해주기

 

통계학의 이해

1. 자료의 이해

 

개체와 변수

  • 변수 : 자료 수집에서 측정할 특성 ex) 성별, 키, 몸무게, 온도, 혈압 등 설문지 각 문항의 내용같은 것
  • 개체 : 변수에서 측정되는 대상의 기본단위

모집단, 모수, 표본

  • 모집단 : 데이터들
  • 모수 : 데이터들 중 하나
  • 표본 : 분석할 데이터 그룹

 

자료의 종류 - 변수의 성질에 따라

 

1) 양적 자료 - 주로 수치형

  • 연속형 자료 (예: 키, 나이) : 구간으로 구분 가능, 모두 수치형 데이터, 절대 0점이 있음
  • 이산형 자료 (예: 입장인원 수) : 관측해서 나오는 값

* 절대0점 : 시작이나 끝을 임의로 0으로 놓은 값들    ex) 온도

  절대0점 있는 것 : 비척도 

  절대0점 없는것 : 척도

 

2) 질적 자료 - 주로 문자형

  • 순위형 자료 (예: 선호도, 신용평가 점수) : 등급으로 구분 가능
  • 명목형 자료 (예: 성별)

범주형과 연속형 자료 - 자료의 형태가 변할 수 있음 (모델링의 목적에 따라)

 

1) 범주형 자료

  • 명목척도 : 범주 - 성별, 혈액형처럼 각 자료를 구분
  • 순위척도 : 범주, 순위  (ex: 등급 -> 연속형이 아닌 범주형) - 서열이 있지만 간격이 서로 같다고 할 수 없으므로 수량화할 수 없고 평균을 낼 수 없음

2) 연속형 자료 - 수량화 가능, 평균을 낼 수 있음

  • 간격 척도 : 범주, 순위, 같은간격
  • 비 척도 : 범주, 순위, 같은간격, 절대0점 (0부터 시작하여 카운트 함)

2. 자료의 요약

 

1) 범주형 자료

 

도수분포표 (frequency) : 범주형 자료를 요약하여 표로 만든 것. 전체에 대한 비율 표현 가능 (상대도수)

  • 테이블함수 : 범주형 자료 구간 카운트하여 나타냄
  • 파이차트 : 범주형 자료 시각화에 적합
  • 정규분포 : 종 형태 -> 그래프를 그릴 때 정규분포에 유사한 히스토그램, 막대그래프가 가장 보기 좋고 적합함

2) 연속형 자료

연속적인 척도에서 관측되는 자료

범주형 보다 중복값이 적음

도수분포표 : 구간을 카운트해서 도수를 정함. 최대, 최소 범위를 보고 균등하게 나눌지(uniform),  거칠게 나눌지 판단

* 연속형 변수를 구간화하여 범주형 변수로 -> 해석이 용이해짐, 연속형 변수와 관계성을 볼 수 있음(비교 용이) 

 

3. 확률과 분포

 

확률 : 어떠한 결과에 대해 확신하는 정도를 나타낸 수치적 척도

 

P(A) = 사건 A에 속하는 결과의 수 / 표본공간에 속하는 결과의 수

 

  • 확률변수 : 표본공간에 속하는 각각의 변수들에 대해 실수값을 대응하여 나타낸 함수
  • 확률분포 : 확률변수가 가지는 값과 그 값을 가질 확률을 정해주는 규칙 또는 관계
  • 분산 : 데이터가 펼쳐진 정도를 볼 수 있음
  • 표준편차 : 분산의 양의 제곱근

이항분포 : 베르누이 시행을 N번 반복한 경우 성공횟수를 확률변수 X라 하면, 이 확률변수 X의 확률분포는 이항분포를 따르게 됨

 

cf) 베르누이 시행

베르누이 실험을 여러번 시행하는 과정 

X ~ Bin(n, p)

 

4. 가설검정

 

1) 용어 정의

  • 귀무가설(null hypothesis, H0) : 측정된 두 현상 간에 관련이 없다는 기존의 주장. 주장에 반대되는 가설
  • 대립가설(alternative hypothesis, H1) : 증명을 필요로 하는 새로운 주장. 주장하고 싶은 가설
  • 기각치(critical value) : 귀무가설을 기각하는 기준값
  • 기각역(critical region) : 기각치를 기준으로 귀무가설을 기각할 수 있는 범위
  • 검정통계량(test statistic) : 가설 검정을 위한 모수의 검추경량
  • 유의수준(significance level) : 귀무가설 H0를 잘못 기각할 확률

cf) 가설검정은 귀무가설을 일단 참이라고 가정하고 시작함

 

2) P-value

  • H0가 참일 때 검정통계량이 실제 표본을 통한 검정통계량의 관측값과 같거나 더 지나친 값(크거나 작은 값)을 취할 확률
  • p-value < 알파(0.05) => 귀무가설을 기각함

ex) 귀무가설 H0 : 코로나가 인체에 무해 

     대립가설 H1 : 코로나가 인체에 유해

     p-value < 0.05 -> 귀무가설을 기각함

     p-value가 그 외의 값이면 -> 귀무가설

 

5. 난수 생성 및 분포 함수

 

1) 정규(Normal)분포 : rnorm

2) 포아송(Poisson)분포 : rpois

3) t 분포 : rt

4) 연속 균등(Uniform) 분포 : runif

5) 이항(Binomial)분포 : rbinom

6) F 분포 : rf

 

6. 정규분포

  • 정규분포 : 모든 분야에서 가장 중요하게 생각되는 대표적인 연속확률변수                                                    -> 통계학에서 가장 많이 사용되는 대표적인 연속확률 분포
  • 표준정규분포 : 정규분포 중 평균이 0이고, 분산이 1인 정규분포. Z검정 (정규분포에 수렴하는가 판단) 사용
  • Z ~ N(0,1)

* 자유도가 증가할수록(표본이 늘어날수록) 표준 정규분포 형태에 비슷해짐

 

 

7. 중심극한정리

 

모집단의 확률분포가 연속형이거나 이산형, 혹은 대칭이거나 비대칭에 상관관계 없이 표본의 크기가 충분히 크다면 표본평균의 확률분포가 근사적으로 정규분포를 따르게 됨

 

평균이 μ이고 분산이 σ2인 모집단으로부터 추출한 크기 n의 확률표본의 표본평균 X는 표본의 크기가 큰 경우(보통 30이상), 근사적으로 평균이 μ이고 분산이 σ2/n인 정규분포를 따르게 됨

 

즉, 표본수가 많거나 적어도 대부분 정규분포에 수렴함

 

* 모집단의 확률분포 

  • 30이상 : 모수적 테스트 (카이제곱검정 등)
  • 10 < A <30 : 비모수적 테스트
  • 10미만 : 비모수적 테스트

8. 상관분석

 

두 변수 사이의 선형관계를 산점도로부터 대략적으로 알 수 있음

이를 하나의 수치값인 통계량으로 나타낸 것이 상관계수

 

cf) 편상관관계 : 변수 3개이상일때. r= 0.5

 

상관계수

  • r = X와 Y가 함께 변하는 정도 or X와 Y가 각각 변하는 정도
  • r 값이 X, Y와 완전히 동일하면 +1, 반대방향으로 완전히 동일하면 -1 

1) 피어슨 상관계수

 

두 변수 간의 선형적 상관관계를 측정

[-1, 1] 사이의 값을 가짐

cor() 함수 사용

data(iris)
cor(iris$Sepal.Width, iris$Sepal.Length)
cor(iris[,1:4])
install.packages("corrplot")	# corrplot : 상관계수를 시각화
library(corrplot)

data(iris)
corrgram(iris, upper.panel=panel.conf)
pairs(iris)			# pairs() : 상관계수 시각화

 

* 공분산 (Covariance)

 

cov(X, Y)

두 확률 변수가 얼마나 함께 변하는지 측정

한 변수가 커질 때 다른 변수가 함께 커지는것 과 같이 크기 변화의 방향이 같다면 공분산은 양의 값

한 변수가 커질 때 다른 변수가 작아지는 것과 같은 경우 음의 값을 가짐

만약 두 변수의 값이 서로 상관없이 움직인다면 공분산은 0

 

2) 스피어만 상관계수

 

상관계수를 계산 할 두 데이터의 실제값 대신 두 값의 순위를 사용해 상관계수를 계산하는 방식

[-1, 1] 사이의 값을 가짐

비선형 관계의 연관성을 파악할 수 있음

이산형 데이터, 순서형 데이터에 적용 가능

x <- c(3,4,5,3,2,1,7,5)
rank(sort(x))	# 순위 : 순서형 데이터

m <- matrix(c(1:10, (1:10)^2), ncol=2))
cor(m, method="spearman")	# 숫자가 양쪽 모두 증가하므로 상관계수는 1

9. 상관 계수 검정

 

cor.test() 를 사용해 상관계수 검정을 수행하여 상관 계수의 통계적 유의성을 판단

이때 귀무가설은 'H0:상관계수가 0이다' 이며, 대립가설은 'H1:상관계수가 0이 아니다'

cor.text(x, y, alternative=c("two.sided", "less","greater"), method=c("pearson", "spearman", "kendall"))

cor.test(c(1,2,3,4,5), c(1,0,3,4,5), method="pearson")	# 피어슨 상관계수
cor.test(c(1,2,3,4,5), c(1,0,3,4,5), method="spearman")	# 스피어만 상관계수
cor.test(c(1,2,3,4,5), c(1,0,3,4,5), method="kendall")	# 켄달의 상관계수

# p-value가 가장 작은 상관계수를 사용

10. T test

 

정규분포와 유사함

일표본 평균의 구간 추정 및 가설 검정에 사용

하나의 값이 귀무가설인지 아닌지 판단할때 사용

두 변수(둘 다 연속형 변수)의 상관관계를 볼 때 유용하게 사용함

 

cf) 구간 추정 : 모집단에서의 값을 구간 형태로 표시하는 것 (ex: 우리나라 20대의 평균키 구간 170cm +- 10cm)

                   점 추정보다 구간 추정이 더 중요함

x <- rnorm(3)

t.test(x)

# p-value = 0.5319
# 귀무가설 : 모평균이 0이다
# p-value > 0.05이므로 귀무가설 기각x, 모집단의 평균은 0이 아님

11. 독립성 검정 

 

분할표의 행에 나열된 변수와 열에 나열된 변수가 독립이라고 가정한 후 가정이 성립하는지 알아보는 것

행과 열이 독립이라면 (i,j)셀의 확률 P(i,j)에 대해 P(i,j) = P(i) x P(j) 식이 성립함

변수 간 독립성 검정에는 카이 제곱 검정 사용

 

12. 카이제곱 검정 (Chi-squared test)

 

데이터의 크기가 일정 수 이상이라면 데이터가 정규 분포를 따름을 일반적으로 가정함 (중심극한정리)

실제로 그 분포를 따르는지 확인하는 적합도 검정 중 하나가 카이제곱 검정

 

귀무가설에 언급되는 내용이 적합한지 알아보는 척도로 피어슨이 처음 제시

카이제곱 분포를 가정하는 범주형 데이터에 대한 통계적 검정

chisq.test()

 

cf) t-test : 연속형 데이터에 사용

    chist test : 범주형 데이터에 사용

    연속형+범주형 -> 연속형 데이터의 구간을 나누어 범주형으로 변환, 범주형 데이터와 같이 test가능해짐

library(MASS)
data("survey")
head(survey)

table(survey$W.Hnd)
chisq.test(table(survey$W.Hnd), p=c(.3, .7))

# p-value < 0.05 이므로 글씨를 왼손으로 쓰는 사람과 오른손으로 쓰는 사람의 비율이 30%:70% 라는 귀무가설 기각
# 성별과 운동정도의 독립성 검정

library(MASS)
data(survey)
head(survey[c("Sex", "Exer")])

table(survey[c("Sex", "Exer")])
xtabs(~Sex + Exer, data=survey)

chisq.test(xtabs(~Sex + Exer, data=survey))

# p-value = 0.05731 -> p > 0.05 이므로 성별, 운동정도 독립이 아님

 

13. 피셔의 정확 검정

 

분할표를 그린 뒤 표본수가 적거나 표본이 한쪽 셀에 매우 치우치게 분포된 경우
카이테스트 사용x, 피셔테스트 사용함

data(survey)
xtabs(~W.Hnd + Clap, data=survey)

       Clap
W.Hnd   Left Neither Right       => 표본이 Right에 치우치게 분포함
  Left     9       5     4
  Right   29      45   143
  
chisq.test(xtabs(~W.Hnd + Clap, data=survey))	# 오류
fisher.test(xtabs(~W.Hnd + Clap, data=survey))	# p-value = 0.0001413, p-value < 0.05  -> 독립이 아님  

 

14. 콜로고로프 스미르노프 검정 (K-S Test)

 

누적분포함수간의 최대 거리를 통계량으로 사용하는 가설 검정 방법

최적그래프와 최소그래프의 거리값이 벌어질수록 좋은 모델

모델의 정확도 검증할 때 사용

cf) 2분류 ( Y = 0 or 1 ) 후 모델링 -> 모델의 정확도 검증 ( K-S test, ROC, Confusion Matrix, PSI)

cf) 정규성 검정  : 데이터가 정규 분포를 따르는지 불명확한 경우 (샤피로 윌크검정, 콜로고로프 스미르노프검정, Q-Q도)

 

ks.test(rnorm(100), rnorm(100))

# p-value > 0.05이므로 두 난수가 같은 분포라는 귀무가설 기각 불가

 

15. 분할표

 

명목형, 순서형 데이터의 도수를 표 형태로 기록한 것

분할표가 작성되면 카이 제곱 검정으로 변수 간 의존 관계가 있는 지를 독립성 검정으로, 도수가 특정 분포를 따르는지 적합도 검정으로 확인 가능

순서 : range -> range 구간나눔 -> 구간 count

분할표 작성 함수 : table(), xtabs()

d <- data.frame(x=c("1","2","2","1"), y=c("A","B","A","B"), num=c(3,5,8,7))
(xtabs(num ~ x+y, data=d))
#  A B
#1 3 7
#2 8 5


table(c("a","b","b","b","c","c","d"))
# a b c d
# 1 3 2 1

 

16. 다섯 수치 요약 (5 number summary)

 

fivenum()

데이터를 최솟값, 제1사분위수, 중앙값, 제3사분위수, 최댓값으로 요약함

cf) summary() : 이에 더해 추가로 평균 출력

fivenum(1:11)	# c(1 ~ 11) 다섯수치 요약
summary(1:11)

17. 단순 임의 추출 (Simple Random Sampling)

 

전체 데이터에서 각 데이터를 추출할 확률을 동일하게 하여 표본을 추출하는 방법

sample() 함수 사용

 

1) 복원추출

한 번 추출된 표본을 다시 선택하는 것이 가능한 경우

sample(1:10,5, replace=TRUE)	# replace=TRUE : 복원추출

2) 비복원추출

한 번 추출한 표본은 다시 선택할 수 없는 경우

sample(1:10,5, replace=False)	# 1~10 5개의 수 비복원 추출 

# replace의 기본값은 False이므로 생략가능 

cf) 가중치를 고려한 표본 추출

prob 파라미터 사용

sample(1:10,5, replace=TRUE, prob=1:10)	# 1~10까지의 가중치부여

18. 층화 임의 추출

 

데이터가 중첩 없이 분할될 수 있는 경우, 각 분할의 성격이 명확히 다른 경우 수행 가능

ex) 남성 20%, 여성 80%로 구성된 집단, 일부를 표본으로 뽑아 키를 측정한 후 전체 집단의 평균키 예상시 성별에 따라 키의 차이가 존재하므로 성별을 고려하여 층화 임의 추출함

 

sampling::strata

주어진 데이터에 대해 층화 임의 추출

 

sampling::getdata

표본 추출을 수행한 뒤 데이터 프레임으로부터 값을 추출

install.packages("sampling")
library(sampling)

(x<- strata(c("Species"), size=c(3,3,3), method="srswor", data=iris))	# iris 종별로 3개씩 추출

getdata(iris, x)

 

ggplot2 실습

install.packages("ggplot2")
install.packages("vctrs")
library(ggplot2)

DT <- data.frame(계절=c("봄","여름","가을","겨울"), 도수=c(8,9,11,6), 상대도수=c(0.235, 0.265, 0.324, 0.176))

ggplot(DT, mapping=aes(x=계절, y=도수, fill=상대도수)) +
  geom_bar(stat="identity")
  #geom_text(aes(label=..count..),stat='count' ,position=position_dodge(width=1.8),vjust=0.5)

# 수학시험성적 : 77,78,76,81,86,51,79,82,84,99
# 아파트 가구원수 : 1,5,2,3,2,1,4,1,3
# 평균, 중위수, 분산, 표준편차, 사분위수

x <- c(77,78,76,81,86,51,79,82,84,99)
y <- c(1,5,2,3,2,1,4,1,3)
X <- c(mean(x), median(x), var(x), sd(x), quantile(x))
X
Y <- c(mean(y), median(y), var(y), sd(y), quantile(y))
Y

#상대도수 계산
#히스토그램을 그려라 (+ 확률밀도 그래프 포함)

A <- data.frame(계급구간=c("0이상 10미만","10이상 20미만","20이상 30미만","30이상 40미만","40이상 50미만","50이상 60미만","60이상"), 도수=c(2568, 2230, 6355, 4181, 3651, 3317, 2871))

prop_freq <- prop.table(A$도수)

ggplot(A, aes(x=계급구간, y=prop_freq)) +
  geom_histogram(stat="identity")
library(MASS)
library(ggplot2)
data("Cars93")

ggplot(Cars93, aes(x=Price, y=..density..))+
  geom_histogram(binwidth = 5, fill="blue", colour="white")+ #colour 테두리색, fill 채워지는 색,
  geom_density(fill="NA", colour=NA)+
  geom_line(stat = "density")+
  stat_bin(binwidth = 5, geom="text", color="white", aes(label=..count..), position = position_stack(vjust = 0.5))

# ..count.. , ..density.. 는 '데이터에 없는 값을 계산해서 그래프를 그려라' 명령어
# 막대그래프 레이블
ggplot(data=mtcars, mapping = aes(x=cyl, y=..count.., fill=as.factor(am))) + 
  geom_bar(position = "dodge",	# 막대그래프 위
           width=1.8) + 
  geom_text(stat = "count", 
            aes(label=..count..),
            position = position_dodge(width=1.8),
            vjust=-0.5)
ggplot(data=mtcars, mapping = aes(x=cyl, y=..count.., fill=as.factor(am))) + 
  geom_bar(position = "dodge",	# 막대그래프 안쪽 끝
           width=1.8) + 
  geom_text(stat = "count", 
            aes(label=..count..),
            position = position_dodge(width=1.8),
            vjust=1.5)
ggplot(data=mtcars, mapping = aes(x=cyl, y=..count.., fill=as.factor(am))) + 
  geom_bar(position = "stack",	# 막대그래프 안쪽 가운데
           width=1.8) + 
  geom_text(stat = "count", 
            aes(label=..count..),
            position = position_stack(vjust=0.5))

# 산점도 레이블 달기
ggplot(data=mtcars, mapping = aes(x=hp, y=mpg)) + 
  geom_point(aes(color=as.factor(am))) +
  geom_text(aes(label=rownames(mtcars)), check_overlap = T

'Programming > R' 카테고리의 다른 글

R 프로그래밍 - 7주차  (0) 2020.08.11
R 프로그래밍 6주차  (0) 2020.07.20
R프로그래밍 4주차  (0) 2020.07.06
R프로그래밍 3주차  (0) 2020.07.05
R 프로그래밍 2주차  (0) 2020.07.05
Comments