Outil en ligne de commande pour calculer les statistiques de base pour le flux de valeurs [fermé]

27

Existe-t-il un outil en ligne de commande qui accepte le flux de nombres (au format ascii) à partir de l'entrée standard et donne les statistiques descriptives de base pour ce flux, telles que min, max, moyenne, médiane, RMS, quantiles, etc.? La sortie peut être analysée par la prochaine commande dans la chaîne de ligne de commande. L'environnement de travail est Linux, mais d'autres options sont les bienvenues.

mbaitoff
la source
1
Je recommanderais de jeter un œil à | STAT . C'est un logiciel assez ancien, mais il est très pratique pour de telles choses. Il y a aussi pyp et plusieurs autres outils Un * x.
chl
@chl Lien ISTAT cassé. Pouvez-vous le mettre à jour ou en faire une réponse, s'il vous plaît?
Léo Léopold Hertz 준영
1
@Masi Yup, il semble que la page n'existe plus. Voici un lien mis à jour .
chl
stackoverflow.com/questions/9789806/… || serverfault.com/questions/548322/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Réponses:

22

Vous pouvez le faire avec R , ce qui peut être un peu exagéré ...

EDIT 2: [OOPS, on dirait que quelqu'un d'autre a frappé avec Rscript pendant que je retapais cela.] J'ai trouvé un moyen plus facile. Installé avec R devrait être Rscript, qui est censé faire ce que vous essayez de faire. Par exemple, si j'ai un fichier barqui contient une liste de nombres, un par ligne:

cat bar | Rscript -e 'summary (as.numeric (readLines ("stdin")))'

Canalisera ces nombres dans R et exécutera la summarycommande de R sur les lignes, retournant quelque chose comme:

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1.00    2.25    3.50    3.50    4.75    6.00 

Vous pouvez également faire quelque chose comme:

script -e 'quantile (as.numeric (readLines ("stdin")), probs=c(0.025, 0.5, 0.975))'

pour obtenir des quantiles. Et vous pouvez évidemment couper la première ligne de sortie (qui contient des étiquettes) avec quelque chose comme:

cat bar | Rscript -e 'summary (as.numeric (readLines ("stdin")))' | tail -n +2

Je recommande fortement de faire d'abord ce que vous voulez dans R interactif, pour vous assurer que la commande est correcte. En essayant cela, j'ai omis la parenthèse fermante et Rscript ne renvoie rien - pas de message d'erreur, pas de résultat, juste rien.

(Pour mémoire, la barre de fichiers contient:

1
2
3
4
5
6
Wayne
la source
Donc, je devrais ajouter mon flux à ces Rcommandes?
mbaitoff
@mbaitoff: Oui. Pour mon test, j'ai créé un fichier fooqui contenait le summary (as.numeric (readLines()))comme première ligne, puis un élément de données numérique par ligne pour le reste du fichier. Le readLines()lit simplement depuis stdin (qui est tout ce qui suit, jusqu'à la fin du fichier).
Wayne
On dirait que nous sommes sérieusement coincés Rdans les deux réponses, et cela semble être un énorme outil pour une petite tâche. Eh bien, les réponses fonctionnent, mais de toute façon, y a-t-il autre chose sauf R?
mbaitoff
2
@mbaitoff: Vous pouvez utiliser Python avec scipy, surtout si vous utilisez déjà Python. Si vous utilisez / comme Clojure (lisp basé sur JVM, clojure.org ), il y a l' environnement statistique Incanter( incanter.org ) construit sur cela. Vous pouvez également essayer gnu Octave.
Wayne
21

Essayez "st":

$ seq 1 10 | st
N   min   max   sum   mean  stddev
10  1     10    55    5.5   3.02765

$ seq 1 10 | st --transpose
N       10
min     1
max     10
sum     55
mean    5.5
stddev  3.02765

Vous pouvez également voir le résumé à cinq chiffres:

$ seq 1 10 | st --summary
min  q1    median   q3    max
1    3.5   5.5      7.5   10

Vous pouvez le télécharger ici:

https://github.com/nferraz/st

(AVERTISSEMENT: j'ai écrit cet outil :))

user2747481
la source
Bienvenue sur le site, @ user2747481. Pourriez-vous étoffer un peu cette réponse? Nous aimerions que nos réponses soient pour la plupart autonomes. Puisque vous êtes nouveau ici, vous voudrez peut-être lire notre page à propos , qui contient des informations pour les nouveaux utilisateurs.
gung - Rétablir Monica
Merci! À partir de 2019 stest disponible via Homebrewbrew install st
Noah Sussman le
Méfiez-vous qui stpeut également faire référence à simple terminal.
Skippy le Grand Gourou
10

R fournit une commande appelée Rscript . Si vous ne disposez que de quelques chiffres que vous pouvez coller sur la ligne de commande, utilisez cette ligne:

Rscript -e 'summary(as.numeric(commandArgs(TRUE)))' 3 4 5 9 7

ce qui se traduit par

Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
3.0     4.0     5.0     5.6     7.0     9.0 

Si vous souhaitez lire à partir de l'entrée standard, utilisez ceci:

echo 3 4 5 9 7 | Rscript -e 'summary(as.numeric(read.table(file("stdin"))))'

Si les nombres sur l'entrée standard sont séparés par des retours chariot (c'est-à-dire un nombre par ligne), utilisez

Rscript -e 'summary(as.numeric(read.table(file("stdin"))[,1]))'

On peut créer des alias pour ces commandes:

