實踐—簡單數據處理和分析
學習這事,只要認真使勁,就會有所積累。你學會的東西多了,再去學習新的東西就會變得越來越快。然而積累這事,往往是比較漫長的一個過程(至少是一段相對較長的時間)。學習任何技能都不可能一蹴而就的,在學習的前期可能毫無頭緒,也可能毫無進展。可在你學習了一段時間之後,再回去看前期的一些學習你會發現其實變得簡單多了,這就是學習的過程。在學習成長的路上最重要的就是保持耐心,你終將會走到你想要的那個結果。
我在學習數據分析時,前期就是毫無頭緒,毫無進展的。在經過兩個月左右的學習,慢慢的也就熟悉了起來。關鍵是要跟著課程系統的學習,這樣的話,在後期的學習上會經常用到之前學習過的內容,從而起到複習,實踐,打磨所習得的知識(如命令,函數等)。在這一關的學習上,就清晰多了。先是對照著老師的代碼,自己敲一遍,並運行出正確的結果。把用到的命令或函數分為兩類:一是自己學過的;二是新出現沒學過的。然後,再把自己學過的,做進一步的學習以加深理解。對第二類,就要花更多的時間去學習了,把新出現的不會的用筆記本寫下來,之後就一個一個的學習就好了。學習第二類有很多方法,可以聽課程,可以用google,也可以用R中的幫助函數help(),最終學會新函數的使用。
學習不是目的,用起來才是真的。下面就來實踐所習得的知識:「朝陽醫院2016年銷售數據分析」
本次分析目標:朝陽醫院2016年四個業務指標,1、月均消費次數;2、月均消費金額;3、客單價;4、消費趨勢。
朝陽醫院2016年銷售數據為excel表,在這裡我用的是「openxlsx"包讀取數據,使用「openxlsx」包前要下載安裝及載入。
#用「openxlsx"包導入朝陽醫院2016年銷售數據.xlsxinstall.packages("openxlsx")library(openxlsx)readFilePath <- "E:/朝陽醫院2016年銷售數據.xlsx"excelData <- read.xlsx(readFilePath,"Sheet1")
導入數據後,我們要對數據進行預處理,得到符合我們要求和方便我們進行分析的數據數據集。
數據預處理分為五個步驟:1、列名重命名;2、刪除缺失數據;3、處理日期;4、數據類型轉換;5、數據排序。
step1:列名重命名
為了方便編程,我們要把中文列名改為英文,可以使用names()函數重命名列名。
#step1:列名重命名names(excelData) <- c("time","cardno","drugID", "drugName","saleNumber", "virtualmoney","actualmoney")
step2:刪除缺失數據
在任何規模的項目中,數據都會由於各種原因導致數據的不完整。在R中,NA表示缺失值(Not Available,不可用)。函數is.na()可以檢測缺失值是否存在。函數na.omit()可以刪除所有含有缺失數據的行。
「!」為邏輯運算符(表示「非」),「!is.na」則表示「非缺失值」。這裡分析的是銷售數據時間要求不能為缺失值,可以用邏輯運算符!is.na()選出時間為非缺失值的數據。
#step2:刪除缺失數據excelData <- excelData[!is.na(excelData$time),]
step3:日期處理
在做日期處理前要下載安裝「stringr」字元串處理包。使用str_split_fixed()函數將excelData$time字元串拆分為兩列,在重新賦值給excelData$time。由於在分析過程中,需要對日期進行特殊的計算,所以要將字元串類型轉換為日期類型。使用class()函數查看某列的數據類型。這裡可以使用as.Date()函數將字元串類型轉換為日期類型。
#step3:日期處理timeSplit <- str_split_fixed(excelData$time," ",n=2)excelData$time <- timeSplit[,1]#查看數據類型class(excelData$time)#字元串轉換為日期格式excelData$time <- as.Date(excelData$time, "%Y-%m-%d")
step4:數據類型轉換
類型轉換函數,is為判斷,as為轉換。使用as.numeric()函數將字元串轉換為數值類型。
#step4:數據類型轉換#銷售數量excelData$saleNumber <- as.numeric(excelData$saleNumber)#應收金額(打折前的金額)excelData$virtualmoney <- as.numeric(excelData$virtualmoney)#實收金額(打折後的金額)excelData$actualmoney <- as.numeric(excelData$actualmoney)
step5:數據排序
對數據的排序方便我們了解某數據集的更多信息。在R中,可以使用order()函數對數據框進行排序。參數「decreasing=」用於指定升序排序,還是降序排序。
#step5:數據排序#按銷售時間對數據進行升序排序excelData <- excelData[order(excelData$time, decreasing=FALSE),]
到這對數據的預處理已經完成。接下來就是對數據進行分析,完成業務指標任務。
業務指標1:月均消費次數
月均消費次數=總消費次數/月份數。計算總消費次數,這裡用duplicated()函數選出重複的時間和社保卡號(這裡同一天內,同一個人發生的所有消費算作一次消費),用邏輯運算符「!非」來去掉重複的數據,只保留一條。然後用nrow()獲取總消費次數。計算月份數,用天數(day)%/%30(%/%是邏輯運算符,表示整數除法),這裡用最大時間值減最小時間值得出天數(day)。
#業務指標1:月均消費次數kpi1 <- excelData[!duplicated( excelData[,c("time","cardno")] ),]#總消費次數consumeNumber <- nrow(kpi1)#月份數#最小的時間值startTime <- kpi1$time[1]#最大的時間值endTime <- kpi1$time[nrow(kpi1)]#天數day <- as.numeric(endTime - startTime)#月份數month <- day %/% 30#月均消費次數monthConsume <- consumeNumber/monthmonthConsume <- format(round(monthConsume,2),nsmall=2)
業務指標2:月均消費金額
月均消費金額=總消費金額/月份數。這裡用sum()函數計算某一列數值的總和,用參數「na.rm=」來移除缺失值,這裡只計算有數值的數據。月份數上一指標已算出。
#業務指標2:月均消費金額totalMoney <- sum(excelData$actualmoney,na.rm=TRUE)monthMoney <- totalMoney / month
業務指標3:客單價
客單價=總消費金額/總消費次數,總消費金額和總消費次數前兩個指標已算出,所以直接計算即可。
#業務指標3:客單價pct <- totalMoney / consumeNumberpct <- format(round(pct,2),nsmall=2)
業務指標4:消費趨勢曲線圖
繪製按每周為單位的消費金額曲線圖。由於醫院給出的數據為每天的消費金額,所以我們計算出每周的消費金額。這裡用函數tapply()對time和actualmoney列分組得到一個二維數組,並用sum計算出每周消費金額,然後用as.data.frame.table()函數將二維數組轉換為數據框,最後用plot()繪製每周消費趨勢曲線圖。
#業務指標4:消費趨勢曲線圖week <- tapply(excelData$actualmoney, format(excelData$time,"%Y-%U"),sum)week <- as.data.frame.table(week)names(week) <- c("time","actualmoney")week$time <- as.character(week$time)week$timeNumber <- c(1:nrow(week))plot(week$timeNumber,week$actualmoney, xlab= "時間(年份-第幾周)", ylab="消費金額", xaxt="n", main="2016年朝陽醫院消費曲線", col="red", col.main="blue", type="b")axis(1,at=week$timeNumber,labels=week$time,cex.axis=1.5)
模仿著自己做一遍,會對整個分析過程有個了解。有了這樣一種思路,就要多實踐,實踐多了就自然的熟悉了。刻意練習永遠是必要的,刻意練習也只能是自己完成的,也只有刻意練習才會使人真正的成長。
推薦閱讀:
※2017年3D列印行業大數據報告,3D列印品牌數據分析
※數據可視化之我在人大單身四年的原因
※Kaggle模式可以複製嗎?
※當excel不夠用時,如何利用Access進行數據分析?
※解讀《大數據下的數據分析平台架構》