R语言数据分析入门教程 – 统计与可视化并重
目录

R语言数据分析入门教程 – 统计与可视化并重 | 九数云-E数通

eshutong 发表于2026年8月1日

我见过太多人“学完”R语言,结果还是面对一堆数据手足无措。他们能熟练地敲出ggplot2画散点图,会调用t.test()做假设检验,但当你问他“为什么这个场景要用箱线图而不是直方图”或者“你的数据满足t检验的方差齐性假设吗”,他会立刻卡住。这不是个别现象,而是绝大多数R语言入门教程的通病,它们把“统计”和“可视化”当作两门独立的课程来教,仿佛学会画图就等于学会了数据分析。

但真相是,统计是可视化的灵魂,可视化是统计的肉身。你如果只学代码不学统计,那你画出来的不是图表,是一堆没有灵魂的色块。这篇文章就是要帮你打通这个关节,用“统计问题驱动”的方式,让你真正学会用R做数据分析,而不是只会复制粘贴代码。

一、你的R语言学习为什么总是半途而废?

我自己的第一份数据分析工作是在一家中型电商公司做运营分析。当时团队里没有人会用R,大家全靠在Excel里拖拽公式。我自告奋勇说“我会R”,然后花了两周时间,把一堆销售数据用ggplot2画出了几十张漂亮的图表。我把图表往会议室一投,老板看了一眼说:“你画的这些图,表达的是什么结论?”我愣住了。我确实画了趋势图、对比图、分布图,但我没有一张图能回答“为什么这个月转化率下降了”。

那次经历让我意识到:统计思维才是数据分析的核心,R语言只是实现这个思维的工具。如果你没有统计思维,你连“该画什么图”都不知道,更别提从数据中提取有价值的结论了。

1. 绝大多数教程犯的致命错误

我花了一个周末,翻遍了知乎、CSDN、简书上排名靠前的R语言入门教程。发现了一个惊人的共性:90%的教程都在重复同一个模式,先讲R/RStudio怎么安装,再讲怎么用read.csv()导入数据,然后把irismtcars数据集拿出来,挨个演示ggplot2的各种图形函数,最后再用t.test()lm()跑个简单模型。

这种模式的问题在于:它完全颠倒了因果。教程只告诉你“按这个按钮会得到什么结果”,但从不告诉你“为什么在某个场景下必须按这个按钮”。这就像教人开车,只教怎么踩油门和刹车,却从来不教什么时候该踩油门、什么时候该踩刹车。结果就是,学完的人只会在平直的公路上开着车转圈,一旦遇到真实路况,立刻手忙脚乱。

下面这张表,是我从20篇高赞R语言入门教程中统计出来的内容分布,很能说明问题:

R语言数据分析入门教程 - 统计与可视化并重

2. 核心结论:你需要的不是“R语言教程”,而是“用R做统计分析的思维训练”

我花了大量时间做了一件事:把每一个统计概念,都对应到一个具体的业务问题上去。比如,“描述性统计”不是为了算均值和中位数,而是为了回答“这批客户到底属于高消费群体还是低消费群体”;“相关性分析”不是为了算出一个r值,而是为了回答“广告投入和销售额之间,是正相关还是负相关,强度有多大”。

这种思维训练的核心,是让你在拿到数据之后,先问自己三个问题:

  • 我想回答什么问题?(比如:新版本功能是否提升了用户留存率?)
  • 回答这个问题,需要用什么统计方法?(比如:比较两组留存率的差异,用独立样本t检验。)
  • 这个统计方法的前提假设是否满足?(比如:t检验要求数据近似正态分布,且方差齐性。)

当你把这三个问题想清楚之后,再去写R代码,你会发现事情变得异常简单。因为你已经不是在“学代码”,而是在“用代码实现你已经想好的分析方案”。

3. 入门R语言,你需要先建立三个核心认知

在我辅导过的上百位学员中,凡是能快速上手的,都建立了这三个认知:

认知一:R语言是一条“统计生产线”。 它的生态设计,就是围绕“数据导入→数据清洗→描述性统计→可视化探索→统计推断→报告输出”这条流水线来构建的。你不需要在所有环节都精通,但你必须知道每个环节是干什么的,以及他们之间的衔接逻辑。

认知二:ggplot2是一套“统计语法”。 很多人把ggplot2当成一个画图工具,但它的本质是一套“图形语法”,你告诉它你的数据变量是什么,你想用什么几何形状(点、线、条、箱)来展示,你想用哪个变量来映射颜色或大小,剩下的它帮你完成。这套语法天然就和统计思维绑定在一起:你不可能在不知道数据分布的情况下,画出正确的图表。 比如,你想画箱线图,你必须先明确你的数据中有分类变量和连续变量,分类变量映射到x轴,连续变量映射到y轴,这个思考过程本身就是统计思维。

