top of page
Kelly Adams

Weightlifting Project

Updated: Jan 18, 2023

This is a detailed article about my weightlifting project where I analyzed five main barbell lifts: deadlift, squat, overhead press, bench press, and row. The metrics I analyzed were reps, sets, volume, weight, and estimated one rep max.

Quick Links:


Below is a table of contents in case you want to go to a specific section.

Table of Contents:

 

Introduction

I've been weight training (on and off) since I was 17 when I was training for track season. I fell in love with weightlifting. Over these past 9 years I've experimented with barbell training, dumbbells, calisthenics, and other forms of training. But one of my favorite ways of training is with barbells and free weights. To improve my strength and lifts I began analyzing my own data. There's a concept in weightlifting called progressive overload which is when you gradually increase the weight, frequency, or number of repetitions in your strength training routine. It helps challenge the body and allows you to get stronger.

I began analyzing my data when I was starting out because I wanted to improve my lifts using an app. This year I got back into barbell strength training and wanted to try analyzing my lifts myself. Using skills I've learned over the past year like: SQL and Tableau.


If you're an avid weightlifter or have experience with training I will be going into the background and how I structure my programming below. A note I am not a personal trainer nor a doctor. I am doing all of this through my own knowledge.


Below is the goal I'm trying to achieve along with the question I'm trying to answer. The metrics I've been tracking for weightlifting are reps, sets, volume, weight, estimated one repetition max. All of these concepts will be explained below if you have no prior knowledge of weight lifting.


Overall Goal: Improve on weightlifting program to increase strength on all 5 lifts.


Question: "How can I use these metrics to optimize my weightlifting program?"


Common Weightlifting Terms

Below are common terms and their definitions in weightlifting. I'll be using these often throughout my article.

  • Volume is the total weight lifted in a training session for each weight used and added together. It's calculated by (weight)x(reps at that weight)x(sets at that rep scheme).

  • Reps are the number of times you complete a single exercise before taking a rest or a break. For example you complete 8 repetitions (number) of bicep curls. This would also equal one set.

  • Sets is the number of cycles of reps that you complete. For example if you complete 4 cycles (4 sets) of 10 repetitions of a bicep curl.

  • Estimated one rep max (est. 1RM) is the estimated maximum amount of weight you can lfit for a single repetition. it is calculated using Eply's equation.

  • Hinge movement ("hinge") is when you have a slight bend in your knees and you bend over using your hip, like picking up a box.

  • Push movement ("push") is when you use your upper body muscles like your triceps and shoulders to push away something, a few common exercises in this category are push ups or dips.

  • Pull movement ("pull") is when you use your upper body muscles like back and biceps to pull something towards you, a few common exercises are pull-ups and rows.

  • Legs movement ("legs") is pretty self explanatory but it's any movement involving your legs, specifically things like squats and lunges.

The Barbell Lifts

The barbell lifts I'll be analyzing are: deadlift; bench press; overhead press; squat; and row. Typically the deadlift, bench press and squat are the most frequent lifts used to determine your strength. But I've included all five lifts since they cover all of the main movements in lifting: push; pull; legs; and hinge. If you're new to weightlifting I've included below links to detailed articles/guides and videos on what each lift looks like. Each video is set to play when the lift is executed, if you're interested in the technique feel free to watch the entire video.

  1. Barbell deadlift - article, video

  2. Barbell bench press - article, video

  3. Barbell overhead press - article, video

  4. Barbell squat - article, video

  5. Barbell row - article, video

The next section is the background and talks more about how I've been programming and the structure behind my weight lifting routine. This is more for context and answering questions people may have about the frequency of certain lifts.


Background on my Training Plan

I've been doing an upper/lower split twice a week. Meaning two days I work my upper body which includes push and pull movements. I'm working on my back muscles and triceps. I try to incorporate both vertical and horizontal push and pull movements along with some accessory work at the end of the workout. These accessory work may include improving shoulders like side lateral (side of shoulders) raises or rear deltoid (back of shoulder) focused exercises. For my lower body I work out twice a week and I focus on leg and hinge movements. Moves I typically do are squats, lunges, deadlifts and any variety of those. This is why if you look at the data you will see not every lift is done every workout. The workouts and lifts may be different each because of my training program.

