Bigdata-FinalProject

Author

Na Young Seong

1. 프로젝트 주제

이번 기말 프로젝트의 주제는 ’ 노령화가 점점 지속되고 있는 우리나라 사회에서, 노인들이 살기 좋은 시대를 만들기 위해서 필요한 요양시설 중심의 정책은 무엇인가’이다.

2. 데이터 분석의 목적

이 분석의 목적은 서울특별시 내 노인의료복지시설 현황을 종합적으로 파악하여 노인들이 살기 좋은 환경을 조성하기 위한 정책적 제언을 도출하는 것이다.

3. 데이터 개요

  1. 데이터 출처 : 서울 열린데이터 광장
  2. 데이터 파일명 : ‘서울시 노인의료복지시설 현황’ http://data.seoul.go.kr/dataList/OA-22198/F/1/datasetView.dohttp://data.seoul.go.kr/dataList/OA-22198/F/1/datasetView.do
  3. 내용 : 이 데이터는 서울특별시 노인의료복지시설 현황 자료로 노인요양시설, 노인요양공동생활가정의 기관명칭, 설립구분, 법인명, 지정일, 이용자 정원 및 현원 , 종사자 현원, 기관 전화번호, 주소 등을 포함한 엑셀 데이터이다.

4. 전체 분석 결과의 요약

데이터 분석 요약

  1. 요양시설에 대한 분석

    요양시설은 도봉구가 가장 많았고, 중구가 가장 적었다.

library(ggplot2)
install.packages("tidyverse")
Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.3'
(as 'lib' is unspecified)
library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ lubridate 1.9.3     ✔ tibble    3.2.1
✔ purrr     1.0.2     ✔ tidyr     1.3.1
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(readxl)
data <- read_excel("/cloud/project/bigdatafin.xlsx", sheet="R_data")

#요양시설 수를 내림차순으로 정렬
count <- data %>%
  group_by(location_1) %>%
  summarise(요양시설수 = n()) %>%
  arrange(desc(요양시설수)) 

ggplot(count, aes(x = 요양시설수, y = reorder(location_1, -요양시설수))) +
  geom_bar(fill = 'pink', stat = 'identity') +
  labs(title = '자치구별 요양시설 수', x = '요양시설 수', y = '자치구') +
  theme_minimal()+
  theme(axis.text.x = element_text( hjust = 1),
         plot.title = element_text(size = 16, face = "bold", hjust = 0.5))

  1. 시설 이용 현황 및 수요

    노인요양시설의 총 이용자 수는 은평구가 가장 많았고, 중구가 가장 적었다.

    ggplot(data, aes(x =location_1, y = userall_4)) +
      geom_bar(stat = "identity", fill="blue") +
      labs(title = "자치구별 노인요양시설의 총 이용자 수",
           x = "자치구",
           y = "이용자 총원") +
      theme_minimal() +
      theme(axis.text.x = element_text(angle = 45, hjust = 1),
            plot.title = element_text(size = 16, face = "bold", hjust = 0.5))

서울시 전체 요양시설에는 비치매환자보다 치매환자가 많음을 알 수 있다.

#서울시 요양시설 전체 치매환자와 비치매환자의 총합
total_ill <- sum(data$ill_8)
total_notill <- sum(data$notill_9)
# 데이터프레임 생성
total_ill_df <- data.frame(환자유형 = c("치매환자", "비치매환자"), 환자수 = c(total_ill, total_notill))

# 그래프 그리기
ggplot(total_ill_df, aes(x = 환자유형, y = 환자수, fill = 환자유형)) +
  geom_bar(stat = "identity") +
  labs(title = "요양시설을 이용하는 서울시 전체 치매환자와 비치매환자 수", x = "환자 유형", y = "환자 수", fill = "환자 유형") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 16, face = "bold", hjust = 0.5))+
  scale_fill_manual(values = c("turquoise","coral"))

서울시 요양시설을 이용하는 전체 환자 중에서 여성이 남성보다 더 많다는 것을 알 수 있다.

#서울시 요양시설 전체 환자의 성별
total_boy <- sum(data$boy_6)
total_girl <- sum(data$girl_7)
# 데이터프레임 생성
total_sex_df <- data.frame(환자유형 = c("남성 환자", "여성 환자"), 환자수 = c(total_boy, total_girl))

# 그래프 그리기
ggplot(total_sex_df, aes(x = 환자유형, y = 환자수, fill = 환자유형)) +
  geom_bar(stat = "identity") +
  labs(title = "요양시설을 이용하는 서울시 전체 환자의 성별", x = "환자 유형", y = "환자 수", fill = "환자 유형") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 16, face = "bold", hjust = 0.5))+
  scale_fill_manual(values = c("blue", "orange"))

  1. 요양시설 종사자구성 분석

    요양시설 환자 수와 종사자 간의 상관관계를 보니 0.985로 큰 상관이 있는 것으로 나타났다. 대체로 요양시설 환자수가 많아질 수록 종사자가 많아진다.

    # 연도와 위치의 상관관계 계수 계산
    correlation_coefficient2 <- cor(data$user_now_5, data$workerall_11)
    
    # 결과 출력
    print(correlation_coefficient2)
    [1] 0.9851998
    #시각화
    ggplot(data, aes(x = user_now_5, y = workerall_11)) +
      geom_jitter(color = "purple", alpha = 0.6) +
      theme_minimal() + 
      theme(panel.grid.minor = element_blank()) +  
      labs(title = "요양시설 환자 수와 종사자간의 관계", x = "요양시설 환자", y = "요양시설 종사자") +
      theme(plot.title = element_text(size = 16, face = "bold", hjust = 0.5))

요양시설 환자수와 구체적인 종사자 간의 관계를 알아보기 위하여 사회복지사, 요양보호사, 의사, 간호요원, 조리원, 기타 종사자로 나누어 환자수와 비교하였다. 요양보호사, 간호사, 조리원, 기타종사자는 각각 0.982, 0.869, 0.783, 0.922 로 강한 상관관계를 띄고 있지만, 사회복지사와 의사는 0.415와 0,342로 상관관계를 크게 가지고 있지 않았다.

