Introduction

Ask

Business Task:

Identifying trends in non-Bellabeat smart device usage and how they could apply to Bellabeat customers, along with giving suggestions to influence the company’s marketing strategy.

Key Stakeholders:

  • Urška Sršen: Bellabeat’s cofounder and Chief Creative Officer
  • Sando Mur: Bellabeat’s cofounder; key member of the Bellabeat executive team
  • Bellabeat marketing analytics team

Prepare

Dataset used: https://www.kaggle.com/datasets/arashnic/fitbit

This data set contains personal fitness tracker from thirty fitbit users. Thirty eligible Fitbit users consented to the submission of personal tracker data, including minute-level output for physical activity, heart rate, and sleep monitoring. It includes information about daily activity, steps, and heart rate that can be used to explore users’ habits.

Installing and loading packages:

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(here)
## here() starts at C:/Users/agaaz/OneDrive/Documents/GitHub/Case_Study_RMarkdown
library(ggpubr)
## Loading required package: ggplot2
library(ggplot2)
library(skimr)
library(janitor)
## 
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
library(lubridate)
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2
## ──
## ✔ tibble  3.1.8     ✔ purrr   1.0.1
## ✔ tidyr   1.3.0     ✔ stringr 1.5.0
## ✔ readr   2.1.4     ✔ forcats 1.0.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ lubridate::as.difftime() masks base::as.difftime()
## ✖ lubridate::date()        masks base::date()
## ✖ dplyr::filter()          masks stats::filter()
## ✖ lubridate::intersect()   masks base::intersect()
## ✖ dplyr::lag()             masks stats::lag()
## ✖ lubridate::setdiff()     masks base::setdiff()
## ✖ lubridate::union()       masks base::union()

Loading Kaggle data and naming the dataframes:

