머신러닝 01. R의 기본과 데이터 읽기


    목차
    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"))
  1. knitr를 활용해서 보고서 쓰기

  2. R마크다운으로 보고서 쓰기

<참고 문헌="">


  1. 데이터과학 입문자를 위한 R (제리드 랜더 지음)
  2. 최점기 박사님 강의
comments powered by Disqus