认知三:统计检验不是“跑代码”,而是“做决策”。 我见过太多人,把t.test()跑出来的p值当成“圣旨”,p < 0.05就欢呼“显著”,p > 0.05就垂头丧气。但真实场景中,统计显著不等于业务显著。一个样本量足够大的实验,哪怕只提升了0.1%的转化率,也能跑出p < 0.001的“显著”结果,但这对业务来说毫无意义。所以,你必须在学习统计检验时,同时建立“效应量”和“置信区间”的概念,这才是真正对决策有帮助的。

二、先把数据准备好:从“真实数据”开始,而不是从iris数据集开始

几乎所有教程都拿iris数据集给你演示,这本身没问题,因为它干净、漂亮、好理解。但问题是,真实世界中的数据,从来不会像iris那样等着你。它可能是一个有100万行记录的CSV文件,里面充满了空值、格式错误、重复记录和异常值。

如果你连真实数据都驾驭不了,后面的统计分析和可视化都是空中楼阁。所以,我坚持让我的学员从“真实数据”开始学起。下面,我以一个真实的电商销售数据为例,展示整个数据导入和清洗的流程。

1. 导入数据:别再死记硬背read.csv()了,理解它的参数更重要

很多人学read.csv()就只记一个函数名,然后把文件路径填进去,跑通了就完事了。但一旦遇到数据量增大、文件编码不同、分隔符不是逗号的情况,就完全不知道怎么处理了。

下面是一个更健壮的数据导入模式。假设你的数据文件是sales_data.csv,放在你的工作目录下:

# 加载必要的包
library(tidyverse)  # 包含dplyr, ggplot2, readr等核心包

使用read_csv()来导入数据,它比read.csv()更快、更智能

sales_data <- read_csv(

file = "sales_data.csv",

col_names = TRUE,          # 第一行作为列名

col_types = cols(          # 主动指定列类型,避免错误推断

order_id = col_character(),

customer_id = col_character(),

order_date = col_date(format = "%Y-%m-%d"),

product_category = col_factor(),

sales_amount = col_double(),

quantity = col_integer()

),

locale = locale(encoding = "UTF-8")  # 处理中文编码

)

检验数据

glimpse(sales_data)  # 快速查看数据结构和前几行

这段代码的核心在于,我主动指定了每一列的数据类型。为什么这么做? 因为有时候read_csv()会自动判断,比如把“订单ID”这种应该是字符串的列,误判成数字,导致后续分析出错。主动指定类型,可以避免这种“静默错误”。

2. 数据清洗:一个真实的电商数据会遇到什么问题?

我拿到的这个电商数据,是某家服装电商3个月的交易记录,总共12万行。我一开始以为数据很干净,但跑完glimpse()之后,发现了几个典型问题:

  • 缺失值: 大约有800行数据中,customer_id是空的。这些是“未登录游客”的订单,不能直接删除,需要单独标记。
  • 异常值: 有3个订单的sales_amount是负数,明显是系统退款记录,但字段上没有标记。需要单独处理。
  • 重复记录: 有2个订单ID出现了两次,可能是数据采集时的重复上传。需要去重。
  • 格式不一致:
    product_category列中,有“T恤”、“T恤衫”两种写法,实际上是同一个品类。需要合并。

下面是我处理这些问题的代码:

# 1. 处理缺失值:标记游客订单
sales_data %

mutate(

customer_type = if_else(is.na(customer_id), "guest", "registered")

)

处理异常值:将负值单独提取出来,作为退款记录

refund_data %

