Labor Force Statistics including the National Unemployment Rate - LN

Data - BLS

ln.activity

Code
ln.data.1.AllData |>
  left_join(ln.series, by = "series_id") |>
  left_join(ln.activity, by = "activity_code") |>
  group_by(activity_code, activity_text) |>
  summarise(Nobs = n()) |>
  print_table_conditional()
activity_code activity_text Nobs
0 N/A 8727123
3 Enrolled in School 164317
4 Enrolled in High School 32808
5 Enrolled in College 32871
6 Enrolled in College Full-time 32832
7 Enrolled in College Part-time 32496
8 Not Enrolled 309661

ln.ages

Code
ln.data.1.AllData |>
  left_join(ln.series, by = "series_id") |>
  left_join(ln.ages, by = "ages_code") |>
  group_by(ages_code, ages_text) |>
  summarise(Nobs = n()) |>
  print_table_conditional()

ln.born

Code
ln.data.1.AllData |>
  left_join(ln.series, by = "series_id") |>
  left_join(ln.born, by = "born_code") |>
  group_by(born_code, born_text) |>
  summarise(Nobs = n()) |>
  print_table_conditional()
born_code born_text Nobs
0 N/A 9247986
1 Native born 42061
2 Foreign born 42061

ln.class

Code
ln.data.1.AllData |>
  left_join(ln.series, by = "series_id") |>
  left_join(ln.class, by = "class_code") |>
  group_by(class_code, class_text) |>
  summarise(Nobs = n()) |>
  print_table_conditional()
class_code class_text Nobs
0 N/A 8522986
1 Wage and salary workers 231767
2 Private wage and salary workers 252949
3 Government wage and salary workers 81247
4 Federal wage and salary workers 6608
5 State wage and salary workers 5202
6 Local wage and salary workers 5202
8 Self-employed workers, unincorporated 110761
9 Unpaid family workers 87560
11 Nonagriculture government, self employed, and unpaid family worker (3, 8, and 9 above) 3443
12 Self-employed unincorporated, and unpaid family workers (8 and 9) 4233
14 Incorporated self-employed 3707
16 Wage and salary workers, excluding incorporated self employed 8057
17 Private wage and salary workers, excluding incorporated self employed 6041
20 Self-employed workers (both incorporated and unincorporated) 2345

ln.duration

Code
ln.data.1.AllData |>
  left_join(ln.series, by = "series_id") |>
  left_join(ln.duration, by = "duration_code") |>
  group_by(duration_code, duration_text) |>
  summarise(Nobs = n()) |>
  print_table_conditional()
duration_code duration_text Nobs
0 N/A 8816317
6 Less than 5 weeks 103356
18 15 weeks and over 104464
31 27 weeks and over 78976
58 52 weeks and over 29308
105 99 weeks and over 7276
106 5 to 10 weeks 2996
107 5 to 14 weeks 78690
108 11 to 14 weeks 2980
109 15 to 26 weeks 78525
110 27 to 51 weeks 29220

ln.education

Code
ln.data.1.AllData |>
  left_join(ln.series, by = "series_id") |>
  left_join(ln.education, by = "education_code") |>
  group_by(education_code, education_text) |>
  summarise(Nobs = n()) |>
  print_table_conditional()
education_code education_text Nobs
0 All educational levels 8930373
11 Less than a High School diploma 71392
19 High School graduates, no college 71420
20 Some college or associate degree 70688
21 Some college, no degree 25627
25 Associate degree 25625
40 Bachelor's degree and higher 83893
41 Bachelor's degree only 25333
45 Advanced degree 27253
46 Master's degree 168
47 Professional degree 168
48 Doctoral degree 168

ln.lfst

Code
ln.data.1.AllData |>
  left_join(ln.series, by = "series_id") |>
  left_join(ln.lfst, by = "lfst_code") |>
  group_by(lfst_code, lfst_text) |>
  summarise(Nobs = n()) |>
  print_table_conditional()

ln.hour

Code
ln.data.1.AllData |>
  left_join(ln.series, by = "series_id") |>
  left_join(ln.hour, by = "hour_code") |>
  group_by(hour_code, hour_text) |>
  summarise(Nobs = n()) |>
  print_table_conditional()
