BASEMENT
R 프로그래밍 5주차 본문

* 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 |