경기도에는 100개에 가까운 공공체육시설이 있습니다.
또한 앞으로도 다수의 공공체육시설 건설이 계획되고 있습니다.
이렇게 건립된 공공체육시설은 최소 30년 이상 운영됩니다.
시민들의 건강과 삶의 질을 향상시키기 위한 공공성이 우선될 것입니다.
그래서 시민들에게 과도한 금전적 부담을 지울 수는 없습니다.
이는 운영비의 상당 부분을 지방정부의 재원으로 충당해야 함을 의미합니다.
그렇다면 계획단계에서부터, 이정도 규모의 시설이라면 어느 정도의 운영비가 들어갈 것인지, 사전적으로 분석이 이루어져야 할 것입니다.
그렇지만 안타깝게도, 현재 경기도 공공체육시설이 준공 후 어느 정도의 운영비가 소모될 것인지에 대한 체계적인 정보가 존재하지 않습니다.
그렇기 때문에 현재 공공체육시설 계획단계에서 운영비 추정은, 주먹구구식으로 이루어지는게 보통입니다.
그래서 본 연구는, 계획단계에서 참조할 수 있는 경기도 공공체육시설의 표준 운영비를 제시하고자 합니다.
계획 단계에서 사전적으로, 준공 후 어느 정도의 재정지원이 필요할 것인지 파악할 수 있는 체계적인 자료를 도출하는 것이 목표입니다.
어떠한 과정을 거쳐 경기도 공공체육시설의 운영비 표준모형을 도출하였는지, 시각화 기법을 적극적으로 사용하여 논지를 전개해나가고자 합니다.
분석에 사용될 패키지/라이브러리를 로드합니다.
library(readxl)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(ggplot2)
library(reshape2)
library(car)
## Warning: package 'car' was built under R version 4.0.4
## Loading required package: carData
##
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
##
## recode
경기도 공공체육관 데이터를 불러옵니다.
ath0 <- read_xlsx("E:\\_work_category\\공투 연구\\2020\\체육시설\\R\\ath0_final.xlsx", sheet = "total1")
기술통계분석을 위한 약간의 기초작업을 수행합니다. 연면적 및 총 운영비를 로그변환하고, 수영장 유무와 규모변수를 만듭니다.
ath0$ln_area <- log10(ath0$area)
ath0$ln_total_cost <- log10(ath0$total_cost)
ath0$pool_yn_l <- ifelse(ath0$pool_yn == 1, "1_수영장 있음", "2_수영장 없음")
ath0$pool_yn_l2 <- ifelse(ath0$pool_yn == 0 & ath0$area_type == "대형", "3_수영장 없는\n 대형시설", ath0$pool_yn_l)
# 경기도 체육시설의 연면적 분포. 역시 천차만별
ggplot(ath0, aes(x = area)) + geom_histogram(bins = 10, fill = "grey60", color = "black") +
theme(axis.text.x = element_text(size = rel(1.5)), axis.text.y = element_text(size = rel(1.5)),
axis.title.x = element_text(size = rel(1.5)), axis.title.y = element_text(size = rel(1.5))) +
labs(x = expression(연면적(m^2)), y = "빈도(개소)", size = 5) +
scale_x_continuous(breaks = c(0, 5000, 10000, 15000),
labels = c("0", "5,000", "10,000", "15,000"))
ggplot(ath0, aes(x = hr_total)) + geom_histogram(bins = 10, fill = "grey60", color = "black") +
theme(axis.text.x = element_text(size = rel(1.2)), axis.text.y = element_text(size = rel(1.2)),
axis.title.x = element_text(size = rel(1.5)), axis.title.y = element_text(size = rel(1.5))) +
labs(x = "총 인력(명)", y = "빈도(개소)", size = 5)
ggplot(ath0, aes(x = total_cost/1000)) + geom_histogram(bins = 10, fill = "grey60", color = "black") +
theme(axis.text.x = element_text(size = rel(1.5)), axis.text.y = element_text(size = rel(1.5)),
axis.title.x = element_text(size = rel(1.5)), axis.title.y = element_text(size = rel(1.5))) +
labs(x = "총 운영비(백만원)", y = "빈도(개소)", size = 5) +
scale_x_continuous(breaks = c(0, 2000, 4000, 6000),
labels = c("0", "2,000", "4,000", "6,000"))
ggplot(ath0, aes(x = area, y = total_cost/1000)) + geom_point(size = 3, alpha = .5) +
theme(axis.text.x = element_text(size = rel(1.2)), axis.text.y = element_text(size = rel(1.2)),
axis.title.x = element_text(size = rel(1.5)), axis.title.y = element_text(size = rel(1.5))) +
labs(x = expression(연면적(m^2)), y = "총 운영비(백만원)", size = 5) +
scale_x_continuous(limits = c(0, 16000),
breaks = c(0, 5000, 10000, 15000),
labels = c("0", "5,000", "10,000", "15,000")) +
scale_y_continuous(limits = c(0, 7500),
breaks = c(0, 2000, 4000, 6000),
labels = c("0", "2,000", "4,000", "6,000"))
총 운영비(로그) = β_0 + β_1×연면적(로그) + β_2×강사 수 β_3×관리직 수 + β_4×수영장 유무 + ε
model1 <- lm(data = ath0, ln_total_cost ~ ln_area + hr_teacher + hr_mag + pool_yn)
summary(model1)
##
## Call:
## lm(formula = ln_total_cost ~ ln_area + hr_teacher + hr_mag +
## pool_yn, data = ath0)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.7199 -0.2209 -0.0066 0.2709 0.5669
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.832710 0.321849 11.908 < 2e-16 ***
## ln_area 0.445470 0.103382 4.309 5.67e-05 ***
## hr_teacher 0.002964 0.002453 1.208 0.231
## hr_mag 0.009794 0.003834 2.555 0.013 *
## pool_yn 0.637695 0.114607 5.564 5.35e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2994 on 65 degrees of freedom
## Multiple R-squared: 0.7929, Adjusted R-squared: 0.7801
## F-statistic: 62.2 on 4 and 65 DF, p-value: < 2.2e-16
t3 <- Anova(model1)
t3
## Anova Table (Type II tests)
##
## Response: ln_total_cost
## Sum Sq Df F value Pr(>F)
## ln_area 1.6642 1 18.5671 5.671e-05 ***
## hr_teacher 0.1308 1 1.4597 0.23136
## hr_mag 0.5849 1 6.5259 0.01298 *
## pool_yn 2.7750 1 30.9604 5.351e-07 ***
## Residuals 5.8261 65
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ssr3 <- t3$`Sum Sq`[1:4]
name <- c("연면적", "강사 수", "관리인력 수", "수영장 유무")
std_cluster <- data.frame(name, ssr3)
std_cluster$label <- round(std_cluster$ssr, 2)
std_cluster
## name ssr3 label
## 1 연면적 1.6642014 1.66
## 2 강사 수 0.1308336 0.13
## 3 관리인력 수 0.5849320 0.58
## 4 수영장 유무 2.7750415 2.78
ggplot(std_cluster, aes(x = name, y = ssr3)) + geom_bar(stat = "identity", fill = "grey60", color = "black") +
geom_text(aes(label = label), size = 10, vjust = -.5, color ="grey30") +
theme(axis.text.x = element_text(size = rel(2)), axis.text.y = element_text(size = rel(2)),
axis.title.x = element_text(size = rel(1.5)), axis.title.y = element_text(size = rel(1.5))) +
labs(x = "변수명", y = "3종제곱합(Type Ⅲ sum of square)") +
ylim(0, 3.3)
l1 <- expression(log(10^1))
l2 <- expression(log(10^2))
l3 <- expression(log(10^3))
l4 <- expression(log(10^4))
l5 <- expression(log(10^5))
l6 <- expression(log(10^6))
l7 <- expression(log(10^7))
ggplot(ath0, aes(x = ln_area, y = ln_total_cost)) + geom_point(size = 5, alpha = .5) +
theme(axis.text.x = element_text(size = rel(1.2)), axis.text.y = element_text(size = rel(1.2)),
axis.title.x = element_text(size = rel(1.5)), axis.title.y = element_text(size = rel(1.5))) +
labs(x = expression(연면적(m^2, 로그변환)), y = "총 운영비(천원, 로그변환)") +
scale_x_continuous(limits = c(2, 4.5), breaks = c(2, 3, 4), labels = c(l2, l3, l4)) +
scale_y_continuous(limits = c(4, 7.5), breaks = c(4, 5, 6, 7), labels = c(l4, l5, l6, l7))
ath0$수영장_유무 <- ath0$pool_yn_l
ggplot(ath0, aes(x = ln_area, y = ln_total_cost, shape = 수영장_유무, color = 수영장_유무)) + geom_point(size = 5, alpha = .5) +
theme(axis.text.x = element_text(size = rel(1.2)), axis.text.y = element_text(size = rel(1.2)),
axis.title.x = element_text(size = rel(1.5)), axis.title.y = element_text(size = rel(1.5))) +
labs(x = expression(연면적(m^2, 로그변환)), y = "총 운영비(천원, 로그변환)") +
scale_x_continuous(limits = c(2, 4.5), breaks = c(2, 3, 4), labels = c(l2, l3, l4)) +
scale_y_continuous(limits = c(4, 7.5), breaks = c(4, 5, 6, 7), labels = c(l4, l5, l6, l7)) +
scale_color_manual(values = c("grey10", "grey50")) +
theme(legend.title = element_text(size = 15))
area_div <- subset(ath0, select = c("area"))
sse <- c()
for(i in 2000:4000)
{
area_div$x <- i
area_div$se <- (area_div$area - area_div$x)^2
sse <- rbind(sse, sum(area_div$se))
}
sse_plot <- data.frame(2000:4000, sse)
names(sse_plot) <- c("area", "sse")
min(sse_plot$sse)
## [1] 807109817
which(sse_plot$sse == min(sse_plot$sse))
## [1] 1239
sse_plot[1239,]
## area sse
## 1239 3238 807109817
ggplot(sse_plot, aes(x = area, y = sse/1000000)) + geom_line(size = 1, color = "grey50") +
scale_x_continuous(breaks = c(2000, 2500, 3000, 3500, 4000),
labels = c("2,000", "2,500", "3,000", "3,500", "4,000")) +
theme(axis.text.x = element_text(size = rel(1.2)), axis.text.y = element_text(size = rel(1.2)),
axis.title.x = element_text(size = rel(1.5)), axis.title.y = element_text(size = rel(1.5))) +
labs(x = expression(연면적_구분기준(m^2)), y = "관측치의 오차제곱합(백만)")
ggplot(sse_plot, aes(x = area, y = sse/1000000)) + geom_line(size = 1, color = "grey50") +
geom_vline(xintercept = 3238, linetype = 3, size = 1, color = "grey50") +
scale_x_continuous(breaks = c(2000, 2500, 3000, 3238, 3500, 4000),
labels = c("2,000", "2,500", "3,000", "3,238", "3,500", "4,000")) +
theme(axis.text.x = element_text(size = rel(1.2), color = c("black", "black", "black", "grey50", "black", "black")),
axis.text.y = element_text(size = rel(1.5)),
axis.title.x = element_text(size = rel(1.5)), axis.title.y = element_text(size = rel(1.5))) +
labs(x = expression(연면적_구분기준(m^2)), y = "관측치의 오차제곱합(백만)")
## Warning: Vectorized input to `element_text()` is not officially supported.
## Results may be unexpected or may change in future versions of ggplot2.
ggplot(ath0, aes(x = ln_area, y = ln_total_cost, shape = 수영장_유무, color = 수영장_유무)) + geom_point(size = 5, alpha = .5) +
theme(axis.text.x = element_text(size = rel(1.2)), axis.text.y = element_text(size = rel(1.2)),
axis.title.x = element_text(size = rel(1.5)), axis.title.y = element_text(size = rel(1.5))) +
labs(x = expression(연면적(m^2, 로그변환)), y = "총 운영비(천원, 로그변환)") +
scale_x_continuous(limits = c(2, 4.5), breaks = c(2, 3, 4), labels = c(l2, l3, l4)) +
scale_y_continuous(limits = c(4, 7.5), breaks = c(4, 5, 6, 7), labels = c(l4, l5, l6, l7)) +
scale_color_manual(values = c("grey10", "grey50")) +
theme(legend.title = element_text(size = 15)) +
geom_vline(aes(xintercept = 3.510277), color = "grey50", linetype = 3) +
annotate("text", x = 3.25, y = 4.25, label = "연면적 3,238m^2", size = 5)
ggplot(ath0, aes(x = ln_area, y = ln_total_cost, shape = 수영장_유무, color = 수영장_유무)) + geom_point(size = 5, alpha = .8) +
theme(axis.text.x = element_text(size = rel(1.2)), axis.text.y = element_text(size = rel(1.2)),
axis.title.x = element_text(size = rel(1.5)), axis.title.y = element_text(size = rel(1.5))) +
labs(x = expression(연면적(m^2, 로그변환)), y = "총 운영비(천원, 로그변환)") +
scale_x_continuous(limits = c(2, 4.5), breaks = c(2, 3, 4), labels = c(l2, l3, l4)) +
scale_y_continuous(limits = c(4, 7.5), breaks = c(4, 5, 6, 7), labels = c(l4, l5, l6, l7)) +
scale_color_manual(values = c("grey10", "grey50")) +
theme(legend.title = element_text(size = 15)) +
geom_vline(aes(xintercept = 3.510277), color = "grey50", linetype = 3) +
annotate("text", x = 3.15, y = 4.1, label = "연면적 3,238m^2\n기준선", size = 4, color = "grey50") +
geom_vline(aes(xintercept = 3.575188), color = "grey30", linetype = 2) +
annotate("text", x = 3.95, y = 4.1, label = "연면적 3,760m^2\n기준선", size = 4, color = "grey30")
ggplot(ath0, aes(x = ln_area, y = ln_total_cost, shape = 수영장_유무, color = 수영장_유무)) + geom_point(size = 5, alpha = .8) +
theme(axis.text.x = element_text(size = rel(1.2)), axis.text.y = element_text(size = rel(1.2)),
axis.title.x = element_text(size = rel(1.5)), axis.title.y = element_text(size = rel(1.5))) +
labs(x = expression(연면적(m^2, 로그변환)), y = "총 운영비(천원, 로그변환)") +
scale_x_continuous(limits = c(2, 4.5), breaks = c(2, 3, 4), labels = c(l2, l3, l4)) +
scale_y_continuous(limits = c(4, 7.5), breaks = c(4, 5, 6, 7), labels = c(l4, l5, l6, l7)) +
scale_color_manual(values = c("grey10", "grey50")) +
theme(legend.title = element_text(size = 15)) +
geom_vline(aes(xintercept = 3.575188), color = "grey30", linetype = 2) +
annotate("text", x = 3.95, y = 4.1, label = "연면적 3,760m^2\n기준선", size = 4, color = "grey30")
type0 <- c(1, 2, 3, 4)
t0l <-c("1_수영장 없음(소형)", "2_수영장 없음(대형)", "3_수영장 있음(소형)", "4_수영장 있음(대형)")
tl <- data.frame(type0, t0l)
ath00 <- merge(ath0, tl, by = "type0")
ath00$유형구분 <- ath00$t0l
table(ath00$유형구분)
##
## 1_수영장 없음(소형) 2_수영장 없음(대형) 3_수영장 있음(소형) 4_수영장 있음(대형)
## 35 4 17 14
ggplot(ath00, aes(x = ln_area, y = ln_total_cost, shape = 유형구분, color = 유형구분)) + geom_point(size = 5, alpha = .8) +
theme(axis.text.x = element_text(size = rel(1.2)), axis.text.y = element_text(size = rel(1.2)),
axis.title.x = element_text(size = rel(1.5)), axis.title.y = element_text(size = rel(1.5))) +
labs(x = expression(연면적(m^2, 로그변환)), y = "총 운영비(천원, 로그변환)") +
scale_x_continuous(limits = c(2, 4.5), breaks = c(2, 3, 4), labels = c(l2, l3, l4)) +
scale_y_continuous(limits = c(4, 7.5), breaks = c(4, 5, 6, 7), labels = c(l4, l5, l6, l7)) +
scale_color_manual(values = c("grey10", "grey25", "grey40", "grey55")) +
theme(legend.title = element_text(size = 15)) +
geom_vline(aes(xintercept = 3.575188), color = "grey50", linetype = 2) +
annotate("text", x = 3.95, y = 4.15, label = "연면적 3,760m^2\n기준선", size = 4, color = "grey50") +
scale_shape_manual(values = c(16, 17, 15, 18))
mag <- ath00 %>%
group_by(유형구분) %>%
summarize(p000 = min(hr_mag, na.rm = TRUE),
p010 = quantile(hr_mag, prob = .1, na.rm = TRUE)[[1]],
p025 = quantile(hr_mag, na.rm = TRUE)[[2]],
p050 = median(hr_mag, na.rm = TRUE),
p075 = quantile(hr_mag, na.rm = TRUE)[[4]],
p090 = quantile(hr_mag, prob = .9, na.rm = TRUE)[[1]],
p100 = max(hr_mag, na.rm = TRUE))
mag_t <- melt(mag, id.var = "유형구분")
mag_t$x <- as.numeric(substr(mag_t$variable, 2, 4))
ggplot(mag_t, aes(x = x, y = value, shape = 유형구분, linetype = 유형구분, color = 유형구분)) +
geom_point(size = 3) + geom_line(size = 1) +
theme(legend.title = element_text(size = 15)) +
theme(axis.text.x = element_text(size = rel(1.2)), axis.text.y = element_text(size = rel(1.2)),
axis.title.x = element_text(size = rel(1.5)), axis.title.y = element_text(size = rel(1.5))) +
labs(x = "백분위수(%)", y = "관리인력규모(명)") +
scale_x_continuous(breaks = c(0, 10, 25, 50, 75, 90, 100)) +
scale_color_manual(values = c("grey10", "grey25", "grey40", "grey55")) +
scale_shape_manual(values = c(16, 17, 15, 18))
teacher <- ath00 %>%
group_by(유형구분) %>%
summarize(p000 = min(hr_teacher, na.rm = TRUE),
p010 = quantile(hr_teacher, prob = .1, na.rm = TRUE)[[1]],
p025 = quantile(hr_teacher, na.rm = TRUE)[[2]],
p050 = median(hr_teacher, na.rm = TRUE),
p075 = quantile(hr_teacher, na.rm = TRUE)[[4]],
p090 = quantile(hr_teacher, prob = .9, na.rm = TRUE)[[1]],
p100 = max(hr_teacher, na.rm = TRUE))
teacher_t <- melt(teacher, id.var = "유형구분")
teacher_t$x <- as.numeric(substr(teacher_t$variable, 2, 4))
ggplot(teacher_t, aes(x = x, y = value, shape = 유형구분, linetype = 유형구분, color = 유형구분)) +
geom_point(size = 3) + geom_line(size = 1) +
theme(legend.title = element_text(size = 15)) +
theme(axis.text.x = element_text(size = rel(1.2)), axis.text.y = element_text(size = rel(1.2)),
axis.title.x = element_text(size = rel(1.5)), axis.title.y = element_text(size = rel(1.5))) +
labs(x = "백분위수(%)", y = "강사인력규모(명)") +
scale_x_continuous(breaks = c(0, 10, 25, 50, 75, 90, 100)) +
scale_color_manual(values = c("grey10", "grey25", "grey40", "grey55")) +
scale_shape_manual(values = c(16, 17, 15, 18))
ath1 <- subset(ath00, type0 == 1)
ath1$lec <- ath1$강사유무
ath1$강사유무 <- ifelse(ath1$lec == 0, "없음", "있음")
ggplot(ath1, aes(x = area, y = total_cost/1000, shape = 강사유무, color = 강사유무)) +
geom_point(size = 5, alpha = .5) +
scale_color_manual(values = c("grey50", "grey10")) +
theme(legend.title = element_text(size = 15)) +
theme(axis.text.x = element_text(size = rel(1.2)), axis.text.y = element_text(size = rel(1.2)),
axis.title.x = element_text(size = rel(1.5)), axis.title.y = element_text(size = rel(1.5))) +
labs(x = expression(연면적(m^2)), y = "총 운영비(백만원)") +
scale_x_continuous(breaks = c(0, 1000, 2000, 3000),
labels = c("0", "1,000", "2,000", "3,000"))
table(ath0$type_r)
##
## 1 2 3 3.5 4
## 26 9 17 4 14
## 수영장 없는 대형?
ath2 <- subset(ath0, type0 == 2)
ath2$label <- c("배드민턴장, 탁구장",
"주경기장, 보조경기장, 테니스장",
"골프장, 테니스장, 볼링장",
"볼링장, 배드민턴장,탁구장")
ggplot(ath2, aes(x = area, y = total_cost/1000)) + geom_point(size = 3) +
geom_text(aes(label = label), hjust = -.05, vjust = 0, color = "grey40", size = 5) +
theme(axis.text.x = element_text(size = rel(1.2)), axis.text.y = element_text(size = rel(1.2)),
axis.title.x = element_text(size = rel(1.5)), axis.title.y = element_text(size = rel(1.5))) +
labs(x = expression(연면적(m^2)), y = "총 운영비(백만원)") +
ylim(0, 2500) +
scale_x_continuous(limits = c(5000, 16000),
breaks = c(5000, 7500, 10000, 12500, 15000),
labels = c("5,000", "7,500", "10,000", "12,500", "15,000"))
type_r <- 1:4
최종분류 <- c("1_자율이용시설", "2_수영장 없음(소형)", "3_수영장 있음(소형)", "4_수영장 있음(대형)")
rl <- data.frame(type_r, 최종분류)
ath3 <- merge(ath00, rl, by = "type_r")
table(ath3$type_r)
##
## 1 2 3 4
## 26 9 17 14
ggplot(ath3, aes(x = ln_area, y = ln_total_cost, shape = 최종분류, color = 최종분류)) + geom_point(size = 5, alpha = .8) +
theme(axis.text.x = element_text(size = rel(1.2)), axis.text.y = element_text(size = rel(1.2)),
axis.title.x = element_text(size = rel(1.5)), axis.title.y = element_text(size = rel(1.5))) +
labs(x = expression(연면적(m^2, 로그변환)), y = "총 운영비(천원, 로그변환)") +
scale_x_continuous(limits = c(2, 4.5), breaks = c(2, 3, 4), labels = c(l2, l3, l4)) +
scale_y_continuous(limits = c(4, 7.5), breaks = c(4, 5, 6, 7), labels = c(l4, l5, l6, l7)) +
scale_color_manual(values = c("grey10", "grey25", "grey40", "grey55")) +
theme(legend.title = element_text(size = 15)) +
geom_vline(aes(xintercept = 3.575188), color = "grey50", linetype = 2) +
annotate("text", x = 3.95, y = 4.15, label = "연면적 3,760m^2\n기준선", size = 4, color = "grey50") +
scale_shape_manual(values = c(16, 17, 15, 18))
hr <- ath3 %>%
group_by(type_r) %>%
summarize(teacher = mean(hr_teacher),
mag = mean(hr_mag))
hr_t <- melt(hr, id.vars = "type_r")
hr_t$label = round(hr_t$value, 1)
ggplot(hr_t, aes(x = type_r, y = value, fill = variable)) + geom_bar(position = "dodge", stat = "identity", color = "black") +
geom_text(aes(label = label), position = position_dodge(.9), size = 5, vjust = -.5) +
ylim(0, 40) +
scale_fill_manual(values = c("grey70", "grey50"), labels = c("강사", "관리직")) +
labs(x = "체육시설 유형", y = "인력규모(명)", fill = "인력분류") +
scale_x_continuous(breaks = c(1, 2, 3, 4),
labels = c("자율이용시설", "수영장없음(소형)", "수영장있음(소형)", "수영장있음(대형)")) +
theme(axis.text.x = element_text(size = rel(1.35)), axis.text.y = element_text(size = rel(1.35)),
axis.title.x = element_text(size = rel(1.5)), axis.title.y = element_text(size = rel(1.5)),
legend.title = element_text(size = 15))
hr1 <- ath3 %>%
group_by(type_r) %>%
summarize(hr_gx = mean(hr_gx),
hr_pool = mean(hr_pool),
hr_etc = mean(hr_etc))
hr1_t <- melt(hr1, id.vars = "type_r")
hr1_t$label <- round(hr1_t$value, 1)
ggplot(hr1_t, aes(x = type_r, y = value, fill = variable)) + geom_bar(position = "dodge", stat = "identity", color = "black") +
geom_text(aes(label = label), position = position_dodge(.9), size = 5, vjust = -.5) +
ylim(0, 22) +
scale_fill_manual(values = c("grey80", "grey60", "grey40"), labels = c("헬스강사", "수영강사", "기타강사")) +
labs(x = "체육시설 유형", y = "인력규모(명)", fill = "강사유형") +
scale_x_continuous(breaks = c(1, 2, 3, 4),
labels = c("자율이용시설", "수영장없음(소형)", "수영장있음(소형)", "수영장있음(대형)")) +
theme(axis.text.x = element_text(size = rel(1.35)), axis.text.y = element_text(size = rel(1.35)),
axis.title.x = element_text(size = rel(1.5)), axis.title.y = element_text(size = rel(1.5)),
legend.title = element_text(size = 15))
hr2 <- ath3 %>%
group_by(type_r) %>%
summarise(hr_admin = mean(hr_admin),
hr_facmag = mean(hr_facmag))
hr2_t <- melt(hr2, id.vars = "type_r")
hr2_t$label <- round(hr2_t$value, 1)
ggplot(hr2_t, aes(x = type_r, y = value, fill = variable)) + geom_bar(position = "dodge", stat = "identity", color = "black") +
geom_text(aes(label = label), position = position_dodge(.9), size = 5, vjust = -.5) +
ylim(0, 20) +
scale_fill_manual(values = c("grey70", "grey50"), labels = c("사무행정", "시설유지")) +
labs(x = "체육시설 유형", y = "인력규모(명)", fill = "관리인력유형") +
scale_x_continuous(breaks = c(1, 2, 3, 4),
labels = c("자율이용시설", "수영장없음(소형)", "수영장있음(소형)", "수영장있음(대형)")) +
theme(axis.text.x = element_text(size = rel(1.35)), axis.text.y = element_text(size = rel(1.35)),
axis.title.x = element_text(size = rel(1.5)), axis.title.y = element_text(size = rel(1.5)),
legend.title = element_text(size = 15))
hr_cost0 <- ath3 %>%
group_by(type_r) %>%
summarize(l_cost1 = mean(cost_lab),
l_cost2 = mean(lab_cost))
hr_cost0_t <- melt(hr_cost0, id.vars = "type_r")
hr_cost0_t$label <- round(hr_cost0_t$value/1000, 0)
ggplot(hr_cost0_t, aes(x = type_r, y = value/1000, fill = variable)) +
geom_bar(position = "dodge", stat = "identity", color = "black") +
geom_text(aes(label = label), position = position_dodge(.9), size = 5, vjust = -.5) +
ylim(0, 1100) +
scale_fill_manual(values = c("grey70", "grey50"), labels = c("인건비", "인건비성경비")) +
labs(x = "체육시설 유형", y = "인력규모(명)", fill = "인력운용비") +
scale_x_continuous(breaks = c(1, 2, 3, 4),
labels = c("자율이용시설", "수영장없음(소형)", "수영장있음(소형)", "수영장있음(대형)")) +
theme(axis.text.x = element_text(size = rel(1.35)), axis.text.y = element_text(size = rel(1.35)),
axis.title.x = element_text(size = rel(1.5)), axis.title.y = element_text(size = rel(1.5)),
legend.title = element_text(size = 15))
hr_cost <- ath3 %>%
group_by(type_r) %>%
summarize(n = mean(hr_total),
l_cost1 = mean(cost_lab),
l_cost2 = mean(lab_cost))
hr_cost$n2 <- round(hr_cost$n, 1)
hr_cost$l_cost_total <- with(hr_cost, l_cost1 + l_cost2)
hr_cost$avr <- with(hr_cost, l_cost_total / n2)
hr_cost$label <- round(hr_cost$avr, 0)
hr_cost$label2 <- c("38,072", "17,543", "26,500", "28,563")
ggplot(hr_cost, aes(x = type_r, y = avr)) + geom_bar(stat = "identity", fill = "grey60", color = "black") +
geom_text(aes(label = label2), size = 5, vjust = -.5) +
labs(x = "체육시설 유형", y = "인력운용비(천원)") +
scale_x_continuous(breaks = c(1, 2, 3, 4),
labels = c("자율이용시설", "수영장없음(소형)", "수영장있음(소형)", "수영장있음(대형)")) +
scale_y_continuous(limits = c(0, 41000),
breaks = c(10000, 20000, 30000, 40000),
labels = c("10,000", "20,000", "30,000", "40,000")) +
theme(axis.text.x = element_text(size = rel(1.35)), axis.text.y = element_text(size = rel(1.35)),
axis.title.x = element_text(size = rel(1.5)), axis.title.y = element_text(size = rel(1.5)))
mag <- ath3 %>%
group_by(type_r) %>%
summarize(gen_cost = mean(gen_cost),
main_cost = mean(main_cost))
mag_t <- melt(mag, id.vars = "type_r")
mag_t$label <- round(mag_t$value/1000, 0)
ggplot(mag_t, aes(x = type_r, y = value/1000, fill = variable)) +
geom_bar(position = "dodge", stat = "identity", color = "black") +
geom_text(aes(label = label), position = position_dodge(.9), size = 5, vjust = -.5) +
ylim(0, 1100) +
scale_fill_manual(values = c("grey70", "grey50"), labels = c("일반운영비", "유지관리비")) +
labs(x = "체육시설 유형", y = "금액(백만원)", fill = "운영유지관리비") +
scale_x_continuous(breaks = c(1, 2, 3, 4),
labels = c("자율이용시설", "수영장없음(소형)", "수영장있음(소형)", "수영장있음(대형)")) +
theme(axis.text.x = element_text(size = rel(1.35)), axis.text.y = element_text(size = rel(1.35)),
axis.title.x = element_text(size = rel(1.5)), axis.title.y = element_text(size = rel(1.5)),
legend.title = element_text(size = 15))
mag2 <- ath3 %>%
group_by(type_r) %>%
summarize(area = sum(area),
gen_cost = sum(gen_cost),
main_cost = sum(main_cost))
mag2$gen_per <- with(mag2, gen_cost / area)
mag2$main_per <- with(mag2, main_cost / area)
mag2_1 <- subset(mag2, select = c("type_r", "gen_per", "main_per"))
mag2_1$pool <- ifelse(mag2_1$type_r <= 2, 0, 1)
mag2_1_t <- melt(mag2_1, id.vars = c("type_r", "pool"))
mag2_1_t$label <- round(mag2_1_t$value, 0)
mag2_1_t$type_p <- ifelse(mag2_1_t$type_r == 1 | mag2_1_t$type_r == 3, 1, 2)
ggplot(mag2_1_t, aes(x = type_r, y = value, fill = variable)) +
geom_bar(position = "dodge", stat = "identity", color = "black") +
geom_text(aes(label = label), position = position_dodge(.9), size = 5, vjust = -.5) +
ylim(0, 250) +
scale_fill_manual(values = c("grey70", "grey50"), labels = c("일반운영비", "유지관리비")) +
labs(x = "체육시설 유형", y = "금액(백만원)", fill = "단위면적당 비용") +
scale_x_continuous(breaks = c(1, 2, 3, 4),
labels = c("자율이용시설", "수영장없음(소형)", "수영장있음(소형)", "수영장있음(대형)")) +
theme(axis.text.x = element_text(size = rel(1.35)), axis.text.y = element_text(size = rel(1.35)),
axis.title.x = element_text(size = rel(1.5)), axis.title.y = element_text(size = rel(1.5)),
legend.title = element_text(size = 15))
std_hr <- ath3 %>%
group_by(type_r) %>%
summarize(hr_gx = mean(hr_gx),
hr_pool = mean(hr_pool),
hr_etc = mean(hr_etc),
hr_admin = mean(hr_admin),
hr_facmag = mean(hr_facmag))
std_hr1 <- ceiling(std_hr)
std_hr1$total <- with(std_hr1, hr_gx + hr_pool + hr_etc + hr_admin + hr_facmag)
std_model <- subset(std_hr1, select = c("type_r", "total"))
std_model$area <- c(1000, 2000, 2000, 7500)
##인력운영비
std_model$l_cost <- hr_cost$avr
std_model$l_cost_total <- with(std_model, total * l_cost)
##운영관리비
std_model$gen_per <- round(mag2$gen_per, 1)
std_model$main_per <- round(mag2$main_per, 1)
std_model$gen_cost <- with(std_model, area * gen_per)
std_model$main_cost <- with(std_model, area * main_per)
std_model$op_main_total <- with(std_model, gen_cost + main_cost)
std_model$total_cost <- with(std_model, op_main_total + l_cost_total)
std_model_t <- melt(std_model, id.vars = "type_r", measure.vars = c("l_cost_total", "op_main_total"))
std_model_t$label <- round(std_model_t$value/1000, 0)
std_model_t$label2 <- c("152", "281", "1,299", "1,742", "61", "189", "640", "1,298")
ggplot(std_model_t, aes(x = type_r, y = value/1000, fill = variable)) +
geom_bar(position = "dodge", stat = "identity", color = "black") +
geom_text(aes(label = label2), position = position_dodge(.9), size = 5, vjust = -.5) +
ylim(0, 2000) +
scale_fill_manual(values = c("grey70", "grey50"), labels = c("인력운용비", "운영유지관리비")) +
labs(x = "체육시설 유형", y = "금액(백만원)", fill = "비용 분류") +
scale_x_continuous(breaks = c(1, 2, 3, 4),
labels = c("자율이용시설", "수영장없음(소형)", "수영장있음(소형)", "수영장있음(대형)")) +
theme(axis.text.x = element_text(size = rel(1.35)), axis.text.y = element_text(size = rel(1.35)),
axis.title.x = element_text(size = rel(1.5)), axis.title.y = element_text(size = rel(1.5)),
legend.title = element_text(size = 15))
## 모형별 뜯어보기
std_model$hr_gx <- std_hr1$hr_gx
std_model$hr_pool <- std_hr1$hr_pool
std_model$hr_etc <- std_hr1$hr_etc
std_model$hr_admin <- std_hr1$hr_admin
std_model$hr_facmag <- std_hr1$hr_facmag
std_model$hr_teacher <- with(std_model, hr_gx + hr_pool + hr_etc)
std_model$hr_mag <- with(std_model, hr_admin + hr_facmag)
std_model_final <- subset(std_model, select = c("type_r", "area", "hr_teacher", "hr_mag", "total",
"l_cost_total", "op_main_total", "total_cost"))
std_model_final
## # A tibble: 4 x 8
## type_r area hr_teacher hr_mag total l_cost_total op_main_total total_cost
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 1000 0 4 4 152288. 60600 212888.
## 2 2 2000 10 6 16 280684. 189200 469884.
## 3 3 2000 34 15 49 1298511. 639800 1938311.
## 4 4 7500 39 22 61 1742345. 1298250 3040595.
ath3$op_per <- ath3$op_cost / ath3$area
ath3$ln_op_per <- log10(ath3$op_per)
model0 <- lm(ln_op_per ~ ln_area + factor(type_r) + ln_area * factor(type_r), data = ath3)
summary(model0)
##
## Call:
## lm(formula = ln_op_per ~ ln_area + factor(type_r) + ln_area *
## factor(type_r), data = ath3)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.37723 -0.12476 -0.01119 0.12582 0.92519
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.9583 0.6667 5.938 1.73e-07 ***
## ln_area -0.7577 0.2230 -3.398 0.00123 **
## factor(type_r)2 -0.3199 2.0406 -0.157 0.87597
## factor(type_r)3 0.1119 1.6713 0.067 0.94687
## factor(type_r)4 3.8650 1.9796 1.952 0.05573 .
## ln_area:factor(type_r)2 0.2105 0.6392 0.329 0.74308
## ln_area:factor(type_r)3 0.2774 0.5166 0.537 0.59337
## ln_area:factor(type_r)4 -0.7238 0.5332 -1.358 0.17987
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.3367 on 58 degrees of freedom
## Multiple R-squared: 0.5861, Adjusted R-squared: 0.5362
## F-statistic: 11.74 on 7 and 58 DF, p-value: 3.404e-09
ggplot(ath3, aes(x = ln_area, y = ln_op_per, shape = 최종분류, color = 최종분류)) + geom_point(size = 3, alpha = .8) +
theme(axis.text.x = element_text(size = rel(1.1)), axis.text.y = element_text(size = rel(1.1)),
axis.title.x = element_text(size = rel(1.5)), axis.title.y = element_text(size = rel(1.5))) +
labs(x = expression(연면적(m^2, 로그변환)), y = expression(단위면적당_운영비(천원, 로그변환))) +
scale_color_manual(values = c("grey10", "grey25", "grey40", "grey55")) +
theme(legend.title = element_text(size = 15)) +
scale_shape_manual(values = c(16, 17, 15, 18)) +
geom_smooth(method = lm, se = FALSE) +
scale_x_continuous(limits = c(2, 4.2), breaks = c(2, 3, 4), labels = c(l2, l3, l4)) +
scale_y_continuous(breaks = c(1, 2, 3), labels = c(l1, l2, l3)) +
facet_wrap(~최종분류)
## `geom_smooth()` using formula 'y ~ x'