hour_code hour_text Nobs
0 N/A 8938078
1 1 to 34 hours 220508
2 1 to 4 hours 8055
6 5 to 14 hours 8055
10 15 to 29 hours 7306
14 30 to 34 hours 8804
16 35 hours and over 99707
17 35 to 39 hours 7306
20 40 hours 7306
21 41 hours and over 5065
23 41 to 48 hours 7306
27 49 to 59 hours 7306
29 60 hours and over 7306

ln.indy

Code
ln.data.1.AllData |>
  left_join(ln.series, by = "series_id") |>
  left_join(ln.indy, by = "indy_code") |>
  group_by(indy_code, indy_text) |>
  summarise(Nobs = n()) |>
  print_table_conditional()

ln.occupation

Code
ln.data.1.AllData |>
  left_join(ln.series, by = "series_id") |>
  left_join(ln.occupation, by = "occupation_code") |>
  group_by(occupation_code, occupation_text) |>
  summarise(Nobs = n()) |>
  print_table_conditional()

ln.orig

Code
ln.data.1.AllData |>
  left_join(ln.series, by = "series_id") |>
  left_join(ln.orig, by = "orig_code") |>
  group_by(orig_code, orig_text) |>
  summarise(Nobs = n()) |>
  print_table_conditional()
orig_code orig_text Nobs
0 All Origins 8304029
1 Hispanic or Latino 830616
2 Mexican 44070
6 Puerto Rican 42911
7 Cuban 42388
10 Non-Hispanic 33150
15 Central or South American 5184
20 Central American 5184
21 Salvadoran 1920
25 Other Central American (excludes Salvadoran) 5184
30 South American 5184
40 Other Hispanic or Latino 5184
41 Dominican 1920
45 Other Hispanic or Latino (excludes Dominican) 5184

ln.race

Code
ln.data.1.AllData |>
  left_join(ln.series, by = "series_id") |>
  left_join(ln.race, by = "race_code") |>
  group_by(race_code, race_text) |>
  summarise(Nobs = n()) |>
  print_table_conditional()
race_code race_text Nobs
0 All Races 6246077
1 White 1361310
3 Black or African American 1112336
4 Asian 588237
5 American Indian or Alaska Native 4018
6 Native Hawaiian or Other Pacific Islander 3610
7 Two or more races 3472
10 Asian - Asian Indian 1864
15 Asian - Chinese 1864
25 Asian - Filipino 1864
26 Asian - Japanese 1864
27 Asian - Korean 1864
28 Asian - Vietnamese 1864
30 Asian - Other Asian 1864

ln.seasonal

Code
ln.data.1.AllData |>
  left_join(ln.series, by = "series_id") |>
  rename(seasonal_code = seasonal) |>
  left_join(ln.seasonal, by = "seasonal_code") |>
  group_by(seasonal_code, seasonal_text) |>
  summarise(Nobs = n()) |>
  print_table_conditional()
seasonal_code seasonal_text Nobs
S Seasonally Adjusted 601281
U Not Seasonally Adjusted 8730827

ln.sexs

Code
ln.data.1.AllData |>
  left_join(ln.series, by = "series_id") |>
  left_join(ln.sexs, by = "sexs_code") |>
  group_by(sexs_code, sexs_text) |>
  summarise(Nobs = n()) |>
  print_table_conditional()
sexs_code sexs_text Nobs
0 Both Sexes 4398421
1 Men 2480884
2 Women 2452803

ln.vets

Code
ln.data.1.AllData |>
  left_join(ln.series, by = "series_id") |>
  left_join(ln.vets, by = "vets_code") |>
  group_by(vets_code, vets_text) |>
  summarise(Nobs = n()) |>
  print_table_conditional()
vets_code vets_text Nobs
0 N/A 8725472
1 Veteran 158648
3 Vietnam era and earlier wartime periods 43754
9 Gulf War Era 70875
12 Veterans who served in Gulf War Era 2 (whether or not they served in Era 1) 64509
13 Veterans who served in Gulf War Era 1 but not Gulf War Era 2 57013
16 Other Service Periods (may include peacetime) 53620
25 Nonveteran 158217

Longest Series

Code
ln.series |>
  arrange(begin_year) |>
  head(100) |>
  select(series_id, series_title, begin_year, end_year) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F) else .}

Employment / Population Ratio

All Series - lfst_code = 23

Code
ln.data.1.AllData |>
  left_join(ln.series, by = "series_id") |>
  filter(lfst_code == 23) |>
  group_by(series_id, series_title) |>
  summarise(Nobs = n()) |>
  print_table_conditional()

Men, Women, All

All

Code
ln.data.1.AllData |>
  left_join(ln.series, by = "series_id") |>
  #filter(series_id %in% c("LNS12300001", "LNS12300000", "LNS12300002")) %>%
  left_join(ln.sexs, by = "sexs_code") |>
  filter(lfst_code == 23,
         orig_code == 0,
         born_code == 0,
         mari_code == 0,
         race_code == 0,
         seasonal == "S",
         ages_code == 0,
         activity_code == 0,
         duration_code == 0) |>
  month_to_date() |>
  mutate(value = as.numeric(value)) |>
  ggplot() + theme_minimal() + xlab("") + 
  ylab("Employment / Population Ratio") +
  geom_line(aes(x = date, y = value/100, color = sexs_text)) +
  geom_rect(data = nber_recessions |>
              filter(Trough >= as.Date("1947-01-01")), 
            aes(xmin = Peak, xmax = Trough, ymin = -Inf, ymax = +Inf), 
            fill = 'grey', alpha = 0.5) +
  scale_x_date(breaks = seq(1910, 2100, 5) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*c(seq(0, 100, 10), seq(100, 500, 50)),
                     labels = percent_format(accuracy = 1, prefix = "")) +
  scale_color_manual(values = c("black", "darkblue", "purple")) +
  theme(legend.position = c(0.8, 0.2),
        legend.title = element_blank())

1980-

Code
ln.data.1.AllData |>
  left_join(ln.series, by = "series_id") |>
  #filter(series_id %in% c("LNS12300001", "LNS12300000", "LNS12300002")) %>%
  left_join(ln.sexs, by = "sexs_code") |>
  filter(lfst_code == 23,
         orig_code == 0,
         born_code == 0,
         mari_code == 0,
         race_code == 0,
         seasonal == "S",
         ages_code == 0,
         activity_code == 0,
         duration_code == 0) |>
  month_to_date() |>
  arrange(desc(date)) |>
  filter(date >= as.Date("1980-01-01")) |>
  mutate(value = as.numeric(value)) |>
  ggplot() + theme_minimal() + xlab("") + 
  ylab("Employment / Population Ratio") +
  geom_line(aes(x = date, y = value/100, color = sexs_text)) +
  geom_rect(data = nber_recessions |>
              filter(Trough >= as.Date("1980-01-01")), 
            aes(xmin = Peak, xmax = Trough, ymin = -Inf, ymax = +Inf), 
            fill = 'grey', alpha = 0.5) +
  scale_x_date(breaks = seq(1910, 2100, 5) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*c(seq(0, 100, 5), seq(100, 500, 50)),
                     labels = percent_format(accuracy = 1, prefix = "")) +
  scale_color_manual(values = c("black", "darkblue", "purple")) +
  theme(legend.position = c(0.8, 0.2),
        legend.title = element_blank())

Veterans, Non Veterans

Code
ln.series |>
  filter(lfst_code == 23,
         sexs_code == 1,
         race_code == 0,
         seasonal == "U",
         ages_code == 28,
         orig_code == 0,
         born_code == 0,
         education_code == 0,
         periodicity_code == "M") |>
  left_join(ln.data.1.AllData, by = "series_id") |>
  #filter(series_id %in% c("LNS12300001", "LNS12300049", "LNS12300061")) %>%
  left_join(ln.vets, by = "vets_code") |>
  month_to_date() |>
  mutate(value = as.numeric(value)) |>
  ggplot() + theme_minimal() + xlab("") + ylab("Men Employment / Population Ratio") +
  geom_line(aes(x = date, y = value/100, color = vets_text)) +
  geom_rect(data = nber_recessions |>
              filter(Trough >= as.Date("1947-01-01")), 
            aes(xmin = Peak, xmax = Trough, ymin = -Inf, ymax = +Inf), 
            fill = 'grey', alpha = 0.5) +
  
  theme(legend.position = c(0.2, 0.2),
        legend.title = element_blank()) +
  scale_x_date(breaks = seq(1910, 2100, 5) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*c(seq(0, 100, 5), seq(100, 500, 50)),
                     labels = percent_format(accuracy = 1, prefix = ""))

By age, Men

Seasonal

All