Below is an example of a week in my program:

Though for a general rule of thumb for me I like to train these five main lifts at least once a week. Though the goal is twice a week for some lifts like the deadlifts. I also don't only do these five barbell lifts. I do a variety of moments that include dumbbells free weights and machines. But my main focus and way of tracking my progress and strength gains is through the barbell lifts. That is what I will be analyzing and focusing on in this project.

After training for the past 9 years I found this to be the most effective way for me to train. It lets me hit the desired 10 sets per week for each muscle in order to stimulate enough muscle growth but not over train. It has helped me find a good balance between the gym and life. I'm only in the gym four times a week. Though previously I used to do three full body workouts a week but the frequency wasn't enough to stimulate muscle growth or significant strength gains after the first few years for me.

Again, this is not meant to be a article on how to program or train because I am not a personal trainer. This is all from my personal knowledge and research that I've done on the subject. I'm giving a background for those who want it and have prior knowledge about weightlifting.


Below I will describe step-by-step the process I used to for this project. If you want to skip ahead to the business suggestions move onto the section "Summary"

 

Process

Overview: I first cleaned the data in Excel, then used SQL to analyze the data. Finally I created a dashboard in Tableau and used Figma to support the design elements.


Microsoft Excel

  1. I have an app on my phone where I record all of my sets, reps, weight for each workout. The app I used is called fit notes and it's only available on Android. From this app I was able to export all of my data in a .CSV format.

  2. Next I went through all of the data in Excel and deleted all entries that were not the five lifts I will be analyzing.

  3. I assigned an exercise ID to each one of the lifts.

    1. Deadlift

    2. Squat

    3. Overhead press

    4. Bench press

    5. Row

  4. Then I assigned a category ID to each one of the categories.

    1. Push

    2. Pull

    3. Legs

    4. Hinge

  5. To calculate volume I multiply the weights by the reps column

  6. I also added a one rep max column which was calculated using this formula.

  7. In order to be able to create my own schema and table within SQL I need to have specific syntax for each of the rows. I created a function to concatenate all of the rows together to create something that SQL would understand

    1. Insert SQL command for adding in a table

    2. Using the concat function I was able to create something like this for each row automatically in Excel

  8. Then I copied and pasted all of these rows into the SQL schema

I initially wanted to gather and analyze my data in Excel because it is the tool I was most familiar with and I could get a general understanding of the data quicker.

SQL

I used PostgreSQL for my SQL language.


Schema

The first thing I did was create a schema. You can view the full schema code here. For The scheme a part of SQL I will be only mentioning the lines of code which you can view in the link above. Creating a database is less common for a data analyst, so I decided not to include all of the code here. The schema code is 473 lines.

  1. Lines 4-7: Created the workout table which includes:

    1. the workout ID as an integer named "workout_id"

    2. The work out date as date format named "workout_date"

  2. Lines 9 - 49: Then I inserted into the workout table the workout ID and workout date for each. An example for the first entry is

  3. Lines 51-57: Then I created a lifts table which includes:

    1. The workout ID as an integer named "workout_id"

    2. The exercise ID as an integer named "exercise_id"

    3. The weight in pounds as a float named "weight_lbs"

    4. The reps as an integer named "reps"

    5. The volume in pounds as a float named "volume_lbs"

  4. Lines 59 - 445: Then I inserted into the lifts table the record for each exercise. Basically when I record my workouts for each set I include reps and weight. The way the app exported my data was for each set entry it had the date, reps, exercise name, and weight. I was the one that added the workout ID and volume.

  5. Lines 447-451: I created an exercises table which included

    1. Exercise ID as an integer named "exercise_id"

    2. Exercise name as characters named "exercise_name"

    3. Category ID as an integer named "category_id"

  6. Lines 453-460: I insert into the exercise table the exercise ID, exercise name, and category ID. This way I was able to create basically a key for which exercises belong to which category and the names of the exercises.

  7. Lines 462-465: I created a categories table which included

    1. Category ID as an integer named "category_id"

    2. Category name as a character named "category_name"

  8. Lines 467-473: Lastly I insert into the categories the category ID and corresponding category name. This is because I want to create a key of category IDs to the name.

