연관분석, 군집분석
군집분석이란 각 객체 대상 의 유사성을 측정 하여 유사성이 높은 대상 집단을 분류 하고, 군집에 속한 객체들의 유사성과 서로 다른 군집에 속한 객체간의 상이성을 규명 하는 분석 방법이다.
특성에 따라 고객을 여러 개의 배타적인 집단으로 나눈다
군집의 개수나 구조에 대한 가정 없이 데이터로부터 거리를 기준 으로 군집화를 유도한다
유사성의 거리는 유클리드 거리 를 이용한다
1. 유클리드 거리
-유클리드 거리 (Euclidean 는 두 점 사이의 거리 를 계산하는 방법으로 이 거리를 이용하여 유클리드 공간을 정의 한다
<유클리드거리 계산법>
1.관측 대상의 두 벡터의 차이 를 구한다
2.각 차의 제곱의 합 을 구한다
3.제곱근 을 취한다
(1)matrix생성
x <- matrix(1:9, nrow=3, by=T)
(2) matrix대상 유클리드 거리 생성 함수
dist <- dist(x, method="euclidean")#method 생략가능
(3)유클리드 거리 계산 식
sqrt(sum((x[1,] - x[2,])^2))
sqrt(sum((x[1,] - x[3,])^2))
sqrt(sum((x[2,] - x[3,])^2))
2.계층적 군집분석
-거리가 가장 가까운 대상부터 결합 하여 나무 모양 의 계층구조를 상향식 (Bottom up) 으로 만들어가면서 군집을 형성
-중학생의 신체검사 결과 데이터를 군집분석-
#데이터 읽어오기
body <- read.csv("./day12/bodycheck.csv", header=TRUE)
#데이터 칼럼보기
names(body)
#불필요한 칼럼 번호 ) 제거
body <- body[,-1]
body
#유클리드 거리 구하기
idist <- dist(body, method="euclidean")#dist(iris[,-5])
idist
# hclust()함수를 이용하여 클러스터링
hc <- hclust(idist)
hc
#클러스터링 시각화 하기
plot(hc, hang=-1)#음수값제외
rect.hclust(hc, k=3, border = "red") #3개 그룹 선정, 선 색 지정
연관분석은 군집 분석에 의해서 그룹핑 된 cluster 를 대상 으로 하며 그룹에 대한 특성을 분석하는 방법 으로 장바구니 분석으로 알려져 있다 . 즉, 유사한 개체들을 클러스터로 그룹화하여 각 집단의 특성 파악 하고 , 대용량데이터베이스에서는 전체 데이터를 유사한 클러스터로 묶어서 관찰 및 분석하는 것이 더 효율적이다.
연관규칙 (Association Rule)
-상업 데이터베이스에서 가장 흔히 쓰이는 도구로 , 어떤 사건이 얼마나 자주 동시에 발생하는가를 표현하는 규칙 (조건).
(1)연관 규칙의 평가 척도
1.지지도 (support) : 전체자료에서 A 를 구매한 후 B 를 구매하는 거래 비율
A-->B 지지도 식
--> A 와 B 를 포함한 거래 수 / 전체 거래 수
--> n(A, B) : 두 항목 (A, 이 동시에 포함되는 거래 수
--> n : 전체 거래 수
2.신뢰도 (confidence) : A 가 포함된 거래 중에서 B 를 포함한 거래의 비율 조건부 확률
A-->B 신뢰도 식
--> A 와 B 를 포함한 거래수 / A 를 포함한 거래수
3.향상도 (Lift) 하위 항목들이 독립에서 얼마나 벗어나는 지 에 대한 정도를 측정한 값
향상도 식 -> 신뢰도 / B 가 포함될 거래 비 율
분자와 분모가 동일한 경우 : Lift == 1, A 와 B 가 독립 (상관없음)
분자와 분모가 동일한 경우 : Lift != 1, x 와 y 가 독립이 아닌 경우 (상관있음)
장바구니분석을 알아보기 위해 Groceries 데이터를 이용 .
Groceries데이터 : 1 개월 동안 실제 로컬 식료품 매장에서 판매되는 트랜잭션 데이터를 포함
우선연관 분석을 위해서는 transaction 객체를 이용 해야 하는데 ,
이를위해 arules 패키지를 설치
install.packages("arules")
library(arules)
# transactions데이터 가져오기
data("Groceries")
#최대 길이 3 이내로 규칙 생성
rules <- apriori(Groceries, parameter = list(supp=0.001, conf=0.80,maxlen=3)) #지지도, 신뢰도, 최대길이
inspect(rules)
# confidence(신뢰도 ) 기준 내림차순으로 규칙 정렬
rules <- sort(rules, decreasing = T, by="confidence")
inspect(head(rules))
library(arulesViz)
install.packages("arulesViz")
plot(rules, method="graph", control = list(type="items"))
시각화결과를 살펴보면 우선 노드가 큰 것이 연관성이 높은 품목 이라고 할 수 있고 ,
크게whole milk 와 other vegetables 품목이 다른 품목들과 많이 연관 을 이루고 있음을 알 수 있다
Shiny에서 유용한 함수들
for(i in 1:10){
vs <- paste0("x",i)
print(vs)
}
assign(이름, 값): 이름에 대한 값을 바인딩
입력 위젯에서 어떤것을 선택하고, 선택한 그 이름을 가진 R데이터 셋을 얻을 때 유용하게 사용
for(i in 1:10){
vs <- paste0("x",i)
assign(vs,i)
print(get(vs))
}
switch (statement list) : statement가 숫자인 경우, list 부분의 그 숫자에 해당되는 표현식을 실행.
만약, 표현식의 개수 범위를 넘어서면 null을 반환
x <- 3
switch(x,2+2,mean(1:10),rnorm(5)) #3번째에 있는 rnorm이 실행됨
x <- 4
switch(x,2+2,mean(1:10),rnorm(5))#4번째가 없기 때문에 널값으로 그대로 찍힘
statement가 문자인 경우, list 이름들을 조회하여 정확하게 매칭되는 이름에 할당된 표현식을 실행
center <- function(x,type){
switch(type,
mean = mean(x),
median = median(x),
trimmed = mean(x,trim=.1)
)
}
x <- rcauchy(10)
x
center(x,"median")
#type이라는 문자열이 있어야 실행됨
<R shiny>
install.packages("shiny")
library(shiny)
ui <- fluidPage(
server <- function(input, output, session){
shinyApp(ui, server)
}
)
#기본코드 만들어줌 shinyapp
#실행시켜줌 shinyApp
#server 백엔드, ui 프론트엔드
#fluidPage입출력위젯, html파일 하나 만드는것과 비슷, 화면 구성
textInput() #문자열을 전달받는 input함수
ui <- fluidPage(
textInput("myText", "텍스트를 입력하세요."),
verbatimTextOutput("txt")
)
server <- function(input, output, session){
output $ txt <- renderPrint(
{req(input $ myText)
input $ myText}
)
}
shinyApp(ui,server)
passwordInput()
ui <- fluidPage(
passwordInput("password", " 패스워드")
)
server <- function(input, output, session){
}
shinyApp(ui, server)
numericInput()
ui <- fluidPage(
numericInput("obs","Observations:", 10, min=1, max=100),
verbatimTextOutput("value")
)
server <- function(input, output){
output$value <- renderText({input$obs})
}
shinyApp(ui, server)
shiny::runGitHub(repo = "shiny-examples", username = "rstudio", subdir="005-sliders")
selectInput()
ui <- fluidPage(
selectInput("sel", "다음에서 선택:",
choice = c("초급","중급","고급"))
)
server <- function(input, output, session){
}
shinyApp(ui, server)
ui <- fluidPage(
selectInput("sel","다음에서 선택:",
choices = list(
"컴파일러 언어" = c("C++","Java"),
"스크립트 언어" = c("R","JavaScript","Python")
))
)
server <- function(input, output, session){}
shinyApp(ui, server)
ui <- fluidPage(
radioButtons("dist", "Distributton type:",
c("Normal" = "norm",
"Uniform" = "unif",
"Log-normal" = "Inorm",
"Exponential" = "exp")),
plotOutput("distPlot")
)
server <- function(input, output){
output $ distPlot <- renderPlot({
dist <- switch(input $ dist,
norm = rnorm,
unif = runif,
lnorm = rlnorm,
exp = rexp,
rnorm)
hist(dist(500))
})
}
shinyApp(ui, server)
library(shiny)
ui <- fluidPage(
checkboxGroupInput("sels",
"전공 언어(복수 선택 가능)",
c("C 와 그 방언들" , "Java", "JavaScripts", "R", "Perl")),
verbatimTextOutput("langs")
)
server <- function(input, output, session) {
output$langs < renderPrint({
input$sels
})
}
shinyApp(ui, server)
library(shiny)
ui <- fluidPage(
dateInput("date", "날짜 선택", value = "2017-01-01", language = "ko")
)#오늘날짜로 기본값을 하고 싶으면 value값을 Sys.Date()라고 쓰면 됨.
server <- function(input, output, session) {
# 서버 코드
}
shinyApp(ui, server)
ui <- fluidPage(
dateRangeInput("date", "날짜 선택",
start = Sys.Date(),
end = Sys.Date() + 30,
language = "ko")
)
ui <- fluidPage(
sliderInput("obs", "Number of observations",0,1000,500),
actionButton("goButton","Go!"),
plotOutput("distPlot")
)
server <- function(input,output){
output$distPlot <- renderPlot({
# Take a dependency on input $ goButton. This will run once initially.
# because the value changes from NULL to 0.
input$goButton
# Use isolate() to avoid dependency on input $ obs
dist <- isolate(rnorm(input$obs))
#사용자가 슬라이드를 변경시켰을때 바로 바뀌지말고 우선 멈추게 하는것
hist(dist)
})
}
shinyApp(ui, server)
server <- function(input, output, session){}
shinyApp(ui, server)
fileInput()
#출력 은 항 상 render*( ) 함 수 와 그에 대 응 하 는 Output( ) 함 수 를 사 용 하여 구 현
#renderPlot 을 사용하면 plotOutput 함수를 사용
#텍스트 출력
#간단한 경우: renderText()과 textOutput()
#조금 복잡한 경우: renderPrint()과 verbatimTextOutput()
ui <- fluidPage(
h2(textOutput("txt")),
verbatimTextOutput("sum1")
)
server <- function(input, output){
output $ txt <- renderText({
"mtcars를 사용한 회귀 분석"
})
output $ sum1 <- renderPrint({
summary(lm(mpg ~ wt + qsec, data = mtcars))
})
}
shinyApp(ui, server)
#표(테이블형식) 출력
ui = fluidPage(
fluidRow(
column(12,
dataTableOutput('table')
)
)
)
server = function(input, output) {
output $ table <- renderDataTable(iris,
options = list(pageLength = 5,
initComplete = I("function(settings, json) {alert('Done.');}")
)
)
}
shinyApp(ui, server)
#위와 같음
shinyApp(
ui=fluidPage(
fluidRow(
column(12,
dataTableOutput('table')
)
)
),
server = function(input, output){
output $ table <- renderDataTable(iris,
options = list(
pageLength = 5,
initComplete = I("function(settings, json){alert('Done.');}")
)
)
}
)
#플롯 출력
library(shiny)
ui <- fluidPage(
plotOutput("myPlot")
)
server <- function(input, output, session) {
output $ myPlot <- renderPlot({
plot(mtcars $ wt, mtcars $ mpg)
})
}
shinyApp(ui, server)