Explorative Datenanalyse

Histogramm für Lufttemperaturen (Version mit Dataframe)

Daten vorbereiten

Datenquelle: https://www.govdata.de/web/guest/suchen/-/details/kontiluqs-t Stundenmittelwerte der Lufttemperatur für verschiene Orte in NRW

Der Dezimaltrenner "," wird in "." umgewandelt (emacs): ´([0-9]+),([0-9]+)´ wird zu ´\1.\2´ Ausgabe: OpenKontiLUQS_LTEM_2010-2019-dot.csv (Encoding: UTF-8)

Einlesen und Datenauswahl

In [1]:
pwd()
Out[1]:
"D:\\Home\\Nepomuk\\projekte\\julia\\J-Notebooks"
In [4]:
filesrc = "d:/Home/Nepomuk/projekte/Statistik/data/OpenKontiLUQS_LTEM_2010-2019-dot.csv"
Out[4]:
"d:/Home/Nepomuk/projekte/Statistik/data/OpenKontiLUQS_LTEM_2010-2019-dot.csv"
In [2]:
import DataFrames
const Dfm = DataFrames
Out[2]:
DataFrames
In [5]:
df = Dfm.readtable(filesrc, skipstart = 2, separator = ';')
Out[5]:
DatumZeitAABU_T_1H_Mittelwert_°C_BONN_T_1H_Mittelwert_°C_BOTT_T_1H_Mittelwert_°C_CHOR_T_1H_Mittelwert_°C_DUBR_T_1H_Mittelwert_°C_DUB2_T_1H_Mittelwert_°C_EIFE_T_1H_Mittelwert_°C_ELSB_T_1H_Mittelwert_°C_EVOG_T_1H_Mittelwert_°C_JACK_T_1H_Mittelwert_°C_JHNK_T_1H_Mittelwert_°C_KRHA_T_1H_Mittelwert_°C_MGRH_T_1H_Mittelwert_°C_NIED_T_1H_Mittelwert_°C_RODE_T_1H_Mittelwert_°C_ROTH_T_1H_Mittelwert_°C_SOES_T_1H_Mittelwert_°C_SOLI_T_1H_Mittelwert_°C_UNNA_T_1H_Mittelwert_°C_VACW_T_1H_Mittelwert_°C_VESN_T_1H_Mittelwert_°C_VKCL_T_1H_Mittelwert_°C_VKTU_T_1H_Mittelwert_°C_WALS_T_1H_Mittelwert_°C_WAST_T_1H_Mittelwert_°C_WESE_T_1H_Mittelwert_°C_
101.01.201001:00-1.1NA-0.9-0.1NANA-2.8NA-1.0NANANA-0.9-1.31.2-0.6NA-1.0-1.1NA-1.80.60.8-0.8NA-1.2
201.01.201002:00-1.3NA-0.8-0.3NANA-2.9NA-1.0NANANA-1.0-1.41.0-0.6NA-1.2-1.3NA-2.00.30.5-0.8NA-1.1
301.01.201003:00-1.5NA-0.8-0.3NANA-3.1NA-1.0NANANA-1.1-1.50.8-1.0NA-1.2-1.4NA-1.90.30.5-0.8NA-1.2
401.01.201004:00-1.6NA-0.8-0.3NANA-3.4NA-0.9NANANA-1.1-1.50.9-1.6NA-1.5-1.5NA-1.80.20.6-0.7NA-1.2
501.01.201005:00-1.7NA-0.8-0.4NANA-3.6NA-1.0NANANA-1.0-1.61.0-2.1NA-1.6-1.6NA-1.90.20.5-0.7NA-1.2
601.01.201006:00-1.7NA-0.8-0.5NANA-3.6NA-1.0NANANA-1.0-1.60.4-2.6NA-1.7-1.6NA-1.90.00.5-0.7NA-1.2
701.01.201007:00-1.8NA-0.8-0.5NANA-3.9NA-1.0NANANA-1.0-1.60.4-3.1NA-1.8-1.6NA-1.90.00.4-0.8NA-1.2
801.01.201008:00-1.8NA-0.9-0.6NANA-4.0NA-1.1NANANA-1.3-1.50.2-3.8NA-1.8-1.5NA-2.0-0.10.3-0.8NA-1.2
901.01.201009:00-1.9NA-0.8-0.6NANA-4.2NA-1.1NANANA-1.4-1.50.1-4.1NA-1.9-1.5NA-2.0-0.20.1-0.7NA-1.1
1001.01.201010:00-1.9NA-0.7-0.5NANA-4.1NA-0.9NANANA-1.3-1.40.1-4.3NA-1.9-1.4NA-2.0-0.20.2-0.6NA-1.0
1101.01.201011:00-1.9NA-0.7-0.7NANA-4.1NA-0.9NANANA-1.3-1.3-0.0-4.1NA-1.9-1.3NA-2.0-0.30.2-0.5NA-0.9
1201.01.201012:00-1.9NA-0.8-0.9NANA-4.1NA-1.1NANANA-1.2-1.4-0.0-4.0NA-1.9-1.3NA-1.9-0.50.1-0.6NA-1.0
1301.01.201013:00-1.9NA-0.8-0.9NANA-4.0NA-1.1NANANA-1.3-1.3-0.1-3.6NA-1.9-1.3NA-1.9-0.40.0-0.7NA-1.2
1401.01.201014:00-1.9NA-0.9-0.9NANA-4.2NA-1.2NANANA-1.4-1.3-0.2-3.8NA-1.9-1.3NA-2.1-0.50.0-0.8NA-1.2
1501.01.201015:00-1.9NA-1.0-0.9NANA-4.2NA-1.3NANANA-1.6-1.5-0.2-4.0NA-2.0-1.4NA-2.4-0.40.0-0.8NA-0.8
1601.01.201016:00-2.1NA-1.1-0.8NANA-4.1NA-1.3NANANA-1.5-1.8-0.2-4.3NA-1.9-1.5NA-2.4-0.5-0.1-0.7NA-0.9
1701.01.201017:00-2.2NA-0.9-1.0NANA-4.4NA-1.2NANANA-1.5-1.9-0.1-4.5NA-2.0-1.7NA-2.2-0.50.1-0.7NA-1.3
1801.01.201018:00-2.2NA-1.3-0.8NANA-4.5NA-1.6NANANA-1.5-1.9-0.2-4.7NA-2.1-1.8NA-2.3-0.40.0-1.1NA-1.9
1901.01.201019:00-2.1NA-1.4-0.9NANA-4.6NA-1.7NANANA-1.8-2.0-0.2-4.8NA-2.2-1.9NA-2.3-0.5-0.1-1.4NA-2.3
2001.01.201020:00-2.1NA-1.5-1.2NANA-4.7NA-1.7NANANA-1.9-2.0-0.3-5.0NA-2.4-2.0NA-2.2-0.6-0.1-1.6NA-2.8
2101.01.201021:00-2.3NA-1.7-1.1NANA-4.8NA-1.9NANANA-2.0-2.2-0.6-5.0NA-2.4-2.0NA-2.3-0.8-0.4-1.8NA-4.0
2201.01.201022:00-2.5NA-2.2-1.2NANA-5.1NA-2.3NANANA-2.2-2.4-0.6-5.0NA-2.4-2.1NA-2.4-0.8-0.2-2.7NA-4.9
2301.01.201023:00-2.7NA-2.7-1.4NANA-5.1NA-2.8NANANA-2.9-2.8-0.7-5.0NA-2.7-2.2NA-2.9-0.9-0.2-3.5NA-5.7
2401.01.201024:00-3.0NA-2.7-1.5NANA-5.4NA-2.9NANANA-3.7-2.7-0.7-5.2NA-2.8-2.4NA-3.3-1.0-0.5-3.4NA-6.6
2502.01.201001:00-3.5NA-2.9-1.9NANA-5.6NA-3.0NANANA-3.9-3.1-0.8-5.3NA-3.2-2.7NA-3.4-1.2-0.8-3.5NA-4.8
2602.01.201002:00-3.5NA-3.7-2.6NANA-5.1NA-3.6NANANA-3.8-3.4-1.2-5.5NA-3.7-3.0NA-3.7-1.5-1.4-3.6NA-4.5
2702.01.201003:00-3.5NA-4.1-3.2NANA-5.4NA-4.0NANANA-3.8-3.5-1.8-5.6NA-4.0-3.3NA-4.1-2.4-2.0-3.3NA-4.8
2802.01.201004:00-3.6NA-3.7-3.2NANA-5.6NA-4.0NANANA-3.8-3.6-2.2-5.9NA-4.2-3.4NA-4.6-2.8-1.9-3.2NA-4.6
2902.01.201005:00-3.3NA-3.5-3.0NANA-5.9NA-3.7NANANA-3.8-3.9-2.2-5.9NA-4.3-3.6NA-4.2-2.5-1.8-2.9NA-3.9
3002.01.201006:00-3.7NA-3.2-2.9NANA-6.1NA-3.3NANANA-5.1-3.9-1.8-6.1NA-4.2-3.8NA-3.8-2.5-1.9-2.8NA-4.0

