statistisch signifikante Veränderung in Daten erkennen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
mechatronics_student
User
Beiträge: 20
Registriert: Mittwoch 3. Februar 2021, 21:18

Hallo zusammen,

ich möchte eine statistische Auswertung bezüglich der Korrelation meiner Messergebnisse machen. Die Daten sind wie folgt aufgebaut:

Referenzdatensatz :

______ Spalte1: _ Spalte2: _ Spalte3: _ ... ______ Spalte j :
Zeile 1: ____ 5 ______ 10 _______ 40 _______ ... _______ 20

Der Refernz-Datensatz besteht aus einer einzigen Zeile mit j Spalten; jeder Zellenwert ist der gebildete Mittelwert (über jede Spalte) aus einer großen Anzahl an durchgeführten i.O. Messungen.

Vergleichsmessungen
______ Spalte1: ____ Spalte2: ___ Spalte3: _ ... _____ Spalte j:
Zeile 1:____ 5,4_______ 10,3 _______ 43 _______ ... _______ 26
Zeile 2: ____ 4,7 _______ 10,7 _______ 38 ______ ... _______ 22
Zeile 3: ____ 5,7 _______ 13 _______ 45 _______ ... ______ 23
Zeile 4: ____ 4,5 _______ 12 _______ 41 _______ ... ______ 21,5
...
Zeile n-5: ____ 10 _______ 20 _______ 55 _______ ... _______ 35
Zeile n-4: ____ 12 _______ 22 _______ 60 _______ ... ______ 40
...
Zeile n: ____ 13 _______ 23 _______ 62 _______ ... _______ 44

Die Messwerte der Vergleichsmessungen streuen im i.O. Zustand um einen Wert, der den Mittelwerten aus dem Refernzdatensatz entsprechen. Bei idealen Messungen sollten die Werte im i.O. Zustand immer gleich sein und den Mittelwerten der Referenzdaten entsprechen.
Ab Zeile n-5 wurden durch veränderte äußere Einflüsse Messergebnisse mit einer größeren Abweichung zum Mittelwert der Referenzdaten aufgenommen. Die Höhe der Änderung ist in Abhängigkeit der veränderten Einflüsse (z.B. Umgebungstemperatur).
*Alle hier genannten Werte sind beispielhaft genannt, stellen aber den zugrundeliegenden Zusammenhang dar.

Ich gehe nun zeilenmäßig durch die Messungen und führe eine lineare Regression mittels Referenzdaten und jeder Vergleichsmessung durch.
Sollte die Referenzmessung == Vergleichsmessung sein, gibt der Koeffizient der linearen Regression 1 aus, da die Vergleichsdaten == der Referenzdaten sind (somit eine Winkelhalbierende). Der Koeffizient der linearen Regression entspricht der Steigung und gibt mir einen Anhaltspunkt bezüglich der Korrelation der Daten.
Nachdem die Koeffizienten berechnet wurden, werden diese in einem Array abgespeichert.

Nun möchte ich herausfinden wann sich meine Messungen (jede Zeile entspricht einer Messung) statistisch signifikant verändert haben. Ziel ist es die Veränderung der Messwerte ab Zeile n-5 zu detektieren.

Hier hatte ich an einen zweiseitigen T-Test gedacht:

https://docs.scipy.org/doc/scipy/refere ... test_1samp

scipy.stats.ttest_1samp(a, popmean, axis=0, nan_policy='propagate', alternative='two-sided')

Code: Alles auswählen

correlation_list = ["hier liegen alle Steigungswerte aus der linearen Regression ab"]
driftcheck = scipy.stats.ttest_1samp(correlation_list, 1)
Popmean habe ich mit 1 angegeben, da dies keinem Unterschied zwischen Refernzdaten und Vergleichsdaten bedeuten würde.

Mit diesem Ansatz komme ich allerdings nicht zum gewünschten Ergebnis:

Code: Alles auswählen

mean_val = 1
std_dev_dec = 0.01 #Standardabweichung gleich 1% 
test_series = 100

