Ich muss immer mal wieder Statistik anwenden, meist ohne dann wirklich Zeit dafür zu haben. R oder Julia ist mir fremd, daher griff ich meist auf handgeschriebene Bash-Skripts zurück und machte die schwierigeren Sachen, wie die Faktor- oder Signifikanzanalyse, mit externen Tools. Was eben gerade da ist.
Diesmal bin ich über statsample gestolpert. Das gem implementiert die relevanten Statistikfunktionen. Ich benutzte diesmal sowieso Ruby, da passte das gut in meine Datenverarbeitungsskripte. Und in meinen Augen hat es sich bewährt.
Zwei Beispiele: Ich habe in einer SQLite-Datenbank eine Sammlung von Kommentaren mit ihren Upvotes, und die Kommentare kann ich in zwei Gruppen unterteilen. Ich will wissen, ob die Verteilung der Upvotes zwischen den Gruppen sich signifikant unterscheidet, und wähle dafür einen t-Test. Das geht so:
require 'sqlite3'
require 'statsample'
include Statsample::Test
db = SQLite3::Database.new "database.db"
aUpvotes = db.execute("SELECT upvotes FROM comments WHERE group = 'a'";).flatten.to_scale
bUpvotes = db.execute("SELECT upvotes FROM comments WHERE group = 'b'";).flatten.to_scale
t_2=Statsample::Test::T::TwoSamplesIndependent.new(aUpvotes, bUpvotes)
puts t_2.summary
Die Ausgabe enthält dann alle wichtigen Informationen und verrät mir, dass die zweite Stichprobe deutlich kleiner, die Varianz gleich ist und das benötigte Signifikanzniveau p = 0.5522
weit von statistischer Signifikanz weg ist.
= Two Sample T Test
Mean and standard deviation
+----------+--------+---------+------+
| Variable | mean | sd | n |
+----------+--------+---------+------+
| Vector 1 | 9.1267 | 44.8019 | 3332 |
| Vector 2 | 7.4539 | 59.6217 | 293 |
+----------+--------+---------+------+
Levene test for equality of variances : F(1, 3623) = 0.4437 , p = 0.5054
T statistics
+--------------------+--------+----------+----------------+
| Type | t | df | p (both tails) |
+--------------------+--------+----------+----------------+
| Equal variance | 0.5945 | 3623 | 0.5522 |
| Non equal variance | 0.4687 | 321.6479 | 0.6396 |
+--------------------+--------+----------+----------------+
Effect size
+-------+--------+
| x1-x2 | 1.6727 |
| d | 0.2467 |
+-------+--------+
Das zweite Beispiel ist ein chi²-Test um zwischen zwei Stichproben mit Kategorien zu unterscheiden. Ich habe bei der ersten Stichprobe 60 Leute in Kategorie A, 10 in B, 30 in C. Bei der zweiten sind es 60 in A, 25 in B und 15 in C. Signifikanter Unterschied?
m=Matrix[[60, 10, 30], [60, 25, 15]]
x_2=Statsample::Test.chi_square(m)
puts x_2.probability # => 0.003…
Hier gibt es keine schöne Ausgabe, sondern nur den p-Wert. Der ist mit 0.003 unterhalb einiger typischer Signifikanzniveaus, also ist der Unterschied zwischen den Beobachtungen für p < 0.01
beispielsweise signifikant.
Ich habe ein bisschen das Drumrum erklärt weil dort das Problem des Gems ist: Es fehlt Dokumentation. Klar, es ist nicht die direkte Aufgabe des Gems, dem Nutzer einen Statistikkurs zu geben. Es ist ein Werkzeug, mit dem Leute, die wissen was sie machen müssen, diese Aufgabe durchführen können. Aber selbst wenn man eine vage Ahnung hat findet man zu wenig darüber, wie man die Funktionen aufzurufen hat.