>RE::VISION CRM

R 데이터 분석

[kbdaa_bda] 빅데이터고객분석

YONG_X 2017. 9. 9. 19:21

Tools(file://M1403INS/Tools)


R설치 ::

https://cran.r-project.org/bin/windows/base/ 


활용 데이터 파일


[1] 은행 교차 판매 데이터 


bankfa.csv



 Citation Request:
  This dataset is public available for research. The details are described in [Moro et al., 2011]. 
  Please include this citation if you plan to use this database:

  [Moro et al., 2011] S. Moro, R. Laureano and P. Cortez. Using Data Mining for Bank Direct Marketing: An Application of the CRISP-DM Methodology. 
  In P. Novais et al. (Eds.), Proceedings of the European Simulation and Modelling Conference - ESM'2011, pp. 117-121, Guimarães, Portugal, October, 2011. EUROSIS.

  Available at: [pdf] http://hdl.handle.net/1822/14838
                [bib] http://www3.dsi.uminho.pt/pcortez/bib/2011-esm-1.txt

1. Title: Bank Marketing

2. Sources
   Created by: Paulo Cortez (Univ. Minho) and Sérgio Moro (ISCTE-IUL) @ 2012
   
3. Past Usage:

  The full dataset was described and analyzed in:

  S. Moro, R. Laureano and P. Cortez. Using Data Mining for Bank Direct Marketing: An Application of the CRISP-DM Methodology. 
  In P. Novais et al. (Eds.), Proceedings of the European Simulation and Modelling Conference - ESM'2011, pp. 117-121, Guimarães, 
  Portugal, October, 2011. EUROSIS.

4. Relevant Information:

   The data is related with direct marketing campaigns of a Portuguese banking institution. 
   The marketing campaigns were based on phone calls. Often, more than one contact to the same client was required, 
   in order to access if the product (bank term deposit) would be (or not) subscribed. 

   There are two datasets: 
      1) bank-full.csv with all examples, ordered by date (from May 2008 to November 2010).
      2) bank.csv with 10% of the examples (4521), randomly selected from bank-full.csv.
   The smallest dataset is provided to test more computationally demanding machine learning algorithms (e.g. SVM).

   The classification goal is to predict if the client will subscribe a term deposit (variable y).

5. Number of Instances: 45211 for bank-full.csv (4521 for bank.csv)

6. Number of Attributes: 16 + output attribute.

7. Attribute information:

   For more information, read [Moro et al., 2011].

   Input variables:
   # bank client data:
   1 - age (numeric)
   2 - job : type of job (categorical: "admin.","unknown","unemployed","management","housemaid","entrepreneur","student",
                                       "blue-collar","self-employed","retired","technician","services") 
   3 - marital : marital status (categorical: "married","divorced","single"; note: "divorced" means divorced or widowed)
   4 - education (categorical: "unknown","secondary","primary","tertiary")
   5 - default: has credit in default? (binary: "yes","no")
   6 - balance: average yearly balance, in euros (numeric) 
   7 - housing: has housing loan? (binary: "yes","no")
   8 - loan: has personal loan? (binary: "yes","no")
   # related with the last contact of the current campaign:
   9 - contact: contact communication type (categorical: "unknown","telephone","cellular") 
  10 - day: last contact day of the month (numeric)
  11 - month: last contact month of year (categorical: "jan", "feb", "mar", ..., "nov", "dec")
  12 - duration: last contact duration, in seconds (numeric)
   # other attributes:
  13 - campaign: number of contacts performed during this campaign and for this client (numeric, includes last contact)
  14 - pdays: number of days that passed by after the client was last contacted from a previous campaign (numeric, -1 means client was not previously contacted)
  15 - previous: number of contacts performed before this campaign and for this client (numeric)
  16 - poutcome: outcome of the previous marketing campaign (categorical: "unknown","other","failure","success")

  Output variable (desired target):
  17 - y - has the client subscribed a term deposit? (binary: "yes","no")

8. Missing Attribute Values: None



[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)


xAPI-Edu-Data.csv



#===========



# 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


xAPI-Edu-Data.csv
0.04MB
bankfa.csv
4.4MB