daily_activity <- read_csv("Bellabeat/Fitabase Data 4.12.16-5.12.16/dailyActivity_merged.csv")
## Rows: 940 Columns: 15
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr  (1): ActivityDate
## dbl (14): Id, TotalSteps, TotalDistance, TrackerDistance, LoggedActivitiesDi...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
heartrate_seconds <- read_csv("Bellabeat/Fitabase Data 4.12.16-5.12.16/heartrate_seconds_merged.csv")
## Rows: 2483658 Columns: 3
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): Time
## dbl (2): Id, Value
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
hourly_calories <- read_csv("Bellabeat/Fitabase Data 4.12.16-5.12.16/hourlyCalories_merged.csv")
## Rows: 22099 Columns: 3
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): ActivityHour
## dbl (2): Id, Calories
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
hourly_steps <- read_csv("Bellabeat/Fitabase Data 4.12.16-5.12.16/hourlySteps_merged.csv")
## Rows: 22099 Columns: 3
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): ActivityHour
## dbl (2): Id, StepTotal
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
hourly_intensities <- read_csv("Bellabeat/Fitabase Data 4.12.16-5.12.16/hourlyIntensities_merged.csv")
## Rows: 22099 Columns: 4
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): ActivityHour
## dbl (3): Id, TotalIntensity, AverageIntensity
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
sleep_daily <- read_csv("Bellabeat/Fitabase Data 4.12.16-5.12.16/sleepDay_merged.csv")
## Rows: 413 Columns: 5
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): SleepDay
## dbl (4): Id, TotalSleepRecords, TotalMinutesAsleep, TotalTimeInBed
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
str(daily_activity)
## spc_tbl_ [940 × 15] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ Id                      : num [1:940] 1.5e+09 1.5e+09 1.5e+09 1.5e+09 1.5e+09 ...
##  $ ActivityDate            : chr [1:940] "4/12/2016" "4/13/2016" "4/14/2016" "4/15/2016" ...
##  $ TotalSteps              : num [1:940] 13162 10735 10460 9762 12669 ...
##  $ TotalDistance           : num [1:940] 8.5 6.97 6.74 6.28 8.16 ...
##  $ TrackerDistance         : num [1:940] 8.5 6.97 6.74 6.28 8.16 ...
##  $ LoggedActivitiesDistance: num [1:940] 0 0 0 0 0 0 0 0 0 0 ...
##  $ VeryActiveDistance      : num [1:940] 1.88 1.57 2.44 2.14 2.71 ...
##  $ ModeratelyActiveDistance: num [1:940] 0.55 0.69 0.4 1.26 0.41 ...
##  $ LightActiveDistance     : num [1:940] 6.06 4.71 3.91 2.83 5.04 ...
##  $ SedentaryActiveDistance : num [1:940] 0 0 0 0 0 0 0 0 0 0 ...
##  $ VeryActiveMinutes       : num [1:940] 25 21 30 29 36 38 42 50 28 19 ...
##  $ FairlyActiveMinutes     : num [1:940] 13 19 11 34 10 20 16 31 12 8 ...
##  $ LightlyActiveMinutes    : num [1:940] 328 217 181 209 221 164 233 264 205 211 ...
##  $ SedentaryMinutes        : num [1:940] 728 776 1218 726 773 ...
##  $ Calories                : num [1:940] 1985 1797 1776 1745 1863 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   Id = col_double(),
##   ..   ActivityDate = col_character(),
##   ..   TotalSteps = col_double(),
##   ..   TotalDistance = col_double(),
##   ..   TrackerDistance = col_double(),
##   ..   LoggedActivitiesDistance = col_double(),
##   ..   VeryActiveDistance = col_double(),
##   ..   ModeratelyActiveDistance = col_double(),
##   ..   LightActiveDistance = col_double(),
##   ..   SedentaryActiveDistance = col_double(),
##   ..   VeryActiveMinutes = col_double(),
##   ..   FairlyActiveMinutes = col_double(),
##   ..   LightlyActiveMinutes = col_double(),
##   ..   SedentaryMinutes = col_double(),
##   ..   Calories = col_double()
##   .. )
##  - attr(*, "problems")=<externalptr>
str(heartrate_seconds)
## spc_tbl_ [2,483,658 × 3] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ Id   : num [1:2483658] 2.02e+09 2.02e+09 2.02e+09 2.02e+09 2.02e+09 ...
##  $ Time : chr [1:2483658] "4/12/2016 7:21:00 AM" "4/12/2016 7:21:05 AM" "4/12/2016 7:21:10 AM" "4/12/2016 7:21:20 AM" ...
##  $ Value: num [1:2483658] 97 102 105 103 101 95 91 93 94 93 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   Id = col_double(),
##   ..   Time = col_character(),
##   ..   Value = col_double()
##   .. )
##  - attr(*, "problems")=<externalptr>
str(hourly_calories)
## spc_tbl_ [22,099 × 3] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ Id          : num [1:22099] 1.5e+09 1.5e+09 1.5e+09 1.5e+09 1.5e+09 ...
##  $ ActivityHour: chr [1:22099] "4/12/2016 12:00:00 AM" "4/12/2016 1:00:00 AM" "4/12/2016 2:00:00 AM" "4/12/2016 3:00:00 AM" ...
##  $ Calories    : num [1:22099] 81 61 59 47 48 48 48 47 68 141 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   Id = col_double(),
##   ..   ActivityHour = col_character(),
##   ..   Calories = col_double()
##   .. )
##  - attr(*, "problems")=<externalptr>
str(hourly_steps)
## spc_tbl_ [22,099 × 3] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ Id          : num [1:22099] 1.5e+09 1.5e+09 1.5e+09 1.5e+09 1.5e+09 ...
##  $ ActivityHour: chr [1:22099] "4/12/2016 12:00:00 AM" "4/12/2016 1:00:00 AM" "4/12/2016 2:00:00 AM" "4/12/2016 3:00:00 AM" ...
##  $ StepTotal   : num [1:22099] 373 160 151 0 0 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   Id = col_double(),
##   ..   ActivityHour = col_character(),
##   ..   StepTotal = col_double()
##   .. )
##  - attr(*, "problems")=<externalptr>
str(hourly_intensities)
## spc_tbl_ [22,099 × 4] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ Id              : num [1:22099] 1.5e+09 1.5e+09 1.5e+09 1.5e+09 1.5e+09 ...
##  $ ActivityHour    : chr [1:22099] "4/12/2016 12:00:00 AM" "4/12/2016 1:00:00 AM" "4/12/2016 2:00:00 AM" "4/12/2016 3:00:00 AM" ...
##  $ TotalIntensity  : num [1:22099] 20 8 7 0 0 0 0 0 13 30 ...
##  $ AverageIntensity: num [1:22099] 0.333 0.133 0.117 0 0 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   Id = col_double(),
##   ..   ActivityHour = col_character(),
##   ..   TotalIntensity = col_double(),
##   ..   AverageIntensity = col_double()
##   .. )
##  - attr(*, "problems")=<externalptr>
str(sleep_daily)
## spc_tbl_ [413 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ Id                : num [1:413] 1.5e+09 1.5e+09 1.5e+09 1.5e+09 1.5e+09 ...
##  $ SleepDay          : chr [1:413] "4/12/2016 12:00:00 AM" "4/13/2016 12:00:00 AM" "4/15/2016 12:00:00 AM" "4/16/2016 12:00:00 AM" ...
##  $ TotalSleepRecords : num [1:413] 1 2 1 2 1 1 1 1 1 1 ...
##  $ TotalMinutesAsleep: num [1:413] 327 384 412 340 700 304 360 325 361 430 ...
##  $ TotalTimeInBed    : num [1:413] 346 407 442 367 712 320 377 364 384 449 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   Id = col_double(),
##   ..   SleepDay = col_character(),
##   ..   TotalSleepRecords = col_double(),
##   ..   TotalMinutesAsleep = col_double(),
##   ..   TotalTimeInBed = col_double()
##   .. )
##  - attr(*, "problems")=<externalptr>
count(distinct(daily_activity,Id))
## # A tibble: 1 × 1
##       n
##   <int>
## 1    33
count(distinct(heartrate_seconds,Id))
## # A tibble: 1 × 1
##       n
##   <int>
## 1    14
count(distinct(hourly_calories,Id))
## # A tibble: 1 × 1
##       n
##   <int>
## 1    33
count(distinct(hourly_steps,Id))
## # A tibble: 1 × 1
##       n
##   <int>
## 1    33
count(distinct(hourly_intensities,Id))
## # A tibble: 1 × 1
##       n
##   <int>
## 1    33
count(distinct(sleep_daily,Id))
## # A tibble: 1 × 1
##       n
##   <int>
## 1    24

