if (!require("shiny")) install.packages("shiny") if (!require("naivebayes")) install.packages("naivebayes") if (!require("e1071")) install.packages("e1071") if (!require("caret")) install.packages("caret")
library(shiny) library(naivebayes) library(e1071) library(caret)
# 데이터 불러오기 movie <- read.csv("c:\\data\\movie2.csv", stringsAsFactors=TRUE, fileEncoding = "euc-kr")
# 결측치 확인 colSums(is.na(movie))
# 훈련 데이터와 테스트 데이터로 분리 set.seed(1) k <- createDataPartition(movie$장르, p=0.8, list=FALSE) train_data <- movie[k, ] test_data <- movie[-k, ]
# 나이브 베이즈 모델 생성 new_model <- naive_bayes(장르 ~ ., data=train_data)
# UI 정의 ui <- fluidPage( tags$head( tags$style(HTML(" .title { text-align: center; } .seagreen-button { background-color: seagreen; color: white; border-color: seagreen; font-weight: bold; } ")) ), titlePanel("영화 장르 예측기", windowTitle = "영화 장르 예측기"), fluidRow( column(2, selectInput("age", "나이", choices = unique(movie$나이)) ), column(2, selectInput("gender", "성별", choices = unique(movie$성별)) ), column(2, selectInput("job", "직업", choices = unique(movie$직업)) ), column(2, selectInput("married", "결혼 여부", choices = unique(movie$결혼여부)) ), column(2, selectInput("relationship", "이성 친구 여부", choices = unique(movie$이성친구)) ) ), fluidRow( column(12, align = "center", actionButton("predict", "예측하기", class = "seagreen-button") ) ), fluidRow( column(12, verbatimTextOutput("prediction"), textOutput("top_genre") ) ) )
# 서버 로직 정의 server <- function(input, output) { observeEvent(input$predict, { test_data <- data.frame( 나이 = input$age, 성별 = input$gender, 직업 = input$job, 결혼여부 = input$married, 이성친구 = input$relationship ) result <- predict(new_model, test_data, type = "prob") output$prediction <- renderPrint({ result }) output$top_genre <- renderText({ top_genre_index <- which.max(result[1, ]) # 첫 번째 예측 결과의 가장 높은 확률을 가진 장르 인덱스 top_genre_name <- colnames(result)[top_genre_index] # 해당 인덱스에 해당하는 장르 이름 paste("가장 높은 확률을 가진 장르:", top_genre_name) }) }) }
# Shiny 앱 실행 shinyApp(ui = ui, server = server) |