4 votes

Quel progiciel pouvez-vous suggérer à un programmeur qui travaille rarement avec des statistiques ?

En tant que programmeur, j'ai parfois besoin d'analyser de grandes quantités de données, comme des journaux de performances ou des données sur l'utilisation de la mémoire, et je suis toujours frustré par le temps qu'il me faut pour faire quelque chose qui devrait être plus facile.

Pour replacer la question dans son contexte, laissez-moi vous montrer rapidement un exemple tiré d'un fichier CSV que j'ai reçu aujourd'hui (fortement filtré pour des raisons de brièveté) :

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

J'ai environ 100 000 points de données de ce type avec différentes variables que je veux représenter dans un diagramme de dispersion afin de rechercher des corrélations. En général, les données doivent être traitées d'une manière ou d'une autre à des fins de présentation (comme la conversion des nanosecondes en millisecondes et l'arrondissement des valeurs fractionnaires), certaines colonnes doivent être ajoutées, inversées ou combinées (comme les colonnes de date et d'heure).

La recommandation habituelle pour ce type de travail est R et j'ai récemment fait un effort sérieux pour l'utiliser, mais après quelques jours de travail, mon expérience a été que la plupart des tâches que je m'attends à être simples semblent nécessiter de nombreuses étapes et avoir des cas particuliers ; les solutions sont souvent non génériques (par exemple, ajouter un ensemble de données à un graphique existant ). Il semble que ce soit l'un de ces langages que les gens aiment en raison de toutes les puissantes bibliothèques qui se sont accumulées au fil des ans, plutôt que pour la qualité et l'utilité du langage de base.

Ne vous méprenez pas, je comprends la valeur de R pour les personnes qui l'utilisent, mais étant donné que je consacre rarement du temps à ce genre de choses, je pense que je ne deviendrai jamais un expert en la matière, et pour un non-expert, chaque tâche devient trop lourde.

Microsoft Excel est excellent en termes de convivialité, mais il n'est tout simplement pas assez puissant pour traiter de grands ensembles de données. De plus, R et Excel ont tous deux tendance à se figer complètement ( !), sans autre issue que d'attendre ou de tuer le processus si vous réalisez accidentellement le mauvais type de graphique sur un trop grand nombre de données.

Alors, stack overflow, pouvez-vous me recommander quelque chose qui me convienne mieux ? Je ne voudrais pas avoir à abandonner et à développer mon propre outil, j'ai déjà assez de projets. J'aimerais quelque chose d'interactif qui pourrait utiliser l'accélération matérielle pour le tracé et/ou l'élimination pour éviter de passer trop de temps sur le rendu.

9voto

Gavin Simpson Points 72349

@flodin Il aurait été utile que vous fournissiez un exemple du code que vous utilisez pour lire un tel fichier dans R. Je travaille régulièrement avec des ensembles de données de la taille que vous mentionnez et je n'ai pas les problèmes que vous mentionnez. Si vous n'utilisez pas souvent R, il se peut que vous ayez un problème. En effet, si vous n'indiquez pas à R les types de colonnes, il doit d'abord fouiner dans le fichier, ce qui prend du temps. Regardez l'argument colClasses en ?read.table .

Pour votre exemple de fichier, je ferais :

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

puis post-traiter le date y time dans une classe d'objets date-heure R telle que POSIXct avec quelque chose comme :

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

À titre d'exemple, lisons votre ensemble de données d'exemple, répliquons-le 50 000 fois et écrivons-le, puis essayons différentes manières de le lire, avec foo contenant vos données :

> 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

Reproduisez ça, 50000 fois :

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)

Écrivez-le

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

Le chargement du temps à la manière naïve et à la manière correcte :

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

Ce qui est très rapide sur mon modeste ordinateur portable :

> 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

Pour les deux façons de lire dans.

En ce qui concerne le traçage, les graphiques peuvent être un peu lents, mais selon votre système d'exploitation, cela peut être accéléré un peu en modifiant le dispositif de traçage - sous Linux par exemple, n'utilisez pas le dispositif par défaut X11() qui utilise Cairo, au lieu d'essayer l'ancienne fenêtre X sans anticrénelage. De plus, qu'espérez-vous voir avec un ensemble de données aussi grand que 100 000 observations sur un dispositif graphique avec peu de pixels ? Essayez peut-être de repenser votre stratégie d'analyse des données --- aucun logiciel de statistiques ne pourra vous éviter de faire quelque chose de malavisé.

