문제의식

도시에서의 식품 위생은 시민의 건강과 직결되는 중요한 도시 서비스 요소입니다. 특히, 농림축산식품부의 안심식당 제도는 위생 관리 기준을 충족한 음식점을 지정하고 관리하며 도시 내 외식 환경의 신뢰성을 높이고자 하는 공공정책입니다.

안심식당 데이터를 통해 알 수 있는 것

안심식당은 위생서비스 인프라로 볼 수 있으며 특정 구역에만 몰려 있다면 도시 내에 서비스 접근성 불균형이 발생하는 것을, 반대로 주거지와 노후 상권 등에도 균등하게 분포한다면 골고루 작동함을 의미합니다. 특히 코로나19 이후 청결과 위생이 도시 경쟁력 일부로 인식되어 온 만큼 이 지표는 “안전한 도시 이미지” 를 형성하는 요소가 되었고, 본 과제에서는 안심식당 현황 자료를 활용하여, 도시 내 안심식당의 분포를 분석하기 위한 데이터를 정리해보려고 합니다.

                                       

안심식당 기준

3가지 방역수칙을 준수하여 안심식당으로 선정된 식당 리스트

  • ① 덜어먹기 가능한 도구 비치·제공
  • ② 위생적인 수저 관리
  • ③ 종사자 마스크 착용 여부

                                                            농림축산식품부의 공공데이터 알아보기 –> https://data.mafra.go.kr/main.do.

                                                           

1. 패키지 다운로드

library(flextable)
library(webshot)
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.2
## ✔ ggplot2   4.0.0     ✔ tibble    3.3.0
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.1.0     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ purrr::compose() masks flextable::compose()
## ✖ 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(XML)
library(jsonlite)
## 
## Attaching package: 'jsonlite'
## 
## The following object is masked from 'package:purrr':
## 
##     flatten

                                                           

2. Open API 안심식당 데이터 다운로드

url <- "http://211.237.50.150:7080/openapi"
auth_key <- "e92b49066a3e7b4ef0a4cba04937c078e290caa6ec9da42104877e3c74a78ef0"

type <- 'xml'
service <- 'Grid_20200713000000000605_1'
startindex <- '1'
endindex <- '500'

api_url = paste(url, auth_key, type, service, startindex, endindex, sep = '/')
parsedXml <- xmlParse(api_url)

rowXml <- getNodeSet(parsedXml, "//row")

restaurant <- xmlToDataFrame(rowXml, stringsAsFactors = F)

                                                           

3. 이름 정리

glimpse(restaurant)
## Rows: 500
## Columns: 17
## $ ROW_NUM                <chr> "1", "2", "3", "4", "5", "6", "7", "8", "9", "1…
## $ RELAX_SEQ              <chr> "11162", "11163", "11164", "11165", "11166", "1…
## $ RELAX_ZIPCODE          <chr> "37782", "37636", "37633", "37588", "37596", "3…
## $ RELAX_SI_NM            <chr> "경상북도", "경상북도", "경상북도", "경상북도", "경상북도", "경상북도",…
## $ RELAX_SIDO_NM          <chr> "포항시", "포항시", "포항시", "포항시", "포항시", "포항시", "포항시"…
## $ RELAX_RSTRNT_NM        <chr> "김수사", "정담초밥", "99串양꼬치", "왕손짜장", "빨봉분식양덕점", "무이…
## $ RELAX_RSTRNT_REPRESENT <chr> "김성재", "정동필", "이서현", "김정란", "김성현외1명", "양은숙", "이…
## $ RELAX_RSTRNT_REG_DT    <chr> "2020-09-04", "2020-09-04", "2020-09-04", "2020…
## $ RELAX_ADD1             <chr> "경상북도 포항시 북구 양학천로 56", "경상북도 포항시 북구 우창동로 33", "…
## $ RELAX_ADD2             <chr> "", "", "가동 지하 102호 ", "", "", "", "", "", "", …
## $ RELAX_GUBUN            <chr> "일반음식점", "일반음식점", "일반음식점", "일반음식점", "일반음식점_외", …
## $ RELAX_GUBUN_DETAIL     <chr> "일식", "일식", "기타외국식", "중식", "기타 음식점업", "한식", "한식…
## $ RELAX_RSTRNT_TEL       <chr> "054-282-0004", "054-242-8700", "054-254-9450",…
## $ RELAX_USE_YN           <chr> "Y", "Y", "Y", "Y", "N", "N", "Y", "Y", "Y", "N…
## $ RELAX_RSTRNT_CNCL_DT   <chr> "", "", "", "", "2022-06-21", "2023-07-10", "",…
## $ RELAX_RSTRNT_ETC       <chr> "", "", "", "", "", "", "", "", "", "", "", "",…
## $ UPDT_DT                <chr> "2021-05-28", "2021-05-28", "2021-05-28", "2021…
names(restaurant)
##  [1] "ROW_NUM"                "RELAX_SEQ"              "RELAX_ZIPCODE"         
##  [4] "RELAX_SI_NM"            "RELAX_SIDO_NM"          "RELAX_RSTRNT_NM"       
##  [7] "RELAX_RSTRNT_REPRESENT" "RELAX_RSTRNT_REG_DT"    "RELAX_ADD1"            
## [10] "RELAX_ADD2"             "RELAX_GUBUN"            "RELAX_GUBUN_DETAIL"    
## [13] "RELAX_RSTRNT_TEL"       "RELAX_USE_YN"           "RELAX_RSTRNT_CNCL_DT"  
## [16] "RELAX_RSTRNT_ETC"       "UPDT_DT"
restaurant <- restaurant |>
  rename(res_si = "RELAX_SI_NM",
         res_sido = "RELAX_SIDO_NM",
         res_name = "RELAX_RSTRNT_NM",
         res_type = "RELAX_GUBUN_DETAIL",
         res_result = "RELAX_USE_YN")

                                                           

