본문 바로가기
Database & Bigdata/공공 빅데이터 청년 인턴십

[DAY 3-4] R로 배우는 통계 이해 - R 프로그래밍이해 / 통계기초

by jionee 2020. 8. 27.
SMALL

[ DAY 3 ]

1. R설치 및 기본 설정

[R과 R studio]

R : 통계 계산 및 그래픽을 위한 언어 및 환경

R studio : R을 위한 통합개발환경(IDE)

 

[ R studio 기본 설정 ]

라이브러리(패키지)의 설치 및 사용

- install.packages("ggplot2") : 라이브러리 설치는 라이브러리 파일을 하드디스크(보조 기억장치)에 저장

- library(ggplot2) : 라이브러리 부착은 하드디스크에서 주 기억 장치로 적재

- search() 부착된 라이브러리 목록 확인

* 컴퓨터를 끄거나 R 스튜디오를 닫는 경우 주 기억 장치에 있던 라이브러리는 지워짐

 

2. 데이터형과 연산

[ 데이터형 ]

변수에 값 저장 : =, <- , -> 을 통한 대입

ex) x <- 1    # x에 1을 할당

 

R의 기본 데이터형: 데이터형을 지정하지 않고, 변수에 어떤 값을 저장하는냐에 따라 데이터형이 결정

데이터형 종류
숫자형 int : 정수, num : 실수, cplx : 복소수
문자형 chr : 작은따옴표나 큰 따옴표로 묶어 표기
범주형 factor : 레벨에 따라 분류된 형태
논리형 TRUE(T), FALSE(F)
특수 상수 NULL : 정의되지 않은 값
NA : 결측값
Inf / -Inf  : 양의 무한대와 음의 무한대
NAN : 0/0, Inf/Inf 등과 같이 연산 불가능한 값 표시

 

데이터형 확인 함수들

함수 설명
class(x) R 객체지향 관점에서 x의 데이터형
typeof(x) R 언어 자체 관점에서의 x의 데이터형
is.integer(x) x가 정수형이면 TRUE, 아니면 FALSE
is.numeric(x) x가 실수형이면 TRUE, 아니면 FALSE
is.complex(x) x가 복소수형이면 TRUE, 아니면 FALSE
is.character(x) x가 문자형이면 TRUE, 아니면 FALSE
is.na(x) x가 NA이면 TRUE, 아니면 FALSE

 

데이터형 변환 함수들

함수 설명
as.factor(x) x를 범주형으로 변환 
as.integer(x) x를 정수형으로 변환
as.numeric(x) x를 숫자형으로 변환
as.character(x) x를 문자형으로 변환
as.matrix(x) x를 행렬로 변환
as.array(x) x를 배열로 변환


연산자

함수 설명
^ 또는 ** 지수승
x %% y x를 y로 나눈 나머지 (정수 나눗셈 나머지)
x %/% y x를 y로 나눈 몫 (정수 나눗셈 몫)
! 부정
| , || OR (합집합)
&, && AND (교집합)
isTRUE(x) x의 TRUE여부 판단

 

[ R 데이터 구조 ]

 

 

[ 벡터 ]

Vector : 단일값의 모음, 벡터 변수에는 동일한 데이터 값을 가진 값들이 들어감

 

생성

  • 백터 생성 연산자 ':' 이용    ex) 1:7     #1~7까지 1씩 증가
  • c 함수 이용 : 주어진 인수로 벡터 생성     ex) c(1,2,3)     #1,2,3으로 벡터 생성
  • seq 함수 이용 : 순차적 벡터 생성
    • ex) seq(from=1, to=10, by=2)   #1부터 10까지 2씩 증가
    • ex) seq(0,1,legth.out=11)   # 0부터 1까지 11개의 벡터
  • rep 함수 이용 : 반복 벡터 생성       
    • ex) rep(c(1:3), times = 2)    # (1,2,3) 전체 2번 반복
    • ex) rep(c(1:3), each =2)      # (1,2,3) 개별 2번 반복