Query

Now that the schema and tables are all set up. I created the various queries to explore the data. For these next queries I will include the code for each query and depending on the output I will include the tables or at least the first five lines. Mostly because many of these tables are more than 10 lines. For each I will include the line of code which is in my Github as query.sql. In the code blocks it will first display the query code and then the table output (in markdown format).


Viewing the tables

The following queries are all about me viewing my four tables in the database. I viewed the following tables:

  1. Workout

  2. Lifts

  3. Exercises

  4. Categories

I selected all of the table information using * from the respective table and limited my query (for tables with more than 10 lines) to keep my Github code short.


Lines 1-51

-- Workout Information 
SELECT * 
FROM weightlifting.workout 
LIMIT 5  
| workout_id | workout_date             | 
| ---------- | ------------------------ | 
| 1          | 2022-06-05T00:00:00.000Z | 
| 2          | 2022-06-07T00:00:00.000Z | 
| 3          | 2022-06-09T00:00:00.000Z | 
| 4          | 2022-06-11T00:00:00.000Z | 
| 5          | 2022-06-12T00:00:00.000Z |

-- Lifts  
SELECT * 
FROM weightlifting.lifts 
LIMIT 5 
| workout_id | exercise_id | weight_lbs | reps | volume_lbs | 
| ---------- | ----------- | ---------- | ---- | ---------- | 
| 1          | 4           | 45         | 5    | 225        | 
| 1          | 4           | 45         | 5    | 225        | 
| 1          | 4           | 50         | 4    | 200        | 
| 1          | 5           | 50         | 5    | 250        | 
| 1          | 5           | 55         | 5    | 275        |

-- Exercises 
SELECT * 
FROM weightlifting.exercises 
| exercise_id | exercise_name  | category_id | 
| ----------- | -------------- | ----------- | 
| 1           | Deadlift       | 4           | 
| 2           | Bench Press    | 1           | 
| 3           | Squat          | 3           | 
| 4           | Overhead Press | 1           | 
| 5           | Row            | 2           |

-- Categories 
SELECT * 
FROM weightlifting.categories 
| category_id | category_name | 
| ----------- | ------------- | 
| 1           | Push          | 
| 2           | Pull          | 
| 3           | Legs          | 
| 4           | Hinge         |

Join the workout table and lifts table

Next I joined the workouts and lifts table. I did this so the dates could be next to the lifts information. Essentially I wanted a table that showcased all of the list data with the accompanying date. I used an inner join and joined the two tables by workout ID. I also included a new column called est_one_rep_max which calculated the estimated one repetition max using the Eply formula.

Lines 52-452

SELECT workout.workout_id,  
workout.workout_date, 
lifts.exercise_id, 
lifts.weight_lbs, 
lifts.reps, 
lifts.weight_lbs/(1.0278 - (0.0278 * lifts.reps)) AS est_one_rep_max 
FROM 
	weightlifting.workout 
  INNER JOIN weightlifting.lifts 
ON workout.workout_id = lifts.workout_id 
ORDER BY workout.workout_id; 

| workout_id | workout_date             | exercise_id | weight_lbs | reps | est_one_rep_max    | 
| ---------- | ------------------------ | ----------- | ---------- | ---- | ------------------ | 
| 1          | 2022-06-05T00:00:00.000Z | 4           | 45         | 5    | 50.63006300630063  | 
| 1          | 2022-06-05T00:00:00.000Z | 4           | 45         | 5    | 50.63006300630063  | 
| 1          | 2022-06-05T00:00:00.000Z | 4           | 50         | 4    | 54.54942177612917  | 
| 1          | 2022-06-05T00:00:00.000Z | 5           | 50         | 5    | 56.255625562556254 | 
| 1          | 2022-06-05T00:00:00.000Z | 5           | 55         | 5    | 61.88118811881188  |

Display the exercise and category for each record in the lifts table.

I created a table to show which category each lift was in for each entry in my lift table. This is useful be later when I count how many lifts where in what category. I used a left join to join the category_id for both tables.

Lines 453-853

