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=F)
train_data <- movie[k, ]
test_data <- movie[-k, ]
# 나이브 베이즈 모델 생성
new_model <- naive_bayes(장르 ~ ., data=train_data)
# UI 정의
ui <- fluidPage(
tags$style(HTML("
body {
background-color: #141414; /* 전체 배경색 설정 */
color: #141414; /* 전체 텍스트 색상 설정 */
font-family: 'Arial Rounded MT Bold', sans-serif; /* 폰트 설정 */
}
.sidebar {
background-color: #FFFFFF; /* 사이드바 배경색 설정 */
border: 1px solid #E50914;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
padding: 15px;
margin-top: 20px;
font-family: 'Arial Rounded MT Bold', sans-serif; /* 사이드바 글꼴 설정 */
}
.sidebar .selectize-input,
.sidebar .selectize-dropdown {
font-weight: bold; /* 사이드바에서 텍스트를 더 굵게 설정 */
}
.main-container {
margin-top: 20px;
padding: 20px;
background-color: #1D1D1D;
border: 1px solid #E50914;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
font-family: 'Arial Rounded MT Bold', sans-serif; /* 메인 컨테이너 글꼴 설정 */
}
.prediction-text {
font-weight: bold;
font-size: 1.2em; /* 결과 출력 부분 글꼴 크기 설정 */
color: #FFFFFF; /* 결과 출력 부분 글꼴 색상 설정 */
font-family: 'Arial Rounded MT Bold', sans-serif; /* 결과 출력 부분 글꼴 설정 */
}
.app-title {
font-size: 2em; /* 앱 제목 글꼴 크기 설정 */
font-weight: bold; /* 앱 제목 글꼴 두껍게 설정 */
font-family: 'Arial Rounded MT Bold', sans-serif; /* 앱 제목 글꼴 설정 */
color: #FFFFFF; /* 앱 제목 글꼴 색상 설정 */
}
")),
titlePanel(div(class = "app-title", "영화 분류 예측기")), # 여기서 제목 수정 가능
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", "예측하기", style = "color: #FFFFFF; background-color: #E50914; border-color: #E50914;")
),
mainPanel(
uiOutput("prediction_ui")
)
)
)
# 서버 로직 정의
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")
# 결과를 백분율로 변환하는 함수 정의
to_percentage <- function(x) {
round(x * 100, 1) # 백분율을 소수점 첫째자리까지 반올림
}
# 결과를 백분율로 변환
result_percentage <- apply(result, 2, to_percentage)
# 결과를 정렬하여 데이터 프레임으로 변환
result_df <- data.frame(장르 = names(result_percentage), 확률 = as.vector(result_percentage))
# 결과를 원하는 형식으로 출력
output$prediction_ui <- renderUI({
tags$div(class = "prediction-text",
tags$ul(
lapply(seq_len(nrow(result_df)), function(i) {
tags$li(paste(sprintf("%-10s %s%%", result_df[i, "장르"], result_df[i, "확률"])))
})
)
)
})
})
}
# Shiny 앱 실행
shinyApp(ui = ui, server = server)