knitr::opts_chunk$set(echo = TRUE)

library(readr)
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(tidyr)
library(ggplot2)
library(lubridate)
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
library(scales)
## 
## Attaching package: 'scales'
## The following object is masked from 'package:readr':
## 
##     col_factor
library(ggrepel)

Executive Summary

This report analyzes recent trends in youth labor market conditions in South Korea using official statistics from the Korean Statistical Information Service (KOSIS). We focus exclusively on young people aged 15–29 in the total population (both sexes combined) and examine three key indicators: the employment rate, the unemployment rate, and the labor force participation rate. The data cover a one-year period from October 2024 to October 2025 and provide monthly observations for this age group.

Our analysis proceeds in three steps. First, we construct a tidy dataset from the original wide KOSIS table and provide descriptive statistics for the three youth labor market indicators. Second, we visualize their recent monthly trends and compare the situation at the beginning and end of the period. Third, we explore the relationships among the three indicators and identify notable month-to-month changes (“turning points”) in the employment and unemployment rates.

The results show that youth employment, unemployment, and labor force participation for ages 15–29 remained within a moderate range over the period, but with visible short-term fluctuations. Changes in the labor force participation rate are closely linked to changes in the employment rate, while unemployment behaves more like a residual indicator that captures remaining mismatches between job seekers and available jobs. Although this analysis is limited to a one-year snapshot, it provides a concise overview of how youths aged 15–29 are currently positioned in the Korean labor market and offers a basic empirical basis for future discussions of youth employment support measures.

1. Research Question and Importance

In South Korea today, many university students and young people in their early twenties are experiencing growing anxiety and discouragement about their future. Even after investing years in higher education, they often feel that securing a stable job is becoming increasingly difficult. Repeated failures in recruitment processes, reliance on short-term or precarious work, and uncertainty about when they will be able to “properly” enter the labor market all contribute to feelings of stress, frustration, and even depression. These conditions affect not only their current economic situation but also their mental well-being, self-confidence, and ability to make long-term plans for independent adult life.

At the same time, South Korea is moving toward a super-aged society, which makes the successful transition of college students and young adults into stable employment more important than ever. If a large share of highly educated youths struggle to find and maintain decent jobs, it undermines both their individual life chances and the long-term health of the labor market. For these reasons, it is important to closely examine how youth employment, unemployment, and labor force participation have changed in the most recent period, especially for the core youth group aged 15–29.

In this project, we address the following research questions: 1. What are the recent levels and short-term monthly trends in the employment rate, unemployment rate, and labor force participation rate for Korean youths aged 15–29?

  1. How do these three indicators relate to each other over time within this age group during the most recent one-year period?

  2. Are there noticeable month-to-month changes or “turning points” in these indicators that might signal short-term instability or adjustment in the youth labor market?

Our goal is not to estimate causal effects, but to provide a clear, data-driven description of the current situation of youths aged 15–29 in the Korean labor market.

2. Data Source and Data Collection

The dataset comes from ‘KOSIS’ (Korean Statistical Information Service), specifically from the Economically Active Population Survey table titled:

“Economically active population by sex and age group (1-week reference period)”
(in Korean: “성/연령별 경제활동인구(구직기간 1주 기준)”)

Website: https://kosis.kr

Search terms: “Economically Active Population Survey”, “sex and age group”, “economically active population”

The table provides monthly statistics by sex and detailed age groups. For each month (from 2024.10 to 2025.10), the following indicators are available:

Age groups in the table include, for example, total, 15–29, 15–19, 20–29, 30–39, 40–49, 50–59, 60 and over, and 15–24. Sex categories include total, male, and female.

For this project, we focus only on the age group 15–29 and the total sex category. Other age groups and separate male/female series are kept in the data but are not the main subject of our analysis.

The data have already been processed and aggregated by the government. For our analysis, we download the table as a CSV file from KOSIS, import it into R, and then perform several simple preprocessing steps:

This dataset is appropriate for our purpose because it is publicly available, reliable, and directly related to youth employment and labor market issues in South Korea.

