草庐IT

R语言、02 案例2-1 Pelican商店、《商务与经济统计》案例题

小能的博客 CanAngle's Blog 2023-03-28 原文
  • 编程教材 《R语言实战·第2版》Robert I. Kabacoff

  • 课程教材《商务与经济统计·原书第13版》 (安德森)

P48、案例2-1 Pelican 商店

PS C:\Users\小能喵喵喵\Desktop\R\homework\1_Pelican> tree /f
C:.
│   pelican.r
│
├───.vscode
│       launch.json
│
└───data
        PelicanStores.csv

加载数据

编程教材p32 2.3.2

已知数据集为csv文件,所以要按间隔符形式导入。并删除带缺省值的列。

stores <- read.table("./data/PelicanStores.csv",
  header = TRUE, row.names = "Customer", sep = ","
)

res1 <- data.frame(stores)
library(dplyr)
res <- res1 %>% select_if(~ !any(is.na(.)))

print(summary(res))

View(res)


主要变量的百分数频数分布

编程教材 p21~30 、p137~143

顾客类型、支付类型

# ^ 百分数频数分布
# @ 客户类型
typeTable1 <- table(res$Type.of.Customer)
typeTable1 <- prop.table(typeTable1) * 100
print(typeTable1)
# @ 支付方法
typeTable2 <- table(res$Method.of.Payment)
typeTable2 <- prop.table(typeTable2) * 100
print(typeTable2)

竖着显示方法、改成数据框

# @ 竖着显示方法
print(as.data.frame(typeTable2))


使用DescTools包Freq方法

install.packages("DescTools")
# ! 使用 DescTools
t1 <- Freq(res$Type.of.Customer)
View(t1)
# ! 使用 DescTools
t2 <- Freq(res$Method.of.Payment)
View(t2)


销售额类型

课程教材 p25 2.2.1

首先我们要确定组宽,公式为 \(近似组宽=\frac{数据最大值-数据最小值}{组数}\)

Max.=287.59 、Min.=13.23。数据项较少的情况下给定5组互不重叠的组数。组宽约等于 55

# @ 销售额频率分组
typeTable3 <- within(res, {
  group1 <- NA
  group1[Net.Sales >= 13 & Net.Sales < 68] <- "[13~68)"
  group1[Net.Sales >= 68 & Net.Sales < 123] <- "[68~123)"
  group1[Net.Sales >= 123 & Net.Sales < 178] <- "[123~178)"
  group1[Net.Sales >= 178 & Net.Sales < 233] <- "[178~223)"
  group1[Net.Sales >= 233 & Net.Sales <= 288] <- "[223~288]"
})
# print(head(sales))
typeTable4 <- table(typeTable3$group1)
typeTable4 <- prop.table(typeTable4) * 100
# @ 默认按字符串排序,重新排列表格列
typeTable4 <- typeTable4[c(2, 5, 1, 3, 4)]
print(as.data.frame(typeTable4))


条形图或圆饼图显示顾客付款方法数量

编程教材 p110~117

条形图

# ^ 支付方式条形图
png(file = "typeTable2_barplot.png")
par(mar = c(10, 4, 4, 0))
barplot(typeTable2,
  main = "100个顾客付款方法数量条形图",
  xlab = "", ylab = "频数", las = 2, col = rainbow(25)
)
dev.off()


使用qcc包pareto.chart方法

# ! qcc包画条形图
library(qcc)
par(mar = c(6, 0, 0, 0))
pareto.chart(typeTable2,
  main = "100个顾客付款方法数量条形图",
  xlab = "付款方式", ylab = "频数"
)

圆饼图

# ^ 支付方式圆饼图
png(file = "typeTable2_pie.png")
colors <- c("#4286f4", "#bb3af2", "#ed2f52", "#efc023", "#ea7441")
pie(typeTable2,
  main = "Daily Diet Plan",
  col = colors, init.angle = 180, clockwise = TRUE
)
dev.off()

顾客类型与净销售额的交叉分组表

编程教材 p137~143 课程教材 p34

# ^ 顾客类型与净销售额的交叉分组表
crossTable <- with(typeTable3, table(Type.of.Customer, group1))
View(crossTable)

把交叉分组表中的项目转换成行百分比数或者列百分比数。顾客各类型数量差别太大会影响判断

# ^ 顾客类型与净销售额的交叉分组表
crossTable <- with(typeTable3, table(Type.of.Customer, group1))
View(crossTable)
# @ 转化成顾客类型的行百分比
# crossTable <- round(prop.table(crossTable, 1) * 100, 2)
# crossTable <- cbind(crossTable, sum = rowSums(crossTable[, 1:5]))
# @ 另一种方式
crossTable <- addmargins(round(prop.table(crossTable, 1) * 100, 1), 2)
View(crossTable)

