library(shiny)
library(naivebayes)
library(e1071)
library(caret)
# 데이터 불러오기
movie <- read.csv("c:\\data\\movie2.csv", stringsAsFactors=TRUE, fileEncoding = "euc-kr")
# 나이를 범주형 변수로 변환
movie$나이 <- factor(movie$나이, levels = c("10대", "20대", "30대", "40대"))
# 결측치 확인
colSums(is.na(movie))
# 훈련 데이터와 테스트 데이터로 분리
set.seed(1)
k <- createDataPartition(movie$장르, p=0.8, list=F)
train_data <- movie[k, ]
test_data <- movie[-k, ]
# 나이브 베이즈 모델 생성
new_model <- naive_bayes(장르 ~ ., data=train_data)
# UI 정의
ui <- fluidPage(
titlePanel("영화 장르 예측기"),
sidebarLayout(
sidebarPanel(
selectInput("age", "나이", choices = c("10대", "20대", "30대", "40대")),
radioButtons("gender", "성별", choices = unique(movie$성별)),
selectInput("job", "직업", choices = unique(movie$직업)),
radioButtons("married", "결혼여부", choices = unique(movie$결혼여부)),
radioButtons("relationship", "이성친구 여부", choices = unique(movie$이성친구)),
actionButton("predict", "예측하기")
),
mainPanel(
verbatimTextOutput("prediction")
)
),
tags$head(
tags$style(HTML("
body { background-color: #f0f8ff; }
.shiny-output-error { color: red; }
.shiny-output-error:before { content: 'Error: '; }
.shiny-text-output { color: #2e8b57; font-size: 16px; font-weight: bold; }
"))
)
)
# 서버 로직 정의
server <- function(input, output) {
observeEvent(input$predict, {
test_data <- data.frame(
나이 = factor(input$age, levels = c("10대", "20대", "30대", "40대")),
성별 = input$gender,
직업 = input$job,
결혼여부 = input$married,
이성친구 = input$relationship
)
result <- predict(new_model, test_data, type = "prob")
output$prediction <- renderText({
result_percent <- round(result * 100, 2)
result_with_percent <- paste0(colnames(result_percent), " : ", as.numeric(result_percent), "%")
paste(result_with_percent, collapse = "\n")
})
})
}
# Shiny 앱 실행
shinyApp(ui = ui, server = server)