youth_raw <- read_csv("성_연령별_경제활동인구_20251120141336.csv")
## New names:
## Rows: 31 Columns: 106
## ── Column specification
## ──────────────────────────────────────────────────────── Delimiter: "," chr
## (106): 성별, 연령계층별, 2024.10...3, 2024.10...4, 2024.10...5, 2024.10...6,
## 20...
## ℹ Use `spec()` to retrieve the full column specification for this data. ℹ
## Specify the column types or set `show_col_types = FALSE` to quiet this message.
## • `2024.10` -> `2024.10...3`
## • `2024.10` -> `2024.10...4`
## • `2024.10` -> `2024.10...5`
## • `2024.10` -> `2024.10...6`
## • `2024.10` -> `2024.10...7`
## • `2024.10` -> `2024.10...8`
## • `2024.10` -> `2024.10...9`
## • `2024.10` -> `2024.10...10`
## • `2024.11` -> `2024.11...11`
## • `2024.11` -> `2024.11...12`
## • `2024.11` -> `2024.11...13`
## • `2024.11` -> `2024.11...14`
## • `2024.11` -> `2024.11...15`
## • `2024.11` -> `2024.11...16`
## • `2024.11` -> `2024.11...17`
## • `2024.11` -> `2024.11...18`
## • `2024.12` -> `2024.12...19`
## • `2024.12` -> `2024.12...20`
## • `2024.12` -> `2024.12...21`
## • `2024.12` -> `2024.12...22`
## • `2024.12` -> `2024.12...23`
## • `2024.12` -> `2024.12...24`
## • `2024.12` -> `2024.12...25`
## • `2024.12` -> `2024.12...26`
## • `2025.01` -> `2025.01...27`
## • `2025.01` -> `2025.01...28`
## • `2025.01` -> `2025.01...29`
## • `2025.01` -> `2025.01...30`
## • `2025.01` -> `2025.01...31`
## • `2025.01` -> `2025.01...32`
## • `2025.01` -> `2025.01...33`
## • `2025.01` -> `2025.01...34`
## • `2025.02` -> `2025.02...35`
## • `2025.02` -> `2025.02...36`
## • `2025.02` -> `2025.02...37`
## • `2025.02` -> `2025.02...38`
## • `2025.02` -> `2025.02...39`
## • `2025.02` -> `2025.02...40`
## • `2025.02` -> `2025.02...41`
## • `2025.02` -> `2025.02...42`
## • `2025.03` -> `2025.03...43`
## • `2025.03` -> `2025.03...44`
## • `2025.03` -> `2025.03...45`
## • `2025.03` -> `2025.03...46`
## • `2025.03` -> `2025.03...47`
## • `2025.03` -> `2025.03...48`
## • `2025.03` -> `2025.03...49`
## • `2025.03` -> `2025.03...50`
## • `2025.04` -> `2025.04...51`
## • `2025.04` -> `2025.04...52`
## • `2025.04` -> `2025.04...53`
## • `2025.04` -> `2025.04...54`
## • `2025.04` -> `2025.04...55`
## • `2025.04` -> `2025.04...56`
## • `2025.04` -> `2025.04...57`
## • `2025.04` -> `2025.04...58`
## • `2025.05` -> `2025.05...59`
## • `2025.05` -> `2025.05...60`
## • `2025.05` -> `2025.05...61`
## • `2025.05` -> `2025.05...62`
## • `2025.05` -> `2025.05...63`
## • `2025.05` -> `2025.05...64`
## • `2025.05` -> `2025.05...65`
## • `2025.05` -> `2025.05...66`
## • `2025.06` -> `2025.06...67`
## • `2025.06` -> `2025.06...68`
## • `2025.06` -> `2025.06...69`
## • `2025.06` -> `2025.06...70`
## • `2025.06` -> `2025.06...71`
## • `2025.06` -> `2025.06...72`
## • `2025.06` -> `2025.06...73`
## • `2025.06` -> `2025.06...74`
## • `2025.07` -> `2025.07...75`
## • `2025.07` -> `2025.07...76`
## • `2025.07` -> `2025.07...77`
## • `2025.07` -> `2025.07...78`
## • `2025.07` -> `2025.07...79`
## • `2025.07` -> `2025.07...80`
## • `2025.07` -> `2025.07...81`
## • `2025.07` -> `2025.07...82`
## • `2025.08` -> `2025.08...83`
## • `2025.08` -> `2025.08...84`
## • `2025.08` -> `2025.08...85`
## • `2025.08` -> `2025.08...86`
## • `2025.08` -> `2025.08...87`
## • `2025.08` -> `2025.08...88`
## • `2025.08` -> `2025.08...89`
## • `2025.08` -> `2025.08...90`
## • `2025.09` -> `2025.09...91`
## • `2025.09` -> `2025.09...92`
## • `2025.09` -> `2025.09...93`
## • `2025.09` -> `2025.09...94`
## • `2025.09` -> `2025.09...95`
## • `2025.09` -> `2025.09...96`
## • `2025.09` -> `2025.09...97`
## • `2025.09` -> `2025.09...98`
## • `2025.10` -> `2025.10...99`
## • `2025.10` -> `2025.10...100`
## • `2025.10` -> `2025.10...101`
## • `2025.10` -> `2025.10...102`
## • `2025.10` -> `2025.10...103`
## • `2025.10` -> `2025.10...104`
## • `2025.10` -> `2025.10...105`
## • `2025.10` -> `2025.10...106`
head(youth_raw)
## # A tibble: 6 × 106
##   성별  연령계층별 `2024.10...3`       `2024.10...4` `2024.10...5` `2024.10...6`
##   <chr> <chr>      <chr>               <chr>         <chr>         <chr>        
## 1 성별  연령계층별 15세이상인구 (천명) 경제활동인구 (천명)…… 취업자 (천명) 실업자 (천명)
## 2 계    계         45607               29525         28847         678          
## 3 계    15 - 29세  8078                3900          3685          215          
## 4 계    15 - 19세  2230                143           136           7            
## 5 계    20 - 29세  5848                3757          3548          209          
## 6 계    30 - 39세  6816                5618          5489          129          
## # ℹ 100 more variables: `2024.10...7` <chr>, `2024.10...8` <chr>,
## #   `2024.10...9` <chr>, `2024.10...10` <chr>, `2024.11...11` <chr>,
## #   `2024.11...12` <chr>, `2024.11...13` <chr>, `2024.11...14` <chr>,
## #   `2024.11...15` <chr>, `2024.11...16` <chr>, `2024.11...17` <chr>,
## #   `2024.11...18` <chr>, `2024.12...19` <chr>, `2024.12...20` <chr>,
## #   `2024.12...21` <chr>, `2024.12...22` <chr>, `2024.12...23` <chr>,
## #   `2024.12...24` <chr>, `2024.12...25` <chr>, `2024.12...26` <chr>, …