SELECT  
    lifts.workout_id, 
    exercises.exercise_id,  
    exercises.exercise_name,  
    categories.category_id,  
    categories.category_name 
FROM weightlifting.exercises 
LEFT JOIN weightlifting.categories 
ON exercises.category_id = categories.category_id 
LEFT JOIN weightlifting.lifts 
ON exercises.exercise_id = lifts.exercise_id 
ORDER BY workout_id

| workout_id | exercise_id | exercise_name  | category_id | category_name | 
| ---------- | ----------- | -------------- | ----------- | ------------- | 
| 1          | 4           | Overhead Press | 1           | Push          | 
| 1          | 5           | Row            | 2           | Pull          | 
| 1          | 2           | Bench Press    | 1           | Push          | 
| 1          | 4           | Overhead Press | 1           | Push          | 
| 1          | 2           | Bench Press    | 1           | Push          |

Average weight per lift

I calculated the average weight in pounds for each lift. I used an inner join to join the two tables on the exercise_id column so I could display the average weight per exercise name.

Lines 854-870

SELECT  
	AVG(lifts.weight_lbs) AS avg_weight_lbs,  
	exercises.exercise_name  
FROM weightlifting.lifts 
	INNER JOIN weightlifting.exercises 
ON lifts.exercise_id = exercises.exercise_id 
GROUP BY exercises.exercise_name 

| avg_weight_lbs     | exercise_name  | 
| ------------------ | -------------- | 
| 59.295081967213115 | Row            | 
| 101.15979381443299 | Deadlift       | 
| 46.37096774193548  | Overhead Press | 
| 63.545918367346935 | Squat          | 
| 57.84090909090909  | Bench Press    |

Maximum weight per lift

I calculated the maximum weight in pounds for each lift. I used an inner join to join the two tables on the exercise_id column so I could display the maximum weight per exercise name.

Lines 871-887

SELECT  
	MAX(lifts.weight_lbs) AS max_weight_lbs,  
	exercises.exercise_name  
FROM weightlifting.lifts 
	INNER JOIN weightlifting.exercises 
ON lifts.exercise_id = exercises.exercise_id 
GROUP BY exercises.exercise_name 

| max_weight_lbs | exercise_name  | 
| -------------- | -------------- | 
| 65             | Row            | 
| 117.5          | Deadlift       | 
| 50             | Overhead Press | 
| 70             | Squat          | 
| 62.5           | Bench Press    |

Minimum weight per lift

I calculated the minimum weight in pounds for each lift. I used an inner join to join the two tables on the exercise_id column so I could display the minimum weight per exercise name.


Lines 888-904

SELECT  
	MIN(lifts.weight_lbs) AS min_weight_lbs,  
	exercises.exercise_name  
FROM weightlifting.lifts 
	INNER JOIN weightlifting.exercises 
ON lifts.exercise_id = exercises.exercise_id 
GROUP BY exercises.exercise_name 

| min_weight_lbs | exercise_name  | 
| -------------- | -------------- | 
| 50             | Row            | 
| 75             | Deadlift       | 
| 40             | Overhead Press | 
| 45             | Squat          | 
| 50             | Bench Press    |

How many exercises I did per workout

I calculate how many exercises I did per day. In the table I displayed the count and date respectively. I used an inner join to join the two tables by the workout_id column so I could display the number of exercises I did next to each workout date.

Lines 905-955

SELECT  
	COUNT(lifts.exercise_id) AS number_of_exercises, 
    	workout.workout_date 
FROM weightlifting.workout 
	INNER JOIN weightlifting.lifts 
ON workout.workout_id = lifts.workout_id 
GROUP BY workout_date 
ORDER BY workout_date 

| number_of_exercises | workout_date             | 
| ------------------- | ------------------------ | 
| 9                   | 2022-06-05T00:00:00.000Z | 
| 8                   | 2022-06-07T00:00:00.000Z | 
| 12                  | 2022-06-09T00:00:00.000Z | 
| 10                  | 2022-06-11T00:00:00.000Z | 
| 15                  | 2022-06-12T00:00:00.000Z |

Average weight per workout

I calculated the average weight per workout date. Using INNER JOIN I joined the two tables by the workout_id so I could display the average weight next to each workout date column.