temp = list(np.random.normal(1,mean_val*std_dev_dec,test_series)
drift_check = sci.ttest_1samp(temp , 1)

Dies sind meine gewürfelten normalverteilten Daten um den Mittelwert 1 mit einer Standardabweichung von 1% vom Mittelwert:

[0.9956586880284188, 0.9956869324372513, 1.0040126285386897, 1.0001154157074104, 0.9983528084207436, 1.0161939269909652, 0.9924845593052829, 0.9916116648576424, 1.0153701272724616, 0.9898408797538836, 0.9969776697464192, 0.9738268785649494, 1.006747919190404, 0.9819664734307995, 1.0008146719233162, 0.9766277066326238, 0.976554030119369, 0.9947073535972875, 0.9998194471517681, 0.9980685280825605, 1.0044573785663482, 0.9990642505441653, 1.00160805205349, 1.019361542813252, 1.0054413589787898, 1.001804255921406, 0.9926950617828512, 0.9903955300128164, 1.0125257641584537, 0.9910431901165683, 0.9815344492394891, 0.9955968859465428, 0.9892647983125116, 0.9890110273556691, 1.004317245274409, 0.992611345018511, 0.99685083400286, 1.0003042696017803, 0.9944212394298511, 1.0060270363038109, 0.9882166816849393, 0.9853723936299993, 0.9835908479145724, 1.0094307628132335, 0.9993246524927273, 0.9866123119578241, 1.0096705625968667, 1.0134381949072298, 0.9985366106461907, 1.0065938379519261, 1.00756747232238, 1.0019874471099874, 1.0062718391848766, 0.9939648758389803, 0.9904653831545225, 0.9964817744615473, 0.9984836804817842, 0.9879013247886326, 1.010372345213025, 0.9855467614954724, 1.013999813085625, 1.017261270882018, 1.0103805317857524, 0.9812515875304011, 1.0095870531301512, 0.9781146206813511, 1.003274592719423, 0.9707760197683302, 0.997286462017071, 0.9968816065071423, 0.9927491795743614, 1.0042434513457061, 1.0140559846835742, 0.9934103625167514, 0.9995216676347488, 1.0051616159896224, 1.0021361025261293, 1.0014015143486459, 0.9944391485948513, 1.0056804549034621, 0.988661789302113, 1.0104610170193369, 1.006296025570712, 1.0163302823264815, 1.001782834890912, 0.9999655558388303, 0.9907818689376053, 1.0010430888105688, 0.9951910358440622, 0.9829689634810512, 1.0211007880982863, 0.9914084209925185, 1.0047330468615225, 1.0047772984033474, 1.0014648074431056, 0.9961925636747301, 1.0101108955127347, 1.020452209436378, 0.9938099725497245, 1.0112293920523558]

Das Ergebnis des T-Tests:

Ttest_1sampResult(statistic=-1.1783846282866977, pvalue=0.24146794402967192)

Ich habe mehrere Druchläufe gestartet mit normalverteilten Daten um 1 und der pvalue ist nie stabil. Ich hätte hier erwartet, dass der pvalue nahe 1 liegt, da die zugrundeliegenden Daten sehr nahe an dem zu erwartenden Mittelwert 1 liegen.

Kann mir hier jemand weiterhelfen? Ich verstehe es gerade wirklich nicht..

Vielen lieben Dank für Eure Unterstützung :)
tonikae
User
Beiträge: 90
Registriert: Sonntag 23. Februar 2020, 10:27

Ich weiss nicht ob ich dich richtig verstanden habe, aber mit statischen Referenzdaten zu arbeiten scheint
mir in dem Fall nicht so wirklich optimal zu sein.Persönlich würde ich da eher auf das "Winsorizing" zurückgreifen.
Das ist zwar eine mathematische Methode um Ausreißer zu bereinigen, läßt sich aber auch anderweitig
verwenden.
d.h. Man braucht nur die Rohdaten (keine Referenzdaten), diese Rohdaten werden
mit Hilfe des "Winsorizings" geglättet/idealisiert(je nach eingestellter/gewünschter
Empfindlichkeit)....dann muss man nur noch die Differenz zwischen den Rohdaten und
den "Idealdaten" prüfen...die ist nämlich im Idealfall immer "null".
Ein Beispiel (nicht in Python)
https://drive.google.com/file/d/1hlnjhz ... QgnJf/view

Aber vielleicht meinst du auch etwas ganz anderes.
mechatronics_student
User
Beiträge: 20
Registriert: Mittwoch 3. Februar 2021, 21:18

Die bewusst Manipulierung der Messdaten (z.B. durch hohe Temperatur) sollen nicht verworfen werden. Der statistisch signifikante Drift, der z.B. durch hohe Umgebungstemperatur verursacht wird) soll in den Daten zuverlässig detektiert werden.
Antworten