4. 선택 분류

glimpse(restaurant)
## Rows: 500
## Columns: 17
## $ ROW_NUM                <chr> "1", "2", "3", "4", "5", "6", "7", "8", "9", "1…
## $ RELAX_SEQ              <chr> "11162", "11163", "11164", "11165", "11166", "1…
## $ RELAX_ZIPCODE          <chr> "37782", "37636", "37633", "37588", "37596", "3…
## $ res_si                 <chr> "경상북도", "경상북도", "경상북도", "경상북도", "경상북도", "경상북도",…
## $ res_sido               <chr> "포항시", "포항시", "포항시", "포항시", "포항시", "포항시", "포항시"…
## $ res_name               <chr> "김수사", "정담초밥", "99串양꼬치", "왕손짜장", "빨봉분식양덕점", "무이…
## $ RELAX_RSTRNT_REPRESENT <chr> "김성재", "정동필", "이서현", "김정란", "김성현외1명", "양은숙", "이…
## $ RELAX_RSTRNT_REG_DT    <chr> "2020-09-04", "2020-09-04", "2020-09-04", "2020…
## $ RELAX_ADD1             <chr> "경상북도 포항시 북구 양학천로 56", "경상북도 포항시 북구 우창동로 33", "…
## $ RELAX_ADD2             <chr> "", "", "가동 지하 102호 ", "", "", "", "", "", "", …
## $ RELAX_GUBUN            <chr> "일반음식점", "일반음식점", "일반음식점", "일반음식점", "일반음식점_외", …
## $ res_type               <chr> "일식", "일식", "기타외국식", "중식", "기타 음식점업", "한식", "한식…
## $ RELAX_RSTRNT_TEL       <chr> "054-282-0004", "054-242-8700", "054-254-9450",…
## $ res_result             <chr> "Y", "Y", "Y", "Y", "N", "N", "Y", "Y", "Y", "N…
## $ RELAX_RSTRNT_CNCL_DT   <chr> "", "", "", "", "2022-06-21", "2023-07-10", "",…
## $ RELAX_RSTRNT_ETC       <chr> "", "", "", "", "", "", "", "", "", "", "", "",…
## $ UPDT_DT                <chr> "2021-05-28", "2021-05-28", "2021-05-28", "2021…
restaurant.tib <- as_tibble(restaurant)
restaurant.tib
## # A tibble: 500 × 17
##    ROW_NUM RELAX_SEQ RELAX_ZIPCODE res_si   res_sido res_name      
##    <chr>   <chr>     <chr>         <chr>    <chr>    <chr>         
##  1 1       11162     37782         경상북도 포항시   김수사        
##  2 2       11163     37636         경상북도 포항시   정담초밥      
##  3 3       11164     37633         경상북도 포항시   99串양꼬치    
##  4 4       11165     37588         경상북도 포항시   왕손짜장      
##  5 5       11166     37596         경상북도 포항시   빨봉분식양덕점
##  6 6       11167     37587         경상북도 포항시   무이봉        
##  7 7       11168     37579         경상북도 포항시   회일번지      
##  8 8       11169     37572         경상북도 포항시   온정가        
##  9 9       11170     37572         경상북도 포항시   B&amp;J미술관 
## 10 10      11171     37572         경상북도 포항시   소풍경(법원점)
## # ℹ 490 more rows
## # ℹ 11 more variables: RELAX_RSTRNT_REPRESENT <chr>, RELAX_RSTRNT_REG_DT <chr>,
## #   RELAX_ADD1 <chr>, RELAX_ADD2 <chr>, RELAX_GUBUN <chr>, res_type <chr>,
## #   RELAX_RSTRNT_TEL <chr>, res_result <chr>, RELAX_RSTRNT_CNCL_DT <chr>,
## #   RELAX_RSTRNT_ETC <chr>, UPDT_DT <chr>
restaurant <- restaurant.tib
rm(restaurant.tib)

