Excel~R~Analysis

作者: 胡阿白 | 来源:发表于2017-02-02 20:17 被阅读124次

    目标:对给定的Excel数据表里的数据进行简单处理,解答相关问题。

    源数据:朝阳医院2016年销售数据.xlsx

    问题:根据表格数据得出

    1.月均消费次数(注:同一天内,同一个人发生的所有消费算作一次消费 月消费次数=总消费次数/月数)

    2.月均消费金额(注:同一天内,同一个人发生的所有消费算作一次消费 月消费金额=总消费金额/月数)

    3.客单价(客单价=总消费金额/总消费次数)

    4.消费趋势(周-消费金额曲线)

    R的解决方案:

    Step1:读取源数据

    在RStudio中,可以采用多种方法导入源数据,在导入过程中,最值得注意的是“如何正确输入源数据路径”这一问题。我在具体实践中发现,由于原数据文件的命名为中文模式“朝阳医院2016年销售数据”,导入时系统总提示路径过长,于是将其重命名为长度较短的英文名称,例如“data”。果然顺利导入:

    脚本中输入

    Sell_data <- read_excel("C:/Users/Administrator/Desktop/data.xlsx")

    View(Sell_data)

    显示:

    没有乱码,显示正常。

    Step 2:数据预处理

    数据预处理是一个重要的步骤,原始数据经过预处理(列名重命名、缺失数据剔除、日期处理、数据类型转换以及数据排序)才能更为有效地进行数据分析工作。

    列名重命名   首先,为了编码的正常进行,对中文模式的项目名称进行英文重命名,即将表中的“购药时间、社保卡号、商品编码、商品名称、销售数量、应收金额以及实收金额”重命名为“"Time"、"Cardno"、DrugID"、"DrugName"、"SaleNumber"、"Virtualmoney"以及"Actualmoney"。

    脚本编码如下:

    #rename

    names(Sell_data) <- c("Time","Cardno",

    "DrugID","DrugName",

    "SaleNumber","Virtualmoney",

    "Actualmoney")

    如图所示,命名成功:

    缺失数据剔除   在药物销售表格中,最常见的缺失数据na(Not Available,不可用)是购药时间,合理运用逻辑运算符以及缺失数据函数na.omint()就可以删除所有含有缺失数据的行。

    这里,我们选用“!”这一逻辑运算符,表示“非”的意思。再配合相应缺失值语句,写入脚本:

    #删除缺失数据

    Sell_data <- Sell_data[!is.na(Sell_data$Time),]

    如图,6579行缺失数据被剔除成功

    日期处理在“Time”项下,我们发现日期是以字符串的形式出现的(日期+星期),为了便于数据分析,需要将字符串拆分为相应的单列字符,这就需要R语言字符串处理包Stringr来帮忙。

    输入脚本

    #step3:处理日期

    TimeSplit <- str_split_fixed(Sell_data$Time, " ",2)

    Sell_data$Time <-TimeSplit[,1]

    结果显示

    这说明字符串处理包Stringr并未导入,此时,我尝试点击右下角目录框中R语言字符串处理包Stringr,

    再运行,结果正常:

    Time里的字符串被成功分成两列字符。

    数据类型转换由于运算的需要,需将Time中的字符型向量由“character”转换为日期型Date"格式。

    脚本输入:

    #字符串转换为日期格式

    Sell_data$Time <- as.Date(Sell_data$Time,

    "%Y-%m-%d")

    class(Sell_data$Time)

    结果为:

    同样地,像销售数量、应收金额以及实收金额("SaleNumber"、"Virtualmoney"以及"Actualmoney")这些数据也都可以转换为数值类型:

    脚本输入:

    #step4:数据类型转换

    #销售数量

    Sell_data$SaleNumber <- as.numeric(Sell_data$SaleNumber)

    #应收金额(打折前的金额)

    Sell_data$Virtualmoney <- as.numeric(Sell_data$Virtualmoney)

    #实收金额(打折后的金额)

    Sell_data$Actualmoney <- as.numeric(Sell_data$Actualmoney)

    #查看类型

    class(Sell_data$SaleNumber)

    结果为:

    转换成功!

    数据排序最后,对销售数据按照时间升序进行排列

    运行脚本后,结果如下:

    排序没毛病~

    总结:经过列名重命名、缺失数据剔除、日期处理、数据类型转换以及数据排序等五个步骤,数据处理完毕。

    Step3:数据分析

    有了符合要求的数据,才可以正常进行数据分析这个步骤。本次需要解答的问题是:

    根据表格数据得出:

    1.月均消费次数(注:同一天内,同一个人发生的所有消费算作一次消费 ;月消费次数=总消费次数/月数)

    2.月均消费金额(注:同一天内,同一个人发生的所有消费算作一次消费; 月消费金额=总消费金额/月数)

    3.客单价(客单价=总消费金额/总消费次数)

    4.消费趋势(周-消费金额曲线)

    答一:

    思路:

    根据公式:月消费次数=总消费次数/月数,所以只要获取总消费次数和月数即可。由于同一天内,同一个人发生的所有消费算作一次消费,所以得剔除其本人当天超过一次的消费记录。月数则根据30天为1个月进行粗略计算。

    脚本:

    # 业务指标1:月均消费次数

    #-------------------------------------------------------

    kpi1 <- Sell_data[!duplicated( Sell_data[,c("Time","Cardno")]),]#采用逻辑符号“!”以及"duplicated()"语句就能筛选出非重复的消费次数。

    ConsumeNumber <- nrow(kpi1) #总消费次数相当于行数

    运行得:

    可得总消费次数为5394;

    接着运行脚本,得出月数:

    #月数根据时间范围计算

    #最小的时间值

    StartTime <- kpi1$Time[1]

    #最大的时间值

    EndTime <- kpi1$Time[nrow(kpi1)]

    #天数

    Day <- as.numeric(EndTime -StartTime)

    #月数

    Month <- Day %/% 30 #整除法得出月数为6

    #月均消费次数

    MonthConsume <- ConsumeNumber / Month

    MonthConsume <- format(round(MonthConsume, 2), nsmall = 2)

    最后得出月均消费次数为899次/月。

    答二:

    思路:

    根据公式:月消费金额=总消费金额/月数,所以只要获取总消费金额和月数即可。本次计算中,总消费金额是实际消费金额的总和,月数则根据上次计算的6个月计算即可。

    脚本:

    TotalMoney <- sum(Sell_data$Actualmoney,na.rm=TRUE)#采用函数sum求和,并用na.rm剔除缺失值,最终为只对有效值进行求和。

    MonthMoney <- TotalMoney / Month

    最终求得月消费金额为50776.38元。

    答三:

    思路:根据公式,客单价=总消费金额/总消费次数

    脚本:

    # 业务指标3:客单价pct(per customer transaction)

    pct <- TotalMoney / ConsumeNumber

    pct <- format(round(pct, 2), nsmall = 2)#保留小数点后两位

    结果得:

    最终求得,客单价为56.48元/次

    答四:

    思路:绘制消费趋势曲线,可以以周为时间横轴,周累计消费金额为纵轴,绘制折线图的方式得出周-消费金额曲线。

    脚本:

    # 业务指标4:消费曲线图

    #-------------------------------------------------------

    week <- tapply(Sell_data$Actualmoney, format(Sell_data$Time, "%Y-%U"), sum)#据说利用tapply()函数进行数组分类,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",

    type="b")

    axis(1.5,at=week$timeNumber, labels=week$time, cex.axis = 1.5)

    !!!目前对于tapply()函数进行数组分类,sum()函数分别求和这串神奇的组合表示有点懵!!!是不是先由format(时间,“%Y-%U”)这个函数把时间按周排序,然后再采用sum()求和,最后以分组的形式呈现????

    这个得自己去查询了!!!

    最后画出了消费趋势图:

    从图中,就可以轻松得知2016年朝阳医院每周的消费总额以及消费高低等信息,从而获取消费趋势。

    总结:

    本次通过导入源数据、数据预处理以及数据分析三个步骤,解决了4个实际问题。从一张2016年朝阳医院药房销售数据excel表格,得出月均消费次数(899次/月)、月均消费金额(50776.38元/月)、客单价(56.48元/次)、消费趋势图。这几个数据可以大致反应2016年朝阳医院药房每月的消费人数、消费金额、人均消费水平,还可以分析药品销售的淡季旺季。同理,这种数据分析方式可应用到其它商品当中。

    本次数据分析为较为基础的excel数据处理分析,具体应用到的语句、函数、运算符如下:

    路漫漫其修远兮,少年仍需加油啊!!!!

    相关文章

      网友评论

      • 希日晞:跟着你的做测试,依然出错了:sob:
        问题:Error in `[.data.frame`(datatest, , c("time", "Cardno")) :
        undefined columns selected
        请问作者,这个要怎样处理。感谢
        希日晞:@古月立青 嗯,解决了。哈哈,有机会一起讨论学习:grin:
        胡阿白:@希日晞 抱歉哈,最近一直在闭卷学习,好长时间没用简书了。这个情况不知道您解决了没,我也是R的初级选手,初步怀疑是您在命名时的大小写可能有不匹配的情况。例如前期写的Time,后期编码变成time,可能出现无法识别的状况。

      本文标题:Excel~R~Analysis

      本文链接:https://www.haomeiwen.com/subject/ziyrittx.html