korrelationskoeffizient

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
astrid
User
Beiträge: 16
Registriert: Montag 19. März 2007, 20:36

hallo ihr lieben,

ich hoffe, ich strapaziere hier keinerlei nerven. (werds ja merken, wenn keine antworten mehr kommen ;) )

ich bin zur zeit so vertieft in python und freu mich voll, dass alles so gut erklärt wird hier im forum.
ich lerne grad statistik und möchte halt einige dinge über python ausrechnen lassen. dacht ich mir...

hab mal wieder nen neues projekt für diejenigen, die neue herausforderungen brauchen, oder so nett sind, und mir meine neugierigen fragen zu beantworten.

dachte mir, ob man auch den korrelationskoeffizienten berechnen lassen kann.
das ist ja der wert, der einem bei einer korrelation anzeigt, ob die gemessenen werte nahe aneinanderliegen, oder weit zerstreut sind. es gibt also nur +1 bis -1 .
die formel sieht so aus:

r_xy = summe aus (x_i minus mittelwert von x) mal (y_i minus mittelwert yon y) / wurzel von summe aus (x_i minus mittelwert von x)^2 mal wurzel von summe aus (y_i minus mittelwert von y)^2


uff herje. hoffentlich erkennt ihr das?!

tja, wie kann man anfangen. ich denk erstmal sollte man einen befehl machen, wo man all die werte eingeben kann und dann eine formel zur berechnung..aber wie genau...
vielleicht kann mir jemand weiterhelfen...


lg
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi astrid,
astrid hat geschrieben: tja, wie kann man anfangen. ich denk erstmal sollte man einen befehl machen, wo man all die werte eingeben kann und dann eine formel zur berechnung..aber wie genau...
Immer ein Schritt nach dem anderen :) Überleg dir mal, wie du von ein paar Zahlen den Mittelwert berechnest. Der Rest der Formel ist dann nur noch eine Kleinigkeit ...

Gruß, mawe
astrid
User
Beiträge: 16
Registriert: Montag 19. März 2007, 20:36

hey mawe,

also dann erst so in etwa:

summe= 0.0
import math
n=input ("wieviele werte?")
wert=[0]*n
for i in range(n):wert=input ("gib eine zahl ein")
>>summe=summe+summe+wert
mittelwert=summe/n
print mittelwert,n


bin mir jetzt etwas unsicher, ob das so richtig ist?!


lg :)
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Das tolle an Python ist doch, dass man durch die "Selbstdeklarierung" der Variablen nicht vorher wissen muss, wieviele Variablen man hat.

Mittelwert berechnen... der Mittelwert ist doch Summe der Werte durch ihre Anzahl, wa?

Okay das saehe dann so aus:

Code: Alles auswählen

def mittelwert(*werte):
    # als Tipp: sum() bildet die Summe aus den (numerischen) Elementen
    # einer Liste, len() gibt die Laenge von Elementen (zB Listen oder Strings) zurueck,
    # damit wir Fließkommagenauigkeit bekommen, wandeln wir einfach einen der
    # Operanden in einen float um.
    return sum(werte)/float(len(werte))
Nun musst du noch die Eingabe der Zahlen realisieren...
Das kann auf deine Weise machen... oder einfach ueber Parameter. Ich bevorzuge meist Zweiteres.
Damit das funktioniert, muessen wir aber die erste Funktion ein wenig aendern:

Code: Alles auswählen

def mittelwert(werte):
    # als Tipp: sum() bildet die Summe aus den (numerischen) Elementen
    # einer Liste, len() gibt die Laenge von Elementen (zB Listen oder Strings) zurueck,
    # damit wir Fließkommagenauigkeit bekommen, wandeln wir einfach einen der
    # Operanden in einen float um.
    return sum(werte)/float(len(werte))
