Reflecting on the Past Year: A LinkedIn Year in Review (2024)

A year in review for LinkedIn in 2024
code
linkedin
Author

Steven P. Sanderson II, MPH

Published

January 1, 2025

Keywords

Programming, LinkedIn, Year In Review

Introduction

As we close the door on another year, it’s always a good time to look back and reflect on the past 12 months. And what better way to do that than with a LinkedIn Year in Review?

Whether you’re a job seeker, a business owner, or just someone who enjoys staying connected with their professional network, LinkedIn is an invaluable tool for staying up to date with the latest trends and opportunities in your field. And as we wrap up 2024, now is the perfect time to take a look at how you’ve been using LinkedIn and see where you can improve.

So what did your LinkedIn Year in Review have in store for you? Here are just a few of the things you might have seen:

  • A summary of your activity on LinkedIn, including how many people you’ve connected with, how many posts you’ve shared, and how many likes, comments, and shares your content has received.
  • A breakdown of the industries and job titles of the people you’ve connected with, which can give you a good idea of the types of people you’ve been spending the most time interacting with.
  • A summary of your skills and endorsements, as well as which skills are most in demand in your industry.

All of these insights can be incredibly valuable as you start planning for the year ahead. With this information in hand, you can start looking for new opportunities, strengthening your existing relationships, and building new ones. And with the start of the new year, it’s a perfect time to set new goals and improve your LinkedIn profile.

If you haven’t yet checked out your LinkedIn Year in Review, don’t wait any longer! Log in to your account and take a look. And while you’re there, why not make a resolution to be more active on LinkedIn in the coming year? The more you put into your professional network, the more you’ll get out of it.

So let’s make the most of this new year, take advantage of the insights from your LinkedIn Year in Review, and make the most of your professional network. Here’s to a successful, connected, and productive 2025!

I have done a lot of work on this already, it is not comprehensive but it is enough to understand what is happening, and I used a lot of functionality from the {healthyverse}

Don’t forget you can also see my package and GitHub development wrap up on my year in review 2024

Analysis

I will do this in chunks, as it will be easier to digest. First of course you have to get your data. I am not going to go over this process as there are many a great link just a search away.

Let’s load in those libraries and read the files in.

library(dplyr)
library(readxl)
library(lubridate)
library(timetk)
library(tidyr)
library(janitor)
library(stringr)
library(ggplot2)
library(healthyR.ts)
library(knitr)
library(kableExtra)

fp <- "linkedin_content.xlsx"

engagement_tbl <- read_excel(fp, sheet = "ENGAGEMENT") %>%
  clean_names() %>%
  mutate(date = mdy(date)) %>% 
  mutate(`Engagement Rate` = (engagements / impressions) * 100) %>%
  filter_by_time(
    .date_var = date,
    .end_date = "2024-12-31"
  )

top_posts_tbl <- read_excel(fp, sheet = "TOP POSTS", skip = 1) %>%
  clean_names()

followers_tbl <- read_excel(fp, sheet = "FOLLOWERS", skip = 2) %>%
  clean_names() %>%
  mutate(date = mdy(date)) %>%
  filter_by_time(
    .date_var = date,
    .end_date = "2024-12-31"
  )

demographics_tbl <- read_excel(fp, sheet = "DEMOGRAPHICS") %>%
  clean_names()

Now let’s take a look at that data.

glimpse(engagement_tbl)
Rows: 363
Columns: 4
$ date              <date> 2024-01-04, 2024-01-05, 2024-01-06, 2024-01-07, 202…
$ impressions       <dbl> 1760, 4981, 1226, 1590, 11122, 4496, 9871, 7261, 315…
$ engagements       <dbl> 32, 50, 14, 24, 96, 47, 102, 42, 42, 21, 16, 12, 50,…
$ `Engagement Rate` <dbl> 1.8181818, 1.0038145, 1.1419250, 1.5094340, 0.863154…
glimpse(top_posts_tbl)
Rows: 50
Columns: 7
$ post_url_1          <chr> "https://www.linkedin.com/feed/update/urn:li:activ…
$ post_publish_date_2 <chr> "3/25/2024", "6/11/2024", "7/16/2024", "8/1/2024",…
$ engagements         <dbl> 156, 109, 107, 92, 78, 77, 76, 73, 72, 71, 66, 64,…
$ x4                  <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ post_url_5          <chr> "https://www.linkedin.com/feed/update/urn:li:activ…
$ post_publish_date_6 <chr> "2/5/2024", "4/29/2024", "5/24/2024", "1/27/2024",…
$ impressions         <dbl> 37993, 14462, 11350, 10532, 10476, 9158, 8736, 832…
glimpse(followers_tbl)
Rows: 363
Columns: 2
$ date          <date> 2024-01-04, 2024-01-05, 2024-01-06, 2024-01-07, 2024-01…
$ new_followers <dbl> 28, 16, 9, 12, 23, 36, 24, 14, 14, 8, 16, 30, 28, 25, 21…
glimpse(demographics_tbl)
Rows: 30
Columns: 3
$ top_demographics <chr> "Job titles", "Job titles", "Job titles", "Job titles…
$ value            <chr> "Data Scientist", "Data Analyst", "Software Engineer"…
$ percentage       <chr> "0.04596369341015816", "0.03545770421624184", "0.0260…