All data frames have data from 33 users except heartrate_seconds with 14 users and sleep_daily with 24. While the sleep data can still be useful, it makes sense to leave the heart rate data out of our analysis as we have other similar forms of data(intensities and calories), just not down to the second.

Process

Now let’s try to make sure the data is clean by first checking for duplicates:

anyDuplicated(daily_activity)
## [1] 0
anyDuplicated(hourly_calories)
## [1] 0
anyDuplicated(hourly_steps)
## [1] 0
anyDuplicated(hourly_intensities)
## [1] 0
anyDuplicated(sleep_daily)
## [1] 162

Checking for cells with missing values:

sum(is.na(daily_activity))
## [1] 0
sum(is.na(hourly_calories))
## [1] 0
sum(is.na(hourly_steps))
## [1] 0
sum(is.na(hourly_intensities))
## [1] 0
sum(is.na(sleep_daily))
## [1] 0

The sleep_daily data frame has 162 duplicates, we should clean it before proceeding further.

sleep_daily <- sleep_daily %>%
  distinct()

We are likely to analyze data by date and time for this project, so let’s make sure that the formatting for these columns is correct in our data frames.

daily_activity$ActivityDate <- mdy(daily_activity$ActivityDate)

hourly_calories$ActivityHour <- mdy_hms(hourly_calories$ActivityHour)

hourly_steps$ActivityHour <- mdy_hms(hourly_steps$ActivityHour)

hourly_intensities$ActivityHour <- mdy_hms(hourly_intensities$ActivityHour)

sleep_daily$SleepDay <- mdy_hms(sleep_daily$SleepDay)

Analyze

Let’s look at some summary statistics for our data frames.

daily_activity %>%  
  select(TotalSteps,
         TotalDistance,
         VeryActiveDistance,
         ModeratelyActiveDistance,
         LightActiveDistance,
         SedentaryActiveDistance,
         Calories) %>%
  summary()
##    TotalSteps    TotalDistance    VeryActiveDistance ModeratelyActiveDistance
##  Min.   :    0   Min.   : 0.000   Min.   : 0.000     Min.   :0.0000          
##  1st Qu.: 3790   1st Qu.: 2.620   1st Qu.: 0.000     1st Qu.:0.0000          
##  Median : 7406   Median : 5.245   Median : 0.210     Median :0.2400          
##  Mean   : 7638   Mean   : 5.490   Mean   : 1.503     Mean   :0.5675          
##  3rd Qu.:10727   3rd Qu.: 7.713   3rd Qu.: 2.053     3rd Qu.:0.8000          
##  Max.   :36019   Max.   :28.030   Max.   :21.920     Max.   :6.4800          
##  LightActiveDistance SedentaryActiveDistance    Calories   
##  Min.   : 0.000      Min.   :0.000000        Min.   :   0  
##  1st Qu.: 1.945      1st Qu.:0.000000        1st Qu.:1828  
##  Median : 3.365      Median :0.000000        Median :2134  
##  Mean   : 3.341      Mean   :0.001606        Mean   :2304  
##  3rd Qu.: 4.782      3rd Qu.:0.000000        3rd Qu.:2793  
##  Max.   :10.710      Max.   :0.110000        Max.   :4900

