目標:把fitbit的每日運動記錄導入到R語言中進行分析,畫出統計圖表來
已有原始數據:fitbit2014年每日的記錄電子表格文件,全部數據點此下載,示例如下:
日期 | 消耗卡路里數 | 步 | 距離 | 攀爬樓層數 | 久坐不動的分鍾數 | 不太活躍分鍾數 | 中度活躍分鍾數 | 非常活躍分鍾數 |
2014年4月27日 | 2736 | 16581 | 11.84 | 7 | 1111 | 131 | 117 | 81 |
2014年4月28日 | 2514 | 12622 | 9.01 | 6 | 910 | 136 | 59 | 76 |
2014年4月29日 | 2231 | 8357 | 5.97 | 9 | 1208 | 129 | 76 | 27 |
2014年4月30日 | 2247 | 7959 | 5.68 | 9 | 1196 | 137 | 83 | 24 |
2014年5月1日 | 2563 | 13014 | 9.29 | 21 | 1107 | 156 | 131 | 46 |
2014年5月2日 | 2376 | 10010 | 7.15 | 17 | 1147 | 164 | 99 | 30 |
2014年5月3日 | 2553 | 13002 | 9.28 | 25 | 1119 | 151 | 120 | 50 |
2014年5月4日 | 2370 | 10090 | 7.23 | 19 | 1173 | 147 | 82 | 38 |
1)轉換xls為csv
首先要把xls電子表格導入,這里用最簡單的辦法,首先將xls另存為csv文件。為了輸入命令方便,把列名都改為了英文。
2)將csv復制到工作目錄中,或設置自己的工作目錄,以讓R環境可以找到相應的文件
將csv放在工作目錄下,也可以用setwd("c:/myfitbit")設置自己的工作目錄
3)導入csv文件到數據框
fitbit <- read.table("fitbit.csv", header=TRUE, sep=",", row.names="date")
也可以直接調用read.csv()函數,可以少填幾個參數選項
4)看看數據的概貌
summary(fitbit)
可以看出每列數據的最小、最大、平均值、中位數等統計信息。
ka step dist floor
Min. :2031 Min. : 0 Min. : 0.000 Min. : 0.00
1st Qu.:2290 1st Qu.: 8593 1st Qu.: 6.135 1st Qu.: 11.00
Median :2408 Median :10515 Median : 7.570 Median : 16.00
Mean :2432 Mean :10152 Mean : 7.274 Mean : 17.35
3rd Qu.:2547 3rd Qu.:12665 3rd Qu.: 9.120 3rd Qu.: 20.00
Max. :3360 Max. :25779 Max. :18.410 Max. :165.00
sit inactive move active
Min. : 829 Min. : 0.0 Min. : 0.00 Min. : 0.00
1st Qu.:1119 1st Qu.:126.0 1st Qu.: 75.00 1st Qu.: 18.50
Median :1159 Median :146.0 Median : 93.00 Median : 37.00
Mean :1170 Mean :137.3 Mean : 91.89 Mean : 37.26
3rd Qu.:1188 3rd Qu.:163.0 3rd Qu.:113.00 3rd Qu.: 51.00
Max. :1440 Max. :238.0 Max. :222.00 Max. :137.00
5)看看數據框的結構,即各列分別是什么類型?
用str函數,str是structure單詞的縮寫。
str(fitbit)
'data.frame': 243 obs. of 8 variables:
$ ka : num 2496 2513 2228 2336 2508 ...
$ step : num 12803 12955 8768 8971 12078 ...
$ dist : num 9.14 9.47 6.31 6.41 9.05 ...
$ floor : int 15 12 16 16 8 20 12 13 13 13 ...
$ sit : num 1161 1188 1234 1140 1153 ...
$ inactive: int 123 112 97 174 130 177 156 121 126 123 ...
$ move : int 98 67 72 113 108 141 99 118 65 73 ...
$ active : int 58 73 37 13 49 61 40 37 47 56 ...
6)畫出每天步數的統計圖
plot(fitbit$step)
要取出某列,可以用$符號。
如果每次都寫上fitbit$太麻煩,就可以用attach(fitbit)把這個數據框的搜索路徑加上,這樣以后就可以輸入step來表示fitbit$step了。
與attach()相對的是detach()函數,為了避免編程錯誤,最好成對出現。
7)看看走的步數與公里數有什么關系?
plot(setp, dist)
可以看出fitbit實際上就是一個非常簡單的算法把步數換算為公里數,什么高級計算也沒有。
8)給圖加上標題
title("fitbit統計圖")
9)用命令的方式將圖形輸出到jpeg文件中
jpeg("a.jpg") #將繪圖送到jpeg圖形文件中
plot(step, dist)
title("fitbit統計圖")
dev.off() #最后要關閉設備
其它命令:dev.new()可以打開一個新的繪圖窗口。dev.next(), dev.prev(), dev.set()...
當然在R交互環境中的圖形上點右鍵,或用R環境的菜單功能,可以隨便復制和輸出圖形。
看看步數的統計分布圖
hist(step)
平均下來每天超過1萬步,有些記錄在fitbit同步時丟失,所以有20多天走了零步。
顯示日期
日期是以"2014年10月28日"這樣的字符串格式記錄的,默認是不轉換為日期型的,需要用as.Date函數轉換一下。
month <- as.Date(row.names(fitbit), "%Y年%m月%d日")
plot(month, step)
這時可以看到水平軸已經顯示的是日期了。
只統計某個月份的數據
如果只統計9月份的數據,需要用到日期處理的函數。
monthData <- fitbit[as.double(format(fitbit$date, "%m"))==9, ]
自動生成統計圖並保存為文件
現在要自動生成fitbit的10月的統計圖,並保存為文件fitbit_month_10.jpg。
m <- 10
jpeg(paste0("fitbit_month_", m, ".jpg"))
monthData <- fitbit[as.double(format(fitbit$date, "%m"))==m, ]
plot(format(monthData$date,"%d"), monthData$step, type="l", xlab="date", ylab="steps", main=paste("2014年",m,"月步數統計圖",sep=""))
dev.off()
分組統計每個月的平均步數
meanMonthStep <- aggregate(fitbit$step, by=list(format(fitbit$date,"%m")), mean)
plot(meanMonthStep,type="b",main="月平均步數", xlab="month", ylab="step")