Lines 956-1006

SELECT  
	AVG(lifts.weight_lbs) AS avg_weight, 
    	workout.workout_date 
FROM weightlifting.workout 
INNER JOIN weightlifting.lifts 
ON workout.workout_id = lifts.workout_id 
GROUP BY workout_date 
ORDER BY workout_date 

| avg_weight         | workout_date             | 
| ------------------ | ------------------------ | 
| 51.111111111111114 | 2022-06-05T00:00:00.000Z | 
| 70                 | 2022-06-07T00:00:00.000Z | 
| 52.5               | 2022-06-09T00:00:00.000Z | 
| 67                 | 2022-06-11T00:00:00.000Z | 
| 53                 | 2022-06-12T00:00:00.000Z |

The total volume per date

I calculated the total volume per workout date. I used the INNER JOIN to join the two tables by the workout_id so I could display the volume next to each workout date.

Lines 1007-1058

SELECT 
SUM(lifts.volume_lbs) AS total_volume,
  workout.workout_date
FROM
	weightlifting.workout
 	INNER JOIN weightlifting.lifts
	ON workout.workout_id = lifts.workout_id
GROUP BY workout.workout_date
ORDER BY workout.workout_date;

| total_volume | workout_date             | 
| ------------ | ------------------------ | 
| 2250         | 2022-06-05T00:00:00.000Z | 
| 2140         | 2022-06-07T00:00:00.000Z | 
| 3145         | 2022-06-09T00:00:00.000Z | 
| 3350         | 2022-06-11T00:00:00.000Z | 
| 3845         | 2022-06-12T00:00:00.000Z |

The total volume per exercise

I calculated the total volume for each exercise. I used CASE WHEN so I could add figure out the totals for each exercise id. For instance if the exercise_id was 1 then it would add the volume (for that exercise). It was essentially a SUMIF function in Excel. I used the INNER JOIN to join the two tables by the workout_id so I could display the exercise name next to the total volume.


Lines 1059-1084

SELECT
SUM(
      CASE
        WHEN lifts.exercise_id = '1' THEN lifts.volume_lbs
        WHEN lifts.exercise_id = '2' THEN lifts.volume_lbs
        WHEN lifts.exercise_id = '3' THEN lifts.volume_lbs
        WHEN lifts.exercise_id = '4' THEN lifts.volume_lbs
        WHEN lifts.exercise_id = '5' THEN lifts.volume_lbs
        END 
  ) AS total_volume,
  exercises.exercise_name
FROM 
	weightlifting.lifts
    INNER JOIN weightlifting.exercises
    ON lifts.exercise_id = exercises.exercise_id
GROUP BY exercises.exercise_name;

| total_volume | exercise_name  |
| ------------ | -------------- |
| 18394        | Row            |
| 48064        | Deadlift       |
| 13495        | Overhead Press |
| 30490        | Squat          |
| 18957.5      | Bench Press    |

The average repetitions per workout

I calculated the average reps per workout date. Using INNER JOIN I joined the two tables by the workout_id so I could display the average weight next to each workout date column.


Lines 1085 to 1135

SELECT  
	AVG(lifts.reps) AS repetitions, 
    workout.workout_date 
FROM weightlifting.workout 
INNER JOIN weightlifting.lifts 
ON workout.workout_id = lifts.workout_id 
GROUP BY workout_date 
ORDER BY workout_date 
| repetitions        | workout_date             | 
| ------------------ | ------------------------ | 
| 4.8888888888888889 | 2022-06-05T00:00:00.000Z | 
| 4.0000000000000000 | 2022-06-07T00:00:00.000Z | 
| 5.0000000000000000 | 2022-06-09T00:00:00.000Z | 
| 5.0000000000000000 | 2022-06-11T00:00:00.000Z | 
| 4.8666666666666667 | 2022-06-12T00:00:00.000Z |

Total count for each category type