Checking the relationship between steps and calories per day:

ggplot(data = daily_activity, mapping = aes(x = TotalSteps, y = Calories)) + geom_point() + geom_smooth() +geom_jitter() + stat_cor(label.x = 20000,label.y = 1000) + labs(title = "Daily Steps and Calories burned")
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

The plot as well as a positive correlation of 0.59 between steps and calories burned show us that most of the calories users burn in a day come from movement based activity.

Based on the summary statistics from earlier, we can see that most of that movement is Light Active Distance (followed by Very Active Distance, but it is significantly smaller). This leads us to believe that people are taking less time out for exercising and relying on walking for daily tasks to expend calories.

Hourly Data can provide us with useful information as well, let’s summarize and analyze:

hourly_calories$Hour <- format(hourly_calories$ActivityHour, format = "%H:%M:%S")
hourly_calories1 <- hourly_calories
hourly_calories1$ActivityHour <- weekdays(hourly_calories1$ActivityHour)
hourly_calories1$ActivityHour <- factor(hourly_calories1$ActivityHour, levels = c("Sunday", "Saturday", "Friday","Thursday", "Wednesday", "Tuesday", "Monday"))
hourly_calories1 %>%
  group_by(Hour, ActivityHour) %>%
  ggplot(data = hourly_calories1, mapping = aes(x = Hour, y = ActivityHour, fill = Calories)) + geom_tile(color = "white" , linewidth = 0.5) + theme(axis.text.x = element_text(angle = 90)) + scale_fill_viridis_c(option = "A") +labs(y = "Day of Week" , title = "Hourly Calorie Expenditure per Day")

Looks like the most active periods of people’s weeks are Monday and Wednesday between 3PM and 5PM, Friday 1PM to 2PM and Saturday 11AM to 1PM.

Let’s look at sleep data, this will be interesting as it is different from everything else we’ve seen before.

sleep_daily %>%
  select(TotalMinutesAsleep, TotalTimeInBed) %>%
  summary()
##  TotalMinutesAsleep TotalTimeInBed 
##  Min.   : 58.0      Min.   : 61.0  
##  1st Qu.:361.0      1st Qu.:403.8  
##  Median :432.5      Median :463.0  
##  Mean   :419.2      Mean   :458.5  
##  3rd Qu.:490.0      3rd Qu.:526.0  
##  Max.   :796.0      Max.   :961.0

We can see that the sleep time for most users is around 6 to 8 hours, with the time in bed being around 6.75 to 8.75 hours.

time_taken_to_fall_asleep = sleep_daily$TotalTimeInBed - sleep_daily$TotalMinutesAsleep
summary(time_taken_to_fall_asleep)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00   17.00   25.50   39.31   40.00  371.00

It takes most users between 17 and 40 minutes to fall asleep after the device detects that they have gotten into bed.

sleep_daily %>%
  group_by(Id) %>%
  ggplot(data = sleep_daily, mapping= aes(x = time_taken_to_fall_asleep, y = TotalMinutesAsleep )) + geom_point() + stat_cor(label.x = 250 , label.y = 200) + labs(x = "Time Taken To Fall Asleep" , y = "Total Minutes Asleep")

We can’t come to any meaningful conclusion due to the lack of correlation between the time it takes for someone to fall asleep is not a good predictor of how long they are asleep for.

sleep_daily1 <- sleep_daily

sleep_daily1$SleepDay <- weekdays(sleep_daily1$SleepDay)
sleep_daily1$SleepDay <- factor(sleep_daily1$SleepDay, levels = c("Monday", "Tuesday", "Wednesday","Thursday", "Friday", "Saturday", "Sunday"))

Sleep Time per Weekday:

sleep_daily1 %>% 
  group_by(SleepDay) %>% 
  summarise(avg_sleep_duration = mean(TotalMinutesAsleep)/60) %>% 
  ggplot(mapping = aes(x= SleepDay, y = avg_sleep_duration)) +
  geom_col() + labs(title = "Sleep Duration per Weekday", x = "Day" , y = "Hours")

Sleep per weekday seems to be relatively evenly distributed, with most users getting more sleep on Wednesday and Sunday.