通过表格可知道普通顾客和促销顾客的净销售额较多聚集在13~68区间的净销售额,但促销顾客出现部分178~288区间的净销售额,是因为促销活动发的优惠卷促进了消费者的消费欲望,利用消费者的投机心理来促进多买行为。


净销售额与顾客年龄关系的散点图

# ^净销售额与顾客年龄关系的散点图

png(file = "res_scatterplot.png")

plot(
  x = res$Net.Sales, y = res$Age,
  xlab = "净销售额",
  ylab = "年龄",
  xlim = c(10, 300),
  ylim = c(20, 80),
  main = "净销售额与顾客年龄关系的散点图"
)

dev.off()

两个变量之间没有明显相关。但可以发现无论顾客年龄多少,净销售额大多都集中在0~150区间。

资料

每一行数据求和

cbind(crossTable, sum = rowSums(crossTable[, 1:5]))

使用函数添加的另外一种方式

addmargins(prop.table(mytable, 1), 2) # 加在列
addmargins(prop.table(mytable, 2), 1) # 加在行 

RStudio table描述性统计,频数,频率,总和,百分比 - 知乎 (zhihu.com)

cbind函数给列命名

Set Column Names when Using cbind Function in R | Rename Variables (statisticsglobe.com)

scatterplots

R - Scatterplots (tutorialspoint.com)

piechart

R Tutorials (tutorialkart.com)

How to draw Pie Chart in R programming language (tutorialkart.com)

barplot 显示问题

graph - How to display all x labels in R barplot? - Stack Overflow

关于warning问题

带中文字符 R 语言经常会发出警告

options(warn=-1) #忽视任何警告
options(warn=1) #不放过任何警告
options(digits = 2) #将有效输出变为2

prop.table()

How to Use prop.table() Function in R (With Examples) - Statology

prop table in R: How Does the prop.table()

变量分组的三种方法

R语言将变量分组的三种方法(含cut函数介绍

完整代码

alicepolice/R01_Pelican (github.com)

有关R语言、02 案例2-1 Pelican商店、《商务与经济统计》案例题的更多相关文章

  1. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  2. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  3. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  4. 7个大一C语言必学的程序 / C语言经典代码大全 - 2

    嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来

  5. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  6. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

  7. 牛客网专项练习30天Pytnon篇第02天 - 2

    1.在Python3中,下列关于数学运算结果正确的是:(B)a=10b=3print(a//b)print(a%b)print(a/b)A.3,3,3.3333...B.3,1,3.3333...C.3.3333...,3.3333...,3D.3.3333...,1,3.3333...解析:    在Python中,//表示地板除(向下取整),%表示取余,/表示除(Python2向下取整返回3)2.如下程序Python2会打印多少个数:(D)k=1000whilek>1:    print(k)k=k/2A.1000 B.10C.11D.9解析:    按照题意每次循环K/2,直到K值小于等

  8. ruby - 如何保持我不常用的编程语言技能 - 2

    关闭。这个问题是off-topic.它目前不接受答案。想改进这个问题吗?Updatethequestion所以它是on-topic用于堆栈溢出。关闭11年前。Improvethisquestion我不经常使用ruby​​-通常它加起来相当于每两个月或更长时间编写一次脚本。我的大部分编程都是使用C++进行的,这与ruby​​有很大不同。由于我与ruby​​之间的差距如此之大,我总是忘记语言的基本方面(比如解析文本文件和其他简单的东西)。我想每天练习一些基本的东西,我想知道是否有一些我可以订阅的网站,并且会向我发送当天的Ruby问题或类似的东西。有人知道这样的站点/Internet服务吗?

  9. ruby-on-rails - 如果特定语言环境中缺少翻译,如何配置 i18n 以使用 en 语言环境? - 2

    如果特定语言环境中缺少翻译,如何配置i18n以使用en语言环境翻译?当前已插入翻译缺失消息。我正在使用RoR3.1。 最佳答案 找到相似的question这里是答案:#application.rb#railswillfallbacktoconfig.i18n.default_localetranslationconfig.i18n.fallbacks=true#railswillfallbacktoen,nomatterwhatissetasconfig.i18n.default_localeconfig.i18n.fallback

  10. ruby-on-rails - 如何通过 URL 更改语言环境? - 2

    在我的双语Rails4应用程序中,我有一个像这样的LocalesController:classLocalesController用户可以通过此表单更改其语言环境:deflocale_switcherform_tagurl_for(:controller=>'locales',:action=>'change_locale'),:method=>'get',:id=>'locale_switcher'doselect_tag'set_locale',options_for_select(LANGUAGES,I18n.locale.to_s)end这有效。但是,目前用户无法通过URL更改

随机推荐