This is where the query for joining the exercise, category, lifts table comes into play. I used the CASE WHEN statement to count when a category_id was used for each lift entry. This way I could get a running count of my categories. Then I joined three tables together using LEFT JOIN. The three tables are exercises, categories, and lifts.

  • I needed the lifts entries from the lifts table to be able to count how many times a category was done.

  • I needed the exercises table to join with my categories table to show which exercise belonged with which category.

  • And I needed the categories table to identify which exercise went with which category.

This was the most complicated SQL query in this project. After posting about it on LinkedIn I realized I could replace CASE WHEN with HAVING. But I decided to keep the CASE WHEN statement for now.


I basically wanted to create the equivalent of a COUNTIF you would use in Excel. This was the first result that popped up and made sense to me in my head.


Lines 1036 to 1159

SELECT  
    COUNT( CASE  
        WHEN categories.category_id = '1' THEN 1 
        WHEN categories.category_id = '2' THEN 1 
        WHEN categories.category_id = '3' THEN 1 
        WHEN categories.category_id = '4' THEN 1 
        END 
        ) AS category_count, 
     categories.category_name 
FROM weightlifting.exercises 
LEFT JOIN weightlifting.categories 
ON exercises.category_id = categories.category_id 
LEFT JOIN weightlifting.lifts 
ON exercises.exercise_id = lifts.exercise_id 
GROUP BY categories.category_name 
ORDER BY categories.category_name 
| category_count | category_name | 
| -------------- | ------------- | 
| 97             | Hinge         | 
| 98             | Legs          | 
| 61             | Pull          | 
| 128            | Push          |

Tableau

To view my completed dashboard click here.

Below is my process in Tableau:

  1. First I imported the original .csv file to Tableau

  2. Then I created a calculated field to calculate the estimated one rep max

  3. Next I started creating all of the possible charts I could think of a few of them include

    1. Weight per day

    2. Volume per day

    3. Estimated one rep max for each lift

  4. I created a prototype dashboard for my project. To get everything on the dashboard and play around with the layout.

  5. I used a tool called Figma to create a basic prototype of the dashboard. I created the color scheme and base it off of the colors I use for my website.

  6. I went through several versions of the layout. I experimented with having a landscape style dashboard with navigation on the side or a more portrait style dashboard. This is the one I ended up with because of the limitations and time it takes to load in Tableau.

  7. I kept the design simple with the charts and graphs in a white box with a slight rounded corner. My first version was missing the volume per day which I added in in the second version.

  8. I kept tweaking the design and spacing of the boxes until I ended up with the final version. I also included the keys for weight per day for the exercises.

  9. I used the background I created in Figma for my dashboard. Then I made all of my charts and visualizations floating and move them over to the dashboard to make it look cohesive. In the final version I have graphs/charts on the following:

    1. Total Workouts - I listed this as a numbered total

    2. Volume - both the average and totals

    3. Reps - both the averages and total

    4. Goals - includes "progress bars" on all of my goals for the lifts

    5. Category Count - as a pie chart to showcase how many times a each category was done in my workouts

    6. Max, Min, Avg - included the maximum, minimum, and average values for all 5 lifts. I used a table for simplicity

    7. Weight per Day - displaying the weight I used for all of my lifts. It also includes as filter for each lift and you can also highlight a lift as well if you still want to see the other exercises on the chart. It is sorted by date.

    8. Estimated 1RM - this chart was focused less on measurements and focusing on overall trends in my data.

    9. Total Volume per Day - using a line chart to show the trend of total volume per day

    10. Sets per Week - a stacked bar chart showcasing the number of sets I did per week and it broke it down into category types

  10. The next parts were cleaning up the visualizations. Making sure all of the tool tips were correct and useful.

  11. Finally it was just the final tweaks making sure everything was correct, going through and rechecking for spelling errors and any inconsistencies.

In this case I wanted to focus more on creating an effective dashboard that showcased KPIs for weightlifting. While I've seen some great dashboards that look like infographics I know that for most data analyst jobs there's not a lot of time to create such elaborate dashboards for everything. I focused on simplicity and clarity.


Note: The goals chart is the only one that is created in Figma and is not interactive. This is mainly because I struggled with creating a "progress bar" in Tableau. I'm sure there's a way to do it but I wasn't able to figure out at the time.


Misc.

