반전공자

R 통계분석 (1주차) 본문

데이터분석/R

R 통계분석 (1주차)

하연01 2021. 3. 4. 19:53

데이터분석으로 진로를 결정하고 난 후 부전공으로 데이터테크놀로지 전공을 선택했고

이번 2021년 1학기에 데테 전공과목인 R 통계분석과 인공지능을 듣게 되었다! 

 

이미 책 한권 가지고 다 배웠지만 이제 매주매주 강의를 듣고 난 후 정리하는 개념으로 하나씩 글을 써보려고 한다 ! ! ! 

 

# R이 할 수 있는 기능 

- Data handling and storage : numeric, textual (데이터 처리, 저장)

- Matrix algebra (수학계산)

- high level data analytic and statistical functions (높은 수준의 데이터 분석, 통계 가능)

- 객체지향 , 그래픽 

 

# R이 할 수 없는 기능 

- 데이터베이스가 아니다. 하지만 DBMS에 연결은 가능하다. 

- 그래픽 사용자 인터페이스가 없지만  JAVA, Tcltk에 연결 가능하다. 

- 인터프리터 방식이라서 속도가 느리지만, C/C++ 코드를 호출할 수 있다. 

- 스프레드시트가 없지만, 엑셀이나 msoffice에 연결할 수 있다. 

 

 

 

< package 관련 Code > 

search()
library(igraph)
install.packages("igraph")

 

 

< 기본 환경 설정 Code > 

getwd() # 워킹디렉토리 확인 
setwd() # 워킹디렉토리 설정 

sink("output.txt") # 결과가 콘솔로 나오지 않고, output.txt로 다 기록됨. 다시 sink() : 콘솔창에 결과 나옴.
cat("Now, back to console") # 특정 문자열을 화면에 보여주기 

 

< 연산자

1 + 1 # 덧셈
1 - 1 # 뺄셈
1 * 1 # 곱셈
1 / 1 # 나눗셈

4 %/% 2 # 정수 나눗셈
4 %% 2 # 나머지
4 ** 2 # 거듭제곱

sin(x), cos(x), tan(x) # 삼각함수 
log(x) # 로그함수 
exp(x) # 지수함수
sqrt(x) # 제곱근 
abs(x) # 절댓값 함수 
round(x, digit=y) # 반올림 함수 ( digit은 자릿수 계산 : 2라면, 소숫점 이하 두자리 / -2라면, 100 곱하기)

 

< 변수 관련 >

rm() # 변수삭제 
ls() # 현재 사용중인 모든 변수 보기 
rm(list=ls()) # 만들어놓은 모든 변수 삭제하기 

 

< 데이터 확인

head() # 상위 여섯 행의 데이터만 보여주기 
tail() # 하위 여섯 행의 데이터만 보여주기 
summary() # 기본적 통계량 
nrow() # 행 개수 
ncol() # 열 개수 
str() # 데이터의 구조 개관 

 

 

 

 

 

 

#  R의 데이터 타입

데이터 타입 구성차원 자료유형 복수데이터 유형 적용 여부  
벡터 (vector) 1차원 수치/문자/복소수/논리 불가능 동일한 형태의 자료1차원 형태로 여러개 모아서 취급하는 데이터 형태
행렬 (matrix) 2차원 수치/문자/복소수/논리 불가능 동일한 형태의 자료2차원 형태로 여러개 모아서 취급하는 데이터 형태 
데이터 프레임 (dataframe) 2차원 수치/문자/복소수/논리 가능 행렬과 비슷하지만, 
컬럼별로 데이터의 형태가 다를 수 있다.
배열 (array) 2차원 이상 수치/문자/복소수/논리 불가능 행렬을 다차원으로 확장한 것
요인 (factor) 1차원 수치/문자 불가능 벡터의 특수한 형태로, 
설문조사의 선택 문항 등 카테고리를 저장할 수 있는 데이터 형태
시계열 (time series) 2차원 수치/문자/복소수/논리 불가능 시간 등과 같이 일련의 시간 자료를 표현하는 자료구조
리스트 (list) 2차원 이상 수치/문자/복소수/논리함수/표현식/ cell 등 가능 키, 값의 형태로 된 데이터를 처리하는 자료구조 

 

 

 

# 벡터 ( vector) 

 

- 1차원 형태로 동일한 타입의 자료로 구성됨.

 

 

< 벡터형 자료 생성

c() # 벡터형 자료 생성 
N1 : N2 # N1부터 N2 까지 정수 생성 
seq(from, to, by) # 일정한 구조/순차 데이터 생성 from - 시작점, to - 도착점, by - 간격지정
rnorm(5) # 0과 1 사이의 난수 5개 생성
v1 = c(1,2,3,4,5)
v1 
[1] 1 2 3 4 5

v2 = -5:5
v2
[1] -5 -4 -3 -2 -1 0 1 2 3 4 5

v3 = seq(from=1, to=5, by=0.5)
v3
[1] 1.0 1.5 2.0 2.5.3.0 3.5 4.0 4.5 5.0