Code
ln.series |>
  filter(lfst_code == 23,
         sexs_code == 1,
         race_code == 0,
         mari_code == 0,
         seasonal == "S",
         ages_code %in% c(0, 28, 33, 22),
         periodicity_code == "M") |>
  left_join(ln.data.1.AllData, by = "series_id") |>
  #filter(series_id %in% c("LNS12300001", "LNS12300049", "LNS12300061")) %>%
  left_join(ln.ages, by = "ages_code") |>
  month_to_date() |>
  mutate(value = as.numeric(value)) |>
  ggplot() + theme_minimal() + xlab("") + ylab("Men Employment / Population Ratio") +
  geom_line(aes(x = date, y = value/100, color = ages_text)) +
  geom_rect(data = nber_recessions |>
              filter(Trough >= as.Date("1947-01-01")), 
            aes(xmin = Peak, xmax = Trough, ymin = -Inf, ymax = +Inf), 
            fill = 'grey', alpha = 0.5) +
  theme(legend.position = c(0.2, 0.2),
        legend.title = element_blank()) +
  scale_x_date(breaks = seq(1910, 2100, 5) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*c(seq(0, 100, 5), seq(100, 500, 50)),
                     labels = percent_format(accuracy = 1, prefix = ""))

1980-

Code
ln.series |>
  filter(lfst_code == 23,
         sexs_code == 1,
         race_code == 0,
         mari_code == 0,
         seasonal == "S",
         ages_code %in% c(0, 28, 33, 22),
         periodicity_code == "M") |>
  left_join(ln.data.1.AllData, by = "series_id") |>
  #filter(series_id %in% c("LNS12300001", "LNS12300049", "LNS12300061")) %>%
  left_join(ln.ages, by = "ages_code") |>
  month_to_date() |>
  filter(date >= as.Date("1980-01-01")) |>
  mutate(value = as.numeric(value)) |>
  ggplot() + theme_minimal() + xlab("") + ylab("Men Employment / Population Ratio") +
  geom_line(aes(x = date, y = value/100, color = ages_text)) +
  geom_rect(data = nber_recessions |>
              filter(Trough >= as.Date("1980-01-01")), 
            aes(xmin = Peak, xmax = Trough, ymin = -Inf, ymax = +Inf), 
            fill = 'grey', alpha = 0.5) +
  theme(legend.position = c(0.2, 0.2),
        legend.title = element_blank()) +
  scale_x_date(breaks = seq(1910, 2100, 5) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*c(seq(0, 100, 5), seq(100, 500, 50)),
                     labels = percent_format(accuracy = 1, prefix = ""))

Seasonal

Code
ln.series |>
  filter(lfst_code == 23,
         sexs_code == 1,
         race_code == 0,
         seasonal == "S",
         ages_code %in% c(33),
         periodicity_code == "M") |>
  left_join(ln.data.1.AllData, by = "series_id") |>
  #filter(series_id %in% c("LNS12300001", "LNS12300049", "LNS12300061")) %>%
  left_join(ln.ages, by = "ages_code") |>
  month_to_date() |>
  mutate(value = as.numeric(value)) |>
  ggplot() + theme_minimal() + xlab("") + ylab("25-54 Men Employment / Population Ratio") +
  geom_line(aes(x = date, y = value/100)) +
  geom_rect(data = nber_recessions |>
              filter(Trough >= as.Date("1947-01-01")), 
            aes(xmin = Peak, xmax = Trough, ymin = -Inf, ymax = +Inf), 
            fill = 'grey', alpha = 0.5) +
  theme(legend.position = c(0.2, 0.2),
        legend.title = element_blank()) +
  scale_x_date(breaks = seq(1910, 2100, 5) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*c(seq(0, 100, 5), seq(100, 500, 50)),
                     labels = percent_format(accuracy = 1, prefix = ""))

Unseasonal

Code
ln.series |>
  filter(lfst_code == 23,
         sexs_code == 1,
         race_code == 0,
         seasonal == "U",
         ages_code %in% c(0, 28, 33),
         orig_code == 0,
         mari_code == 0,
         born_code == 0,
         vets_code == 0,
         education_code == 0,
         periodicity_code == "M") |>
  left_join(ln.data.1.AllData, by = "series_id") |>
  #filter(series_id %in% c("LNS12300001", "LNS12300049", "LNS12300061")) %>%
  left_join(ln.ages, by = "ages_code") |>
  month_to_date() |>
  arrange(desc(date)) |>
  mutate(value = as.numeric(value)) |>
  ggplot() + theme_minimal() + xlab("") + ylab("Men Employment / Population Ratio") +
  geom_line(aes(x = date, y = value/100, color = ages_text)) +
  geom_rect(data = nber_recessions |>
              filter(Trough >= as.Date("1947-01-01")), 
            aes(xmin = Peak, xmax = Trough, ymin = -Inf, ymax = +Inf), 
            fill = 'grey', alpha = 0.5) +
  theme(legend.position = c(0.2, 0.2),
        legend.title = element_blank()) +
  scale_x_date(breaks = seq(1910, 2100, 5) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*c(seq(0, 100, 5), seq(100, 500, 50)),
                     labels = percent_format(accuracy = 1, prefix = ""))

