Spring tracks daily hydration and sends regular reminders to help establish a healthy hydration habit. It calculates the optimal amount of water for the body based on the activity level, age, height, weight, local weather and if pregnant or breastfeeding.
In this generation when health and fitness is becoming a growing trend, having a smart gadget and application makes it easier for the user to track their daily progress. Now, smart water bottles are becoming a necessity as it enables the user to track their daily water intake and hit their target through connecting with the fitness applications. A recent report from Market Research Blog indicated that the smart water bottle market is expected to expand at a CAGR of approximately ~11% through 2031. link
• Analyze trends of another smart device data to gain insights on non-Bellabeat consumers • Apply the trends on Bellabeat users • Provide marketing strategy/high-level recommendations from using and analyzing dataset to provide insight on marketing strategy for Spring in the growing Smart Water Bottle Market
• Urška Sršen: Bellabeat’s cofounder and Chief Creative Officer • Sando Mur: Bellabeat’s cofounder • Marketing Analytics Team
Factors found that has an impact on the analysis:
Created a new data set for bottle comparison and gathered data based on other best smart water bottles to help with comparison based on Cosmopolitan Magazinelink and load the same in R (Smartwaterbottles_comparison.csv)
Prices on the smart water bottle products are based on the websites linked (prices may vary according to third party vendors) Bellabeat Larq Hidratespark CrazyCap Icewater JosephJosephThermos Monos
Downloaded the package from FitBit Fitness Tracker Data in Kaggle link and loaded in R for data cleaning and organizing. I chose R as it would enable me to get more familiar with the language.
install.packages("tidyverse")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.1'
## (as 'lib' is unspecified)
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✓ ggplot2 3.3.5 ✓ purrr 0.3.4
## ✓ tibble 3.1.6 ✓ dplyr 1.0.8
## ✓ tidyr 1.2.0 ✓ stringr 1.4.0
## ✓ readr 2.1.2 ✓ forcats 0.5.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
install.packages("ggplot2")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.1'
## (as 'lib' is unspecified)
library(ggplot2)
install.packages("lubridate")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.1'
## (as 'lib' is unspecified)
library(lubridate)
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
install.packages("dplyr")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.1'
## (as 'lib' is unspecified)
library(dplyr)
install.packages("tidyr")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.1'
## (as 'lib' is unspecified)
library(tidyr)
After viewing the data sets, I have determined to use the following .csv files for my analysis:
daily_activity <- read_csv("/cloud/project/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.
sleep_record <- read_csv("/cloud/project/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.
bottles_compare <- read_csv("/cloud/project/Fitabase Data 4.12.16-5.12.16/Smartwaterbottles_comparison.csv")
## Rows: 13 Columns: 12
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (7): Company, Product, Size_Available, Weight_Size2_Gram, Materials, Col...
## dbl (5): Size_Volume1_ML, Price_Size1, Weight_Size1_Gram, Size_Volume2_ML, P...
##
## ℹ 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.
Found that the ActivityDate column in daily_activity and SleepDay in sleep_record to right Date Format
daily_activity$ActivityDate <- as.Date(daily_activity$ActivityDate,format='%m/%d/%Y')
sleep_record$SleepDay <- as.Date(sleep_record$SleepDay,format='%m/%d/%Y')
Identified the Number of participants in tables
daily_activity: 33 sleep_: 24
According to this the number of participants in both tables are not the same. Hence, this will impact the analysis we will be making to obtain an insight.
n_distinct(daily_activity$Id)
## [1] 33
n_distinct(sleep_record$Id)
## [1] 24
I wanted to find out on the average time these participants spend based on the Activity Intensity. I used the different categories of Activity Intensity from daily_activity data set and obtained the average number of minutes under each category. With this we can find out activity levels of the users.
daily_activity %>%
select(VeryActiveMinutes,FairlyActiveMinutes, LightlyActiveMinutes,SedentaryMinutes)%>%
summary()
## VeryActiveMinutes FairlyActiveMinutes LightlyActiveMinutes SedentaryMinutes
## Min. : 0.00 Min. : 0.00 Min. : 0.0 Min. : 0.0
## 1st Qu.: 0.00 1st Qu.: 0.00 1st Qu.:127.0 1st Qu.: 729.8
## Median : 4.00 Median : 6.00 Median :199.0 Median :1057.5
## Mean : 21.16 Mean : 13.56 Mean :192.8 Mean : 991.2
## 3rd Qu.: 32.00 3rd Qu.: 19.00 3rd Qu.:264.0 3rd Qu.:1229.5
## Max. :210.00 Max. :143.00 Max. :518.0 Max. :1440.0
active.min <-data.frame(
Activity_Intensity = c("Very Active","Fairly Active","Lightly Active","Sedentary"),
Average_Minutes = c(21, 13.56,192.8,991.2))
head(active.min)
## Activity_Intensity Average_Minutes
## 1 Very Active 21.00
## 2 Fairly Active 13.56
## 3 Lightly Active 192.80
## 4 Sedentary 991.20
ggplot(data = active.min, aes(x= Activity_Intensity, label = 'Activity Intensity', y = Average_Minutes, fill = Activity_Intensity)) +
geom_bar(stat = 'identity', width= .8) +
theme(axis.text.x=element_text(angle=45,hjust=1,vjust=1, size = 9), legend.position = "none")+
geom_text(aes(label=Average_Minutes), position=position_dodge(width=0.5), vjust=-0.25) +
labs(x = "Activity Intensity", y = "Average Minutes")
As we can see in this chart, majority of the users activity is mostly Sedentiary with an average of 16.52 hours, while we cannot determine the activity performed for the other categories, there is a fair amount of users who are Lighty Active with average of 3.2 hours. From these, we can assume that the users are not performing high intensity activities.
Dehydration affect’s a person’s energy levels, mood and mental performance. Hence, we can encourage the users to have good body hydration level by drinking more water to prevent any adverse effect on the body and mind.
Next I needed to obtain the data about the sleeping habits of the users, as a medical study conducted that hydration affects sleep. I took the average time the participants spent asleep or just in their bed.
sleep_record %>%
select(TotalSleepRecords,TotalMinutesAsleep,TotalTimeInBed) %>%
summary()
## TotalSleepRecords TotalMinutesAsleep TotalTimeInBed
## Min. :1.000 Min. : 58.0 Min. : 61.0
## 1st Qu.:1.000 1st Qu.:361.0 1st Qu.:403.0
## Median :1.000 Median :433.0 Median :463.0
## Mean :1.119 Mean :419.5 Mean :458.6
## 3rd Qu.:1.000 3rd Qu.:490.0 3rd Qu.:526.0
## Max. :3.000 Max. :796.0 Max. :961.0
sleep.summary <- data.frame (
Asleep_InBed = c("Asleep", "In Bed"),
Average_Time = c(419.5, 458.6))
ggplot(data=sleep.summary, aes(x=Asleep_InBed, y=Average_Time, fill = Asleep_InBed))+
geom_bar(stat = 'identity', width= .8) +
geom_text(aes(label=Average_Time), position=position_dodge(width=0.5), vjust=-0.25) +
theme(legend.position = "none")+
labs(x = "In Bed or Asleep", y = "Average Time in Minutes")
According to this chart, majority of the users have spent an average of 7.64 hours being in bed, which is more than compared to the the average time of 6.99 hours they are asleep. Although there is a minor difference, this should still be considered to figure as to what keeps them in bed rather than having their full sleep.
According to research, link “Dehydration may create barriers to sleep, and insufficient sleep may increase the chances of being dehydrated. At the same time, too much fluid intake can cause excess urination that may lead to sleep interruptions.” Hence, we can encourage the users to keep right level of hydration that would promote a good sleeping habit.
I did a comparison on the aesthetics, price and features of other smart water bottles available in the market from Cosmopolitan Magazinelink and load the same in R (Smartwaterbottles_comparison.csv))
Noting that some of these products have other sizes available, I have compared Spring according to the smallest size the products have.
view(bottles_compare)
ggplot(bottles_compare, aes(y = Product, x = Price_Size1, fill = Price_Size1)) +
geom_bar(stat = 'identity', width= .8) +
theme(legend.position = "none")+
geom_text(aes(label= Price_Size1), position=position_dodge(width= 1.5),hjust=-0.2, vjust=0.5)+
labs(x = "Price in US$", y = "Product")
## Warning: position_dodge requires non-overlapping x intervals
According to this chart, Spring can be considered in the high end range as compared to the other competitors whose products have the same concept of hydration tracking.
ggplot(bottles_compare, aes(y = Product, x = Size_Volume1_ML, fill = Size_Volume1_ML)) +
geom_bar(stat = 'identity', width= .7) +
theme(legend.position = "none")+
geom_text(aes(label= Size_Volume1_ML), position=position_dodge(width=0.3),hjust= -0.02, vjust=0.5) +
labs(y = "Product", x = "Volume in ML")
Volume is converted from OZ to ML
Based on this data, there are other smart water bottles that have more volume compared to Spring at a lesser cost. Hence, a potential customer, may incline on buying a product with the same functions with a bigger volume at a lesser cost.
ggplot(bottles_compare, aes(y = Product, x = Weight_Size1_Gram, fill = Weight_Size1_Gram)) +
geom_bar(stat = 'identity', width= .7) +
theme(legend.position = "none")+
geom_text(aes(label= Weight_Size1_Gram), position=position_dodge(width=0.3),hjust= -0.02, vjust=0.5) +
labs(y = "Product", x = "Weight in Grams")
According to the chart, Spring is on the heavier end in weight compared to other smart water bottles in the market. Usually, customers would want a lighter but sturdy bottle to carry around with them without the feeling of being weight down in the hand or in their bags.
select(bottles_compare, Product, Size_Available, Colour_Options,Self_Cleaning, Materials)
## # A tibble: 13 × 5
## Product Size_Available Colour_Options Self_Cleaning Materials
## <chr> <chr> <chr> <chr> <chr>
## 1 Spring No No No Glass, S…
## 2 Bottle PureVis Yes Yes Yes Stainles…
## 3 Bottle Movement PureVis Yes Yes Yes Stainles…
## 4 HidrateSpark PRO - CHUG Yes Yes No Stainles…
## 5 HidrateSpark 3 No Yes No Plastic,…
## 6 HidrateSpark TAP - CHU… No Yes No Stainles…
## 7 HidrateSpark TAP - CHU… Yes Yes No Plastic,…
## 8 CrazyCap 2 - TEAK WOOD Yes Yes Yes Stainles…
## 9 Smart Lid - Smoke Black No Yes No Tritan
## 10 Smart Lid - Teal No Yes No Tritan
## 11 3-in-1 Smart Water Bot… No Yes No Plastic
## 12 Dot Water Bottle No Yes No Plastic
## 13 Kiyo UVC Bottle No Yes Yes Tritan, …
Comparing to other products, Spring has only one colour to choose from as compared to other brands. Some people, may not have this colour as preference and would like to be able to pick the colour they prefer to carry around with them or according to their mood.
Other products have other Volume sizes available so the customers can have the option of choosing the size that they feel would best suit their lifestyle.
There are other customers who are conscious of the material build of the water bottles - for quality, strength, design, harmfulness.
While Spring is made out of glass body and silicone cover for grip, there is a tendency of glass breakage when dropped. Therefore, it will not be very economical for a user to purchase. Other products are made out of stainless steel and insulation features that can keep their water cold for hours and very sturdy when dropped. While some are made of Tritan/BPA free plastic and fairly sturdy to breakage, some people are not comfortable in reusing these bottles as it is still considered “plastic”. Other products also have a Self Cleaning feature - which uses UV to sterilize the water - another benefit that may appeal other users.
Based on the analysis, Bellabeat can expand the target audience of Spring product. By using their intensive marketing advertisements appropriately through eye catching ads on the new features of Bellabeat that would fit everyone’s lifestyle.
The main target audience of Bellabeat products are women, however, it is possible to expand to appeal to other gender specturum.
If Bellabeat is to keep the same design and materials, they should consider to provide more colour options to choose from or colour options to interchange the grip colours according to the mood of the user.
Consider updating size options, material build option for convenience, and extra features like insulation, self cleaning cleaning while keeping costs competitive.
Based on the analysis, we can correlate on how dehydration can affect a person’s everyday habits, mood, physical and mental performance. Making Spring a more appealing product to health conscious audiences.
On the day, the app can send unique notifications encouraging users through the benefit of keeping the right body hydration levels. Unique notification such as designed pop-ups with words of encouragements, checking on how they feel with options, did you know? information related to hydration and body.
Promoting good sleeping habits by sending notification to the user on when the last water in take should be prior to bed time to improve sleep.
Based on the data sets and limitations with the data available, it is difficult to produce a better analysis to the business tasks to be solved.
However, based on the available data, these are the recommendations to expand their target audience in the growing smart water bottles market.