This is the section for all of the little things that weren't part of the larger tools.

  • I used Figma to create my background and help develop the dashboard aesthetics.

  • Google Docs helped me keep track of all of my documents for this project like:

    • Documentation - I wrote down what I did that day related to my project

    • General - It included references, calculations, anything else I could think of that was useful

  • Drafted this article using Evernote before I uploaded it here.

 

Finished Project

Link to my finished project in Tableau Public: Weightlifting Dashboard. You can view the links to my SQL code on Github used for analysis here.



The icons on bottom left of the dashboard image are clickable in Tableau. The first links to my LinkedIn profile, the second goes to my website, the third links to this article, and this fourth links to my Github code.

 

Summary of Data


Note: In my data analysis I include only working sets. Meaning I don't include any of my warm up weights in my data.

Total Number Workouts

I worked out 28 times from June 1, 2022 to August 31, 2022.


Volume

The equation for volume in lifting which is the total weight lifted per set. Is: reps * weight. The average volume per set was 337 lbs. The total volume for all 38 workouts was 129,401 lbs.


Reps

Average reps per set was 5 and the total number of reps was 1,904.


Category Count

The total number of exercises done in in each category are: hinge at 97; push at 128; legs at 98; and pull at 61.



Max, Min, Avg per Lift

There are five lifts: (1) deadlift; (2) bench press; (3) squat; (4) overhead press; and (5) row.

  1. For deadlift the maximum weight lifted (for any reps) was 117.5 lbs. The minimum weight lifted was 75lbs. And the average weight lifted was 101.16 lbs.

  2. For bench press the maximum weight lifted (for any reps) was 117.5 lbs. The minimum weight lifted was 75lbs. And the average weight lifted was 101.16 lbs.

  3. For squat the maximum weight lifted (for any reps) was 117.5 lbs. The minimum weight lifted was 75lbs. And the average weight lifted was 101.16 lbs.

  4. For overhead press the maximum weight lifted (for any reps) was 117.5 lbs. The minimum weight lifted was 75lbs. And the average weight lifted was 101.16 lbs.

  5. For row the maximum weight lifted (for any reps) was 117.5 lbs. The minimum weight lifted was 75lbs. And the average weight lifted was 101.16 lbs.


Goals

Below are each goal I have for each lift. These are based on intermediate goals for a female weightlifter. Below are how I calculated each goal along with the actual calculation:

  1. Deadlift Goal = 1.5x bodyweight = 1.5x110 = 165lbs

  2. Bench Press Goal = 0.75x bodyweight= 0.75x110 = 82.5lbs

  3. Squat Goal = 1.25x bodyweight = 1.25x110 = 137.5lbs

  4. Overhead Press Goal = 0.6x bodyweight = 0.6x110 = 65lbs

  5. Row Goal = 0.75x bodyweight = 0.75x110 = 82.5lbs

As a note at the time I weighed 110lbs. For each goal the maximum weight I lifted for each was used. Also, the barbell row was not listed in the website above and is usually not measured for strength. I used the same metric from the bench press (0.75x bodyweight) for my row.

Below are the maximum weight for each lift:

  1. Deadlift at 117.5 lbs which is about 70% of my goal

  2. Bench Press at 62.5 lbs which is about 75% of my goal

  3. Squat at 117.5 lbs which is about 51% of my goal

  4. Overhead Press at 117.5 lbs which is about 77% of my goal

  5. Row at 117.5 lbs which is about 78% of my goal

If you're wondering why my squat is so low it's because of a previous hip injury. I had to get back into squatting with weight easily.


Weight per Day

All of the lifts increased over the course of three months. The deadlift was in the upper range of 75lbs - 117.5lbs. While exercises bench press and row were in the mid range of 50lbs to 62.5 lbs. The overhead press was the lift with the lowest weight used (which makes sense given the context of the lift). The squat in the middle with a range of 45 lbs to 70lbs. As a note, the graph below doesn't show all of dates.



Estimated 1 RM

The estimated one rep max is the estimated amount of weight you could lift for one repetition. This is typically used for pure strength metrics. I wasn't focused on the exact number but rather if the graph was trending upwards. It was for almost all of the lifts except for my overhead press which went down because of an injury.



Total Volume per Day