# 종사자별 상관관계 계수 계산
cor_social <- cor(data$user_now_5, data$socialworker_12)
cor_care <- cor(data$user_now_5, data$careworker_13)
cor_doc <- cor(data$user_now_5, data$doctor_14)
cor_nurse <- cor(data$user_now_5, data$nurse_15)
cor_cook <- cor(data$user_now_5, data$cook_16)
cor_other <- cor(data$user_now_5, data$otherworker_17)

# 결과 출력
print(c(cor_social, cor_care, cor_doc, cor_nurse, cor_cook, cor_other))
[1] 0.4152066 0.9818843 0.3415723 0.8689401 0.7833077 0.9219525
#시각화
install.packages("cowplot")
Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.3'
(as 'lib' is unspecified)
library(cowplot)

Attaching package: 'cowplot'
The following object is masked from 'package:lubridate':

    stamp
library(ggplot2)


#사회복지사
plot1 <- ggplot(data, aes(x = user_now_5, y = socialworker_12)) +
  geom_jitter(color = "blue", alpha = 0.6) +
  theme_minimal() + 
  theme(panel.grid.minor = element_blank(),
        axis.title.x = element_text(size = 4),  
        axis.title.y = element_text(size = 4)) +  
  labs(title = "요양시설 환자 수와 사회복지사간의 관계", x = "요양시설 환자", y = "요양시설 사회복지사") +
  theme(plot.title = element_text(size = 8, face = "bold", hjust = 0.5))

#요양보호사
plot2 <- ggplot(data, aes(x = user_now_5, y = careworker_13)) +
  geom_jitter(color = "blue", alpha = 0.6) +
  theme_minimal() + 
  theme(panel.grid.minor = element_blank(),
        axis.title.x = element_text(size = 4),  
        axis.title.y = element_text(size = 4)) +  
  labs(title = "요양시설 환자 수와 요양보호사간의 관계", x = "요양시설 환자", y = "요양시설 요양보호사") +
  theme(plot.title = element_text(size = 8, face = "bold", hjust = 0.5))

#의사
plot3 <-ggplot(data, aes(x = user_now_5, y = doctor_14)) +
  geom_jitter(color = "blue", alpha = 0.6) +
  theme_minimal() + 
  theme(panel.grid.minor = element_blank(),
        axis.title.x = element_text(size = 4),  
        axis.title.y = element_text(size = 4)) +  
  labs(title = "요양시설 환자 수와 의사간의 관계", x = "요양시설 환자", y = "요양시설 의사") +
  theme(plot.title = element_text(size = 8, face = "bold", hjust = 0.5))

#간호요원
plot4 <- ggplot(data, aes(x = user_now_5, y = nurse_15)) +
  geom_jitter(color = "blue", alpha = 0.6) +
  theme_minimal() + 
  theme(panel.grid.minor = element_blank(),
        axis.title.x = element_text(size = 4),  
        axis.title.y = element_text(size = 4)) +  
  labs(title = "요양시설 환자 수와 간호요원간의 관계", x = "요양시설 환자", y = "요양시설 간호요원") +
  theme(plot.title = element_text(size = 8, face = "bold", hjust = 0.5))

#조리원
plot5 <- ggplot(data, aes(x = user_now_5, y = cook_16)) +
  geom_jitter(color = "blue", alpha = 0.6) +
  theme_minimal() + 
  theme(panel.grid.minor = element_blank(),
        axis.title.x = element_text(size = 4),  
        axis.title.y = element_text(size = 4)) +  
  labs(title = "요양시설 환자 수와 조리원간의 관계", x = "요양시설 환자", y = "요양시설 조리원") +
  theme(plot.title = element_text(size = 8, face = "bold", hjust = 0.5))

#기타 종사자
plot6 <- ggplot(data, aes(x = user_now_5, y = otherworker_17)) +
  geom_jitter(color = "blue", alpha = 0.6) +
  theme_minimal() + 
  theme(panel.grid.minor = element_blank(),
        axis.title.x = element_text(size = 4),  
        axis.title.y = element_text(size = 4)) +  
  labs(title = "요양시설 환자 수와 기타 종사자간의 관계", x = "요양시설 환자", y = "요양시설 기타 종사자") +
  theme(plot.title = element_text(size = 8, face = "bold", hjust = 0.5))

plot_grid(plot1, plot2, plot3, plot4, plot5, plot6, ncol = 2)

정책제안

1. 요양시설에 대한 정책 제안

자치구별 요양시설 수와 이용시설 총 정원으로 보아 중구가 가장 부족해보이므로 중구에 요양시설을 좀 더 배치.해야 한다.

2. 시설 이용 현황 및 수요 제안

  1. 요양시설에는 비치매 환자보다 치매환자가 많다. 따라서, 치매환자가 편리함을 느낄 수 있는 시설이 필요하다.
  2. 요양시설에는 여성환자가 남성환자보다 많음을 알 수 있었다. 따라서, 여성환자가 편리함을 느낄 수 있는 시설이 필요하다.
  3. 자치구별 요양시설 총 정원 대비 노인 비율을 보니 중구가 가장 많아, 중구에 요양시설을 더 배치해야 한다.
  4. 요양시설 대기 인원을 보니 송파구가 압도적으로 많기에 송파구에도 요양시설을 더 배치해야한다.

3. 요양시설 종사자 구성 정책 제안

종사자는 요양시설 인원수가 많아질 수록 많아져야 한다. 종사자 중에서도 사회복지사와 의사보다 요양보호사, 간호요원, 조리원, 기타 종사자가 많아져야 한다. 따라서, 요양시설이 더 필요한 중구와 송파구에 요양보호사, 간호요워느 조리워느 기타 종사자가 더 필요하다.

5. 데이터 전처리

