実際にスマートデバイスを使用しているユーザーの行動データに基づき、使用頻度が高いアクティビティを見つけ、そのユーザー層に向けたマーケティング提案を行う。
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
ここでは、’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()
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歩の範囲で歩くユーザーは、歩数に反比例して睡眠時間が短くなる傾向にあります。
歩く人は、より少ない睡眠時間で有効な活動を行えるという仮説が立てられるので、効率的な睡眠と歩数の関連をさらに調査することにより、睡眠と運動や体重を紐づけてマーケティングを行うことが可能になると考えます。