搜尋感興趣的網誌

所有文章連結

2022年2月11日 星期五

Course Study - Bellabeat In R

這是小雷在Google Data Analytic課程中最後一階段的實作項目,隨著實作內容開始增多,現在回頭來看這份分析文件,坦白說會覺得缺少了很多,雖然很不想放上來被恥笑,但這總是一個學習的過程,總是由不會到會,由不熟悉到熟悉,也作為自己每個階段回顧時是否有更進一步的證明,這份分析報告中,都是自己從無到有,有遇到很多奇奇怪怪困難的點,一一的查找資料後慢慢做出來,也找了很多看了很多對於健身的相關文章,剛開始做出來時真的是非常難以言喻的興奮,未來小雷可能會再做一份新的研究報告,但是舊的這份會一直留存,是開始另一個階段自我成長的足跡。

 

這份分析報告有很多地方是需要調整,所以在語法上就不加多做說明,代碼執行結果有很多會跟背景同色,所以就刪除掉,有興趣的朋友可以自行參考或上小雷的Kaggle閱覽~

 

小雷的Kaggle :



案例研究 - Bellabeat

關於Bellabeat :

Urška Sršen 和 Sando Mur 創立了Bellabeat,這是一家生產以健康為重點的智能產品的高科技公司。 Sršen利用她作為藝術家的背景開發設計精美的技術,為世界各地的女性提供信息和啟發,收集有關活動、睡眠、壓力和生殖健康的數據使Bellabeat能夠讓女性了解自己的健康和習慣,自2013年成立以來,Bellabeat發展迅速,並迅速將自己定位為科技驅動的女性健康公司。

分析流程與階段

用戶數據我將選擇Bellabeat的經典Time手錶作為分析主軸

用戶使用數據包含六個流程,從任務問題分析開始、準備與清洗數據、可視化圖示與分析、完整報告

用戶使用數據分析階段

第一階段 - 問題分析(ASK)

Bellabeat的聯合創始人兼首席創意官Urška Sršen
分析智能設備健身數據有助於為公司開啟新的增長機會,以及需要協助於營銷策略的建議。

階段目標有以下三項 :

  1. 確定利益相關者 :
  • 主要利益關係者 : 1.Urška Sršen(Bellabeat 聯合創始人兼首席創意官),2.Sando Mur(數學家、Bellabeat 聯合創始人)
  • 次要利益關係者 : 1.Bellabeat 執行團隊的關鍵成員,2.Bellabeat 營銷分析團隊:一個數據分析師團隊
  1. 需要解決的問題 :
  • 選定的設備如何符合市場趨勢?
  • 了解市場上智能設備的趨勢是甚麼?
  • 了解目前的數據是否有相關限制?
  • 如何蒐集、清洗、組織數據與可視化?
  • 如何存放數據與確認安全性?
  1. 確定業務目標 :
  • 分析數據並了解消費者如何使用Bellabeat產品
  • 數據中的趨勢如何適用Bellabeat的客戶
  • 這些趨勢如何影響Bellabeat的營銷策略

第二階段 - 數據準備(Prepare)

Bellabeat指出特定分析數據集● FitBit Fitness Tracker Data (CC0: Public Domain, dataset made available through Mobius),包含日常活動、步數、心律、睡眠訊息,其餘可依照分析需要添加其他數據

階段目標

  1. 確定數據可信度 :
    該數據集為公開數據cc0,內容包含30位fitbit用戶共18個數據表格,分別為步數、卡路里、活動強度、睡眠分鐘監測,METs、BMI以及整合數據
  2. 確定數據集存放方式 :
  • 數據存放 : MySQL
  • 數據操作語言 : R
  • IDE : RStudio
  1. 數據集中資料選擇 :
    該數據集中共有18個表格,從分數記錄到以天為單位整合,18個數據中的Primary Key數量不同,分析時較不以個人為重點,採以日期作為找尋關聯性作為適用Bellabeat顧客的主要建議