백터 연산

  • 벡터 연산에서 요소를 구할때는 C 함수 사용     ex) x[c(1,2,3)]   # x벡터의 1,2,3 요소
  • 벡터 끼리의 연산에서 크기가 정수배이면 작은쪽을 순환해 더함    ex) (5,6,7,8) + (3,4)   = ( 5+3, 6+4, 7+3, 8+4 )
    • 크기가 정수배가 아닌 경우 에러가남

벡터 연산 함수

  • all : 벡터 내 원소 모두가 조건을 만족하면 TRUE        ex) all(x>5)     # x 요소값이 모두 5보다 큰가
  • any : 벡터 내 원소 일부가 조건을 만족하면 TRUE      ex) any(x>5)     # x 요소값이 일부 5보다 큰가
  • union(x,y) : 합집합 함수
  • intersect(x,y) : 교집합 함수
  • setdiff(x,y) : 차집합(x기준 동일 요소 제외)
    • setdiff(y,x) : 차집합(y기준 동일 요소 제외)
  • setequal(x,y) : x와 y가 동일한지 비교

 

[ 배열 ]

배열(행렬) : 모든 컬럼과 행은 데이터형이 동일

 

생성

  • array 함수 : N차원 배열 생성      
    • x <- array(1:5, c(2,4))     # 2X4 행렬에 1부터 5까지 반복해 입력
    •  dimnamex = list( c("1st", "2nd"), c("1st", "2nd", "3rd", "4th") ) ,    x <- array( 1:5, c(2,4), dimnames = dimnamex)              # 행과 열 이름 설정
  • matrix 함수: 2차원 배열 생성(벡터를 묶어 배열 생성)
    • x<-1:12 , matrix(x,nrow=3)        # x벡터를 행이 3개인 2차원 배열로 만듬 (열 우선 입력)
      • 1     4     7     10 2    5      8     113    6      9     12
    • x <- 1:12,   matrix(x, nrow = 3, byrow = T )     # 행우선 입력
      • 1    2    3    45   6    7    89   10  11   12
    • cbind(v1, v2, v3)     #벡터들을 열단위로 묶어 배열 생성
      • v1  v2  v3
    • rbind(v1,v2,v3)     # 벡터들을 행단위로 묶어 배열 생성
      • v1v2v3

 

   

배열 함수

  • apply : 행/열기준으로 함수를 적용  ( 1 = 행 기준( 가로방향 ) / 2 = 열 기준 ( 세로방향 ) ) 
    •  apply(x, 1, mean)   # 행 기준으로 평균 구함
    •  apply(x, 2, mean)   # 열 기준으로 평균 구함
  • dim : 배열의 크기를 구함
  • sample  : 임의로 샘플 추출
    • sample(x)    #x에서 임의로 샘플 추출 
    • sample(x,10)     # x에서 임의의 샘플 10개 추출
    • sample(10)     # 샘플 만들기

 


[ 데이터 프레임 ]

데이터 프레임 : 각 컬럼별로 먼저 생성, data.frame으로 모두 합침

  • 가장 흔히 쓰이는 표 형태의 데이터 구조를 가짐
  • 행렬과 달리 여러 데이터형을 혼합해 저장할 수 있음
  • 리스트와 달리 행의 수를 일치 시켜 저장해야함

 

생성

  • data.frame()
    • a <- data.frame(name, age, gender, blood)  # 칼럼들을 합쳐 데이터 프레임으로 생성
    • a <- data.frame() ,     a <- edit(a)      # edit 함수 이용해 데이터 프레임 생성

 