...das Sternchen wuerde normalerweise ermoeglichen, beliebig viele Variablen zu uebergeben (zB: mittelwert(1,2,3,4,5)) ...aber da wir ja bereits eine Liste haben (naemlich die Argumentenliste), nutzen wir die gleich direkt:

Code: Alles auswählen

def mittelwert(werte):
    # als Tipp: sum() bildet die Summe aus den (numerischen) Elementen
    # einer Liste, len() gibt die Laenge von Elementen (zB Listen oder Strings) zurueck,
    # damit wir Fließkommagenauigkeit bekommen, wandeln wir einfach einen der
    # Operanden in einen float um.
    return sum(werte)/float(len(werte))

if __name__ == '__main__':
    import sys
    print mittelwert(sys.argv[1:])
All das ist nun auch garnicht so schwierig in deinem Programm fuer die Berechnung (ich habs schonwieder vergessen :oops: ) - achja - des Korrelationskoeffizienten zu verwenden.
r_xy = summe aus (x_i minus mittelwert von x) mal (y_i minus mittelwert yon y) / wurzel von summe aus (x_i minus mittelwert von x)^2 mal wurzel von summe aus (y_i minus mittelwert von y)^2
Das uebersetzt nach Python und in eine Funktion gesteckt ergaebe ungefaehr folgendes:

Code: Alles auswählen

def r_xy(x, y, x_i, y_i):
    # die Doppelsternchen sind uebrigens fuer Potenzrechnungen gedacht (^2 => **2)
    # **0.5 ersetzt die Funktion math.sqrt()
    return ((x_i - mittelwert(x))*(y_i - mittelwert(y))) / (((x_i - mittelwert(x))**2 * (y_i - mittelwert(y)**2)))**0.5
Sieht aus wie Lisp... ist es aber nicht ^^
Aber man braucht nichtmal das Modul math.
Ich vermute mal, x und y sind Listen von Zahlen. Was die anderen Variablen zu bedeuten haben, weiß ich allerdings nicht :?

Okay, so weit so gut... nun wird noch eine Moeglichkeit gebraucht, die Werte in das Programm zu bringen.

Das ginge einerseits ueber den Input-Stream, andererseits ueber Argumente. Ich (der ja normalerweise die Argumentenuebergabe bevorzugt) glaube, dass man bei den komplizierten Angaben, das Programm wohl besser ja jeden Wert extra fragen lassen sollte.

An sich brauch das Programm (wenn ich das hier richtig verstehe) die Werte x_i und y_i und zwei Listen von Werten, naemlich x und y.

Das saehe bei mir (schnell und grob zusammengehackt) so aus:

Code: Alles auswählen

def werte_erfragen():
    # folgende Schleife Fragt solange (und immerwieder) nach dem Wert, bis er erfolgreich
    # in einen Integer umgewandelt werden konnte. Brauchst man eine Kommazahl,
    # ersetzt man int() einfach durch float()
    while True:
        try:
            x_i = int(raw_input("Wert fuer x_i? "))
            break # hier wird die Schleife beendet, falls alles gut ging
        except:
            print "\nFehler in der Eingabe. Nur Zahlen sind erlaubt!"

    # nun das ganze nochmal fuer y_i:
    while True:
        try:
            y_i = int(raw_input("Wert fuer y_i? "))
            break
        except:
            print "\nFehler in der Eingabe. Nur Zahlen sind erlaubt!"

    # Ein wenig kniffliger wird es, eine Liste von Werten abzufragen. An sich, aber
    # kein Problem in Python:
    while True:
        try:
            x = raw_input("Bitte kommaseparierte Liste fuer x-Werte angeben: ")
            x = x.split(",")
            # Hier nun eine Listcomprehension. Diese ermoeglicht einige Arbeit
            # und "Schleiferei" in einer einzigen Zeile:
            x = [int(wert) for wert in x]
            break
        except:
            print "\nFehler bei der Eingabe. Bitte nur Zahlen und Kommas eingeben",
            print "(zB so: 25,27,4,3,4)"

    # so, nun noch die Liste fuer y:

    while True:
        try:
            y = raw_input("Bitte kommaseparierte Liste fuer y-Werte angeben: ")
            y = y.split(",")
            y = [int(wert) for wert in y]
            break
        except:
            print "\nFehler bei der Eingabe. Bitte nur Zahlen und Kommas eingeben",
            print "(zB so: 25,27,4,3,4)"