On dirait que vous développez le code/analyse au fur et à mesure, sur l'ensemble des données. Il serait beaucoup plus judicieux de travailler avec un petit sous-ensemble de données lors du développement d'un nouveau code ou de nouvelles façons de voir vos données, par exemple avec un échantillon aléatoire de 1000 lignes, et de travailler avec cet objet plutôt qu'avec l'ensemble des données. De cette façon, vous évitez de faire accidentellement quelque chose qui est lent :

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

par exemple. Utilisez ensuite working au lieu de sortir. Alternativement, pendant que vous testez et écrivez un script, définissez l'argument nrows pour dire 1000 dans l'appel pour charger les données dans R (voir ?read.csv ). De cette façon, pendant les tests, vous ne lisez qu'un sous-ensemble des données, mais un simple changement vous permettra d'exécuter votre script sur l'ensemble des données.

Pour des ensembles de données de la taille dont vous parlez, je ne vois aucun problème à utiliser R. Votre remarque, à savoir que vous ne devenez pas suffisamment expert pour utiliser R, s'appliquera très probablement aux autres langages de script qui pourraient être suggérés, comme python. Il y a une barrière à l'entrée, mais il faut s'y attendre si vous voulez la puissance d'un langage tel que python ou R. Si vous écrivez des scripts qui sont bien commentés (au lieu de simplement vous brancher sur la ligne de commande), et que vous vous concentrez sur quelques importations/manipulations de données clés, un peu de traçage et quelques analyses simples, il ne devrait pas vous falloir longtemps pour maîtriser ce petit sous-ensemble du langage.

5voto

Fredrik Pihl Points 20944

R est un outil formidable, mais je n'ai jamais eu à recourir à son utilisation. Je trouve plutôt que Python est plus qu'adéquat pour mes besoins lorsque je dois extraire des données d'énormes journaux. Python est vraiment livré "batteries incluses" avec un support intégré pour travailler avec les éléments suivants Fichiers csv

L'exemple le plus simple de lecture d'un fichier CSV :

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

Pour utiliser un autre séparateur, par ex. tab et extraire la nième colonne, utiliser

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

Pour opérer sur des colonnes, utilisez la fonction intégrée liste type de données, c'est extrêmement polyvalent !

Pour créer de belles parcelles, j'utilise matplotlib scatter plot code

El tutoriel python est un excellent moyen de commencer ! Si vous êtes bloqué, il y a toujours stackoverflow ;-)

2voto

Richie Cotton Points 35365

Il semble y avoir plusieurs questions mélangées :

  1. Pouvez-vous dessiner des tracés plus rapidement et plus facilement ?

  2. Pouvez-vous faire des choses en R avec moins d'effort d'apprentissage ?

  3. Existe-t-il d'autres outils qui nécessitent un effort d'apprentissage moindre que R ?

Je vais y répondre à tour de rôle.

Il existe trois systèmes de traçage dans R, à savoir base, lattice et ggplot2 graphics. Les graphiques de base ont un rendu plus rapide, mais les rendre jolis peut impliquer un codage pathologique. ggplot2 est l'opposé, et lattice est quelque part entre les deux.

Lire des données CSV, les nettoyer et dessiner un nuage de points semble être une tâche assez simple, et les outils sont bien présents dans R pour résoudre de tels problèmes. Essayez de poser une question ici sur des bouts de code spécifiques qui vous semblent maladroits, et nous verrons si nous pouvons les corriger pour vous. Si vos ensembles de données sont tous similaires, vous pouvez probablement réutiliser la majeure partie de votre code à l'infini. Vous pouvez également donner à l application web ggplot2 un essai.

Les deux langages alternatifs évidents pour le traitement des données sont MATLAB (et ses dérivés : Octave , Scilab , AcslX ) et Python . L'un ou l'autre de ces outils répondra à vos besoins, et MATLAB, en particulier, a une courbe d'apprentissage assez faible. Enfin, vous pouvez choisir un outil spécifique aux graphes comme gnuplot o Prisme .

0voto

SAS peut traiter des ensembles de données plus importants que R ou Excel, mais beaucoup (sinon la plupart) de personnes, moi y compris, le trouvent beaucoup plus difficile à apprendre. En fonction de ce que vous devez faire, il peut être intéressant de charger le CSV dans un SGBDR et d'y effectuer certains calculs (par exemple, corrélations, arrondis), puis d'exporter uniquement ce dont vous avez besoin vers R pour générer des graphiques.

ETA : Il y a aussi SPSS y Révolution Le premier n'est peut-être pas en mesure de gérer la taille des données que vous avez, et le second est, d'après ce que j'ai entendu, une version distribuée de R (qui, contrairement à R, n'est pas libre).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X