在R中按欺诈因子拟合Gamma分布并绘制分组对比曲线
分组拟合Gamma分布并绘制对比曲线方案
你已经迈出了最关键的第一步,我来帮你把剩下的流程补全,实现按fraud分组拟合Gamma分布,并画出区分两组的拟合曲线。以下是完整的R代码和步骤说明:
1. 加载必要工具包
首先确保你安装了fitdistrplus(用来拟合概率分布)和ggplot2(用来绘制美观的图形),如果没安装先执行安装命令:
install.packages(c("fitdistrplus", "ggplot2"))
然后加载包:
library(fitdistrplus) library(ggplot2)
2. 完成两组的Gamma分布拟合
假设你的数据框是df,继续完成欺诈组(fraud=1)和非欺诈组(fraud=0)的拟合:
# 拟合欺诈组的Gamma分布 fit.gamma1 <- fitdist(df$amount[df$fraud == 1], distr = "gamma") # 拟合非欺诈组的Gamma分布 fit.gamma0 <- fitdist(df$amount[df$fraud == 0], distr = "gamma")
注意:如果你的
amount列存在0值,Gamma分布的定义域是x>0,会导致拟合失败。遇到这种情况可以给0值加一个极小的偏移量,比如:df$amount[df$amount == 0] <- 1e-6
3. 生成拟合曲线的数据源
为了画出平滑的曲线,我们需要生成一系列连续的x值,并计算对应两组Gamma分布的密度值:
# 取交易金额的范围生成1000个连续点 x_vals <- seq(min(df$amount), max(df$amount), length.out = 1000) # 计算欺诈组的Gamma密度 y_gamma1 <- dgamma(x_vals, shape = fit.gamma1$estimate["shape"], rate = fit.gamma1$estimate["rate"]) # 计算非欺诈组的Gamma密度 y_gamma0 <- dgamma(x_vals, shape = fit.gamma0$estimate["shape"], rate = fit.gamma0$estimate["rate"])
4. 绘制对比曲线(结合直方图)
用ggplot2绘制原始数据的直方图,并叠加两条拟合曲线,这样能直观对比数据分布和拟合效果:
ggplot(df, aes(x = amount)) + # 绘制两组的直方图(按密度缩放,半透明叠加) geom_histogram(aes(fill = factor(fraud), y = ..density..), alpha = 0.5, bins = 30, position = "identity") + # 添加欺诈组的拟合曲线 geom_line(aes(x = x_vals, y = y_gamma1, color = "欺诈组"), size = 1, linetype = "solid") + # 添加非欺诈组的拟合曲线 geom_line(aes(x = x_vals, y = y_gamma0, color = "非欺诈组"), size = 1, linetype = "dashed") + # 设置颜色映射 scale_fill_manual(values = c("0" = "#63B8FF", "1" = "#FF6347")) + scale_color_manual(values = c("欺诈组" = "#FF4500", "非欺诈组" = "#1E90FF")) + # 设置图表标签 labs(title = "交易金额的Gamma分布拟合(欺诈vs非欺诈)", x = "交易金额", y = "密度", fill = "欺诈标记", color = "拟合曲线") + # 使用简洁主题 theme_minimal()
额外小技巧
如果你想查看拟合的参数和诊断信息,可以直接打印拟合对象:
print(fit.gamma1) print(fit.gamma0) # 绘制拟合诊断图(Q-Q图、密度对比等) plot(fit.gamma1) plot(fit.gamma0)
内容的提问来源于stack exchange,提问作者steves
相关产品推荐
相关产品推荐