Beschränkung auf das Jahr 2010. Erstelle einen Indexvektor.

In [6]:
iv = [contains(datum,"2010") for datum in df[:Datum]]
Out[6]:
61368-element Array{Bool,1}:
  true
  true
  true
  true
  true
  true
  true
  true
  true
  true
  true
  true
  true
     ⋮
 false
 false
 false
 false
 false
 false
 false
 false
 false
 false
 false
 false
In [7]:
df2010 = df[iv,:]
Out[7]:
DatumZeitAABU_T_1H_Mittelwert_°C_BONN_T_1H_Mittelwert_°C_BOTT_T_1H_Mittelwert_°C_CHOR_T_1H_Mittelwert_°C_DUBR_T_1H_Mittelwert_°C_DUB2_T_1H_Mittelwert_°C_EIFE_T_1H_Mittelwert_°C_ELSB_T_1H_Mittelwert_°C_EVOG_T_1H_Mittelwert_°C_JACK_T_1H_Mittelwert_°C_JHNK_T_1H_Mittelwert_°C_KRHA_T_1H_Mittelwert_°C_MGRH_T_1H_Mittelwert_°C_NIED_T_1H_Mittelwert_°C_RODE_T_1H_Mittelwert_°C_ROTH_T_1H_Mittelwert_°C_SOES_T_1H_Mittelwert_°C_SOLI_T_1H_Mittelwert_°C_UNNA_T_1H_Mittelwert_°C_VACW_T_1H_Mittelwert_°C_VESN_T_1H_Mittelwert_°C_VKCL_T_1H_Mittelwert_°C_VKTU_T_1H_Mittelwert_°C_WALS_T_1H_Mittelwert_°C_WAST_T_1H_Mittelwert_°C_WESE_T_1H_Mittelwert_°C_
101.01.201001:00-1.1NA-0.9-0.1NANA-2.8NA-1.0NANANA-0.9-1.31.2-0.6NA-1.0-1.1NA-1.80.60.8-0.8NA-1.2
201.01.201002:00-1.3NA-0.8-0.3NANA-2.9NA-1.0NANANA-1.0-1.41.0-0.6NA-1.2-1.3NA-2.00.30.5-0.8NA-1.1
301.01.201003:00-1.5NA-0.8-0.3NANA-3.1NA-1.0NANANA-1.1-1.50.8-1.0NA-1.2-1.4NA-1.90.30.5-0.8NA-1.2
401.01.201004:00-1.6NA-0.8-0.3NANA-3.4NA-0.9NANANA-1.1-1.50.9-1.6NA-1.5-1.5NA-1.80.20.6-0.7NA-1.2
501.01.201005:00-1.7NA-0.8-0.4NANA-3.6NA-1.0NANANA-1.0-1.61.0-2.1NA-1.6-1.6NA-1.90.20.5-0.7NA-1.2
601.01.201006:00-1.7NA-0.8-0.5NANA-3.6NA-1.0NANANA-1.0-1.60.4-2.6NA-1.7-1.6NA-1.90.00.5-0.7NA-1.2
701.01.201007:00-1.8NA-0.8-0.5NANA-3.9NA-1.0NANANA-1.0-1.60.4-3.1NA-1.8-1.6NA-1.90.00.4-0.8NA-1.2
801.01.201008:00-1.8NA-0.9-0.6NANA-4.0NA-1.1NANANA-1.3-1.50.2-3.8NA-1.8-1.5NA-2.0-0.10.3-0.8NA-1.2
901.01.201009:00-1.9NA-0.8-0.6NANA-4.2NA-1.1NANANA-1.4-1.50.1-4.1NA-1.9-1.5NA-2.0-0.20.1-0.7NA-1.1
1001.01.201010:00-1.9NA-0.7-0.5NANA-4.1NA-0.9NANANA-1.3-1.40.1-4.3NA-1.9-1.4NA-2.0-0.20.2-0.6NA-1.0
1101.01.201011:00-1.9NA-0.7-0.7NANA-4.1NA-0.9NANANA-1.3-1.3-0.0-4.1NA-1.9-1.3NA-2.0-0.30.2-0.5NA-0.9
1201.01.201012:00-1.9NA-0.8-0.9NANA-4.1NA-1.1NANANA-1.2-1.4-0.0-4.0NA-1.9-1.3NA-1.9-0.50.1-0.6NA-1.0
1301.01.201013:00-1.9NA-0.8-0.9NANA-4.0NA-1.1NANANA-1.3-1.3-0.1-3.6NA-1.9-1.3NA-1.9-0.40.0-0.7NA-1.2
1401.01.201014:00-1.9NA-0.9-0.9NANA-4.2NA-1.2NANANA-1.4-1.3-0.2-3.8NA-1.9-1.3NA-2.1-0.50.0-0.8NA-1.2
1501.01.201015:00-1.9NA-1.0-0.9NANA-4.2NA-1.3NANANA-1.6-1.5-0.2-4.0NA-2.0-1.4NA-2.4-0.40.0-0.8NA-0.8
1601.01.201016:00-2.1NA-1.1-0.8NANA-4.1NA-1.3NANANA-1.5-1.8-0.2-4.3NA-1.9-1.5NA-2.4-0.5-0.1-0.7NA-0.9
1701.01.201017:00-2.2NA-0.9-1.0NANA-4.4NA-1.2NANANA-1.5-1.9-0.1-4.5NA-2.0-1.7NA-2.2-0.50.1-0.7NA-1.3
1801.01.201018:00-2.2NA-1.3-0.8NANA-4.5NA-1.6NANANA-1.5-1.9-0.2-4.7NA-2.1-1.8NA-2.3-0.40.0-1.1NA-1.9
1901.01.201019:00-2.1NA-1.4-0.9NANA-4.6NA-1.7NANANA-1.8-2.0-0.2-4.8NA-2.2-1.9NA-2.3-0.5-0.1-1.4NA-2.3
2001.01.201020:00-2.1NA-1.5-1.2NANA-4.7NA-1.7NANANA-1.9-2.0-0.3-5.0NA-2.4-2.0NA-2.2-0.6-0.1-1.6NA-2.8
2101.01.201021:00-2.3NA-1.7-1.1NANA-4.8NA-1.9NANANA-2.0-2.2-0.6-5.0NA-2.4-2.0NA-2.3-0.8-0.4-1.8NA-4.0
2201.01.201022:00-2.5NA-2.2-1.2NANA-5.1NA-2.3NANANA-2.2-2.4-0.6-5.0NA-2.4-2.1NA-2.4-0.8-0.2-2.7NA-4.9
2301.01.201023:00-2.7NA-2.7-1.4NANA-5.1NA-2.8NANANA-2.9-2.8-0.7-5.0NA-2.7-2.2NA-2.9-0.9-0.2-3.5NA-5.7
2401.01.201024:00-3.0NA-2.7-1.5NANA-5.4NA-2.9NANANA-3.7-2.7-0.7-5.2NA-2.8-2.4NA-3.3-1.0-0.5-3.4NA-6.6
2502.01.201001:00-3.5NA-2.9-1.9NANA-5.6NA-3.0NANANA-3.9-3.1-0.8-5.3NA-3.2-2.7NA-3.4-1.2-0.8-3.5NA-4.8
2602.01.201002:00-3.5NA-3.7-2.6NANA-5.1NA-3.6NANANA-3.8-3.4-1.2-5.5NA-3.7-3.0NA-3.7-1.5-1.4-3.6NA-4.5
2702.01.201003:00-3.5NA-4.1-3.2NANA-5.4NA-4.0NANANA-3.8-3.5-1.8-5.6NA-4.0-3.3NA-4.1-2.4-2.0-3.3NA-4.8
2802.01.201004:00-3.6NA-3.7-3.2NANA-5.6NA-4.0NANANA-3.8-3.6-2.2-5.9NA-4.2-3.4NA-4.6-2.8-1.9-3.2NA-4.6
2902.01.201005:00-3.3NA-3.5-3.0NANA-5.9NA-3.7NANANA-3.8-3.9-2.2-5.9NA-4.3-3.6NA-4.2-2.5-1.8-2.9NA-3.9
3002.01.201006:00-3.7NA-3.2-2.9NANA-6.1NA-3.3NANANA-5.1-3.9-1.8-6.1NA-4.2-3.8NA-3.8-2.5-1.9-2.8NA-4.0

