查看原文
其他

个人生活的量化分析(一):时间管理

林筱越 R语言中文社区 2019-04-22

点击蓝字关注这个神奇的公众号~

作者简介

林筱越:华东政法大学 社会学专业 R语言爱好者 


往期回顾:

使用ggplot2绘制心形

定量论文:探究「健康水平、婚姻状况」对幸福感的影响



全文目录:

1.          前言

2.          前期准备

3.          数据预处理

4.          数据可视化部分

5.          结语



1. 前言

在大一下接触了统计学与数据分析之后,就萌生出能否将所学运用到对自己个人生活管理上的想法,即对生活的某些方面进行量化,以便自己能直观的了解到自己的生活情况。不过量化生活最重要的还是自制力,能够经常的记录各类数据,否则也只能是「巧妇难为无米之炊」了。

最开始只是简单的记账,看一看自己平均每个月的开销,找一找花费最多的项(没错,基本都用在了胡吃海喝上:p)。之后就开始找各种习惯养成的计时 app 来记录时间,希望自己能养成一些良好习惯,但是每次记录的数据无法导出,而一个一个敲进 Excel 里又太耗时间,所以没过多久,量化生活的「壮志雄心」就被搁浅了,仅能用来记录并简单查看一下了。

好在过年之前找到了一款名叫 Toggl 的 计时app ,然后马上将以前的记录项目全面迁移到了上面。我正式持续开始记录是从3月份开学的之初,至今可以说积累了两个月的数据,也算是个可以使用的小样本用以练手。(关于 Toggl 的使用可以参考我在少数派上发表的文章:时间量化管理:Toggl的使用(https://sspai.com/post/44349)


2. 前期准备

进入 Toggl 后提前把个人数据导出,其中选择 Detailed 部分筛选好时间后,再点击下方 Export 按钮输出为 CSV 格式即可,这里直接输出3月-4月份数据。

然后为了便于在Rstudio里操作,直接将下载好的数据拖入到工作路径中,并在工作路径里直接读取(或者直接在Rstudio里打开也行):

#读取、并查看数据
library(tidyverse)
data <- read_csv('time_data.csv', col_names = T)
View(data)

在这里我们可以看到格式还是较为规整,并且两个月记录的样本量为601。不过数据包含了一些分析不需要的列,如name、Email等,所以接下来的工作就是需要将我们需要的列挑选出来


3. 数据预处理

3.1 变量筛选

为方便挑选变量,先使用names()函数来查看一下列名,但是这里发现列名都是开头字母为大写(一般我不太喜欢大写,切换太繁琐),所以这里就需要用tolower()将其转化为小写后再筛选。由于我使用的是tidyverse包,所以直接使用select()命令来挑选,这里不直接使用索引来选取的原因有二:

  1. 使用列名虽然多敲了一些字母,但是能确保没有遗漏

  2. 要注意到几个时间的列名,它们当中都包含了空格,所以就需要用「``」符号来引用才能选取成功(注意与单引号区分,这个是键盘上Esc键下面的那个符号)

其次由于项目开始日期和结束日期一致(因为基本不会超过一天),所以二者取其一后删去一个,并用rename()来修改名称;记录的开始和结束时间不纳入分析,因此除去。

最终保留项目、日期、记录时间、标签四个变量用作分析。

##3.1变量筛选
names(data) #查看列名
names(data) <-  tolower(names(data)) #将列名转为小写
time_data <- data %>%
  select(project, `start date`, `start time`,
         `end time`, duration, tags) %>%
  rename(date = `start date`) %>%
  select(project, date, duration, tags)

3.2 变量类型转换

提取出数据后,使用summary()str()两个函数查看一下样本的基本信息,这是可以发现数据类型还是比较简单的,除了 project 和 tags 两个变量是分类变量外,其他变量都是时间变量,因此下一步就是需要对其进行变量的转换。不过好在使用read_csv()读取数据时已经帮我们自动转化,因此就不需要做太多工作,后续如果做绘制分类的图形时再将两个分类变量转为因子即可

##3.2分类变量转换
summary(time_data)
str(time_data)

3.3 缺失值和异常值处理

在做完前两步之后,大家也千万不要忽略了最最重要的一个步骤,查看缺失值和异常值,并对其进行处理;否则分析结果可能会有偏差,这里需要使用sum(is.na(time_data))来查看一下缺失值的数量。

运行之后发现我数据里的缺失值还是蛮多的,查看数据后发现主要是存在一些设定上的问题所以这里处理步骤就是:

  1. 先将「pomodoro-break」标签的观察值,将其 project 赋值为 pomodoro,看是否能减少缺失值数量

  2. 其次,那么就需要删除 project 和 tags 两个都没有的记录;而且 project 为 NA 的记录对应的 tags 也为 NA ,所以直接删除 project 为 NA 时的记录即可

  3. 再者,查看一下 project 和 tags 的频数统计,看看是否能发现一些重合的地方

  4. 删除掉 duration 持续时间小于5分钟的观察值

#查看缺失值数量
sum(is.na(time_data))
#处理缺失值
## project赋值
time_data <- within(time_data, {
  project[tags == 'pomodoro-break'] <- 'pomodoro'
})

## 删除project为NA的记录
time_data<- time_data %>%
  filter(!is.na(project))
## 对分类变量进行频数统计,然后对一些选项进行合并或填补
time_data %>%

 
count(project, tags)
time_data <- within(time_data, {
  tags[project == '锻炼'] <- '锻炼'
  tags[project == '数据分析' & is.na(tags)] <- 'Python'
  tags[project == '学习'& is.na(tags)] <- '社会学'
})

## 删除duration小于5分钟的观察值
time_data <- time_data %>%
  filter(duration>=5)

至此,清洗出 tags 只有11个缺失并且样本量为537的数据集,将其存储好后并命名为「time_data」


4. 数据可视化部分

由于我的电脑操作系统是MacOS,因此中文标签在显示时会出现乱码似的方框(貌似这是R在Mac上的通病),因此需要在主体里手动指定一个字体(详见theme命令部分);Windows系统下就不需要这么做了。

4.1 项目记录次数

  #基本图形
time_data %>%
  count(project) %>%
  ggplot(aes(x=project, y=n, fill=factor(project))) +
  labs(x='记录项目', y='记录次数') +
  geom_bar(stat='identity', show.legend = F) +
 
  #添加频数标签
  geom_text(aes(label = n), hjust = -0.2) +
 
  #设定主题与字体,删减多于的线条
  theme_bw() +
  theme(text = element_text(family = 'STKaiti'),
        panel.grid.minor.x = element_blank(),
        panel.grid.major.x = element_blank()) +
  #转为横向条形图,避免x轴标签重叠
  coord_flip()

  • 从图可以看出,次数最多依次是:学习、番茄钟休息时间、数据分析、锻炼。现在目前正处于考研备考期间,所以每次复习都会记录以提高效率,因此番茄钟相应时间也会较多一些

  • 其次我还遵循着每天「编程1小时」的理念,虽然并不是像程序员那样意义真正的编程,但是敲代码是为了避免自己忘记掉R、MySQL或python的操作

  • 最后每天我还是会准时用Keep锻炼一下,毕竟毛主席说的好:「文明其精神,野蛮其体魄」,备考期间还是需要一个好的身体来支撑!

  • 最后写作和放松时间是前一段时间才开始记录,所以记录的次数相对较少,不过平时貌似也没少放松……(///逃///)

4.2 每日总记录趋势

  #筛选出单独的日期,并计算每天的总记录时间
time_data %>%
  select(date, duration, project) %>%
  group_by(date, project) %>%
  summarise(total = sum(as.numeric(duration)) / 60) %>%
 
  #为了使趋势曲线更明显,给线条加上颜色
  ggplot(aes(x=date, y=total, color = project)) +
  labs(x='日期(3-4月)', y='总共计时(分钟)') +
  geom_line(show.legend = F) +
 
  #将x以「天」为间隔来表示
  scale_x_date(date_breaks = 'day') +
 
  #查看各项目的趋势线
  facet_grid(project~., scales='free_y') +
 
  #调整主题与字体、删除多余线条、调整x轴标签角度与大小等
  theme_bw() +
  theme(text = element_text(family = 'STKaiti'),
        panel.grid.major.x = element_blank(),
        panel.grid.minor.x = element_blank(),
        axis.text.x = element_text(angle = 45, hjust =1,
                                   size=6))

  • 由于duration导入是以时间类型呈现,为了使阅读更方便,对其进行数值型转化(自动转化成秒),因此需要对其进行单位转化后再求和

  • 在使用scale_x_date()函数部分,通过调用参数date_breaks='day'来将日期值以「天」为单位划分分割点

  • 在分面(facet_grid)部分,因为各项目每日记录有长有短,为了更好的呈现每日线条的趋势,就释放图形统一的y轴刻度;使各自项目根据各自的总计时间来进行延展

  • 可以看出每天学习和锻炼的时间基本是保持着持续的趋势,唯独数据分析到后面就断了一段时间……(///捂脸////)

4.3 3-4月项目总计时部分

为了减少代码量,从总数据集中抽取project和duration部分来查看一下每个项目3-4月两个月的计时量

time_duration<- time_data %>%
  select(project, duration) %>%
  group_by(project) %>%
  summarize(mean_duration = mean(as.numeric(duration)) /60,
         total_duration = sum(as.numeric(duration)) /3600)

  • 这里需要注意的是,第一个mean_duration平均记时是转化为分钟,而第二个total_duration总共记时则转化的是小时;虽然二者最后的数值差别不大,但是区别在时间单位的不同。

#创建数值标签
label <- paste(round(time_duration$total_duration, digits = 2), 'h', sep='/')

time_duration%>%
  ggplot(aes(x=project, y= total_duration, fill=factor(project))) +
  geom_bar(show.legend = F, stat='identity') +
  ylim(c(0,150)) +
  labs(x='项目', y='总计时(小时)') +
  geom_text(aes(label = label), hjust = -0.1) +
  theme_bw() +
  theme(text = element_text(family='STKaiti'),
        panel.grid.major.x = element_blank(),
        panel.grid.minor.x = element_blank()) +
  coord_flip()

  • 这部分图形的细节代码与前面类似,就不添加注释,大家可以自行理解

  • 根据数值平均计算一下,在学习上每天2小时左右,数据分析每天0.5小时左右,锻炼每天也大概花了0.4小时;除去每天吃饭休息时间,基本能保持每天4个小时这样是处于专注状态,但这相对来说还是有些少了,还是继续努力吧!

4.4 项目下tag部分

最后来看看一下项目下其他tags分配的时间吧,这里我就选择了「数据分析」作项目来做为收尾部分

  #数据筛选部分
tags_data <- time_data %>%
  filter(project == '数据分析') %>%
  select(duration, tags) %>%
  group_by(tags) %>%
  summarise(trans_duration = sum(as.numeric(duration) / 3600))

  #创建数值标签
tag_label <- paste(round(tags_data$trans_duration, digits = 2), 'h', sep='/')
 
  #作图部分
tags_data %>%
  ggplot(aes(x=tags, y=trans_duration, fill=factor(tags))) +
  geom_bar(stat='identity', show.legend = F) +
  labs(x='标签项', y='平均时间(小时)') +
  geom_text(aes(label = tag_label), vjust = -0.3) +
  theme_bw() +
  theme(text = element_text(family='STKaiti'),
        panel.grid.major.y = element_blank(),
        panel.grid.minor.y = element_blank())


  • 数据分析标签之前没有分的时候我基本上都是用来记录R和MySQL,在数值上可能还是比Python多的

  • 不过让我有点惊艳的是,Python我是前段时间才开始的,不知不觉中系统地学习了大概有10多个小时了;不得不说R的学习起到了极大的帮助,熟悉了R之后学习Python确实容易上手。


5. 结语

虽然说 Toggl 提供了时间管理的可视化功能,但是鉴于能导出数据,还是可以用来开展数据可视化分析的

  • 一方面,可以用来提高自己对R的运用与熟悉程度;另一方面,这次的分析结果也为后面调整自己的学习计划提供了决策依据

  • 不得不说,现在目前置身于大数据时代,充分将「量化」的思维带入个人生活,对于生活、学习甚至是工作上都能带来能审视自身的基础,以便个人能更好地去调解、改进,从而达到不断提高的地步





 大家都在看 

2017年R语言发展报告(国内)

R语言中文社区历史文章整理(作者篇)

R语言中文社区历史文章整理(类型篇)


公众号后台回复关键字即可学习

回复 R                  R语言快速入门及数据挖掘 
回复 Kaggle案例  Kaggle十大案例精讲(连载中)
回复 文本挖掘      手把手教你做文本挖掘
回复 可视化          R语言可视化在商务场景中的应用 
回复 大数据         大数据系列免费视频教程 
回复 量化投资      张丹教你如何用R语言量化投资 
回复 用户画像      京东大数据,揭秘用户画像
回复 数据挖掘     常用数据挖掘算法原理解释与应用
回复 机器学习     人工智能系列之机器学习与实践
回复 爬虫            R语言爬虫实战案例分享

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存