Seite 1 von 2
Datenanalyse in Python
Verfasst: Samstag 28. November 2020, 23:09
von Wunderkind89
Hallo zusammen,
wie der eine oder andere es schon weiß mache ich gerade (in Zusammenhang mit meinem Studium) mein Pflichtpraktikum und meine Aufgabe lautet die Analyse von Sensordaten. Dazu hab ich eine csv Datei geschickt bekommen und soll die Daten auswerten und beschreiben können. Es geht konkret um Sensoren, die Personen zählen und mir manchmal falsche Zählungen liefern (Ausreißer) - es handelt sich übrigens um simulierte Daten.
Dank eurer Hilfe habe ich es geschafft diese Daten grafisch darzustellen, um überhaupt zu erkennen wo was schief gelaufen ist. Meine nächste Aufgabe lautet die Daten zu analysieren bzw. zu beschreiben. Da ich nur 4 Sensoren habe, konnte ich schnell eine statistische Datenanalyse mit Excel durchführen, wo mir der Mittelwert, Modalwert, Median usw. angezeigt wurden. Das Problem an der ganzen Sache ist: meine Betreuerin im Praktikum hat zu mir gesagt, dass mit Excel kein Mensch eine Datenanalyse macht, weil z.B. bei 1000 Sensoren wäre das eine unlösbare Aufgabe, also muss ich das Ganze in Python umsetzen - mein Programm sollte die Daten einlesen und Berechnungen durchführen und am besten das ganze grafisch darstellen.
Jetzt meine Frage an euch: gibt es in Python solche Funktionen, die mir den Mittelwert, den Modalwert usw. berechnen, ohne dass ich diese extra implementieren muss? Solche Funktionen, die eine (statistische) Analyse meiner Daten machen? Hättet ihr Tipps mit Videos oder Schlagwörter wonach ich suchen muss, weil immer wenn ich nach diesen Begriffen suche kriege ich entweder Programme, wo etwas Grafisch dargestellt wird oder z.B. der Mittelwert per Hand implementiert wird, was so nicht mein Ziel ist. Python muss doch die Datenanalyse von Excel überbieten und mir mehr Möglichkeiten bieten ohne großen Aufwand alles per Hand zu implementieren oder etwa nicht?
Wäre dankbar über jede Hilfe
Liebe Grüße
Wunderkind
Re: Datenanalyse in Python
Verfasst: Samstag 28. November 2020, 23:28
von __blackjack__
@Wunderkind89: Du suchst die Pandas-Bibliothek.
Re: Datenanalyse in Python
Verfasst: Samstag 28. November 2020, 23:29
von Sirius3
Du fragst Dich seit 28 Beiträgen hier durch, hast aber noch nicht die pandas-Dokumentation durchgelesen, was die Dir so an Funktionen bietet?
Re: Datenanalyse in Python
Verfasst: Samstag 28. November 2020, 23:39
von nezzcarth
Excel verwendet man nicht nur nicht für so etwas, weil das umständlich wäre. Excel hat generell in der Auswertung solcher wissenschaftlicher Daten eigentlich keinen Platz (obwohl es so weit verbreitet ist). Dafür gibt es Software, die genau für so etwas gedacht ist.
In der Standardbibliothek von Python gibt es das
statistics-Modul, das eigentlich alles enthält, nach dem du gefragt hast. Wenn man etwas mehr benötigt, kann man auch numpy und
scipy verwenden. Ansonsten ist, wie die anderen schon meinten, Pandas das, was sehr häufig verwendet wird. Wenn es nicht unbedingt Python sein muss, ist R auch eine Option (pandas ist sehr deutlich von R inspiriert).
Re: Datenanalyse in Python
Verfasst: Sonntag 29. November 2020, 21:43
von Wunderkind89
Vielen Dank, ich hab's! War im nachhinein nicht so schwer (ich hab dazu die Bibliothek "statistics" und "scipy" verwendet. Ich frage mich gerade etwas anderes:
wenn ich den Mittelwert berechne, dann sagt er mir ja etwas über den Durchschnitt aus, z.B.: die durchschnittliche Größe der Schüler, die Durchschnittsnote usw. manchmal hat man auch einen gewichteten Mittelwert.
In meinem Fall habe ich einen Counter, der sekundenweise zählt und wenn eine Person reingeht, dann geht dieser auf eins und behält diese eins und wenn 2 weitere Personen reingehen, dann erhöht er die 1 auf 3. Wenn ich jetzt jede einzelne Zeile addiere (was intern passiert) und durch die Anzahl teile, dann erhalte ich einen Wert, der mir NICHT die durchschnittliche Anzahl an Personen liefert, aber was genau erhalte ich denn da? Ich kann damit überhaupt nichts anfangen. Beispiel: Der Sensor würde jede 5 Sekunden Personen registrieren. Es gehen jeweils einzelne Personen nacheinander rein. Der Counter hat dann folgende Werte: 1,2,3,4,5,6 Jetzt wird der Mittelwert berechnet: (1+2+...+6) /6 = 3,5. Was sagt mir den nun diese 3,5 aus? Fakt ist: es ist jeweils 1 Person reingegangen. Ich hatte insgesamt 6 Personen die reingegangen sind. Im Durschnitt ist jeweils 1 Person reingegangen (Durchschnittliche Erhöhung um 1). Die 3,5 ist die Hälfte von 7 und nicht von 6. Anderes Beispiel: 1,1,1,1,4. Also es geht zuerst eine Person rein, dann nach einiger Zeit gehen 3 Personen rein (Mutter, Vater, Kind). Das Ergebnis des Mittelwerts ist: 1,6 ja und nun? Insgesamt sind in meinem Beispiel 4 Personen reingegangen. Erst eine, dann 3. Die Mitte davon wäre 2. Lange Rede kurzer Sinn: das, was ich da als "Mittelwert" ausrechne kann ich irgendwie mir nicht erklären und scheint mir bei der Analyse meiner Daten nicht wirklich hilfreich zu sein oder wie seht ihr das? Liebe Grüße
Re: Datenanalyse in Python
Verfasst: Sonntag 29. November 2020, 21:49
von __deets__
Wer verlangt denn, das du den Mittelwert dieser Personenzählung so berechnest? Er ist Sinn frei. Du könntest die Werte ja auch quadrieren, oder durcheinander teilen, oder was auch immer machen - das ist ja nicht zwangsweise Sinn behaftet.
Für diese Daten wäre ein Durchschnitt über einen Zeitraum interessant. Wieviele Besucher am Tag, pro Stunde, davon wiederum der Maximalwert, etc.
Re: Datenanalyse in Python
Verfasst: Montag 30. November 2020, 01:19
von LeSchakal
In deiner Aufgabe geht es ja darum, Ausreißer zu erkennen.
Dazu musst du dir zuerst einmal überlegen, wie du Ausreißer überhaupt erkennen kannst.
Re: Datenanalyse in Python
Verfasst: Montag 30. November 2020, 13:24
von tonikae
Ausreißer werden in der Statistik üblicherweise über Quantiles(in Excel heisst das "Percentile") definiert.
d.h. Man braucht das untere Quantile(0.25) und das obere Quantile (0.75) das ist die Bandbreite der zulässigen Werte.
Und alles das sich unterhalb/oberhalb dieser Bandbreite bewegt sind eben Ausreißer (outliers).
Grafisch stellt man das üblicherweise mit einem Boxplot dar(da kann man die Outliers auch über die Attribute
ein/auschalten). Python kennt Quantiles(sind auch im "Statistics"-Modul), Ein Hilfetext ist in der Python-Docu zu finden)
Das ist so die übliche Methode ...ob es das ist was du konkret haben willst, ist dann ein andere Baustelle.
Re: Datenanalyse in Python
Verfasst: Dienstag 1. Dezember 2020, 00:53
von Wunderkind89
Vielen lieben Dank erstmal für eure Antworten. Eine andere Frage: ich hab mir vorgenommen in meinem Datensatz die Erhöhungen von einander zu Subtrahieren, weil so kriege ich die Anzahl der Personen, die da entlang gelaufen sind (Beispiel: 1,1,1,1,2,2 also gucke ich, wo es die erste Erhöhung gab und das ist bei 1,2 und mache an der Stelle 2 - 1 = 1 Person). Ich mache also aus meiner jetzigen Datenliste eine neue Datenliste, wo aber nur Personen drin stehen sollten, die zu einer bestimmten Zeit an einem der Sensoren entlang gelaufen sind. Auf diese Weise könnte ich dann eine brauchbare Analyse meiner Daten durchführen (Mittelwert, Varianz usw.). Das ist so mein jetziger Plan.
Das Problem: wie implementiere ich das Ganze? Weil ich weiß nicht, wie ich von der Syntax her auf die einzelnen Zeilen meiner Spalte zugreifen und diese von einander abziehen kann. Ein weiteres Problem: das Ganze soll dann in einer anderen bzw. neuen Datei abgespeichert werden (im selben Ordner) aus der ich dann später lesen werde.
Mein Programm mit einem einfachen Array (diese Idee will ich auf meinen Datensatz umsetzen):
import math
import statistics
import numpy as np
import scipy.stats
import pandas as pd
x = [0,1,1,2]
pers = []
anfang = 0
for i in (range(len(x) - 1)):
ende = anfang + 1
pers.append(x[ende] - x[anfang])
anfang = anfang + 1
print(pers)
***Jetzt hab ich aber folgendes***
DATA_FILENAME = "SmartCountr.xls"
def main():
data = pd.read_excel(DATA_FILENAME)
*** ist data jetzt ein Array? Wie greife ich auf die einzelnen Zeilen von data? ***
Ich hoffe dass meine Herangehensweise wenigstens jetzt die richtige Richtung nimmt. Das mit den Quantilen werde ich mir darauffolgend anschauen, erstmal eine vernünftige Analyse meiner Daten hinkriegen.
Liebe Grüße und bleibt alle gesund!
Re: Datenanalyse in Python
Verfasst: Dienstag 1. Dezember 2020, 01:15
von Wunderkind89
Sirius3 hat geschrieben: Samstag 28. November 2020, 23:29
Du fragst Dich seit 28 Beiträgen hier durch, hast aber noch nicht die pandas-Dokumentation durchgelesen, was die Dir so an Funktionen bietet?
Ich gucke gerade: Complete Python Pandas Data Science Tutorial!
Quelle:
https://www.youtube.com/watch?v=vmEHCJofslg
Grüße
Re: Datenanalyse in Python
Verfasst: Dienstag 1. Dezember 2020, 05:29
von snafu
Abweichungen kriegst du mit diff(). Wenn du mit pandas arbeiten willst, dann bietet sich eine Series an, sofern keine weiteren Spalten dazukommen.
Code: Alles auswählen
import pandas as pd
data = pd.Series([1,1,1,2,2,2,4,0,1,1,3])
print(data.diff())
print(data[data.diff() != 0])
Re: Datenanalyse in Python
Verfasst: Dienstag 1. Dezember 2020, 07:52
von tonikae
Wunderkind89 hat geschrieben: Dienstag 1. Dezember 2020, 00:53
Vielen lieben Dank erstmal für eure Antworten. Eine andere Frage: ich hab mir vorgenommen in meinem Datensatz die Erhöhungen von einander zu Subtrahieren, weil so kriege ich die Anzahl der Personen, die da entlang gelaufen sind (Beispiel: 1,1,1,1,2,2 also gucke ich, wo es die erste Erhöhung gab und das ist bei 1,2 und mache an der Stelle 2 - 1 = 1 Person). Ich mache also aus meiner jetzigen Datenliste eine neue Datenliste, wo aber nur Personen drin stehen sollten, die zu einer bestimmten Zeit an einem der Sensoren entlang gelaufen sind. Auf diese Weise könnte ich dann eine brauchbare Analyse meiner Daten durchführen (Mittelwert, Varianz usw.). Das ist so mein jetziger Plan.
Mal eine etwas andere Herangehensweise (nicht in Python,sondern in Julia), als alternativer Denkansatz.
https://drive.google.com/file/d/1P6VUwI ... r7AP/view
Re: Datenanalyse in Python
Verfasst: Dienstag 1. Dezember 2020, 18:06
von nezzcarth
@tonkiae:
Bei den Ausreißern kehrst du aber schon mit ziemlich eisernem Besen durch…