아래 데이터는 서울시에 있는 노인요양시설 235개에 대해서 정리한 데이터 자료이다. 관할자치구, 장기요양기관기호, 기관명칭, 설립구분, 법인명, 지정일 등 다양한 변수들이 기록되어 있다.

library(readxl)
data_raw <- read_excel("/cloud/project/bigdatafin.xlsx", sheet="raw")
New names:
• `` -> `...2`
• `` -> `...3`
• `` -> `...4`
• `` -> `...5`
• `` -> `...6`
• `` -> `...7`
• `` -> `...8`
• `` -> `...9`
• `` -> `...10`
• `` -> `...11`
• `` -> `...12`
• `` -> `...13`
• `` -> `...14`
• `` -> `...15`
• `` -> `...16`
• `` -> `...17`
• `` -> `...18`
• `` -> `...19`
• `` -> `...20`
• `` -> `...21`
• `` -> `...22`
• `` -> `...23`
• `` -> `...24`
• `` -> `...25`
• `` -> `...26`
• `` -> `...27`
print(data_raw)
# A tibble: 238 × 27
   노인요양시설 현황(202…¹ ...2  ...3  ...4  ...5  ...6  ...7  ...8  ...9  ...10
   <chr>                   <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
 1 <NA>                     <NA> <NA>  <NA>  <NA>  <NA>   <NA> <NA>  <NA>  <NA> 
 2 연번                    "관…  장기… 기관… 설립… 법인… "병…  지정… 이용… <NA> 
 3 <NA>                     <NA> <NA>  <NA>  <NA>  <NA>   <NA> <NA>  정원  현원 
 4 1                       "종…  1111… 청운… 비영… 사회…  <NA> 2008… 45    41   
 5 2                       "종…  1111… 인자… 영리… 주식…  <NA> 2010… 42    42   
 6 3                       "종…  1111… 평창… 개인  <NA>   <NA> 2010… 68    68   
 7 4                       "종…  1111… 아름… 개인  <NA>   <NA> 2011… 38    38   
 8 5                       "종…  1111… 서울… 비영… 학교…  <NA> 2013… 38    35   
 9 6                       "종…  1111… 세검… 개인  <NA>   <NA> 2014… 23    18   
10 7                       "종…  1111… 해피… 개인  <NA>   <NA> 2015… 77    69   
# ℹ 228 more rows
# ℹ abbreviated name: ¹​`노인요양시설 현황(2022.12.31.기준)\r\n`
# ℹ 17 more variables: ...11 <chr>, ...12 <chr>, ...13 <chr>, ...14 <chr>,
#   ...15 <chr>, ...16 <chr>, ...17 <chr>, ...18 <chr>, ...19 <chr>,
#   ...20 <chr>, ...21 <chr>, ...22 <chr>, ...23 <chr>, ...24 <chr>,
#   ...25 <chr>, ...26 <chr>, ...27 <chr>

이 데이터셋에서 장기요양기관기호, 기관명칭, 법입명, 지정일, 전화, 기관소재지, 휴업시설을 빼고 관할자치구, 설립구분, 이용자 수, 이용현원 구성, 대기인원, 종사자 수를 담고 결측값을 빼서 새로운 data셋을 만들었다.

data <- read_excel("/cloud/project/bigdatafin.xlsx", sheet="R_data")
print(data)
# A tibble: 235 × 17
   location_1 establish_2 date_3     userall_4 user_now_5 boy_6 girl_7 ill_8
   <chr>      <chr>       <chr>          <dbl>      <dbl> <dbl>  <dbl> <dbl>
 1 종로구     비영리법인  2008-06-25        45         41     0     41    38
 2 종로구     영리법인    2010-07-01        42         42     5     37    40
 3 종로구     개인        2010-11-25        68         68    11     57    45
 4 종로구     개인        2011-08-23        38         38     5     33    27
 5 종로구     비영리법인  2013-05-30        38         35     0     35    11
 6 종로구     개인        2014-02-06        23         18     1     17    13
 7 종로구     개인        2015-08-17        77         69    24     45     9
 8 종로구     개인        2015-12-08        16         16     0     16     2
 9 중구       구립        2012-09-28        60         57    12     45    45
10 중구       구립        2010-02-02        14         13     1     12    13
# ℹ 225 more rows
# ℹ 9 more variables: notill_9 <dbl>, wait_10 <dbl>, workerall_11 <dbl>,
#   socialworker_12 <dbl>, careworker_13 <dbl>, doctor_14 <dbl>,
#   nurse_15 <dbl>, cook_16 <dbl>, otherworker_17 <dbl>

가공된 데이터와 raw 데이터가 존재함.

데이터에 관하여

str(data)
tibble [235 × 17] (S3: tbl_df/tbl/data.frame)
 $ location_1     : chr [1:235] "종로구" "종로구" "종로구" "종로구" ...
 $ establish_2    : chr [1:235] "비영리법인" "영리법인" "개인" "개인" ...
 $ date_3         : chr [1:235] "2008-06-25" "2010-07-01" "2010-11-25" "2011-08-23" ...
 $ userall_4      : num [1:235] 45 42 68 38 38 23 77 16 60 14 ...
 $ user_now_5     : num [1:235] 41 42 68 38 35 18 69 16 57 13 ...
 $ boy_6          : num [1:235] 0 5 11 5 0 1 24 0 12 1 ...
 $ girl_7         : num [1:235] 41 37 57 33 35 17 45 16 45 12 ...
 $ ill_8          : num [1:235] 38 40 45 27 11 13 9 2 45 13 ...
 $ notill_9       : num [1:235] 3 2 23 11 24 5 60 14 12 0 ...
 $ wait_10        : num [1:235] 0 10 0 0 0 0 0 0 70 30 ...
 $ workerall_11   : num [1:235] 26 29 46 24 28 17 54 10 46 17 ...
 $ socialworker_12: num [1:235] 1 2 1 2 2 1 3 1 2 4 ...
 $ careworker_13  : num [1:235] 19 18 33 18 17 10 32 7 28 9 ...
 $ doctor_14      : num [1:235] 0 0 1 0 1 1 1 0 0 0 ...
 $ nurse_15       : num [1:235] 2 3 5 2 2 2 4 1 4 1 ...
 $ cook_16        : num [1:235] 0 2 0 0 2 0 6 0 4 0 ...
 $ otherworker_17 : num [1:235] 4 4 6 2 4 3 8 1 8 3 ...
  1. 데이터는 17개 항목에 대한 235개의 측정값이 있으며, location , establish, date 항목은 character, 그외에 는 numeric 값이다.
sum(is.na(data))
[1] 0
  1. 결측값이 생기지 않도록 데이터를 가공하여 결측값은 없었다.
summary(data)
  location_1        establish_2           date_3            userall_4     
 Length:235         Length:235         Length:235         Min.   : 12.00  
 Class :character   Class :character   Class :character   1st Qu.: 29.00  
 Mode  :character   Mode  :character   Mode  :character   Median : 45.00  
                                                          Mean   : 61.56  
                                                          3rd Qu.: 80.00  
                                                          Max.   :296.00  
   user_now_5         boy_6           girl_7           ill_8       
 Min.   :  0.00   Min.   : 0.00   Min.   :  0.00   Min.   :  0.00  
 1st Qu.: 23.00   1st Qu.: 3.00   1st Qu.: 20.00   1st Qu.: 17.00  
 Median : 38.00   Median : 7.00   Median : 30.00   Median : 29.00  
 Mean   : 53.97   Mean   :10.01   Mean   : 43.96   Mean   : 41.21  
 3rd Qu.: 72.50   3rd Qu.:14.00   3rd Qu.: 57.00   3rd Qu.: 56.00  
 Max.   :296.00   Max.   :72.00   Max.   :235.00   Max.   :227.00  
    notill_9         wait_10         workerall_11    socialworker_12 
 Min.   :  0.00   Min.   :   0.00   Min.   :  1.00   Min.   : 0.000  
 1st Qu.:  0.50   1st Qu.:   0.00   1st Qu.: 17.00   1st Qu.: 1.000  
 Median :  6.00   Median :   0.00   Median : 26.00   Median : 2.000  
 Mean   : 12.76   Mean   :  63.91   Mean   : 38.07   Mean   : 2.566  
 3rd Qu.: 16.00   3rd Qu.:   3.00   3rd Qu.: 50.00   3rd Qu.: 3.000  
 Max.   :193.00   Max.   :2718.00   Max.   :202.00   Max.   :43.000  
 careworker_13      doctor_14         nurse_15         cook_16      
 Min.   :  0.00   Min.   :0.0000   Min.   : 0.000   Min.   : 0.000  
 1st Qu.: 11.00   1st Qu.:0.0000   1st Qu.: 1.000   1st Qu.: 0.000  
 Median : 18.00   Median :1.0000   Median : 2.000   Median : 2.000  
 Mean   : 25.03   Mean   :0.7489   Mean   : 3.196   Mean   : 2.166  
 3rd Qu.: 33.00   3rd Qu.:1.0000   3rd Qu.: 4.000   3rd Qu.: 3.000  
 Max.   :137.00   Max.   :5.0000   Max.   :22.000   Max.   :14.000  
 otherworker_17  
 Min.   : 0.000  
 1st Qu.: 1.000  
 Median : 3.000  
 Mean   : 4.366  
 3rd Qu.: 7.000  
 Max.   :33.000  

데이터를 요약해보면, 요양병원의 정원의 평균은 61.6명 이고 현재는 54명 정도 있다. 도한, 현재 요양병원에 계신 분들 중 남자 평균은 10명이고 여자는 44명이다. 치매에 걸리신 분들은 평균적으로 41명이고 걸리지 않으신 분들은 12명이다. 평균적으로 38명 정도 요양병원에서 종사하시고 있으며 사회복지사는 2명 요양보호사는 25명, 의사는 0.75명, 간호사는 3명, 조리사는 2명 기타 4명 정도 종사한다. 설립일자는 date 데이터로 바꾸는 것이 필요할 것 같다.

6. 데이터 항목 별 주요 사항과 의미 (통계적 서술과 시각화)

데이터를 분석하여 결론을 도출하기 위하여 먼저, 요양시설에 대한 분석, 시설 이용현황 및 수요, 요양시설 종사자 구성으로 항목을 세분화하여 데이터를 분석하였다.

1. 요양시설에 대한 분석

1. 설립구분 분석

서울시 요양시설은 개인으로 지어진 경우가 가장 많았고, 다음으로는 비영리법인, 구립, 영리법인, 시립, 시립병설 순으로 많았다.

ggplot(data, aes(x=establish_2))+geom_bar(fill='blue')+
  labs(title = '요양시설 설립구분', x = '설립구분', y = '서울시 요양병원 수') +
  theme_minimal()+
  theme(plot.title = element_text(size = 16, face = "bold", hjust = 0.5))

2. 자치구별 설립 구분 분석

서울시 전체와 비슷하게 개인으로 지어진 곳이 대체적으로 많았지만, 중구와 영등포구, 강남구는 개인으로 지어진 곳이 없다는 것이 특징적이였다.

ggplot(data, aes(y = location_1, fill = establish_2)) +
  geom_bar() +
  labs(title = "지역별 요양시설 설립 구분",
       x = "요양시설 수",
       y = "자치구",
       fill = "설립구분") +
  theme_minimal()+
  theme(axis.text.x = element_text(size = 8), 
        legend.title = element_text("설립구분"),
          plot.title = element_text(size = 16, face = "bold", hjust = 0.5))

3. 어떤 자치구에 가장 많이 분포되어 있는지에 대한 분석

산술적으로 내림차순을 활용하여 요양시설의 분포 추이를 분석하였다. 도봉구가 22개로 가장 많았고, 중구가 2개로 가장 적었다.

library(tidyverse)

count <- data %>%
  group_by(location_1) %>%
  summarise(요양시설수 = n()) %>%
  arrange(desc(요양시설수)) #내림차순으로 정렬

print(count)
# A tibble: 26 × 2
   location_1 요양시설수
   <chr>           <int>
 1 도봉구             22
 2 강서구             21
 3 성북구             18
 4 은평구             16
 5 금천구             13
 6 양천구             13
 7 노원구             11
 8 관악구             10
 9 구로구             10
10 서대문구           10
# ℹ 16 more rows

위에 내용을 시각화한 그래프이다.

ggplot(count, aes(x = 요양시설수, y = reorder(location_1, -요양시설수))) +
  geom_bar(fill = 'pink', stat = 'identity') +
  labs(title = '자치구별 요양시설 수', x = '요양시설 수', y = '자치구') +
  theme_minimal()+
  theme(axis.text.x = element_text( hjust = 1),
         plot.title = element_text(size = 16, face = "bold", hjust = 0.5))

4. 언제 요양병원이 지어졌는지에 대한 분석

서울시 요양병원은 대체로 2019~2020년도에 많이 지어졌다.

#date_3을 문자열로 변환후, 날짜 형으로 변환
data$yr = as.Date(as.character(data$date_3),"%Y")

ggplot(data,aes(x=yr, y=location_1 , col=location_1))+geom_jitter() +scale_x_date((date_labels = "년도")) +ggtitle("지역별로 언제 요양시설이 지어졌는지 ") +
  labs(x = "년도", y = "자치구별", col= "자치구별") +
  theme_minimal() +
  theme( plot.title = element_text(size = 16, face = "bold", hjust = 0.5))

2. 시설 이용 현황 및 수요

1. 자치구별 요양시설 총 이용자 수 분석

노인요양시설의 총 이용자 수는 은평구가 가장 많았고, 중구가 가장 적었다.

ggplot(data, aes(x =location_1, y = userall_4)) +
  geom_bar(stat = "identity", fill="blue") +
  labs(title = "자치구별 노인요양시설의 총 이용자 수",
       x = "자치구",
       y = "이용자 총원") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        plot.title = element_text(size = 16, face = "bold", hjust = 0.5))