We are really only going to focus on the engagement_tbl and the followers_tbl as this is more of a time series analysis.

Ok, so let’s see how my Impressions, Engagements, and Engagement Rate have been.

engagement_tbl %>%
  pivot_longer(cols = -date) %>%
  mutate(name = str_to_title(name)) %>%
  plot_time_series(
    .facet_vars = name,
    .value = value,
    .date_var = date,
    .interactive = FALSE,
    .smooth = FALSE,
    .title = "LinkedIn Stats Time Series Plot"
  ) +
  theme_minimal()

followers_tbl %>%
  plot_time_series(
    .value = new_followers,
    .date_var = date,
    .interactive = FALSE,
    .smooth = FALSE,
    .title = "LinkedIn Stats Time Series Plot - New Followers"
  ) +
  theme_minimal()

Let’s look at a cumulative view of things.

engagement_tbl %>%
  summarise_by_time(
    .date_var = date,
    .by = "month",
    `Cumulative Impressions` = sum(impressions),
    `Cumulative Engagements` = sum(engagements)
  ) %>%
  mutate(
    `Cumulative Impressions` = cumsum(`Cumulative Impressions`),
    `Cumulative Engagements` = cumsum(`Cumulative Engagements`)
  ) %>%
  slice(1:12) %>%
  pivot_longer(cols = -date) %>%
  mutate(name = str_to_title(name)) %>%
  ggplot(aes(x = date, y = value)) +
  geom_col() +
  facet_wrap(~ name, scales = "free") +
  labs(
    x = "Date",
    y = "Value",
    title = "LinkedIn Stats Time Series Plot"
  ) +
  theme_minimal() 

followers_tbl %>%
    summarise_by_time(
    .date_var = date,
    .by = "month",
    `Cumulative Followers` = sum(new_followers)
  ) %>%
  mutate(
    `Cumulative Followers` = cumsum(`Cumulative Followers`)
  ) %>%
  slice(1:12) %>%
  ggplot(aes(x = date, y = `Cumulative Followers`)) +
  geom_col() +
  labs(
    x = "Date",
    y = "Value",
    title = "LinkedIn Stats Time Series Plot - New Followers"
  ) +
  theme_minimal() 

It seems again that writing blog posts and sharing them daily has a nice effect. Now we are going to look at some Value, Velocity, and Acceleration plots with the ts_vva_plot() function from the {healthyR.ts} package.

ts_vva_plot(engagement_tbl, date, engagements)$plots$static_plot

ts_vva_plot(engagement_tbl, date, impressions)$plots$static_plot

ts_vva_plot(engagement_tbl, date, `Engagement Rate`)$plots$static_plot

ts_vva_plot(followers_tbl, date, new_followers)$plots$static_plot

Now some simple moving average plots using the function ts_sma_plot() again from the {healthyR.ts} library.

ts_sma_plot(engagement_tbl, date, impressions, .sma_order = c(7, 14, 21, 30))$plots$static_plot

ts_sma_plot(engagement_tbl, date, engagements, .sma_order = c(7, 14, 21, 30))$plots$static_plot

ts_sma_plot(engagement_tbl, date, `Engagement Rate`, .sma_order = c(7, 14, 21, 30))$plots$static_plot

ts_sma_plot(followers_tbl, date, new_followers, .sma_order = c(7, 14, 21, 30))$plots$static_plot

Now some calendar heatmaps with ts_calendar_heatmap_plot()

ts_calendar_heatmap_plot(engagement_tbl, date, impressions, .interactive = FALSE) +
  labs(title = "Calendar Heatmap - Impressions")

ts_calendar_heatmap_plot(engagement_tbl, date, engagements, .interactive = FALSE) +
  labs(title = "Calendar Heatmap - Engagemets")

ts_calendar_heatmap_plot(engagement_tbl, date, `Engagement Rate`, .interactive = FALSE) +
  labs(title = "Calendar Heatmap - Engagement Rate")

