R / R 의 자료구조의 종류
[책으로 진행]
2장. R을 활용한 머신러닝
2장의 내용은 3장에서부터 머신러닝 데이터 분석을 위해 데이터를 보는 방법과 머신러닝을 위해 데이터를 볼 때 필요한 함수들을 소개하는 챕터.
1) R의 자료구조의 종류
2) R에서의 데이터를 로드하는 방법 4가지
3) 데이터의 전반적인 관찰(평균, 중앙, 최빈, 표준편차, 분산)
4) 수치형 데이터 살펴보기(히스토그램, 정규분포)
5) 범주형 데이터 살펴보기(산포도 그래프)
6) CrossTable(이원교차표)
24 벡터(vector)
"벡터(vector)는 같은 데이터 타입을 갖는 1차원 배열구조"
c()를 이용해서 구조를 생성할 수 있음
a <- c(1,2,3,4,5)
a
str(a)
문제166. 아래의 숫자들을 출력하는 vector를 생성하시오
1 2 3 4 5 6 7 8 9 10
b <- c(1:10)
b
문제167. 아래의 숫자들을 출력하는 vector를 생성하시오
1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 3 3 4 4 4 4 4 4 4
d <- c(rep(1,5), rep(2,6), rep(3,8), rep(4,6) )
d
문제168. 아래와 같이 출력되는 vector를 생성하시오
e <- c(rep('jones',3), rep('king',3), 'scott')
e
문제169. 위의 결과를 가지고 아래와 같이 결과를 출력하시오.
jones king scott
3 3 1
table(e)
> table() 자료의 갯수를 확인하는 함수
문제170. 직업, 직업별 인원수를 아래와 같이 출력하세요.
ANALYST CLERK MANAGER PRESIDENT SALESMAN
2 4 3 1 4
emp <- read.csv("c:\\data\\emp2.csv")
table(emp$job)
문제171. 특정 변수의 데이터 유형을 확인하려면 ?
typeof(emp$job)
# "character"
character : 문자
integer : 소수자리가 없는 숫자
double : 소수자리가 있는 숫자
logical : True 또는 False
(cf. 파이썬에서는 type()을 사용하면 됨)
문제172. table(emp$job)을 했을 때의 결과에서 직업이 PRESIDENT는 제외하고 출력하시오.
x <- table(emp$job)
typeof(x) # "integer" 숫자형 벡터
x[1] # ANALYST
x[2] # CLERK
x[1:3] # ANALYST, CLERK, MANAGER
x[-4] # 4번째에 있는 PRESIDENT를 빼라
ANALYST CLERK MANAGER SALESMAN
2 4 3 4
문제173. 위의 결과를 파이썬으로 수행하시오.
# python
import pandas as pd
emp = pd.read_csv("c:\\data\\emp2.csv")
a = emp.groupby('job')['empno'].count().reset_index()
a.columns = ['job', 'cnt']
a = a[:][a.job != 'PRESIDENT']
a.pivot_table(columns = 'job', values = 'cnt')
# 또는
x = emp.pivot_table(columns = 'job', aggfunc = 'count')
x.iloc[[0],[0,1,2,4,] ] # 문법 : x.loc[[행번호], [열번호]]
25 팩터(factor)
팩터(factor)는 범주 변수나 순위변수를 나타내기 위해 사용하는 특별한 종류의 벡터(vector)
머신러닝(기계학습)을 할 대 기계에게 학습데이터를 줄 때 factor로 제공해줘야 함. 기계가 학습할 때에 순서 벡터를 기대하기 때문에 팩터형태로 제공해줘야 함.
팩터(factor) = 일반 벡터(vector) + level(순서)
기계를 학습 시킬때는 데이터와 정답을 같이 주면서 공부 시켜야 함.
ex) 기계에게 암 환자 데이터를 주고 암판정을 하게 하고 싶다면?
우리의 관심범주는 암(1), 다른 대조군은 정상환자(0)
1과 0이 들어있는 컬럼(종속변수)를 팩터 형태로 제공해줘야함.
예제.
a <- c("middle","low","high")
typeof(a) # "character"
str(a) # chr [1:3] "middle" "low" "high"
사람은 low < middle < high 라는 순서를 알지만, 기계는 알지 못함.
a2 <- factor(a) # nominal
a2
[1] middle low high
Levels: high low middle <- 알파벳 순서대로 임의의 level이 생김. 순서가 생겼음.
문자형 백터를 팩터로 변환하게 되면 기본 순서는 알파벳 순서로 부여됨.
a3 <- factor(a, order = TRUE, level = c("low","middle","high"))
a3
[1] middle low high
Levels: low < middle < high <- 순서가 부여됨
문제174. 위에서 만든 a3팩터의 요소를 출력하는데 아래와 같이 정렬해서 출력하시오.
order( a3, decreasing = T) # 3 1 2
a3[ order(a3, decreasing = T)] # "high" "middle" "low"
팩터는 순서가 부여되었기 때문에 order 함수를 써서 순서대로 출력할 수 있음.
문제175. 아래의 팩터를 생성하고 아래의 결과를 출력하시오.
large medium small
f6 <- c("large","medium","small")
f7 <- factor(f6, order = TRUE, level = c("small","medium","large"))
f7[order(f7, decreasing = T)] # 이미 f6에 large,medium,small로 입력값을 넣어서 뭐로 넣든 상관없음
ㅇ팩터(factor)
1. 범주(값의 목록)을 갖는 vector
2. factor()함수를 통해서 생성
3. factor는 nominal, ordinal형식 2가지가 존재
4. nominal은 level의 순서의 값이 무의미하며 알파벳 순서로 정의
5. ordinal은 level의 순서의 값을 직접 정의해서 원하는 순서를 정할 수 잇음.
문제176. 범주형의 대표적인 데이터인 혈액형을 factor로 구성하시오.(ordinal로 팩터를 구성)
blood <- factor(c("O","AB","A"), levels = c("A","B","AB","O"))
blood
[1] O AB A
Levels: A B AB O
> 머신러닝 학습할 때 사용할 데이터의 환자 중에서 혈액 B형이 없어도 팩터를 만들때 위와 같이 구성을 하면 학습 데이터안에는 B형은 없지만 혈액형 중에 B형도 존재한다는 것을 알려줄 수 있음
이름 혈액형
김인호 O
이상수 AB
최영희 A
table(blood)
A B AB O
1 0 1 1
table로 보면 B형의 데이터가 없는데도 테이블에 B형이 생기면서 0값으로 출력됨
26 리스트(list) - p.72
서로 다른 데이터 구조(vector, data frame, array, list)의 중첩된 구조
list() 함수를 이용해서 데이터 구조를 중첩할 수 있음
a <- list(ename = 'scott', sal = 3000)
a
$ename
[1] "scott"
$sal
[1] 3000
벡터는 모든 항목이 같은 "데이터 타입"이어야 하는 반면, 리스트는 수집될 항목이 다른 데이터 타입이어도 됨. 이런 유연함 때문에 다양한 타입의 입출력 데이터와 머신러닝 모델의 설정 파라미터(하이퍼파라미터)의 집합을 지정하는데 자주 사용됨
- 하이퍼 파라미터?
인공신경망 : 뉴런의 개수(숫자), 학습률(숫자), 신경마으이 층수(숫자), 활성화 함수(relu, sigmoid 등은 문자)
정확도가 가장 높은 뉴런의 갯수와 활성화 함수 등을 알아내야 하는데 위의 하이퍼 파라미터 중에서 어떤 것은 숫자이고 어떤 것은 문자이므로 리스트로 만들어서 신경망에 제공해줘야 함.
27 데이터 프레임(data frame) - p.75
- 각기 다른 데이터 타입을 갖는 컬럼으로 이루어진 2차원 테이블 구조
- 데이터의 행과 열을 갖고 있기 때문에 엑셀의 스프레드 시트나 데이터베이스의 테이블과 유사한 구조
- data.frame() 함수를 이용해서 생성하며 각 컬럼, 행의 이름을 지정할 수 있음.
# 방법1. 데이터 프레임으로 구성된 파일 가져오기
emp <- read.csv("c:\\data\\emp2.csv")
str(emp) # 'data.frame': 14 obs. of 9 variables:
# 방법2. 값을 입력하여 데이터 프레임 구성하기
k1 <- data.frame(x = c(1,2,3,4,5), y = c(2,3,4,5,10))
k1
문제177. 위의 k1 데이터 프레임에서 5번째 행인 5, 10을 출력하시오.
데이터프레임[ 행번호, 열번호]
k1[5,]
문제178. k1 데이터 프레임을 파이썬 판다스 데이터프레임으로 구성하시오.
k1 = {0: [1,2,3,4,5],1:[2,3,4,5,10]}
k1 = pd.DataFrame(k1)
k1
문제179. k1 데이터 프레임에서 맨 밑의 행 5,10 을 출력하시오
k1.iloc[[4],]
cf) R에서 출력방법 : k1[행번호 ,열번호]
파이썬 판다스에서 출력방법 : k1.iloc[[행번호], 열번호]
ㅇ 데이터 프레임 구성 옵션 - p.76
stringsAsFactors = TRUE 라는 옵션을 사용하면 data frame의 데이터 중에 문자형을 자동으로 팩터로 변경함
emp <- read.csv("c:\\data\\emp2.csv")
str(emp)
emp2<- read.csv("c:\\data\\emp2.csv", stringsAsFactors = TRUE)
str(emp2)
> 기계를 학습 시킬때는 숫자형은 그대로 숫자로 줘도 되는데 문자형을 factor로 변환해서 줘야함. 그렇지 않으면 오류 나면서 수행되지 않음. (R에서만 필요함)
> 파이썬에서는 기계학습 시킬 때 위와 같이 factor로 변환할 필요 없음.
28 행렬(matrix) - p.80
- 같은 데이터 타입을 갖는 2차원 배열 구조
- matrix()함수를 사용해서 vector 값과 표시할 행과 열을 지정하면 됨
matrix(c(1:12), nrow = 4, ncol = 3)
[,1] [,2] [,3]
[1,] 1 5 9
[2,] 2 6 10
[3,] 3 7 11
[4,] 4 8 12
matrix(c(1:12), nrow = 4, ncol = 3, byrow=T)
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
[4,] 10 11 12
문제180. 아래의 행렬합을 구하시오
1 2 3 1 4 7
4 5 6 + 2 5 8
7 8 9 3 6 9
a <- matrix(c(1:9), nrow = 3, ncol = 3, byrow=T)
b <- matrix(c(1:9), nrow = 3, ncol = 3)
a+b
[,1] [,2] [,3]
[1,] 2 6 10
[2,] 6 10 14
[3,] 10 14 18
문제181. 위의 결과를 파이썬으로 구현하시오
> 행렬 연산에 최적화된 모듈인 numpy 모듈을 사용
# python
import numpy as np
a = np.arange(1,10).reshape(3,3) # 1 ~ 10미만까지의 숫자를 가지고 3x3 행렬을 만들어라
b = a.T # a 행렬을 전치 ( 행과 열을 바꿈)
print(a+b)
[[ 2 6 10]
[ 6 10 14]
[10 14 18]]
문제182. 아래의 행렬의 곱을 출력하시오(R에서 실행)
1 2 3 1 4 7
4 5 6 x 2 5 8
7 8 9 3 6 9
# R
a <- matrix(c(1:9), nrow = 3, ncol = 3, byrow=T)
b <- matrix(c(1:9), nrow = 3, ncol = 3)
a*b
문제183. 위의 결과를 파이썬으로 수행하시오.
# python
import numpy as np
a = np.arange(1,10).reshape(3,3)
b = a.T
print(a*b)
문제184. 아래의 행렬의 내적값을 출력하시오. (◎ : 내적표시)
1 2 3 1 4 7
4 5 6 ◎ 2 5 8
7 8 9 3 6 9
# R
a <- matrix(c(1:9), nrow = 3, ncol = 3, byrow=T)
b <- matrix(c(1:9), nrow = 3, ncol = 3)
a%*%b
[,1] [,2] [,3]
[1,] 14 32 50
[2,] 32 77 122
[3,] 50 122 194
문제185. 위의 결과를 파이썬으로 구현하시오.
# python
import numpy as np
a = np.arange(1,10).reshape(3,3)
b = a.T
np.dot(a,b)
29 어레이(array)
- 같은 데이터 타입을 갖는 다차원 배열구조
- matrix는 2차원 행렬이고 array는 다차원 행렬
- array() 함수를 이용해서 다차원 배열을 생성할 수 있음
array(c(1:12), dim = c(3,4) ) # 2차원 배열
array(c(1:12), dim = c(2,2,3)) # 3차원 배열
array(c(1:12), dim = c(2,2,2,2)) # 4차원 배열
ㅁ R의 자료구조 정리
1. 벡터(vector) ---> factor(순서를 갖는 벡터)
2. 행렬(matrix)
3. 어레이(array)
4. 데이터 프레임(data frame)
5. 리스트(list)