Arithmetsiches Mittel, Perzentile und Standardabweichung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Jochen1980
User
Beiträge: 40
Registriert: Montag 15. August 2011, 18:44

Servus,

habe gerade SciPy und NumPy installiert - schwere Geburt! Dazu finde ich nun viele Anleitungen, die alt sind und ganz ehrlich, als Neuling kann ich bei einer Lösung kaum einschätzen, ob das geschickt umgesetzt oder zusammen geklöppelt ist.

Ich habe eine Folge von Zahlen und will die Kennwerte aus der Überschrift ermitteln - wie macht ihr das?

Danke vorab.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Hi,

schau am besten in die offizielle Dokumentation, insbesondere das Statistik Module:
- http://docs.scipy.org/doc/scipy/referen ... stats.html
- http://docs.scipy.org/doc/scipy/referen ... cipy.stats

Grüße
Gerrit
Jochen1980
User
Beiträge: 40
Registriert: Montag 15. August 2011, 18:44

Sodala eine Lösug für das arithmetische Mittel habe ich, ich habe es aber so verstanden. Was ich noch nicht genau weiss ist aber, wie ich herausfinde, welche Module ich genau brauche und wie ich herausfinde, ob es sowohl eine Möglichkeit in numpy und scipy gibt - ich habe es so verstanden, dass scipy dann genommen werden sollte ... ?

Code: Alles auswählen

def compute_mean_of_list( list_of_uvals ):
    print("compute_mean_of_list()")
    # numpy-Weg
    print( "Liste:", list_of_uvals)
    l = list_of_uvals
    a = numpy.asarray( l )
    print( "Array:", a) 
    mean = a.mean()
    print( "Mean:", mean)
    return mean
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ich habe mal (wie auch immer) das Modul pystat gefunden. Das ist - wie der Name schon sagt - auf Statistik spezialisiert und hat auch eine recht simple API. Ein gute Doku kennt ich nicht, Quelltext lesen hilft aber hier weiter.

Gruß, noisefloor
Jochen1980
User
Beiträge: 40
Registriert: Montag 15. August 2011, 18:44

Danke für den Tipp, aber nun ist alles installiert und das Potential von Scipy und Numpy ist groß - ich denke es macht Sinn wenn ich mcih da nun durchbeiße.

Gut, wie kann es zu so einer Abweichung kommen zwischen R und Python bei der Standardabweichung:

Python:
compute_sd_of_list()
Liste als Eingang: [5, 6, 7, 12]
Array als Eingang: [ 5 6 7 12]
Std: 2.69258240357

R:
*************************************************************
Script calculator
[1] "Liste:"
[1] 5 6 7 12
[1] "Standardabweichung:"
[1] 3.109126

Python-Code:

Code: Alles auswählen

def compute_sd_of_list( list_of_uvals ):
    print("compute_sd_of_list()")
    #l_sd = copy.deepcopy(list_of_uvals)
    print( "Liste als Eingang:", list_of_uvals)
    array_for_sd = numpy.asarray( list_of_uvals )
    print( "Array als Eingang:", array_for_sd)
    std = array_for_sd.std()
    print( "Std:", std)
    return std
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Jochen1980 hat geschrieben:Gut, wie kann es zu so einer Abweichung kommen zwischen R und Python bei der Standardabweichung:
Lies die Doku zu std. Du musst den Parameter ddof auf 1 setzen. Zugegebener Maßen ist 0 eine ungünstige Vorauswahl. Bin ich auch schonmal drauf reingefallen, Lehre daraus: Immer vorher gucken wie die Funktion definiert ist.

Ich verstehe jetzt auch dein Problem nicht Du nimmst einfach die Funktion die dir das Ergebnis liefert was du willst. In welchem modul das jetzt ist kann dir völlig egal sein. Zum Finden der Funktion gibts dann google.

suche nach numpy quantile landet bei: http://docs.scipy.org/doc/scipy-0.7.x/r ... tiles.html
Zuletzt geändert von Darii am Montag 29. August 2011, 21:21, insgesamt 1-mal geändert.
deets

Keine Ahnung was R da macht, aber wenn ich mich nicht vertan habe (was bei statistik gut vorkommen kann...), dann hat Python recht:

Code: Alles auswählen

>>> l = [5, 6, 7, 12]
>>> m = sum(l) / len(l)
>>> m = sum(l) / float(len(l))
>>> m
7.5
>>> from math import *
>>> d2 = sum([(m - v)**2 for v in l]) / len(l)
>>> d2
7.25
>>> sqrt(d2)
2.692582403567252
Die Standardabweichung ist die Wurzel der Varianz, und die Varianz ist der Erwartungswert (=Durchschnitt im diskreten) des Quadrates der Abweichung vom Erwartungswert (auch wieder Durchschnitt).

Und da kommt dann 2.69... raus.

Hat R vielleicht irgendwelchen impliziten Startwerte 0 oder 1?
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

deets hat geschrieben:Die Standardabweichung ist die Wurzel der Varianz, und die Varianz ist der Erwartungswert (=Durchschnitt im diskreten) des Quadrates der Abweichung vom Erwartungswert (auch wieder Durchschnitt).
Es ist üblich Die Quadratsumme am Ende durch len(l) - 1 zu teilen wodurch die Abweichung überschätzt wird wohingegen sie bei len(l) unterschätzt wird, da man zur Berechnung des Mittelwertes, die Werte deren Abweichung von eben diesem man berechnen will, schon benutzt hat. Dafür gibts dann den Parameter ddof in numpy.std.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Wenn man das Rad neu erfinden will .... Alle anderen können es so machen:

Code: Alles auswählen

In [1]: import numpy as np

In [2]: import scipy

In [3]: data = np.random.random(10)

In [4]: data
Out[4]: 
array([ 0.3064362 ,  0.02360753,  0.85207557,  0.19037716,  0.05744483,
        0.49137056,  0.99852297,  0.74728801,  0.65816816,  0.57863276])

In [5]: data.mean()
Out[5]: 0.49039237570387695

In [6]: data.std()
Out[6]: 0.31939372380427977

In [7]: scipy.percentile(data, 10)
Out[7]: 0.0540611023443755
Es ist früh und ich habe wenig Lust, ansonsten kann ich mich meinen Vorschreibern nur anschließen ...

HTH
Christian

edit: Ich finde es nicht schlecht, ddof = 0 als default zu haben: Die Erklärung in der Dokumentation ist ausreichend und ich finde sie ziemlich gut.
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

Darii hat geschrieben:
deets hat geschrieben:Die Standardabweichung ist die Wurzel der Varianz, und die Varianz ist der Erwartungswert (=Durchschnitt im diskreten) des Quadrates der Abweichung vom Erwartungswert (auch wieder Durchschnitt).
Es ist üblich Die Quadratsumme am Ende durch len(l) - 1 zu teilen wodurch die Abweichung überschätzt wird wohingegen sie bei len(l) unterschätzt wird, da man zur Berechnung des Mittelwertes, die Werte deren Abweichung von eben diesem man berechnen will, schon benutzt hat. Dafür gibts dann den Parameter ddof in numpy.std.
Vereinfacht gesagt: Die (empirische) Standardweichung der Stichprobe erhält man, indem man durch len(l) teilt. Zum Schätzen der Standardabweichung S der Grundgesamtheit nimmt man len(l) - 1; dann ist S^2 wenigstens ein erwartungstreuer Schätzer für die Varianz. [Wenn man aber gar nicht schätzen will, dann braucht man len(l).]
Antworten