■ 나이브베이즈 분류
1. 확률에 대한 기본적인 이해
2. 나이브 베이즈 알고리즘
3. 나이브 베이즈 실습
-독버섯과 정상버섯의 분류
-영화 장르 선호도 분류
-스팸메일과 햄메일의 분류(책 실습)---> text mining 실습
관측이 특정 범주에 속할 가능성을 평가하는 확률 기반의 분류 방법
나이브베이즈 Naive bayes
예:
비가 올 확률 70% 라는 것은 해당 지역의 어딘가에서 비슷한 조건을 갖는
과거 10개 경우 중 7개에서 강수가 발생했다는 것을 의미한다.
|
장점 |
단점 |
|
간단하고 빠르고 매우 효율적이다 |
모든 특징이 동등하게 중요하고 독립이라는 가정이 잘못된 경우가 자주 있다. |
|
잡음과 누락 데이터를 잘 처리한다 |
수치 특징이 많은 데이터셋에는 이상적이지 않다. |
|
훈련에는 상대적으로 적은 예시가 필요하지만, 대용량의 예시에도 매우 잘 작동된다. |
추정된 확률이 예측된 클래스보다 덜 신뢰할 만하다
|
|
예측을 위한 추정 확률을 쉽게 얻을 수 있다. |
|
확률의 시행과 사건:
주사위를 던짐- 시행
눈 6이 나옴- 사건
결합확률: 두 사건이 동시에 일어나는 확률
ex: 로또에 당첨될 사건과 벼락에 맞을 사건이 동시에 일어나는 확률
![]()
= P(A) * P(B)
∩ : 결합확률 표시
조건부확률: 어떤 상황이 주어졌을 때 그 상황속에서 다른 상황이
일어날 확률(연관성 있는 확률)
ex: 비가올 때 우산이 팔릴 확률
P( A | B )
| : 조건부 표시
독립사건과 종속사건
독립사건:
두개의 사건이 일어났는데 두 사건이 전혀 연관성이 없는 사건
ex: 날씨가 화창한 것(B)과 동전던지기(A).
P( A | B) = P(A)
두 사건에서 A가 독립이다 라는 뜻.
종속사건:
두개의 사건이 일어났는데 서로 연관성이 있는 사건
ex: 비가오는것과 우산이 팔리는 것
P( A | B ) = P( A ∩ B ) / P(B)
↓
비아그라가 포함된 메일 중 스팸인 것을 구하라
p(비아그라) = 5/100 (확률이니까 전체수로 나눠줌)
p(스팸) = 20/100
P(비아그라 | 스팸) = 4/20
위 공식에 구한 수를 대입시키면
(4/20 * 20/100) / 5/100 = 0.8 (80%의 확률)
*우도란?
원인에 대하여 데이터가 얻어질 확률
■ 나이브 베이즈 알고리즘(p. 152)
비아그라(w1) 돈(w2) 식료품(w3) 주소삭제(w4)
우도 Yes No Yes No Yes No Yes No
스팸 4/20 16/20 10/20 10/20 0/20 20/20 12/20 8/20 20
햄 1/80 79/80 14/80 66/80 8/80 71/80 23/80 57/80 80
총합 5/100 95/100 24/100 76/100 8/100 9/100 35/100 65/100 100
*스팸 메일과 햄 메일을 정확하게 분류하기 위해서는??
비아그라 단어 하나 만 가지고 스팸 메일인지를 분류하면
정확하게 분류가 안될 수 있으니 다른 단어들도 같이
포함시켜서 확률을 구해야한다.
예: 비아그라, 돈, 식료품, 주소삭제
용어 :
|
¬ |
존재하지 않는다 |
부정 |
|
ㅋ |
존재한다 |
긍정 |
예: 비아그라와 주소삭제 라는 단어는 포함되어 있는 메일인데
돈과 식료품은 포함하지않는 메일은 스팸일 확률이 어떻게 되는가
P(스팸|비아그라 ∩ ¬돈 ∩ ¬식료품 ∩ 주소삭제) = ?
해석: 비아그라가 포함된 스팸메일에 (<-조건)
(↓ 결합)
돈,식료품이 안 포함되었고
주소삭제는 포함되어 있을 확률은??
P(B|A) * P(A)
P(A|B) =----------------
P(B)
P(비아그라 ∩ ¬돈 ∩ ¬식료품 ∩ 주소삭제|스팸) * P(스팸)
=--------------------------------------------------------------
P( 비아그라 ∩ ¬돈 ∩ ¬식료품 ∩ 주소삭제 )
*스팸일 확률? 스팸일 우도?
P(비아그라|스팸) * P(돈|스팸) * P(ㄱ식료품|스팸) * P(주소삭제|스팸) * P(스팸)
=---------------------------------------------------------------------------------------
P( 비아그라 ∩ ¬돈 ∩ ¬식료품 ∩ 주소삭제 )
= 4/20 * 10/20 * 20/20 * 12/20 * 20/100 * 20/100
---------------------------------------
P( 비아그라 ∩ ¬돈 ∩ ¬식료품 ∩ 주소삭제 )
= 0.012
----------------------------------
P( 비아그라 ∩ ¬돈 ∩ ¬식료품 ∩ 주소삭제 ) = 0.012 + 0.002
= 0.85 <- 스팸일 확률
*햄일 확률? 햄일 우도?
P(비아그라|햄) * P(돈|햄) * P(ㄱ식료품|햄) * P(주소삭제|햄) * P(햄)
=---------------------------------------------------------------------------------------
P( 비아그라 ∩ ¬돈 ∩ ¬식료품 ∩ 주소삭제 )
= 1/80 * 66/80 * 71/80 * 23/80 * 80/100 = 0.002
---------------------------------------------------------
P( 비아그라 ∩ ¬돈 ∩ ¬식료품 ∩ 주소삭제 ) = 0.012 + 0.002
= 0.15 <- 햄일 확률
정리하면 비아그라, 주소삭제가 포함되어져 있고
돈과 식료품이 포함되지 않은 메시지가 스팸일 확률은 85% 가 된다.
==========================================
■ 나이브베이즈에 착안한 베이지안(p142)
나이브베이즈는 18세기 수학자 토마스 베이즈의 연구에서 유래됐다.
토마스 베이즈는 사건의 확률과 추가 정보를 고려했을 때
확률이 어떻게 바뀌어야만 하는지를 설명하는 기본 원칙을 개발했다.
이 원칙은 현재 베이지만 기법 으로 알려진 기법들의 기반을 형성했다.
대표적으로 베이지안 분류기는 결과에 대한 전체 확률을 추정하기 위해
동시에 여러 속성 정보를 고려해야만 하는 문제가 가장 적합하다.
|
스팸 이메일 필터링과 같은 텍스트 분류 |
|
컴퓨터 네트워크에서 침입이나 비정상행위 탐지 |
|
일련의 관찰된 증상에 대한 의학적 질병 진단 |
많은 머신러닝 알고리즘이 영향력이 약한 특징은 무시하지만,
베이지안 기법은 가용한 모든 증거를 활용해 예측을 절묘하게 바꾼다.
특징이 아주 많아서 상대적으로 영향이 작다면 모두 합쳤을 때
결합된 영향은 꽤 클 것이다.
===========================================
■ 나이브 베이즈 knn의 차이로 설명
1. knn 과 나이브 베이즈의 차이 ?
knn 은 데이터간의 거리를 계산해서 가장 가까운 거리에 있는
데이터가 나의 이웃이라고 분류하는 분류 방법이고
나이브 베이즈는 확률(P)을 이용하여 분류하는 분류 기법
2. 언제 knn 을 사용하고 언제 나이브베이즈를 사용해서 분류해야하는가 ?
- knn --> 분석하려는 데이터가 수치형 데이터일때
예: 유방암 데이터
- naive bayes -> 분석하려는 데이터가 명목형 데이터 일때
예: 영화 선호도 데이터
3. knn 과 나이브 베이즈로 분석하려는 질문 리스트 ?
- knn 의 질문 ?
1. 종양의 크기와 모양만 보고 악성 종양인지 양성 종양인지를
분류할 수 있을까 ?
2. 붓꽃의 모양만 보고 붓꽃의 종류를 알아맞힐수 있을까 ?
- naive bayes 의 질문 ?
1. 직업과 나이, 성별, 직업유무를 가지고 어느 영화를 더
선호할지 선호도를 알아 맞힐수 있을까 ?
예: movie.csv
2. 버섯의 모양, 색깔, 향기 등의 정보를 가지고 독버섯인지
일반 버섯인지 알아 맞힐 수 있을까 ?
예: mushrooms.csv
4. 나이브 베이즈의 원리 복습
비아그라
예 아니오 총계
스팸 4 16 20
햄 1 79 80
5 95 100
P(스팸 | 비아그라 ∩ 돈 ∩ 식료품 ∩ 주소삭제) = 확률 ?
스팸의 우도
-----------------------------
햄의 우도 + 스팸의 우도
P(공포 | '30대' ∩ '여자' ∩'IT' ∩ '미혼') = 확률 ?
공포의 우도
-------------------------------------------------
공포 + 로멘틱 + 코믹 + 무협 + 스릴러 + 액션 + SF
문제194. 나이, 성별, 직업, 결혼여부, 이성친구의 여부에 따라서
선호하는 영화 장르가 어떻게 되는지 예측하는 모델을 생성하시오!
install.packages("e1071")
library(e1071)
movie <- read.csv("movie.csv", header=T)
model <- naiveBayes(movie[ ,1:5], movie$장르, laplace=0)
↑ ↑
훈련 데이터 훈련 데이터 라벨
model
test_data <- read.csv("n_test1.csv", header=TRUE)
result <- predict(model, test_data[1:5])
result
로맨틱
문제195. 나이가 20대이고 성별이 남자이고 직업이 학생이고
결혼 아직 안했고 이성친구가 없는 재혁이가 선호하는 영화는
무엇이겠는지 나이브 베이즈로 예측 하시오 !
test_data <- read.csv("n_test1.csv", header=TRUE)
test_data
result <- predict(model, test_data[1:5])
result
문제196. 독버섯과 정상 버섯을 예측하는 나이브 베이즈 모델을 생성하시오
1. 버섯 데이터를 R 로 로드한다.
mushroom <- read.csv("mushrooms.csv", header=T, stringsAsFactors=TRUE)
View(mushroom)
2. 8124 독버섯 데이터만 따로 빼서 mush_test.csv 로 저장한다.
mush_test <- mushroom[8123, ]
mush_test
write.csv( mush_test, "mush_test.csv",row.names=FALSE )
3. 8124 독버섯 데이터를 훈련 데이터에서 제외 시키시오 !
nrow(mushroom)
mushrooms <- mushroom[ -8123, ] # 8123번째 다음부터 시작해라(8124부터)
nrow(mushrooms)
4. mushrooms 데이터를 훈련 데이터와 테스트 데이터로 나눈다
( 훈련 데이터는 75%, 테스트 데이터는 25% )
set.seed(1)
dim(mushrooms)
train_cnt <- round( 0.75*dim(mushrooms)[1] )
train_cnt
train_index <- sample( 1:dim(mushrooms)[1], train_cnt, replace=F)
#mushrooms의 [1] 은 1번째 컬럼인 type
mushrooms_train <- mushrooms[ train_index, ] # 1~6092
mushrooms_test <- mushrooms[- train_index, ] # 6093~8123
nrow(mushrooms_train) # 6092
nrow(mushrooms_test) # 2031
str(mushrooms_train)
5. 나이브 베이즈 알고리즘으로 독버섯과 일반 버섯을 분류하는 모델을
생성한다.
library(e1071) 모든 컬럼들
↓
model1 <- naiveBayes(type~ . , data=mushrooms_train)
↑
라벨 컬럼명
model1
6. 위에서 만든 모델과 테스트 데이터를 가지고 독버섯과 일반버섯을
잘 분류하는지 예측해 본다.
result1 <- predict( model1, mushrooms_test[ , -1] )
result1
7. 이원 교차표를 그려서 최종 분류 결과를 확인한다.
library(gmodels)
CrossTable( mushrooms_test[ ,1], result1)
↑ ↑
실제 예측
| result1
mushrooms_test[, 1] | edible | poisonous | Row Total |
--------------------|-----------|-----------|-----------|
edible | 1049 | 7 | 1056 |
| 347.908 | 447.814 | |
| 0.993 | 0.007 | 0.520 |
| 0.918 | 0.008 | |
| 0.516 | 0.003 | |
--------------------|-----------|-----------|-----------|
poisonous | 94 | 881 | 975 |
| 376.811 | 485.017 | |
| 0.096 | 0.904 | 0.480 |
| 0.082 | 0.992 | |
| 0.046 | 0.434 | |
--------------------|-----------|-----------|-----------|
Column Total | 1143 | 888 | 2031 |
| 0.563 | 0.437 | |
--------------------|-----------|-----------|-----------|
8. 위의 모델의 성능을 올리시오 !
model2 <- naiveBayes(type~ . , data=mushrooms_train, laplace=0.0004)
result2 <- predict( model2, mushrooms_test[ , -1] )
CrossTable( mushrooms_test[ ,1], result2)
mushrooms_test[, 1] | edible | poisonous | Row Total |
--------------------|-----------|-----------|-----------|
edible | 1050 | 6 | 1056 |
| 459.814 | 496.053 | |
| 0.994 | 0.006 | 0.520 |
| 0.996 | 0.006 | |
| 0.517 | 0.003 | |
--------------------|-----------|-----------|-----------|
poisonous | 4 | 971 | 975 |
| 498.014 | 537.264 | |
| 0.004 | 0.996 | 0.480 |
| 0.004 | 0.994 | |
| 0.002 | 0.478 | |
--------------------|-----------|-----------|-----------|
Column Total | 1054 | 977 | 2031 |
| 0.519 | 0.481 | |
--------------------|-----------|-----------|-----------|
문제197. 위의 모델에 별도로 구분해 놓은 테스트 데이터 한개(독버섯)
8123 번 데이터를 넣어서 독버섯인지 정상인지 확인하시오 !
result3 <- predict( model2, mush_test )
문제198. (점심시간 문제) set.seed(1) 을 정확히 다시 설정하고
laplace 값을 0.0001 ~ 0.0017 까지 주고 FN 값을 확인하시오 !
laplace FN
0.0001 0
: :
: :
■ 라플라스 추정기 (P 155 페이지)
비아그라(w1) 돈(w2) 식료품(w3) 주소삭제(w4)
우도 Yes No Yes No Yes No Yes No
스팸 4/20 16/20 10/20 10/20 0/20 20/20 12/20 8/20 20
햄 1/80 79/80 14/80 66/80 8/80 71/80 23/80 57/80 80
총합 5/100 95/100 24/100 76/100 8/100 9/100 35/100 65/100 100
스팸의 우도?
햄의 우도?
※ 설명:
식료품으로 인해서 다른 증거들이 다 무효가 되어버렸다.
이를 해결하기 위해서 프랑스의 수학자 피에르 시몬 라플라스가
확률이 0이 되지 않기 위해서 빈도표의 각 값에 작은 수를 추가를 했다.
문제199.
나이브 베이즈의 알고리즘을 R 샤이니로 구현하시오
(기존 코드에서 추가시킨 나이브베이즈!!)
0. 나이브 베이즈 패키지 추가
#naive
package_in("e1071")
package_in("data.table")
1. 사이드 메뉴에 아래의 내용 추가
sidebar <- dashboardSidebar(
menuSubItem('Naive bayes',tabName = 'naive'),
)
2. 바디에 아래의 내용 추가
body <- dashboardBody(
#### naive
tabItem(tabName = "naive",
sidebarPanel(
uiOutput("dependents_delcol_naive"), #필요없는 컬럼삭제
uiOutput("dependents_selcol_naive"),#라벨컬럼선택
uiOutput("dependents_button_naive")#submit 버튼
#uiOutput("check_view_plot_naive"),
),
mainPanel(verbatimTextOutput("submit_input_sample_naive")),
#불필요한 컬럼 삭제 후 출력화면
mainPanel(verbatimTextOutput("TestTableRender_naive"), #이원교차표
style = "color:red; font-size:12px; font-style:italic;
overflow-y:scroll; max-height: 400px; background: ghostwhite;")
),
3. 서버에 아래의 내용 추가
server <- function(input, output,session) {
##naive
output$dependents_delcol_naive <- renderUI({
data <- dataload()
if (is.null(data)) return(NULL) #불필요한 컬럼 삭제시 작동되는 코드
checkboxGroupInput(inputId = 'in_che_delcol_naive',
label = "delete colmun:",
choices = colnames(data),
selected = 'null',
inline = FALSE
)
})
output$dependents_button_naive <- renderUI({
data <- dataload() #submit 버튼 눌렀을 때 작동되는 코드
if (is.null(data)) return(NULL)
actionButton("in_btn_submit_naive","Submit")
})
output$dependents_selcol_naive <- renderUI({
data <- dataload() #라벨컬럼 선택할 때 자동되는 코드
if (is.null(data)) return(NULL)
selectInput("in_sel_label_naive","Submit",choices = colnames(data))
})
#4. 서버에 UI output 에 아래의 내용추가
###############naive show, reactive
subinput_table_naive <- eventReactive(input$in_btn_submit_naive, {
req(input$file1)
file1 = input$file1
data = read.csv(file1$datapath,stringsAsFactors = T)
data1 <- data[,!(colnames(data) %in% input$in_che_delcol_naive )]
data1 <- na.omit(data1)
input_label <-as.formula(paste(colnames(data1[input$in_sel_label_naive]),"~."))
# return(input_label)
# size <- nrow(data1)
# index <- c(round(sample(1:size, size * 0.7)))
# train <- data1[index,]
# test <- data1[-index,]
train_cnt <- round(0.7 * dim(data1)[(colnames(data) %in% input$in_sel_label_naive)])
train_index <- sample(1:dim(data1)[(colnames(data) %in% input$in_sel_label_naive)], train_cnt, replace = F)
train <- data1[train_index, ]
test <- data1[-train_index, ]
model <- naiveBayes(input_label , data = train ,laplace = 0.0000001 )
result <- predict(model, test[,!(colnames(data1) %in% input$in_sel_label_naive )] )
cross_table <- CrossTable(test[,(colnames(data1) %in% input$in_sel_label_naive )] , result)
return(cross_table)
})
output$TestTableRender_naive <- renderPrint({
subinput_table_naive() #이원교차표 데이터 출력하는 화면
})
output$submit_input_sample_naive <- renderPrint({
req(input$file1) # 불필요한 컬럼 선택후 출력되는 화면
file1 = input$file1
data <- read.csv(file1$datapath)
data1 <- data[,!(colnames(data) %in% input$in_che_delcol_naive )]
return(head(data1,5))
})
문제200.
knn 과 나이브베이즈 두 개를 R 샤이니에 추가시키시오
(txt 파일 만들었음)
############## set this file location to working directory ##########################
packages <- 'rstudioapi'
if (length(setdiff(packages, rownames(installed.packages()))) > 0) {
install.packages(setdiff(packages, rownames(installed.packages())))
}
library('rstudioapi')
current_dir<-dirname(rstudioapi::getSourceEditorContext()$path)
setwd(current_dir)
package_in<-function(p_name,option=1){
packages <- p_name
if (length(setdiff(packages, rownames(installed.packages()))) > 0) {
install.packages(setdiff(packages, rownames(installed.packages())))
}
if (option==1){
library(p_name,character.only = TRUE)
}
}
###########################1. 패키지 설치##########################################
# 그래프
package_in('shinydashboard')
package_in('shiny')
package_in('ggplot2')
package_in('plotly')
package_in('lattice')
package_in('reshape')
#Knn
package_in("class")
package_in("gmodels")
#ann
package_in('nnet')
package_in('neuralnet')
package_in('stats')
#wordcloud
package_in("KoNLP")
package_in("wordcloud")
package_in('plyr')
package_in('data.table')
#priori
package_in('arules')
package_in('sna')
package_in('rgl')
#decision
package_in("C50")
package_in("gmodels")
package_in("rpart.plot")
#k_means
package_in("tripack")
package_in("RColorBrewer")
package_in("factoextra")
#naive
package_in("e1071")
package_in("data.table")
#rulebase
package_in("RWeka")
######################### 2. 화면 개발 ###########################################
sidebar <- dashboardSidebar(
sidebarMenu(
fileInput("file1", "Choose CSV File",
multiple = FALSE,
accept = c("text/csv",".xlsx",".txt",
"text/comma-separated-values,text/plain",
".csv")),
menuItem("테이블",
menuSubItem('Tableformat',tabName='tableformat') ),
menuItem("그래프",
menuSubItem('Barplot',tabName='barplot'),
menuSubItem('Piechart',tabName='piechart'),
menuSubItem('Lineplot',tabName='lineplot'),
menuSubItem('Scatterplot',tabName='scatterplot'),
menuSubItem('boxplot',tabName='boxplot')
),
menuItem("머신러닝",
menuSubItem('Knn',tabName = 'knn'),
menuSubItem('Naive bayes',tabName = 'naive')
)
)
)
body <- dashboardBody(
tabItems(
##### table_format
tabItem(tabName = "tableformat",
mainPanel(
DT::dataTableOutput("table")
)
),
##### bar plot
tabItem(tabName = "barplot",
sidebarPanel(
selectInput("in_sel_bar_yVar","y Variable:", choices = NULL),
selectInput("in_sel_bar_xVar","x Variable:", choices = NULL)
),
mainPanel(
plotOutput('plot_bar')
)
),
##### piechart
tabItem(tabName = "piechart",
sidebarPanel(
selectInput("in_sel_pie_xVar","x Variable:", choices = NULL)
),
mainPanel(
plotlyOutput('plot_pie')
)
),
##### line plot
tabItem(tabName = "lineplot",
sidebarPanel(
selectInput("in_sel_line_yVar","y Variable:", choices = NULL),
selectInput("in_sel_line_xVar","x Variable:", choices = NULL)
),
mainPanel(
plotlyOutput('plot_line')
)
),
##### scatter plot
tabItem(tabName = "scatterplot",
sidebarPanel(
selectInput("in_sel_scatter_yVar","y Variable:", choices = NULL),
selectInput("in_sel_scatter_xVar","x Variable:", choices = NULL)
),
mainPanel(
plotOutput('plot_scatter'),
textOutput('text_scatter')
)
),
##### scatter plot
tabItem(tabName = "boxplot",
sidebarPanel(
selectInput("in_sel_box_xVar","x Variable:", choices = NULL)
),
mainPanel(
plotOutput('plot_box')
)
),
#### knn
tabItem(tabName = "knn",
sidebarPanel(
uiOutput("dependents_delcol_knn", #컬럼 삭제하는 화면
style="overflow-y:scroll; max-height: 500px; background: ghostwhite;"), #화면 스크롤
uiOutput("dependents_selcol_knn"), #라벨 컬럼 선택하는 화면
uiOutput("dependents_button_knn") #knn 알고리즘 수행하는
#uiOutput("check_view_plot_knn"), #버튼 화면
), # 컬럼삭제하면 나머지 컬럼들 표시
mainPanel(verbatimTextOutput("submit_input_sample_knn"),
style="overflow-y:scroll: max-height: 500px; background: ghostwhite;"),
mainPanel(verbatimTextOutput("TestTableRender_knn"),
style = "color:red; font-size:12px; font-style:italic;
overflow-y:scroll; max-height: 400px; background: ghostwhite;")
),
#### naive
tabItem(tabName = "naive",
sidebarPanel(
uiOutput("dependents_delcol_naive"), # 컬럼 삭제하는 화면
uiOutput("dependents_selcol_naive"), # 라벨컬럼 선택하는 화면
uiOutput("dependents_button_naive") # submit 버튼 화면
#uiOutput("check_view_plot_naive"),
),
mainPanel(verbatimTextOutput("submit_input_sample_naive")),
mainPanel(verbatimTextOutput("TestTableRender_naive"),
style = "color:red; font-size:12px; font-style:italic;
overflow-y:scroll; max-height: 400px; background: ghostwhite;")
)
)
)
ui<-dashboardPage(
dashboardHeader(title='my graph'),
sidebar,
body
)
######################3. 서버단 개발 ########################################
server <- function(input, output,session) {
options(warn = -1)
options(shiny.maxRequestSize = 30*1024^2)
dataload<-reactive({
req(input$file1)
file1 = input$file1
data1 = read.csv(file1$datapath)
updateSelectInput(session, "in_sel_bar_xVar", choices = colnames(data1))
updateSelectInput(session, "in_sel_bar_yVar", choices = colnames(data1))
updateSelectInput(session, "in_sel_pie_xVar", choices = data1[,1])
updateSelectInput(session, "in_sel_line_xVar", choices = colnames(data1))
updateSelectInput(session, "in_sel_line_yVar", choices = colnames(data1))
updateSelectInput(session, "in_sel_scatter_xVar", choices = colnames(data1))
updateSelectInput(session, "in_sel_scatter_yVar", choices = colnames(data1))
updateSelectInput(session, "in_sel_box_xVar", choices = colnames(data1))
return(data1)
})
####table_format
output$table <- DT::renderDataTable(DT::datatable({
req(input$file1)
file1 = input$file1
data1 = read.csv(file1$datapath)
}))
####nomal_bar
output$plot_bar <- renderPlot({
table_in<-dataload()
xdata<-as.factor(table_in[,input$in_sel_bar_xVar])
ydata<-as.factor(table_in[,input$in_sel_bar_yVar])
fdata=data.frame(x=xdata,y=ydata)
ggplot(fdata) +
geom_bar(aes_string(x='x',y='y',fill='x'),stat = "identity",show.legend=F)
})
output$plot_pie <- renderPlotly({
table_in<-dataload()
plot_ly(table_in, labels = ~colnames(table_in)[-1], values=~as.factor( table_in[table_in[,1] == input$in_sel_pie_xVar,-1] ),type='pie')
})
output$plot_line <- renderPlotly({
table_in<-dataload()
x <- list(title = input$in_sel_line_xVar)
y <- list(title = input$in_sel_line_yVar)
plot_ly(data = table_in,x=~table_in[,input$in_sel_line_xVar],y=~table_in[,input$in_sel_line_yVar],type='scatter',mode='dot')%>%
layout(xaxis = x, yaxis = y)
})
output$plot_scatter <- renderPlot({
table_in<-dataload()
xyplot(table_in[,input$in_sel_scatter_yVar]~table_in[,input$in_sel_scatter_xVar], grid=T,type=c('p','smooth'),col.line='darkorange',lwd=2, xlab=input$in_sel_scatter_xVar,ylab=input$in_sel_scatter_yVar)
})
output$text_scatter <- renderText({
table_in<-dataload()
paste("The correlation between the two is: ", cor(table_in[,input$in_sel_scatter_yVar],table_in[,input$in_sel_scatter_xVar]))
})
output$plot_box <- renderPlot({
table_in<-dataload()
bwplot(~table_in[,input$in_sel_box_xVar], data=table_in,xlab=input$in_sel_box_xVar)
})
## knn UI input
output$dependents_delcol_knn <- renderUI({
data <- dataload()
if (is.null(data)) return(NULL)
checkboxGroupInput(inputId = 'in_che_delcol_knn',
label = "delete colmun:", #필요없는 컬럼을
choices = colnames(data), #삭제하는 코드
selected = 'null',
inline = FALSE
)
})
output$dependents_button_knn <- renderUI({
data <- dataload() #knn 모델을 돌리겠금
if (is.null(data)) return(NULL) #action 버튼을 누르는 코드
actionButton("in_btn_submit_knn","Submit")
})
output$dependents_selcol_knn <- renderUI({
data <- dataload() #라벨이 어떤 컬럼인지
if (is.null(data)) return(NULL) #선택하는 코드
selectInput("in_sel_label_knn","Submit",choices = colnames(data))
})
normalize <- function(x) {
return (( x - min(x)) / (max(x) -min(x)))
}
##naive
output$dependents_delcol_naive <- renderUI({
data <- dataload()
if (is.null(data)) return(NULL)
checkboxGroupInput(inputId = 'in_che_delcol_naive',
label = "delete colmun:", #필요없는 컬럼 삭제하는 코드
choices = colnames(data),
selected = 'null',
inline = FALSE
)
})
output$dependents_button_naive <- renderUI({
data <- dataload()
if (is.null(data)) return(NULL)
actionButton("in_btn_submit_naive","Submit")
})
output$dependents_selcol_naive <- renderUI({
data <- dataload()
if (is.null(data)) return(NULL)
selectInput("in_sel_label_naive","Submit",choices = colnames(data))
})
###############knn show, reactive
subinput_table_knn <- eventReactive(input$in_btn_submit_knn, {
req(input$file1)
file1 = input$file1
data = read.csv(file1$datapath,stringsAsFactors =FALSE)
data1<-as.data.frame(lapply(data[,-which(colnames(data)==input$in_sel_label_knn)],
#제껴라! # 라벨컬럼
normalize))
# min/max 를 이용한 normalize
train_index = as.integer(trunc(nrow(data1) *0.8)) #0.8은 임의정함. 바꿔도 노상관
train <- data1[1:as.integer(train_index), ] #숫자로 바꿔줘야 한다.(인식못함)
#[1:367]
test <- data1[as.integer(train_index+1):as.integer(nrow(data1)), ]
train_label <-data[1:as.integer(train_index),which(colnames(data)==input$in_sel_label_knn)]
#다시 라벨 집어넣어줌
test_label <- data[as.integer(train_index+1):as.integer(nrow(data1)),which(colnames(data)==input$in_sel_label_knn) ]
train_label <- factor(train_label )
#test_label <- factor(test_label)
### k 값 훈련데이터의 제곱근--------
k<-sqrt(nrow(train))
k<-round(k)
result <- knn(train=train , test=test , cl=train_label, k ) # k값 조정가능 (k=전체로우row의 제곱근)
cross_table <- CrossTable(test_label , result, prop.chisq=FALSE ) #이원교차표
return(cross_table)
})
#output 이 2개다
output$TestTableRender_knn <- renderPrint({
subinput_table_knn() #이원교차표
})
output$submit_input_sample_knn <- renderPrint({
req(input$file1)
file1 = input$file1
data <- read.csv(file1$datapath)
data1 <- data[,!(colnames(data) %in% input$in_che_delcol_knn )]
return(head(data1,2))
})
###############naive show, reactive
subinput_table_naive <- eventReactive(input$in_btn_submit_naive, {
req(input$file1)
file1 = input$file1
data = read.csv(file1$datapath,stringsAsFactors = T)
data1 <- data[,!(colnames(data) %in% input$in_che_delcol_naive )]
data1 <- na.omit(data1)
input_label <-as.formula(paste(colnames(data1[input$in_sel_label_naive]),"~."))
# return(input_label)
# size <- nrow(data1)
# index <- c(round(sample(1:size, size * 0.7)))
# train <- data1[index,]
# test <- data1[-index,]
set.seed(1)
train_cnt <- round(0.75 * dim(data1)[(colnames(data) %in% input$in_sel_label_naive)])
train_index <- sample(1:dim(data1)[(colnames(data) %in% input$in_sel_label_naive)],
train_cnt, replace = F)
train <- data1[train_index, ]
test <- data1[-train_index, ]
model <- naiveBayes(input_label , data = train ,laplace = 0.0001 )
result <- predict(model, test[,!(colnames(data1) %in% input$in_sel_label_naive )] )
cross_table <- CrossTable(test[,(colnames(data1) %in% input$in_sel_label_naive )] , result)
return(cross_table)
})
output$TestTableRender_naive <- renderPrint({
subinput_table_naive()
})
output$submit_input_sample_naive <- renderPrint({
req(input$file1)
file1 = input$file1
data <- read.csv(file1$datapath)
data1 <- data[,!(colnames(data) %in% input$in_che_delcol_naive )]
return(head(data1,5))
})
}
######################### 4. 샤이니 실행 ###############################
shinyApp(ui = ui, server = server)