Beispiel für eine explorative Datenanalyse: Erdbeben der letzten 7 Tage (US Geological Survey)

Import zweier Standardpakete für die Datenanalyse: Numpy für mehrdimensionale Arrays, Pandas für Datenanalyse in Tabellen.


In [2]:
import pandas as pd
import numpy as np
%matplotlib inline

Direkter Download vom USGS, Abruf des Downloaddatums, automatischer Import in Pandas-Dataframe


In [3]:
fileUrl = 'http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_day.csv'
eData = pd.read_csv(fileUrl)
dateDownloaded = !date
dateDownloaded


Out[3]:
['Sun Dec 13 16:16:08 CET 2015']

1. Darstellung als Pandas-DataFrame

Darstellung des Datensatzes als Datensatzes als Pandas-Dataframe (Tabelle der ersten und letzten 30 Einträge, Anzahl Reihen und Spalten). Konvention: Variablen sind die Spalten, einzelne Messungen die Zeilen.


In [4]:
eData


Out[4]:
time latitude longitude depth mag magType nst gap dmin rms net id updated place type
0 2015-12-13T10:03:23.920Z -11.160800 166.445500 86.46 4.80 mb NaN 72.0 4.324000 0.77 us us20004gvu 2015-12-13T10:21:00.742Z 83km SE of Lata, Solomon Islands earthquake
1 2015-12-13T08:31:15.750Z -24.194400 -66.956400 182.50 4.60 mb NaN 40.0 2.388000 1.14 us us20004gvd 2015-12-13T08:57:09.774Z 64km W of San Antonio de los Cobres, Argentina earthquake
2 2015-12-13T07:14:28.700Z 19.238000 -66.538400 30.00 3.00 Md 7 277.2 1.019588 0.28 pr pr15347002 2015-12-13T13:00:14.444Z 86km NNE of Arecibo, Puerto Rico earthquake
3 2015-12-13T07:11:51.400Z 19.128700 -65.602500 53.00 3.10 Md 6 306.0 0.871366 0.27 pr pr15347001 2015-12-13T12:21:27.211Z 81km NNE of Vieques, Puerto Rico earthquake
4 2015-12-13T06:42:11.060Z -6.913700 129.908500 97.25 5.40 mb NaN 45.0 1.740000 0.65 us us20004gv8 2015-12-13T14:44:47.643Z 193km NW of Saumlaki, Indonesia earthquake
5 2015-12-13T05:53:20.730Z 54.994600 111.736800 14.19 5.10 mb NaN 38.0 5.874000 0.83 us us20004gv4 2015-12-13T13:56:03.096Z 120km NE of Kurumkan, Russia earthquake
6 2015-12-13T05:20:02.000Z 19.487800 -66.260200 35.00 3.20 Md 12 288.0 1.227099 0.34 pr pr15347000 2015-12-13T13:22:33.352Z 113km N of Dorado, Puerto Rico earthquake
7 2015-12-13T04:36:16.120Z 32.401165 -115.245163 2.89 2.96 ml 20 160.0 0.053810 0.36 ci ci37501352 2015-12-13T05:52:28.099Z 7km NW of Delta, B.C., MX earthquake
8 2015-12-13T01:52:18.010Z 46.717000 152.617200 57.91 5.30 mb NaN 127.0 6.766000 0.75 us us20004guj 2015-12-13T09:54:59.507Z Kuril Islands earthquake
9 2015-12-13T01:47:09.900Z 3.453800 127.442900 49.42 5.40 mb NaN 46.0 2.665000 0.99 us us20004gug 2015-12-13T09:49:46.553Z 200km NNW of Tobelo, Indonesia earthquake
10 2015-12-12T23:32:53.960Z -41.166100 -90.209400 10.00 5.00 mb NaN 150.0 13.769000 0.82 us us20004gtz 2015-12-13T07:35:30.578Z Southeast of Easter Island earthquake
11 2015-12-12T23:30:34.480Z 0.641400 -24.998400 10.00 4.90 mb NaN 97.0 20.966000 0.90 us us20004gu0 2015-12-13T07:33:10.248Z Central Mid-Atlantic Ridge earthquake
12 2015-12-12T22:36:44.000Z 56.691100 -154.328200 54.40 4.40 ml NaN NaN NaN 1.27 ak ak12247618 2015-12-13T06:39:28.343Z 96km SSW of Larsen Bay, Alaska earthquake
13 2015-12-12T22:04:02.970Z 31.234400 129.367800 17.70 4.50 mb NaN 101.0 0.967000 0.93 us us20004gtj 2015-12-13T06:06:33.916Z 90km W of Makurazaki, Japan earthquake
14 2015-12-12T21:05:53.410Z 38.942800 141.837700 49.79 4.50 mb NaN 144.0 1.351000 1.37 us us20004gsy 2015-12-13T05:08:31.673Z 17km SE of Ofunato, Japan earthquake
15 2015-12-12T20:56:36.580Z -5.255200 129.779100 129.28 4.10 mb NaN 254.0 3.101000 1.47 us us20004gsv 2015-12-13T04:59:03.298Z 224km SSE of Saparua, Indonesia earthquake
16 2015-12-12T17:40:41.070Z 36.446800 -97.132400 5.00 3.50 mb_lg NaN 62.0 0.320000 0.33 us us20004grz 2015-12-13T00:57:05.378Z 22km NE of Perry, Oklahoma earthquake
17 2015-12-12T16:51:14.320Z 12.132700 -87.697100 56.23 4.30 mb NaN 164.0 1.956000 0.92 us us20004grt 2015-12-13T00:53:44.255Z 68km SW of Corinto, Nicaragua earthquake
18 2015-12-12T16:48:52.730Z 20.000999 -156.476334 0.00 2.61 md 34 234.0 0.668600 0.18 hv hv61124976 2015-12-13T00:51:22.612Z 59km WNW of Kalaoa, Hawaii earthquake
19 2015-12-12T15:39:43.680Z 23.331000 121.413100 15.21 4.40 mb NaN 103.0 0.122000 0.65 us us20004grk 2015-12-12T23:42:19.284Z 68km NNE of Taitung, Taiwan earthquake

