在当今世界,几乎每个设备都内置了某种逻辑系统,用于产生和存储数据。数据本身并无价值,直到从中提取出有意义的见解。虽然并非每次洞察都能产生价值,但作为分析师,可以尝试。今天,选择了一个来自数据收集巨头公司Google的产品——Fit。Fit应用是一个健康追踪应用,它可以估计步数、燃烧的卡路里、心率等,无需任何外部健身设备。个人使用过Mi Band 3和Fit应用,两者的结果几乎相同。也可以将任何外部追踪设备与Fit应用同步。
Google在用户同意的情况下收集了大量数据,但曾经访问过这些数据吗?让指导如何下载Google Fit数据,并分析Fit应用收集的健身数据。
这是一个非常简单的过程。Google使得访问和下载数据变得非常容易。只需按照以下步骤操作:
现在已经获得了潜在的数据集,让深入探索。一旦打开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'