2. 치매환자와 비치매환자 분석

전체적으로 서울시 요양시설에는 치매환자가 비치매 환자보다 많다는 것을 알 수 있다.

#서울시 요양시설 전체 치매환자와 비치매환자의 총합
total_ill <- sum(data$ill_8)
total_notill <- sum(data$notill_9)
# 데이터프레임 생성
total_ill_df <- data.frame(환자유형 = c("치매환자", "비치매환자"), 환자수 = c(total_ill, total_notill))

# 그래프 그리기
ggplot(total_ill_df, aes(x = 환자유형, y = 환자수, fill = 환자유형)) +
  geom_bar(stat = "identity") +
  labs(title = "요양시설을 이용하는 서울시 전체 치매환자와 비치매환자 수", x = "환자 유형", y = "환자 수", fill = "환자 유형") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 16, face = "bold", hjust = 0.5))+
  scale_fill_manual(values = c("turquoise","coral"))

각 자치구별로 비교해봤을 때도 마찬가지로 대부분 요양병원에서의 치매환자가 비치매환자보다 많았지만, 양천구, 종로구와 중랑구는 비치매환자가 치매환자가 많았다.

data_long_ill <- tidyr::pivot_longer(data, cols = c(ill_8, notill_9), names_to = "환자유형", values_to = "환자수")

