1. NHTSA API 데이터

λ―Έκ΅­ λ„λ‘œκ΅ν†΅μ•ˆμ „κ΅­(NHTSA)은 λ―Έκ΅­μ—μ„œ μ‹œνŒλ˜λŠ” μžλ™μ°¨μ— λŒ€ν•œ 리콜 및 고객뢈만 데이터λ₯Ό NHTSA Office of Defects Investigation (ODI) - Recalls μ›ΉAPIλ₯Ό ν†΅ν•΄μ„œ μ œκ³΅ν•˜κ³  μžˆλ‹€.

R νŒ©ν‚€μ§€λ„ κ³΅κ°œλ˜μ–΄ μžˆμ–΄ openNHTSAλ₯Ό ν†΅ν•΄μ„œ 별도 RESTful API ν”„λ‘œκ·Έλž˜λ°μ„ μƒλž΅ν•˜κ³  R μ½”λ“œλ‘œ μžλ™μ°¨ 리콜과 고객뢈만 데이터λ₯Ό κΈμ–΄μ˜¬ 수 μžˆλ‹€.

2. ν˜„λŒ€κΈ°μ•„μ°¨ μžλ™μ°¨ 리콜

2.1. λ¦¬μ½œλ°μ΄ν„° μΆ”μΆœ ν™˜κ²½μ„€μ •

openNHTSA 예제 μ½”λ“œλ₯Ό μ°Έμ‘°ν•˜μ—¬ 2001-2017λ…„κΉŒμ§€ ν˜„λŒ€μ°¨μ™€ 기아차에 λŒ€ν•œ 리콜과 뢈만 데이터을 μœ„ν•œ 섀정을 μ€€λΉ„ν•œλ‹€. λ”λΆˆμ–΄ ν˜„λŒ€μ°¨μ™€ κΈ°μ•„μ°¨λ₯Ό νŠΉμ •μ§“λŠ” 색상도 μ„€μ •ν•œλ‹€.

# 0. ν™˜κ²½μ„€μ • ----------------
# library(openNHTSA) # devtools::install_github("statwonk/openNHTSA")
# library(tidyverse)
# library(stringr)
# library(forcats)
# library(ggpubr)
# library(extrafont)
# loadfonts()

## 1.0. NHTSA 데이터 κΈμ–΄μ˜€κΈ°
crawl_nhtsa <- function(maker, recall_complaint) {
  
  nhtsa_df <- data.frame()
  
  for(myear in 2001:2017) {
    tmp_df <- facility(recall_complaint) %>%
      model_year(myear) %>%
      vehicle_make(maker) %>% 
      nhtsa_fetch()
    nhtsa_df <- bind_rows(nhtsa_df, tmp_df)
  }
  return(nhtsa_df)
}
## 1.0. ν˜„λŒ€κΈ°μ•„μžλ™μ°¨ 색상
hkmc_cols <- c(KIA = "#ff0000",
               HYUNDAI = "#0000ff")

2.2. μžλ™μ°¨ 리콜 μΆ”μ„Έ μ‹œκ°ν™”

crawl_nhtsa ν•¨μˆ˜μ— ν˜„λŒ€μ°¨(hyundai)와 κΈ°μ•„μ°¨(kia) 그리고 리콜인수(recalls)λ₯Ό λ„£μ–΄ 데이터λ₯Ό κΈμ–΄μ˜€κ³  이λ₯Ό λ°”νƒ•μœΌλ‘œ 연도별 ν˜„λŒ€κΈ°μ•„μ°¨ 리콜 횟수λ₯Ό μ‹œκ°ν™”ν•œλ‹€.

# 1. 리콜 데이터 κ°€μ Έμ˜€κΈ° ----------------
## 1.1. ν˜„λŒ€μ°¨ 
hyundai_df <- crawl_nhtsa("hyundai", "recalls")

## 1.2. κΈ°μ•„μ°¨ 
kia_df <- crawl_nhtsa("kia", "recalls")

## 1.3. 데이터 병합
recall_df <- bind_rows(hyundai_df, kia_df)

