Google Fit数据分析与可视化

在当今世界,几乎每个设备都内置了某种逻辑系统,用于产生和存储数据。数据本身并无价值,直到从中提取出有意义的见解。虽然并非每次洞察都能产生价值,但作为分析师,可以尝试。今天,选择了一个来自数据收集巨头公司Google的产品——Fit。Fit应用是一个健康追踪应用,它可以估计步数、燃烧的卡路里、心率等,无需任何外部健身设备。个人使用过Mi Band 3和Fit应用,两者的结果几乎相同。也可以将任何外部追踪设备与Fit应用同步。

Google在用户同意的情况下收集了大量数据,但曾经访问过这些数据吗?让指导如何下载Google Fit数据,并分析Fit应用收集的健身数据。

从Google Fit获取数据进行分析

这是一个非常简单的过程。Google使得访问和下载数据变得非常容易。只需按照以下步骤操作:

  1. 访问。
  2. 点击“deselect all”,因为不想下载所有数据,只对特定应用数据感兴趣。
  3. 向下滚动,会看到所有服务的列表,从中选择Fit。
  4. 滚动到底部并点击下一步。在第二步中,保持默认设置,然后点击创建导出。可以根据用例定制数据频率,例如每月导出2个月的数据。
  5. 将很快收到一封邮件,这取决于数据量。通常,邮件包含下载数据的链接需要5-10分钟。可能需要再次进行身份验证(出于安全原因),之后数据将被下载。

准备数据进行分析

现在已经获得了潜在的数据集,让深入探索。一旦打开zip文件,将有一个Takeout文件夹,里面有一个名为Fit的文件夹,里面有4个子文件夹。只对“Daily activity metrics”感兴趣,因为“Activities”文件夹包含.tcx文件,这些是健身追踪器用来共享追踪信息的标准XML文件。不深入探讨计数是如何测量的,只对最终值感兴趣。在“Daily activity metrics”文件夹中,会发现从安装这个应用的日期起的多个CSV文件。每个数据文件包含特定日期的小时统计数据:

仍然对这些文件不感兴趣,因为它们数量庞大!数据从2018年3月到现在!这就是为什么将使用这个文件夹中的最后一个文件,“Daily activity metrics.csv”,它包含按日期记录的锻炼数据。让加载这个文件并探索这个文件中的各个列:

df.drop(['Average weight (kg)', 'Max weight (kg)', 'Min weight (kg)', 'Average heart rate (bpm)', 'Min heart rate (bpm)', 'Max heart rate (bpm)'], inplace=True, axis=1)

接下来,将提取所有的日期、月份、星期几和年份。可以手动通过创建一个自定义函数来分割日期的连字符(-),然后检查月份和相应的年份,有一个公式和过程,但pandas模块通过提供抽象函数使更容易直接获得结果。记住在读取CSV时启用了parse_dates=True吗?这样做是有目的的,这样可以将这些日期转换为日期时间pandas格式,这为提供了访问方法。这就是将如何访问和存储这些数据:

df["workoutMonth"] = df.index.month_name() df["workoutWeekDay"] = df.index.day_name() df["workoutYear"] = df.index.year

现在数据已经准备好了,是时候进行一些绘图了!

绘制数据

绘图和可视化是最喜欢的部分。它允许清晰地展示数据的趋势,并尝试以图表、图形、编号轴或类别的部分形式总结数据。选择了Plotly作为绘图库。这个库允许以最小的努力创建交互式图表。这些图表之所以交互式,是因为JavaScript集成,但不需要知道后端部分。这个语法非常类似于现有的库,如matplotlib和seaborn,它们也可以产生图表,但它们是静态的,用户不能与它们互动。

import plotly.express as px import plotly.graph_objects as go

让开始探索一些常见的问题:

df = df[df["Step count"] > 2000]

1. 基于月份进行的锻炼次数是多少?

temp1 = df.workoutMonth.value_counts() months = ('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December') month_value = tuple(temp1[i] for i in months) fig = px.bar(temp1, x=months, y=month_value, color=month_value, text=month_value, color_continuous_scale='Rainbow', labels={'color':''}) fig.update_layout(title="Count of Workout in Each Month from 2018 to present", xaxis_title='Month', yaxis_title='Number of Workouts', xaxis_tickangle=-40, yaxis={'visible': False, 'showticklabels': False}, font=dict(size=15)) fig.show()

2. 基于工作日进行的锻炼次数是多少?

temp2 = df.workoutWeekDay.value_counts() months = ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday') month_value = tuple(temp2[i] for i in months) fig = px.bar(temp2, x=months, y=month_value, color=month_value, text=month_value, color_continuous_scale='Rainbow', labels={'color':''}) fig.update_layout(title="Count of Workout in Each Week Day from 2018 to present", xaxis_title='Week Day', yaxis_title='Number of Workouts', xaxis_tickangle=-40, yaxis={'visible': False, 'showticklabels': False}, font=dict(size=15)) fig.show()

3. 每年的锻炼分布如何?

temp3 = df.workoutYear.value_counts() fig = go.Figure(data=[go.Pie(labels=temp3.index, values=temp3.values, textinfo='label+percent', pull=[0, 0, 0, 0.2], title="Year's Contribution to Total Workouts")]) fig.update_traces(hoverinfo='label+value', textfont_size=15, marker=dict(line=dict(color='#eff542', width=2)), showlegend=False) fig.update_layout(font=dict(size=15)) fig.show();

4. 以移动分钟为单位的活动是什么?

fig = px.line(df["Move Minutes count"]) fig.update_layout(title="Move Minutes Line Chart", yaxis_title='Move Minutes', xaxis_tickangle=-40, font=dict(size=15), showlegend=False) fig.show()

5. 哪个月对移动分钟的贡献最大?

temp3 = df.groupby("workoutMonth")['Move Minutes count'].sum() months = ('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December') month_value = tuple(temp3[i] for i in months) fig = px.bar(temp3, x=months, y=month_value, color=month_value, text=month_value, color_continuous_scale='Rainbow', labels={'color':''}) fig.update_layout(title="Moving Minutes Per Month", xaxis_title='Month', yaxis_title='Moving Minutes', xaxis_tickangle=-40, yaxis={'visible': False, 'showticklabels': False}, font=dict(size=15)) fig.show()

6. 步数图表看起来如何?

fig = px.line(df["Step count"].rolling(window=7).mean()) fig.update_layout(title="Step Count Line Chart", yaxis_title='Steps', xaxis_tickangle=-40, font=dict(size=15), showlegend=False) fig.show() fig.layout.template = 'plotly_dark'
  • LinkedIn –
  • Twitter –
  • GitHub –
  • Medium –
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485