영화 장르 예측을 할 수 있는 정보 입력 방식을 파일 업로드 방식과 수동 입력 방식 두 개로 설정하고, 이를 각각의 탭에서 구할 수 있도록 구현함.
또한, 시각적 편의성을 위해 소수점 세번째 자리까지 반올림함.
library(shiny)
library(naivebayes)
library(e1071)
library(caret)
library(shinythemes)
library(readxl) # 엑셀 파일을 읽기 위한 패키지
# 데이터 불러오기
movie <- read.csv("c:\\data\\movie2.csv", stringsAsFactors=TRUE, fileEncoding = "euc-kr")
# 결측치 확인
colSums(is.na(movie))
# 훈련 데이터와 테스트 데이터로 분리
k <- createDataPartition(movie$장르, p=0.8, list=F)
train_data <- movie[k, ]
test_data <- movie[-k, ]
train_data
# 나이브 베이즈 모델 생성
new_model <- naive_bayes(장르 ~ . , data=train_data)
# UI 정의
ui <- navbarPage(
theme = shinytheme("united"),
title = "영화 장르 예측기",
tabPanel("파일 업로드",
sidebarLayout(
sidebarPanel(
fileInput("file1", "엑셀 파일 업로드", accept = c(".xlsx")),
actionButton("predict_file", "예측하기")
),
mainPanel(
tableOutput("contents"),
verbatimTextOutput("prediction_file")
)
)
),
tabPanel("수동 입력",
sidebarLayout(
sidebarPanel(
selectInput("age", "나이", choices = unique(movie$나이)),
selectInput("gender", "성별", choices = unique(movie$성별)),
selectInput("job", "직업", choices = unique(movie$직업)),
selectInput("married", "결혼여부", choices = unique(movie$결혼여부)),
selectInput("relationship", "이성친구 여부", choices = unique(movie$이성친구)),
actionButton("predict_manual", "예측하기")
),
mainPanel(
verbatimTextOutput("prediction_manual")
)
)
)
)
# 서버 로직 정의
server <- function(input, output, session) {
uploaded_data <- reactive({
req(input$file1)
inFile <- input$file1
read_excel(inFile$datapath)
})
output$contents <- renderTable({
req(input$file1)
uploaded_data()
})
observeEvent(input$predict_file, {
req(uploaded_data())
test_data <- uploaded_data()
if (!all(c("나이", "성별", "직업", "결혼여부", "이성친구") %in% colnames(test_data))) {
output$prediction_file <- renderPrint({
"업로드된 파일에 필요한 열(나이, 성별, 직업, 결혼여부, 이성친구)이 없습니다."
})
} else {
result <- predict(new_model, test_data, type = "prob")
result2 <- round(result, 3)
output$prediction_file <- renderPrint({
result2
})
}
})
observeEvent(input$predict_manual, {
test_data <- data.frame(
나이 = input$age,
성별 = input$gender,
직업 = input$job,
결혼여부 = input$married,
이성친구 = input$relationship
)
result <- predict(new_model, test_data, type = "prob")
result2 <- round(result, 3)
output$prediction_manual <- renderPrint({
result2
})
})
}
# Shiny 앱 실행
shinyApp(ui = ui, server = server)