Die Abfrage einer Liste von Zahlen ginge mit Hilfe einer Listcomprehension uebrigens auch in einer Zeile:

Code: Alles auswählen

x = [int(wert) for wert in raw_input("Bitte kommaseparierte Liste fuer x-Werte angeben: ").split(',')]
Natuerlich muessen dann noch die while-Schleife, break und das try-except-Statement drumrum. Falls wieder Kommazahlen erwuenscht sind, bitte int() durch float() ersetzen.

An sich haben wir nun alles, was wir brauchen:
  • eine Funktion zur Berechnung des Mittelwertes
  • eine Abfrage fuer all die benoetigten Werte und somit auch...
  • Werte fuer x, y, x_i und y_i
  • eine Funktion zur Berechnung von r_xy
All das zu einem Programm zusammen zu fuehren, sollte nicht zu schwierig sein. Also dann mal ran und viel Spaß weiterhin mit Python ;)
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Danke dass du eine fast fertige Lösung postest, anstatt astrid selbst tüfteln zu lassen. Ob das klug ist?
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Davon abgesehen finde ich die Lösung auch nicht besonders gut. Vor allem, daß man x_i und y_i per zu Fuß eingeben soll, leuchtet mir nicht ein. Das geht ja bei ein paar wenigen Werten problemlos, aber ansonsten ... Und wieso gibt es nur je einen Wert für x_i und y_i?
Allerings gebe ich zu, daß ich raten muß, wie die angegebene Formel zu übersetzen ist. Können wir uns auf diese Definition des Korrelationskoeffizienten einigen, oder willst Du, astrid, etwas anderes haben?

In diesem Fall habe ich mal vor einiger Zeit dieses Beispiel zusammengehackt. (Leider numpy-basiert, aber das in "reines" Python zu übersetzen ist durchaus möglich ;-).)

Gruß,
Christian
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

@mawe: Ich habe die Loesung so geschrieben, dass sie aus ihr lernen kann... ich finde ein erklaertes Beispiel durchaus besser zum lernen, als ein (nicht auf mein Problem abgestimmtes) Tutorial.

@CM: Ehm... wie im Post vorher schon erwaehnt: Ich hab mich bei meinem Beispiel rein auf ihre Aussagen gestuetzt und mir nicht die Muehe gemacht, zu schauen, was dieser Korrelationskoeffizient ueberhaupt ist.

Wenn ich mir das so anschaue, dann ist so ein Korrelationskoeffizient ja alles andere als "Ich-gebe-Werte-rein-und-bekomm-einen-Wert-raus"!

Das werd ich nun nicht zusammenfrickeln, weil ich mir dazu viel zu viel Zeit fuer das Verstaendniss der eigentlichen Rechnung nehmen muesste.
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
astrid
User
Beiträge: 16
Registriert: Montag 19. März 2007, 20:36

hallo ihr lieben :)

also ich finde es zu allererst sehr sehr nett, dass ihr mir geantwortet habt! schließlich macht ihr das freiwillig um mir zu helfen. danke vielmals an dieser stelle!

ich muss gestehen, dass ich ein python- neuling bin, und mich irgendwie reinarbeite.
ich werde mir eben das beispiel genau durcharbeiten. :)


lg
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

astrid hat geschrieben:also ich finde es zu allererst sehr sehr nett, dass ihr mir geantwortet habt! schließlich macht ihr das freiwillig um mir zu helfen. danke vielmals an dieser stelle!
Und wofuer machen wir das hier? Allein fuer solche netten Dankeschoen-Posts :D