데이터 프레임 요소에 접근

  • $ : 속성값 출력
    • a$name    #name 속성값 출력
  • [,]   : 정보 추출
    • a[a$name == '"지원", ]      # 지원에 대한 정보 추출
    • a[a$name == "지원", c("name", "age")]    # 지원의 이름과 나이 추출

 

데이터 프레임에 유용한 함수

  • attach : 속성 -> 변수
    • attach(cars)   #attach 속성들을 변수로 만듬
  • detach : 속성의 변수 사용 해제 
    • detach(cars)    #속성의 변수 사용 해제
  • subset : 일부 데이터만 추출
    • subset(cars, speed>30, select = c(dist))    # car 데이터 프레임에서 속도 30 초과인  dist열 추출

 

[ 리스트 ]

리스트 : 서로 다른 기본 데이터형을 갖는 자료구조를 포함 할 수 있음

  • 데이터 프레임보다 넓은 의미의 데이터 모임
  • 데이터 프레임과 달리 모든 속성의 크기가 같을 필요가 없음

생성

  • list()
    • a <- list(a,b)    # 데이터 프레임 a,b를 리스트로 만듬

 

* 리스트 요소에 접근하는법은 데이터 프레임과 동일 

ex) a$patients, a[ [1] ], a[ ["patients"] ]

 

 

함수

  • lappy : list + apply를 의미함. 함수의 실행 결과가 list형태로 출력
    • lapply(a$patients, mean)   #patients 데이터 프레임의 평균이 리스트 형태로 출력
  • sapply : 실행 결과를 벡터 or 행렬로 출력
    •  sapply(a$patients, mean)    #patients 데이터 프레임의 평균이 벡터 형태로 출력

 

3. 데이터 취득과 정제

4. 데이터 가공

 

 

 

[ DAY 4 ]

[ 용어 정리 ]

  • 평균 : 전체 데이터를 더한 후 개수로 나눈 값 ( 총 합 / 모집단 )

  • 중앙값 : 크기순으로 정렬시킨 후 가운데 있는 값
  • 편차 : 평균과 해당 값의 차이 ( 평균 -  해당값)
  • 제곱평균 : 편차값을 제곱해서 평균을 구하는 원리 (마이너스 값 -> 플러스 값)
  • 분산 : 편차값을 제곱해서 나온 값 (분산된 정도를 알려줌)
  • 표준편차 : 분산값의 루트를 적용 (제곱 제거)
    • 평균 기준 표준 편차 1배 정도 차이 - 평범
    • 평균 기준 표준 편차 2배 정도 차이 - 특수

 

  • 모집단 : 계산에 사용한 원본 대상
  • 표본 : 일부 대표성을 가진 데이터
  • 자유도 : 주어진 데이터에서 표본을 자유롭게 뽑을 수 있는 경우의 수
    • 표본의 분산과 표분편차를 계산할 때 나누는 분모의 수 : 모집단 -1
    • 표본을 추출해서 표본의 분산과 편차를 계사할 때는 항상 자유도를 분모로 사용

 

[ 1.1 평균,분산,표준편차 ]

평균 : mean()

중간값 : median()

분산 : var()

표준편차 : sd()

 

 

 

 

[ 1.2 표준값,표준화 ]

표준값 : 공통된 기준을 적용해서 점수화

표준화 : 모든 값들의 표준값을 정해서 그 값을 기준으로 차이 비교

표준값 = (각데이터 - 평균) / 표준편차

 

 

 

[ 1.3  정규 분포 ]

정규 분포 : 데이터들이 평균값을 기준으로 좌 우 대칭형으로 분포되어 있는 형태

 

- 도식화

nrorm(개수, 평균, 표준편차) : 정규분포 난수 발생

hist : 특정 데이터 빈도를 막대모양으로 보여줌

breaks : 막대 수

probability : 상대 도수

 

breaks = 10
breaks = 100

- 정규분포 선택 확률

정규 분포를 따르는 분포일 경우

특정 데이터가 선택될 확률은 평균값을 기준으로

표준편차 -1배 ~ +1배 구간 = 약 70%

표준편차 -1.96배 ~ + 1.96배 구간 = 약 95%

 

- 정규분포 활용 예

