Какой программный пакет вы можете предложить программисту, который редко работает со статистикой? - PullRequest
4 голосов
/ 06 июля 2011

Будучи программистом, я иногда сталкиваюсь с необходимостью анализировать большие объемы данных, таких как журналы производительности или данные об использовании памяти, и я всегда разочарован тем, сколько времени мне требуется, чтобы сделать что-то, что, как я ожидаю, будет проще.

В качестве примера, чтобы поставить вопрос в контекст, позвольте мне быстро показать вам пример из CSV-файла, который я получил сегодня (сильно отфильтрованный для краткости):

date,time,PS Eden Space used,PS Old Gen Used, PS Perm Gen Used
2011-06-28,00:00:03,45004472,184177208,94048296
2011-06-28,00:00:18,45292232,184177208,94048296

У меня около 100 000 таких точек данных с разными переменными, которые я хочу построить на диаграмме рассеяния, чтобы найти корреляции. Обычно данные необходимо каким-то образом обрабатывать для представления (например, для преобразования наносекунд в миллисекунды и округления дробных значений), некоторые столбцы, возможно, необходимо добавить, инвертировать или объединить (например, столбцы даты / времени).

Обычная рекомендация для такого рода работы - R, и я недавно приложил серьезные усилия, чтобы использовать его, но после нескольких дней работы мой опыт показал, что большинство задач, которые я ожидаю, будут простыми, кажется, требуют много шагов и есть особые случаи; решения часто не являются общими (например, добавляет набор данных к существующему графику ). Похоже, это один из тех языков, которые люди любят из-за всех мощных библиотек, накопленных за эти годы, а не из-за качества и полезности основного языка.

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

Microsoft Excel великолепен с точки зрения удобства использования, но он недостаточно мощен для обработки больших наборов данных. Кроме того, как R, так и Excel имеют тенденцию полностью зависать (!) Без какого-либо выхода, кроме как ждать или убить процесс, если вы случайно создаете неправильный тип графика на слишком большом количестве данных.

Итак, переполнение стека, можете ли вы порекомендовать что-нибудь, что лучше подходит для меня? Я бы не хотел сдаваться и разрабатывать свой собственный инструмент, у меня уже достаточно проектов. Мне бы хотелось что-нибудь интерактивное, которое могло бы использовать аппаратное ускорение для графика и / или отбора, чтобы не тратить слишком много времени на рендеринг.

Ответы [ 4 ]

9 голосов
/ 06 июля 2011

@ flodin Вам было бы полезно предоставить пример кода, который вы используете для чтения в таком файле R. Я регулярно работаю с наборами данных того размера, о котором вы упомянули, и у вас нет проблем, о которых вы упоминаете. Одна вещь, которая может вас кусать, если вы не часто используете R, это то, что если вы не говорите R, что такое тип столбца R, то сначала нужно выполнить некоторый поиск по файлу, и все это требует времени. Посмотрите на аргумент colClasses в ?read.table.

Для вашего примера я бы сделал:

dat <- read.csv("foo.csv", colClasses = c(rep("character",2), rep("integer", 3)))

затем постобработка переменных date и time в класс объектов даты и времени R, таких как POSIXct, с чем-то вроде:

dat <- transform(dat, dateTime = as.POSIXct(paste(date, time)))

В качестве примера, давайте прочитаем в вашем примере набор данных, скопируем его 50 000 раз и запишем, а затем предложим время для различных способов чтения, с foo, содержащим ваши данные:

> foo <- read.csv("log.csv")
> foo
        date     time PS.Eden.Space.used PS.Old.Gen.Used
1 2011-06-28 00:00:03           45004472       184177208
2 2011-06-28 00:00:18           45292232       184177208
  PS.Perm.Gen.Used
1         94048296
2         94048296

Повторите это, 50000 раз:

out <- data.frame(matrix(nrow = nrow(foo) * 50000, ncol = ncol(foo))) 
out[, 1] <- rep(foo[,1], times = 50000) 
out[, 2] <- rep(foo[,2], times = 50000) 
out[, 3] <- rep(foo[,3], times = 50000) 
out[, 4] <- rep(foo[,4], times = 50000) 
out[, 5] <- rep(foo[,5], times = 50000)
names(out) <- names(foo)

Выпиши

write.csv(out, file = "bigLog.csv", row.names = FALSE)

Время загрузки наивного и правильного пути:

system.time(in1 <- read.csv("bigLog.csv"))
system.time(in2 <- read.csv("bigLog.csv",
                            colClasses = c(rep("character",2), 
                                           rep("integer", 3))))

Что очень быстро на моем скромном ноутбуке:

> system.time(in1 <- read.csv("bigLog.csv"))
   user  system elapsed 
  0.355   0.008   0.366 
> system.time(in2 <- read.csv("bigLog.csv",
                              colClasses = c(rep("character",2), 
                                             rep("integer", 3))))
   user  system elapsed 
  0.282   0.003   0.287

Для обоих способов чтения в.