Also... bitte bitte, gern geschehen. Und auch wenn es wohl fein an der Aufgabe vorbei geschossen ist, sollte es ja dennoch eine Hilfe fuer dich sein, in Python weiter voran zu kommen.

Lg zurueck ;)
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
astrid
User
Beiträge: 16
Registriert: Montag 19. März 2007, 20:36

hi ihr :)

soo. hab mich jetzt mal nen bischen durchgewurschtelt... ;)

@cm: ja, die definition ist sehr gut. das ist ja im grunde s_xy (covarianz) durch die jeweiligen standardabweichungen s_x mal s_y.
ich denke, da hast du veilleicht recht, dass das die bessere variante ist.
weil die wurzeldarstellungen raff ich erhlich gesagt nicht so.

@nkoehring: leider funzt das prog bei mir nciht so. ich glaube, bin mir aber nciht so sicher, ob du die formel richtig hast, weil ich die wurzeln nicht sehe. korrigier mich, wenn ich falsch liege :)
vielleicht kann man doch was mit math. sqrt oder so machen...



aber bei der jetztigen formel brauch man wurzel ja sowieso nicht.
mhm...ich bin jetzt ehrlich gesagt überfordert, und weiß mal wieder nicht, wie man sowas anfangen soll.... :(


lg
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

astrid hat geschrieben:@nkoehring: leider funzt das prog bei mir nciht so. ich glaube, bin mir aber nciht so sicher, ob du die formel richtig hast, weil ich die wurzeln nicht sehe. korrigier mich, wenn ich falsch liege :)
vielleicht kann man doch was mit math. sqrt oder so machen...
Wurzeln habe ich (wie erwaehnt) durch **0.5 ausgetauscht.

Also (x+y)**0.5 ist das gleiche wie (x+y) hoch 0.5 ist das gleiche wie sqrt(x+y) ;)
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
astrid
User
Beiträge: 16
Registriert: Montag 19. März 2007, 20:36

asooo. das hab ich dann leider übersehen. sorry :)
ich brauch wohl noch nen bischen zeit zum lernen ;)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hallo Astrid,
astrid hat geschrieben: @nkoehring: leider funzt das prog bei mir nciht so. ich glaube, bin mir aber nciht so sicher, ob du die formel richtig hast, weil ich die wurzeln nicht sehe. korrigier mich, wenn ich falsch liege :)
vielleicht kann man doch was mit math. sqrt oder so machen...
Nochmal: Die Formel ist nicht korrekt. Sie berechnet irgendetwas, aber keinen Korrelationskoeffizienten, egal, ob man mit **0.5 oder mit sqrt rechnet.

Außerdem ist das Beispiel von nkoehring auch deshalb nicht so dolle, weil es sofort auf die Schn...e fliegt, wenn man eine fehlerhafte Eingabe macht.

Am Besten Du versucht mein altes Beispiel in reines Python zu übersetzen, wenn Du nicht numpy installieren magst. Als Übung ist das sicher eine schöne Sache. nkoehrings Funktion für den Mittelwert ist sicher schon mal ein Start. Der Rest dann nur noch ein Kinderspiel und wenn es Probleme gibt, so wird Dir hier mit Sicherheit geholfen. (Ich selber bin ab morgen für eine Weile offline - Dienstreise.)

Als alternative Route zur Berechnung von Korrelationskoeffizienten gibt es in der multivariaten Statistik auch noch algemeinere Methoden. Allerdings für das hier wahrscheinlich viel zu weit.

In jedem Fall hast Du Dir eine machbare Aufgabe für den Anfang vorgenommen und das ist sicher eine gute Übung.

Viel Erfolg,
Christian
astrid
User
Beiträge: 16
Registriert: Montag 19. März 2007, 20:36

danke für die vielen antworten :)


auf jeden fall werd ich am ball bleiben ;)
Antworten