평균이 170cm이고 표준 편차가 7cm 인 정규 분포

100명 중 1명을 골랐을 때, 몸무게가 163cm~177cm인 확률은 70%

156cm~184cm일 확률은 95% 정도

 

 

 

[ 1.3  t 검정 ]

귀무가설 : 전 후 관계가 동일 

대립가설 : 전 후 관계가 동일하지 않음 

 

- shapiro.test (정규분포를 따르는지 확인)

shapiro.test(score1$성적)

p-value가 0.05보다 높은 0.88

-> 정규분포를 따르고 이 데이터에 대해 t-test가 가능

 

 

- t-test(t 검정)

result <- t.test(score1$성적,alternative = c("greater"),mu=75)
result

mu : 모평균의 설정값

alternative : 모평균보다 크다, 작다 또는 다르다

- greater : 크다

- less : 작다

-  two.sided : 다르다

표본의 평균값 : 77.1

t의 값 : 0.7

유의 확률(p-valude) : 0.3

유의 확률 (0.3) > 유의 수준 5% (0.05) -> 귀무가설 채택

 

 

- 신약의 효과 t-test 

환자를 두 집단으로 나누어 한 집단은 신약, 나머지 한 집단은 위약 제공 후 환자들의 치료효과 시간 측정

x<-c(15,10,13,7,9,8,21,9,14,8)  // 신약 치료효과 시간
y<-c(15,14,12,8,14,7,16,10,15,12)  // 위약 치료효과 시간
shapiro.test(x) 
shapiro.test(y) 

p-value가 0.05보다 높음

-> 정규분포를 따르고 이 데이터에 대해 t-test가 가능

 

t.test(x,y)

p-value=0.6

유의 확률 (0.3) > 유의 수준 5% (0.05) ->귀무가설 채택

신약의 효과가 있다고 말할 수 없음

 

 

- t 검정 순서

1. 가설 설정 

귀무가설  : 지난 학기와 이번 학기의 평균은 동일

대립가설 : 지난 학기와 이번 학기의 평균은 동일하지 않음

 

2. 정규분포 검정

shapiro.test(score1$성적)

p-value가 0.05보다 높은 0.9

따라서 정규분포를 따르고 이 데이터에 대해 t-test를 할 수 있음

 

3. T 검정

t.test(score1$ 성적, alternative=c("gather"),mu=75)

 

4. 결과해석

유의확률(0.002)<유의수준(0.05) -> 대립가설 채택

-> 지난학기와 이번 학기의 평균은 동일하지 않다

 

 

- 타자 교육 대응 표본 분석

대응 표본  : 두 집단의 자료를 쌍으로 묶을 수 있는 표본

x<-c(52,60,63,43,46,56,62,50) // 타자 교육 전
y<-c(58,62,62,48,50,55,68,57)  //  타자 교육 후
shapiro.test(x) // x 정규분포 검정
shapiro.test(y) // y 정규분포 검정
t.test(x,y,paired = TRUE) 

p-value=0.01

유의 확률 (0.01) < 유의 수준 5% (0.05) -> 대립가설 채택

타자 교육이 효과가 있다고 말할 수 있음

 

 

[ 1.4 분산 분석]

oneway.test

- 3집단의 평균 비교

x <- c(1.09, 2.12, 2.92, 4.06, 4.90)
y <- c(1,2,3,4,5)
z <- c(1.10, 1.96, 12.98, 4.09, 4.92)
shapiro.test(x) 
shapiro.test(y) 
shapiro.test(z) 

mydata <-c(x,y,z)  // 벡터형으로 자료를 생성함
mydata
group <-c(rep(1,5), rep(2,5), rep(3,5))  // 처음 5개를 1로, 다음 5개를 2, 다음 5개를 3
group
oneway.test(mydata~group, var=T)  // mydata를 3개로 그룹지어서 평균이 같은지 검증

p-value = 0.49