# 그래프 그리기
ggplot(data_long_ill, aes(x = location_1, y = 환자수, fill = 환자유형)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "자치별 치매환자와 비치매환자 수", x = "자치구", y = "환자 수", fill = "환자 유형") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),plot.title = element_text(size = 16, face = "bold", hjust = 0.5))+
  scale_fill_manual( values = c("ill_8" = "coral", "notill_9" = "turquoise"),
                     labels = c("치매환자", "비치매환자"))

3. 환자의 성별 분석

서울시 요양시설을 이용하는 전체 환자 중에서 여성이 남성보다 더 많다는 것을 알 수 있다.

#서울시 요양시설 전체 환자의 성별
total_boy <- sum(data$boy_6)
total_girl <- sum(data$girl_7)
# 데이터프레임 생성
total_sex_df <- data.frame(환자유형 = c("남성 환자", "여성 환자"), 환자수 = c(total_boy, total_girl))

# 그래프 그리기
ggplot(total_sex_df, aes(x = 환자유형, y = 환자수, fill = 환자유형)) +
  geom_bar(stat = "identity") +
  labs(title = "요양시설을 이용하는 서울시 전체 환자의 성별", x = "환자 유형", y = "환자 수", fill = "환자 유형") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 16, face = "bold", hjust = 0.5))+
  scale_fill_manual(values = c("blue", "orange"))

각 자치구별로 비교해봤을 때도 마찬가지로 모든 요양병원에서는 여성 환자가 남성 환자보다 많음을 알 수 있었다. 또한, 성동구에는 여성 환자가 가장 많음을, 은평구에는 남성 환자가 가장 많음을 알 수 있었다.

### 남여 성별
data_long_sex <- tidyr::pivot_longer(data, cols = c(boy_6, girl_7), names_to = "환자성별", values_to = "환자수")

ggplot(data_long_sex, aes(x = location_1, y = 환자수, fill = 환자성별)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "자치구별 남녀 수", x = "자치구", y = "환자 수", fill = "환자 성별") +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    plot.title = element_text(size = 16, face = "bold", hjust = 0.5)
  ) +
  scale_fill_manual(values = c("boy_6" = "blue", "girl_7" = "orange"), 
                    labels = c("남자", "여자"))

3. 요양시설 종사자구성 분석

요양시설의 종사자는 사회복지사, 요양보호사, 의사, 간호요원, 조리원과 관리인,시설장 등인 기타종사자로 나뉜다. 서울시 요양시설에는 총 603명의 사회복지사와 5882명의 요양보호사, 176명의 의사, 751명의 간호사, 509명의 조리원과 1026명의 기타종사자가 근무한다.

