■ 나이브베이즈 분류
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)