Kürzere Darstellung mit head(): nur die ersten 5 Einträge des Tabellenkopfes


In [5]:
eData.head()


Out[5]:
time latitude longitude depth mag magType nst gap dmin rms net id updated place type
0 2015-12-13T10:03:23.920Z -11.1608 166.4455 86.46 4.8 mb NaN 72.0 4.324000 0.77 us us20004gvu 2015-12-13T10:21:00.742Z 83km SE of Lata, Solomon Islands earthquake
1 2015-12-13T08:31:15.750Z -24.1944 -66.9564 182.50 4.6 mb NaN 40.0 2.388000 1.14 us us20004gvd 2015-12-13T08:57:09.774Z 64km W of San Antonio de los Cobres, Argentina earthquake
2 2015-12-13T07:14:28.700Z 19.2380 -66.5384 30.00 3.0 Md 7 277.2 1.019588 0.28 pr pr15347002 2015-12-13T13:00:14.444Z 86km NNE of Arecibo, Puerto Rico earthquake
3 2015-12-13T07:11:51.400Z 19.1287 -65.6025 53.00 3.1 Md 6 306.0 0.871366 0.27 pr pr15347001 2015-12-13T12:21:27.211Z 81km NNE of Vieques, Puerto Rico earthquake
4 2015-12-13T06:42:11.060Z -6.9137 129.9085 97.25 5.4 mb NaN 45.0 1.740000 0.65 us us20004gv8 2015-12-13T14:44:47.643Z 193km NW of Saumlaki, Indonesia earthquake

Anzahl der Reihen und Spalten mit Numpy shape().


In [6]:
np.shape(eData)


Out[6]:
(20, 15)

Anzeige der einzelnen Spaltennamen mit Attribut DataFrame.columns


In [7]:
eData.columns


Out[7]:
Index(['time', 'latitude', 'longitude', 'depth', 'mag', 'magType', 'nst',
       'gap', 'dmin', 'rms', 'net', 'id', 'updated', 'place', 'type'],
      dtype='object')

Datentyp der einzelnen Variablen mit Attribut DataFrame.dtypes


In [8]:
eData.dtypes


Out[8]:
time          object
latitude     float64
longitude    float64
depth        float64
mag          float64
magType       object
nst          float64
gap          float64
dmin         float64
rms          float64
net           object
id            object
updated       object
place         object
type          object
dtype: object

2. Aufbereitung des Datensatzes

Überprüfen, ob Tabelle NaN enthält, mit DataFrame.isnull().any()


In [9]:
eData.isnull().any()


Out[9]:
time         False
latitude     False
longitude    False
depth        False
mag          False
magType      False
nst           True
gap           True
dmin          True
rms          False
net          False
id           False
updated      False
place        False
type         False
dtype: bool

Entfernung aller Zeilen bzw. Messungen mit NaNs durch DataFrame.dropna()


In [20]:
eData = eData.dropna()
eData