Men, Women

1994-

Code
ln.series |>
  filter(lfst_code == 23,
         race_code == 0,
         seasonal == "S",
         ages_code %in% c(33),
         periodicity_code == "M") |>
  left_join(ln.data.1.AllData, by = "series_id") |>
  #filter(series_id %in% c("LNS12300001", "LNS12300049", "LNS12300061")) %>%
  left_join(ln.sexs, by = "sexs_code") |>
  month_to_date() |>
  filter(date >= as.Date("1994-01-01")) |>
  mutate(value = as.numeric(value)) |>
  ggplot() + theme_minimal() + xlab("") + ylab("25-54 Men Employment / Population Ratio") +
  geom_line(aes(x = date, y = value/100, color = sexs_text)) +
  geom_rect(data = nber_recessions |>
              filter(Trough >= as.Date("1994-01-01")), 
            aes(xmin = Peak, xmax = Trough, ymin = -Inf, ymax = +Inf), 
            fill = 'grey', alpha = 0.5) +
  scale_color_manual(values = c("black", "darkblue", "purple")) +
  theme(legend.position = c(0.8, 0.2),
        legend.title = element_blank()) +
  scale_x_date(breaks = seq(1910, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*c(seq(0, 100, 5), seq(100, 500, 50)),
                     labels = percent_format(accuracy = 1, prefix = ""))

All

Code
ln.series |>
  filter(lfst_code == 23,
         race_code == 0,
         seasonal == "S",
         ages_code %in% c(33),
         periodicity_code == "M") |>
  left_join(ln.data.1.AllData, by = "series_id") |>
  #filter(series_id %in% c("LNS12300001", "LNS12300049", "LNS12300061")) %>%
  left_join(ln.sexs, by = "sexs_code") |>
  month_to_date() |>
  mutate(value = as.numeric(value)) |>
  ggplot() + theme_minimal() + xlab("") + ylab("25-54 Men Employment / Population Ratio") +
  geom_line(aes(x = date, y = value/100, color = sexs_text)) +
  geom_rect(data = nber_recessions |>
              filter(Trough >= as.Date("1947-01-01")), 
            aes(xmin = Peak, xmax = Trough, ymin = -Inf, ymax = +Inf), 
            fill = 'grey', alpha = 0.5) +
  scale_color_manual(values = c("black", "darkblue", "purple")) +
  theme(legend.position = c(0.8, 0.2),
        legend.title = element_blank()) +
  scale_x_date(breaks = seq(1910, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*c(seq(0, 100, 5), seq(100, 500, 50)),
                     labels = percent_format(accuracy = 1, prefix = ""))

2009-

Code
ln.series |>
  filter(lfst_code == 23,
         race_code == 0,
         seasonal == "S",
         ages_code %in% c(33),
         periodicity_code == "M") |>
  left_join(ln.data.1.AllData, by = "series_id") |>
  #filter(series_id %in% c("LNS12300001", "LNS12300049", "LNS12300061")) %>%
  left_join(ln.sexs, by = "sexs_code") |>
  month_to_date() |>
  filter(date >= as.Date("2000-01-01")) |>
  mutate(value = as.numeric(value)) |>
  ggplot() + theme_minimal() + xlab("") + ylab("25-54 Men Employment / Population Ratio") +
  geom_line(aes(x = date, y = value/100, color = sexs_text)) +
  geom_rect(data = nber_recessions |>
              filter(Trough >= as.Date("2000-01-01")), 
            aes(xmin = Peak, xmax = Trough, ymin = -Inf, ymax = +Inf), 
            fill = 'grey', alpha = 0.5) +
  scale_color_manual(values = c("black", "darkblue", "purple")) +
  theme(legend.position = c(0.15, 0.2),
        legend.title = element_blank()) +
  scale_x_date(breaks = seq(1910, 2100, 5) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*c(seq(0, 100, 5), seq(100, 500, 50)),
                     labels = percent_format(accuracy = 1, prefix = ""))