第三階段 - 數據清洗(Process) :

數據檢查後問題如下 :

  1. 五個數據集中日期名稱、格式不一致
  2. bmi數據中缺少身高,Fat欄位意義暫不明確
  3. mest數據中代謝當量於睡眠時約為0.9~1.0,跳繩約為10.0,數據中數值於id = 1503960366,檢查後該id最低 METs值為10
  4. sleep數據中睡眠總時數單位為分鐘,不利於後續分析

清洗與修復程序如下

  • 進行檢查數據與問題紀錄
In [1]:
library(tidyverse)
library(dplyr)
library(tidyr)
library(here)
library(skimr)
library(janitor)
library(lubridate)
  • 載入五個主要數據資料並確認數值正確性、格式、列名一致
In [2]:
activity <- read.csv('../input/fitbit/Fitabase Data 4.12.16-5.12.16/dailyActivity_merged.csv')# 活動合併數據
mets <- read.csv('../input/fitbit/Fitabase Data 4.12.16-5.12.16/minuteMETsNarrow_merged.csv')# 分鐘代謝當量
rate <- read.csv('../input/fitbit/Fitabase Data 4.12.16-5.12.16/heartrate_seconds_merged.csv')# 心跳頻率
bmi <- read.csv('../input/fitbit/Fitabase Data 4.12.16-5.12.16/weightLogInfo_merged.csv')# 權重日誌訊息
sleep <- read.csv('../input/fitbit/Fitabase Data 4.12.16-5.12.16/sleepDay_merged.csv')# 每日睡眠
  • 檢查Primary Key數量
In [3]:
unique(activity$Id)# 33個
unique(mets$Id)# 33個
unique(rate$Id)# 14個
unique(bmi$Id)# 8個
unique(sleep$Id)# 24個
  • 檢查每個表格欄位屬性、名稱、數值
In [4]:
str(activity)
str(mets)
str(rate)
str(bmi)
str(sleep)
  • 檢查原始數據空值
In [5]:
sum(is.na(mets))
sum(is.na(activity))
sum(is.na(rate))
sum(is.na(bmi)) #TURE >> 65na
sum(is.na(sleep))
  • 清洗各表與調整格式
  1. BMI表 : 填補空值、增加身高欄位並回推數值,各名稱欄位一致性調整
In [6]:
bmi <- 
  mutate(bmi, height_m = sqrt(WeightKg/BMI)) %>% 
  mutate(bmi, height_m = round(height_m, digits = 2)) %>% 
  mutate(bmi, BMI = round(BMI, digits = 1))

bmi <-  
  rename(bmi, date = Date) %>% 
  separate(date, into = c("date", "Time"), sep = " ") %>% 
  clean_names()

bmi <- 
  select(bmi, id, date, weight_kg, bmi, height_m)
  1. Activity表 : 各名稱欄位一致性調整,篩選後續要分析的欄位
In [7]:
activity <- 
  rename(activity, date = ActivityDate) %>% 
  separate(date, into = c("date"), sep = " ") %>% 
  clean_names()

activity <- 
  select(activity, 
         -sedentary_active_distance, 
         -logged_activities_distance)
  1. METs表 : 各名稱欄位一致性調整,調整正確的METs數值,並統計數值以天為單位
In [8]:
mets <- 
  rename(mets, date = ActivityMinute) %>% 
  separate(date, into = c("date", "time"), sep = " ") %>% 
  clean_names()

mets <- 
  mutate(mets, mets = (me_ts / 10))

mets <- 
  select(mets, -time, -me_ts) %>% 
  group_by(id, date) %>% 
  summarise(mets = sum(mets))
  1. Heart_Rate表 : 各名稱欄位一致性調整,統計數值
In [9]:
rate <- 
  rename(rate, date = Time) %>% 
  separate(date, into = c("date", "time"), sep = " ") %>% 
  clean_names()

rate <- 
  select(rate, -time)

