事業タスク

実際にスマートデバイスを使用しているユーザーの行動データに基づき、使用頻度が高いアクティビティを見つけ、そのユーザー層に向けたマーケティング提案を行う。

使用データに関する情報

Mobius より公開されているパブリックドメイン(CC0)のデータセット FitBit Fitness Tracker Data を使用。

この Kaggle のデータセットには、30 人の Fitbit ユーザーの個人的なフィットネストラッカーに関するデータが含まれています。 ここでは 30 人の Fitbit ユーザーの同意のもとに提出された、活動量や心拍数、睡眠モニタリングなどの分単位での出力を含む個人トラッカーデータが閲覧できます。 一日の活動量や歩数、心拍数などの情報が含まれており、ユーザーの習慣を探るために活用できます。

データ操作について

取得したデータ内容を確認し、データを変換します。

一般的なパッケージやライブラリのインストールと読み込み

分析を始めてから別のパッケージが必要になることがあるので、その都度パッケージをインストールし、読み込みます。すでにこれらのパッケージをインストールして読み込んでいる場合は、スキップすることもできますし、特定の行だけを実行することもできます。実行には少し時間がかかる場合があります。

install.packages('tidyverse', repos = "https://ftp.yz.yamagata-u.ac.jp/pub/cran/")
##  パッケージを 'C:/Users/mixja/AppData/Local/R/win-library/4.3' 中にインストールします 
##  ('lib' が指定されていないため)
##  パッケージ 'tidyverse' は無事に展開され、MD5 サムもチェックされました 
## 
##  ダウンロードされたパッケージは、以下にあります 
##      C:\Users\mixja\AppData\Local\Temp\RtmpY5uG4t\downloaded_packages
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.2     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.4.2     ✔ tibble    3.2.1
## ✔ lubridate 1.9.2     ✔ tidyr     1.3.0
## ✔ purrr     1.0.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

CSV ファイルの読み込み

ここでは、’daily_activity’という名前のデータフレームを作成し、データセットからCSVファイルを読み込むことにします。

daily_activity <- read.csv("dailyActivity_merged.csv")

sleep_day用に別のデータフレームを作成することにします。

sleep_day <- read.csv("sleepDay_merged.csv")

各テーブルを調査します

daily_activityのデータを見てみます。

head(daily_activity)
##           Id ActivityDate TotalSteps TotalDistance TrackerDistance
## 1 1503960366    4/12/2016      13162          8.50            8.50
## 2 1503960366    4/13/2016      10735          6.97            6.97
## 3 1503960366    4/14/2016      10460          6.74            6.74
## 4 1503960366    4/15/2016       9762          6.28            6.28
## 5 1503960366    4/16/2016      12669          8.16            8.16
## 6 1503960366    4/17/2016       9705          6.48            6.48
##   LoggedActivitiesDistance VeryActiveDistance ModeratelyActiveDistance
## 1                        0               1.88                     0.55
## 2                        0               1.57                     0.69
## 3                        0               2.44                     0.40
## 4                        0               2.14                     1.26
## 5                        0               2.71                     0.41
## 6                        0               3.19                     0.78
##   LightActiveDistance SedentaryActiveDistance VeryActiveMinutes
## 1                6.06                       0                25
## 2                4.71                       0                21
## 3                3.91                       0                30
## 4                2.83                       0                29
## 5                5.04                       0                36
## 6                2.51                       0                38
##   FairlyActiveMinutes LightlyActiveMinutes SedentaryMinutes Calories
## 1                  13                  328              728     1985
## 2                  19                  217              776     1797
## 3                  11                  181             1218     1776
## 4                  34                  209              726     1745
## 5                  10                  221              773     1863
## 6                  20                  164              539     1728

daily_activityデータ内の全てのcolumnを確認します。

colnames(daily_activity)
##  [1] "Id"                       "ActivityDate"            
##  [3] "TotalSteps"               "TotalDistance"           
##  [5] "TrackerDistance"          "LoggedActivitiesDistance"
##  [7] "VeryActiveDistance"       "ModeratelyActiveDistance"
##  [9] "LightActiveDistance"      "SedentaryActiveDistance" 
## [11] "VeryActiveMinutes"        "FairlyActiveMinutes"     
## [13] "LightlyActiveMinutes"     "SedentaryMinutes"        
## [15] "Calories"