3 Data Description and Descriptive Statistics

3.1 Main Variables

From the original KOSIS table, we construct a tidy dataset with the following variables:

  • time_code: Original KOSIS time code (e.g., “2024.10”).
  • time: Converted date variable (first day of each month).
  • age_group: Age category; for our main analysis we use “Age 15–29”.
  • sex: Total, Male, Female (we focus on “Total”).
  • indicator: One of three labor market indicators:
    • Employment rate(%)
    • Unemployment rate(%)
    • Labor force participation rate(%)
  • value: Numeric Value of the indicator

In the code below, we reshape the raw table into a tidy data frame and create English labels for the key indicators and categories.

# 1. extract indicator labels from first row and reshape
header_long <- youth_raw %>%
  slice(1) %>%
  pivot_longer(
    cols = -c(성별, 연령계층별),
    names_to = "time_code",
    values_to = "indicator_label"
  )

# 2. reshape numeric data rows
data_long <- youth_raw %>%
  slice(-1) %>%
  pivot_longer(
    cols = -c(성별, 연령계층별),
    names_to = "time_code",
    values_to = "value"
  )

# 3. create tidy dataset with English labels
youth_tidy <- data_long %>%
  fill(성별, .direction = "down") %>% 
  left_join(header_long %>% select(time_code, indicator_label),
            by = "time_code") %>%
  mutate(
    value = as.numeric(gsub(",", "", value)),
    indicator = case_when(
      indicator_label == "고용률 (%)"             ~ "Employment rate",
      indicator_label == "실업률 (%)"             ~ "Unemployment rate",
      indicator_label == "경제활동참가율 (%)"     ~ "Labor force participation rate",
      TRUE                                       ~ NA_character_
    ),
    sex = case_when(
      성별 == "계"   ~ "Total",
      성별 == "남자" ~ "Male",
      성별 == "여자" ~ "Female",
      TRUE          ~ as.character(성별)
    ),
    age_group = case_when(
      연령계층별 == "15 - 29세" ~ "Age 15–29",
      TRUE                      ~ as.character(연령계층별)
    )
  ) %>%
  filter(!is.na(indicator))

