R语言之基础

Python09

R语言之基础,第1张

向量是 R 语言中最基本的数据类型,在 R 中没有单独的标量(例如 1 本质上是 c(1)) 。

R 中可以用 = 或者 <- 来进行赋值 , <-的快捷键是 alt + - 。

R的下标是从1开始的,和python等不同(python四从0开始的)

当然我们也可以用逻辑进行筛选,例如

负数下标表示不选这个这些下标,例如:

c() 可以合并向量,例如

向量有个比较有趣的性质,当两个向量进行操作时,如果长度不等, 长度比较短的一个会复制自己直到自己和长的一样长。

a 自动变成了 c(3,4,3,4) 然后与b相加 , 得到了下面的结果。

遇到不懂得函数,可以用help("函数")查看函数用法。

矩阵,从本质上来说就是多维的向量,我们来看一看 我们如何新建一个矩阵。

可以看到向量元素变为矩阵元素的方式是按列的,从第一列 到第二列,如果我们想按行输入元素,那么需要加入 byrow = TRUE 的参数:

与向量相似,我们可以用下标来筛选矩阵, 例如:

a[行,列]

当我们对两个矩阵相乘,我们得到的结果是 对应元素两两相乘的结果,例如:

而这不是我们想要的矩阵乘法,在 R 中我们在乘法旁边加两个 百分号来做矩阵乘法:

此外,我们可以用 t() 来求矩阵的转置 , 用 solve() 来求矩阵的逆。

数据框类似矩阵,与矩阵不同的是,数据框可以有不同的数据类型。 一般做数据分析,我们把一个类似 excel 的表格读入 R ,默认的格式 就是数据框 , 可见数据框是一个非常重要的数据结构。

一般来说我们需要分析的数据,每一行代表一个样本,每一列代表一个 变量。

下面我们用 R 内置的数据集 iris 来看一看数据框的使用。

我们用 data 函数调入了 iris 这个数据集 , 然后用 head 函数来看一看这个数据 的前几行 , 可以看到有 sepal 的长度,宽度,petal 的长度和宽度,还有一个变量 Species 来描述样本的类别。

我们可以用 summary 函数来对数据集做大致的了解。

可以直观地看到每个变量的信息,对于几个数值变量,我们可以看到最小值,中位数等等统计信息。而对于 Species 这个分类变量,我们看到的是计数信息。

筛选数据框与矩阵相似,都可以通过数字下标来获取子集,不同地是因为数据框有不同的列名,我们也可以通过列名来获取某一特定列,例如:

我们可以用 names() 函数来获取数据框的列名

并可以通过为其赋值改变列的名字。

列表是一种递归式的向量,我们可以用列表来存储不同类型的数据,比如:

列表有多种索引方式,可以用如下方式获取。

今天我们实验的对象就是一组从原始 R 进化出来的工具链 Tidyverse , 它是由 Hadley Wickham 主导开发的一系列 R 包的集合。 Tidyverse 继承了R语言进行快速统计分析的优势 , 并实现了一些新的理念 , 例如 magrittr 包中的管道操作 , 让线性嵌套的函数组合变得更加清晰易懂;可视化方面中的 ggplot ,使绘图变成搭积木式的图层叠加。

这样的小发明有的改变了分析的运作方式 , 有的改变了使用者的认知方式 , 聚在一起形成了一种新的数据分析的生态链 。具体来看 , Tidyverse 有如下核心组件:

mpg 数据集是刻画不同汽车的排放状况的一个数据集, 总过有 234 个样本 , 11 个变量 。 这 11 个变量分别是:

manufacture: 制造商

model: 车型

dispel: 汽车排放量

year: 制造年度

cyl: 排气管数量

trans: 排放类型

drv: 驱动方式

cty: 每公里耗油量(城市道路)

hwy: 每公里耗油量(高速路)

fl: 油的种类

class: 车的类型

更多数据相关信息可以通过 help(mpg) 指令获取。

在属性映射中加入 color=class 参数后 , 我们可以看到每个点的汽车对应的类型被用 不同颜色表现了出来 , 对于散点图 , 还有 size(大小) , shape(形状) 等等参数 可以用于确定点的属性。

对于条形图的y轴就是数据框中原本的数值时,必须将geom_bar()函数中stat(统计转换)参数设置为’identity’,即对原始数据集不作任何统计变换,而该参数的默认值为’count’,即观测数量。