Beschränkung auf einen Monat, zum Beispiel Mai und den Ort Nummer "Bott" in Spalte 5. Der Ort ist: 46238 Bottrop, Welheim, Welheimer Straße (an der Schule).

Der DataFrame wird erweitert um eine Spalte Monat.

In [8]:
dmonths = Dict{String,String}()
Out[8]:
Dict{String,String} with 0 entries
In [9]:
map((key, val) -> dmonths[lpad("$key",2,'0')] = val,
    1:12,
    ["Jan", "Feb", "Mrz", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"])
Out[9]:
12-element Array{String,1}:
 "Jan"
 "Feb"
 "Mrz"
 "Apr"
 "Mai"
 "Jun"
 "Jul"
 "Aug"
 "Sep"
 "Okt"
 "Nov"
 "Dez"
In [10]:
df2010[:Monat] = [dmonths[getindex(date, 4:5)] for date in df2010[:Datum]]
Out[10]:
8760-element Array{String,1}:
 "Jan"
 "Jan"
 "Jan"
 "Jan"
 "Jan"
 "Jan"
 "Jan"
 "Jan"
 "Jan"
 "Jan"
 "Jan"
 "Jan"
 "Jan"
 ⋮    
 "Dez"
 "Dez"
 "Dez"
 "Dez"
 "Dez"
 "Dez"
 "Dez"
 "Dez"
 "Dez"
 "Dez"
 "Dez"
 "Dez"
In [11]:
dfbott2010 = df2010[[:Monat, :Datum, :Zeit]]
Out[11]:
MonatDatumZeit
1Jan01.01.201001:00
2Jan01.01.201002:00
3Jan01.01.201003:00
4Jan01.01.201004:00
5Jan01.01.201005:00
6Jan01.01.201006:00
7Jan01.01.201007:00
8Jan01.01.201008:00
9Jan01.01.201009:00
10Jan01.01.201010:00
11Jan01.01.201011:00
12Jan01.01.201012:00
13Jan01.01.201013:00
14Jan01.01.201014:00
15Jan01.01.201015:00
16Jan01.01.201016:00
17Jan01.01.201017:00
18Jan01.01.201018:00
19Jan01.01.201019:00
20Jan01.01.201020:00
21Jan01.01.201021:00
22Jan01.01.201022:00
23Jan01.01.201023:00
24Jan01.01.201024:00
25Jan02.01.201001:00
26Jan02.01.201002:00
27Jan02.01.201003:00
28Jan02.01.201004:00
29Jan02.01.201005:00
30Jan02.01.201006:00
In [12]:
dfbott2010[:Temp] = df2010[:BOTT_T_1H_Mittelwert_°C_]
Out[12]:
8760-element DataArrays.DataArray{Float64,1}:
 -0.9
 -0.8
 -0.8
 -0.8
 -0.8
 -0.8
 -0.8
 -0.9
 -0.8
 -0.7
 -0.7
 -0.8
 -0.8
  ⋮  
  0.3
  0.6
  0.6
  0.5
  0.5
  0.5
  0.5
  0.5
  0.6
  0.6
  0.6
  0.7

Lösche Zeilen mit fehlenden Werten.

In [14]:
dfbott2010valid = dfbott2010[!Dfm.isna(dfbott2010[:Temp]),:]
Out[14]:
MonatDatumZeitTemp
1Jan01.01.201001:00-0.9
2Jan01.01.201002:00-0.8
3Jan01.01.201003:00-0.8
4Jan01.01.201004:00-0.8
5Jan01.01.201005:00-0.8
6Jan01.01.201006:00-0.8
7Jan01.01.201007:00-0.8
8Jan01.01.201008:00-0.9
9Jan01.01.201009:00-0.8
10Jan01.01.201010:00-0.7
11Jan01.01.201011:00-0.7
12Jan01.01.201012:00-0.8
13Jan01.01.201013:00-0.8
14Jan01.01.201014:00-0.9
15Jan01.01.201015:00-1.0
16Jan01.01.201016:00-1.1
17Jan01.01.201017:00-0.9
18Jan01.01.201018:00-1.3
19Jan01.01.201019:00-1.4
20Jan01.01.201020:00-1.5
21Jan01.01.201021:00-1.7
22Jan01.01.201022:00-2.2
23Jan01.01.201023:00-2.7
24Jan01.01.201024:00-2.7
25Jan02.01.201001:00-2.9
26Jan02.01.201002:00-3.7
27Jan02.01.201003:00-4.1
28Jan02.01.201004:00-3.7
29Jan02.01.201005:00-3.5
30Jan02.01.201006:00-3.2

Betracht die einzelnen Monate.

In [77]:
by(dfbott2010valid, :Monat) do df
    println(df[:Monat][1], " ", mean(df[:Temp]), length(df[:Temp]))
end;
Apr 10.572663877266388717
Aug 17.60685483870968744
Dez -1.6665322580645165744
Feb 2.1041791044776117670
Jan -0.3825268817204298744
Jul 21.866935483870968744
Jun 18.15034770514603719
Mai 11.47249322493225738
Mrz 6.646153846153844741
Nov 6.465028089887643712
Okt 10.410433604336045738
Sep 13.901536312849162716

Leider lässt sich ´by´ nicht verwenden, um ´dfbott2010valid´ aufzuteilen.

Daher wird eine Zuordnung erzeugt, und die Datenwerte werden zu dem jeweiligen Array zugeordnet.

In [1]:
amonths = unique(dfbott2010valid[:Monat])
UndefVarError: dfbott2010valid not defined
In [78]:
monval = Dict{String, Array{Float64,1}}()
Out[78]:
Dict{String,Array{Float64,1}} with 0 entries
In [79]:
for month in amonths
    get!(monval, month, Array{Float64,1}()) # Jeder Array muss einzeln erzeugt werden.
end
In [80]:
for i = 1:length(dfbott2010valid[:Monat])
    cmonth = dfbott2010valid[:Monat][i]
    dst = monval[cmonth]
    push!(dst, dfbott2010valid[:Temp][i])
end
In [82]:
monval["Mrz"]
Out[82]:
741-element Array{Float64,1}:
  4.0
  4.4
  4.8
  4.7
  4.5
  3.8
  3.8
  3.8
  3.4
  3.3
  4.8
  5.1
  5.8
  ⋮  
 12.2
 12.1
 12.3
 12.1
  9.6
  8.0
  8.0
  8.0
  6.6
  5.9
  5.7
  5.4
In [11]:
using PyPlot

Box-Plot (Beispiel)

In [28]:
x1 = rand(30); x2 = randn(70);
In [33]:
boxplot([x1, x2], labels = ("alpha", "beta"))
Out[33]:
Dict{Any,Any} with 6 entries:
  "means"    => Any[]
  "whiskers" => Any[PyObject <matplotlib.lines.Line2D object at 0x000000002424A…
  "fliers"   => Any[PyObject <matplotlib.lines.Line2D object at 0x000000002429A…
  "boxes"    => Any[PyObject <matplotlib.lines.Line2D object at 0x000000002424A…
  "caps"     => Any[PyObject <matplotlib.lines.Line2D object at 0x000000002424A…
  "medians"  => Any[PyObject <matplotlib.lines.Line2D object at 0x000000002429A…

Zurück zu den Temperaturdaten: Wie sehen die Plots für jeden einzelnen Monat aus?

In [85]:
pxdata = Array{Array{Float64,1},1}()
for month in dmonths
    push!(pxdata, montemp[month])
end
In [88]:
boxplot(pxdata, labels = dmonths);