J'ai un tableau de chiffres. Quel est le moyen le plus simple de calculer la médiane, le mode et STD Dev pour le jeu de données? P>
3 Réponses :
Pourquoi n'y a-t-il pas Statistiques :: basique :: max code> ou statistiques :: basique :: min code> dans ce module?
Parce qu'ils sont dans la liste :: util, qui est dans le noyau.
En fonction de la profondeur, vous devez aller, la réponse d'Erickb peut fonctionner. Toutefois, pour la fonctionnalité numérique dans Perl, il y a pdl . Vous créeriez un piddle (l'objet contenant vos données) à l'aide du PDL code> fonction. À partir de là, vous pouvez utiliser les opérations sur Cette page pour faire les statistiques que vous avoir besoin.
Edit: En regardant autour de moi, j'ai trouvé deux appels de fonction qui font exactement ce dont vous avez besoin. STATSOVER CODE> donne des statistiques sur une dimension d'un pidon, tandis que statistiques code> fait la même chose sur tout le pid. p>
En fait, je n'avais pas entendu parler de PDL auparavant, je suppose que depuis la majeure partie de ce que j'ai fait a été le développement des outils Sysadmin et ce que rien. C'est vraiment vraiment cool, merci pour la pointe.
@Badfilemagic, j'ai été vraiment déçu après avoir vu une conversation sur une pensée engendrée / Scipy pensant que cela signifiait enfin que je devais quitter Perl pour Python. Puis j'ai trouvé pdl. Tout bon.
Jamais entendu ça avant. Semble incroyable!
#!/usr/bin/perl
#
# stdev - figure N, min, max, median, mode, mean, & std deviation
#
# pull out all the real numbers in the input
# stream and run standard calculations on them.
# they may be intermixed with other test, need
# not be on the same or different lines, and
# can be in scientific notion (avagadro=6.02e23).
# they also admit a leading + or -.
#
# Tom Christiansen
# tchrist@perl.com
use strict;
use warnings;
use List::Util qw< min max >;
sub by_number {
if ($a < $b){ -1 } elsif ($a > $b) { 1 } else { 0 }
}
#
my $number_rx = qr{
# leading sign, positive or negative
(?: [+-] ? )
# mantissa
(?= [0123456789.] )
(?:
# "N" or "N." or "N.N"
(?:
(?: [0123456789] + )
(?:
(?: [.] )
(?: [0123456789] * )
) ?
|
# ".N", no leading digits
(?:
(?: [.] )
(?: [0123456789] + )
)
)
)
# abscissa
(?:
(?: [Ee] )
(?:
(?: [+-] ? )
(?: [0123456789] + )
)
|
)
}x;
my $n = 0;
my $sum = 0;
my @values = ();
my %seen = ();
while (<>) {
while (/($number_rx)/g) {
$n++;
my $num = 0 + $1; # 0+ is so numbers in alternate form count as same
$sum += $num;
push @values, $num;
$seen{$num}++;
}
}
die "no values" if $n == 0;
my $mean = $sum / $n;
my $sqsum = 0;
for (@values) {
$sqsum += ( $_ ** 2 );
}
$sqsum /= $n;
$sqsum -= ( $mean ** 2 );
my $stdev = sqrt($sqsum);
my $max_seen_count = max values %seen;
my @modes = grep { $seen{$_} == $max_seen_count } keys %seen;
my $mode = @modes == 1
? $modes[0]
: "(" . join(", ", @modes) . ")";
$mode .= ' @ ' . $max_seen_count;
my $median;
my $mid = int @values/2;
my @sorted_values = sort by_number @values;
if (@values % 2) {
$median = $sorted_values[ $mid ];
} else {
$median = ($sorted_values[$mid-1] + $sorted_values[$mid])/2;
}
my $min = min @values;
my $max = max @values;
printf "n is %d, min is %g, max is %g\n", $n, $min, $max;
printf "mode is %s, median is %g, mean is %g, stdev is %g\n",
$mode, $median, $mean, $stdev;
Est-ce meilleur que sub by_number {return $ a <=> $ b} code>, pour une définition de "mieux"?
Qu'est-ce qui ne va pas avec mon @sorted_values = Trier {$ A <=> $ b} @values; code>?
@ hepcat72 c'est une bonne question, vraiment. Je ne me souviens plus pourquoi je l'ai fait.