#종사자 유형별 총합
total_social <- sum(data$socialworker_12)
total_care <- sum(data$careworker_13)
total_doctor <- sum(data$doctor_14)
total_nurse <- sum(data$nurse_15)
total_cook <- sum(data$cook_16)
total_other <- sum(data$otherworker_17)

print(c(total_social, total_care,total_doctor, total_nurse, total_cook, total_other))
[1]  603 5882  176  751  509 1026

위에 데이터를 시각화한 그래프이다.

# 데이터프레임 생성
total_work_df <- data.frame(
  종사자유형 = factor(c("사회복지사", "요양보호사", "의사", "간호요원", "조리원", "기타종사자"), 
                 levels = c("사회복지사", "요양보호사", "의사", "간호요원", "조리원", "기타종사자")),
  종사자수 = c(total_social, total_care, total_doctor, total_nurse, total_cook, total_other))

# 그래프 그리기
ggplot(total_work_df, aes(x = 종사자유형, y = 종사자수, fill = 종사자유형)) +
  geom_bar(stat = "identity") +
  labs(title = "요양시설 종사자들의 구성", x = "종사자 유형", y = "종사자 수", fill = "종사자 유형") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 16, face = "bold", hjust = 0.5))+
  scale_fill_brewer(palette = "Set2")

7. 주요 항목 간 비교, 상관관계와 의미 (시각화)

데이터를 분석하여 결론을 도출하기 위하여 주요 항목간 비교, 상관관계와 의미를 요양시설에 대한 분석, 시설 이용현황 및 수요, 요양시설 종사자 구성으로 항목을 세분화하여 의미를 도출하였다.

1. 요양시설에 대한 분석

1. 요양시설이 지어진 시기와 현재 이용자의 관계

요양시설이 지어진 날짜와 요양시설을 현재 이용하고 있는 사람들의 상관계수는 -0.267로 요양시설이 지어진 시기와 현재 아용자와는 크게 상관이 없다는 것을 알았다.

#date을 num으로 바꿈
num_yr <- as.numeric(data$yr)
# 연도와 위치의 상관관계 계수 계산
correlation_coefficient <- cor(num_yr, data$user_now_5)

# 결과 출력
print(correlation_coefficient)
[1] -0.2665809

위에 내용을 시각화한 그래프이다.

ggplot(data, aes(x = yr, y = user_now_5, col="red")) +
  geom_jitter() +
  scale_x_date(date_labels = "%Y") +
  ggtitle("요양시설이 지어진 시기와 현재 이용자의 관계") +
  labs(x = "연도", y = "총 이용자 수") +
  theme_minimal() +
  theme(plot.title = element_text(size = 16, face = "bold", hjust = 0.5))

2. 시설 이용 현황 및 수요

1. 자치구별 요양시설 총 정원 대비 자치구별 노인수 비율

자치구별 노인의 수에 비해 요양시설의 분포가 고른지를 알기 위하여 자치구별 노인의 수를 알 수 있는 데이터가 필요하였다. 자치구별 요양시설 총 이용자정원 대비 자치구 노인수 비율이 높다는 것은 해당 자치구의 노인수가 이용자 정원 대비 많다는 것을 의미한다. 이것은 노인 요양 시설에 대한 수요가 해당 자치구에서 높다는 것을 나타낼 수 있다.

자치구별 노인의 수를 알아보기 위하여 서울시 열린데이터 광장에서 서울시 고령자현황 (동별)통계 데이터를 활용하여 새로운 데이터셋을 만들었다.

데이터 셋 출처 : https://data.seoul.go.kr/dataList/10020/S/2/datasetView.do

데이터 내용 : 2024 1/4 분기의 65세이상 인구를 자치구별로 나타낸 데이터이다.

install.packages("dplyr")
Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.3'
(as 'lib' is unspecified)
library(dplyr)

#자치구별 요양시설 수 
facility_count <- data %>%
  group_by(location_1) %>%
  summarise(요양시설수 = n())

#새로운 데이터 
oldpeople <- data.frame(
  자치구 = c("강남구","강동구","강북구","강서구","관악구","광진구","구로구","금천구","노원구","도봉구","동대문구","동작구","마포구","서대문구","서초구","성동구","성북구","송파구","양천구","영등포구","용산구","은평구","종로구","중구","중랑구"),
  노인수 = c(88662,84456, 69366, 103825,86455,57768, 81360, 46198, 97596, 71572, 67880, 71335, 58592, 58797, 66556, 50098, 81280, 110520, 77423, 68650, 39671, 95209, 29127, 26302, 80250),
  요양시설수 = c(7,10,9,21,10,8,10,13,11,22,6,5,3,10,5,4,18,9,13,2,3,16,8,2,10)
)

print(oldpeople)
     자치구 노인수 요양시설수
1    강남구  88662          7
2    강동구  84456         10
3    강북구  69366          9
4    강서구 103825         21
5    관악구  86455         10
6    광진구  57768          8
7    구로구  81360         10
8    금천구  46198         13
9    노원구  97596         11
10   도봉구  71572         22
11 동대문구  67880          6
12   동작구  71335          5
13   마포구  58592          3
14 서대문구  58797         10
15   서초구  66556          5
16   성동구  50098          4
17   성북구  81280         18
18   송파구 110520          9
19   양천구  77423         13
20 영등포구  68650          2
21   용산구  39671          3
22   은평구  95209         16
23   종로구  29127          8
24     중구  26302          2
25   중랑구  80250         10
str(oldpeople)
'data.frame':   25 obs. of  3 variables:
 $ 자치구    : chr  "강남구" "강동구" "강북구" "강서구" ...
 $ 노인수    : num  88662 84456 69366 103825 86455 ...
 $ 요양시설수: num  7 10 9 21 10 8 10 13 11 22 ...