rate <- 
  group_by(rate, id, date) %>% 
  summarise_all(list(sum, mean))
  1. Sleep表 : 各名稱欄位一致性調整,睡眠數值統計
In [10]:
sleep <- 
  rename(sleep, date = SleepDay, 
         total_sleep_hour = TotalMinutesAsleep) %>% 
  separate(date, into = c("date", "time"), sep = " ") %>% 
  clean_names()

sleep <- select(sleep, -time)

sleep <- 
  mutate(sleep, sleep_hour = (total_sleep_hour / 60), 
         time_in_bed = (total_time_in_bed / 60)) %>% 
  mutate(sleep, sleep_hour = round(sleep_hour, digits = 2), 
         time_in_bed = round(time_in_bed, digits =2))

第四階段 - 數據分析(Analyze) :

進行分析之前讓我們來觀察一下彙總的數據 :

  1. Active
In [11]:
activity %>% 
  summary()
  1. METs
In [12]:
mets %>% 
  summary()
  1. Heart_Rate
In [13]:
rate %>% 
  summary()
  1. BMI
In [14]:
bmi %>% 
  summary()
  1. Sleep
In [15]:
sleep %>% 
  summary()

透過以上的數據彙總,我們發現到幾個有趣的現象 :

  • 用戶睡眠平均時間為6.992/小時,最少0.970/小時,最大為13.270/小時,美國國家睡眠基金會National Sleep Foundation研究指出18~64歲成人平均睡眠建議為7~9小時,壓力、疾病等問題將會影響睡眠品質,睡眠不足時也將產生疲倦(對於健身等活動可能降低時間與強度)、感到飢餓、沮喪與體重增加(可能因陪勞感導致吃的更多)。
  • 心率平均落點於77.33,最高203,最低36,英國心臟醫學期刊於2013年有一項研究指出,心率將影響血壓、體重與血脂,可以透過鍛鍊強化靜息心率(Resting heart rate),每周一小時的高強度有氧訓練可以有效降低RHR。
  • BMI綜合為21~47.5,受測者體重分布差距較大(52.60/kg~133.50/kg),身高範圍也不是只有落在較嬌小的女性(1.52/m~1.83/m)。
  • Steps步數平均為7,638/步,最少0/步,最大36,019/步,依照美國醫學協會(AMA)出版的醫學期刊JAMA NetWork中於2019研究指出每日步數4,400步~7,500步女性死亡率明顯低於2,700步,到7,500步時開始趨於平穩,有別於以往每日要10,000步的條件。

基於以上數據顯示,提供以下的分析建議提供給Bellabeat

  1. 心率將會影響BMI、體重與血脂,可以於智能設被中提示心率數據,以及影響範圍,適當提醒Bellabeat用戶透過較高強度的訓練,強化靜息心率(RHR)降低更多慢性病的可能性。
  2. 可以提醒Bellabeat用戶當睡眠過低時可能造成的影響作即時通知,例如"睡太少瞜~過低的睡眠容易造成疲倦與飢餓,不利於減重的過程"等..。
  3. 步數依照研究的報告可以提醒過低步數的用戶提升較強度的訓練或是輕鬆的增加步數,同時提醒睡眠引起的疲勞,容易精神不濟減少想動的意願。
  4. 卡路里消耗關係,不只是步數,還有強度與時間,這部分可以於應用程序中提醒用戶可以調整哪個部分增加卡路里消耗以提升減重健身的成效。

第五&六階段 - 分享數據可視化&行動建議(Share & Act) :

本階段將數據關聯繪製以下圖表

  • 載入模組與合併數據
In [16]:
library(ggplot2)
bmi_sleep <- merge(bmi, sleep, by = "id")
  • 用戶睡眠時間分布圖 圖示中大部分睡眠集中在5~10小時,低於5個小時的用戶也不在少數(睡太少容易引起焦慮,飢餓等症狀),睡好睡飽提升睡眠質量可以為優先考慮