ts_calendar_heatmap_plot(followers_tbl, date, new_followers, .interactive = FALSE) +
  labs(title = "Calendar Heatmap - New Followers")

Some seasonal diagnostics using {timetk}

plot_seasonal_diagnostics(engagement_tbl
                          , date, engagements, .interactive = FALSE,
                          .feature_set = c("wday.lbl", "month.lbl"),
                          .title = "Seasonal Diagnostics - Engagements") +
  theme_minimal()

plot_seasonal_diagnostics(engagement_tbl
                          , date, impressions, .interactive = FALSE,
                          .feature_set = c("wday.lbl", "month.lbl"),
                          .title = "Seasonal Diagnostics - Impressions") +
  theme_minimal()

plot_seasonal_diagnostics(engagement_tbl
                          , date, `Engagement Rate`, .interactive = FALSE,
                          .feature_set = c("wday.lbl", "month.lbl"),
                          .title = "Seasonal Diagnostics - Engagement Rate") +
  theme_minimal()

plot_seasonal_diagnostics(
  followers_tbl, date, new_followers, .interactive = FALSE, 
  .feature_set = c("wday.lbl","month.lbl"), 
  .title = "Seasonal Diagnostics - New Followers") +
  theme_minimal()

Finally some lag correlation plots with ts_lag_correlation().

ts_lag_correlation(engagement_tbl, date, engagements, .lags = c(7, 14, 21, 28))$plots$lag_plot +
  labs(title = "Lag Correlation Plot - Engagements") +
  geom_smooth(se = FALSE, method = "lm", color = "black", linetype = "dashed")

ts_lag_correlation(engagement_tbl, date, impressions, .lags = c(7, 14, 21, 28))$plots$lag_plot +
  labs(title = "Lag Correlation Plot - Impressions") +
  geom_smooth(se = FALSE, method = "lm", color = "black", linetype = "dashed")

ts_lag_correlation(engagement_tbl, date, `Engagement Rate`, .lags = c(7, 14, 21, 28))$plots$lag_plot +
  labs(title = "Lag Correlation Plot - Engagement Rate") +
  geom_smooth(se = FALSE, method = "lm", color = "black", linetype = "dashed")

ts_lag_correlation(followers_tbl, date, new_followers, .lags = c(7, 14, 21, 28))$plots$lag_plot +
  labs(title = "Lag Correlation Plot - New Followers") +
  geom_smooth(se = FALSE, method = "lm", color = "black", linetype = "dashed")

Key Stats and Tables

Now we are going to look at some key stats and tables. First we will look at the top 10 posts by impressions.

top_posts_tbl %>%
  select(post_publish_date_2, impressions, post_url_1) %>%
  arrange(desc(impressions)) %>%
  head(10) %>%
  setNames(c("Post Date", "Impressions", "Post URL")) %>%
  kable(caption = "Top 10 Posts by Impressions", align = "c")
Top 10 Posts by Impressions
Post Date Impressions Post URL
3/25/2024 37993 https://www.linkedin.com/feed/update/urn:li:activity:7178069987956260864
6/11/2024 14462 https://www.linkedin.com/feed/update/urn:li:activity:7206384709851828224
7/16/2024 11350 https://www.linkedin.com/feed/update/urn:li:activity:7219007902802423808
8/1/2024 10532 https://www.linkedin.com/feed/update/urn:li:activity:7224866485502963713
2/5/2024 10476 https://www.linkedin.com/feed/update/urn:li:activity:7160268852155588608
5/16/2024 9158 https://www.linkedin.com/feed/update/urn:li:activity:7196713475702702080
2/6/2024 8736 https://www.linkedin.com/feed/update/urn:li:activity:7160738935751528449
4/1/2024 8322 https://www.linkedin.com/feed/update/urn:li:activity:7180541135377813505
3/14/2024 8218 https://www.linkedin.com/feed/update/urn:li:activity:7174014923474120705
3/25/2024 8151 https://www.linkedin.com/feed/update/urn:li:activity:7178005082381123584

Now we will look at the top 10 posts by engagements.

top_posts_tbl %>%
  select(post_publish_date_2, engagements, post_url_1) %>%
  arrange(desc(engagements)) %>%
  head(10) %>%
  setNames(c("Post Date", "Engagements", "Post URL")) %>%
  kable(caption = "Top 10 Posts by Engagements", align = "c")