一、分析需求

1.对共享单车满意度评分数据进行清洗,去除空缺值等

2.对用户满意度分数的整体情况进行分析

3.对于收押金这一举措,用AB测试思路来检测收押金是否会影响用户满意度

二、数据情况(实验数据)

北京四个城区调研客户对共享单车的满意程度,并分为了对照组和实验组,分别对收押金前后的满意程度进行了统计

三、分析过程

1. 清洗数据填补空值

对数据进行整理清理,其中分数有些许空缺值,填补缺失值采用的统计量是去除空值后的分数的平均值,填补缺失值大小是5.458333,实现语句:

setwd("C:/Users/emera/Desktop/共享单车评分数据")

R_homework <-

read.csv("共享单车评分数据.csv",fileEncoding ="UTF-8-BOM")

#查看数据整体情况

str(R_homework)

#查看是否有空值

is.na(R_homework$城区)

is.na(R_homework$分数)

is.na(R_homework$组别)

is.na(R_homework$推荐者)

is.na(R_homework$年龄)

#填充空值

alternative_value<-

mean(R_homework$分数,na.rm = TRUE)

R_homework[is.na(R_homework$分数), "分数"] <-alternative_value

is.na(R_homework$分数)

2. 对分数整体显现情况进行初步分析

从直方图中可以看出,朝阳区和东城区给出8分的用户最多,西城区给出7分的用户最多。海淀区分数两级分化情况比较严重,给最多的分数是9分和3分,同时高分(分数7分以上)数量比其他区域高,但低分(3分以下)的数量也很高。

从箱型图中我们可以进一步看出,朝阳区、东城区、西城区用户的平均分相近,海淀区平均分最高,但是海淀区的分数也是最分散的。从小提琴图中,我们可以看到西城区高分面积最大,低分面积最小,海淀区呈现两极分化的葫芦形,东城区各分数段数量分布比较均匀,朝阳区数据离散度较小。

实现语句:

#直方图

library(ggplot2)

a <-

ggplot(R_homework,aes(分数))

a +geom_histogram(binwidth = 1)

facet_wrap(~城区,nrow=2,ncol=2)+

#箱型图

b <-

ggplot(R_homework,aes(城区,分数))

b + geom_boxplot()

#小提琴图

c <-

ggplot(R_homework,aes(城区,分数))

c +geom_violin(draw_quantiles = c(0.25,0.5,0.75))

3. 各个城区用户给分和年龄关系分析

我们对散点图进行线性拟合。从图中可以看出,各个区域的样本取样较为随机,不存在某一年龄段取样集中的不合理现象。对图形进行观察,发现拟合程度都近似,各个区域打分均表现出和年龄的正相关性。其中朝阳区和东城区的拟合情况最为集中,海淀区和西城区的拟合函数更为陡峭(斜率更高)。有趣的是,各个区域25-30岁的用户打分都在拟合函数之上,25岁以下和30岁以上大多在拟合函数之下。也就是说如果我们用拟合函数最各年龄段的满意度预估,25-30岁区间的满意度更有可能高于预估值,25岁以下和30岁以上区间的满意度更有可能低于预估值。

实现语句:

#散点图拟合年龄和分数关系

g <-

ggplot(R_homework,aes(年龄,分数))

g + geom_point(alpha =0.25)+

geom_smooth(method='lm',col='red')+

theme_bw(base_family= "Avenir",base_size = 15)+

  facet_wrap(~城区,nrow=2,ncol=2)+

  labs(x='年龄(age)')+

  labs(y='分数(score)')+

  labs(title='用户满意度调查(分数与年龄关系)')

4. 对“收押金”措施是否对西城区用户满意分有显著影响设计A/B测试

1.原假设H0,发红包对提升用户满意分没有影响,即未发红包对照组满意分均值X1=发红包实验组满意分均值X2

备选假设H1,发红包可对用户满意分有显著影响,即未发红包对照组满意分均值X1=!发红包实验组满意分均值X2

因为假设是问是否有显著影响,好的影响和不好的影响都包含在此假设内,因此采用双侧检测。

2.使用函数t.test()计算P值。

实现方式:

Ttestdata <-read.csv("Ttestdata.csv")

scoreA <-

Ttestdata[Ttestdata$"组别"=="对照组"&Ttestdata$"城区"=="西城区", "分数"]

