table {
border-collapse: collapse;
width: 100%;
margin-bottom: 1rem;
}
th, td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
}
th {
background-color: #f2f2f2;
}
tr:nth-child(even) {
background-color: #f9f9f9;
}
pre {
background-color: #f8f8f8;
padding: 15px;
border-radius: 4px;
overflow-x: auto;
}
47、使用管道符 %>% 创建一个对象 p,关联 heights 数据集。
p <- heights %>% ggplot()
48、现在我们要添加图层和相应的美学映射。对于谋杀案数据,我们需要绘制谋杀总数与人口规模的关系图。已知有以下几个变量组合选项,需要从中选择出代表谋杀总数和人口规模的变量名称组合。A. state和abb。B. total_murers和population_size。C. total和population。D. murders和size。
C
49、要创建散点图,我们使用
geom_point
添加一个图层。美学映射要求我们分别定义 x 轴和 y 轴变量。假设存在一个名为
murders
的数据框,有
population
(人口)和
total
(总数)这两个变量,代码如下:
murders %>% ggplot(aes(x = , y = )) + geom_point()
,请用正确的变量名填写 x 和 y,以绘制
population
和
total
的散点图。
geom_point
murders
population
total
murders %>% ggplot(aes(x = , y = )) + geom_point()
population
total
x = population, y = total
50、在 R 语言中,有这样一段代码
murders %>% ggplot(aes(population, total)) + geom_point()
用于绘制散点图。现在重新绘制该图,但将
total
放在 x 轴,
population
放在 y 轴,写出相应代码。
murders %>% ggplot(aes(population, total)) + geom_point()
total
population
murders %>%
ggplot(aes(total, population)) +
geom_point()
51、如果我们不想添加点,而是想添加文本,可以使用geom_text()或geom_label()几何对象。以下代码murders %>% ggplot(aes(population, total)) + geom_label()会给出错误信息:Error: geom_label requires the following missing aesthetics: label 为什么会这样?A. 我们需要通过aes中的label参数将一个字符映射到每个点。B. 我们需要让geom_label知道在图中使用什么字符。C. geom_label几何对象不需要x轴和y轴的值。D. geom_label不是一个ggplot2命令。
A
52、将标签颜色改为蓝色。我们该怎么做?A. 向murders数据框添加名为blue的列;B. 因为每个标签需要不同颜色,我们通过aes映射颜色;C. 在ggplot中使用color参数;D. 因为我们希望所有标签颜色为蓝色,不需要映射颜色,只需在geom_label中使用color参数。
D
53、在一个使用 ggplot2 绘图的场景中,有一段绘制散点图并标注文本的代码,现在要求重写这段代码,使图中的标签变为蓝色。
p <- murders %>%
ggplot(aes(population / 10^6, total, label = abb)) +
geom_text(nudge_x = 0.05) +
scale_x_log10() +
scale_y_log10() +
xlab("Populations in millions (log scale)") +
ylab("Total number of murders (log scale)") +
ggtitle("US Gun Murders in 2010")
p + geom_label(size = 3, color = "blue")
54、现在假设我们想使用颜色来表示不同的地区。在这种情况下,以下哪一项最合适:A. 在
murders
数据集中添加一个名为
color
的列,并填入我们想要使用的颜色。B. 因为每个标签需要不同的颜色,所以我们通过
aes
的
color
参数来映射颜色。C. 在
ggplot
中使用
color
参数。D. 因为我们希望所有颜色都是蓝色,所以不需要映射颜色,只需在
geom_label
中使用
color
参数。
murders
color
aes
color
ggplot
color
geom_label
color
B
55、重写代码,使标签的颜色由州所在的地区决定。
代码
p <- murders %>% ggplot(aes(population, total, label = abb, color = region)) + geom_label()
,其中
color = region
这一映射将标签颜色设定为由州所在地区决定。
56、现在我们要将 x 轴改为对数刻度,以考虑人口分布是偏斜的这一事实。首先定义一个对象 p 来保存我们到目前为止所制作的图:p <- murders %>% ggplot(aes(population, total, label = abb, color = region)) + geom_label() 我们可以使用 scale_x_log10() 函数来将 x 轴改为对数刻度。将这个图层添加到对象 p 中以更改刻度并渲染图形。
p <- murders %>%
ggplot(aes(population, total, label = abb, color = region)) +
geom_label()
p <- p + scale_x_log10()
print(p)
57、重复上一个练习,但现在将两个坐标轴都改为对数刻度。(注:这里假设上一个练习是进行数据可视化绘图,p 是一个 ggplot2 绘图对象)
可以使用
scale_x_continuous(trans = "log10")
和
scale_y_continuous(trans = "log10")
函数来实现,代码示例如下:
p + geom_point(size = 3) + geom_text(nudge_x = 0.05) + scale_x_continuous(trans = "log10") + scale_y_continuous(trans = "log10")
也可使用
ggplot2
提供的专门函数
scale_x_log10
和
scale_y_log10
改写代码:
p + geom_point(size = 3) + geom_text(nudge_x = 0.05) + scale_x_log10() + scale_y_log10()
58、现在编辑绘图代码,为绘图添加标题“Gun murder data”。提示:使用ggtitle函数。
在原代码基础上添加
ggtitle("Gun murder data")
,例如:
若原代码为:
r
p + geom_point(size = 3, color = "blue")
则修改后为:
r
p + geom_point(size = 3, color = "blue") + ggtitle("Gun murder data")
59、下面有三个密度图。它们有可能来自同一个数据集吗?图1:人口(百万)范围0 – 30,密度范围0.00 – 0.06;图2:人口(百万)范围1 – 30,密度范围0.0 – 1.2;图3:人口(百万)范围1 – 30,密度范围0.0 – 0.3。以下哪个陈述是正确的:A. 它们不可能来自同一个数据集。B. 它们来自同一个数据集,但图表不同是由于代码错误。C. 它们来自同一个数据集,但第一个和第二个图平滑不足,第三个图过度平滑。D. 它们来自同一个数据集,但第一个图不是对数刻度,第二个图平滑不足,第三个图过度平滑。
D
60、哪个大洲的人口中位数最大?
非洲
61、假设世界成年男性的身高分布近似服从正态分布,平均值为69英寸,标准差为3英寸。使用此近似方法,估算身高7英尺及以上的成年男性(即七英尺高的人)的比例。提示:使用pnorm函数。
可使用R语言代码
1 - pnorm(7 * 12, 69, 3)
来计算该比例。
62、在回答前面的问题时,我们发现七英尺高的人成为 NBA 球员并不罕见。以下哪一项是对我们计算结果的合理批评:A. 成为优秀篮球运动员靠的是练习和天赋,而非身高。B. 正态近似不适用于身高数据。C. 正如问题 3 所示,正态近似往往会低估极端值。有可能七英尺高的人比我们预测的更多。D. 正如问题 3 所示,正态近似往往会高估极端值。有可能七英尺高的人比我们预测的更少。
C
63、现在我们要使用geom_histogram函数为height数据框中的身高数据制作直方图。该函数只需要一个映射,即用于制作直方图的值。在height数据框中,包含身高的变量是什么?A. sex B. heights C. height D. heights$height
C
64、现在使用管道将
heights
数据分配给一个
ggplot
对象,创建一个
ggplot
对象。通过
aes
函数将
height
赋值给
x
轴变量。
heights
ggplot
ggplot
aes
height
x
代码示例为
heights %>% ggplot(aes(x = height))
65、已知有一个关于身高(
height
)和性别(
sex
)的数据集,制作女性身高的直方图时,运行代码会得到警告:“stat_bin() using bins = 30. Pick better value with binwidth.” 请使用
binwidth
参数将女性身高的直方图改为使用宽度为 1 英寸的区间。
height
sex
binwidth
代码如下:
heights %>%
filter(sex == "Female") %>%
ggplot(aes(height)) +
geom_histogram(binwidth = 1)
66、不绘制直方图,要绘制一个平滑的密度图。在不创建对象,而是用一行代码来渲染图形的情况下,更改之前使用的代码中的几何图形,以绘制平滑密度图而不是直方图。
将之前代码中的
geom_histogram
函数改为
geom_density
函数。例如,若之前代码为
heights %>% ggplot(aes(height)) + geom_histogram()
则修改后为
heights %>% ggplot(aes(height)) + geom_density()
67、我们可以通过
fill
参数来划分组,这样做的额外好处是可以使用颜色来区分不同的组,例如使用代码
heights %>% ggplot(aes(height, fill = sex)) + geom_density()
。不过,这里第二条密度曲线会覆盖在另一条之上。为了使曲线更清晰可见,我们可以通过使用alpha混合来增加透明度。请在
geom_density
函数中将
alpha
参数设置为0.2来实现这一改变。
fill
heights %>% ggplot(aes(height, fill = sex)) + geom_density()
geom_density
alpha
可以使用以下代码实现:
heights %>% ggplot(aes(height, fill = sex)) + geom_density(alpha = 0.2)
68、何时适合使用饼图:A. 当我们想展示百分比时。B. 当无法使用ggplot2时。C. 当我在面包店时。D. 从不适合,条形图和表格总是更好。
A
69、下面的图表存在什么问题:A.数值错误。最终票数是306比232。B.坐标轴不是从0开始。从长度上看,特朗普的票数似乎是对方的3倍,但实际上只多了约30%。C.颜色应该相同。D.百分比应该用饼图展示。
B
70、有两个图表展示了1928年美国50个州的麻疹发病率。如果你想确定哪些州的发病率最高和最低,哪个图表更容易阅读,为什么?A. 它们提供的信息相同,所以两者一样好。B. 右边的图表更好,因为它按州名的字母顺序排列。C. 右边的图表更好,因为字母顺序与疾病无关,按实际发病率排序,我们可以快速看到发病率最高和最低的州。D. 两个图表都应该用饼图表示。
C
71、使用一行代码,对数据集进行操作,定义一个名为dat的数据对象。操作内容为筛选出年份为1967、疾病为’Measles’且人口数不为缺失值的数据,使用mutate函数创建一个rate变量(rate的计算方式为count / population * 10000 * 52 / weeks_reporting),并重新排序state变量,使这些水平按rate变量重新排序。然后使用ggplot为这个新的dat制作一个条形图。
dat <- us_contagious_diseases %>%
filter(year == 1967 & disease == "Measles" & !is.na(population)) %>%
mutate(rate = count / population * 10000 * 52 / weeks_reporting,
state = reorder(state, rate)) %>%
ggplot(aes(state, rate)) +
geom_bar(stat = "identity") +
coord_flip()
72、假设我们想比较美国不同地区的枪支杀人率,然后决定搬到西部地区的一个州。这种解读的主要问题是什么?A. 类别是按字母顺序排列的。B. 图表未显示标准误差。C. 它没有展示所有数据。我们看不到一个地区内的差异,有可能最安全的州并不在西部。D. 东北部的平均值最低。
C
73、当展示三个连续变量时,为什么会出现某些情况(这里未明确具体情况,但可推测是解读上的问题)?A. 人类不擅长解读伪三维图。B. 代码一定有错误。C. 颜色让我们困惑。D. 当有三个变量时,散点图不应用于比较两个变量。
A
74、已知有一个包含各州总谋杀数和人口规模的数据表,现在要计算美国的谋杀率。提示:使用
summarize
函数,用总谋杀数除以总人口来计算美国的比率。
summarize
可以使用以下代码计算美国的谋杀率:
us_murder_rate <- murders %>% summarize(rate = sum(total) / sum(population) * 100000)
其中
murders
是包含各州总谋杀数和人口规模的数据表。运行此代码后,
us_murder_rate
即为所求的美国谋杀率。
75、现在对美国的比率也做同样的操作。提示:使用summarize计算美国的比率,即用总谋杀数除以总人口。假设存在一个包含各州总谋杀数和人口规模的数据表,名为murders 。
计算美国谋杀率的正确代码如下:
us_murder_rate <- murders %>%
summarize(rate = sum(total) / sum(population) * 100000)
这里的
murders
是包含各州总谋杀数和人口规模的数据表,通过该代码可得出考虑各州规模比例后的美国谋杀率。
76、计算数据集中 Galton 数据里 child 列数据的中位数和中位数绝对偏差。
要计算,需先按以下代码加载所需数据集并创建向量:
library(HistData)
data(Galton)
x <- Galton$child
之后,使用
median(x)
计算中位数,使用
mad(x)
计算中位数绝对偏差。
77、如何使用探索性数据分析来检测是否出现了错误?A. 由于这只是众多值中的一个,我们无法检测到。B. 我们会看到分布有明显的偏移。C. 箱线图、直方图或QQ图会显示出明显的异常值。D. 散点图会显示出高水平的测量误差。
C
78、从一个装有3个青色球、5个品红色球和7个黄色球的盒子中随机抽取一个球,这个球是青色的概率是多少?
总共有3 + 5 + 7 = 15个球,青色球有3个,所以抽到青色球的概率是3÷15 = 1/5。
79、一个盒子里有3个青色球、5个品红色球和7个黄色球。不只是进行一次抽取,而是考虑进行两次抽取。在进行第二次抽取时,不将第一次抽取的球放回盒子中。我们称这种方式为无放回抽样。那么第一次抽到青色球且第二次抽到非青色球的概率是多少?
根据题目,盒子里有3个青色球、5个品红色球和7个黄色球,总共15个球。
第一次抽到青色球的概率为 $ frac{3}{15} $。
第一次抽走一个青色球后,盒子里还剩14个球,其中非青色球有12个,所以第二次抽到非青色球的概率为 $ frac{12}{14} $。
根据分步乘法计数原理,第一次抽到青色球且第二次抽到非青色球的概率为:
315×1214=635315×1214=635
80、盒子里有3个青色球、5个品红色球和7个黄色球,现在重复抽取球的实验,在第一次抽取并记录颜色后,将球放回盒子并摇匀(有放回抽样)。第一次抽到青色球且第二次没有抽到青色球的概率是多少?
根据题目,盒子里有:
3个青色球
5个品红色球
7个黄色球
总共有 $ 3 + 5 + 7 = 15 $ 个球。
第一次抽到青色球的概率为:
315=15315=15
因为是有放回抽样,第二次抽取时盒子里球的情况不变。
第二次
没有
抽到青色球的概率为:
5+715=1215=455+715=1215=45
根据
独立事件概率计算公式
,两次事件同时发生的概率为两次事件各自发生概率的乘积:
第一次抽到青色球且第二次没有抽到青色球的概率=15×45=425第一次抽到青色球且第二次没有抽到青色球的概率=15×45=425
81、如果 Pr(A 且 B) = Pr(A)×Pr(B),则事件 A 和 B 是独立的。在哪种情况下抽取是独立的?A. 不替换抽取物。B. 替换抽取物。C. 都不是。D. 都是。
B
82、假设盒子里有3个青色球、5个品红色球和7个黄色球,有放回地从盒子中抽取球。已经抽取了5个球,且都是黄色的。那么下一个球是黄色的概率是多少?
总共有 $3 + 5 + 7 = 15$ 个球。有放回抽样时,每次抽取的概率相互独立,所以下一个球是黄色的概率为黄色球的数量除以总球数,即 $frac{7}{15}$。
83、如果你掷一个6面骰子6次,一次都看不到6的概率是多少?
每次掷骰子看不到6的概率是5/6,掷6次是独立事件,所以概率为(5/6)^6,约为0.335。
84、创建一个蒙特卡罗模拟来验证某个概率。设定模拟次数 B 为 10000 次。使用以下代码生成前四场比赛的结果:celtic_wins <- sample(c(0,1), 4, replace = TRUE, prob = c(0.6, 0.4)),其中 0 代表凯尔特人队输,1 代表凯尔特人队赢。计算凯尔特人队在前四场比赛中至少赢得一场的概率。
可以使用以下 R 代码实现该蒙特卡罗模拟:
B <- 10000
results <- replicate(B, {
celtic_wins <- sample(c(0, 1), 4, replace = TRUE, prob = c(0.6, 0.4))
sum(celtic_wins) >= 1
})
mean(results)
此代码首先设定模拟次数为 10000 次,然后重复模拟凯尔特人队四场比赛的结果,判断是否至少赢一场,最后计算至少赢一场的比例来验证概率。
85、重复上述练习,但现在将概率固定为 p <- 0.75,并计算不同系列长度的概率:最佳的 1 场比赛、3 场比赛、5 场比赛……具体来说,N <- seq(1, 25, 2)。提示:使用这个函数:prob_win <- function(N, p = 0.75){ B <- 10000 result <- replicate(B, { b_win <- sample(c(1,0), N, replace = TRUE, prob = c(1 – p, p)) sum(b_win)>=(N + 1)/2 }) mean(result) }
可使用给定函数
prob_win
来计算不同系列长度下的概率,代码示例如下:
N <- seq(1, 25, 2)
p <- 0.75
prob <- sapply(N, prob_win, p = p)
print(prob)
运行上述代码即可得到对应不同
N
值下的概率结果。
86、如果m是均值,s是标准差,要计算随机变量X小于等于a的概率,以下哪个R代码能在所有情况下给出正确答案:A. mean(X<=a) B. pnorm((a – m)/s) C. pnorm((a – m)/s, m, s) D. pnorm(a)
B
87、假设成年男性的身高分布近似正态,期望值为69,标准差为3。处于第99百分位的男性身高是多少?提示:使用qnorm函数。
可以使用 R 语言的
qnorm
函数计算:
qnorm(0.99, mean = 69, sd = 3)
计算得出约为 75.98,所以处于第 99 百分位的男性身高约为 75.98 英寸。
88、在美国轮盘赌中,你也可以押注绿色。轮盘上有18个红色、18个黑色和2个绿色(0和00)。出现绿色的概率是多少?
轮盘上总共有 $18 + 18 + 2 = 38$ 个格子,其中绿色有 2 个,所以出现绿色的概率是 $frac{2}{38}$,即 $frac{1}{19}$。
89、在轮盘赌中押注绿色获胜的奖金是17美元。这意味着如果你押注1美元且球落在绿色区域,你将获得17美元。假设轮盘上绿色区域的比例为1/19,非绿色区域的比例为18/19。使用sample函数创建一个抽样模型,来模拟你的奖金随机变量X。提示:参考下面押注红色时的示例代码。示例代码:x <- sample(c(1,-1), 1, prob = c(9/19, 10/19))
押注1美元,若落在绿色区域赢得17美元(净赚16美元),落在非绿色区域损失1美元。
模拟代码为:
x <- sample(c(16, -1), 1, prob = c(1/19, 18/19))
90、计算样本均值(overline{X})的标准误差。
当总体为二项分布时,样本均值 $overline{X}$ 的标准误差计算公式为
SE(X¯¯¯¯)=p(1−p)N−−−−−−−√SE(X¯)=p(1−p)N
其中 $p$ 是总体比例,$N$ 是样本大小。若不知道 $p$,可将样本比例 $overline{X}$ 代入 $p$ 来估计标准误差。
当总体服从正态分布且总体方差 $sigma^2$ 已知时,样本均值 $overline{X}$ 的标准误差为
SE(X¯¯¯¯)=σN−−√SE(X¯)=σN
当总体服从正态分布但总体方差 $sigma^2$ 未知时,用样本方差 $S^2$ 代替总体方差,此时样本均值 $overline{X}$ 的标准误差为
SE(X¯¯¯¯)=SN−−√SE(X¯)=SN
91、现在创建一个随机变量 S,它是在绿色区域下注 1000 次后的总 winnings。每次下注有两种结果:若赢可获得 17 元,若输则损失 1 元。赢的概率为 1/19,输的概率为 18/19。每次下注相互独立且可重复。代码开头使用 set.seed(1) 设置随机种子为 1。
以下是相应的 R 代码:
set.seed(1)
S <- sum(sample(c(17, -1), 1000, prob = c(1/19, 18/19), replace = TRUE))