从0开始学习R语言--Day11--主成分分析

主成分分析(PCA)

PCA是一种降维技术,它把一堆相关的变量(比如身高、体重、年龄)转换成少数几个不相关的新变量(叫“主成分”),这些新变量能最大程度保留原始数据的信息。

核心理念
  1. 降维:假设我们有10个指标,PCA可以帮我们压缩成2~3个关键指标,方便进一步可视化或分析。

  2. 去相关性:新生成的主成分之间互不相关,避免重复信息。

  3. 保留最大方差:第一个主成分(PC1)方向是数据变化最大的方向,第二个(PC2)是剩余变化最大的方向,依此类推。

其中,数据变化最大的方向意思是,PC1能解释原始数据中最大比例的差异(方差)。

一般来说,我们会通过PCA实现可视化高维数据(把4维数据压缩成2维图),去除噪声和冗余变量(删除重复的测量指标)和简化机器学习模型(减少特征数量,加快计算速度)。

下面我们照例生成一组数据来理解PCA:

set.seed(123)
height <- rnorm(100, mean = 170, sd = 10)                     # 身高
weight <- height * 0.6 + rnorm(100, mean = 0, sd = 5)         # 体重 = 0.6*身高 + 噪声
age <- rnorm(100, mean = 30, sd = 5)                          # 年龄
data <- data.frame(height, weight, age)                       


# 执行PCA(默认中心化和标准化)
pca_result <- prcomp(data, scale = TRUE)  

# 查看主成分
summary(pca_result)  # 显示各主成分的方差贡献率

plot(pca_result, type = "l", main = "PCA方差贡献率")

# 绘制前两个主成分的散点图
library(ggplot2)
pca_data <- as.data.frame(pca_result$x)
ggplot(pca_data, aes(PC1, PC2)) + 
  geom_point() + 
  labs(title = "PCA降维结果(PC1 vs PC2)")

输出:

Importance of components:
                          PC1    PC2     PC3
Standard deviation     1.3280 0.9867 0.51287
Proportion of Variance 0.5878 0.3245 0.08768
Cumulative Proportion  0.5878 0.9123 1.00000

首先,Standard deviation中的PC1的数值最大,代表其携带信息最多,从这个身高的例子来讲,就是PC1的数据(可能是体型大小)其实就反映了身高与体重之间的变化,要注意PCA所生成的变量,不再是原始数据集的变量,他只是蕴含了其中的信息;从Proportion of Variance可以看出PC1和PC2就共同解释了模型中90%左右的信息,这就代表可以尝试舍去PC3去建模了,也就把数据从三维降为了二维,从而能画出二维图。

<think>好的,我现在需要帮用户解决使用R语言进行事故数据分析和可视化的问题。首先,我要回忆一下用户提供的引用内容,看看有没有相关的示例或方法可以参考。用户提到了几个引用,其中引用5提到了主成分分析的可视化,引用1到4涉及数据清洗、线性回归和缺失数据处理。不过用户的需求是事故数据,可能需要特定的处理步骤。 首先,用户可能需要导入数据,比如CSV文件。引用3和4中提到数据导入和处理,所以我可以建议使用read.csv函数。接下来是数据清洗,比如处理缺失值,引用1有提到缺失数据可视化,可能需要用is.na()和visdat包检查缺失情况。 然后,用户可能想进行简单的统计分析,比如事故数量随时间的变化。引用4中的例子用了ggplot2,我可以建议用折线图或柱状图展示时间趋势。另外,事故类型分布可以用条形图,引用5中的ggbiplot可能不太适用,但ggplot2的geom_bar或geom_col更适合。 地图可视化可能也是用户需要的,尤其是事故地点分布。引用5没有提到地图,但我知道R中有ggmap或sf包可以处理地理数据。需要提醒用户安装这些包并获取API密钥,比如Google Maps。 高级分析部分,比如时间序列预测,可以用prophet包,引用2中的线性回归例子可能扩展到这里。此外,聚类分析可能用k-means,引用5的主成分分析可以降维后可视化聚类结果。 最后,需要确保代码示例正确,比如数据处理步骤和图形绘制。可能还需要提醒用户根据实际数据调整列名,以及安装必要的包。要检查所有代码是否语法正确,比如是否正确使用ggplot的aes和几何对象。 总结步骤:数据导入、清洗、探索性分析(统计描述)、时间趋势可视化、类型分布、地图展示、高级分析如预测和聚类。每个步骤给出示例代码,并引用相关的用户提供的文献,比如数据清洗引用1,可视化引用4和5。</think>以下是一个使用R语言进行交通事故数据分析及可视化的完整示例,结合数据清洗、统计分析和可视化技术: ### ### 交通事故分析示例 ### 1. **数据准备与清洗** ```r # 加载必要包 library(tidyverse) library(lubridate) library(ggmap) library(ggplot2) # 模拟生成交通事故数据集(实际使用时替换为真实数据) accidents <- tibble( date = seq.Date(from = as.Date("2023-01-01"), to = as.Date("2023-12-31"), by = "day")[sample(365, 200)], time = sample(seq.POSIXt(as.POSIXct("00:00", format="%H:%M"), as.POSIXct("23:59", format="%H:%M"), by = "min"), 200), type = sample(c("追尾", "侧翻", "行人事故", "单车事故"), 200, replace = TRUE), severity = sample(1:5, 200, replace = TRUE), lon = runif(200, 121.30, 121.65), lat = runif(200, 31.10, 31.35) ) # 数据清洗 accidents_clean <- accidents %>% mutate(weekday = wday(date, label = TRUE), month = month(date, label = TRUE)) %>% filter(!is.na(lon) & !is.na(lat)) # 移除坐标缺失值[^1] ``` 2. **基础分析可视化** ```r # 事故时间分布(月趋势) ggplot(accidents_clean, aes(x = month)) + geom_bar(fill = "steelblue") + labs(title = "月事故量分布", x = "月份", y = "事故数量") + theme_minimal()[^4] # 事故类型严重程度箱线图 ggplot(accidents_clean, aes(x = type, y = severity, fill = type)) + geom_boxplot() + coord_flip() + labs(title = "事故类型与严重程度关系")[^5] ``` 3. **地理空间可视化** ```r # 获取上海基础地图(需要Google Maps API密钥) sh_map <- get_map(location = c(121.47, 31.23), zoom = 12, maptype = "roadmap") ggmap(sh_map) + geom_point(data = accidents_clean, aes(x = lon, y = lat, color = severity), alpha = 0.7, size = 3) + scale_color_gradient(low = "yellow", high = "red") + labs(title = "上海市交通事故热力图") ``` 4. **高级分析(时间序列预测)** ```r # 按周聚合数据 weekly_accidents <- accidents_clean %>% group_by(week = floor_date(date, "week")) %>% summarise(count = n()) # 使用prophet进行预测 library(prophet) df_prophet <- data.frame(ds = weekly_accidents$week, y = weekly_accidents$count) m <- prophet(df_prophet) future <- make_future_dataframe(m, periods = 4, freq = "week") forecast <- predict(m, future) prophet_plot_components(m, forecast)[^2] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值