유의 확률 (0.49) > 유의 수준 5% (0.05) -> 귀무가설 채택

평균이 같다고 할 수 있음

 

 

- 4가지 온도에 따른 제품의 강도

x1<-c(23,27,24,25,29,30,26) // 온도1
x2<-c(35,32,38,36,32,33,34) // 온도2
x3<-c(36,41,38,39,40,38,39) // 온도3
x4<-c(32,30,37,34,35,34,32) // 온도4
shapiro.test(x1) // 정규 분포 검증
shapiro.test(x2)
shapiro.test(x3)
shapiro.test(x4)
mydata<-c(x1,x2,x3,x4) // 벡터형 자료 생성
group <- c(rep(1,7),rep(2,7),rep(3,7),rep(4,7)) // 처음 7개를 1, 다음 7개를 2 ~
oneway.test(mydata~group,var=T)// mydata를 4 group지어서 평균이 같은지 검증

p-value = 3e-09

유의 확률 (3e-09) < 유의 수준 5% (0.05) -> 대립가설 채택

4가지 온도에 따라 강도의 차이가 있다고 볼 수 있음

 

[ 1.5  빈도 분석 ]

 

모집단 : 조사하고자하는 데이터 전체

유한 모집단 : 셀 수 있는 모집단

무한 모집담 : 셀 수 없는 모집단

모평균 : 모집단에 있는 데이터들의 평균

표본평균 : 표본을 여러 개 추출해서 평균을 낸 것

 

prop.table() : 빈도 계산 (0~1)

table() : 중복부분 집계해줌 (개수)

round() : 반올림 소수점

 

 

- 하나의 테이블로 완성

 

 

- 도식화

barplot(love_fruits$건수,names.arg=c("바나나","복숭아","사과","체리","포도"),ylim=c(0,15),col=rainbow(5))

names.arg : 막대이름

name : arg 생랼가능

ylim : y축 범위

col : 막대색상

 

 

[ 1.6 상관분석 ]

상관분석 : A사건이 B사건에 어떤 영향을 주는가 ?

- 양의 상관관계

- 음의 상관관계

상관계수 : 관련 있는 정도를 숫자로 표현

-1     <=     r    <=    +1

-1로 갈수록 음의 상관관계, +1로 갈수록 양의 상관관계

0에 가까울 수록 관계가 없음

 

 

- 상관계수 공식

 

- cor(x,y) ; 상관계수 출력

x <- c(3,5,8,11,13) // 제품 판매 개수
y <- c(1,2,3,4,5) // DM 발송 회수

 

DM 발송 회수와 제품 판매 개수의 상관 계수

상관계수가 0.997 -> DM 발송과 제품 판매량은 아주 관련이 많음

 

 

- 상관분석

1. 가설 설정 

 - 귀무가설 : 관련이 없다. (DM발송과 제품 판매량은 관계가 없음)

 - 대립가설 : 관련이 있다. (DM발송과 제품 판매량은 관계가 있음)

2. 상관관계 분석

cor.test(x,y)

3. 결과 해석

유의확률(2e-04) < 유의수준(0.05) -> 대립가설 채택 -> 상관계수 0.99로 DM 발송과 판매량은 아주 관련이 많음

 

 

[ 1.7 회귀분석 ]

회귀분석 : 어떤 결과값을 기준으로 다른 결과값을 예측하는 방법

* 상관 분석 : 두 변수사이의 관계 파악 ( 예측 X )

단순 회귀분석 : 종속 변수에 영향을 주는 변수가 1개

다중 회귀분석 : 종속 변수에 영향을 주는 변수가 여러 개

 

- 회귀식 : 주어진 데이터들을 분석해서 특별한 규칙을 찾아낼 때 그 규칙을 회귀식이라고 함

y : 종속변수(반응 변수),   x: 독립변수 (설명 변수)

b0 : y절편,      b1 : 기울기

최소 자승법을 사용해 b1을 먼저 구함

 

 

