Code Interpreter

BitGPT로 Code Interpreter 기능 구현도전!!!

저자
소속

1 데이터셋

1.1 원본 데이터

행정안전부 주민등록 인구 및 세대현황 웹사이트에서 광명시 최근 데이터를 가져온다.

코드
library(tidyverse)
library(readxl)

raw_data <- read_excel("data/202307_202307_연령별인구현황_월간.xlsx", skip =3) 

raw_data |> 
  janitor::clean_names(ascii = FALSE) |> 
  select(1:10) |> 
  head() |> 
  gt::gt()
행정기관코드 행정기관 총_인구수 연령구간인구수_4 x0세_5 x1세_6 x2세_7 x3세_8 x4세_9 x5세_10
4121000000 경기도 경기도 광명시 280,986 280,986 1,373 1,470 1,582 1,588 1,729 1,924
4121051000 경기도 광명시 광명1동 56 56 0 0 0 0 0 0
4121052000 경기도 광명시 광명2동 2,953 2,953 9 7 11 5 5 8
4121054000 경기도 광명시 광명3동 9,869 9,869 29 21 20 20 23 24
4121055000 경기도 광명시 광명4동 8,114 8,114 35 29 44 27 28 35
4121056000 경기도 광명시 광명5동 12,206 12,206 41 40 64 51 49 60

1.2 가공데이터

코드
library(tidyverse)

pop_tbl <- 
  read_rds("data/kwangmyung_pop.rds")

pop_tbl |> 
  head() |> 
  gt::gt()
시점 행정동 성별 나이 인구수
2023-07-15 광명1동 남자 0 0
2023-07-15 광명1동 남자 1 0
2023-07-15 광명1동 남자 2 0
2023-07-15 광명1동 남자 3 0
2023-07-15 광명1동 남자 4 0
2023-07-15 광명1동 남자 5 0

1.3 챗GPT 데이터 변환

데이터를 가공한 후 챗GPT Code Interpreter 분석용으로 변환시켜 데이터를 전송한다.

코드
pop_tbl |> 
  write_csv("data/kwangmyung_pop.csv")

2 챗GPT Code Interpreter

쥬피터 노트북 다운로드

3 쥬피터 노트북 미리보기

4 마무리 작업

4.1 연도별 인구수

코드
library(tidyverse)

pop_tbl <- 
  read_rds("data/kwangmyung_pop.rds")

pop_tbl |> 
  mutate(시점 = ymd(시점)) |> 
  mutate(연도 = year(시점)) |> 
  group_by(연도) |> 
  summarise(인구수 = sum(인구수)) |> 
  ggplot(aes(x=연도, y=인구수)) +
    geom_line(color="skyblue", size=1.5) +
    geom_point(color="blue", size=3) +
    labs(title="광명시 인구수 변화", x="", y="인구수(명)",
         caption = "데이터 출처: 행정안전부 주민등록 인구 및 세대현황") +
    theme_minimal() +
    scale_y_continuous(labels = scales::comma)

4.2 연도별 인구수

코드
library(tidyverse)

pop_tbl <- 
  read_rds("data/kwangmyung_pop.rds")

pop_tbl |> 
  mutate(시점 = ymd(시점)) |> 
  mutate(연도 = year(시점)) |> 
  group_by(연도) |> 
  summarise(인구수 = sum(인구수)) |> 
  ggplot(aes(x=연도, y=인구수)) +
    geom_line(color="skyblue", size=1.5) +
    geom_point(color="blue", size=3) +
    labs(title="광명시 인구수 변화", x="", y="인구수(명)",
         caption = "데이터 출처: 행정안전부 주민등록 인구 및 세대현황") +
    theme_minimal() +
    scale_y_continuous(labels = scales::comma)

4.3 동별 인구수

코드

pop_tbl |> 
  mutate(시점 = ymd(시점)) |> 
  mutate(연도 = year(시점)) |> 
  group_by(연도, 행정동) |> 
  summarise(인구수 = sum(인구수)) |> 
  ggplot(aes(x=연도, y=인구수, color = 행정동, group=행정동)) +
    geom_line(size=1.5) +
    geom_point(color="blue", size=3) +
    labs(title="광명시 동별 인구수 변화", x="", y="인구수(명)",
         caption = "데이터 출처: 행정안전부 주민등록 인구 및 세대현황") +
    theme_minimal() +
    scale_y_continuous(labels = scales::comma)

4.4 유권자 비율

코드
pop_tbl |> 
  mutate(시점 = ymd(시점)) |> 
  mutate(연도 = year(시점)) |> 
  mutate(유권자 = ifelse(나이 >=18, "유권자", "비유권자"),
         유권자 = factor(유권자, levels = c("비유권자", '유권자'))) |> 
  group_by(유권자) |> 
  summarise(인구수 = sum(인구수)) |> 
  ggplot(aes(x="", y=인구수, fill = 유권자)) +
    geom_bar(width = 1, stat = "identity") +
    coord_polar("y")  +
    labs(title="광명시 유권자 비율",
         caption = "데이터 출처: 행정안전부 주민등록 인구 및 세대현황",
         fill = "구분") +
    theme_minimal() +
    scale_y_continuous(labels = scales::comma) +
    scale_fill_manual(values = c(유권자 = "blue", 비유권자="red"))

4.5 내림차순 유권자수

코드
pop_tbl |> 
  mutate(시점 = ymd(시점)) |> 
  mutate(연도 = year(시점)) |> 
  filter(연도 == max(연도)) |> 
  mutate(유권자 = ifelse(나이 >=18, "유권자", "비유권자"),
         유권자 = factor(유권자, levels = c("비유권자", '유권자'))) |> 
  group_by(행정동, 유권자) |> 
  summarise(인구수 = sum(인구수)) |> 
  mutate(유권자비율 = 인구수/sum(인구수)) |> 
  ungroup() |> 
    
  # pivot_wider(names_from = 유권자, values_from = 인구수) |> 
  # mutate(유권자비율 = 유권자/(비유권자+유권자)) |> 
  # arrange(desc(유권자비율))

  # 시각화 -----------------
  ggplot(aes(x=fct_reorder2(행정동, 유권자, 유권자비율), y=유권자비율, fill = 유권자)) +
    geom_col() +
    coord_flip() +
    labs(title="광명시 동별 유권자 비율",
         caption = "데이터 출처: 행정안전부 주민등록 인구 및 세대현황",
         fill = "구분",
         x = "") +
    theme_minimal() +
    scale_y_continuous(labels = scales::percent) +
    scale_fill_manual(values = c(유권자 = "blue", 비유권자="red")) +
    theme(legend.position = "top")