v4 = rnorm(20)
v4
[1] -0.26265376  0.69699690 -1.04770092 -0.08899560  0.77102554  0.25054514  0.06108554
 [8]  0.52577478 -0.21252034  1.36094245  1.19080089 -0.13898075  0.42186481 -0.07582389
[15] -0.66613589  0.98162983  0.13467192  0.85875722  1.77487097 -0.67898348
> 

 

< 벡터형 자료 기본 연산

mean(v1) # 평균
[1] 3
order(v1) # 오름차순
[1] 1 2 3 4 5
rev(v1) # 내림차순
[1] 5 4 3 2 1 
sd(v2) # 표준편차
[1] 3.316625
length(v4) # v4의 길이
[1] 20

sort(v4) # 오름차순으로 정렬하기
sort(v4, decreasing = TRUE) # 내림차순으로 정렬하기
range(v4) # 최솟값과 최댓값만 보여주기 (범위)

< 벡터형 자료 조작

x = c(1,4,6,8,9)

# python과 다르게 0부터 세지 않고 1부터 셈. 
x[2] 
[1] 4

x[-2] # x의 두번째 값 빼고 다 보여줘 
[1] 1,6,8,9

x[3] = 4 # 세번째 값을 4로 바꾸기 
x[2<x & x<5] # 2<x<5 값을 구하기

# x의 두번째 자리에 32를 넣고, 네번째 자리에 24를 넣기
y = raplace(x, c(2,4), c(32, 24))

# x와 y를 합치기
w = append(x,y)

# x의 두번째 값 뒤에 y를 끼워넣기 
z = append(x,y,after=2)

# 자리 별 합
c(1,2) + c(4,5) 
[1] 5 7 


< 집합 연산

x = c(1,2,3)
y = c(4,5,6)
x == y
[1] FALSE FALSE FALSE

union(x,y) # x, y의 합집합 
intersect(x,y) # x, y의 교집합 
setdiff(x,y) # x, y의 차집합 
setequal(x,y) # x, y 같은지 확인
[1] FALSE

is.element(3,x) # x에 3이 있는지 확인 

 

 

< 문자 자료 벡터

(x = rep(c("a","b","c"), times=4))
[1] "a" "b" "c" "a" "b" "c" "a" "b" "c" "a" "b" "c"

unique(x) # 유일한 원소만 뽑기 
match(x,c("a")) # x 안에 "a"가 있는지 확인 / a 아닌 자리에는 NA
[1] 1 NA NA 1 NA NA 1 NA NA 1 NA NA

y = c("d","e","f")

z = paste(x[1], y[3]) # x의 첫번째 값, y의 세번째 값 합치기 
[1] "a f"

 

< 논리형 벡터

x = runif(5) # 난수 5개 생성하기 
[1] 0.7572254 0.2213708 0.6589427 0.8715866 0.8817309

(0.4<=x)&(x<=0.7) # 0.4 <= x <= 0.7 값이라면 TRUE, 아니라면 FALSE
[1] FALSE FALSE  TRUE FALSE FALSE

any(x>0.8) # 0.8을 초과하는 x 값이 하나라도 있다면 TRUE 
[1] TRUE

all(x<0.7) # 모든 x값이 0.7을 넘는다면 TRUE
[1] FALSE

is.vector(x) # x의 자료형이 vector라면 TRUE
[1] TRUE

 

 

 

# 행렬 (matrix)

- 2차원 형태로 동일한 타입의 자료 생성 

- 생성 : 벡터 데이터 생성 후 합치는 방식 

row1 = c(1,2,3)
row2 = c(4,5,6)
row3=c(7,8,9)

mat1=rbind(row1, row2, row3) # 각 데이터를 행으로 넣기 
mat
     [,1] [,2] [,3]
row1    1    2    3
row2    4    5    6
row3    7    8    9


mat2 = cbind(row1, row2, row3) # 각 데이터를 열로 넣기 
mat2
     row1 row2 row3
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

 

< 문자형 행렬 데이터 생성

chars = c("a","b","c","d","e","f","g","h","i","j")

mat1 = matrix(chars) # chars를 행렬로 만들어줘! (기본형 : 아래로 늘여쓰기)
mat1
     [,1]
 [1,] "a" 
 [2,] "b" 
 [3,] "c" 
 [4,] "d" 
 [5,] "e" 
 [6,] "f" 
 [7,] "g" 
 [8,] "h" 
 [9,] "i" 
[10,] "j" 

mat2=matrix(chars, ncol = 5) # 아래로 늘여쓰는데 5개 열로 만들어줘! (10개 자료니까 2행x5열)
mat2
     [,1] [,2] [,3] [,4] [,5]
[1,] "a"  "c"  "e"  "g"  "i" 
[2,] "b"  "d"  "f"  "h"  "j" 
## 열 기준으로 쓰여짐 

< 행렬 데이터 조작 & 추출

mat3 = matrix(1:8, nrow=2) # 2행으로 8개 열 넣어줘! (2행 x 4열)
mat3
     [,1] [,2] [,3] [,4]
[1,]    1    3    5    7
[2,]    2    4    6    8

mat*3 # 각 값에 3을 곱하기 
     [,1] [,2] [,3]
vec1    3    6    9
vec2   12   15   18