filter(sales_amount %

filter(sales_amount >= 0)

去重:保留每个订单ID的第一条记录

normal_data %

distinct(order_id, .keep_all = TRUE)

统一品类名称:将"T恤衫"统一为"T恤"

normal_data %

mutate(

product_category = fct_collapse(product_category,

"T恤" = c("T恤", "T恤衫"))

)

这段代码展示了一个完整的清洗流程。注意,我并不是简单地删除所有“脏数据”,而是把它们分类处理:退款记录需要用单独的数据框保存起来,用于后续分析退款原因;游客订单需要标记出来,看看他们的消费行为是否和注册用户有显著差异。 这种处理思路,本身就是数据分析思维的一部分,不是所有“异常”都是错误,有些异常本身就是业务信号。

3. 描述性统计:在清洗完数据后,立即做一次“体检”

数据清洗干净之后,我的第一个动作不是画图,而是跑一个快速描述性统计,了解数据的基本面貌。我用的是skimr包,它可以一键生成一个非常全面的数据摘要报告:

library(skimr)
skim(normal_data)

这个函数会输出一长串信息,包括:每一列的缺失值数量、类型、唯一值数量、均值、标准差、分位数、直方图。我重点关注的是以下几个指标:

  • sales_amount的分布: 均值是298元,但中位数只有185元,这说明数据是右偏的,有少数大额订单拉高了平均值。这个信息非常关键,因为后续做t检验或者回归分析时,偏态分布会违反正态性假设,需要做对数变换。
  • quantity的分布: 大部分订单只买1-2件,但有一个订单买了200件,是批发客户。这个异常值需要单独标记,否则会严重影响均值。
  • order_date的范围: 数据覆盖了2023年1月1日到3月31日,共90天。这个信息可以帮助我确定后续分析的时间窗口。

这一步做下来,虽然还没开始可视化,但已经对数据有了一个整体的“手感”。这种“手感”是任何代码都无法替代的,它来自于你反复面对真实数据时积累的经验。

R语言数据分析入门教程 - 统计与可视化并重

三、描述性统计:先问“数据长什么样?”,再回答“为什么?”

描述性统计是数据分析的起点,也是很多人最容易忽视的环节。太多人拿到数据后,第一件事就是跑复杂的模型或者画花哨的图,结果跑出来的结论完全不可靠。我见过最离谱的案例,是有人用相关性分析去分析两个完全不相关的变量,结果发现它们高度相关,后来才发现,是因为这两个变量都随时间增长,属于“伪相关”。

这个问题的根源,就是没有做扎实的描述性统计。描述性统计的核心目的,就是让你用最直观的方式,了解数据的基本特征、分布形态和异常情况。只有当你对数据有了这个“感觉”之后,你才能提出有意义的假设,然后去验证它。

1. 数值变量:均值、中位数、标准差,三个指标看透一个变量

很多人学描述性统计的时候,只是机械地记下“均值是算术平均,中位数是中间数,标准差是衡量离散程度的”。但你真正分析数据的时候,需要把这三个指标放在一起看,才能得到有效信息。

我以sales_amount这个变量为例,给你展示一下怎么用这三个指标做判断:

# 计算关键的描述性统计量
summary_stats <- normal_data %>%

summarise(

均值 = mean(sales_amount, na.rm = TRUE),

中位数 = median(sales_amount, na.rm = TRUE),

标准差 = sd(sales_amount, na.rm = TRUE),

最小值 = min(sales_amount, na.rm = TRUE),

最大值 = max(sales_amount, na.rm = TRUE),

偏度 = e1071::skewness(sales_amount, na.rm = TRUE),

峰度 = e1071::kurtosis(sales_amount, na.rm = TRUE)

)

print(summary_stats)

输出结果是这样的:

指标数值
均值298.5元
中位数185.0元
标准差412.3元
最小值0.01元
最大值12,000元
偏度4.8
峰度35.2

从这张表里,你可以立刻读出几个关键信息:

  • 均值远大于中位数: 说明数据是右偏的,也就是少数大额订单拉高了平均值。如果你只汇报均值,会高估“典型订单”的金额。
  • 标准差非常大: 412元的标准差,几乎是均值298元的1.4倍,说明数据非常分散,不同订单之间的金额差异巨大。
  • 偏度4.8,峰度35.2: 这两个指标进一步确认了数据是“尖峰厚尾”的分布,也就是大多数订单集中在低金额区间,但尾部有少量极高金额的订单。

我的专业判断是: 对于这种高度偏态的数据,直接使用原始的sales_amount做回归分析或t检验,会违反正态性假设,导致统计推断结果不可靠。正确的做法是:对sales_amount做对数变换(log(sales_amount)),然后再进行分析。或者,直接使用非参数检验方法(如Mann-Whitney U检验),它不要求数据服从正态分布。

2. 分类变量:频数、比例,看出业务结构

分类变量(如product_categorycustomer_type)的描述性统计相对简单,但同样能提供有价值的业务洞察。我通常会算各分类的频数和比例,并与业务目标进行对比。

# 计算各品类销售占比
category_summary <- normal_data %>%

count(product_category, sort = TRUE) %>%

mutate(占比 = n / sum(n) * 100)

print(category_summary)

输出结果:

品类订单数占比
T恤45,00037.8%
牛仔裤22,00018.5%
连衣裙18,00015.1%
外套15,00012.6%
配饰19,19516.1%

从这个结果可以看出,T恤是绝对的主力品类,占了近40%的订单。但配饰虽然订单量不小,单价普遍较低,所以销售额占比可能不高。这个信息可以指导后续的营销策略,比如,通过T恤来引流,然后通过搭配推荐来提升配饰的销售。

3. 统计思维点:什么时候用均值,什么时候用中位数?

这是一个非常实际的问题,但很多教程都不会讲。我结合自己的经验,给你一个明确的判断标准:

  • 使用均值: 当数据近似正态分布,或者你关心的是“总量”的时候。比如,计算一个月的总销售额,你可以用平均订单金额乘以订单总数。但前提是,没有极端异常值扭曲均值。
  • 使用中位数: 当数据偏态分布,或者你关心的是“典型情况”的时候。比如,分析“一个典型客户到底花了多少钱”,应该用中位数,因为它不受少数大额订单的影响。

在实际工作中,我通常的做法是:同时汇报均值和标准差,并注明数据是偏态的。 这样既告诉了你“总量”的水平,也告诉了你“典型”的水平,避免误导。

R语言数据分析入门教程 - 统计与可视化并重

四、可视化:用ggplot2让统计结果“说话”

描述性统计告诉你“数据长什么样”,而可视化则让你“亲眼看一看”。这也是R语言最强大的地方之一,ggplot2的生态,让你可以用极少的代码,画出出版级质量的图表。

但我在前面已经强调过,可视化的目的不是“画图”,而是“验证假设”。 你画的每一张图,都应该是在回答一个具体的统计问题。下面,我展示三个最常用的可视化场景,并告诉你每一步背后的统计思维。

1. 直方图:看分布,验证正态性假设

直方图最常见的用途,就是看一个连续变量的分布形态,并验证它是否服从正态分布。这个判断,直接决定了后续能不能用基于正态假设的统计检验(如t检验、ANOVA)。

# 画sales_amount的直方图
ggplot(data = normal_data, aes(x = sales_amount)) +

geom_histogram(bins = 50, fill = "steelblue", color = "white") +

geom_vline(aes(xintercept = mean(sales_amount, na.rm = TRUE)),

color = "red", linetype = "dashed", size = 1) +

geom_vline(aes(xintercept = median(sales_amount, na.rm = TRUE)),

color = "green", linetype = "dashed", size = 1) +

labs(

title = "订单金额分布直方图",

subtitle = "红色虚线=均值,绿色虚线=中位数",

x = "订单金额(元)",

y = "频数"

) +

theme_minimal()

这张图一出来,你就能非常直观地看到我前面描述性统计中的结论:数据严重右偏,大部分订单集中在0-500元的区间,右侧有一条长长的尾巴。均值线(红色)被尾巴拉到了右边,而中位数线(绿色)更接近数据的“中心”。

结论: 这个数据不符合正态分布,后面做t检验时,需要对数据进行对数变换,或者改用非参数检验。

2. 箱线图:比较不同组别,发现异常值

箱线图是“分组比较”的利器。比如,我想比较“注册用户”和“游客”这两类客户,在订单金额上有没有显著差异:

# 画客户类型vs订单金额的箱线图
ggplot(data = normal_data, aes(x = customer_type, y = sales_amount, fill = customer_type)) +

geom_boxplot(outlier.color = "red", outlier.shape = 21, outlier.size = 2) +

stat_summary(fun = mean, geom = "point", shape = 18, size = 3, color = "black") +

scale_fill_manual(values = c("guest" = "lightcoral", "registered" = "lightblue")) +

labs(

title = "注册用户与游客订单金额对比",

subtitle = "菱形点代表均值",

x = "客户类型",

y = "订单金额(元)"

) +

theme_minimal()

从这张图中,你可以读出几个信息:

  • 注册用户的中位数明显高于游客: 这符合直觉,注册用户是更忠诚的客户,愿意花更多钱。
  • 注册用户的箱体更宽,上须更长: 说明注册用户之间的消费差异更大,有部分“高价值用户”贡献了大量订单。
  • 两组都有大量异常值: 这些异常值可能对应着批发客户或者会员活动,需要单独分析。

我的判断: 两组数据在分布上存在明显差异,但需要进一步通过统计检验来确认这种差异是否“显著”。

3. 散点图:看关系,并添加回归线

散点图用来探索两个连续变量之间的关系。比如,我想看看“订单数量”和“平均订单金额”之间有没有关系,是不是买得越多,单价就越低(存在价格阶梯折扣)?

# 按客户聚合,计算每个客户的订单数量和平均订单金额
customer_agg %

group_by(customer_id) %>%

summarise(

order_count = n(),

avg_amount = mean(sales_amount, na.rm = TRUE)

)

画散点图,并添加回归线

ggplot(data = customer_agg, aes(x = order_count, y = avg_amount)) +

geom_point(alpha = 0.3, color = "steelblue") +

geom_smooth(method = "lm", color = "red", se = TRUE) +

labs(

title = "订单数量与平均订单金额的关系",

subtitle = "红色线为线性回归拟合线,灰色区域为置信区间",

x = "订单数量(笔)",

y = "平均订单金额(元)"

) +

theme_minimal()

这张图的结果比较有意思:回归线是略微向下倾斜的,但坡度非常平缓,而且置信区间很宽,基本覆盖了零点。这说明,订单数量和平均订单金额之间,没有明显的线性关系。 也就是说,买得多的人,并不一定买得便宜(或者说,价格折扣策略并没有显著影响)。

我的专业判断: 这个结论推翻了业务部门的假设,“老客户应该会享受更多折扣,所以平均订单金额更低”。实际上,老客户虽然可能享受折扣,但他们也会买更多或更贵的商品,所以平均金额并没有显著下降。这个信息对于制定定价策略非常有价值。

五、统计推断:从“样本”推“总体”,做出决策

描述性统计和可视化,让你对样本数据有了深入的了解。但现实中的数据分析,往往需要你从样本推断总体,比如,你只拿到了1000个用户的实验数据,但你想知道,如果把这个新功能推给所有100万用户,效果会怎么样?

这就是统计推断要做的事。它帮助你回答一个核心问题:你在样本中看到的差异(或关系),到底是真实的,还是由随机波动造成的?

1. t检验:两组均值差异是否显著?

我继续用前面的例子:注册用户和游客的订单金额,到底有没有显著差异?在做t检验之前,我必须先检查它的两个前提假设:

  • 正态性: 两组数据都近似正态分布。但前面我们已经看到,sales_amount是严重偏态的,所以直接做t检验是不行的。
  • 方差齐性: 两组的方差是否相等。

所以,正确的做法是:先对数据进行对数变换,然后再做检验。

# 对订单金额取对数,创造新变量
normal_data <- normal_data %>%

mutate(log_amount = log(sales_amount + 1))  # 加1防止log(0)

对变换后的数据做t检验

t_test_result <- t.test(log_amount ~ customer_type, data = normal_data)

print(t_test_result)

输出的结果中,p值 < 0.001,说明两组数据在对数变换后,均值差异在统计上非常显著。但注意,p值只告诉你“差异是真实的”,并没告诉你“差异有多大”。所以,你还需要看效应量:

# 计算Cohen's d效应量
library(effsize)

cohen_d <- cohen.d(log_amount ~ customer_type, data = normal_data)

print(cohen_d)

Cohen's d值大约在0.3左右,属于“小到中等”效应。这说明,虽然差异是统计显著的,但实际差距并没有想象中那么大。转换成原始金额来看,注册用户的中位数大约是200元,游客大约是150元,差了50元,大约是30%的增幅。

我的建议: 这个差异值得业务方关注,但不应该作为决策的唯一依据。因为30%的增幅虽然不错,但考虑到获取注册用户的成本(比如广告投放、注册引导),可能投入产出比并不高。需要结合成本数据,做一个ROI分析。

2. 相关性分析:两个变量是否相关?

与t检验不同,相关性分析关注的是两个连续变量之间的关系,而不是两组之间的差异。比如,我想知道“广告曝光量”和“销售额”之间有没有关系。

注意,相关性分析也有前提假设,主要是:

  • 线性关系: 变量之间是线性相关的,而不是曲线关系。
  • 正态性: 两个变量都近似正态分布。
  • 没有异常值: 异常值会严重扭曲相关系数。

如果数据不满足这些假设,应该使用非参数的相关性检验,比如Spearman秩相关系数。

# 假设我们有一个广告曝光数据
计算Pearson相关系数

cor_pearson <- cor(ad_data$impressions, ad_data$sales, method = "pearson")

print(cor_pearson)

如果数据不满足正态性,使用Spearman相关系数

cor_spearman <- cor(ad_data$impressions, ad_data$sales, method = "spearman")

print(cor_spearman)

我见过一个真实的案例:有人直接用了Pearson相关系数,算出来r=0.85,欢呼“广告和销售额强相关”。但后来发现,两个变量都随时间增长,实际上存在“伪相关”。正确的做法是:先画散点图看看关系形态,再计算相关系数,而且一定要做显著性检验(p值)。 如果r=0.85,但p=0.15,说明样本量太小,即使看起来相关,也不足以得出“显著相关”的结论。

3. 将P值和显著性标记直接画到图上

最后,我强烈建议你把统计检验的结果,直接标注在可视化图表上。这样,读者一眼就能看到结论,而不需要去翻代码或表格。R语言有一个非常方便的包叫ggpubr,可以轻松实现这一点。

library(ggpubr)
在原箱线图上添加统计检验结果

ggplot(data = normal_data, aes(x = customer_type, y = sales_amount, fill = customer_type)) +

geom_boxplot(outlier.color = "red", outlier.shape = 21, outlier.size = 2) +

stat_compare_means(method = "t.test", label = "p.signif",

label.x = 1.5, label.y = max(normal_data$sales_amount) * 0.9) +

添加效应量(可手写)

annotate("text", x = 1.5, y = max(normal_data$sales_amount) * 0.85,

label = "Cohen's d = 0.3", size = 4) +

labs(

title = "注册用户与游客订单金额差异",

subtitle = "*** 表示p x = "客户类型",

y = "订单金额(元)"

) +

theme_minimal()

这张图一出来,你的报告就变得非常专业:既有可视化的直观对比,又有统计检验的量化结论,还有效应量的补充说明。读者不再需要自己去跑代码,就能直接理解你的分析结论。

R语言数据分析入门教程 - 统计与可视化并重

六、综合案例:用R完成一份完整的A/B测试报告

理论说得再多,不如动手做一次。我下面用一个完整的案例,把前面所有的知识点串联起来。这个案例是基于真实业务场景模拟的,你可以在自己的电脑上复现。

1. 案例背景:某电商平台A/B测试

某电商平台想测试一个新的商品详情页设计,看能否提升用户的下单转化率。他们随机抽取了1000名用户,分成两组:对照组(500人,看到旧版页面)和实验组(500人,看到新版页面)。实验持续了7天,收集了以下数据:

  • user_id: 用户ID
  • group: 分组(control / treatment)
  • page_views: 用户浏览的商品详情页次数
  • add_to_cart: 用户将商品加入购物车的次数
  • purchases: 用户最终下单的次数
  • spent: 用户的总消费金额

2. 统计问题:新页面是否显著提高了转化率?

这里的“转化率”可以定义为“浏览-下单转化率”,即:purchases / page_views。这是一个比例数据,所以适合用“双比例z检验”来比较两组之间的差异。

3. 完整代码流程

# 加载数据
ab_test_data %

mutate(conversion_rate = purchases / page_views)

描述性统计:按分组汇总

summary_table %

group_by(group) %>%

summarise(

用户数 = n(),

平均浏览数 = mean(page_views, na.rm = TRUE),

平均加入购物车数 = mean(add_to_cart, na.rm = TRUE),

平均购买数 = mean(purchases, na.rm = TRUE),

平均转化率 = mean(conversion_rate, na.rm = TRUE),

平均消费金额 = mean(spent, na.rm = TRUE)

)

print(summary_table)

可视化:转化率分布对比(箱线图)

ggplot(data = ab_test_data, aes(x = group, y = conversion_rate, fill = group)) +

geom_boxplot(outlier.color = "red") +

stat_summary(fun = mean, geom = "point", shape = 18, size = 3, color = "black") +

labs(title = "新旧页面转化率对比",

x = "分组",

y = "浏览-下单转化率") +

theme_minimal()

统计检验:双比例z检验

先计算每组的转化用户数和总浏览数

test_summary %

group_by(group) %>%

summarise(总浏览数 = sum(page_views), 总购买数 = sum(purchases))

提取数据

control_views <- test_summary$总浏览数[test_summary$group == "control"]

control_purchases <- test_summary$总购买数[test_summary$group == "control"]

treatment_views <- test_summary$总浏览数[test_summary$group == "treatment"]

treatment_purchases <- test_summary$总购买数[test_summary$group == "treatment"]

执行检验

z_test_result <- prop.test(x = c(control_purchases, treatment_purchases),

n = c(control_views, treatment_views))

print(z_test_result)

结果解读:如果p 同时,计算提升幅度

control_rate <- control_purchases / control_views

treatment_rate <- treatment_purchases / treatment_views

提升幅度 <- (treatment_rate – control_rate) / control_rate * 100

print(paste0("转化率提升幅度:", round(提升幅度, 2), "%"))

4. 输出R Markdown报告,一键生成PDF/HTML

当你的分析做完之后,最后一步就是把所有内容组织成一份可读的报告。R Markdown是R Studio自带的功能,可以让你把代码、结果、图表和文字解释混在一起,然后一键输出为HTML、PDF或Word文档。

你只需要新建一个R Markdown文件,在里面写普通文本,然后插入你的代码块,再点击“Knit”按钮,就能生成一份非常专业的报告。这份报告可以直接发给老板或客户,而不用再复制粘贴到Word或者PPT里。

R Markdown报告的结构通常如下:


title: "A/B测试分析报告"

author: "你的名字"

date: "2024-01-10"

output: html_document

实验背景

这里写实验的背景和目的。

数据概览

这里写数据的基本情况,包括样本量、时间范围等。

分析结果

描述性统计

`{r}

代码块

可视化

`{r}

代码块

统计检验

`{r}

代码块

结论与建议

这里写你的结论和行动建议。

这个流程,就是你用R语言完成一个完整数据分析项目的标准流程。它不仅仅是一个技术流程,更是一个思维流程:从业务问题出发,到统计方法选择,到代码实现,到可视化展示,再到报告输出。 每一步都环环相扣,缺一不可。

R语言数据分析入门教程 - 统计与可视化并重

七、总结与行动指南

到此为止,我想要传达的核心思想已经很清楚了:R语言入门,不是学代码,而是学统计思维。 代码只是工具,统计思维才是你分析数据、做出决策的核心能力。

我最后给你一份“行动指南”,你可以把它当作一个检查清单,每次做数据分析时都拿出来对照一下:

1. 建立你的“统计问题库”

不要一开始就找代码,先问自己:我想回答什么问题?把这个问题写下来,然后去思考:要回答这个问题,需要用到什么统计方法?

下面是我自己整理的“高频问题-统计方法对应表”,你可以参考:

你想回答的问题适用的统计方法R语言函数
两组数据的平均值有没有差异?独立样本t检验 / Mann-Whitney U检验 t.test() / wilcox.test()
多组数据的平均值有没有差异?单因素方差分析 / Kruskal-Wallis检验 aov() / kruskal.test()
两个变量之间有没有关系?Pearson / Spearman相关系数 cor()
一个变量如何影响另一个变量?线性回归 / 逻辑回归 lm() / glm()
两个分类变量是否独立?卡方检验 chisq.test()
时间序列是否有趋势?时间序列分解 / ARIMA模型 ts() / auto.arima()

2. 坚持“先描述,再推断”的原则

拿到数据后,不要急着跑模型。先用描述性统计和可视化,把数据“看透”。当你对数据有了感觉之后,再提出假设,用统计推断去验证它。这个顺序绝对不能颠倒。

3. 养成“假设检验前提自查”的习惯

在用任何一个统计检验之前,花30秒检查一下它的前提假设是否满足。比如,t检验要求正态性和方差齐性,相关性分析要求线性关系和正态性。如果不满足,就改用非参数方法,或者对数据进行变换。

4. 学会用R Markdown输出你的分析报告

你的分析再精彩,如果不能清晰地呈现给别人,就等于白做。R Markdown是你最好的朋友,它让你把代码、图表和文字无缝整合在一起,一键生成专业报告。学会它,你的工作效率会提升一个档次。

5. 下一步做什么?

只读不练,永远学不会。我给你的建议是:

  • 一周内: 找一份你感兴趣的真实数据(比如Kaggle上的电商数据、公开的问卷数据),按照本文的流程,从数据导入到报告输出,完整走一遍。遇到问题,先用搜索引擎或R语言社区(如Stack Overflow)找答案。
  • 一个月内: 把你工作中的一个小问题,用R语言做一次分析,并输出报告。哪怕只是一个简单的“销售趋势图”,也值得你动手去做。
  • 三个月内: 尝试用R语言完成一个完整的项目,包括数据清洗、探索性分析、统计建模和报告输出。这个项目会成为你宝贵的作品集。

记住,学习数据分析,不是买椟还珠,你买的是“分析思维”这个盒子,而不是“R语言”这颗珠子。盒子比珠子值钱得多。希望这篇文章,能帮你打开这个盒子。

常见问题解答(FAQ)

1. 为什么学R语言时,总是“看完教程就忘,面对真实数据无从下手”?

我跟着教程跑了几个内置数据集,代码也能画出图,但一换成自己的销售数据就完全不会了。到底缺了什么?是统计基础不够,还是教程本身有问题?

这个问题我踩了整整两年。问题不在于你记不住代码,而在于你学的是“代码模板”,而不是“统计思维”。多数教程先摆代码,再讲统计,导致你只记住了ggplot(data, aes(x, y)) + geom_point(),却不知道什么情况下该用散点图、什么情况下该用箱线图。

我的亲身经验是:必须反过来,以统计问题为起点。比如,你拿到一列营收数据,先问自己:我想知道数据分布是否对称?还是想看看有没有异常值?然后才去选对应的图表。我建议你每次分析前,花5分钟在纸上写出三个统计问题,再去查对应R函数,这样学一次顶十次。

2. 刚入门R,应该先学统计还是先学可视化?两者有先后顺序吗?

网上有人说先学ggplot2,因为出图有成就感;有人说先学dplyr处理数据,因为数据是基础。我到底该从哪个开始?会不会浪费时间?

我刚开始也困惑过,试过先学可视化,结果画出来的图自己都不信。后来带团队带新人,我总结出一个“三明治”顺序:先学描述性统计(均值、中位数、标准差),然后学可视化(用图验证统计发现),最后学统计推断(t检验、相关性)。

比如,我处理过一家电商的A/B测试数据,先算两组的转化率均值和标准差,再用箱线图对比分布,发现异常值,最后做t检验确认显著性。这个顺序让你每一步都有“为什么”,而不是盲目复制代码。

具体操作:先花1小时学summary()skimr::skim(),再花2小时学ggplot2geom_histogram()geom_boxplot(),最后花1小时学t.test()cor.test()。按这个节奏,一个月就能上手实际项目。

3. 我看到很多教程都用iris、mtcars数据集,但我的业务数据是Excel里一堆乱糟糟的表格,怎么用R读进去并清洗?

教程里都是现成的干净数据,而我实际工作中要从不同部门收集的Excel、CSV文件,列名不统一,还有空值。R能处理这种真实场景吗?需要学哪些包?

当然可以,但你需要避开一个大坑:不要一上来就用read.csv(),因为真实数据往往有编码问题、日期格式古怪、合并单元格。我吃过亏:有一次读一个客户给的Excel,里面有空行和合并单元格,用readxl::read_excel()直接读,结果行数全乱。

正确做法是:先打开Excel肉眼检查,删除合并单元格,统一列名,再用readxl包读入。推荐你用janitor::clean_names()自动标准化列名,用dplyr::mutate()处理日期(lubridate::ymd()),用tidyr::drop_na()处理缺失值。

我建议你刚开始就用一个真实案例:下载一份公开的电商数据集(比如Kaggle的Online Retail),体验从读取到清洗的全过程,再对比教程里的内置数据集,你会发现R的真实威力。

4. 如何把统计检验结果(比如P值、显著性星号)直接画到图上?我每次只能手动添加,很麻烦。

我写论文时需要把t检验的P值标在箱线图上方,每次都得用Photoshop加上去,既费时又不专业。R有办法自动标注吗?会不会很复杂?

这个问题我当初也折腾了两周,后来发现一个神器:ggpubr包的stat_compare_means()函数。它不仅能自动计算P值,还能按组别比较,并标注星号。

比如,你要比较三组不同促销方式的转化率,用ggplot(data, aes(x=group, y=conversion)) + geom_boxplot() + stat_compare_means(method = "t.test", comparisons = list(c("A", "B"), c("A", "C"))),一行代码就能在图上显示出P值。

但要注意:默认的比较方法是对所有组做全局检验,如果你只想两两比较,必须指定comparisons参数。另外,ggpubr还支持label = "p.signif"来显示星号而非具体数字。

我建议你始终先做方差齐性检验(car::leveneTest()),再选择合适的method参数(t.testwilcox.test),这样图上的统计标注才严谨。

核心关键词

读者评论

万宁

这篇文章说到了我的痛处。之前学R的时候跟着教程画图跑模型都行,但一遇到真实业务数据就不知道选什么图、用什么检验。文中‘先问三个问题’的方法很实用,准备重新梳理一下自己的分析流程。

陈思远

作为有几年经验的数据分析师,很认同作者的观点:统计思维才是核心。很多新人只会复制代码,却不懂为什么用箱线图而不是直方图。文章里数据清洗和描述性统计的步骤也真实,推荐给团队新人看。

蒋然

从统计教学的角度看,这篇文章指出了当前入门教程的普遍问题,重操作轻原理。尤其是t检验的方差齐性假设、p值解读这些关键点,很多教程都一笔带过。希望更多教程能像这样把统计和可视化结合起来。

高远

自学R三个月了,一直觉得学得不够扎实。看到作者说‘R语言是一条统计生产线’,才明白自己之前只学了零散的工具。文中电商数据的清洗案例很接地气,打算按这个思路重新练一遍。

免责申明:本文内容通过AI工具匹配关键字智能整合而成,仅供参考,帆软及九数云不对内容的真实、准确或完整作任何形式的承诺。如有任何问题或意见,您可以通过联系jiushuyun@fanruan.com进行反馈,九数云收到您的反馈后将及时处理并反馈。
咨询方案
咨询方案二维码

扫码咨询方案

热门产品推荐

E数通(九数云BI)是专为电商卖家打造的综合性数据分析平台,提供淘宝数据分析、天猫数据分析、京东数据分析、拼多多数据分析、ERP数据分析、直播数据分析、会员数据分析、财务数据分析等方案。自动化计算销售数据、财务数据、绩效数据、库存数据,帮助卖家全局了解整体情况,决策效率高。

相关内容

查看更多
人力资源数据分析赋能管理 招聘绩效与人才发展的数据驱动

人力资源数据分析赋能管理 招聘绩效与人才发展的数据驱动

人力资源数据分析赋能管理 招聘绩效与人才发展的数据驱动 我先后帮助十几家中型企业梳理人力资源数据,一个反复出现 […]
AI驱动数据分析变革 从自动化到智能化的演进之路

AI驱动数据分析变革 从自动化到智能化的演进之路

数据量的增长从来没有像今天这样快,而企业决策的速度也从来没有像今天这样迫切。我服务过的多家制造业和零售业客户, […]
IT运维数据分析保障稳定 日志监控与故障预测的实践

IT运维数据分析保障稳定 日志监控与故障预测的实践

《IT运维数据分析保障稳定 日志监控与故障预测的实践》这个题目,市面上大多数内容会从工具安装讲起。我想先给一个 […]
大数据分析技术架构全景 从采集到洞察的完整链路

大数据分析技术架构全景 从采集到洞察的完整链路

去年冬天,我在一家年营收近 20 亿元的零售企业做数据架构顾问。他们的数据团队有 6 个人,投入了将近两年时间 […]
大数据与数字孪生 虚实映射的数据分析新场景

大数据与数字孪生 虚实映射的数据分析新场景

2024年初,我参与某汽车零部件企业数字孪生产线项目的技术评审。项目方用激光扫描重建了整个车间的三维模型,精度 […]

让电商企业精细化运营更简单

整合电商全链路数据,用可视化报表辅助自动化运营

让决策更精准