Что касается печати, графика может быть немного медленной, но в зависимости от вашей ОС это может быть немного ускорено путем изменения устройства, которое вы печатаете - в Linux, например, не используйте устройство по умолчанию X11(), который использует Cairo, вместо этого попробуйте старое окно X без сглаживания. Кроме того, что вы надеетесь увидеть с набором данных размером до 100 000 наблюдений на графическом устройстве с небольшим количеством пикселей? Возможно, попытайтесь переосмыслить вашу стратегию анализа данных - никакое программное обеспечение для статистики не сможет спасти вас от того, что вы сделали что-то дурное.

Звучит так, как будто вы разрабатываете код / ​​анализ в процессе работы над полным набором данных. Было бы гораздо разумнее просто работать с небольшим подмножеством данных при разработке нового кода или новых способов просмотра ваших данных, скажем, со случайной выборкой из 1000 строк, и работать с этим объектом вместо всего объекта данных. Таким образом вы защититесь от случайного медленного выполнения:

working <- out[sample(nrow(out), 1000), ]

например. Затем используйте working вместо out. В качестве альтернативы, во время тестирования и написания скрипта установите аргумент nrows, чтобы сказать 1000 в вызове для загрузки данных в R (см. ?read.csv). Таким образом, пока вы тестируете, вы читаете только подмножество данных, но одно простое изменение позволит вам запустить ваш скрипт для полного набора данных.

Для наборов данных такого размера, о которых вы говорите, я не вижу никаких проблем при использовании R. Ваша точка зрения о том, что вы не стали достаточно опытным, чтобы использовать R, будет более чем вероятно применима к другим языкам сценариев, которые могут быть предложены, например, как питон. Существует препятствие для входа, но этого следует ожидать, если вы хотите использовать мощь такого языка, как python или R. Если вы пишете сценарии, которые хорошо комментируются (вместо простого подключения к командной строке), и сосредоточитесь на несколько ключевых операций импорта / манипуляции с данными, немного прорисовки и некоторого простого анализа, освоение этого небольшого подмножества языка не займет много времени.

5 голосов
/ 06 июля 2011

R - отличный инструмент, но мне никогда не приходилось прибегать к нему.Вместо этого я нахожу, что python более чем достаточен для моих нужд, когда мне нужно извлечь данные из огромных журналов.Python действительно поставляется с «батарейками в комплекте» со встроенной поддержкой работы с csv-файлами

Простейший пример чтения файла CSV:

import csv
with open('some.csv', 'rb') as f:
    reader = csv.reader(f)
    for row in reader:
        print row

Чтобы использовать другой разделитель, например tab и извлечь n-й столбец, используйте

spamReader = csv.reader(open('spam.csv', 'rb'), delimiter='\t')
for row in spamReader:
   print row[n]

Для работы со столбцами используйте встроенный список тип данных, это чрезвычайно универсальный !

Для создания красивых сюжетов я использую matplotlib scatter plot код

Руководство по питону - отличный способ начать!Если вы застряли, всегда есть переполнение стека; -)

2 голосов
/ 06 июля 2011

Кажется, есть несколько вопросов, смешанных вместе:

  1. Можете ли вы рисовать графики быстрее и проще?

  2. Можете ли вы делать вещи в R с меньшими затратами на обучение?

  3. Существуют ли другие инструменты, требующие меньших усилий по обучению, чем R?

Я отвечу на них по очереди.

В R есть три системы построения графиков, а именно: графика base, lattice и ggplot2.Базовая графика будет отображаться быстрее, но для придания им привлекательного вида может потребоваться патологическое кодирование.ggplot2 противоположен, и решетка находится где-то посередине.

Чтение данных CSV, очистка их и рисование диаграммы рассеяния звучит как довольно простая задача, и в R определенно есть инструменты для решения таких проблем.Попробуйте задать вопрос о конкретных фрагментах кода, которые кажутся неуклюжими, и мы посмотрим, сможем ли мы исправить это для вас.Если все ваши наборы данных выглядят одинаково, то вы, вероятно, можете многократно использовать большую часть своего кода.Вы также можете попробовать веб-приложение ggplot2 .

Два очевидных альтернативных языка для обработки данных: MATLAB (и его производные: Octave , Scilab , AcslX ) и Python .Любой из них подойдет для ваших нужд, и MATLAB, в частности, имеет довольно мелкую кривую обучения.Наконец, вы можете выбрать инструмент для графов, например gnuplot или Prism .

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

SAS может обрабатывать большие наборы данных, чем R или Excel, однако многим (если не большинству) людям - включая меня - найти их намного сложнее в изучении. В зависимости от того, что именно вам нужно сделать, может быть, стоит загрузить CSV в RDBMS и выполнить там некоторые вычисления (например, корреляции, округления), а затем экспортировать только то, что вам нужно для R для генерации графики.

ETA: есть также SPSS и Revolution ; первый может не справиться с размером данных, которые вы получили, а второй, насколько я слышал, является распределенной версией R (которая, в отличие от R, не является бесплатной).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...