Andere mir bekannte Methoden würden z. B. vielleicht nur die 99 entfernen. Allerdings ist es bei so etwas generell problematisch, ein Verfahren zu empfehlen, ohne die Daten zu kennen, oder zumindest einen Erfahrungswert zu haben, was normalerweise zu erwarten ist (z. B. ob man Normalverteilung voraussetzen kann). Daher würde ich, wenn der Fragesteller es selbst nicht einschätzen kann, im Zweifelsfall die Praktikumsbetreuerin fragen. Die wird sagen können, was in dem Fach oder Arbeitsumfeld normalerweise der übliche Umgang mit Ausreißern ist.
Re: Datenanalyse in Python
Verfasst: Mittwoch 2. Dezember 2020, 16:22
von tonikae
nezzcarth hat geschrieben: Dienstag 1. Dezember 2020, 18:06
@tonkiae:
Bei den Ausreißern kehrst du aber schon mit ziemlich eisernem Besen durch…
Die Quantiles sind ja auch nur die üblichen Standardschwellwerte (0.25, 0.5, 0.75 und 1) für ein Code-Beispiel.
Das die nicht überall passen ist klar. Wenn man aber andere Schwellwerte braucht, nutzt man eben "Percentile"...da kann man das frei vorgeben
und die passende Bandbreite an zulässigen Werten individuell einrichten. Wobei das in Julia aber eigentlich egal ist, weil die Quantiles auch mit
frei einstellbaren Schwellwerten arbeiten können.
d.h.
Da könnte man z.B. auch: untergrenze=quantile(daten[begin:end], 0.39) schreiben.
Re: Datenanalyse in Python
Verfasst: Mittwoch 2. Dezember 2020, 17:02
von snafu
In Pandas könnte man sich einen schnellen Überblick auch einfach mit der describe()-Methode holen.
Re: Datenanalyse in Python
Verfasst: Donnerstag 3. Dezember 2020, 02:53
von tonikae
snafu hat geschrieben: Mittwoch 2. Dezember 2020, 17:02
In Pandas könnte man sich einen schnellen Überblick auch einfach mit der describe()-Methode holen.
Richtig..."Describe" macht eigentlich fast das gleiche, beschränkt sich aber nur auch Pandas.
Während Quantiles/Percentiles ganz allgemein(bei Arrays und Listen) nicht nur rein
statistisch, sondern auch eher so in der Art wie:
elekronische Hochpass/Tiefpass/Bandpass-Filter eingesetzt werden können.
Wenn man aber unbedingt Pandas nutzen will, geht das unter Julia natürlich auch.
Denn Julia kann ja auch Python-Libs verwenden. Der einzige Unterschied ist dann
nur.....in Python heisst es "import Pandas" in Julia "using Pandas"
Was man da bevorzugt, ist nur eine Frage des persönlichen Geschmacks.
Ich selbst nutze lieber die Julia-Pakete "CSV" und "Dataframes"...mit "Panadas"
werde ich einfach nicht so recht warm.
Re: Datenanalyse in Python
Verfasst: Sonntag 13. Dezember 2020, 18:53
von Wunderkind89
Hallo zusammen, also ich versuche gerade eine lineare regressionskurve zu bilden und meine Daten zu plotten (inwieweit diese von der Kurve abweichen). Dabei sollen auf der x Achse die Minuten stehen und auf der y Achse die einzelnen kumulierten Werte meiner Sensoren.
Hier mein Code:
from datetime import datetime
from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.dates as pldates
import numpy as np
DATA_FILENAME = "SmartCountr.csv"
def main():
data = pd.read_csv(DATA_FILENAME, delimiter=";")
# Create linear regression object
regr = linear_model.LinearRegression()
x = [datetime.strptime(str(d), '%Y-%m-%d %H:%M:%S') for d in data["zeit"]]
counter_x = matplotlib.dates.date2num(x)
formatter = pldates.DateFormatter("%M")
ax = plt.subplot()
ax.xaxis.set_major_formatter(formatter)
# Load the dataset
counter_x, counter_y = pd.Series(data(return_x_y=True))
counter_x.shape, counter_y.shape
# Use only one feature
counter_x = counter_x[:, np.newaxis, 2]
counter_x.shape
for label in (
f"gate.{number}.{direction}"
for number in range(1, 5)
for direction in ["in", "out"]
):
# Train the model using the training sets
# regr.fit(diabetes_X_train, diabetes_y_train)
regr.fit(counter_x, data[label])
# Make predictions using the testing set
# counter_y_pred = regr.predict(counter_X_test)
counter_y_pred = regr.predict(counter_x)
# Plot outputs
plt.scatter(counter_x, data[label], color='black')
plt.plot(counter_x, counter_y_pred, color='blue', linewidth=3)
# plt.xticks(())
# plt.yticks(())
plt.show()
axis_label_arguments = {
"family": "serif",
"weight": "normal",
"size": 16,
"labelpad": 6,
}
plt.xlabel("Minutes", color="r", **axis_label_arguments)
plt.ylabel("Frequency", color="b", **axis_label_arguments)
plt.suptitle("Sensor measurement errors", fontsize=16)
plt.legend()
plt.show()
if __name__ == "__main__":
main()
FEHLER:
C:\Users\iljar\Desktop\UebungenPython\venv\Scripts\python.exe C:/Users/iljar/Desktop/UebungenPython/regression.py
Traceback (most recent call last):
File "C:\Users\iljar\Desktop\UebungenPython\regression.py", line 70, in <module>
main()
File "C:\Users\iljar\Desktop\UebungenPython\regression.py", line 28, in main
counter_x, counter_y = pd.Series(data(return_x_y=True))
TypeError: 'DataFrame' object is not callable
Process finished with exit code 1
Kann mir jemand sagen, was ich da falsch mache und was die Lösung wäre?
Grüße
Re: Datenanalyse in Python
Verfasst: Sonntag 13. Dezember 2020, 18:59
von Wunderkind89
Ein Moment ich überarbeite mein Code nochmal (da ich es nicht löschen kann), weil er sieht so nicht gut aus. Ich schicke gleich überarbeitete Version
Re: Datenanalyse in Python
Verfasst: Sonntag 13. Dezember 2020, 19:36
von Wunderkind89
Neuer Code:
from datetime import datetime
from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.dates as pldates
import numpy as np
DATA_FILENAME = "SmartCountr.csv"
def main():
data = pd.read_csv(DATA_FILENAME, delimiter=";")
# Create linear regression object
regr = linear_model.LinearRegression()
x = [datetime.strptime(str(d), '%Y-%m-%d %H:%M:%S') for d in data["zeit"]]
counter_x = matplotlib.dates.date2num(x)
formatter = pldates.DateFormatter("%M")
ax = plt.subplot()
ax.xaxis.set_major_formatter(formatter)
# Load the dataset
counter_y = data['gate.1.in']
counter_x.shape, counter_y.shape
# Use only one feature
counter_x = counter_x[:, np.newaxis, 2]
counter_x.shape
# Train the model using the training sets
regr.fit(counter_x, counter_y)
# Make predictions using the testing set
counter_y_pred = regr.predict(counter_x)
# Plot outputs
plt.scatter(counter_x, data['gate.1.in'], color='black')
plt.plot(counter_x, counter_y_pred, color='blue', linewidth=3)
# plt.xticks(())
# plt.yticks(())
axis_label_arguments = {
"family": "serif",
"weight": "normal",
"size": 16,
"labelpad": 6,
}
plt.xlabel("Minutes", color="r", **axis_label_arguments)
plt.ylabel("Frequency", color="b", **axis_label_arguments)
plt.suptitle("Sensor measurement errors", fontsize=16)
plt.legend()
plt.show()
if __name__ == "__main__":
main()
FEHLER:
C:\Users\iljar\Desktop\UebungenPython\venv\Scripts\python.exe C:/Users/iljar/Desktop/UebungenPython/regression.py
Traceback (most recent call last):
File "C:\Users\iljar\Desktop\UebungenPython\regression.py", line 60, in <module>
main()
File "C:\Users\iljar\Desktop\UebungenPython\regression.py", line 31, in main
counter_x = counter_x[:, np.newaxis, 2]
IndexError: too many indices for array: array is 1-dimensional, but 2 were indexed
Process finished with exit code 1
***Kann mir einer sagen wie ich das Problem lösen kann?
Re: Datenanalyse in Python
Verfasst: Sonntag 13. Dezember 2020, 20:11
von __deets__
Muessen wir das Ende der Pandemie abwarten, bis dir mal einfaellt, fuer den Code und die Fehlermeldungen mal die dafuer gedachten code-Tags zu benutzen? Das ist ja beileibe nicht dein erster Post hier.