자치구별 요양시설 총 이용자정원 대비 자치구 노인수 비율을 알기 위하여 데이터를 가공하였다.

# 총이용자정원을 그룹별로 합산
grouped_user <- data %>%
  group_by(location_1) %>%
  summarise(요양시설총이용자정원 = sum(userall_4, na.rm = TRUE))

#데이터 프레임으로 가공
gu_df<-as.data.frame(grouped_user)

#데이터 보기
print(grouped_user)
# A tibble: 26 × 2
   location_1 요양시설총이용자정원
   <chr>                     <dbl>
 1 강남구                      424
 2 강동구                      575
 3 강북구                      574
 4 강서구                     1098
 5 관악구                      435
 6 광진구                      489
 7 구로구                      897
 8 금천구                      623
 9 노원구                      884
10 도봉구                      904
# ℹ 16 more rows
#데이터 합치기
combined_data <- left_join(grouped_user, oldpeople, by = c("location_1" = "자치구"))
                    
#데이터 보기       
print(combined_data)
# A tibble: 26 × 4
   location_1 요양시설총이용자정원 노인수 요양시설수
   <chr>                     <dbl>  <dbl>      <dbl>
 1 강남구                      424  88662          7
 2 강동구                      575  84456         10
 3 강북구                      574  69366          9
 4 강서구                     1098 103825         21
 5 관악구                      435  86455         10
 6 광진구                      489  57768          8
 7 구로구                      897  81360         10
 8 금천구                      623  46198         13
 9 노원구                      884  97596         11
10 도봉구                      904  71572         22
# ℹ 16 more rows
# 노인수 대비 이용자 정원 비율 계산
combined_data <- combined_data %>%
  mutate(이용자정원_대비_노인수_비율 = 노인수 / 요양시설총이용자정원)

#데이터 보기
print(combined_data)
# A tibble: 26 × 5
   location_1 요양시설총이용자정원 노인수 요양시설수 이용자정원_대비_노인수_비율
   <chr>                     <dbl>  <dbl>      <dbl>                       <dbl>
 1 강남구                      424  88662          7                       209. 
 2 강동구                      575  84456         10                       147. 
 3 강북구                      574  69366          9                       121. 
 4 강서구                     1098 103825         21                        94.6
 5 관악구                      435  86455         10                       199. 
 6 광진구                      489  57768          8                       118. 
 7 구로구                      897  81360         10                        90.7
 8 금천구                      623  46198         13                        74.2
 9 노원구                      884  97596         11                       110. 
10 도봉구                      904  71572         22                        79.2
# ℹ 16 more rows

자치구별 총 이용자정원 대비 노인수 비율을 시각화 한 그래프이다. 중구가 가장 많은 것으로 나왔고, 다음으로는 동작구, 영등포구, 강남구, 용산구, 관악구 순으로 나왔다.

ggplot(combined_data, aes(x = location_1, y = 이용자정원_대비_노인수_비율)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  labs(title = "자치구별 이용자정원 대비 노인수 비율", x = "자치구", y = "이용자정원 대비 노인수 비율율") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        plot.title = element_text(size = 16, face = "bold", hjust = 0.5))
Warning: Removed 1 row containing missing values or values outside the scale range
(`geom_bar()`).

2. 자치구별 대기인원 분석

자치구별 요양시설을 기다리는 인원을 분석하여보니, 송파구에 가장 많은 대기인원이 있었고, 서초구가 그 다음으로 많았다. 따라서 송파구에 더 많은 요양시설이 필요함을 알 수 있다. 위에 총 이용자 정원 대비 자치구 노인수 비율이 가장 높았던 중구는 비교적 적은 대기인원이 있음을 알 수 있다.

count_wait <- data %>%
  group_by(location_1) %>%
  summarise(기다리는인원 = sum(wait_10, na.rm = TRUE))

#데이터 유형 보기
str(count_wait)
tibble [26 × 2] (S3: tbl_df/tbl/data.frame)
 $ location_1  : chr [1:26] "강남구" "강동구" "강북구" "강서구" ...
 $ 기다리는인원: num [1:26] 1337 1096 5 11 9 ...
#시각화
ggplot(count_wait, aes(x = location_1, y = 기다리는인원, fill = location_1)) +
  geom_bar(stat = "identity", fill="darkgreen") +
  labs(title = "자치구별 기다리는 인원 수", x = "자치구", y = "기다리는 인원") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        plot.title = element_text(size = 16, face = "bold", hjust = 0.5))

3. 요양시설 종사자구성 분석

1. 요양시설 환자 수와 전체 종사자 간의 관계

요양시설 환자 수와 종사자 간의 상관관계를 보니 0.985로 큰 상관이 있는 것으로 나타났다. 대체로 요양시설 환자수가 많아질 수록 종사자가 많아진다.

# 연도와 위치의 상관관계 계수 계산
correlation_coefficient2 <- cor(data$user_now_5, data$workerall_11)

# 결과 출력
print(correlation_coefficient2)
[1] 0.9851998

위에 내용을 시각화한 스래프이다. 우상향하는 그래프로 양의 상관관계를 지님을 알 수 있다.

ggplot(data, aes(x = user_now_5, y = workerall_11)) +
  geom_jitter(color = "purple", alpha = 0.6) +
  theme_minimal() + 
  theme(panel.grid.minor = element_blank()) +  
  labs(title = "요양시설 환자 수와 종사자간의 관계", x = "요양시설 환자", y = "요양시설 종사자") +
  theme(plot.title = element_text(size = 16, face = "bold", hjust = 0.5))

1-2. 요양시설 환자수와 구체적인 종사자 간의 관계

요양시설 환자수와 구체적인 종사자 간의 관계를 알아보기 위하여 사회복지사, 요양보호사, 의사, 간호요원, 조리원, 기타 종사자로 나누어 환자수와 비교하였다. 요양보호사, 간호사, 조리원, 기타종사자는 각각 0.982, 0.869, 0.783, 0.922 로 강한 상관관계를 띄고 있지만, 사회복지사와 의사는 0.415와 0,342로 상관관계를 크게 가지고 있지 않았다.

# 종사자별 상관관계 계수 계산
cor_social <- cor(data$user_now_5, data$socialworker_12)
cor_care <- cor(data$user_now_5, data$careworker_13)
cor_doc <- cor(data$user_now_5, data$doctor_14)
cor_nurse <- cor(data$user_now_5, data$nurse_15)
cor_cook <- cor(data$user_now_5, data$cook_16)
cor_other <- cor(data$user_now_5, data$otherworker_17)

# 결과 출력
print(c(cor_social, cor_care, cor_doc, cor_nurse, cor_cook, cor_other))
[1] 0.4152066 0.9818843 0.3415723 0.8689401 0.7833077 0.9219525

위에 내용을 시각화한 그래프이다. 대부분은 우상향하는 그래프로 양의 상관관계를 가짐을 알 수 있었지만, 요양보호사와 의사는 그다지 큰 상관관계가 아님을 알 수 있다.

library(cowplot)
library(ggplot2)

#사회복지사
plot1 <- ggplot(data, aes(x = user_now_5, y = socialworker_12)) +
  geom_jitter(color = "blue", alpha = 0.6) +
  theme_minimal() + 
  theme(panel.grid.minor = element_blank(),
        axis.title.x = element_text(size = 4),  
        axis.title.y = element_text(size = 4)) +  
  labs(title = "요양시설 환자 수와 사회복지사간의 관계", x = "요양시설 환자", y = "요양시설 사회복지사") +
  theme(plot.title = element_text(size = 8, face = "bold", hjust = 0.5))

#요양보호사
plot2 <- ggplot(data, aes(x = user_now_5, y = careworker_13)) +
  geom_jitter(color = "blue", alpha = 0.6) +
  theme_minimal() + 
  theme(panel.grid.minor = element_blank(),
        axis.title.x = element_text(size = 4),  
        axis.title.y = element_text(size = 4)) +  
  labs(title = "요양시설 환자 수와 요양보호사간의 관계", x = "요양시설 환자", y = "요양시설 요양보호사") +
  theme(plot.title = element_text(size = 8, face = "bold", hjust = 0.5))

#의사
plot3 <-ggplot(data, aes(x = user_now_5, y = doctor_14)) +
  geom_jitter(color = "blue", alpha = 0.6) +
  theme_minimal() + 
  theme(panel.grid.minor = element_blank(),
        axis.title.x = element_text(size = 4),  
        axis.title.y = element_text(size = 4)) +  
  labs(title = "요양시설 환자 수와 의사간의 관계", x = "요양시설 환자", y = "요양시설 의사") +
  theme(plot.title = element_text(size = 8, face = "bold", hjust = 0.5))

#간호요원
plot4 <- ggplot(data, aes(x = user_now_5, y = nurse_15)) +
  geom_jitter(color = "blue", alpha = 0.6) +
  theme_minimal() + 
  theme(panel.grid.minor = element_blank(),
        axis.title.x = element_text(size = 4),  
        axis.title.y = element_text(size = 4)) +  
  labs(title = "요양시설 환자 수와 간호요원간의 관계", x = "요양시설 환자", y = "요양시설 간호요원") +
  theme(plot.title = element_text(size = 8, face = "bold", hjust = 0.5))

#조리원
plot5 <- ggplot(data, aes(x = user_now_5, y = cook_16)) +
  geom_jitter(color = "blue", alpha = 0.6) +
  theme_minimal() + 
  theme(panel.grid.minor = element_blank(),
        axis.title.x = element_text(size = 4),  
        axis.title.y = element_text(size = 4)) +  
  labs(title = "요양시설 환자 수와 조리원간의 관계", x = "요양시설 환자", y = "요양시설 조리원") +
  theme(plot.title = element_text(size = 8, face = "bold", hjust = 0.5))

#기타 종사자
plot6 <- ggplot(data, aes(x = user_now_5, y = otherworker_17)) +
  geom_jitter(color = "blue", alpha = 0.6) +
  theme_minimal() + 
  theme(panel.grid.minor = element_blank(),
        axis.title.x = element_text(size = 4),  
        axis.title.y = element_text(size = 4)) +  
  labs(title = "요양시설 환자 수와 기타 종사자간의 관계", x = "요양시설 환자", y = "요양시설 기타 종사자") +
  theme(plot.title = element_text(size = 8, face = "bold", hjust = 0.5))

plot_grid(plot1, plot2, plot3, plot4, plot5, plot6, ncol = 2)

8. 조사 결과를 반영한 디자인 및 관련 정책의 제안

1. 요양시설에 대한 정책 제안

자치구별 요양시설 수와 이용시설 총 정원으로 보아 중구가 가장 부족해보이므로 중구에 요양시설을 좀 더 배치.해야 한다.

2. 시설 이용 현황 및 수요 제안

  1. 요양시설에는 비치매 환자보다 치매환자가 많다. 따라서, 치매환자가 편리함을 느낄 수 있는 시설이 필요하다.
  2. 요양시설에는 여성환자가 남성환자보다 많음을 알 수 있었다. 따라서, 여성환자가 편리함을 느낄 수 있는 시설이 필요하다.
  3. 자치구별 요양시설 총 정원 대비 노인 비율을 보니 중구가 가장 많아, 중구에 요양시설을 더 배치해야 한다.
  4. 요양시설 대기 인원을 보니 송파구가 압도적으로 많기에 송파구에도 요양시설을 더 배치해야한다.

3. 요양시설 종사자 구성 정책 제안

종사자는 요양시설 인원수가 많아질 수록 많아져야 한다. 종사자 중에서도 사회복지사와 의사보다 요양보호사, 간호요원, 조리원, 기타 종사자가 많아져야 한다. 따라서, 요양시설이 더 필요한 중구와 송파구에 요양보호사, 간호요워느 조리워느 기타 종사자가 더 필요하다.