Tools(file://M1403INS/Tools)
R설치 ::
https://cran.r-project.org/bin/windows/base/
활용 데이터 파일
[1] 은행 교차 판매 데이터
[2] 모바일 고객 분석
# [ 분석 데이터 준비 : Game Log 데이터 ] - 파일 온라인링크
dau <- read.csv("https://t1.daumcdn.net/cfile/blog/256C0D4B588ED29C26?download")
user <- read.csv("https://t1.daumcdn.net/cfile/blog/215C784B588ED2A133?download")
[3] 학생수업 데이터 (mycsv)
#===========
# https://www.rstudio.com/ RStudoio 다운로드 사이트
#===[ 2. 고객이해를 위한 빅데이터 분석 ]=============
#-- R 기본문법 ; 입출력 ; 가공 -----
1+2
# R 연산자
# 산술 연산자
1+2
2-10
3*10
4/3
2^3
# 논리 연산자
3>2
2>=4
4==4 # 대입이 아니라 비교임
a=4 # 이콜이 하나면 대입임
a==4 # 결과는 a안의 값과 4를 비교한 것
a = 3 # 대입
a <- 3 # 대입
"학교"=="학교"
"학생"!="학교"
5!=5
!(T) # 부정
# 변수
a <- 1 # 이콜을 쓰나 대입표시를 쓰나 같은 것!
a <- c(1,2,5.3,6,-2,4) # numeric vector
plot(a)
b <- c(one","two","three") # character vector
c(b, b)
b1 <- c(a, b) # combine
c <- c(TRUE,TRUE,TRUE,FALSE,TRUE,FALSE) #logical vector
a[c(2,4)] # 2nd and 4th elements of vector
a[c(1,2,3)]
a2 <- c(2,4)
a[a2]
a <-1:2
a[c(2,4)]
# 추가 연습
a <- c(1,2,5.3,6,-2,4) # numeric vector
b <- c(one","two","three") # character vector
c(a, b)
b2 <- c(a, b)
#==== 매트릭스 ===========
y<-matrix(1:20, nrow=5,ncol=4)
y
cells <- c(1,26,24,68)
rnames <- c("R1", "R2")
cnames <- c("C1", "C2")
mymatrix <- matrix(cells, nrow=2, ncol=2, byrow=TRUE,
dimnames=list(rnames, cnames))
# 매트릭스의 일부를 추출하기
y[,4] # 4th column of matrix
y[3,] # 3rd row of matrix
y[2:4,1:3] # rows 2,3,4 of columns 1,2,3
y[3,4]
#===== 데이터프레임 dataframe ======
d <- c(1,2,3,4)
e <- c("red", "white", "red", NA)
f <- c(TRUE,TRUE,TRUE,FALSE)
mydata <- data.frame(d,e,f)
names(mydata) <- c("ID","Color","Passed") # variable names
mydata[, 2:3] # columns 2,3 of data frame
mydata[c("ID","Color")] # columns ID and Age from data frame
mydata$Color # variable x1 in the data frame
# 컬럼명에 한글 이름 사용
# 컬럼명 사용시 한글이름이 인식되지 않을 경우 따옴표 테스트
names(mydata)[2] <- "색상"
mydata$색상
mydata$'색상'
names(mydata)[2] <- "칼라"
mydata$칼라
plot(mydata$칼라)
#---- 리스트 list ----------- ( # == 주석달기 )
a <- c(3,5,7)
w <- list(name="Fred", mynumbers=a, mymatrix=y, age=5.3)
b <- c(2,5)
w1 <- list(name1="Ted", mynumbers1=b)
# example of a list containing two lists
v <- c(w,w1)
w[[2]] # 2nd component of the list
w[["mynumbers"]] # component named mynumbers in list
w[["mymatrix"]][,2] # my matrix 두번째 컬럼
#---- 팩터 factor ------
# variable gender with 20 "male" entries and
# 30 "female" entries
gender <- c(rep("male",20), rep("female", 30))
gender1 <- factor(gender)
# stores gender as 20 1s and 30 2s and associates
# 1=female, 2=male internally (alphabetically)
# R now treats gender as a nominal variable
summary(gender)
summary(gender1)
levels(gender1) # factor level
#--- 기본함수 -------
abc <- c(1,3,2,4)
length(abc) # number of elements or components
str(abc) # structure of an object
str(mydata)
class(abc) # class or type of an object
names(mydata) # names
def <- c(5,4,5)
c(abc, def) # combine objects into a vector
cbind(mydata, mydata) # combine objects as columns
rbind(mydata, mydata) # combine objects as rows
rbind(mydata, mydata, mydata)
# cbind(), rbind() 는 순서에 주의 필요
cbind(mydata, mydata[order(mydata$Passed),])
# 순서가 달라 엉뚱한 결과가 됨
# object # prints the object
abc <- c("학교", "종이")
abc
mydata
print(abc)
abc[1]
paste(abc[1],abc[2]) # abc 개체의 첫번째, 두번째 값을 하나의 값으로 결합
ls() # list current objects
def1 <- def
rm(def1) # delete an object
newobject <- edit(def) # edit copy and save as newobject
fix(def) # edit in place
#---- vector 편집 ----
a <- 1:20
length(a)
a1 <- head(a, 10)
a1[3]
a1[5:8]
a1[5:8] <- a1[5:8] * 2
a1
a1[- (1:3)] # 1~3번째 값을 제외
a1[c(3,5,7)]
-1:5
#--- data variable label 확인 및 변경 ---
names(mydata)
names(mydata)[1:3]
labelstemp <- names(mydata)[1:3]
names(mydata)[1:3] <- c("A","B","C")
names(mydata)
names(mydata)[1:3] <- labelstemp
names(mydata)
#---- value label 확인 및 변경 ---
d <- c(1,2,3,4)
e <- c("red", "white", "red", NA)
f <- c(TRUE,TRUE,TRUE,FALSE)
v1 <- c(3,2,3,1)
mydata3 <- data.frame(d,e,f,v1)
names(mydata3) <- c("ID","Color","Passed","v1") # variable names
# 번호 값에 대응되는 라벨로 값 변경
mydata3$v1 <- factor(mydata3$v1,
levels = c(1,2,3),
labels = c("red", "blue", "green"))
str(mydata3)
#---- missing values 결측값 ------
x <- NA # missing == not available
is.na(x) # returns TRUE of x is missing
x <- 1
is.na(x) # returns TRUE of x is missing
y <- c(1,2,3,NA)
is.na(y) # returns a vector (F F F T)
y[is.na(y)==F]
# recode 99 to missing for variable v1
# select rows where v1 is 99 and recode column v1
mydata3
mydata3$v1[mydata3$v1=="green"] <- NA
mydata3
mydata3$v1[is.na(mydata3$v1)] <- 99 # 안들어감 왜? 팩터니까
mydata3
mydata3$v1[is.na(mydata3$v1)] <- "red" # 왜? 팩터니까
mydata3
# missing 값을 제외
x <- c(1,2,NA,3)
mean(x) # returns NA
mean(x, na.rm=TRUE) # returns 2
# NaN :: Not a Number
0 / 0 ## = NaN :: NaN means 'Not a Number'
1/0 + 1/0 # Inf 무한대
1/0 - 1/0 # NaN 값 표시할 수 없음 (숫자가 아니라서)
#---- Data Type 변환 ----
x <- 1:5
x
class(x) # 형식이 무엇인지를 표시
x <- x * 2
x
x1 <- as.character(x) # 문자로 변경
class(x1)
x1
x2 <- as.numeric(x1) # 숫자로 변경
class(x2)
x2
x3 <- as.integer(x2) # 정수로 변경
class(x3)
x3
x2 + x3
as.integer(3.14) # 결과는?
as.integer(3.9)
#--- 논리 data type 활용 ----
a <- 3
is.numeric(a)
!is.numeric(a)
a!=4
a==4
as.numeric(F) # F == FALSE
as.numeric(FALSE)
as.numeric(False) # ?
as.numeric(FALSE) + as.numeric(T)
(a==4)+1
(as.numeric(F) + as.numeric(T) )/2
as.logical(1)
as.logical(1)==T
as.logical((0:7) * 0.2) # 0 값일 경우만 F
as.logical(rep(c(0,1),3))
#---- Date Values 날짜처리 ------
# use as.Date( ) to convert strings to dates
mydates <- as.Date(c("2007-06-22", "2004-02-13"))
mydates
# number of days between 6/22/07 and 2/13/04
days <- mydates[1] - mydates[2]
days
Sys.Date() # 시스템 시간을 연월일만 표시
Sys.Date() - mydates[1]
date() # 시간, 요일, 날짜 모두 표시
# Quick-R 언어 사용법 정리된 참조 사이트
# http://www.statmethods.net/input/dates.html :: format() function
# convert date info in format 'mm/dd/yyyy'
strDates <- c("01/05/1965", "08/16/1975")
dates <- as.Date(strDates, "%m/%d/%Y")
aa <- c("01/05/1965", "08/16/1975")
aa <- c("1995-01-01")
dates <- as.Date(aa)
format(dates, format="%Y-%m-%d")
format(dates, format="%Y년 %m월 %d일")
format(dates, format="%y-%m-%d")
# The default format is yyyy-mm-dd
# convert dates to character data
strDates <- as.character(dates)
as.numeric(dates)
#==== 새로운 변수 생성 연습 =====
mydata <- data.frame(x1 = c(1,2,3,4), x2 = c(3,2,3,1))
mydata$sum <- mydata$x1 + mydata$x2
mydata$mean <- (mydata$x1 + mydata$x2)/2
# rm(x1) ; rm(x2) # 변수명과 동일한 이름을 가진 개체 삭제
attach(mydata) # 데이터프레임의 이름을 생략하고 변수를 호출할 수 있도록 지정
mydata$sum <- x1 + x2
mydata$mean <- (x1 + x2)/2
# 퀴즈 :: # 평균 컬럼의 값을 숫자가 아닌 문자형식으로 바꿔서 새로운 컬럼 (이름은 charmean ) 으로 추가!
mydata$charmean <- as.character(mean)
# 퀴즈 :: charmean 컬럼을 숫자로 바꾸면 mean과 같은가 여부를 새로운 컬럼 (이름은 iseq) 으로 추가
mydata$iseq <- as.numeric(mydata$charmean)== mean
detach(mydata)
#---- Recoding variables ------
# mydata 라는 이름의 연습용 데이터 생성
mydata <- data.frame(age = 30:77, weight = rep(c(65,50),24))
head(mydata)
tail(mydata)
plot(mydata$age, mydata$weight) # 생성된 데이터 분포 시각적 확인
plot(mydata$age, mydata$weight * runif(nrow(mydata)), col=runif(nrow(mydata), min=1, max=10), pch=19, cex=runif(nrow(mydata))*2)
# create 2 age categories
mydata$agecat <- ifelse(mydata$age > 70,
c("older"), c("younger"))
mydata$agecat <- ifelse(mydata$age > 62,
c("older"), c("younger"))
# another example: create 3 age categories
mydata$agecat <- NA
attach(mydata)
mydata$agecat[age > 75] <- "Elder"
mydata$agecat[age > 45 & age <= 75] <- "Middle Aged"
mydata$agecat[age <= 45] <- "Young"
detach(mydata)
# attach 사용하지 않도록 수정?
mydata$agecat<- NA
#--- 변수명 변경 ----
names(mydata) <- c("age","weight","age_group")
names(mydata)
names(mydata)[3] <- "age_category"
names(mydata)
#--- 연산자 활용 ----
# http://www.statmethods.net/management/operators.html :: 연산자 표 참조
x <- c(1:10)
x[(x>8) | (x<5)] # OR
x[(x>8) | (x<5) | (x<3)] # OR
x[(x>8) & (x<5) & (x<3)] # AND
x <- c(1:10)
x
# 1 2 3 4 5 6 7 8 9 10
x > 8
x < 5
x > 8 | x < 5
x[c(T,T,T,T,F,F,F,F,T,T)]
mydata
mydata$age + 1
mydata$age * 1.5
mydata[mydata$age==36, ]
nrow(mydata[mydata$age!=36, ])
head(mydata[mydata$age!=36, ],10)
head(mydata[mydata$age>=70, ],10)
head(mydata[mydata$age>72 | mydata$age<32, ],10)
head(mydata[mydata$age>72 & mydata$weight<60, ],10)
head(mydata[mydata$age>72 & mydata$age_category=="Middle Aged", ],10)
#---- 기본 내장 함수 활용 ----
# http://www.statmethods.net/management/functions.html :: 함수표 참조
x <- -5:10
plot(x)
abs(x) # 절대값
plot(abs(x))
plot(x, abs(x))
x1 <- x/3
plot(x1)
x1
ceiling(x1) # 올림
trunc(x1) # 소수점이하 버림
round(x1,1) # 소수점 둘째자리에서 반올림
c1 <- c("I", "am", "Tom")
paste(c1[1], c1[2])
paste0(c1[1], c1[2])
paste0(c1[1], c1[2], c1[3])
head(paste0(as.character(mydata$age)," years old"))
c2 <- "abcde"
substr(c2,2,4) #sub string == subset of string
nchar(c2) # 문자열 character string의 글자수
# nrow() :: dataframe에서 행의 수를 보여줌
# length() :: 값이(구성 요소가) 몇개 들어있는지
substr(c2,2,nchar(c2)-2)
c3 <- "동해물과 백두산이"
substr(c3,2,3)
substr(c3,2,nchar(c3)-2)
#===== 무작위 값 생성 ======
runif(10, min=0, max=1)
plot(runif(10, min=0, max=1))
mean(runif(100, min=0, max=1))
mean(runif(10000, min=0, max=1))
mean(runif(100000, min=0, max=1))
mean(runif(1000000, min=0, max=1))
# 표본이 많아질수록 예상하는 중간값에 가까워진다는 것 확인
runif(10, min=-300, max=300) # 범위 변경
runif(10) # default 범위는 0~1
plot(rnorm(10, m=0, sd=1), type="l")
# 평균 0, 표준편차 1 기준의 무작위값 생성 (정규분포를 따르는)
hist(rnorm(1000, m=0, sd=1))
hist(rnorm(1000000, m=0, sd=1))
# hist(rnorm(1234567, m=0, sd=1))
plot(sort(rnorm(10000, m=0, sd=1)))
#--- paste와 substr 활용 ---
nums <- 1:10
chars <- c("day", "month", "year")
c(nums, chars)
paste(nums, chars)
paste(nums, chars, sep=" ~ ")
substr(chars, 1, 3)
nchar(chars) # string의 글자수 길이를 출력
substr(chars, min(nchar(chars))+1, max(nchar(chars)))
paste0(substr(chars, 1, 3), ".kr") # 결합시 공백 없는 결과
#=== 단순 통계 산출 및 값 자동 생성 ==========
#--- 단순 통계 ------------------
x <- c(20:60, 80:100, NA)
mean(x)
mean(x, trim=0.1, na.rm=T) # trim :: 큰값과 작은값 10% 씩을 제외
x <- c(20:60, 80:100, NA)
mean(x, trim=0.1) # NA
x <- c(20:60, 80:100)
mean(x)
var(x) # variance
sd(x) # standard deviation
median(x)
quantile(x)
range(x)
min(x)
max(x)
sum(x)
# 값 생성
seq(1, 100, 2) # 1에서 100까지 사이의 값을 2 간격으로 생성
seq(1, 300, 33) # 몇개 값이 만들어지나?
rep(2, 10)
rep(c("YES","no"), 10)
plot(seq(1,10,2), rep(3, 5))
#--- control structure 제어구조 --------------
# if 조건문
x <- c(20:60, 80:100)
if (mean(x)>40) "Large"
if (mean(x)>40 & length(x) >5) "Large"
if (mean(x)>40) 3^3
# if (x>40) "Large" # 에러
i<- 3
if(i==3) {
print("happy")
print("with R")
}
i<- 3
if(i==3) {
("happy")
("with R")
}
if(i==3) {print("happy") ; print("with R") }
a <- 10
ifelse(a> 20, plot(1:10), plot(10:1)) # 함수 형태의 if문
# 플롯처럼 명령을 넣는대신, 값만 결정되도록 하라!
a <- 10
plot(ifelse(a> 20, c(1:10), c(10:1))) # 함수 형태의 if문
# 한값만 찍힌건가 ??? 확인필요
# ===> ifelse() 함수는 한개의 값만 반환. Vector 등 여러 요소를
# 가진 개체를 반환하지 않음
ifelse(a> 20, 1, "틀렸음")
c <- 1:10
if(T) c # 값뿐 아니라 개체도 반환함. 명령 실행도 가능
if(T) plot(c)
ifelse(a> 20, "the value is small", "the value is large")
# for 반복문
for(i in 1:3) { print(x[i]*2) }
# 여러 줄의 명령을 사용하는 for loop 반복문
x <- c(5,8,9)
b <- 0
for(i in 1:3) {
b1 <- x[i]*2
b <- b + b1
}
b
# 연습 :: 1~10 합계 구하기 for 문을 활용
a <- 0
for(i in 1:100) {
a <- a+i
}
a
b <- ""
for(i in 1:100) {
b <- paste0(b,"A")
b <- paste0(b,i)
}
b
i=3
if(i==3) {
print("happy")
print("with R")
}
lengthx <- ifelse(length(x)>20, "long", "no")
#--- 기본문법 활용 연습 : 은행마케팅 데이터 ----------
# 블로그에 올려둔 데이터 파일 열기 import
bnk01 <- read.csv("https://t1.daumcdn.net/cfile/blog/99721B3359B3C43711?download")
str(bnk01)
head(bnk01)
nrow(bnk01)
plot(jitter(bnk01$age), jitter(bnk01$balance))
plot(jitter(bnk01$age), jitter(bnk01$balance)/1000, cex=0.5)
# 컬럼 선택
# 행 선택
# 잔고가 $20K 보다 큰 사람 몇명?
# 잔고가 $1K 보다 보다 작은 사람 몇명?
# 여성으로 30세이상 고객 몇명?
# 대출이 있는 사람중 20대의 잔고 평균은 ?
# 마케팅 성공한 사람들의 연령 평균은?
# 마케팅에 반응하지 않은 고객들의 잔고 평균은?
# 부분집합을 조건으로 선택
# 평균 보기
# 숫자간 계산으로 가공된 컬럼 추가
# --- 연령이 한 살 늘면 잔고가 얼마씩 커지나?
# --- 플롯을 그려보기
# 반복문 적용하기
# data type 데이터 형식 변환
# 30대 고객의 평균 잔고는 얼마인가
# 연습: 연령대를 10대 단위로 변환하라
# pasete와 substr 활용
# 직업의 앞 세자리만 추출해 kob_kd 라는 변수로 저장하라
# plot 작성 연습
#--- 추가 패키지 활용 ----------
# {base} 패키지가 제공하는 기본적인 사항을 보충하는 다수의 패키지 존재. 계속 증가 중
# 2017년 현재 1만개 이상의 패키지 존재
# version up 시 재설치 또는 update 필요
# 패키지 설치
install.packages("party")
install.packages(“party”) # 특수문자 따옴표 안됨!!!
library(party) # 설치된 패키지 로딩
# 설치된 패키지 목록 확인을 위한 명령
installed.packages()
head(installed.packages())
# 패키지 명칭만 확인
row.names(installed.packages())
# library() 대신 require()를 사용하면
# 패키지 로딩 성공여부 반환
# 정상 로딩되지 않으면 설치하게 하는 방식을 원할때 활용 가능
require(abc) # 내부처리 함수. Error 대신 Warning
require(abc)==T # F를 반환
#------ 파일로부터 데이터 입력 -----------
# setwd("C:/Users/xyxon/YONG/r_Y/GAMDFM/kbdaa") # 실제 위치를 입력!
# work directory 지정
# 데이터나 프로그램이 있는 컴퓨터 상의 위치 지정 (폴더)
mydata <- read.table("bankfa.csv", header=TRUE,
sep=",")
head(mydata)
head(mydata, 10)
tail(mydata)
nrow(mydata)
names(mydata)
dim(mydata) # dimension
mycsv <- read.csv("bankfa.csv", header=TRUE)
mycsv <- read.csv("bankfa.csv", header=F) # 문제발생!
# 컬럼이름을 데이터로 오해함
mycsv <- read.csv("bankfa.csv", header=F, skip=1)
# skip=1 의미는 한줄을 건너띔 === 컬럼명 줄은 무시
head(mycsv)
View(mycsv) # 더블클릭해서 dataframe을 보려고할때
# 파일에서 라인 단위로 입력
text1 <- readLines("sampletext.txt")
# incomplete final line found by ... 라는 경고 warning
# 의미와 조치
# 참고 :: http://stackoverflow.com/questions/5990654/incomplete-final-line-warning-when-trying-to-read-a-csv-file-into-r
# 텍스트 파일의 불필요한 문자 제거가 기본 조치
# install.packages("rJava") # 교재의 자바 설정 참조 - 먼저 자바설치
# library(rJava)
# install.packages("xlsx")
library(xlsx)
mydata <- read.xlsx("sample1.xlsx", 1) # 첫번째 시트에서
mydata <- read.xlsx("sample1.xlsx")
# 첫번째 시트에서 자동으로??? 안됨! 번호든 이름이든 지정 필수!
# read in the worksheet named mysheet
mydata <- read.xlsx("sample1.xlsx", sheetName = "custincome", row.names="id")
# 데이터 출력 Exporting Data ------------
mydata1 <- head(mydata)
write.table(mydata1, "mydata1.txt", sep="\t")
write.table(mydata1, "mydata2.txt", sep=",") # csv
write.csv(mydata1, "mydata2.csv") # csv
library(xlsx)
write.xlsx(mydata1, "mydata1.xlsx")
write.xlsx(mydata1, "mydata1.xlsx", sheet="mydata")
#--- 데이터 가공하기 ---------------
# 데이터 정렬
bnk01 <- read.csv("https://t1.daumcdn.net/cfile/blog/99721B3359B3C43711?download", header=T)
head(bnk01)
nrow(bnk01)
names(bnk01)
unique(bnk01$job) # 종류만 나옴
levels(bnk01$job) # 팩터니까 사용가능
head(bnk01$balance)
plot(bnk01$balance)
sort(bnk01$balance) # 정렬
head(sort(bnk01$balance))
tail(sort(bnk01$balance))
plot(sort(bnk01$balance))
plot(sort(bnk01$balance, decreasing=T))
# 데이터프레임 전체 정렬
newdata <- bnk01[order(bnk01$age),]
newdata$marital
newdata$marital[1] # 맨앞값
newdata$marital[nrow(newdata)] # 맨뒷값
newdata$marital[c(1,nrow(newdata)) ] # 맨앞, 맨뒷값
newdata <- bnk01[order(-bnk01$age),] # 역순으로 정렬
# 컴마를 꼭 써줄 것!!
plot(newdata$balance)
newdata <- bnk01[order(bnk01$age, -bnk01$balance),]
plot(newdata$age)
plot(newdata$balance)
plot(newdata$age, newdata$balance)
# 연습1 :: 직업순으로 정렬해서 balance를 플롯으로!
# 연습2 :: 직업순, 잔고순으로 정렬해서 잔고를 플롯으로!
# 연습3 :: 직업순, 결혼상태순, 잔고순으로 정렬해서 잔고를 플롯으로!
plot(bnk01[order(bnk01$job, bnk01$balance),]$balance)
#---- 데이터 결합 ---------------
# 컬럼 결합
df1 <- data.frame(ID=1:5, age=30:34)
df2 <- data.frame(ID=1:5, Nationality=c("Korean","English","Cuban","English","Cuban"))
df3 <- merge(df1, df2, by="ID") # 머지바이
# 머지는 순서를 맞춘다. by 기준으로 붙이니까
# 머지는 한번에 두개씩만.
df11 <- cbind(df1, df2)
df1 <- head(df1[order(-df1$age),],3 )
df11 <- cbind(df1, df2)
# 순서를 확인하지 않고 cbind 쓰면 사형!
df3 <- merge(df1, df2, by="ID") # 머지바이
df3 <- merge(df2, df1, by="ID", all.x=T) # 어느 쪽 기준?
# 앞이 x, 뒤가 y
df2 <- data.frame(ID=1:4, Nationality=c("Korean","Cuban","English","Cuban"))
df3 <- merge(df1, df2, by="ID")
df4 <- merge(df1, df2, by="ID", all.x=T)
df2 <- data.frame(ID=c(1:4,6), Nationality=c("Korean","Cuban","English","Cuban", "Korean"))
df3 <- merge(df1, df2, by="ID")
df4 <- merge(df1, df2, by="ID", all.x=T, all.y=T)
# 행 결합
df5 <- df4[1,]
df6 <- df4[3:4,]
df7 <- rbind(df6, df5)
df7[nrow(df7)+1,] <- c(7,36, "Cuban") # 행추가
df7[-4,] # 일부 행을 지정해서 제외
df8 <- cbind(df7, a1 = 5:3) # 컬럼추가
df9 <- cbind(df7, badness = 1:3) # 컬럼추가
#--- 집계 aggregation ----------
b02 <- head(bnk01,15)[,c(1:4,8:10)]
b02
# b03 <- head(bnk01,10)[,c("marital", "loan")]
# 정확한 이름을 주든, 순서를 제대로 지키든 !!
agg1 <-aggregate(b02$age, by=list(b02$marital),
FUN=mean, na.rm=TRUE)
names(agg1) <- c("marital","avg_age")
agg1
agg1 <-aggregate(b02$age, by=list(b02$marital),
FUN=median, na.rm=TRUE)
names(agg1) <- c("marital","med_age")
agg1 <-aggregate(b02$age, by=list(b02$marital),
FUN=length)
names(agg1) <- c("marital","cnt_age")
#===== 데이터 모양 변경 reshaping =====
library(xlsx)
mydata <- read.xlsx("sample1.xlsx", 1)
t(mydata) # 가로 세로 변환 (행렬 바꾸기) transpose
mydata2 <- mydata[,2:4]
# reshape 패키지 사용
mydata <- data.frame(id=c(1,1,2,2), time=c(1,2,1,2), x1=c(5,3,6,2), x2=c(6,5,1,4))
# install.packages("reshape")
library(reshape)
mdata <- melt(mydata, id=c("id","time"))
# melt : 변수를 값으로 변형
# wide format에서 long format으로
subjmeans <- cast(mdata, id~variable, mean)
# cast : 변수별 대표값 산출
subjsums <- cast(mdata, id~variable, sum)
# melt한 것이 아니라도 melt로 나올수 있는
# 형태를 갖춘 데이터라면 dataframe도 cast 적용가능
#---- 데이터 부분집합 추출 ----
# 일부 변수만 추출
names(bnk01)
myvars <- c("job", "marital")
newdata <- bnk01[myvars]
head(newdata)
newdata <- bnk01[c(1,5)]
head(newdata)
newdata <- bnk01[,c(1,5)]
head(newdata)
newdata <- bnk01[,c(1:2,5)]
head(newdata)
# 일부 변수만 제외
newdata <- bnk01[names(bnk01)!="marital"]
head(newdata)
newdata <- bnk01[c(-3,-5)]
newdata <- bnk01
newdata$age <- NULL
# 행 추출 Selecting Observations
newdata <- bnk01[1:3,]
newdata <- bnk01[bnk01$marital=="married" & bnk01$balance>20000,]
head(newdata)
nrow(newdata)
newdata <- subset(bnk01, job == "retired" | balance < 100,
select=c(age, job, loan, balance))
head(newdata)
#---- 행중에서 무작위로 표본 추출 ----------
mysample <- bnk01[sample(1:nrow(bnk01), 5, replace=FALSE),] # 5개 행을 무작위 추출
sample(1:100, 5)
sample(bnk01$balance, 10)
#----- apply 함수 활용 (Skip OK!) ----
m <- matrix(c(1:5, 11:15), nrow = 5, ncol = 2)
# 행별의 평균 계산
apply(m, 1, mean)
apply(m, 1, diff)
# 컬럼별 평균 계산
apply(m, 2, mean)
# apply(m, 1:2, mean) # 똑같은 값 나옴
# 값을 2로 나눈 값 계산
apply(m, 1:2, function(x) x/3)
apply(m, 1:2, diff)
df <- data.frame(a=1:5, b=11:15, c=101:105)
apply(df, 1, mean)
apply(df, 1:2, mean) # 행X열 로 대상 좁힌 경우
apply(df, 1, sd)
apply(df, 2, median)
apply(df, 2, function(x) x^2/3)
df1 <- df
df1$direction <- as.factor(c(rep("North",2), rep("East",3)) )
by(df1[, 1:3], df1$direction, colMeans)
dff <- by(df1[, 1:3], df1$direction, colMeans)
str(dff)
dff[["East"]] # list 형태의 dff에서 East 항목 내용 출력
# [질문] 리스트에서 복수의 요소를 한번에 추출하되
# 그 값만 가져오려면?
l <- list(a = 1:10, b = 11:30)
l1 <- lapply(l, median)
l1[["b"]]
l[1]
# sapply는 lapply의 사용자 편의 제고 버전
# 가능하다면(= 가능한 경우라면) 결과를 vector나 매트릭스로 반환
l2 <- sapply(l, median)
l2[1]
str(l2) # named numeric
l3 <- lapply(l, median)
l3[[1]]
str(l3) # named numeric
#--- 복제 ----
replicate(3, 1:10)
replicate(3, 1:10) * (1:3)
replicate(3, 1:10) ^ (5:7)
replicate(3, 1:10)
str(replicate(3, 1:10) ) # 형식 확인
is.matrix(replicate(3, 1:10) ) # 매트릭스인가?
replicate(3, matrix(1:12, nrow=3, ncol=4))
str(replicate(3, matrix(1:12, nrow=3, ncol=4)) )
is.matrix(replicate(3, matrix(1:12, nrow=3, ncol=4)))
# 2차원만 매트릭스라고 부름
replicate(3, 1:10) * (1:3)
replicate(3, 1:10) ^ (1:3)
#----- 기본함수 활용 연습 -----------
vec1 <- sample(1:100,25)
vec2 <- rep(c(3,4,5,8),5)
length(vec1)
vec3 <-sort(vec1)
plot(vec3[1:20] * 1.5, sort(vec2, decreasing=T))
df1 <- data.frame(var1=vec2, var2=vec3[3:22])
df1$class_name <- rep(c("black","green"),10)
df2 <- rbind(head(df1,3), tail(df1,5))
df2$var3 <- df2$var1 * df2$var2 * 1.27
names(df2) <- c("students", "quality", "class_type", "performance")
head(df2)
t(df2)
#---- 미국 인구 데이터를 사용한 데이터 가공 연습
# : 증가와 증가율 -----
library(car) # USPop 데이터 포함 - 데이터를 사용하기 위해 호출
data(USPop)
head(USPop)
str(USPop)
plot(USPop$population)
plot(USPop$year, USPop$population, type='b')
USPop1 <- USPop
USPop1$population1 <- round(USPop$population,1)
USPop1$population2 <- round(USPop$population,2)
tail(USPop)
USPop1$population[1:(length(USPop1$population)-1)]
USPop1$population[2:(length(USPop1$population))]
USPop1$population[2:(length(USPop1$population))] - USPop1$population[1:(length(USPop1$population)-1)]
c(NA, USPop1$population[2:(length(USPop1$population))] - USPop1$population[1:(length(USPop1$population)-1)])
# 증가율 구하기
USPop1$populationIncr <- c(NA, USPop1$population[2:(length(USPop1$population))] - USPop1$population[1:(length(USPop1$population)-1)])
plot(USPop1$year, USPop1$populationIncr)
USPop1$populationIncrRate <-c(NA, USPop1$populationIncr[2:(length(USPop1$populationIncr))]/USPop1$population[1:(length(USPop1$population)-1)])
head(USPop1)
plot(USPop1$year, USPop1$populationIncr)
plot(USPop1$populationIncr, USPop1$populationIncrRate)
plot(USPop1$year, USPop1$populationIncrRate)
#---- Self-Reported Weight and Height ------------
library(car)
data("Davis")
str(Davis)
head(Davis)
# 실제와 사람이 말하는 키와 몸무게 차이 데이터
colMeans(Davis[,2:5])
colMeans(Davis[,2:5], na.rm=T)
Davis1 <- Davis # 복사본 만들기
Davis1$repwt_diff <- Davis$repwt - Davis$weight
plot(sort(Davis1$repwt_diff, decreasing=T))
plot(Davis1$weight, Davis1$repwt_diff/Davis1$weight)
plot(Davis1$weight, Davis1$repwt)
Davis2 <- Davis1[abs(Davis1$repwt_diff)<10,]
plot(Davis2$weight, Davis2$repwt_diff)
plot(Davis2$height, col=Davis2$sex)
# plot(Davis2$height,Davis2$weight, col=Davis2$sex)
Davis2$hgroup <- substr(as.character(Davis2$height),1,2)
Davis2$hgroup <- paste0(Davis2$hgroup, "X")
agg1 <-aggregate(Davis2$weight, by=list(Davis2$hgroup),
FUN=mean)
names(agg1) <- c("heightgroup","avg_weight")
agg2 <-aggregate(Davis2$repwt, by=list(Davis2$hgroup),
FUN=mean)
names(agg2) <- c("heightgroup","avg_repwt")
agg3 <-aggregate(Davis2$repwt, by=list(Davis2$hgroup),
FUN=length)
names(agg3) <- c("heightgroup","countobs")
agg <- cbind(agg1, agg2[,2], agg3[,2])
agg4 <- merge(agg1, agg2, by="heightgroup") # avg_weight, avg_repwt 결합
agg4 <- merge(agg4, agg3, by="heightgroup") # 건수 추가
plot(agg4$avg_weight, agg4$avg_repwt, cex=agg4$countobs/10)
#==== 탐색적분석 EDA ======
#=== 시각화기초 :: 플롯과 스캐터 플롯 plot and scatter plot =====
plot(1:10)
plot(1:10, 20:11)
head(bnk01)
plot(bnk01$age, bnk01$balance)
abline(lm(bnk01$balance~bnk01$age), col='red')
# 선형회귀선 추가
title("Regression of Balance on age") # 제목 삽입
title("나이에 따라 잔고가 차이나는가") # 제목 삽입
# 단위와 범위를 조절해서 다시 보기
plot(bnk01$age, bnk01$balance/1000, ylim=c(1,20))
abline(lm(bnk01$balance/1000~bnk01$age), col='red')
# --- 출력 결과 파일로 저장 ----
# pdf 파일 출력
pdf("mygraph.pdf")
# png("mygraph.png")
plot(bnk01$age, bnk01$balance/1000, ylim=c(1,20))
abline(lm(bnk01$balance/1000~bnk01$age), col='red')
title("Regression of 연령별 잔고의 관계 ") # 제목 삽입
dev.off()
#--- 히스토그램 histogram ----
hist(bnk01$balance)
hist(bnk01$balance, breaks=100, col="lightblue")
# Kernel Density Plot
plot(density(bnk01$balance))
polygon(density(bnk01$balance), col="red", border="blue") # 색상 채우기
plot(c(10:1,1:10))
plot(c(10:1,1:10), type="l") # type="line"
polygon(c(10:1,1:10), col="red") # 색상 채우기
plot(c(10:1,1:10))
polygon(c(10:1,1:10), col="red") # 색상 채우기
plot(c(10:1,1:10), type="p")
#--- dot plot ----
dept <- data.frame(dept_name=c("Mathmatics","Computer Science", "Statistics"),
students=c(300,100,120))
dept
dotchart(dept$students,labels=dept$dept_name,
main="Students by Department")
# mtcars - 유명한 연습용 데이터 셋 - 설명
head(mtcars)
dotchart(mtcars$mpg,labels=row.names(mtcars),
main="mpg of cars")
mtcars1 <- mtcars[order(mtcars$mpg),]
dotchart(mtcars1$mpg,labels=row.names(mtcars1),
main="mpg of cars")
# ... 응용 예제 ...
# aggretate 명령 예제 복사하기
agg2 <-aggregate(Davis2$repwt, by=list(Davis2$hgroup),
FUN=mean)
names(agg2) <- c("heightgroup","avg_repwt")
# 수정해서 처리 - 데이터 만들기
jobs1 <-aggregate(bnk01$balance, by=list(bnk01$job),
FUN=median)
names(jobs1) <- c("job","잔고(중위수)")
jobs1
jobs2 <- jobs1[order(jobs1$'잔고(중위수)'),]
dotchart(jobs2$'잔고(중위수)',labels=jobs2$job,
main=" 직업별 잔고 중위수 ")
#-[DAY2 ~~ ]-- 막대그래프 --- bar plot --------
bal01 <- table(as.integer(bnk01$balance/1000))
barplot(bal01, main="잔고 분포",
xlab="balance/k")
counts <- table(bnk01$job)
barplot(counts, main="직업별 고객 분포 " )
barplot(table(mtcars$vs), main="vs Distribution",
xlab="vs")
# 한번에 라벨을 달아서
# 숫자 값에 각각 이름을 붙여주었기에
# barplot 명령에서 추가로 지정 안해도 됨
ss <- as.table(dept$students)
names(ss) <- dept$dept_name
ss
barplot(ss, main="Student Distribution by Department",
xlab="Department")
# 가로 막대로 방향 전환
barplot(ss, main="Student Distribution by Department",
ylab="Department", horiz=T, col="lightgreen")
# stacked bar plot
counts <- table(bnk01$marital, bnk01$job)
par_def <- par() # 현재의 설정을 임시 저장
par(cex.axis=0.7) # 축의 글자를 조금 작게
barplot(counts, main="결혼상태와 직업별 고객수 분포",
xlab="직업", col=c("lightblue", "darkblue"),
legend = rownames(counts))
par(par_def) # 본래의 설정으로 되돌리기
counts <- t(counts)
barplot(counts, main="직업별 결혼상태별 고객수 분포",
xlab="결혼상태", col=c(1:10),
legend = rownames(counts))
# 그룹이 많으면 stack 이 도움되지 않음
# 그룹별 바플롯 Grouped bar plot
counts <- t(counts)
par_def <- par() # 현재의 설정을 임시 저장
par(cex.axis=0.7)
barplot(counts, main="결혼상태별 직업별 고객수 분포",
xlab="직업", col=c("red", "darkblue", "lightgreen"),
legend = rownames(counts),
beside=TRUE)
par(par_def) # 본래의 설정으로 되돌리기
#--- 라인 챠트 ------------
b03 <- bnk01[order(bnk01$age, bnk01$balance), ]
plot(b03$age, b03$balance, type="l")
par(pch=22, col="blue") # plotting symbol and color
par(mfrow=c(2,4)) # all plots on one page
opts = c("p","l","o","b","c","s","S","h")
#[추가사항] 각 심볼 설명 링크 필요
for(i in 1:length(opts)){
heading = paste("type=",opts[i])
plot(b03$age, b03$balance, type="n", main=heading)
lines(b03$age, b03$balance, type=opts[i])
}
par(mfrow=c(1,1))
# 선추가
plot(b03$age, b03$balance, type="n", main=heading) # 빈 박스만 그리기
lines(b03$age, b03$balance, type="l", col="red")
lines(b03$age+10, b03$balance, type="l", col="green")
#---- box plot 박스플롯 -------
par(pch=19, col="black")
boxplot(balance~marital,data=bnk01, main="결혼상태별 잔고",
xlab="결혼상태", ylab="잔고")
boxplot(balance~job,data=bnk01, main="직업별 잔고",
xlab="직업", ylab="잔고")
# 너무 크고 작은 구간은 무시하고 보기
boxplot(balance~job,data=bnk01, main="직업별 잔고",
xlab="직업", ylab="잔고", ylim=c(-5000,5000))
# grouped boxplot
boxplot(balance~interaction(marital, loan), data=bnk01,
main="결혼상태별 대출여부별 잔고",
xlab="결혼상태와 대출여부", ylab="잔고")
# 박스플롯 해석
# http://www.wellbeingatschool.org.nz/information-sheet/understanding-and-interpreting-box-plots
# http://flowingdata.com/2008/02/15/how-to-read-and-use-a-box-and-whisker-plot/
boxplot(mtcars$hp~mtcars$vs)
#---- scatter plot 산점도 -----------
library(car)
data("Davis")
plot(Davis$height, Davis$weight, pch=19)
plot(Davis$height, Davis$repht, pch=19)
# Add fit lines
abline(lm(Davis$repht ~ Davis$height), col="red")
# regression line (y~x)
#locally weighted scatterplot smoothing (polynomial fit)
lines(lowess(Davis$height, Davis$repht), col="blue")
# lowess line (x,y)
plot(mtcars$cyl, mtcars$hp)
abline(lm( mtcars$hp ~ mtcars$cyl), col="red")
# Enhanced Scatterplot
# by Semester
# install.packages("car")
library(car)
scatterplot(age ~ balance | marital, data=bnk01,
xlab="balance ", ylab="age",
main="Enhanced Scatter Plot")
# by loan
scatterplot(age ~ balance | loan, data=bnk01,
xlab="balance ", ylab="age",
main="Enhanced Scatter Plot")
# 표본이 너무 많아 시각적으로 구별이 어려울 경우
# 무작위 표본 활용 고려
bnk01_smp <- bnk01[sample(1:nrow(bnk01),1000),]
plot(bnk01_smp$balance, bnk01_smp$age)
scatterplot(age ~ balance | loan, data=bnk01_smp,
xlab="balance ", ylab="age",
main="Enhanced Scatter Plot")
#--- scatterplot 매트릭스 -----
mycsv <- read.csv('https://t1.daumcdn.net/cfile/blog/991E7A3359BDDF6837?download')
str(mycsv)
head(mycsv)
# 다국적 학생들의 수업 참여 상태
pairs(~ raisedhands+Discussion+AnnouncementsView,data=mycsv,
main="Simple Scatterplot Matrix")
# Scatterplot Matrices from the car Package
library(car)
scatterplotMatrix(~raisedhands+Discussion+AnnouncementsView | gender,data=mycsv,
main="Gender")
# High Density Scatterplot with Binning
install.packages("hexbin")
library(hexbin)
bin<-hexbin(mycsv$raisedhands, mycsv$Discussion, xbins=50)
plot(bin, main="Hexagonal Binning")
# use transparency
plot(mycsv$raisedhands, mycsv$Discussion,
main="Transparent Scatterplot Example", col=rgb(0,100,0,50,maxColorValue=255), pch=16)
# color code check
col2rgb("darkgreen")
col2rgb("lightblue")
col2rgb("blue")
# use slightly light blue
plot(mycsv$raisedhands, mycsv$Discussion,
main="Transparent Scatterplot Example", col=rgb(0,0,200,100,maxColorValue=255), pch=19)
# 3D Scatterplot
# install.packages("scatterplot3d")
library(scatterplot3d)
scatterplot3d(mycsv$raisedhands, mycsv$Discussion, mycsv$AnnouncementsView, main="3D Scatterplot")
# Spinning 3d Scatterplot
# 마우스를 사용하여 회전시킬 수 있음
# install.packages("rgl")
library(rgl)
plot3d(mycsv$raisedhands, mycsv$Discussion, mycsv$AnnouncementsView, main="3D Scatterplot",
col="blue", size=5) # size는 포인트 사이즈
#---- 파이 챠트 pie chart --------
tbNt <- table(mycsv$NationalITy)
pie(tbNt, main="국적별 인원수")
tbNt <- table(mycsv$gender)
pie(tbNt, main="성별 인원수")
# 파이 그래프는 시각적 왜곡을 유발하기 쉽기에 활용을 권장하지 않음
#----- Graphical Parameters -----
# Set a graphical parameter using par()
# par() # view current settings
# opar <- par() # make a copy of current settings
# par(col.lab="red") # red x and y labels
# hist(mtcars$mpg) # create a plot with these new settings
# par(opar) # restore original settings
dept <- data.frame(dept_name=c("Mathmatics","Computer Science", "Statistics"),
students=c(300,100,120))
par()
opar <- par()
par(col.lab="blue", col.main="brown")
ss <- as.table(dept$students)
names(ss) <- dept$dept_name
barplot(ss, main="Student Distribution by Department",
xlab="Department")
par(col.lab=opar$col.lab)
par(opar)
par(lwd=3, col.axis="grey")
barplot(ss, main="Student Distribution by Department",
xlab="Department")
par(lwd=1, col.axis="black")
par(lty="dotted")
barplot(ss, main="Student Distribution by Department",
xlab="Department")
# http://statmethods.net/advgraphs/parameters.html :: 파라미터 표 참조
aa <- c(3, 4, 7, 9)
plot(aa)
aa <- c(3, 4, 7, 9)
plot(aa, pch="【 ", cex=aa) # pch:: point char
# 플롯 심볼
x <- 0:25
plot(x, pch=x, cex=2)
# 라인 유형
x <- 1:6
plot(x, 1:6, type="n")
for(i in 1:6){
lines(x-1+i, rep(i,6), type="l", lty=i) # line type
}
# 색상표
length(colors())
head(colors())
x <- 0:25
plot(x, pch=15, col=491)
# r color chart
plot(1:30, pch=15, col=colors()[1:30])
plot(31:60, pch=15, col=colors()[31:60])
plot(601:630, pch=15, col=colors()[601:630])
# 폰트 변경
# Type family examples - creating new mappings
plot(1:10,1:10,type="n")
windowsFonts()
windowsFonts(
A=windowsFont("Arial Black"),
B=windowsFont("Bookman Old Style"),
C=windowsFont("Comic Sans MS"),
D=windowsFont("Symbol")
)
text(3,3,"Hello World Default")
text(4,4,family="A","Hello World from Arial Black")
text(5,5,family="B","Hello World from Bookman Old Style")
text(6,6,family="C","Hello World from Comic Sans MS")
text(7,7,family="D", "Hello World from Symbol")
#----- 플롯에서의 한글 폰트 import 그리고 사용 ----------
library(extrafont)
font_import(pattern="malgun" )
fonts() # import 확인 및 family 명칭 확인
# loadfonts(device="win") # import 후 처음에만 필요
# par(family="Malgun Gothic")
#---- 폰트 import를 마친 이후의 폰트 사용변경 설정 ----
library(extrafont)
par1 <- par() # 기본 옵션 임시 저장
par(family="Malgun Gothic") # 폰트 사용
# par(par1) # 기본 옵션으로 복원시
#-------------------------------------
plot(1:10, main="예쁜 그림으로 그리려고 했음")
#---- 한글 폰트가 보이지 않을 경우 인코딩 변경
a <- "브랜드 평판 지수"
b <- iconv(a, "UTF-8", "EUC-KR") # encoding 변경 함수
c <- iconv(a, "UTF-8", "EUC-KR")
d <- iconv(a, "UTF-8", "UTF-8")
#---- 여백 margin
par()$mar
# {bottom, left, top, right} 순서
par(mar=c(5, 4, 4, 2) + 2)
par(mar=c(5, 4, 4, 2)) # default
# 축과 텍스트 Axes and Text
# Specify axis options within plot()
plot(1:10, 1:10, main="title", sub="subtitle",
xlab="X-axis label", ylab="y-axis label",
xlim=c(0, 15), ylim=c(0, 15))
plot((1:10)^2.15, 1:10, main="title", sub="subtitle",
ylab="y-axis label",
xlim=c(0, 15), ylim=c(0, 15))
# 타이틀을 별도로 추가
plot(1:10, 1:10, xlab="", ylab="")
title(main="main title", sub="sub-title",
xlab="x-axis label", ylab="y-axis label")
# Add a red title and a blue subtitle. Make x and y
# labels 25% smaller than the default and green.
plot(1:10, 1:10, xlab="", ylab="")
title(main="My Title", col.main="red",
sub="My Sub-title", col.sub="blue",
xlab="My X label", ylab="My Y label",
col.lab="green", cex.lab=0.75, cex.main=1.5)
# 주석 텍스트 추가
plot(1:10, (1:10)^2)
text(2,6, "text to place" )
text(5,20, "이 지점에서 사고" )
text(2,6, "text to place", pos=3 , col="blue")
plot(1:10, 1:10, xlab="", ylab="")
mtext("text to place", side=2, line=3, family="serif")
mtext("text to place", side=3, line=1, family="mono")
mtext("text to place : line=2", side=3, line=2, col="blue", family="sans")
mtext("text to place : line=-1", side=3, line=-1, col="blue", cex=0.6)
# 점에 대한 라벨 추가 labeling points
plot(1:10, 1:10, pch=18, col="blue")
text(1:10, 1:10, rep(c("A","b"),5), cex=0.6, pos=4, col="red")
# 참조선 추가 #=============
plot(mycsv$raisedhands, mycsv$Discussion)
abline(h=20, lty=2, col="blue")
abline(v=c(20, 60, 80), lty=2, col="red")
plot(mycsv$raisedhands, mycsv$Discussion)
abline(h=20, v=40, lty=2, col="blue")
plot(mycsv$raisedhands, mycsv$Discussion)
abline(v=seq(0,100,10),lty=2,col="blue")
abline(h=seq(0,100,25),lty=2,col="red")
# 자동 설정으로 참조선 생성
plot(mycsv$raisedhands, mycsv$Discussion)
grid()
grid(col="red")
# 셀의 갯수 지정, 컬러 변경
plot(mycsv$raisedhands, mycsv$Discussion)
grid(4,2, col="darkgrey")
# 범례 추가
# Legend Example
attach(mtcars)
boxplot(mpg~cyl, main="Milage by Car Weight",
yaxt="n", xlab="Milage", horizontal=TRUE,
col=terrain.colors(3))
legend("topright", inset=.05, title="Number of Cylinders",
c("4","6","8"), fill=terrain.colors(3), horiz=TRUE)
boxplot(mycsv$Discussion ~ mycsv$gender, main="Discussion by Gender",
yaxt="n", xlab="Discussion", horizontal=TRUE,
col=colors()[c(10,100)])
legend("topright", inset=.05, title="Number of Cylinders",
c("4","6","8"), fill=terrain.colors(3), horiz=TRUE)
# 한번에 다수의 그래프 표시
par(mfrow=c(3,1))
hist(mycsv$raisedhands)
hist(mycsv$Discussion)
hist(mycsv$AnnouncementsView)
par(mfrow=c(1,1))
#--- heatmap 생성 ---------
# 데이터 준비 -- 2017.4.28 기준 프로야구 팀 성적 순위
team <-c( "KIA", "NC", "LG", "SK","롯데", "kt", "두산", "넥센", "한화", "삼성")
win <- c(17,15,13,12,12,11,10,10,10,3)
tie <- c(0,1,0,0,0,0,1,0,0,2)
lose <- c(6,7,10,11,11,12,12,13,13,18)
teamstanding <- data.frame(win, tie, lose)
row.names(teamstanding) <- team
# 매트릭스 형식으로 데이터 생성
teammat<- as.matrix(teamstanding)
heatmap(teammat)
heatmap(teammat, Rowv=NA, Colv=NA, col = cm.colors(256), scale="column", margins=c(5,10))
heatmap(teammat, Rowv=NA, Colv=NA, col = rainbow(7), scale="column", margins=c(5,10))
heatmap(teammat, Rowv=NA, Colv=NA, col = blues9, scale="column", margins=c(5,10))
heatmap(teammat, Rowv=NA, Colv=NA, col = heat.colors(5), scale="column", margins=c(5,10))
#--- 반대로 색상을 바꾸기 ----
win1 <- max(win) - win
tie1 <- max(tie) - tie
lose1 <- max(lose) - lose
teamstanding1 <- data.frame(win=win1, tie=tie1, lose=lose1)
row.names(teamstanding1) <- team
teammat1 <- as.matrix(teamstanding1)
heatmap(teammat1, Rowv=NA, Colv=NA, col = heat.colors(10), scale="column", margins=c(5,10))
#--- 팔레트 순서를 변경하는 예제 (Alternatively) ---
heatcols <- 1:10
names(heatcols) <- heat.colors(10)
heatcols <- sort(heatcols, decreasing=T)
plot(1:10, col=names(heatcols), pch=19)
heatmap(teammat1, Rowv=NA, Colv=NA, col = heatcols, scale="column", margins=c(5,10))
#---[ mtcars 데이터를 사용한 플롯 작성 연습 ]-------
plot(mtcars$wt, mtcars$mpg,
pch=19, # 점모양 안에 색이 칠해진 원 형태로
col=colors()[ifelse(mtcars$hp>median(mtcars$hp), 402 , 385)],
cex=mtcars$hp/100, # 점의 크기
main="연비와 무게간 관계 :: mtcars(원크기는 마력)" ,
xlab="무게", ylab="연비"
)
# color()[385 ] == "khaki3"
# color()[402 ] == "lightblue3"
abline(lm( mtcars$mpg ~ mtcars$wt),
lty=2, # 선의 종류를 점선으로 line type
col="darkgrey") # lm 선형회귀분석
abline(h=20)
lines(lowess(mtcars$mpg~mtcars$wt), col="orange", lty=3) # 폴리노미얼 커브 추가
text(mtcars$wt, mtcars$mpg, labels=ifelse(mtcars$wt>3, row.names(mtcars), ""),cex=0.5, pos=3) # 자동차 이름을 글자로 추가
text(median(mtcars$wt)*1.5, median(mtcars$mpg)*1.4, labels="무게3.5, 연비15 근처가 \n 최악의 집단 ", cex=0.7) # 주석(설명) 추가
grid(col="darkgrey") # 기본색상을 변경한 참조선 그리드
#------------------
#---[A06]--- 기초 통계 분석 --------------
getwd() # 현재 지정된 작업폴더 확인
setwd("C:/Users/dataanalysis/Desktop/DA/scrpt_data")
# 작업폴더 지정 - 어디서 파일을 불러올 것인지
mycsv <- read.csv("xAPI-Edu-Data.csv", header=TRUE)
mycsv <- read.csv("C:/Users/dataanalysis/Desktop/DA/scrpt_data/xAPI-Edu-Data.csv", header=TRUE)
#---- Descriptive Statistics 기술통계 ---------
head(mycsv)
# 건수 확인
nrow(mycsv)
length(mycsv$raisedhands)
# 대표값 산출
max(mycsv$raisedhands)
# 내림차순으로 정렬한 후 첫번째 값이 최소값
sort(mycsv$raisedhands, decreasing=T)[1]
# 오름차순으로 정렬한 후 마지막 값이 최소값
sort(mycsv$raisedhands)[length(mycsv$raisedhands)]
min(mycsv$raisedhands)
# 오름차순으로 정렬한 후 첫번째 값이 최소값
sort(mycsv$raisedhands)[1]
mean(mycsv$raisedhands)
# 합계를 건수로 나눈 것이 평균값
sum(mycsv$raisedhands)/length(mycsv$raisedhands)
median(mycsv$raisedhands) # 중위수
sort(mycsv$raisedhands)[floor(length(mycsv$raisedhands))/2]
sort(mycsv$raisedhands)[240]
# mode :: 최빈값
table(mycsv$raisedhands)
max(table(mycsv$raisedhands))
# 최빈값 확인
tail(sort(table(mycsv$raisedhands)))
# 분산 variance
var(mycsv$raisedhands)
raisedhands1 <- sort(mycsv$raisedhands)
plot(raisedhands1, ylim=c(-100,100))
# 평균과의 차이
lines(raisedhands1 - mean(raisedhands1), lty="dotted")
# 편차
raisedhands1 - mean(raisedhands1)
# 편차의 합 -- 0 값을 가지는 것이 정상
sum(raisedhands1 - mean(raisedhands1))
# 편차 제곱의 합
sum((raisedhands1 - mean(raisedhands1))^2)
# 편차 제곱의 평균 == 분산 variance
mean((raisedhands1 - mean(raisedhands1))^2)
# 표준편차 standard deviation
sd(mycsv$raisedhands)
# 분산의 제곱근
sqrt(var(mycsv$raisedhands))
sqrt(mean((raisedhands1 - mean(raisedhands1))^2))
# 분산의 계산에서 모집단이 아닌 표본의 자유도인 n-1로 나누기 때문에 차이 발생
round(sqrt(var(mycsv$raisedhands)),2) # 소수점 2째 자리에서 반올림
# 여러 값을 하나의 문자열 처럼 연속해서 화면에 출력
cat("표준편차 = ", round(sqrt(var(mycsv$raisedhands)),2))
c1 <- cat("a","b")
# 반올림으로 소수점 없앤 경우
round(sqrt(var(mycsv$raisedhands)))
# 문자열로 결합하는 함수 사용 경우
paste("표준편차 = ", round(sqrt(var(mycsv$raisedhands)),2))
# 변동계수 coefficient of variance
# 변동성의 크기를 상대적으로 설명하기 위한 값
sd(mycsv$raisedhands) / mean(mycsv$raisedhands)
#---- NA가 포함된 경우의 처리 ----
numvec <- c(1:5, NA, 7:10)
numvec
mean(numvec)
mean(numvec, na.rm=T) # remove NA
sum(numvec)
sum(numvec, na.rm=T)
# vector의 element 확인
length(numvec)
numvec[!is.na(numvec)]
length(numvec[!is.na(numvec)])
summary(numvec)
# 분위수 구하기 - 기본은 4개 분위
quantile(mycsv$raisedhands)
str(quantile(mycsv$raisedhands)) # named num
barplot(quantile(mycsv$raisedhands))
# 4분위수
quantile(mycsv$raisedhands, 1/4)
quantile(mycsv$raisedhands, (1:4)/4)
barplot(quantile(mycsv$raisedhands, (1:4)/4))
# 4분위수 출력
boxplot(mycsv$raisedhands)
# box의 상/하위가 각각 1/4 지점
# 10분위수
quantile(mycsv$raisedhands, (1:10)/10)
barplot(quantile(mycsv$raisedhands, (1:10)/10))
# get means for variables in data frame mycsv
# excluding missing values
sapply(mycsv, mean, na.rm=TRUE)
str(mycsv)
sapply(mycsv, is.integer)
lapply(mycsv, is.integer) # 리스트로 출력
# 정수형 변수만 추출해 다른 데이터프레임으로 저장
mycsv1 <- mycsv[, sapply(mycsv, is.integer)]
sapply(mycsv1, mean, na.rm=TRUE)
sapply(mycsv1, median, na.rm=TRUE)
summary(mycsv1)
#---- Frequency 명목형 변수 건수 구하기 ----
table(mycsv$gender)
summary(table(mycsv$gender))
table(mycsv$gender, mycsv$NationalITy)
table(mycsv$NationalITy, mycsv$gender)
# 독립성 결과를 기본으로 출력
summary(table(mycsv$gender, mycsv$NationalITy))
table(mycsv$gender, mycsv$Semester)
t1 <- table(mycsv$gender, mycsv$Semester)
str(t1)
margin.table(t1, 1) # Semester 합산
margin.table(t1, 2) # 성별 합산
# 컬럼, 행 합계 포함
addmargins(t1, 1)
addmargins(t1, 2)
addmargins(t1)
# 값을 비율로 표시
prop.table(t1,1)
prop.table(t1,2)
prop.table(t1)
# 비율의 합계 추가
addmargins(prop.table(t1))
# 3차원 테이블의 경우
mytable <- table(mycsv$gender, mycsv$Semester, mycsv$NationalITy)
mytable
ftable(mytable) # 보기 좋게 2차원으로 재구성
# 3-Way Frequency Table
mytable <- xtabs(~mycsv$gender+ mycsv$Semester+ mycsv$NationalITy)
ftable(mytable) # print table
summary(mytable) # chi-square test of independence
#---
#---- Correlations 상관분석 ---------
# 공분산 covariance는 두 변수의 변화가 같은 방향인가를 나타냄
# covariance가 0 보다 크다면 같은 방향, 0이면 관계 없음(=독립)
cov(mycsv$raisedhands, mycsv$Discussion)
# covariance를 두변수의 표준편차의 곱으로 나누면 상관관계
cov(mycsv$raisedhands, mycsv$Discussion)/(sd(mycsv$raisedhands)*sd(mycsv$Discussion))
# correlation
cor(mycsv$raisedhands, mycsv$Discussion) # default method: pearson
cor(mycsv$raisedhands, mycsv$Discussion, method="kendall")
plot(mycsv$raisedhands, mycsv$Discussion,
main=paste("cor = ", cor(mycsv$raisedhands, mycsv$Discussion)))
abline(lm(mycsv$Discussion~mycsv$raisedhands), col="red")
# covariance
cov(mycsv$raisedhands, mycsv$Discussion)
cor(mycsv$raisedhands, mycsv$Discussion)
cor.test(mycsv$raisedhands, mycsv$Discussion)
# correlation matrix
names(mycsv[,10:13])
cor(mycsv[,10:13])
# covariance matrix
cov(mycsv1)
# install.packages("Hmisc")
library(Hmisc)
rcorr(as.matrix(mycsv1)) # correlation과 p값 출력
# default는 pearson
rcorr(as.matrix(mycsv1), type="spearman")
# spearman은 단조 증가함수로 두 변수를 변환, 비선형적 상관성 측정
#------ 단순 선형회귀분석 (simple) linear regression --------
lm1 <- lm(mycsv$Discussion ~ mycsv$raisedhands)
lm1
summary(lm1)
plot(mycsv$raisedhands, mycsv$Discussion)
abline(lm(mycsv$Discussion ~ mycsv$raisedhands), col="red")
# 회귀모형의 유의성 검정
anova(lm1)
# 회귀계수의 유의성 검정
summary(lm1)
# Adjusted R-squared는 독립변수의 수가 많을 때 참고
# 독립변수의 수가 많아질수록 증가
# 회귀모형 잔차의 정규성 검정
shapiro.test(residuals(lm1))
# p-value = 1.342e-08
# 유의수준 0.05 기준에서 잔차들이 정규분포를 따르지 않음
# 자동차 데이터 연습
data(cars)
head(cars)
lm2 <- lm(speed ~ dist, data=cars)
lm2
summary(lm2)
plot(cars$dist, cars$speed)
abline(lm(cars$speed~cars$dist))
cars1 <- cars
cars1$speed.sq <- cars1$speed^2
lm3 <- lm(speed ~ ., data=cars1)
lm3
summary(lm3)
plot(cars1$dist, cars1$speed.sq)
abline(lm(cars1$speed.sq~cars1$dist))
cars2 <- cars
cars2$dist.sqrt <- sqrt(cars2$dist)
lm4 <- lm(speed ~ ., data=cars2)
lm4
summary(lm4)
plot(cars2$dist.sqrt, cars2$speed)
abline(lm(cars2$speed~cars2$dist.sqrt))
#--- 다중선형회귀분석 예제 ---------
data(mtcars)
lm1 <- lm(mpg ~ hp+wt, data=mtcars)
lm1 <- lm(mpg ~ ., data=mtcars)
# 나머지 모두를 독립변수로 사용
# factor level을 변경한 후
# 숫자 형식으로 factor 형식을 변경
mycsv$numClass <- as.numeric(factor(mycsv$Class, level=c("L", "M","H")))
head(mycsv$Class)
head(mycsv$numClass)
plot(sort(mycsv$numClass))
lm3 <- lm(mycsv$numClass ~ mycsv$raisedhands + mycsv$Discussion)
lm3
summary(lm3)
plot(mycsv$raisedhands, jitter(mycsv$numClass))
lines(lowess(mycsv$numClass~mycsv$raisedhands))
plot(mycsv$Discussion, jitter(mycsv$numClass))
lines(lowess(mycsv$numClass~mycsv$Discussion))
mycsv$Discussion.sqrt <- sqrt(mycsv$Discussion)
lm3 <- lm(mycsv$numClass ~ mycsv$raisedhands + mycsv$Discussion + mycsv$Discussion.sqrt)
lm3
summary(lm3)
plot(mycsv$Discussion.sqrt, jitter(mycsv$numClass))
lines(lowess(mycsv$numClass~mycsv$Discussion.sqrt))
#-------- [ 연관성 규칙 생성 실습] ---------------
#------ association rules [basket format] -----
s1 <- mycsv
s5 <- s1
s5$gender_Cl <- paste0("gender=", s5$gender)
s5$NationalITy_Cl <- paste0("NationalITy=", s5$NationalITy)
s5$PlaceofBirth_Cl <- paste0("PlaceofBirth=", s5$PlaceofBirth)
s5$Topic_Cl <- paste0("Topic=", s5$Topic)
s5$Class_Cl <- paste0("Class=", s5$Class)
s51 <- s5[, (names(s5) %in% c("gender_Cl", "NationalITy_Cl", "PlaceofBirth_Cl", "Topic_Cl", "Class_Cl"))]
#----------
# install.packages("arules")
# install.packages("arulesViz")
library(arules)
library(arulesViz)
write.csv(s51, "s5_trs.csv", row.names=F, col.names=F)
s511 <- read.transactions("s5_trs.csv", format="basket", sep=",", skip=1, rm.duplicates =F)
inspect(head(s511, 5))
itemFrequencyPlot(s511,topN=20,type="absolute")
rules <- apriori(s511, parameter = list(supp = 0.1, conf = 0.2, minlen=2, maxlen=2))
options(digits=3)
inspect(rules[1:20])
summary(rules)
rules1 <- head(sort(rules, by="confidence"), 40)
inspect(rules1)
rules2 <- subset(rules1, subset=(!(rhs %pin% "Class=") & lift>1))
inspect(sort(rules2, by="lift"))
# df1 <- as.data.frame(inspect(rules))
# df2 <- df1[df1$rhs %in% c("{Class=L}" , "{Class=M}", "{Class=H}") & df1$lift>1 , ]
# df2[order(-df2$confidence),]
plot(rules)
# plot(rules2, method="graph", interactive=F, shading=NA)
plot(rules2, method="graph", interactive=T, shading=NA)
rules3 <- subset(rules1, subset=(rhs %pin% "Class=" & lift>1 ))
inspect(sort(rules3, by="lift"))
plot(rules3, method="graph", interactive=T, shading=NA)
#(((((((((((((((((((((((((
#------- association rules [single format]-----------
# data: https://vincentarelbundock.github.io/Rdatasets/datasets.html
# University Lecture/Instructor Evaluations by Students at ETH
# ev1 <- read.csv("https://t1.daumcdn.net/cfile/blog/234509505919290D12?download")
head(ev1)
ev1 <- ev1[,2:3]
# 가상적인 강사 이름 부여
ev1$d[ev1$d==827] <- "Richard Florida"
ev1$d[ev1$d==1780] <- "John Hull"
ev1$d[ev1$d==260] <- "Ato Quayson"
ev1$d[ev1$d==150] <- "Arthur Ripstein"
ev1$d[ev1$d==2079] <- "Peter Zandstra"
write.csv(ev1, "ev1.csv", row.names=F)
tr <- read.transactions("ev1.csv", format = "single", sep=',',
skip=1, rm.duplicates = FALSE, cols=c(1,2))
inspect(head(tr))
itemFrequencyPlot(tr,topN=20,type="absolute")
srules <- apriori(tr, parameter = list(supp = 0.1, conf = 0.6, minlen=2, maxlen=2))
# options(digits=3)
inspect(head(srules))
summary(srules)
plot(srules, method="graph", interactive=T, shading=NA)
# charting :: 세사람을 비교
# 평가 점수 (y)를 활용 하기 위해 다시 데이터 입수
ev1 <- read.csv("https://t1.daumcdn.net/cfile/blog/234509505919290D12?download")
ev1$d[ev1$d==827] <- "Richard Florida"
ev1$d[ev1$d==1780] <- "John Hull"
ev1$d[ev1$d==260] <- "Ato Quayson"
ev1$d[ev1$d==150] <- "Arthur Ripstein"
ev1$d[ev1$d==2079] <- "Peter Zandstra"
ev2 <- ev1[as.character(ev1$d) %in% c("Richard Florida", "John Hull", "Ato Quayson"),]
library(ggplot2)
ggplot(ev2,
aes(x=d, y=y )) +
geom_point() + geom_boxplot() +
labs(title = "Course Evaluation by Instructors",
x = "Instructor", y="Evaluation")
table(ev2$d, ev2$s)
# Density plots with semi-transparent fill
ggplot(ev2, aes(x=y, fill=d)) +
geom_density(alpha=.3)
# Density plots
ggplot(ev2, aes(x=y, colour=d)) +
geom_density()
#------ only with high score class ------
# ev1 <- read.csv("InstEval.csv")
head(ev1)
ev1 <- ev1[ev1$y >=4 , 2:3]
ev1$d[ev1$d==827] <- "Richard Florida"
ev1$d[ev1$d==1780] <- "John Hull"
ev1$d[ev1$d==260] <- "Ato Quayson"
ev1$d[ev1$d==150] <- "Arthur Ripstein"
ev1$d[ev1$d==2079] <- "Peter Zandstra"
write.csv(ev1, "ev1.csv", row.names=F)
tr <- read.transactions("ev1.csv", format = "single", sep=',',
skip=1, rm.duplicates = FALSE, cols=c(1,2))
inspect(head(tr))
itemFrequencyPlot(tr,topN=20,type="absolute")
srules <- apriori(tr, parameter = list(supp = 0.03, conf = 0.3, minlen=2, maxlen=2))
# options(digits=3)
inspect(head(srules))
summary(srules)
plot(srules, method="graph", interactive=T, shading=NA)
#----- scatterplot with aggregation [instructor] ----
nrow(ev1)
inst1 <-aggregate(ev1$y, by=list(ev1$d), FUN=mean)
head(inst1[order(-inst1$x),])
names(inst1) <- c("instructor","avg_eval")
inst2 <-aggregate(ev1$y, by=list(ev1$d), FUN=length)
head(inst2[order(-inst2$x),])
names(inst2) <- c("instructor","cnt_eval")
inst3 <- merge(inst1, inst2, by ="instructor" , all.x=T)
plot(inst3$avg_eval, inst3$cnt_eval)
# using ggplot2
ggplot(inst3, aes(x=avg_eval, y=cnt_eval)) +
geom_point(shape=1)
ggplot(inst3, aes(x=avg_eval, y=cnt_eval)) +
geom_point(shape=1) +
geom_smooth(method=lm) # regression line with 95% confidence region
ggplot(inst3, aes(x=avg_eval, y=cnt_eval)) +
geom_point(shape=1) +
geom_smooth() + # loess fit line with 95% confidence region
geom_smooth(method=lm, se=FALSE) # linear line for comparison
#----- scatterplot with aggregation [student] ----
std1 <-aggregate(ev1$y, by=list(ev1$s), FUN=mean)
head(std1[order(-std1$x),])
names(std1) <- c("student","avg_eval")
std2 <-aggregate(ev1$y, by=list(ev1$s), FUN=length)
head(std2[order(-std2$x),])
names(std2) <- c("student","cnt_eval")
std3 <- merge(std1, std2, by ="student" , all.x=T)
plot(std3$avg_eval, std3$cnt_eval)
# using ggplot2
ggplot(std3, aes(x=avg_eval, y=cnt_eval)) +
geom_point(shape=1)
ggplot(std3, aes(x=avg_eval, y=cnt_eval)) +
geom_point(shape=1) +
geom_smooth(method=lm) # regression line with 95% confidence region
ggplot(std3, aes(x=avg_eval, y=cnt_eval)) +
geom_point(shape=1) +
geom_smooth() + # loess fit line with 95% confidence region
geom_smooth(method=lm, se=FALSE) # linear line for comparison
'R 데이터 분석' 카테고리의 다른 글
[kbdaa_bda] 빅데이터고객분석 _ 군집 (0) | 2017.09.21 |
---|---|
[kbdaa_bda] 빅데이터고객분석 GDA (0) | 2017.09.20 |
subway]빅데이터분석 (0) | 2017.06.22 |
[R 분석: DT] rpart를 이용한 트리 모델 만들기 (0) | 2017.05.29 |
[SKK_DA1] predictive modeling practice (0) | 2017.05.25 |