由於4、5月份的數據同步有故障,丟失了部分數據,所以平均步數偏低。
后來發現用tapply函數也可以得到同樣的結果:
monthStep <- tapply(fitbit$step, format(fitbit$date,"%m"), mean)
實際上tapply將向量分割為組,然后對每組應用指定的函數。
顯示一條平滑曲線
plot(fitbit$date, fitbit$step, type="l")
lines(lowess(fitbit$date, fitbit$step),col="blue")
identify()誤別圖上的點
plot(fitbit$date,fitbit$step,type="p", pch=16,ylim=c(0,30000))
identify(fitbit$date,fitbit$step)
鼠標在圖形上點擊,可以得到點的序號。我這里找了步數最少的兩天,還有走得最多的一天。
查了一下為什么那兩天走得最少?很可能忘了帶計步器!
fitbit[c(96,182,269),c("date","step")]
date step
96 2014-04-06 2285
182 2014-07-24 25779
269 2014-10-19 1633
下面的代碼把12個月的圖畫到一個PDF文件中。
fitbit <- read.csv("fitbit2014.csv") # 一定要轉換為日期類型 fitbit$date <- as.Date(fitbit$date) PlotMonthGraph <- function(m) { monthData <- fitbit[as.double(format(fitbit$date, "%m"))==m, ] plot(format(monthData$date,"%d"), monthData$step, type="l", ylim=c(0,25000), xlab="日期", ylab="步數", main=paste("2014年", m, "月",sep="")) } pdf("fitbit2014年計步數據統計圖.pdf", family='GB1') par(mfrow=c(4,3)) #4行,3列 for(i in 1:12) PlotMonthGraph(i) dev.off() par(mfrow=c(1,1)) png("全年步數統計圖.png") plot(fitbit$date, fitbit$step, type="l", xlab="date", ylab="steps", main="2014年全年步數統計圖") dev.off()