mat3*c(10,20) # 1행엔 10씩 곱하고 2행엔 20씩 곱하기
     [,1] [,2] [,3] [,4]
[1,]   10   30   50   70
[2,]   40   80  120  160

# 열과 행 이름 바꾸기 
x = matrix(1:12, nrow=3, dimnames = list(c("R1","R2","R3"), 
                                         c("C1","C2","C3","C4")))
x
   C1 C2 C3 C4
R1  1  4  7 10
R2  2  5  8 11
R3  3  6  9 12


x[7] # 7번째 값 
[1] 7

x[1,] # 1행 추출
C1 C2 C3 C4 
 1  4  7 10 
 
x[,2:4] # 모든 행에 대해서 2,3,4열 추출
   C2 C3 C4
R1  4  7 10
R2  5  8 11
R3  6  9 12

x[,2] # 모든 행에 대해서 2열 추출 (세로로 있던 값을 단지 가로로 출력한 것일 뿐)
R1 R2 R3 
 4  5  6 
 
x[,-2] # 모든 행에 대해서 2열만 빼고 모두 추출 
   C1 C3 C4
R1  1  7 10
R2  2  8 11
R3  3  9 12

 

 

 

# 데이터 프레임 (dataframe) 

- 2차원 형태로 각 컬럼별로 다른 형태의 데이터를 가짐 

- 생성 : 배열 데이터를 모아 구성함 

# 데이터프레임 생성
no = c(1,2,3,4)
name = ("Apple","Banana","Peach","Berry")
prices = c(500, 200, 200, 50)
qty = c(5,2,7,9)
fruit = data.frame(No=no, Name=name, Prices=prices, QTY=qty)
fruit
  No   Name Prices QTY
1  1  apple    500   5
2  2   pear    200   2
3  3 banana    200   7
4  4  peach     50   9

rownames(fruit) = c("F1","F2","F3","F4") # 행 이름 변경하기
fruit
   No   Name Prices QTY
F1  1  apple    500   5
F2  2   pear    200   2
F3  3 banana    200   7
F4  4  peach     50   9



# 특정 행 추출 
fruit["F1",]
   No  Name Prices QTY
F1  1 apple    500   5

# 특정 컬럼 추출 
fruit $ Name
[1] "apple"  "pear"   "banana" "peach" 

fruit$QTY
[1] 5 2 7 9

# 연속된 컬럼 추출 
# 행 상관 없이 2, 3열을 추출
fruit[,2:3]
     Name Prices
F1  apple    500
F2   pear    200
F3 banana    200
F4  peach     50

# *** 파생변수만들기 ***
fruit$TotalPrice = fruit$Price&fruit$QTY
fruit
   No   Name Prices QTY TotalPrice
F1  1  apple    500   5       TRUE
F2  2   pear    200   2       TRUE
F3  3 banana    200   7       TRUE
F4  4  peach     50   9       TRUE

 

 

# 요인 (Factor) 

- 문자형 데이터가 저장되는 벡터의 일종 

- 범주형 자료의 저장에 사용 : 저장하는 문자값들이 어떠한 종류를 나타내는 값일 때 

- 장점 : 이미 지정된 값의 종류 이외의 값이 들어오는 것을 막을 수 있음 

f = c('A','B','B','O','AB','A')
f_factor = factor(f)
f
[1] "A"  "B"  "B"  "O"  "AB" "A" 

f_factor # 저장되는 값들에 따옴표가 붙지 않음.
[1] A  B  B  O  AB A 
Levels: A AB B O # factor에 저장된 값들의 종류를 알아냄.

levels(f_factor)
[1] "A"  "AB" "B"  "O" 

f[5] # f만 쓰면 " "가 붙음
[1] "AB"

f_factor[5] # factor 형식으로 바꾼 f를 쓰면 따옴표가 붙지 않음
[1] AB
Levels: A AB B O

f_factor[7]='C' # 원래 A, B, O, AB 만 요인으로 받아들여져 있는데 C를 넣으면 오류발생
Warning message:
In `[<-.factor`(`*tmp*`, 7, value = "C") :
  invalid factor level, NA generated
  
as.integer(f_factor) # factor의 문자값을 숫자로 바꾸어 분석작업에 활용할 때 
[1]  1  3  3  4  2  1 NA

 

 

# 리스트 ( list ) 

- (키, 값)의 형태로 데이터를 구성 

- 생성

member = list(name="Lee",address="Seoul", tel="01088881111", ssn=010815)
member

#결과
$name
[1] "Lee"

$address
[1] "Seoul"

$tel
[1] "01088881111"

$ssn
[1] 10815

 

< 조작 > 

member$name
[1] "Lee"

member[1:3] # 1행의 3열 정보 추출
# 결과
$name
[1] "Lee"

$address # 주소 정보 추출
[1] "Seoul"

$tel # 전화번호 정보 추출
[1] "01088881111"


# pay를 추가하고 그 값에 100을 넣기 
member$pay=100
member

#결과
$name
[1] "Lee"

$address
[1] "Seoul"

$tel
[1] "01088881111"

$ssn
[1] 10815

$pay
[1] 100