- 부모 - 자식 아이큐 회귀분석

lm : 선형 회귀 분석

lm(종속변수(결과) ~ 독립변수(원인),데이터)

 

x <- c(110,120,130,140,150) // 부모 IQ
y <- c(100,105,128,115,142) // 자식 IQ
plot(x,y,pch=20,col="red") // 2차원 선 그리기
line <- lm(y~x) // line 정의 
line
abline(line,col="blue") // 좌표에 직선 그리기

회귀식 : -4.20 + (0.94 x)

 

 

 

 

- 병원 직원 친절도와 만족도 회귀분석

x<-c(15,10,13,7,9,8,21,9,14,8) // 병원 친절도
y<-c(15,14,12,8,14,7,16,10,15,12)  // 환자 만족도
out = lm(y~x)
summary(out)

회귀식 y : 6.359 + 0.52x

p-value = 0.0158

유의확률이 p = 0.0158 <0.05 므로 귀무가설 기각, 친절도는 만족도에 유의한 영향 미침 (신뢰도 47%)

 

 

- 다중 회귀분석 

lm3 <- lm(성적~IQ+다니는학원수+게임하는시간+TV시청시간)
lm3

회귀식 y(성적) = 23.2992 + 0.468 x1 + 0.718 x2 - 0.839 x3 - 1.385 x4

 

ex) IQ가 130(x1)인 사람이 학원을 3개(x2) 다니고 게임을 2시간(x3)하고 TV를 1시간 (x4) 볼 경우 예상되는 성적은 ?

 

- 결정계수(R^2)

결정계수가 0에 가까울 수록 믿을 수 없고 1에 가까울 수록 믿을 수 있음

summary(lm3)

결정계수 : 0.9295

p-value : 0.001

유의확률(0.001) < 유의수준(0.05) -> 대립가설 채택

- 독립변수는 성적에 유의한 영향을 미침

- 추정 회귀식의 관측값을 약 93% 설명 가능

 

 

 

- 개인요인(인성,얼굴,성격)와 인맥관리의 회귀분석

x1<-c(100,90,98,79,81,69,80,77,68,54) // 인맥관리
x2<-c(5,4,5,3,4,3,2,3,2,1) // 인성
x3<-c(5,3,4,3,4,3,2,3,2,1) // 얼굴
x4<-c(5,3,3,2,3,3,4,3,2,1) // 성격
mydata <- data.frame(y=x1,s1=x2,s2=x3,s3=x4)
mydata
model <- lm(y~. , data = mydata)

회귀식 y : s1 + s2 + s3

결정계수 : 0.8825

p-value : 0.00102

유의확률(0.001) < 유의수준(0.05) -> 대립가설 채택

- 독립변수는 성적에 유의한 영향을 미침

- 추정 회귀식의 관측값을 약 88% 설명 가능

- 세부 항목중 인성성격유의한 영향을 미침 (얼굴은 p-value 0.1453으로 유의수준을 넘음)

 

 

 

- 서비스 요인(가격,품질,청결)과 고객충성도 회귀분석

x1<-c(100,90,98,79,81,69,80,77,68,54) // 인맥관리
x2<-c(5,4,5,3,4,3,2,3,2,1) // 인성
x3<-c(5,3,4,3,4,3,2,3,2,1) // 얼굴
x4<-c(5,3,3,2,3,3,4,3,2,1) // 성격
mydata <- data.frame(y=x1,s1=x2,s2=x3,s3=x4)
mydata
model <- lm(y~. , data = mydata)

회귀식 y : s1 + s2 + s3

결정계수 : 0.7307

p-value : 0.01178

유의확률(0.01178) < 유의수준(0.05) -> 대립가설 채택

- 독립변수는 성적에 유의한 영향을 미침

- 추정 회귀식의 관측값을 약 73% 설명 가능

- 세부 항목중 가격만이 유의한 영향을 미침 (품질,청결의 p-value는 유의수준을 넘음)

댓글