使用 R 计算数据集中每个组的正态性

Calculate normality of each group in a dataset using R

我有一个包含大约 7 个条目的数据集。假设它有 5 列:

Cust_Id(around 340 unique Ids), Expense_Type, Expense($), Income_Type and Income($).

我想检查统计分析确定的任何 Cust_Id 组内收入和支出的相对稳定性。

我使用R的summaryBy函数找出了数据的统计信息(均值、中值、标准差)。

现在我想找出每组 Cust_Id 的正态性。我使用了 shapiro.test() 函数,但它会导致整个数据而不是分组值的正态性得分。我是否走在解决需求的正确道路上?我是这个领域的新手。请提出解决这个问题的方法。

示例数据:

Cust_Id  Income_Type  Income  Expense_Type  Expense
10001    ABC          4356.89  XYZ          569.45
10003    DEF          5678.34  PQR          4532.43
10006    FRG          5783.43  JHK          9724.56
10001    DEG          5345.34  HTY          7856.34
10008    HGT          678.67   KIL          7893.13
10003    GRT          678.67   JHK          6544.11

不确定我是否理解问题。示例数据会有所帮助。如果您要测试每列的正态性,您可以 运行 对每个相关列进行测试。

例如,如果您的数据集名为 data 并且是 data.table,请参阅 class(data)

Expense <- data$Expense 
shapiro.test(Expense)

您可以遍历各列(请参阅 apply 函数系列),或者如果您只有几列,则只需在相关的地方重复上述操作即可。

根据您想要弄清楚的内容,有多项测试: https://en.wikipedia.org/wiki/Normality_test#Frequentist_tests

如果你说一百万 Cust_Id 其中有 340 个独特的,你可以为每个独特的组创建子 tables 并测试每个组的正常性。如果这是您想要的,我可以编写一个循环,然后为您提供 340 个唯一 ID 中每个特定列的正态性?

类似于:

library(data.table)
data <- data.table(data)

对于一个 id:

id_10 <- data[Cust_Id == 10]

id_10的考试费用:

shapiro.test(id_10$Expense)

循环播放:

for(i in unique(data$Cust_Id)){
       u <- setDT(data)[Cust_Id == i]
       s <- shapiro.test(u$Expense)
       print(i)
       print(s)
      }

或者创建子集,然后对每个子集应用测试:

for(i in unique(data$Cust_Id)){
     assign(paste0("id",i),setDT(data)[Cust_Id== i])
    }

另一种方法是按唯一 ID 拆分:

 z<-split(data,data$Cust_Id)
for(i in z){print(shapiro.test(i$Expense))}

编辑

要在 table 中得到结果:

使用样本table:

   x <- data.frame(a=c(1,1,1,2,2,2,3,3,3,4,4,4),y=c(100,10,20,20,35,50,1,2,3,4,5,100),z=c(1,2,3,4,5,6,7,8,9,10,11,12))

df <- setDT(x)[, .(Normality_y = shapiro.test(y), Normality_z = shapiro.test(z), Count = .N), by = a]

df 将在末尾显示 y 和 z 列的正态性以及唯一 ID 的计数。请注意,对于每个 ID,normality_y 数据框中的第一个数字是 W 值,第二个数字是 p 值。

要清理它:

library(plyr)
df2 <- ddply(df, "a", function(z) head(z,2))

现在对于每个 ID,您将有两行用于 W 和 p 值。我使用了 y 和 z 列,您可以将它们更改为费用和收入等。添加更多列的语法应该很简单

尝试对数据进行子集化,您可以使用循环并将结果存储在列表中。

listids <- list()
for (ids in unique(df$Cust_Ids)){
    subdf <- subset(x=df, subset=Cust_Ids==ids)
    # apply the rest of your analysis there using subdf, for instance 
    listids[[ids]] <- shapiro.test(subdf$Expense)
}