names(restaurant)
##  [1] "ROW_NUM"                "RELAX_SEQ"              "RELAX_ZIPCODE"         
##  [4] "res_si"                 "res_sido"               "res_name"              
##  [7] "RELAX_RSTRNT_REPRESENT" "RELAX_RSTRNT_REG_DT"    "RELAX_ADD1"            
## [10] "RELAX_ADD2"             "RELAX_GUBUN"            "res_type"              
## [13] "RELAX_RSTRNT_TEL"       "res_result"             "RELAX_RSTRNT_CNCL_DT"  
## [16] "RELAX_RSTRNT_ETC"       "UPDT_DT"
restaurant |> select(res_si, res_sido, res_name, res_type, res_result)
## # A tibble: 500 × 5
##    res_si   res_sido res_name       res_type      res_result
##    <chr>    <chr>    <chr>          <chr>         <chr>     
##  1 경상북도 포항시   김수사         일식          Y         
##  2 경상북도 포항시   정담초밥       일식          Y         
##  3 경상북도 포항시   99串양꼬치     기타외국식    Y         
##  4 경상북도 포항시   왕손짜장       중식          Y         
##  5 경상북도 포항시   빨봉분식양덕점 기타 음식점업 N         
##  6 경상북도 포항시   무이봉         한식          N         
##  7 경상북도 포항시   회일번지       한식          Y         
##  8 경상북도 포항시   온정가         한식          Y         
##  9 경상북도 포항시   B&amp;J미술관  한식          Y         
## 10 경상북도 포항시   소풍경(법원점) 한식          N         
## # ℹ 490 more rows
restaurant
## # A tibble: 500 × 17
##    ROW_NUM RELAX_SEQ RELAX_ZIPCODE res_si   res_sido res_name      
##    <chr>   <chr>     <chr>         <chr>    <chr>    <chr>         
##  1 1       11162     37782         경상북도 포항시   김수사        
##  2 2       11163     37636         경상북도 포항시   정담초밥      
##  3 3       11164     37633         경상북도 포항시   99串양꼬치    
##  4 4       11165     37588         경상북도 포항시   왕손짜장      
##  5 5       11166     37596         경상북도 포항시   빨봉분식양덕점
##  6 6       11167     37587         경상북도 포항시   무이봉        
##  7 7       11168     37579         경상북도 포항시   회일번지      
##  8 8       11169     37572         경상북도 포항시   온정가        
##  9 9       11170     37572         경상북도 포항시   B&amp;J미술관 
## 10 10      11171     37572         경상북도 포항시   소풍경(법원점)
## # ℹ 490 more rows
## # ℹ 11 more variables: RELAX_RSTRNT_REPRESENT <chr>, RELAX_RSTRNT_REG_DT <chr>,
## #   RELAX_ADD1 <chr>, RELAX_ADD2 <chr>, RELAX_GUBUN <chr>, res_type <chr>,
## #   RELAX_RSTRNT_TEL <chr>, res_result <chr>, RELAX_RSTRNT_CNCL_DT <chr>,
## #   RELAX_RSTRNT_ETC <chr>, UPDT_DT <chr>

                                                           

5. 그룹 통계

unique(restaurant$res_si)
##  [1] "경상북도"   "광주광역시" "경기도"     "경상남도"   "인천광역시"
##  [6] "대구광역시" "울산광역시" "충청남도"   "충청북도"   "대전광역시"
restaurant |>
  group_by(res_si) |>
  summarize(n = n())
## # A tibble: 10 × 2
##    res_si         n
##    <chr>      <int>
##  1 경기도        46
##  2 경상남도      10
##  3 경상북도     273
##  4 광주광역시    23
##  5 대구광역시    62
##  6 대전광역시     7
##  7 울산광역시     1
##  8 인천광역시     3
##  9 충청남도      26
## 10 충청북도      49
restaurant |>
  group_by(res_si, res_type) |>
  summarize(n = n()) |>
  mutate(total = sum(n),
         freq = n / total)
## `summarise()` has grouped output by 'res_si'. You can override using the
## `.groups` argument.
## # A tibble: 35 × 5
## # Groups:   res_si [10]
##    res_si   res_type          n total    freq
##    <chr>    <chr>         <int> <int>   <dbl>
##  1 경기도   기타외국식        3    46 0.0652 
##  2 경기도   서양식            2    46 0.0435 
##  3 경기도   일식              5    46 0.109  
##  4 경기도   중식              2    46 0.0435 
##  5 경기도   한식             34    46 0.739  
##  6 경상남도 기타 음식점업     4    10 0.4    
##  7 경상남도 서양식            1    10 0.1    
##  8 경상남도 한식              5    10 0.5    
##  9 경상북도 기타 음식점업    15   273 0.0549 
## 10 경상북도 기타외국식        2   273 0.00733
## # ℹ 25 more rows