2016-09-14 3 views
2

У меня есть набор данных, содержащий около 7 лаков записей. Предположим, что она имеет 5 колонок:Вычислить нормальность каждой группы в наборе данных, используя R

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

Я хочу, чтобы проверить относительную стабильность доходов и расходов в рамках любой Cust_Id группы, как определено с помощью статистического анализа.

я узнал статистическую информацию (среднее, среднее, стандартное отклонение) данных с помощью summaryBy функции R.

Теперь я хочу, чтобы найти нормальность для каждой группы 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 
+0

Есть ли особые значения теста, который вы ищите? –

+0

Вы пробовали мой? Окончательный с использованием split довольно прост. Позвоните в данные выборочных данных и измените расходы ($) на доход для нормальности дохода каждой группы идентификаторов, как вы пытались сделать с ответом Седрика. –

+0

Извините, я думал, что ваш фрейм данных был назван Cust_id, я изменил свой сценарий. – Cedric

ответ

2

Попробуйте подмножество данных, вы можете использовать цикл и сохранять результаты в списке.

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) 
} 
+0

Как и в случае с Оли, вы также можете использовать применение, которое было бы быстрее – Cedric

+0

Помогая новым пользователям, важно получить простые вещи, такие как имена фреймов данных, как они есть. Вы знаете, чтобы изменить имена для соответствия, но они этого не делают. Вы назвали объект 'Cust_Id' столбец' Ids', и у них есть объект с именем 'df' с столбцом' Cust_Id'. –

+0

Я понимаю, что OP не задал имя фрейма данных в вопросе, но даже при этом вызов объекта 'Cust_Id', безусловно, приведет к ошибкам. –

0

Не уверен, что понял вопрос. Примеры данных помогут. Если вы хотите проверить нормальность каждого столбца, вы можете просто запустить тест в каждом соответствующем столбце.

Например, если ваш набор данных называется data и является data.table см class(data):

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

Вы можете перебрать столбцов (см apply функции семьи), или если у вас есть только несколько просто повторите выше, если это необходимо.

В зависимости от того, что вы пытаетесь выяснить, есть несколько тестов: https://en.wikipedia.org/wiki/Normality_test#Frequentist_tests

Если у вас есть сказать, миллион Cust_Id, где есть 340 уникальных, вы можете создать суб-таблицу для каждой уникальной группы и испытания нормальность каждой группы. Если это то, что вы хотите, я могу написать цикл, который затем даст вам нормальность для определенных столбцов для каждого из 340 уникальных идентификаторов?

Что-то вроде:

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

Для одного идентификатора:

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]) 
    } 

Другим способом будет расколоть уникальный идентификатор:

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

EDIT

Чтобы получить результаты в таблице :

Используя образец таблицы:

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 и количество уникальных идентификаторов в конце. Примечание для каждого идентификатора первое число в кадре данных для normality_y является значением W, а второе - значением p.

Чтобы очистить это:

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

Теперь для каждого ID вы будете иметь два ряда для W и р значение. Я использовал столбцы y и z, которые вы можете изменить на расход и доход и многое другое. Синтаксис должен быть прямым для добавления дополнительных столбцов.

+0

R не принимает значение $. Я пытался использовать ваш код, но он не работает. Ошибка «неожиданна» $ '". Я удалил $ и использованные данные ["Cust_Id"], а затем снова получил ошибку «Когда i является data.table (или символьным вектором), x должен быть введен ключ (т. Е. Отсортирован и помечен как отсортированный)». Я отсортировал кадр данных, но опять же ту же ошибку. – r1sC

+0

Я скопировал ваши данные образца в excel. Разделите его на дополнительные столбцы с разделителем пространства. Затем скопировали это и получили его в R, выполнив: x <- read.table ("clipboard", sep = "\ t", header = T). Если это файл, вы можете использовать read.csv. Являются ли ваши данные data.table? Вы проверили с помощью класса (данных), где данные являются именем набора данных? –

+1

Не используйте 'Expense ($)' как имя столбца. В этом примере ясно, что ОП помогает нам узнать, какие данные они хранят. В их примерном фрейме вы можете увидеть заголовки столбцов, включая 'Expense'. –