Top 10 Posts by Engagements
Post Date Engagements Post URL
3/25/2024 156 https://www.linkedin.com/feed/update/urn:li:activity:7178069987956260864
6/11/2024 109 https://www.linkedin.com/feed/update/urn:li:activity:7206384709851828224
7/16/2024 107 https://www.linkedin.com/feed/update/urn:li:activity:7219007902802423808
8/1/2024 92 https://www.linkedin.com/feed/update/urn:li:activity:7224866485502963713
2/5/2024 78 https://www.linkedin.com/feed/update/urn:li:activity:7160268852155588608
5/16/2024 77 https://www.linkedin.com/feed/update/urn:li:activity:7196713475702702080
2/6/2024 76 https://www.linkedin.com/feed/update/urn:li:activity:7160738935751528449
4/1/2024 73 https://www.linkedin.com/feed/update/urn:li:activity:7180541135377813505
3/14/2024 72 https://www.linkedin.com/feed/update/urn:li:activity:7174014923474120705
3/25/2024 71 https://www.linkedin.com/feed/update/urn:li:activity:7178005082381123584

Now we will look at the top 10 posts by engagement rate.

top_posts_tbl %>%
  select(post_publish_date_2, engagements, impressions, post_url_1) %>%
  mutate(engagement_rate = engagements / impressions) %>%
  arrange(desc(engagement_rate)) %>%
  select(post_publish_date_2, engagement_rate, post_url_1) %>%
  head(10) %>%
  setNames(c("Post Date", "Engagement Rate", "Post URL")) %>%
  kable(caption = "Top 10 Posts by Engagement Rate", align = "c")
Top 10 Posts by Engagement Rate
Post Date Engagement Rate Post URL
7/16/2024 0.0094273 https://www.linkedin.com/feed/update/urn:li:activity:7219007902802423808
4/1/2024 0.0087719 https://www.linkedin.com/feed/update/urn:li:activity:7180541135377813505
3/14/2024 0.0087613 https://www.linkedin.com/feed/update/urn:li:activity:7174014923474120705
8/1/2024 0.0087353 https://www.linkedin.com/feed/update/urn:li:activity:7224866485502963713
7/1/2024 0.0087328 https://www.linkedin.com/feed/update/urn:li:activity:7213501646159392768
1/22/2024 0.0087193 https://www.linkedin.com/feed/update/urn:li:activity:7155192675560747008
3/25/2024 0.0087106 https://www.linkedin.com/feed/update/urn:li:activity:7178005082381123584
2/6/2024 0.0086996 https://www.linkedin.com/feed/update/urn:li:activity:7160738935751528449
10/10/2024 0.0086524 https://www.linkedin.com/feed/update/urn:li:activity:7250288151615737859
6/13/2024 0.0086272 https://www.linkedin.com/feed/update/urn:li:activity:7207022710411948032

Total Impressions: 1,756788

Total Engagements: 16,15

Mean Engagement Rate: 0.0091901

New Followers: 3,794

And finally the demographics of people who typically interact with my posts:

demographics_tbl %>%
  mutate(percentage = substr(percentage, 1, 4)) %>%
  kable(
    caption = "Demographics of People Who Interact With My Posts", 
    align = "c"
    )
Demographics of People Who Interact With My Posts
top_demographics value percentage
Job titles Data Scientist 0.04
Job titles Data Analyst 0.03
Job titles Software Engineer 0.02
Job titles Data Engineer 0.01
Job titles Professor 0.01
Locations New York City Metropolitan Area 0.05
Locations Greater Bengaluru Area 0.03
Locations Greater Delhi Area 0.02
Locations Mumbai Metropolitan Region 0.01
Locations Greater Hyderabad Area 0.01
Industries IT Services and IT Consulting 0.23
Industries Software Development 0.12
Industries Higher Education 0.06
Industries Financial Services 0.05
Industries Research Services 0.05
Seniority Senior 0.33
Seniority Entry 0.28
Seniority Manager 0.03
Seniority Director 0.03
Seniority Training 0.02
Company size 10,001+ employees 0.18
Company size 1001-5000 employees 0.11
Company size 51-200 employees 0.08
Company size 11-50 employees 0.08
Company size 1-10 employees 0.06
Companies Tata Consultancy Services < 1%
Companies Deloitte < 1%
Companies Amazon < 1%
Companies Stony Brook Medicine < 1%
Companies Upwork < 1%

Voila!


Happy Coding! 🚀


You can connect with me at any one of the below:

Telegram Channel here: https://t.me/steveondata

LinkedIn Network here: https://www.linkedin.com/in/spsanderson/

Mastadon Social here: https://mstdn.social/@stevensanderson

RStats Network here: https://rstats.me/@spsanderson

GitHub Network here: https://github.com/spsanderson

Bluesky Network here: https://bsky.app/profile/spsanderson.com

My Book: Extending Excel with Python and R here: https://packt.link/oTyZJ