alias summary='Rscript -e "summary(as.numeric(read.table(file(\"stdin\"))[,1]))"'
du -s /usr/bin/* | cut -f1 | summary
Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
0.0     8.0    20.0    93.6    44.0  6528.0
Arnaud A
la source
+1: Désolé, je venais de trouver Rscript et de modifier ma réponse pour l'inclure, nous nous sommes donc retrouvés avec une réponse similaire. Votre read.tableidée est un bon moyen de contourner un article par ligne.
Wayne
Ok, merci pour l'accusé de réception et le +1.
Arnaud A
3

datamash est une autre excellente option. Cela vient du projet GNU.

Si vous avez homebrew / linuxbrew, vous pouvez faire:

brew install datamash

Owen
la source
2

Il y a aussi simple-r, qui peut faire presque tout ce que R peut faire, mais avec moins de touches:

https://code.google.com/p/simple-r/

Pour calculer les statistiques descriptives de base, il faudrait taper l'un des éléments suivants:

r summary file.txt
r summary - < file.txt
cat file.txt | r summary -

N'obtient pas de simple-R!

user30888
la source
2

Il y a sta, qui est une variante c ++ de st, également référencé dans ces commentaires.

Étant écrit en c ++, il est rapide et peut gérer de grands ensembles de données. Il est simple à utiliser, comprend le choix d'estimateurs non biaisés ou biaisés et peut produire des informations plus détaillées telles que l'erreur standard.

Vous pouvez télécharger sta sur github .

Avertissement: je suis l'auteur de sta .

Simon
la source
1

Juste au cas où, il y a un datastat

https://sourceforge.net/p/datastat/code/

un programme simple pour Linux calculant des statistiques simples à partir de la ligne de commande. Par exemple,

cat file.dat | datastat

affichera la valeur moyenne sur toutes les lignes pour chaque colonne de file.dat. Si vous avez besoin de connaître l'écart type, min, max, vous pouvez ajouter les options --dev, --min et --max, respectivement.

datastat a la possibilité d'agréger des lignes en fonction de la valeur d'une ou plusieurs colonnes "clés".

Il est écrit en C ++, s'exécute rapidement et avec peu d'occupation de mémoire, et peut être joliment canalisé avec d'autres outils tels que cut, grep, sed, sort, awk, etc.

Tommaso
la source
1

Vous pourriez également envisager d'utiliser des clistats . Il s'agit d'un outil d'interface de ligne de commande hautement configurable pour calculer les statistiques d'un flux de nombres d'entrée délimités.

Options d'E / S

  • Les données d'entrée peuvent provenir d'un fichier, d'une entrée standard ou d'un tuyau
  • La sortie peut être écrite dans un fichier, une sortie standard ou un tube
  • La sortie utilise des en-têtes qui commencent par "#" pour permettre à la tuyauterie de gnuplot

Options d'analyse

  • Détection de signal, de fin de fichier ou de ligne vierge pour arrêter le traitement
  • Le caractère de commentaire et de délimiteur peut être défini
  • Les colonnes peuvent être filtrées du traitement
  • Les lignes peuvent être filtrées du traitement en fonction de la contrainte numérique
  • Les lignes peuvent être filtrées du traitement en fonction de la contrainte de chaîne
  • Les lignes d'en-tête initiales peuvent être ignorées
  • Un nombre fixe de lignes peut être traité
  • Les délimiteurs en double peuvent être ignorés
  • Les lignes peuvent être remodelées en colonnes
  • Appliquer strictement que seules les lignes de même taille sont traitées
  • Une ligne contenant les titres des colonnes peut être utilisée pour titrer les statistiques de sortie

Options statistiques

  • Statistiques récapitulatives (nombre, minimum, moyenne, maximum, écart type)
  • Covariance
  • Corrélation
  • Décalage des moindres carrés
  • Pente des moindres carrés
  • Histogramme
  • Données brutes après filtrage

REMARQUE: je suis l'auteur.

dpmcmlxxvi
la source
1

Un outil qui pourrait être utilisé pour calculer des statistiques et afficher la distribution en mode ASCII est ministat . C'est un outil de FreeBSD, mais il est également empaqueté pour une distribution Linux populaire comme Debian / Ubuntu.

Exemple d'utilisation:

$ cat test.log 
Handled 1000000 packets.Time elapsed: 7.575278
Handled 1000000 packets.Time elapsed: 7.569267
Handled 1000000 packets.Time elapsed: 7.540344
Handled 1000000 packets.Time elapsed: 7.547680
Handled 1000000 packets.Time elapsed: 7.692373
Handled 1000000 packets.Time elapsed: 7.390200
Handled 1000000 packets.Time elapsed: 7.391308
Handled 1000000 packets.Time elapsed: 7.388075

$ cat test.log| awk '{print $5}' | ministat -w 74
x <stdin>
+--------------------------------------------------------------------------+
| x                                                                        |
|xx                                   xx    x x                           x|
|   |__________________________A_______M_________________|                 |
+--------------------------------------------------------------------------+
    N           Min           Max        Median           Avg        Stddev
x   8      7.388075      7.692373       7.54768     7.5118156    0.11126122
dr.
la source
0

X¯n=(n-1)X¯n-1+Xnn
sn2=Snn-1
Sn=Sn-1+(Xn-X¯n-1)(Xn-X¯n).

X¯0=S0=0

Dennis
la source
xjeFLOAT_MAX-1.0Xje-Xje+1Xje-Xje-1
C'est en fait ce que font les clistats (voir la réponse pour plus de détails et d'autres fonctionnalités).
dpmcmlxxvi
0

Je suis tombé sur ce vieux fil à la recherche d'autre chose. Je voulais la même chose, je n'ai rien trouvé de simple, donc je l'ai fait en perl, assez trivial, mais utilisez-le plusieurs fois par jour: http://moo.nac.uci.edu/~hjm/stats

Exemple:

 $ ls -l | scut -f=4 | stats                
Sum       9702066453
Number    501
Mean      19365402.1017964
Median    4451
Mode      4096  
NModes    15
Min       0
Max       2019645440
Range     2019645440
Variance  1.96315423371944e+16
Std_Dev   140112605.91822
SEM       6259769.58393047
Skew      10.2405932543676
Std_Skew  93.5768354979843
Kurtosis  117.69005473429

(scut est une version plus lente, mais sans doute plus facile à couper): http://moo.nac.uci.edu/~hjm/scut décrit: http://moo.nac.uci.edu/~hjm/scut_cols_HOWTO. html

Harry Mangalam
la source
0

Un autre outil: résumé tsv des utilitaires TSV d' eBay . Prend en charge de nombreuses statistiques sommaires de base, telles que min, max, moyenne, médiane, quantiles, écart-type, MAD et quelques autres. Il est destiné aux grands ensembles de données et prend en charge plusieurs champs et le regroupement par clé. La sortie est séparée par des tabulations. Un exemple pour la séquence des nombres 1 à 1000, un par ligne:

$ seq 1000 | tsv-summarize --min 1 --max 1 --median 1 --sum 1
1   1000    500.5   500500

Les en-têtes sont normalement générés à partir d'une ligne d'en-tête dans l'entrée. Si l'entrée n'a pas d'en-tête, une peut être ajoutée à l'aide du -wcommutateur:

$ seq 1000 | tsv-summarize -w --min 1 --max 1 --median 1 --sum 1
field1_min  field1_max  field1_median   field1_sum
1   1000    500.5   500500

Avertissement: je suis l'auteur.

JonDeg
la source