## 1.5. 데이터 μ‹œκ°ν™” -------------
recall_df %>% 
  count(Make, ModelYear) %>% 
  ggplot(aes(x=ModelYear, y=n, group=Make, color=Make)) +
    geom_line(size=1.1, alpha=0.3) +
    geom_point(size=2, alpha=0.7) +
    theme_pubr(base_family = "NanumGothic") +
    labs(x="", y="리콜횟수 (2001 - 2017λ…„)", title="μžλ™μ°¨ μ œμ‘°μ‚¬ 리콜 μΆ”μ„Έ", color="μ œμ‘°μ‚¬") +
    scale_color_manual(values=hkmc_cols)

3. ν˜„λŒ€κΈ°μ•„μžλ™μ°¨ 뢈만 μΆ”μ„Έ

crawl_nhtsa ν•¨μˆ˜μ— ν˜„λŒ€μ°¨(hyundai)와 κΈ°μ•„μ°¨(kia) 그리고 뢈만(complaints)인수λ₯Ό λ„£μ–΄ 데이터λ₯Ό κΈμ–΄μ˜€κ³  이λ₯Ό λ°”νƒ•μœΌλ‘œ 연도별 ν˜„λŒ€κΈ°μ•„μ°¨ 뢈만 횟수λ₯Ό μ‹œκ°ν™”ν•œλ‹€.

# 2. ν•­μ˜ 데이터 κ°€μ Έμ˜€κΈ° ----------------
## 2.1. ν˜„λŒ€μ°¨ 
hyundai_comp_df <- crawl_nhtsa("hyundai", "complaints")

## 2.2. κΈ°μ•„μ°¨ 
kia_comp_df <- crawl_nhtsa("kia", "complaints")

## 2.3. 데이터 병합
complaint_df <- bind_rows(hyundai_comp_df, kia_comp_df) 

# 3. 데이터 μ‹œκ°ν™” -------------
## 3.1. μ œμ‘°μ‚¬λ³„ 연도 μΆ”μ„Έ
complaint_df %>% 
  count(Make, ModelYear) %>% 
  ggplot(aes(x=ModelYear, y=n, group=Make, color=Make)) +
  geom_line() +
  geom_point() +
  theme_pubr(base_family = "NanumGothic") +
  labs(x="", y="뢈만횟수", title="μžλ™μ°¨ μ œμ‘°μ‚¬ 뢈만 μΆ”μ„Έ", color="μ œμ‘°μ‚¬") +
  scale_color_manual(values=hkmc_cols)

3. ν˜„λŒ€κΈ°μ•„μžλ™μ°¨ λͺ¨λΈλ³„ 리콜과 뢈만 횟수

2001 - 2017λ…„ ν˜„λŒ€κΈ°μ•„μžλ™μ°¨ λͺ¨λΈλ³„ 리콜과 뢈만 횟수λ₯Ό μ„Έμ–΄λ³΄μž.

# 3. λͺ¨λΈλ³„ 데이터 μ‹œκ°ν™” -------------
## 3.1. λͺ¨λΈλ³„ 리콜 데이터 μ‹œκ°ν™”
recall_df %>% 
  filter(str_detect(Make, "HYUNDAI|KIA")) %>% 
  count(Make, Model) %>% 
  ggplot(aes(x=reorder(Model, n), y=n, fill=Make)) +
  geom_bar(stat="identity") +
  coord_flip() +
  labs(x="", y="리콜횟수(2001 - 2017λ…„)", title="ν˜„λŒ€ κΈ°μ•„μžλ™μ°¨ 리콜횟수", fill="μ œμ‘°μ‚¬") +
  theme_pubr(base_family = "NanumGothic") +
  scale_fill_manual(values=hkmc_cols) +
  theme(axis.text = element_text(size=8))

## 3.2. λͺ¨λΈλ³„ 뢈만 데이터 μ‹œκ°ν™”
complaint_df %>% 
  filter(str_detect(Make, "HYUNDAI|KIA")) %>% 
  count(Make, Model) %>% 
  ggplot(aes(x=reorder(Model, n), y=n, fill=Make)) +
  geom_bar(stat="identity") +
  coord_flip() +
  labs(x="", y="뢈만횟수(2001 - 2017λ…„)", title="ν˜„λŒ€ κΈ°μ•„μžλ™μ°¨ 뢈만횟수", fill="μ œμ‘°μ‚¬") +
  theme_pubr(base_family = "NanumGothic") +
  scale_fill_manual(values=hkmc_cols) +
  theme(axis.text = element_text(size=8))