# 4. keep youth age 15–29 and total sex
youth_15_29_total <- youth_tidy %>%
  filter(age_group == "Age 15–29", sex == "Total")

# 5. create date variable
youth_15_29_total_time <- youth_15_29_total %>%
  mutate(
    year  = substr(time_code, 1, 4),
    month = substr(time_code, 6, 7),
    time  = as.Date(paste(year, month, "01", sep = "-"))
  ) %>%
  arrange(time)

# 6. summary statistics for key indicators
youth_summary <- youth_15_29_total_time %>%
  group_by(indicator) %>%
  summarise(
    mean   = mean(value, na.rm = TRUE),
    sd     = sd(value, na.rm = TRUE),
    min    = min(value, na.rm = TRUE),
    max    = max(value, na.rm = TRUE),
    .groups = "drop"
  )

youth_summary
## # A tibble: 3 × 5
##   indicator                       mean    sd   min   max
##   <chr>                          <dbl> <dbl> <dbl> <dbl>
## 1 Employment rate                45.2  0.566  44.3  46.2
## 2 Labor force participation rate 48.0  0.687  47.1  49.5
## 3 Unemployment rate               5.99 0.876   4.8   7.5

##3.2 Distribution of Youth Labor Market Indicators (Age 15–29, Total)

To obtain a first impression of the recent labor market conditions for youths aged 15–29, we look at the distributions of the employment rate, unemployment rate, and labor force participation rate across the one-year period.

ggplot(youth_15_29_total_time, aes(x = value)) +
geom_histogram(bins = 10) +
geom_density(linewidth = 1) +
facet_wrap(~ indicator, scales = "free") +
labs(
title = "Distribution of youth labor market indicators (Age 15–29, Total)",
x = "Value (%)",
y = "Density"
)

These descriptive results provide a baseline overview of how high or low the three indicators tend to be for youths aged 15–29 and how much they fluctuate from month to month during the period from October 2024 to October 2025.

#4. Results and Visualizations

In this section, we present visualizations to address our research questions. All figures focus exclusively on Age 15–29, Total.

4.2 Comparison of youth age groups and sex (bar chart)

Although our main focus is youths aged 15–29 in total, it is still useful to briefly compare different youth-related age groups and sex in the most recent month of the dataset.
The bar chart below shows employment, unemployment, and labor force participation rates for several youth age bands (15–19, 15–24, 15–29, 20–29) by sex.

# 1. Select youth-related age groups available in the raw data

target_age_raw <- c("15 - 19세", "15 - 24세", "15 - 29세", "20 - 29세")

age_sex_data <- youth_tidy %>%

# Keep only the age groups we want to compare

filter(연령계층별 %in% target_age_raw,
sex %in% c("Male", "Female")) %>%   # Compare males and females
mutate(
# Create readable English labels for age groups
age_group_en = case_when(
연령계층별 == "15 - 19세" ~ "Age 15–19",
연령계층별 == "15 - 24세" ~ "Age 15–24",
연령계층별 == "15 - 29세" ~ "Age 15–29",
연령계층별 == "20 - 29세" ~ "Age 20–29",
TRUE ~ as.character(연령계층별)
),
# Convert time_code (e.g., "2024.10") to a Date object (e.g., 2024-10-01)
year  = substr(time_code, 1, 4),
month = substr(time_code, 6, 7),
time  = as.Date(paste(year, month, "01", sep = "-"))
)

