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 8688984
3 Enrolled in School 163817
4 Enrolled in High School 32708
5 Enrolled in College 32771
6 Enrolled in College Full-time 32732
7 Enrolled in College Part-time 32396
8 Not Enrolled 308715

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 9208417
1 Native born 41853
2 Foreign born 41853

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 8486629
1 Wage and salary workers 230887
2 Private wage and salary workers 251871
3 Government wage and salary workers 80899
4 Federal wage and salary workers 6520
5 State wage and salary workers 5120
6 Local wage and salary workers 5120
8 Self-employed workers, unincorporated 110343
9 Unpaid family workers 87212
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) 4215
14 Incorporated self-employed 3631
16 Wage and salary workers, excluding incorporated self employed 7987
17 Private wage and salary workers, excluding incorporated self employed 5971
20 Self-employed workers (both incorporated and unincorporated) 2275

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 8777877
6 Less than 5 weeks 103056
18 15 weeks and over 104160
31 27 weeks and over 78737
58 52 weeks and over 29230
105 99 weeks and over 7216
106 5 to 10 weeks 2988
107 5 to 14 weeks 78455
108 11 to 14 weeks 2972
109 15 to 26 weeks 78290
110 27 to 51 weeks 29142

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 8892394
11 Less than a High School diploma 71098
19 High School graduates, no college 71126
20 Some college or associate degree 70394
21 Some college, no degree 25541
25 Associate degree 25539
40 Bachelor's degree and higher 83561
41 Bachelor's degree only 25023
45 Advanced degree 26943
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 8899454
1 1 to 34 hours 219715
2 1 to 4 hours 8035
6 5 to 14 hours 8035
10 15 to 29 hours 7288
14 30 to 34 hours 8782
16 35 hours and over 99321
17 35 to 39 hours 7288
20 40 hours 7288
21 41 hours and over 5053
23 41 to 48 hours 7288
27 49 to 59 hours 7288
29 60 hours and over 7288

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 8268502
1 Hispanic or Latino 827346
2 Mexican 43868
6 Puerto Rican 42709
7 Cuban 42188
10 Non-Hispanic 32886
15 Central or South American 5136
20 Central American 5136
21 Salvadoran 1904
25 Other Central American (excludes Salvadoran) 5136
30 South American 5136
40 Other Hispanic or Latino 5136
41 Dominican 1904
45 Other Hispanic or Latino (excludes Dominican) 5136

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 6217381
1 White 1357077
3 Black or African American 1108531
4 Asian 585146
5 American Indian or Alaska Native 4002
6 Native Hawaiian or Other Pacific Islander 3594
7 Two or more races 3456
10 Asian - Asian Indian 1848
15 Asian - Chinese 1848
25 Asian - Filipino 1848
26 Asian - Japanese 1848
27 Asian - Korean 1848
28 Asian - Vietnamese 1848
30 Asian - Other Asian 1848

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 600043
U Not Seasonally Adjusted 8692080

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 4376503
1 Men 2471830
2 Women 2443790

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 8688707
1 Veteran 157848
3 Vietnam era and earlier wartime periods 43502
9 Gulf War Era 70491
12 Veterans who served in Gulf War Era 2 (whether or not they served in Era 1) 64125
13 Veterans who served in Gulf War Era 1 but not Gulf War Era 2 56679
16 Other Service Periods (may include peacetime) 53352
25 Nonveteran 157419

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 = ""))