In [17]:
ggplot(data = sleep, mapping = aes(x = date, y = sleep_hour )) +
  geom_point(aes(color = date)) +
  theme(axis.text.x = element_text(angle = 60)) + 
  xlab("Date") + 
  ylab("Sleep Hour") + 
  labs(title = "Sleep & Day", 
       subtitle = "Daily Sleep Time Distribution", 
       fill = "Date")
  • 用戶步數/卡路里消耗關聯圖
    圖中顯示的關聯性為正,但是在相同步數時,卡路里消耗的數據顯示的範圍很廣,例如 : 10,000步時,消耗的卡路里範圍為1,500~,4500不等,表示步數的影響未必為最後消耗的主因,運動的強度、時間、攝氧量、心率與基礎代謝率都有可能影響卡路里消耗的數量。
In [18]:
ggplot(data = activity) + 
  geom_point(mapping = aes(x = total_steps, 
                           y = calories, 
                           color = date)) + 
  geom_smooth(aes(x = total_steps, 
                  y = calories)) +
  xlab("Total Steps") + 
  ylab("Calories") + 
  labs(title = "Step & Calories", 
       subtitle = "Do More Steps Burn More Calories?", 
       fill = "Date")
`geom_smooth()` using method = 'loess' and formula 'y ~ x'

  • 輕/高強度與卡路里消耗關聯圖
    強度與路里消耗在此張關係圖中就有不童的見解,顏色較淺,形狀較大的色點為消耗量大的卡路里活動,也是步數/卡路里消耗的主因之一
In [19]:
ggplot(data = activity) + 
  geom_point(mapping = aes(x = lightly_active_minutes, 
                           y = very_active_minutes, 
                           color = calories,
                           size = calories)) +
  geom_smooth((aes(x = lightly_active_minutes, 
                   y = very_active_minutes))) + 
  xlab("Lightly Active Min") + 
  ylab("Hightly Active Min") + 
  labs(title = "Lightly & Heightly Active", 
       subtitle = "Differences In Calorie Consumption")
`geom_smooth()` using method = 'loess' and formula 'y ~ x'

  • BMI與睡眠總長的關聯箱型圖
    在圖中發現到關聯的趨勢,正常BMI用戶的睡眠落在7.5/小時上下,BMI到27時,用戶的睡眠時數急遽下降,可能因為疲勞與飢餓造成暴飲暴食,而後BMI攀升時造成所需睡眠時數上升,超過BMI27.4之後,我們發現到睡眠的區間變的震盪,不是睡的過多,就是睡的過少,大大的影響了身體健康
In [20]:
ggplot(data = bmi_sleep) + 
  geom_boxplot(mapping = aes(x = as.factor(bmi), 
                             y = sleep_hour, 
                             fill = as.factor(bmi))) + 
  theme(axis.text.x = element_text(angle = 0)) + 
  xlab("BMI") + 
  ylab("Sleep Hour") + 
  labs(title = "sleep time", 
       subtitle = "sleep time", 
       fill = "BMI")

引用數據與來源網址 :

FitBit Fitness Tracker Data : https://www.kaggle.com/arashnic/fitbit
Mobius : https://www.kaggle.com/arashnic
METs : https://zh.wikipedia.org/wiki/%E4%BB%A3%E8%B0%A2%E5%BD%93%E9%87%8F
National Sleep Foundation : https://www.thensf.org/recommended-amount-of-sleep
Heart : https://heart.bmj.com/
AMA : https://www.ama-assn.org/
JAMA Network : https://jamanetwork.com/

以上就是關於健身用戶數據的分析與建議,感謝您的時間與瀏覽。

其他文章

看看精選文章

納希克房價分析 | Nashik Apartment Price Analyze – 語法解析(上)

  這次 Nashik 的房價分析有上傳至 Kaggle ,有興趣的朋友可以前往閱覽, RMarkdown PDF 報告存放在 Google 雲端,程式碼則是存放於 Github ,照慣例會分享好用的函式語法,雖說基本的 Packages 與語法可能很多人都會完整的閱覽,但是實際...