Overall the total volume per day (volume is calculated by reps*weight for each set of that weight) increased. The lowest volume was on August 5th with 1650 lbs and the highest was on July 26th with 4920 lbs. Typically leg days (when I do barbell deadlifts and squats) have a higher volume than upper days (when I do bench press, overhead press, or rows). This is because I lift more on leg days (women typically are stronger in their legs) than upper body days.



Sets per Week

On average I had 30 sets per week. With week 26 having the most sets at 47 and week 36 having the least sets at 10.



 

Final Summary

  • My strength in all of the lifts improved.

  • I managed to hit personal records in several lifts.

  • My deadlift was the exercise that I had the highest weight in. All of the other exercises were around the same weight used even the squat.

  • Generally speaking my estimated one rep max increase on the deadlift, bench press, squat and row

  • For my overhead press for my estimated one rep max it did not increase. It actually declined slightly because I decreased the weight for that lift.

  • For almost all of my categories the push, pole, legs, hinge I stuck to the same amount of sets per week (10 sets per week). Generally speaking, I tried aiming for at least five sets for each category.

  • I kept my reps the same which was on average five. For this period of my lifting phase I was focusing on strength which means I was lifting around 3 to 5 reps each set.

  • For all of my goals I'm over half of the way there except for my squat. Which is quite low because of a previous injury.

 

Insights

These are my insights for how to improve my strength (and which I've since implemented since my analysis).

  1. The best rep and set range for strength for me is 5 sets and 3-6 reps. For strength it is either 3 or 4 sets with 10-12 reps. I see the most strength gains with lower rep range but nothing in the 1-3 reps which is too heavy for me.

  2. Adding 5 lbs to my lifts every week wasn't attainable for me, especially on lifts like the bench press and overhead press. The weight I'd use would fluctuate too much because I was overtraining (lifting too heavy). What I found works for me is: I start at a weight say 55lbs for my bench press. I do 5 sets of 3 reps, the next workout I do 5 sets of 4 reps at the same weight. I continue with this weight until I get to 5 sets of 6 reps. Then I start back at the bottom of 5 sets of 3 reps with 60 lbs (5 more pounds than I previously used). This may not be the quickest way to reach PRs and I don't always stick to this rigorous schedule but it's worked for me to remain injury free.

  3. 10 sets per muscle group a week is the optimal amount. But anything more than 18-20 is too much for me. Which means for most of my lifts I will keep to a standard 5 sets per exercises for the strength building portion. If I do an exercise twice a week (deadlift) then it will be the recommended 10 sets per week. But for push movements, which have two lifts: the barbell bench press and barbell overhead press, I will only do each exercise per week. Meaning if I do barbell bench press once that's 5 sets and an overhead press which is also 5 sets then the total sets will be 10 for the push movements.

  4. For many of my lifts I've reached plateaus (bench press and overhead press). Along with my strategy in #2, I also bought two 1.25 lb plates to use. This lets me increase my weight by increments of 2.5 lbs instead of 5 lbs. This helps me always increase the weight, especially if 5 lbs is too much.

 

What I Learned

This is what I learned/practiced from over 20 hours spent on this project:

  • How to improve the tool tip in Tableau public and make it useful

  • Create calculated fields in Tableau which is how I create the estimated one rep max category

  • How to showcase data in a text or table form in Tableau which I used for my minimum, maximum and average table for all of my lifts.

  • How to use LEFT JOIN in SQL to join three different tables together

  • The use case of CASE WHEN in SQL and how better to optimize that using the HAVING function

 

Conclusion

Overall this was a fun project to work on. I was able to utilize my SQL skills with one of the things I'm most passionate about: weight lifting. I also got to focus and prioritize creating a dashboard which was simple, but effective in showcasing what I need it to do. While this project took longer than I initially anticipated to. I'm proud of how it turned out. And it gives me an idea of how to create a more effective and easy to read dashboard.


Feel free to email me at kelly@kellyjadams.com if you have any questions on the data analytics side of this project. As I said, this project isn't meant to be a guide to weightlifting and programming a plan.


© Kelly J. Adams - 2024

  • LinkedIn
  • GitHub
bottom of page