# 2. Find the most recent month in the dataset

latest_time <- max(age_sex_data$time, na.rm = TRUE)

# 3. Compute one value per indicator × age group × sex for the latest month

latest_summary <- age_sex_data %>%
filter(time == latest_time) %>%
group_by(indicator, age_group_en, sex) %>%
summarise(
value = mean(value, na.rm = TRUE),
.groups = "drop"
)

# 4. Draw a bar chart showing youth indicators by age group and sex

ggplot(latest_summary,
aes(x = age_group_en, y = value, fill = sex)) +
geom_col(position = "dodge") +
facet_wrap(~ indicator, scales = "free_y") +
labs(
title = "Youth labor market indicators by age group and sex (latest month)",
x = "Age group",
y = "Value (%)",
fill = "Sex"
) +
theme_minimal() +
theme(
axis.text.x = element_text(angle = 45, hjust = 1)
)

In the latest month, older youths (20–29) generally show higher employment and labor force participation rates than teenagers (15–19), while the unemployment rate differences between males and females are relatively small for most age groups.

##4.3 Relationships Among Indicators (Age 15–29, Total)

To explore how the three indicators relate to each other over time within the 15–29 age group, we construct scatterplots where each point represents a specific month. We also label each point with a simple time code (e.g., “24-10”) to show the temporal order.

library(dplyr)
library(tidyr)
library(ggplot2)
library(ggrepel)

# 1. Choose age groups to compare (use the labels that actually exist in `age_group`)
target_age_groups <- c("15 - 19세", "Age 15–29", "20 - 29세")

# 2. Build wide-format data: one row per age_group × sex × month
scatter_data <- youth_tidy %>%
  mutate(
    # Create a simple label for each month (e.g., "24-10")
    year       = substr(time_code, 1, 4),
    month      = substr(time_code, 6, 7),
    time_label = paste0(substr(year, 3, 4), "-", month)
  ) %>%
  filter(age_group %in% target_age_groups) %>%
  select(age_group, sex, time_label, indicator, value) %>%
  pivot_wider(
    names_from  = indicator,
    values_from = value
  )

# 3-1. Employment rate vs Unemployment rate
p_emp_unemp <- ggplot(
  scatter_data,
  aes(
    x     = `Employment rate`,
    y     = `Unemployment rate`,
    color = age_group,
    label = time_label
  )
) +
  geom_point(na.rm = TRUE) +
  geom_text_repel(size = 3, max.overlaps = 20, na.rm = TRUE) +
  facet_wrap(~ sex) +
  labs(
    title = "Employment vs Unemployment rates by age group and sex",
    x     = "Employment rate (%)",
    y     = "Unemployment rate (%)",
    color = "Age group"
  ) +
  theme_minimal()

# 3-2. Labor force participation vs Unemployment rate
p_act_unemp <- ggplot(
  scatter_data,
  aes(
    x     = `Labor force participation rate`,
    y     = `Unemployment rate`,
    color = age_group,
    label = time_label
  )
) +
  geom_point(na.rm = TRUE) +
  geom_text_repel(size = 3, max.overlaps = 20, na.rm = TRUE) +
  facet_wrap(~ sex) +
  labs(
    title = "Labor force participation vs Unemployment rates by age group and sex",
    x     = "Labor force participation rate (%)",
    y     = "Unemployment rate (%)",
    color = "Age group"
  ) +
  theme_minimal()

# 3-3. Labor force participation vs Employment rate
p_act_emp <- ggplot(
  scatter_data,
  aes(
    x     = `Labor force participation rate`,
    y     = `Employment rate`,
    color = age_group,
    label = time_label
  )
) +
  geom_point(na.rm = TRUE) +
  geom_text_repel(size = 3, max.overlaps = 20, na.rm = TRUE) +
  facet_wrap(~ sex) +
  labs(
    title = "Labor force participation vs Employment rates by age group and sex",
    x     = "Labor force participation rate (%)",
    y     = "Employment rate (%)",
    color = "Age group"
  ) +
  theme_minimal()