sleep_dayのデータを見てみます。

head(sleep_day)
##           Id              SleepDay TotalSleepRecords TotalMinutesAsleep
## 1 1503960366 4/12/2016 12:00:00 AM                 1                327
## 2 1503960366 4/13/2016 12:00:00 AM                 2                384
## 3 1503960366 4/15/2016 12:00:00 AM                 1                412
## 4 1503960366 4/16/2016 12:00:00 AM                 2                340
## 5 1503960366 4/17/2016 12:00:00 AM                 1                700
## 6 1503960366 4/19/2016 12:00:00 AM                 1                304
##   TotalTimeInBed
## 1            346
## 2            407
## 3            442
## 4            367
## 5            712
## 6            320

sleep_dayデータ内の全てのcolumnを特定します。

colnames(sleep_day)
## [1] "Id"                 "SleepDay"           "TotalSleepRecords" 
## [4] "TotalMinutesAsleep" "TotalTimeInBed"

両方のデータセットに「Id」フィールドがあります。このフィールドでデータセットをマージします。

要約統計を理解します。

それぞれのデータフレームには、何人の被験者がいるか確認します。

n_distinct(daily_activity$Id)
## [1] 33
n_distinct(sleep_day$Id)
## [1] 24

daily_activity データセットには、sleep_dayデータセットよりも多くの被験者がいるように見えます。

各データフレームにはいくつの観測値があるか確認します。

nrow(daily_activity)
## [1] 940
nrow(sleep_day)
## [1] 413

各データフレームについての簡単な要約統計を確認します。

日次活動データフレーム :

daily_activity %>%  
  select(TotalSteps,
         TotalDistance,
         Calories,
         SedentaryMinutes) %>%
  summary()
##    TotalSteps    TotalDistance       Calories    SedentaryMinutes
##  Min.   :    0   Min.   : 0.000   Min.   :   0   Min.   :   0.0  
##  1st Qu.: 3790   1st Qu.: 2.620   1st Qu.:1828   1st Qu.: 729.8  
##  Median : 7406   Median : 5.245   Median :2134   Median :1057.5  
##  Mean   : 7638   Mean   : 5.490   Mean   :2304   Mean   : 991.2  
##  3rd Qu.:10727   3rd Qu.: 7.713   3rd Qu.:2793   3rd Qu.:1229.5  
##  Max.   :36019   Max.   :28.030   Max.   :4900   Max.   :1440.0

睡眠データフレーム:

sleep_day %>%  
  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

プロットして調査します

1 日の歩数と消費カロリーの関係を確認します。

ggplot(data=daily_activity, aes(x=TotalSteps, y=Calories,color=Id)) + geom_point() 

睡眠時間(分)とベッドにいる時間との関係を確認します。

ggplot(data=sleep_day, aes(x=TotalMinutesAsleep, y=TotalTimeInBed,color=Id)) + geom_point()

この2つのデータセットをマージします

combined_data <- merge(sleep_day, daily_activity, by="Id")

このデータセットの被験者数を見てみます。

n_distinct(combined_data$Id)
## [1] 24

次に歩数と睡眠時間の関係を確認します。

ggplot(data=combined_data, aes(x=TotalSteps, y=TotalMinutesAsleep)) + geom_smooth()
## `geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'

分析結果のサマリー

上記分析により、以下の傾向が見つけられます。

分析結果に基づく提案

1 日の歩数と消費カロリーの関係は、ダイエットを考えているユーザー層が、よりもっと歩くようにするために bellabeat のスマートデバイスを使用する動機づけとして提案が可能です。

上記歩数と消費カロリーに加え、一定期間における体重変化に関するデータを更に調査することにより、より根拠があるスマートデバイス製品およびアプリの使用提案が可能になります。

また、1日に5,000歩~10,000歩の範囲で歩くユーザーは、歩数に反比例して睡眠時間が短くなる傾向にあります。

歩く人は、より少ない睡眠時間で有効な活動を行えるという仮説が立てられるので、効率的な睡眠と歩数の関連をさらに調査することにより、睡眠と運動や体重を紐づけてマーケティングを行うことが可能になると考えます。