rename(sleep_daily, ActivityDate = SleepDay)
## # A tibble: 410 × 5
##            Id ActivityDate        TotalSleepRecords TotalMinutesAsleep TotalTi…¹
##         <dbl> <dttm>                          <dbl>              <dbl>     <dbl>
##  1 1503960366 2016-04-12 00:00:00                 1                327       346
##  2 1503960366 2016-04-13 00:00:00                 2                384       407
##  3 1503960366 2016-04-15 00:00:00                 1                412       442
##  4 1503960366 2016-04-16 00:00:00                 2                340       367
##  5 1503960366 2016-04-17 00:00:00                 1                700       712
##  6 1503960366 2016-04-19 00:00:00                 1                304       320
##  7 1503960366 2016-04-20 00:00:00                 1                360       377
##  8 1503960366 2016-04-21 00:00:00                 1                325       364
##  9 1503960366 2016-04-23 00:00:00                 1                361       384
## 10 1503960366 2016-04-24 00:00:00                 1                430       449
## # … with 400 more rows, and abbreviated variable name ¹​TotalTimeInBed
daily_data = merge(daily_activity, sleep_daily , all = FALSE)
  ggplot(data = daily_data, mapping = aes( x = TotalMinutesAsleep , y = Calories)) + geom_smooth()
## `geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'

There is a lot to unpack here:

  1. Sleep duration affects daily activity (when measured in the form of calories burned). The group that burns the most calories sleeps around 6.5 to 8 hours.

  2. The graph starts off pretty high - it is highly unlikely for people sleeping > 2 hours to have enough energy to burn more calories than people who get more rest. After manually inspecting the data, it looks like for some users the data is the same every day, and it’s often a small amount ranging from 1 to 2 hours. The fitness tracker might not be tracking sleep data properly for everyone. The inverted sleep parabola at the start of the graph is another indicator of this.

Insights and Suggestions

1. Collect Data from Bellabeat users as well

The data set we analyzed was useful, but Bellabeat’s consumers are mainly female and we could definitely benefit from also using internal data from the company to get a better idea of how their data moves with fluctuations in external data from the market.

Also, the lack of usable weight data meant that we were lacking an important factor in our analysis. Weight influences calories burned, and calories burned is a better indicator of physical activity than steps as it also includes strength training.

Bellabeat also has products that track female-specific health data like the menstrual cycle, another important factor which can influence and improve this analysis.

2. Brand Image

We saw a correlation of almost 0.6 between daily steps and daily calorie expenditure. While it is strong enough to justify a focus on accurate step tracking, losing out on strength-training metrics can lead to ignoring a big chunk of the market.

Bellabeat’s product lineup has a heavy focus on women’s wellness and health, but it does not advertise its exercise tracking capabilities beyond mentioning the existence of those capabilities. They already have exercise specific accessories for their products, so it’ll be beneficial to advertise to the market segment of females that consider themselves fitness enthusiasts.

In a way, this is expanding to take a chunk out of Fitbit’s fitness focused market while not losing brand identity.

3. Lack of Movement

The daily activity data summary shows us that only 25% of users get over 10,000 steps per day. Innovative strategies like time-bound competitions (Strava does monthly and weekly challenges) as well as education-based positive reinforcement to show people the impact of good cardiovascular health can be implemented.

4. Two sides of the equation

Something that not just Bellabeat, but also other major fitness tracker apps lack, is calorie intake. Calories burned is a great way of showing exercises performed and energy expenditure, but allowing users to get a better understanding of nutrition while also gaining a first-mover advantage in this field.

Other fitness trackers already partner with apps like MyFitnessPal & Loseit, but allowing users to see both sides of the equation (calories in vs calories burned) on the same platform will be a big advantage.

5. Sleep

A median sleep duration of 7 hours suggests that nearly half of the users are not getting the recommended 7 to 9 hours of sleep as suggested by the National Institute of Aging.

The institute also suggests that an adult should be asleep within 20 minutes of getting into bed, but the data shows that over 50% of users spend an extended amount of time in bed. Collecting further data on when the excess time in bed is spent (before sleeping or after waking up) as well as bedtimes and bedtime consistency can help more with our analysis. Based on the data analyzed, Bellabeat can help create a sleep “nudge” via haptic feedback, urging users to start their bedtime routine the same time every day. Bellabeat already provides sleep metrics, the nudge can help users pay more attention to it.

6. Mental Health

According to a study in the Journal of Psychiatry and Neuroscience , depression is almost twice as prevalent in women when compared to women. Women in general are also more attentive to their emotional and mental well-being. Reinforcing the mental health benefits of physical activity and a healthy sleep schedule for Bellabeat users can lead to a users feeling better about themselves when using their fitness trackers.