# 4. Print all three plots
p_emp_unemp

p_act_unemp

p_act_emp

These scatterplots help us see whether higher labor force participation is associated with higher employment for youths aged 15–29, and how unemployment behaves relative to employment over time.

###4.4 Turning Points in Youth Employment and Unemployment

Finally, we look for months with particularly large changes in the employment and unemployment rates for youths aged 15–29. These months can be considered short-term “turning points” in the recent youth labor market.

# keep recent period explicitly (already just 2024-10 to 2025-10, but filter for clarity)

youth_15_29_recent <- youth_15_29_total_time %>%
filter(time >= as.Date("2024-10-01"),
time <= as.Date("2025-10-01"))

# Helper: compute month-to-month changes and select turning points

get_turning_points <- function(df, indicator_name, n_points = 1) {
series <- df %>%
filter(indicator == indicator_name) %>%
arrange(time) %>%
mutate(
change = value - dplyr::lag(value)
)

top_inc <- series %>%
slice_max(change, n = n_points, with_ties = FALSE)

top_dec <- series %>%
slice_min(change, n = n_points, with_ties = FALSE)

list(series = series,
turning = bind_rows(top_inc, top_dec))
}

# Employment rate turning points

emp_list    <- get_turning_points(youth_15_29_recent, "Employment rate", n_points = 1)
emp_series  <- emp_list$series
emp_turning <- emp_list$turning

p_emp_turn <- ggplot(emp_series,
aes(x = time, y = value)) +
geom_line(linewidth = 1) +
geom_point() +
geom_point(data = emp_turning,
aes(x = time, y = value),
color = "blue",
size  = 3) +
geom_text(
data = emp_turning,
aes(label = paste0(format(time, "%Y-%m"),
"\nΔ=", round(change, 1))),
vjust = -1,
size  = 3
) +
scale_x_date(date_breaks = "1 month", date_labels = "%y-%m") +
labs(
title = "Employment rate (Age 15–29, Total) with largest monthly changes",
x     = "Month",
y     = "Employment rate (%)"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Unemployment rate turning points

unemp_list    <- get_turning_points(youth_15_29_recent, "Unemployment rate", n_points = 1)
unemp_series  <- unemp_list$series
unemp_turning <- unemp_list$turning

p_unemp_turn <- ggplot(unemp_series,
aes(x = time, y = value)) +
geom_line(linewidth = 1) +
geom_point() +
geom_point(data = unemp_turning,
aes(x = time, y = value),
color = "red",
size  = 3) +
geom_text(
data = unemp_turning,
aes(label = paste0(format(time, "%Y-%m"),
"\nΔ=", round(change, 1))),
vjust = -1,
size  = 3
) +
scale_x_date(date_breaks = "1 month", date_labels = "%y-%m") +
labs(
title = "Unemployment rate (Age 15–29, Total) with largest monthly changes",
x     = "Month",
y     = "Unemployment rate (%)"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))

p_emp_turn

p_unemp_turn

These annotated line plots highlight the months with the largest month-to-month increases and decreases in the youth employment and unemployment rates. They help identify specific points in time where the youth labor market changed more sharply than usual within this one-year window.

Possible explanations for the February and May turning points.
Our dataset alone does not allow us to identify causal mechanisms, but we can cautiously interpret the largest month-to-month changes by referring to official employment statistics and typical seasonal patterns in the Korean labor market.

According to Statistics Korea’s “Employment Trend, February 2025,” the unemployment rate for youths aged 15–29 rose to around 7%, while the overall unemployment rate for the total population stayed roughly flat at about 3%. In the official commentary, this spike in youth unemployment was linked to continued weakness in some sectors such as manufacturing, construction, wholesale/retail trade, and accommodation and food services, as well as an increase in young people who temporarily left the labor force or reported that they were “resting.” Combined with the winter off-season—when many part-time and service jobs disappear—this helps explain why our graph shows a sharp jump in the 15–29 unemployment rate between January and February 2025.