scoreB <-

Ttestdata[Ttestdata$"组别"=="实验组"&Ttestdata$"城区"=="西城区", "分数"]

#进行T检测

t.test(scoreA,scoreB,alternative= ("two.sided"),conf.level = 0.95)

计算结果:

data:  scoreA and scoreB

t = 0.2778, df = 20.926,p-value = 0.7839

alternative hypothesis:true difference in means is not equal to 0

95 percent confidenceinterval:

 -2.079380 2.720406

sample estimates:

mean of x mean of y

 5.153846 4.833333

3.按照显著性水平α=0.05看,P值0.78大于0.05,所以原假设H0成立,不能证明收押金对用户满意分有显著影响

R中还有一个有趣的sqldf包,它可以让你用SQL来操作dataframe,这种功能能让会R的人能练习SQL,会SQL的人能练习R,不得不感叹R语言的强大技能和神奇魅力。

当然也可以将R与外部数据库连接,直接在R中操作数据库,并生成最终结果,这也是一种可行的方法。在R中连接数据库需要安装其它的扩展包,根据连接方式不同我们有两种选择:一种是ODBC方式,需要安装RODBC包并安装ODBC驱动。另一种是DBI方式,可以根据已经安装的数据库类型来安装相应的驱动。因为后者保留了各数据库原本的特性,所以个人比较偏好用DBI连接方式。有下面这几种主要的包提供了DBI连接:RMySQL,RSQLite,ROracle,RPostgreSQL。由名字看得出它们分别对应了几种主流的数据库。

注:以上文字来自R-blogger—–《在R语言中使用SQL》

值得一提的是在运用sqldf包时可能要对R软件升级到3.1.0版以上,否则安装不会成功,这里简单介绍一种在Windows环境下对R软件自动升级的方法。

Windows上升级R语言:

install.packages("installr")

library(installr) #加载包

updateR()

之后选择“确定”就可以自动更新了

虽然在R语言中有很多优秀的函数如aggregate()和daply()可以对数据框统计,但sql功能强大,不仅能实现数据的清洗、统计、运算,还可以实现数据存储、控制、定义和调用。越来越多的公司在招聘的时候都要求数据分析师除了要掌握统计建模和数据挖掘的理论方法和编程能力外,还要求其具备使用sql的能力,楼主也在积极学习sql当中。

下面是我利用sqldf()完成的一些程序,虽然简单,但这是学习的第一步

>name<-c(rep('张三',1,3),rep('李四',3))

>subject<-c('数学','语文','英语','数学','语文','英语')

>score<-c(89,80,70,90,70,80)

>stuid<-c(1,1,1,2,2,2)

>stuscore<-data.frame(name,subject,score,stuid)

>library(sqldf)

1.计算每个人的总成绩并排名(要求显示字段:姓名,总成绩)

>sqldf('select name,sum(score) as allscore from stuscore group by name order by allscore')

name allscore

1 张三 239

2 李四 240

2.计算每个人的总成绩并排名(要求显示字段: 学号,姓名,总成绩)

>sqldf('select name,stuid,sum(score) as allscore from stuscore group by name order by allscore')

name stuid allscore

1 张三 1 239

2 李四 2 240

3.计算每个人单科的最高成绩(要求显示字段: 学号,姓名,课程,最高成绩)

>sqldf('select stuid,name,subject, max(score) as maxscore from stuscore group by stuid')

stuid name subject maxscore

1 1 张三数学 89

2 2 李四数学 90

4.计算每个人的平均成绩(要求显示字段: 学号,姓名,平均成绩)

>sqldf('select stuid,name,subject, avg(score) as avgscore from stuscore group by stuid')

stuid name subject avgscore

1 1 张三英语 79.66667

2 2 李四英语 80.00000

5.列出各门课程成绩最好的学生(要求显示字段: 学号,姓名,科目,成绩)

>sqldf('select stuid,name,subject,max(score) as maxscore from stuscore group by subject order by stuid')

stuid name subject maxscore

1 1 张三语文 80

2 2 李四数学 90

3 2 李四英语 80

8.列出各门课程的平均成绩(要求显示字段:课程,平均成绩)

>sqldf('select subject,avg(score) as avgscore from stuscore group by subject')

subject avgscore

1数学 89.5

2英语 75.0

3语文 75.0