欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答、求职一站式搞定!
对商业智能BI、大数据分析挖掘、机器学习,python,R等数据领域感兴趣的同学加微信:tstoutiao,邀请你进入数据爱好者交流群,数据爱好者们都在这儿。
作者:宋星云中国科学院心理研究所硕士,R语言爱好者。已有多年数据分析与R语言的实战经验,毕业后将从事数据分析工作。
个人公众号:星云实验室
对给定的样本随机排序、随机抽样、分层抽样在日常生活工作中非常常见,本文将以若干案例来介绍实现这几种常见需求的简单解决方案。
自带的sample函数是实现随机抽样最基础的函数,以此为基础,dplyr中的sample_n与sample_frac,以及doBy中的sampleBy函数能够实现更复杂的一些需求
案例1 皇帝的夜生活
对序列进行随机排序(洗牌)
皇帝有7个老婆,他想请作为内务总管的你帮他安排一下他的夜生活。他希望能够雨露沾均,一周七天没有人失宠也没有人得到过多的恩宠,而且希望能够顺序随机。
在这里,问题相当于对1~7七个数(一个向量)进行洗牌,使用sample函数即可很好的解决问题:
P.S. 如果皇帝无所谓雨露沾均,那么问题就相当于对1~7七个数进行有放回的七次抽样:
案例2 皇帝为什么找不到老婆呢?
对数据框随机抽样
每年的选秀结束了,但是皇帝没有选到心仪的人,于是怀疑手下是否有舞弊。于是让人整理了一份全部参加选秀的1000个人选的名单(dt),名单包括秀女的姓名、年龄、家庭住址、手机号等。然后,皇帝拜托作为内务总管的你去走一下基层,从中随机抽取5%的人上门或者打电话了解一下情况。
在这里,问题相当于从这个有1000行的数据框中随机抽取5%,即50行的数据。 dplyr中的sample_n与sample_frac函数实现对数据框的观测随机抽样与随机排序。其中,sample_n是按照个数取样;而sample_frac是按照比例取样。
sample_n(dt, 50) #从dt中随机取50个观测值
sample_frac(dt, 0.05)#从dt中随机取5%的观测值
案例3 皇帝为什么找不到老婆呢?
分层随机抽样
接案例2. 作为内务总管的你了解到,选秀主考官似乎有点地域歧视、户口歧视,对来自南方与北方,对出身农村和城镇的秀女有着不同的标准,在出题上也有些为难人。因此,你决定从南方与北方、从农村和城镇各随机抽取相应比例的秀女进行调查。
在这里,问题相当于要完成一次分层的随机抽样,doBy包中的sampleBy函数能够很好的实现分层抽样。sampleBy的用法参考如下:
sampleBy(formula, frac = 0.1, replace = FALSE, data = parent.frame(), systematic = FALSE)
和doBy的其他函数一样,均需要使用formula来表示其中的关系。其仅含frac参数,需要按比例进行抽样
下图是假设的原始dt数据框,共有1000行
解决方案为:
sampleBy(formula = ~DiYu+HuKou,
frac = .052, #因为1000*5% /4 =12.5 不是整数,因此向上调了一点
data = dt)
我们看一下结果:
可以看见,地域(DiYu)和户口(HuKou)的每一个处理下面均随机抽取了13个观测值。实现了分层随机抽样。
最后,留一个练习题~
练习题 给秀女们排座位
过年了,皇帝想邀请通过初试的40名秀女来宫中看春晚,宫里正好共有40个座位,8排5座。因为场地是平面的,皇帝希望身高高的秀女坐在后面,身高矮的坐在前面,但是又希望座位尽量随机。
于是,你按照身高以矮到高将40人划分为8组,每一组占一排,在每一组内随机安排座位。
那么,怎样实现呢?
P.S. 每个秀女是数据框中的一行观测值,包含姓名、身高、出生地等变量,按照身高人为的分组为GROUP,需要对每个秀女生成一个新的变量“座位号”,满足上述条件
往期精彩:
公众号后台回复关键字即可学习
回复 爬虫 爬虫三大案例实战
回复 Python 1小时破冰入门
回复 数据挖掘 R语言入门及数据挖掘
回复 人工智能 三个月入门人工智能
回复 数据分析师 数据分析师成长之路
回复 机器学习 机器学习的商业应用
回复 数据科学 数据科学实战
回复 常用算法 常用数据挖掘算法
网友评论