Out[20]:
time latitude longitude depth mag magType nst gap dmin rms net id updated place type
2 2015-12-13T07:14:28.700Z 19.238000 -66.538400 30.00 3.00 Md 7 277.2 1.019588 0.28 pr pr15347002 2015-12-13T13:00:14.444Z 86km NNE of Arecibo, Puerto Rico earthquake
3 2015-12-13T07:11:51.400Z 19.128700 -65.602500 53.00 3.10 Md 6 306.0 0.871366 0.27 pr pr15347001 2015-12-13T12:21:27.211Z 81km NNE of Vieques, Puerto Rico earthquake
6 2015-12-13T05:20:02.000Z 19.487800 -66.260200 35.00 3.20 Md 12 288.0 1.227099 0.34 pr pr15347000 2015-12-13T13:22:33.352Z 113km N of Dorado, Puerto Rico earthquake
7 2015-12-13T04:36:16.120Z 32.401165 -115.245163 2.89 2.96 ml 20 160.0 0.053810 0.36 ci ci37501352 2015-12-13T05:52:28.099Z 7km NW of Delta, B.C., MX earthquake
18 2015-12-12T16:48:52.730Z 20.000999 -156.476334 0.00 2.61 md 34 234.0 0.668600 0.18 hv hv61124976 2015-12-13T00:51:22.612Z 59km WNW of Kalaoa, Hawaii earthquake

In [11]:
eData.isnull().any()


Out[11]:
time         False
latitude     False
longitude    False
depth        False
mag          False
magType      False
nst          False
gap          False
dmin         False
rms          False
net          False
id           False
updated      False
place        False
type         False
dtype: bool

Überprüfen, ob Zeilen bzw. Messungen doppelt vorkommen, mit DataFrame.duplicated()


In [12]:
eData.duplicated().any()


Out[12]:
False

Es kommen also keine Duplikate vor. Bei Bedarf mit DataFrame.drop_duplicates() entfernen.

3. Explorative Statistiken

Statistische Beschreibung der numerischen Variablen mit Dataframe.describe() (count: Anzahl Messungen, mean: Mittelwert, std: Standardabweichung, min: Minimum, 25%: 25-Perzentil, ...)


In [13]:
eData.describe()


Out[13]:
latitude longitude depth mag nst gap dmin rms
count 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000
mean 22.051333 -94.024519 24.178000 2.974000 15.800000 253.040000 0.768092 0.286000
std 5.795499 40.880008 22.469277 0.223786 11.584472 58.373007 0.448525 0.070569
min 19.128700 -156.476334 0.000000 2.610000 6.000000 160.000000 0.053810 0.180000
25% 19.238000 -115.245163 2.890000 2.960000 7.000000 234.000000 0.668600 0.270000
50% 19.487800 -66.538400 30.000000 3.000000 12.000000 277.200000 0.871366 0.280000
75% 20.000999 -66.260200 35.000000 3.100000 20.000000 288.000000 1.019588 0.340000
max 32.401165 -65.602500 53.000000 3.200000 34.000000 306.000000 1.227099 0.360000

Streumatrix für alle numerischen Variablen mit Pandas scattermatrix():


In [14]:
pd.scatter_matrix(eData, figsize=(14,14), marker='o');


4. Analyse von Untermengen

Zugriff auf die Variable 'Lat' (latitude):


In [16]:
eData['latitude']


Out[16]:
2     19.238000
3     19.128700
6     19.487800
7     32.401165
18    20.000999
Name: latitude, dtype: float64

Welche Erdbeben fanden oberhalb einer geographischen Breite von 40 Grad statt?


In [17]:
eData['latitude'] > 40.0


Out[17]:
2     False
3     False
6     False
7     False
18    False
Name: latitude, dtype: bool

Gab es überhaupt Erdbeben oberhalb 50 Grad Breite?


In [18]:
(eData['latitude'] > 40.0).any()


Out[18]:
False

Gab es also. Haben alle verzeichneten Erdbeben eine Breite größer als 18 Grad?


In [19]:
(eData['latitude'] > 18.0).all()


Out[19]:
True

Es sind also auch Erdbeben unterhalb von 18 Grad verzeichnet.

Alle unterschiedlichen Werte der kategorischen Variable 'Version' mit Dataframe['Variablenname'].unique()


In [ ]:
eData['Version'].unique()

Häufigkeit der verschiedenen Kategorien in 'Version' mit Dataframe['Variablenname'].value_counts():


In [ ]:
eData['Version'].value_counts()

Häufigkeit von Wertepaaren der beiden kategorischen Variablen 'Version' und 'Src' mit Pandas crosstab():


In [ ]:
pd.crosstab(eData['Src'], eData['Version'])

Darstellung der Häufigkeitsverteilung der Erdbebenstärken für die verschiedenen Quellen mit einer Kastengraphik durch Pandas boxplot():


In [ ]:
from pandas.tools.plotting import boxplot
boxplot(eData, column='Magnitude', by='Src');

In [ ]: