Labor Force Statistics including the National Unemployment Rate - LN

Data - BLS

Info

source dataset .html .RData

bls

ln

2024-06-17 NA

Data on employment

source dataset .html .RData

bls

jt

2024-05-01 NA

bls

la

2024-06-19 NA

bls

ln

2024-06-17 NA

eurostat

nama_10_a10_e

2024-06-18 2024-06-18

eurostat

nama_10_a64_e

2024-06-18 2024-06-18

eurostat

namq_10_a10_e

2024-06-19 2024-06-08

eurostat

une_rt_m

2024-06-19 2024-06-08

oecd

ALFS_EMP

2024-04-16 2024-05-12

oecd

EPL_T

2024-04-16 2023-12-10

oecd

LFS_SEXAGE_I_R

2024-06-19 2024-04-15

oecd

STLABOUR

2024-06-18 2024-05-06

LAST_DOWNLOAD

LAST_DOWNLOAD
2024-03-20

LAST_COMPILE

LAST_COMPILE
2024-06-20

Last

date Nobs
2024-02-01 15441

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 7717633
3 Enrolled in School 153317
4 Enrolled in High School 30608
5 Enrolled in College 30671
6 Enrolled in College Full-time 30632
7 Enrolled in College Part-time 30296
8 Not Enrolled 288849

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 8212926
1 Native born 34540
2 Foreign born 34540

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 7563567
1 Wage and salary workers 212313
2 Private wage and salary workers 228669
3 Government wage and salary workers 72710
4 Federal wage and salary workers 2467
5 State wage and salary workers 2507
6 Local wage and salary workers 2507
8 Self-employed workers, unincorporated 100662
9 Unpaid family workers 79862
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) 3837
14 Incorporated self-employed 1230
16 Wage and salary workers, excluding incorporated self employed 4998
17 Private wage and salary workers, excluding incorporated self employed 3234

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 7800136
6 Less than 5 weeks 96766
18 15 weeks and over 97800
31 27 weeks and over 73731
58 52 weeks and over 27592
105 99 weeks and over 5956
106 5 to 10 weeks 2820
107 5 to 14 weeks 73531
108 11 to 14 weeks 2804
109 15 to 26 weeks 73366
110 27 to 51 weeks 27504

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 7933089
11 Less than a High School diploma 63525
19 High School graduates, no college 63553
20 Some college or associate degree 62933
21 Some college, no degree 23391
25 Associate degree 23389
40 Bachelor's degree and higher 75190
41 Bachelor's degree only 17508
45 Advanced degree 19428

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 7918253
1 1 to 34 hours 203057
2 1 to 4 hours 7585
6 5 to 14 hours 7585
10 15 to 29 hours 6880
14 30 to 34 hours 8290
16 35 hours and over 91191
17 35 to 39 hours 6880
20 40 hours 6880
21 41 hours and over 4765
23 41 to 48 hours 6880
27 49 to 59 hours 6880
29 60 hours and over 6880

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 7359517
1 Hispanic or Latino 751580
2 Mexican 39626
6 Puerto Rican 38467
7 Cuban 37988
10 Non-Hispanic 26988
15 Central or South American 4128
20 Central American 4128
21 Salvadoran 1536
25 Other Central American (excludes Salvadoran) 4128
30 South American 4128
40 Other Hispanic or Latino 4128
41 Dominican 1536
45 Other Hispanic or Latino (excludes Dominican) 4128

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 5465957
1 White 1260884
3 Black or African American 1021614
4 Asian 513019
5 American Indian or Alaska Native 3634
6 Native Hawaiian or Other Pacific Islander 3226
7 Two or more races 3088
10 Asian Indian 1512
15 Chinese 1512
25 Filipino 1512
26 Japanese 1512
27 Korean 1512
28 Vietnamese 1512
30 Other Asian 1512

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 574823
U Not Seasonally Adjusted 7707183

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 3782356
1 Men 2263911
2 Women 2235739

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 7751069
1 Veteran 139888
3 World War II or Korean War or Vietnam Era 37886
9 Gulf War Era 61863
12 Veterans who served in Gulf War Era 2 (whether or not they served in Era 1) 55500
13 Veterans who served in Gulf War Era 1 but not Gulf War Era 2 49136
16 Other Service Periods (may include peacetime) 47163
25 Nonveteran 139501

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