By contrast, government summaries of the “Employment Trend, May 2025” describe an overall improvement in labor market conditions. The aggregate unemployment rate fell to the high-2% range, youth unemployment for ages 15–29 moved back down to the mid-6% range, and the employment rate for ages 15–64 increased compared with the previous year. Employment growth was concentrated in service and office-type industries such as health and social welfare, professional and scientific services, and finance and insurance. This pattern is consistent with our data, which show a noticeable drop in the youth unemployment rate and a peak in the employment rate around May 2025. In other words, the February spike appears to capture a period of accumulated weakness in youth jobs, while the May turning point reflects a short-term recovery as more young people were absorbed into expanding sectors.

Overall, these interpretations are plausible given the one-year aggregate data that we analyze. However, month-to-month fluctuations in youth unemployment can also be influenced by additional factors that are not visible in our dataset, such as policy changes (for example, new youth employment support programs), global economic conditions, or the ongoing restructuring of the labor market in the post-COVID period. A more in-depth explanation of the February and May turning points would therefore require combining our descriptive results with external reports or academic research on these broader contextual changes.

5. Conclusion

This project examined recent monthly trends in youth labor market indicators in South Korea using official KOSIS statistics from October 2024 to October 2025. We focused on young people aged 15–29 and described the behavior of three core indicators—employment, unemployment, and labor force participation—using descriptive statistics and several visualizations.

First, the distribution and time-series plots showed that all three indicators stayed within a relatively narrow, “moderate” range, but with clear month-to-month movements. The unemployment rate in particular rose from late 2024 to a peak in early 2025 and then declined again toward the summer, while employment and labor force participation moved in the opposite direction. This pattern suggests that the youth labor market is not in a state of crisis, but is quite sensitive to short-term shocks and seasonal conditions.

Second, a brief comparison of different youth age groups in the latest month highlighted a structural gap inside the broad 15–29 category. Teenagers aged 15–19 show much lower employment and labor force participation rates than young adults in their twenties, whereas the gender differences within each age group are relatively small. In other words, “youth” is not a homogeneous group: very young people face higher entry barriers than those in their mid-20s, who are already more strongly attached to the labor market.

Third, the turning-point analysis for the 15–29 age group identified a “February shock” and a “May recovery” in the unemployment rate, together with a noticeable recovery of the employment rate in spring. These short-term jumps and drops are consistent with typical seasonal mechanisms such as graduation, the timing of recruitment, and the adjustment of temporary or part-time jobs. Our interpretation is that many young people enter or leave the labor force around these months, creating visible volatility in the indicators even when the overall level of youth employment does not change dramatically.

From a policy perspective, these findings point to the need for a two-track approach. For early youths (15–19), policy should focus on lowering entry barriers through vocational training, career guidance, and school-to-work transition programs. For young adults (20–29), it is more important to stabilize short-term fluctuations—for example, by smoothing the “graduation cliff” around February and expanding stable, entry-level positions so that temporary spikes in unemployment do not turn into long-term scarring.

Overall, the patterns we describe are plausible given the aggregate KOSIS data, but they are still based on a relatively short one-year window and do not control for other important factors such as policy changes, broader macroeconomic conditions, or differences by education, region, or industry. A more detailed analysis would require additional data and methods. Nevertheless, this project provides a clear, data-driven snapshot of how Korean youths aged 15–29 are currently positioned in the labor market, and it offers a useful starting point for future discussions about youth employment policy and support measures.

#6 Team Roles

YooShin Kwon: Responsible for downloading and cleaning the KOSIS data in R, producing descriptive statistics and visualizations for youths aged 15–29, co-developing the R code for the analysis, reviewing the interpretation of the graphs, and organizing the R Markdown file for the project.

Jonghae Kim: Responsible for refining the research questions and motivation, co-developing and checking the R code for consistency, reviewing the interpretation of the graphs, and editing the R Markdown file prior to submission.