Deskriptive Statistik¶
pandas-Objekte sind mit einer Reihe von gängigen mathematischen und statistischen Methoden ausgestattet. Die meisten von ihnen fallen in die Kategorie der Reduktionen oder zusammenfassenden Statistiken, Methoden, die einen einzelnen Wert (wie die Summe oder den Mittelwert) aus einer Serie oder einer Reihe von Werten aus den Zeilen oder Spalten eines DataFrame extrahieren. Im Vergleich zu ähnlichen Methoden, die sich bei NumPy-Arrays finden, behandeln sie auch fehlende Daten.
[1]:
import numpy as np
import pandas as pd
df = pd.DataFrame(
np.random.randn(7, 3), index=pd.date_range("2022-02-02", periods=7)
)
new_index = pd.date_range("2022-02-03", periods=7)
df2 = df.reindex(new_index)
df2
[1]:
0 | 1 | 2 | |
---|---|---|---|
2022-02-03 | -0.082751 | -0.410653 | 0.534347 |
2022-02-04 | 0.845064 | -1.493007 | -2.124201 |
2022-02-05 | 0.499886 | 0.617415 | -1.557526 |
2022-02-06 | 0.841211 | 0.136105 | -1.106929 |
2022-02-07 | -0.278047 | -0.941522 | 0.599214 |
2022-02-08 | 1.891887 | 0.658805 | 0.190213 |
2022-02-09 | NaN | NaN | NaN |
Der Aufruf der pandas.DataFrame.sum
-Methode gibt eine Serie zurück, die Spaltensummen enthält:
[2]:
df2.sum()
[2]:
0 3.717250
1 -1.432858
2 -3.464882
dtype: float64
Die Übergabe von axis='columns'
oder axis=1
summiert stattdessen über die Spalten:
[3]:
df2.sum(axis="columns")
[3]:
2022-02-03 0.040943
2022-02-04 -2.772145
2022-02-05 -0.440224
2022-02-06 -0.129614
2022-02-07 -0.620355
2022-02-08 2.740905
2022-02-09 0.000000
Freq: D, dtype: float64
Wenn eine ganze Zeile oder Spalte alle NA-Werte enthält, ist die Summe 0
. Dies kann mit der Option skipna
deaktiviert werden:
[4]:
df2.sum(axis="columns", skipna=False)
[4]:
2022-02-03 0.040943
2022-02-04 -2.772145
2022-02-05 -0.440224
2022-02-06 -0.129614
2022-02-07 -0.620355
2022-02-08 2.740905
2022-02-09 NaN
Freq: D, dtype: float64
Einige Aggregationen, wie z.B. mean
, erfordern mindestens einen Nicht-NaN
-Wert, um ein wertvolles Ergebnis zu erhalten:
[5]:
df2.mean(axis="columns")
[5]:
2022-02-03 0.013648
2022-02-04 -0.924048
2022-02-05 -0.146741
2022-02-06 -0.043205
2022-02-07 -0.206785
2022-02-08 0.913635
2022-02-09 NaN
Freq: D, dtype: float64
Optionen für Reduktionsmethoden¶
Methode |
Beschreibung |
---|---|
|
die Achse der zu reduzierenden Werte: |
|
fehlende Werte ausschließen; standardmäßig |
|
nach Ebene gruppiert reduzieren, wenn die Achse hierarchisch indiziert ist (MultiIndex) |
Einige Methoden, wie idxmin
und idxmax
, liefern indirekte Statistiken wie den Indexwert, bei dem der Mindest- oder Höchstwert erreicht wird:
[6]:
df2.idxmax()
[6]:
0 2022-02-08
1 2022-02-08
2 2022-02-07
dtype: datetime64[ns]
Andere Methoden sind Akkumulationen:
[7]:
df2.cumsum()
[7]:
0 | 1 | 2 | |
---|---|---|---|
2022-02-03 | -0.082751 | -0.410653 | 0.534347 |
2022-02-04 | 0.762312 | -1.903660 | -1.589854 |
2022-02-05 | 1.262198 | -1.286245 | -3.147380 |
2022-02-06 | 2.103409 | -1.150140 | -4.254309 |
2022-02-07 | 1.825363 | -2.091663 | -3.655095 |
2022-02-08 | 3.717250 | -1.432858 | -3.464882 |
2022-02-09 | NaN | NaN | NaN |
Eine andere Art von Methoden sind weder Reduktionen noch Akkumulationen. describe
ist ein solches Beispiel, das mehrere zusammenfassende Statistiken auf einen Schlag erstellt:
[8]:
df2.describe()
[8]:
0 | 1 | 2 | |
---|---|---|---|
count | 6.000000 | 6.000000 | 6.000000 |
mean | 0.619542 | -0.238810 | -0.577480 |
std | 0.778724 | 0.868993 | 1.169895 |
min | -0.278047 | -1.493007 | -2.124201 |
25% | 0.062908 | -0.808805 | -1.444877 |
50% | 0.670548 | -0.137274 | -0.458358 |
75% | 0.844101 | 0.497088 | 0.448314 |
max | 1.891887 | 0.658805 | 0.599214 |
Bei nicht-numerischen Daten erzeugt describe
alternative zusammenfassende Statistiken:
[9]:
data = {
"Code": ["U+0000", "U+0001", "U+0002", "U+0003", "U+0004", "U+0005"],
"Octal": ["001", "002", "003", "004", "004", "005"],
}
df3 = pd.DataFrame(data)
df3.describe()
[9]:
Code | Octal | |
---|---|---|
count | 6 | 6 |
unique | 6 | 5 |
top | U+0000 | 004 |
freq | 1 | 2 |
Deskriptive und zusammenfassende Statistiken:
Methode |
Beschreibung |
---|---|
|
Anzahl der Nicht-NA-Werte |
|
Berechnung einer Reihe von zusammenfassenden Statistiken für Serien oder jede DataFrame-Spalte |
|
Berechnung der Mindest- und Höchstwerte |
|
Berechnung der Indexstellen (ganze Zahlen), an denen der Mindest- bzw. Höchstwert erreicht wurde |
|
Berechnung der Indexbeschriftungen, an denen der Mindest- bzw. Höchstwert erreicht wurde |
|
Berechnung des Stichprobenquantils im Bereich von 0 bis 1 |
|
Summe der Werte |
|
Arithmetisches Mittel der Werte |
|
Arithmetischer Median (50%-Quantil) der Werte |
|
Mittlere absolute Abweichung vom Mittelwert |
|
Produkt aller Werte |
|
Stichprobenvarianz der Werte |
|
Stichprobenstandardabweichung der Werte |
|
Stichprobenschiefe (drittes Moment) der Werte |
|
Stichprobenwölbung (viertes Moment) der Werte |
|
Kumulierte Summe der Werte |
|
Kumuliertes Minimum bzw. Maximum der Werte |
|
Kumuliertes Produkt der Werte |
|
Berechnung der ersten arithmetischen Differenz (nützlich für Zeitreihen) |
|
Berechnung der prozentualen Veränderungen |
ydata_profiling
¶
ydata-profiling erzeugt Profilberichte aus einem pandas DataFrame. Die Funktion pandas df.describe()
ist praktisch, aber ein wenig einfach für die explorative Datenanalyse. ydata-profiling erweitert pandas DataFrame mit df.profile_report()
, die automatisch einen standardisierten Bericht zum Verständnis der Daten erzeugt.
Installation¶
$ uv add standard-imghdr legacy-cgi "ydata-profiling[notebook, unicode]"
Resolved 251 packages in 2.53s
Prepared 1 package in 106ms
Installed 24 packages in 155ms
+ annotated-types==0.7.0
+ dacite==1.9.2
+ htmlmin==0.1.12
+ imagehash==4.3.1
+ legacy-cgi==2.6.3
+ llvmlite==0.44.0
+ multimethod==1.12
+ networkx==3.5
+ numba==0.61.0
+ patsy==1.0.1
+ phik==0.12.4
+ puremagic==1.29
+ pydantic==2.11.7
+ pydantic-core==2.33.2
+ pywavelets==1.8.0
+ seaborn==0.13.2
+ standard-imghdr==3.13.0
+ statsmodels==0.14.4
+ tangled-up-in-unicode==0.2.0
+ typeguard==4.4.2
+ typing-inspection==0.4.1
+ visions==0.8.1
+ wordcloud==1.9.4
+ ydata-profiling==4.16.1
$ uv run jupyter notebook
In Python 3.13 wurden die Module imghdr
und cgi
entfernt, siehe auch PEP 594. Als Abhilfe für diese Legacy-Produkte wurden jedoch standard-imghdr und legacy-cgi im Python Package Index bereitgestellt.
Beispiel¶
[10]:
from ydata_profiling import ProfileReport
profile = ProfileReport(df2, title="Pandas Profiling Report")
profile.to_notebook_iframe()
Improve your data and profiling with ydata-sdk, featuring data quality scoring, redundancy detection, outlier identification, text validation, and synthetic data generation.
100%|██████████████████████████████████████████| 3/3 [00:00<00:00, 74455.10it/s]
Konfiguration für große Datensätze¶
Standardmäßig fasst ydata-profiling den Datensatz so zusammen, dass er die meisten Erkenntnisse für die Datenanalyse liefert. Wenn die Berechnungszeit der Profilerstellung zu einem Engpass wird, bietet ydata-profiling mehrere Alternativen, um diesen zu überwinden. Für die folgenden Beispiele lesen wir zunächst einen größeren Datensatz in pandas ein:
[11]:
titanic = pd.read_csv(
"https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv"
)
1. Minimaler Modus¶
ydata-profiling enthält eine minimale Konfigurationsdatei config_minimal.yaml, in der die teuersten Berechnungen standardmäßig ausgeschaltet sind. Dies ist die empfohlene Ausgangsbasis für größere Datensätze.
[12]:
profile = ProfileReport(
titanic, title="Minimal Pandas Profiling Report", minimal=True
)
profile.to_notebook_iframe()
0%| | 0/12 [00:00<?, ?it/s]
100%|███████████████████████████████████████████| 12/12 [00:00<00:00, 94.49it/s]
Weitere Details zu Einstellungen und Konfiguration findet ihr unter Available settings.
2. Stichprobe¶
Eine alternative Möglichkeit bei sehr großen Datensätzen besteht darin, nur einen Teil davon für die Erstellung des Profiling-Berichts zu verwenden:
[13]:
sample = titanic.sample(frac=0.05)
profile = ProfileReport(sample, title="Sample Pandas Profiling Report")
profile.to_notebook_iframe()
100%|███████████████████████████████████████| 12/12 [00:00<00:00, 141381.03it/s]
3. Teure Berechnungen deaktivieren¶
Um den Rechenaufwand in großen Datensätzen zu verringern, aber dennoch einige interessante Informationen zu erhalten, können einige Berechnungen nur für bestimmte Spalten gefiltert werden:
[14]:
profile = ProfileReport()
profile.config.interactions.targets = ["Sex", "Age"]
profile.df = titanic
profile.to_notebook_iframe()
100%|███████████████████████████████████████| 12/12 [00:00<00:00, 213269.69it/s]