머신러닝 01. R의 기본과 데이터 읽기
Written on October 22nd , 2019 by MJ 목차
1. R의 다양한 패키지, 변수 정리, 작업 디렉토리 변경
2. 데이터 유형
(1) 실수형, 정수형, 문자형, 팩터형, 날짜, 논리형
(2) 팩터형 데이터 예제: level, order 인자
(3) 결측값과 파이프 연산자: NA, NULL, magrittr
(4) 결측데이터 처리
3. 데이터 구조: 벡터, 데이터 프레임, 리스트, 행렬, 배열
(1) 벡터: 같은 데이터 유형을 가진 요소들의 묶음
(2) 행렬
(3) 배열
(4) 리스트 데이터
(5) 데이터 프레임
(6) 데이터프레임에서 컬럼 가져오기
4. R에서 데이터 읽어오기
(1) csv 파일 읽어오기1: read.table(file, header, sep)
(2) csv 파일 읽어오기2: readr::read_delim(file, col_names, delim)
(3) csv 파일 읽어오기3: data.table::fread(input, sep, header)
(4) csv 파일 로딩의 3가지 방법 속도 비교
(5) excel 파일 읽어오기: readxl::read_excel(“”, sheet)
(6) R바이너리 파일 사용
(7) 온라인데이터 로딩: browseURL(), download.file()
(8) 데이터셋 정보 조회: headTail() / str() / glimpse() / summary() / describe() / skim()
5. dplyr 패키지로 그룹 단위의 데이터 다루기
(1) 변수컬럼 이름 변경: rename()
R Studio에서
인코딩 변경: tools -> Global Options -> Code -> Savings -> Change: UTF-8 -> 종료 후 재시작 레이아웃 변경: tools -> Global Options -> Pane Layout 테마 / 글꼴 / 사이즈 변경: tools -> Global Options -> Appearance R 버전 확인: tools -> Global Options -> General
에러 발생 시 확인: 패키지를 다운 받는 폴더가 2개가 있어야하는데 하나가 사라져서 그렇다. .libPaths()로 패키지 다운 받는 경로를 확인한 이후, 폴더 하나가 없어졌다면 새로 만든 이후 (mylib) .libPaths(c(“새 경로”, .libPaths )) 로 코딩해서 새로 경로 설정. 그리고 패키지 다시 다운 받고 로딩해서 함수 사용하기. 버전도 주의할 것!
—————코딩——————————————————————————————————
1. R의 다양한 패키지, 변수 정리, 작업 디렉토리 변경
패키지란 뭘까?: 어떤 특정 문제에 대한 해법으로 작성된 코드들을 모아 놓은 것
survival 패키지는 생존분산에 사용되고, ggplot2 패키지는 플롯팅, sp 패키지는 공간 데이터를 처리하는 방법을 제공한다.
install.packages("") # 패키지 설치
library() # 패키지 로딩
remove.packages("") # 패키지 제거
search() # 설치된 패키지 확인. library로 로딩까지 한 패키지만 확인 가능
?함수이름 # 함수에 대한 설명이 help 탭에 표시됨
help(함수이름)
apropos(함수이름 일부분) # 일부분이 포함된 함수를 모두 찾아줌
library(help = "패키지 이름")
rm(a, b, c) # 변수 a,b,c 지워줘
rm(list = ls()) # 객체 안에 있는 거 다 지워줘. 메모리 상의 모든 객체 삭제
# 혹은 R studio 메모리 창 -> 빗자루 아이콘 -> 한꺼번에 변수 삭제
# 혹은 R studio -> list 클릭 -> grid 클릭 -> 변수 별로 체크 박스 만들어지면 선택적 변수 삭제
gc() # garbage collection: 메모리에 용량 차지하는 기계적 찌꺼기가 ls()함수로 지워지지 않는다면 이것 이용
ls() # 메모리에 있는 객체 보여줘
ctrl + l # 작업 중 지저분한 콘솔 창 정리
getwd() # 현재 작업 디렉토리 확인
setwd("") # 새 작업 디렉토리 설정
list.dirs() # 현재 작업경로 내 폴더명 조회
list.files() # 현재 작업경로 내 파일명 조회
list.files(pattern = "korea") # korea라는 단어 들어있는 파일명 조회
#### R Studio 닫으면 리셋되는 속성 ########
options() # R의 디폴트 속성을 알파벳 순으로 나열
options()$max.print
options(max.print = 2000) # 콘솔 창에 데이터 2000개 씩 표시하는 것으로 바꿈
options()$digits
options(digits = 3) # 수치 데이터를 3자리까지만 출력
2. 데이터 유형
(1) 실수형, 정수형, 문자형, 팩터형, 날짜, 논리형
is.numeric() # 실수형 변수인가 -> True / False
is.integer() # 정수형 변수인가
class() # 변수 유형 확인
x <- "" # "" 를 붙이면 R은 그 안의 내용을 문자형 데이터로 인식
class(x) # x는 문자형 변수. chr(character)
<- factor("") # 팩터형 변수. 문자열과는 다름
nchar() # 글자수 확인 함수. chr나 factor형에 사용
y <- as.Date("2019-10-22")
class(y) # Date. 변수 유형을 표시
mode(y) # numeric. 데이터 유형을 표시
<- as.POSIXct("2019-10-22") # POSIXct 타입 데이터. 날짜와 시간을 저장
as.numeric() # 괄호 안의 변수를 실수형으로 바꾸기
is.logical() # 논리형 변수인가
2 == 3
2 != 3
"hola" == "hello" # False
"hola" < "hello" # True
- R studio 메뉴창 -> tools -> global options -> code -> saving -> default text encoding : 문자 인식 방식 선택 가능. 보통 UTF-8
- 만약 + 에서 벗어나 프롬프트로 가고 싶다면 esc 버튼
(2) 팩터형 데이터 예제: level, order 인자
edulevel <- c("ms", "dt", "hs", "ms", "ms", "cl", # chr[1:27]의 서열 없는 문자열 벡터를 변수에 할당
"dt", "hs", "hs", "dt", "dt", "ms", # hs: highschool / cl: college / ms: master / dt: doctoral
"hs", "cl", "ms", "dt", "hs", "ms",
"hs", "cl", "cl", "hs", "hs", "cl",
"hs", "cl", "cl")
edulevel # 객체 내용 조회
>> NULL # 일반 문자열 벡터이므로 특별한 레벨이 들어 있지않아서 NULL로 나옴
str(edulevel) # 변수 내부 구조 파악. 객체 형식이 chr임을 알 수 있음
table(edulevel) # 범주형 변수 항목별로 빈도수 계산
edulevel2 <- factor(edulevel)
str(edulevel2) # 변수 내부 구조 보면 객체 형식이 Factor로 변경됨
edulevel.f <- factor(edulevel, levels = c("hs", "cl", "ms", "dt")) # levels 파라미터에서 c함수 이용해 명목범주 정해줌. 서열은 X
levels(edulevel.f)
[1] "hs" "cl" "ms" "dt"
edulevel_f <- factor(edulevel, levels = c("hs", "cl", "ms", "dt"), ordered = T) # ordered 파라미터로 서열을 정함
levels(edulevel_f)
str(edulevel_f)
>> Ord.factor w/ 4 levels "hs"<"cl"<"ms"<..: 3 4 1 3 3 2 4 1 1 4 ...
table(edulevel_f)
>> edulevel_f
hs cl ms dt
9 7 6 5
-
팩터형 변수는 이항형 / 다항형 / 서열형 변수를 가리킨다.
- 범주형, 질적 데이터: 빈도 분석을 해야하는 데이터이며, 비율(%)을 구해야 하는 데이터이다.
- 명목형 데이터: 이항형 & 다항형
- 이항형 데이터: 이분되는 것. YES, No
- 다항형 데이터: 3개 이상 항목으로 구분되는 데이터. 1번 여행용품, 2번 식료품, 3번 전문도서 상품, 4번 전자제품 등
- 서열형 데이터: 항목을 구별하긴 하지만, 레벨의 의미가 추가됨. Ranking 의미.
- 명목형 데이터: 이항형 & 다항형
- 연속형, 양적 데이터: 평균을 구해야하는 데이터.
- 등간형 데이터: 일정한 간격의 데이터. 온도 1도, 2도, 3도, 4도, …/ 카드 결제 횟수. 1번 2번, 3번, …
- 중도절단형 데이터:
- 어떤 걸 측정할 때 시간이 지날수록 데이터가 유지되다가 갑자기 사라지는 데이터.
- 왜 어떤 데이터는 계속 유지되는데 왜 어떤 데이터는 중간에 멈추는지 분석.
- 통신사 서비스 등 이용하다가 일정 기간 후 갑자기 이탈하는 고객이 있는 반면, 어떤 고객은 계속 쓰는 데이터.
- 의료보험 중 생존분석이라는 게 있어서, 어떤 사람들이 중간에 사망하는지 예측할 때 사용.
- 마케팅에서는 어떤 사람들이 지속적으로 상품 이용하지 않고 중간에 떠나는지 분석할 때 사용.
- 스마트팩토리에서는 어떤 라인에 계속 운영되다가 갑자기 고장 나는지를 분석해서 언제 고장 나는지를 예측할 때 사용.
- 타이밍을 찾기 위함.
- 데이터는 굉장히 촘촘함. 실수 데이터. 소수자리까지 있는 데이터. 주로 시간을 많이 측정.
- 비율형: -inf부터 +inf 까지 자유롭게 측정한 데이터. 계량할 수 있는 모든 걸 비율 데이터라고 함. 촘촘하게 +-제한 없이 쓰이는 데이터.
(3) 결측값과 파이프 연산자: NA, NULL, magrittr
NA # Not Available / NA: 숫자데이터 결측치 / <NA>: 문자데이터 결측치
NULL
NaN # Not a Number. 숫자가 아니다 라는 표현. 수치 데이터로 받아서 연산해야 하는데 문자 데이터가 인식될 때 표시됨
is.na() # 벡터에 들어있는 각 요소가 결측값인지 확인. 위치별로 TRUE, FALSE 찍어줌
mean(x, na.rm = TRUE) # 결측값이 있을 때 na.rm 옵션 넣으면 NA만 빼고 수학 연산 함
which(is.na(x)) # 어떤 요소 위치에 NA가 있는지 확인
install.packages("magrittr") # 파이프연산자가 든 패키지
library(magrittr)
grade %>% table() %>% addmargins()
grade %>% table %>% addmargins
grade %>% table(useNA = "ifany") %>% addmargins
(4) 결측데이터 처리
벡터x가 결측값 있는 연속형 변수일 때 내부의 결측값을 대체하는 방법
x <- c(6.5, 4.9, NA, 4.2, 7.3, NA , 11.7, 6.9, 5.2)
##### 결측값 단순 삭제 ########
!is.na(x) # x 중 결측치 없으면 TRUE, 있으면 FALSE
x2<- x[!is.na(x)] # 단순삭제
##### 산술평균값으로 대체 ########
x.avg <- mean(x, na.rm = TRUE) # NA를 제외한 정상데이터를 활용한 산술 평균값
x[is.na(x)] <- x.avg # NA가 있는 위치에 x.avg를 대체
x <- round(x, 1) # x의 요소들을 소수점 첫째자리까지 표시 (소수 둘째자리에서 자동 반올림)
##### 중앙값으로 대체 ########
x.med <- median(x, na.rm = TRUE)
x[is.na(x)] <- x.med
벡터x가 결측값 있는 범주형 변수일 때 내부의 결측값을 대체하는 방법
##### 변수 생성 ########
grade <- c("C", "B", "B", "D", NA,
"B", "D", "B", "D", "D",
"D", "D", "C", "B", "B",
"C", "B", NA, "D", "C",
"C", "A", "A", "B", "B",
"B", NA, "B", "A")
table(grade) # 범주형 변수의 기술통계 확인. 결측값은 제외하고 안 보여줌
table(grade, useNA = "ifany") # 만약 grade 변수 안에 NA가 하나라도 있으면(ifany) NA를 표시해 줌
# 만일 useNA = "always" 라고 쓰면 grade에 NA 있든 없든 무조건 표시해줌. 없으면 NA 0으로 표시
addmargins(table(grade, useNA = "ifany")) # 맨끝자리에 sum을 표시해줌. 전체 요소의 규모를 알려줌
##### 결측값 단순 삭제 ########
is.na(grade) # grade 변수의 요소 값 별로 결측치인지 판단: 결측치 있으면 TRUE, 없으면 FALSE
!is.na(grade) # 결측치 없으면 TRUE, 있으면 FALSE
grade2 <- grade[!is.na(grade)]
table(grade2)
addmargins(table(grade2))
##### 최빈값으로 대체 ########
grade.tb <- table(grade, useNA = "ifany") # grade 변수의 범주 항목별 빈도수 파악
max(grade.tb) # 최대빈도수 수치 파악
grade.max <- which.max(grade.tb) # 최대빈도수 가진 항목이름(B)과 위치(2)
grade.mode <- names(grade.max) # 최대빈도수 가진 항목이름(B)을 다시 따로 추출
grade[is.na(grade)] <- grade.mode # grade 변수에서 NA 값이 최대빈도수 항목인 B로 대체됨
table(grade)
addmargins(table(grade))
3. 데이터 구조: 벡터, 데이터 프레임, 리스트, 행렬, 배열
(1) 벡터: 같은 데이터 유형을 가진 요소들의 묶음
x <- 3 # 스칼라 변수. 정보가 하나 뿐
y <- 3, 5, 1.5, -4 # 벡터 변수. 두 가지 이상의 정보를 가진 변수
z <- c(3, 5, 5, 7, -1)
z <- -1:10
z <- 10:-5
length (z) # 변수 개수
any(z < 5) # 하나라도 조건 맞으면 True
all(z < 5) # 모든 변수가 x < 5 여야지 True
z <- c("Hi", "hello")
nchar(z)
# 벡터는 사칙연산 가능. 이때, 길이가 다른 두 벡터끼리 연산할 경우, 짧은 쪽이 긴쪽을 순환
c(1, 2, 3, 4) + c(1, 2)
[1] 2 4 4 6
(2) 행렬
- 행렬에 포함된 모든 값은 모두 같은 데이터 유형을 가진다.
- nrow : number of row. 행을 먼저 결정하고 싶을 때 (열은 자동 결정)
- ncol : number of column. 열을 먼저 결정하고 싶을 때
h <- c(1:72) # 벡터 변수 생성
i <- matrix(h, nrow = 6) # 벡터 h를 6개 행으로 나눠서 행렬 객체 i에 저장. 위부터 순서대로 나열됨
i[3, ] # i의 3째 행 전체
i[3, 2] # i의 3행 2열 요소
nrow(i) # 행이 몇 개인가
ncol(i) # 열이 몇 개인가
dim(i) # 행과 열이 각각 몇 개인가
t(i) # i의 transpose
(3) 배열
- 배열에 포함된 모든 값은 모두 같은 데이터 유형을 가진다.
- 다차원의 벡터. 여러 행렬을 다른 차원의 축으로 겹치게 만드는 것
j <- array(1:72, dim = c(4,6,3))
j[1, , ] # 3개 차원에서 각각 1행의 내용 반환
j[1, , 1] # 1차원에서 1행의 내용 반환
j[ , , 1] # 1차원의 행렬 내용 반환
(4) 리스트 데이터
- 모든 타입의 데이터를 저장할 수 있다 : 숫자형 벡터, 문자형 벡터, 이들의 혼합, 데이터 프레임, 리스트
k <- list(one = h, two = i, three = j) # h는 vector, i는 matrix, j는 array
names(k) <- c("vector", "matrix", "array") # list 속 3 요소의 이름 변경 가능
names(k)
length(k) # list 속 요소의 개수(3)
k[[1]] # 개별 요소 접근할 때 [[ ]]
k[[2]]
k[[3]]
k[[1]][3] # 개별 요소 내에서 다시 내부 요소에 접근할 수 있다.
k[[4]] <- 2 # list 에 이름없는 4번째 요소 넣을 수 있다.
(5) 데이터 프레임
- 통계학적 관점에서 각 열은 하나의 변수, 각 행은 관측 개체
- 각 열은 하나의 벡터. 따라서 같은 열의 데이터는 모두 같은 데이터 유형
- 서로 다른 열은 서로 다른 데이터 유형을 가질 수 있다.
- 각 열은 모두 같은 길이를 가진다. 맞지 않다면 NA라도 써서 맞춰줘야 한다.
x <- 10:1
y <- -4:5
q <- c("Hotkey", "Football", "Baseball", "Curling", "Rugby", "Lacrosse", "Basketball", "Tennis", "Cricket", "Soccer" )
theDF <- data.frame(x, y, q) # data frame은 이 방법으로도 만들 수 있으나
theDF
theDF <- data.frame(First = x, Second = y, Sport = q) # data frame은 이 방법으로 만드는 게 낫다
nrow(theDF) # 행이 몇 개인가
ncol(theDF) # 열이 몇 개인가
dim(theDF) # 행과 열이 몇 개인가
names(theDF) # 열의 이름이 무엇인가 (First, Second, Sport)
colnames(theDF)
names(theDF)[3] # 3번째 열의 이름이 무엇인가 (Sport)
names(theDF)[3] <- "activity" # 3번째 열의 이름을 변경
rownames(theDF) # 행의 이름이 무엇인가 (1, 2, 3, ... : 이름 아직 안 지어줌)
row.names(theDF) # 행의 이름을 찾는 다른 방법
- 데이터프레임의 행을 별도로 추출해보자: grep()
data(mtcars) # datasets패키지에 있는 mtcars예제데이터셋 메모리로 로딩
help(mtcars) # 해당 데이터셋 도움말(코딩북) 확인
mtcars # 전체 데이터셋 내용 조회
names(mtcars) # 변수컬럼 조회
colnames(mtcars)
rownames(mtcars) # 행이름 조회
row.names(mtcars)
grep("Merc", rownames(mtcars)) # 행이름 중에 Merc라는 단어가 들어간 레코드 위치(인덱스 번호) 조회
mtcars[grep("Merc", rownames(mtcars))] # Merc라는 단어가 들어간 레코드 내용(콘텐츠) 조최
Merc <- mtcars[grep("Merc", rownames(mtcars)), ] # Merc 차종에 대한 서브데이터셋 추출
t(Merc) # 데이터 전치
# 차량 속성 별로 Merc 차종별 특징을 비교 할 수 있음 : 원래 데이터프레임에서 컬럼이 행이 되어 세로로 긴 데이터셋이 됨
- 데이터 프레임에 별도의 (행이름)변수컬럼 추가 후 컬럼 재배치
mtcars$carname <- rownames(mtcars) # carname라는 컬럼을 만들어 mtcars의 행이름을 넣음
head(mtcars)
rownames(mtcars) <- NULL # 불필요해진 mtcars의 행이름을 없앰
head(mtcars)
mtcars <- mtcars[c(12, 1:11)] # carname 변수 컬럼이 제일 왼쪽에 오도록 위치 변경
head(mtcars)
(6) 데이터프레임에서 컬럼 가져오기
mtcars["mpg"]
mtcars[1]
mtcars$mpg
mtcars [c(“mpg”, “gear”)]
mtcars [c(1, 10)]
mtcars$mpg
mtcars[c(3:7)]
- 전체 데이터 조회 & 일부 데이터 조회: View
mtcars
View(mtcars)
head(mtcars)
tail(mtcars)
4. R에서 데이터 읽어오기
- 읽기는 fread로 읽고, 분석은 tibble 구조로 하자 : <- as_tibble(data.frame데이터셋)
(1) csv 파일 읽어오기1: read.table(file, header, sep)
- read.table = read.csv : 같은 기능의 함수
- .csv, .txt 파일을 data.frame 형식으로 로딩
- csv(): 콤마(,)에 특화 / csv2(): 세미콜론(;)에 특화 / tsv(): 탭(\t) 전용
adult.df <- read.csv(file = "adult.csv", header = TRUE, sep = ",")
adult.df <- read.table(file = "adult.csv", header = TRUE, sep = ",")
adult.df <- read.csv(file = "adult.csv", header = TRUE, sep = ",",
stringsAsFactors = FALSE, # 문자열을 팩터로 인식하지 않음
strip.white = TRUE, # 화이트스페이스 제거 (" 10" 처럼 공백 뒤에 숫자 오는 형식 -> "10")
na.strings = c(" ", "?")) # 공백과 ? 에 대해 NA 표시함
adult.df.nohd <- read.csv(file = "adult_noheader.csv", # header 없는 데이터 로딩
header = FALSE, sep = ",", # header = FALSE
stringsAsFactors = FALSE,
strip.white = TRUE,
na.strings = c("", "?"),
skip = 3) # 1째줄, 2째줄, 3째줄 까지의 데이터는 무시. 4째줄부터 로딩
(2) csv 파일 읽어오기2: readr::read_delim(file, col_names, delim)
- 대규모 데이터 읽을 때 빠른 방식
- read_delim = read_csv : 같은 기능의 함수
- csv, .txt 파일을 tibble(tble_df, tbl) 형식과 data.frame 형식으로 로딩
- readr 패키지의 함수는 모든 문자 데이터를 chr로 읽는다: 아예 팩터형으로 읽지 않는다
install.packages("readr")
library(readr)
adult.df <- read_delim(file = "adult.csv", col_names = TRUE, delim = ",",
trim_ws = TRUE, # 화이트스페이스 제거
na = c(" ", "?")) # 공백, ? -> NA 처리
adult.tb.nohd <- read_delim(file = "adult_noheader.csv",
col_names = FALSE, delim = ",",
trim_ws = TRUE,
na = c("", "?"),
skip = 3)
- read_delim() 함수는 delim을 통해서 요소값을 구별하는 구분기호가 콤마(,), 세미콜론(;), 탭(\t)인 경우에 로딩이 가능
- \t: tab 키 의미
- read_csv() 함수는 데이터요소값들을 구별하는 구분기호가 콤마(,)로 되어 있는 파일에 특화된 로딩함수. \t, ; 은 파일 로딩시 오류 뜸
(3) csv 파일 읽어오기3: data.table::fread(input, sep, header)
- read_delim() 함수보다 빨리 데이터를 읽을 수 있다 : fread = fast read
- .csv, .txt 파일을 data.table 형식과 data.frame 형식으로 로딩
adult.dt <- fread(input = "adult.csv", header = TRUE, sep = ",",
stringsAsFactors = FALSE,
strip.white = TRUE,
na.strings = c("", "?")) # "아무 내용 없는 데이터", "?" -> NA 처리
A <- as_tibble(adult.df) # data.frame 형식의 파일을 tibble로 변경
(4) csv 파일 로딩의 3가지 방법 속도 비교
system.time() # 함수에 각각 세 가지 방법을 넣고 측정된 계산 시간을 비교
microbenchmark {microbenchmark} # 함수에 각각 세 가지 방법을 넣고 측정된 계산 시간을 비교
(5) excel 파일 읽어오기: readxl::read_excel(“”, sheet)
- read_excel() 함수는 디폴트로는 엑셀파일 첫번째 시트를 읽고, tibble을 반환
myRetail <- read_excel(path = "myRetail.xlsx", sheet = 1,
col_names = TRUE,
trim_ws = TRUE,
na = c("", "?"))
(6) R바이너리 파일 사용
- R Studio에서 메모리 상 존재하는 데이터 파일을 하드디스크에 저장하는 코딩
- .csv 확장자로 저장하지 않음
- 바이너리 파일은 0과 1로만 저장하기 때문에 R에서만 읽을 수 있다.
save(adult.df.nohd, file = "myAdult.Rdata")
save.image(file = "myAdultAll.Rdata")
saveRDS(bank, file = "aaa.Rdata")
list.file(pattern = ".Rdata")
load("myAdult.Rdata") # 하드디스크에 있는 Rdata 바이너리(binary) 파일포맷 메모리로 로딩
(7) 온라인데이터 로딩: browseURL(), download.file()
browseURL("http://archive.ics.uci.edu/ml") # 캘리포니아주립대학교 머신러닝 레파지토리 사이트를 이용한 데이터로딩
- 온라인에서 엑셀 파일 다운로드
url <- " "
download.file(url,
destfile = "myRetail.xlsx", # destination file. 저장될 디렉토리와 파일명
method = "wininet", # 윈도우(wininet))인지, 리눅스 우분투(libcurl)에서 파일 다운로드 하는 건지 설정
mode = "wb") # 이진파일(wb)인지, 일반 파일(b(plain text))인지 설정
download.file(url, destfile = "bank.zip",
method = "wininet",
mode = "wb")
dir() # 현재 작업 경로의 파일 목록 확인
list.files(pattern = ".zip") # 작업 경로의 zip 파일 목록만 확인
install.packages("zip")
library(zip)
zip_list("bank.zip") # zip 파일 압축 풀지 않고 목록을 볼 수 있다
unzip("dataset.zip",exdir = ".") # zip 파일을 모두 풀어도 되고 아래 방법도 OK
bank <- read_csv2(file = unz(description = "bank.zip", filename = "bank.csv"), # unz(): zip 압축 풀어주는 함수
col_names = TRUE,
trim_ws = TRUE,
na = c("", "?"))
(8) 데이터셋 정보 조회: headTail() / str() / glimpse() / summary() / describe() / skim()
- psych::headTail() / str() / dplyr::glimpse() / summary() / Hmisc::describe() / skimr::skim()
head()
tail()
head(diamonds, n=15) # 1~15개 레코드까지만 보여줌
install.packages("psych")
library(psych)
psych::headTail(diamonds) # headTail(): 앞뒤로 소량의 데이터 보여주는 함수
- 내부 구조 조회
str(adlut.df)
install.packages("dplyr")
library(dplyr)
glimpse(adult.df) # glimpse는 str와 같은 기능
- 요약 정보 조회
summary(adult.df)
install.packages("skimr")
library(skimr)
skim(adult.df)
install.packages("Hmisc")
liblrary(Hmisc)
Hmisc::describe(diamonds)
- skim() 함수는 str, glimpse보다 구조 정보를 풍부하게 알려준다.
- 카테고리로 분류해서 문자열 데이터와 정수 데이터를 따로 기술통계 해줌
- 변수 별로 missing data 있는지, 결측치가 있는지 표시해줘서 -> 어떤 데이터가 전처리 필요한지 알려줌
- 예측모델 분석할 때 skim 모델을 많이 씀
- p0, p25 p50 p75 p100 : 4분위수
5. dplyr 패키지로 그룹 단위의 데이터 다루기
install.packages("dplyr")
library(dplyr)
(1) 변수컬럼 이름 변경: rename()
adult.tb.nohd <- dplyr::rename(adult.tb.nohd,
age = X1,
workclass = X2,
fnlwgt = X3,
education = X4,
"education-num" = X5, # 하이픈(-)을 마이너스로 인식하지 않기 위해 "" 붙임
"marital-status" = X6,
occupation = X7,
relationship = X8,
race = X9,
sex = X10,
"capital-gain" = X11,
"capital-loss" = X12,
"hours-per-week" = X13,
"native-country" = X14,
income = X15)
names(adult.tb.nohd)
# dplyr::rename(데이터셋, 바꿀 컬럼명 = 원래 컬럼명)
- 참고: plyr::rename()
ad.url.tb <- rename(ad.url.tb, c(X1 = "age",
X2 = "workclass",
X3 = "fnlwgt",
X4 = "education",
X5 = "education-num",
X6 = "marital-status",
X7 = "occupation",
X8 = "relationship",
X9 = "race",
X10 = "sex",
X11 = "capital-gain",
X12 = "capital-loss",
X13 = "hours-per-week",
X14 = "native-country",
X15 = "Salary-level"))
-
knitr를 활용해서 보고서 쓰기
-
R마크다운으로 보고서 쓰기
<참고 문헌="">참고>
- 데이터과학 입문자를 위한 R (제리드 랜더 지음)
- 최점기 박사님 강의