как можно иметь дело с х должна быть числовая ошибка в корреляционном графике? - PullRequest
2 голосов
/ 06 июля 2019

Я пытаюсь создать корреляционный график для моих данных, но я получаю 'x должно быть числовой ошибкой', другие исправления не сработали для моего случая. Нужно ли мне менять месяц на числовой? или есть способ выбора только числовых столбцов для моего графика

Пытался преобразовать все в числовые значения, но он просто автоматически возвращается в коэффициент

getwd()
myDF <- read.csv("qbase.csv")
head(myDF)
str(myDF)

cp <-cor(myDF)
head(round(cp,2))

'data.frame':   12 obs. of  8 variables:
 $ Month                    : Factor w/ 12 levels "18-Apr","18-Aug",..: 5 4 8 1 9 7 6 2 12 11 ...
 $ Monthly.Recurring.Revenue: Factor w/ 2 levels "$25,000 ","$40,000 ": 1 1 1 1 1 2 2 2 2 2 ...
 $ Price.per.Seat           : Factor w/ 2 levels "$40 ","$50 ": 2 2 2 2 2 1 1 1 1 1 ...
 $ Paid.Seats               : int  500 500 500 500 500 1000 1000 1000 1000 1000 ...
 $ Active.Users             : int  10 50 50 100 450 550 800 900 950 800 ...
 $ Support.Cases            : int  0 0 1 5 35 155 100 75 50 45 ...
 $ Users.Trained            : int  1 5 0 50 100 300 50 30 0 100 ...
 $ Features.Used            : int  5 5 5 5 8 9 9 10 15 15 ...

Результаты для dput(myDF) следующие:

dput( myDF)

structure(list(Month = structure(c(5L, 4L, 8L, 1L, 9L, 7L, 6L, 
2L, 12L, 11L, 10L, 3L), .Label = c("18-Apr", "18-Aug", "18-Dec", 
"18-Feb", "18-Jan", "18-Jul", "18-Jun", "18-Mar", "18-May", "18-Nov", 
"18-Oct", "18-Sep"), class = "factor"), Monthly.Recurring.Revenue = structure(c(1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("$25,000 ", 
"$40,000 "), class = "factor"), Price.per.Seat = structure(c(2L, 
2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("$40 ", 
"$50 "), class = "factor"), Paid.Seats = c(500L, 500L, 500L, 
500L, 500L, 1000L, 1000L, 1000L, 1000L, 1000L, 1000L, 1000L), 
    Active.Users = c(10L, 50L, 50L, 100L, 450L, 550L, 800L, 900L, 
    950L, 800L, 700L, 600L), Support.Cases = c(0L, 0L, 1L, 5L, 
    35L, 155L, 100L, 75L, 50L, 45L, 10L, 5L), Users.Trained = c(1L, 
    5L, 0L, 50L, 100L, 300L, 50L, 30L, 0L, 100L, 50L, 0L), Features.Used = c(5L, 
    5L, 5L, 5L, 8L, 9L, 9L, 10L, 15L, 15L, 15L, 15L)), class = "data.frame", row.names = c(NA, 
-12L))

Ответы [ 4 ]

1 голос
/ 06 июля 2019

Вы можете преобразовать даты в POSIXct, а также удалить знак доллара, чтобы преобразовать второй и третий столбцы в числовые значения:

myDF$Month <- as.numeric(as.POSIXct(myDF$Month, format="%d-%b", tz="GMT"))
myDF[,c(2,3)] <-  sapply(myDF[,c(2,3)], function(x) as.numeric(gsub("[\\$,]", "", x)))

cp <-cor(myDF)

library(ggcorrplot)
ggcorrplot(cp)
0 голосов
/ 07 июля 2019

Способ преобразования этих месяцев в класс Date:

myDF$MonDt <- as.Date( paste0(myDF$Month, "-15"), format="%y-%b-%d")

Мог бы также использовать zoo::as.yearmon. Любой метод позволит вам применить as.numeric, чтобы получить действительное масштабированное по времени значение. Другие ответы являются адекватными при использовании данных за один год, но поскольку они ошибочно предполагают, что первые две цифры - это день месяца, а не года, они не смогут предоставить действительные ответы в любом многолетнем наборе данных, но не бросайте никаких предупреждений об этом.

with(myDF, cor(Active.Users, as.numeric(MonDt) )  )
[1] 0.8269705

Как показал один из других ответов, удаление $ и запятых необходимо до того, как as.numeric будет работать с текстом в формате валюты. Опять же, это также факторные данные, поэтому as.numeric мог дать ошибочные ответы, хотя в этом простом примере это не так. Безопасный метод будет:

myDF[2:3] <- lapply(myDF[2:3], function(x) as.numeric( gsub("[$,]", "", x)))

myDF
    Month Monthly.Recurring.Revenue Price.per.Seat Paid.Seats Active.Users
1  18-Jan                     25000             50        500           10
2  18-Feb                     25000             50        500           50
3  18-Mar                     25000             50        500           50
4  18-Apr                     25000             50        500          100
5  18-May                     25000             50        500          450
6  18-Jun                     40000             40       1000          550
7  18-Jul                     40000             40       1000          800
8  18-Aug                     40000             40       1000          900
9  18-Sep                     40000             40       1000          950
10 18-Oct                     40000             40       1000          800
11 18-Nov                     40000             40       1000          700
12 18-Dec                     40000             40       1000          600
   Support.Cases Users.Trained Features.Used      MonDt
1              0             1             5 2018-01-15
2              0             5             5 2018-02-15
3              1             0             5 2018-03-15
4              5            50             5 2018-04-15
5             35           100             8 2018-05-15
6            155           300             9 2018-06-15
7            100            50             9 2018-07-15
8             75            30            10 2018-08-15
9             50             0            15 2018-09-15
10            45           100            15 2018-10-15
11            10            50            15 2018-11-15
12             5             0            15 2018-12-15

На этот вопрос получен ответ, позволяющий рассчитать несколько коэффициентов корреляции и сопоставить двусторонние связи данных на одной странице:

Как добавить значения p для коэффициентов корреляции, построенных с использованием сплома в решетке?

0 голосов
/ 06 июля 2019

Вы можете удалить знак доллара и изменить целочисленные переменные на числовые с помощью sapply, а затем вычислить корреляцию.

myDF[,c(2,3)] <-  sapply(myDF[,c(2,3)], function(x) as.numeric(gsub("[\\$,]", "", x)))
newdf <-  sapply(myDF[,2:8],as.numeric)
cor(newdf)

Отредактировано:

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

Например:

library(lubridate)
myDF$Month<- month(as.POSIXct(myDF$Month, format="%d-%b", tz="GMT"))
myDF[,c(2,3)] <-  sapply(myDF[,c(2,3)], function(x) as.numeric(gsub("[\\$,]", "", x)))
newdf <-  sapply(myDF,as.numeric)
cor(as.data.frame(newdf))
0 голосов
/ 06 июля 2019

Вы пытаетесь получить корреляцию между факторами и числовыми столбцами, чего не может быть (cor обрабатывает только числовые значения, следовательно, ошибка).Вы можете сделать:

library(data.table)

ir <- data.table(iris) # since you didn't produce a reproducible example

ir[, cor(.SD), .SDcols = names(ir)[(lapply(ir, class) == "numeric")]]

что там находится:

cor(.SD) вычислит матрицу корреляции для нового кадра данных, состоящего из подмножества data.table (.SD, см. ?data.table).

.SDcols установить, какие столбцы войдут в это подмножество data.table.Это только те, чей класс numeric.

...