datenguide / genesapi-tabular

A human-friendly API to export tabular data from GENESIS
https://tabular.genesapi.org
GNU General Public License v3.0
5 stars 1 forks source link

API inconsistently returns lower-level data for *Sonderformen* on level 3 #6

Open dpprdan opened 5 years ago

dpprdan commented 5 years ago

When retrieving data for a Sonderform on the NUTS 3 Level (level=3), the tabular API sometimes (i.e. inconsistently IMHO) also returns data from the lower level. I think it should do this always (like regionalstatistik.de) or never (i.e. be consistent in applying the level parameter).

Some background (from Regionaldatenbank Deutschland, Methodische Besonderheiten der Raumgliederung, 11. Februar 2019)

[I]n Deutschland [haben sich] drei Vertreter einer Sonderform – dem sogenannten „Kommunalverband besonderer Art“ – herausgebildet, welche im Wesentlichen die Aufgaben eines Landkreises bzw. Kreises erfüllen. [...] [Der Regionalverband Saarbrücken, die Region Hannover und die Städteregion Aachen] sind [...] Bestandteil der Kreisebene (NUTS 3). Die Kreisebene verfügt dabei über ein breiteres Datenangebot als die Gemeindeebene (Regio-Stat-Tabellen, die nur bis zur Kreisebene angeboten werden können). Um aber weiterhin relevante statistische Daten der darin enthaltenen, nunmehr der Gemeindeebene angehörenden Städte Saarbrücken, Hannover und Aachen nachzuweisen, werden diese zusätzlich zu den Sonderformen auf der Kreisebene nachgewiesen.

Now, when we try to retrieve data on level 3 for 12411:BEVSTD for the Region Hannover from the tabular API, we get data for the Region but not the Stadt Hannover when we retrieve the total (i.e. without an dimension specified), but for both when we query for a specific dimension, e.g. (GES).

r <- purrr::partial(read.csv, colClasses = "character")
r("https://tabular.genesapi.org/?data=12411:BEVSTD&time=2017&level=3&parent=03241")
#>   region_id year measure   value statistic
#> 1     03241 2017  BEVSTD 1152675     12411
r("https://tabular.genesapi.org/?data=12411:BEVSTD(GES)&time=2017&level=3&parent=03241")
#>   region_id year measure  value X12411.BEVSTD.GES. statistic
#> 1     03241 2017  BEVSTD 563810               GESM     12411
#> 2     03241 2017  BEVSTD 588865               GESW     12411
#> 3  03241001 2017  BEVSTD 261192               GESM     12411
#> 4  03241001 2017  BEVSTD 273869               GESW     12411

The same is true Aachen (parent=05334) and Saarbrücken (parent=10041).

Details ``` r r("https://tabular.genesapi.org/?data=12411:BEVSTD&time=2017&level=3&parent=05334") #> region_id year measure value statistic #> 1 05334 2017 BEVSTD 554068 12411 r("https://tabular.genesapi.org/?data=12411:BEVSTD(GES)&time=2017&level=3&parent=05334") #> region_id year measure value X12411.BEVSTD.GES. statistic #> 1 05334 2017 BEVSTD 279354 GESM 12411 #> 2 05334 2017 BEVSTD 274714 GESW 12411 #> 3 05334002 2017 BEVSTD 128064 GESM 12411 #> 4 05334002 2017 BEVSTD 118208 GESW 12411 r("https://tabular.genesapi.org/?data=12411:BEVSTD&time=2017&level=3&parent=10041") #> region_id year measure value statistic #> 1 10041 2017 BEVSTD 330150 12411 r("https://tabular.genesapi.org/?data=12411:BEVSTD(GES)&time=2017&level=3&parent=10041") #> region_id year measure value X12411.BEVSTD.GES. statistic #> 1 10041 2017 BEVSTD 162107 GESM 12411 #> 2 10041 2017 BEVSTD 168043 GESW 12411 #> 3 10041100 2017 BEVSTD 89755 GESM 12411 #> 4 10041100 2017 BEVSTD 91211 GESW 12411 ```

So with data=12411:BEVSTD(GES), i.e. when the query includes a dimension, we get data for lower-level regions than level 3. When the query does not include a dimension (just data=12411:BEVSTD), we don’t.

I also tried this for 12613:BEV002 and there … it’s the other way around.

r("https://tabular.genesapi.org/?data=12613:BEV002&time=2017&level=3&parent=05334")
#>   region_id year measure value statistic
#> 1     05334 2017  BEV002  5909     12613
#> 2  05334002 2017  BEV002  2343     12613
r("https://tabular.genesapi.org/?data=12613:BEV002(GES)&time=2017&level=3&parent=05334")
#>   region_id year measure value X12613.BEV002.GES. statistic
#> 1     05334 2017  BEV002  2877               GESM     12613
#> 2     05334 2017  BEV002  3032               GESW     12613

Again the same pattern for the other regions.

Details ``` r r("https://tabular.genesapi.org/?data=12613:BEV002&time=2017&level=3&parent=03241") #> region_id year measure value statistic #> 1 03241 2017 BEV002 12676 12613 #> 2 03241001 2017 BEV002 5556 12613 r("https://tabular.genesapi.org/?data=12613:BEV002(GES)&time=2017&level=3&parent=03241") #> region_id year measure value X12613.BEV002.GES. statistic #> 1 03241 2017 E 6093 GESM 12613 #> 2 03241 2017 E 6583 GESW 12613 r("https://tabular.genesapi.org/?data=12613:BEV002&time=2017&level=3&parent=10041") #> region_id year measure value statistic #> 1 10041 2017 BEV002 4340 12613 #> 2 10041100 2017 BEV002 2223 12613 r("https://tabular.genesapi.org/?data=12613:BEV002(GES)&time=2017&level=3&parent=10041") #> region_id year measure value X12613.BEV002.GES. statistic #> 1 10041 2017 BEV002 2098 GESM 12613 #> 2 10041 2017 BEV002 2242 GESW 12613 ```

I see two options:

  1. If the goal is to resemble the output of regionalstatistik.de as closely as possible, the tabular API should always return the lower level for the Sonderformen (on levels 3 and 4, see below) - at least when there is data available.
  2. Alternatively, the tabular API should be consistent in applying the level parameter and only return data for the levels specified.

I am personally leaning towards 1. because

a) it resembles regionalstatistik.de, b) for some dimensions there is generally no data available on level 4 (e.g. 12411:BEVSTD(NAT)), except for the abovementioned cities (which resemble “kreisfreie Städte” in that regard), so https://tabular.genesapi.org/?data=12411:BEVSTD(NAT)&time=2017&level=4 would only provide data for those, which again, is unexpected (right now it throws a 500 error), c) you would have to introduce another level for Berliner Bezirke, see below.

dpprdan commented 5 years ago

The Berliner Bezirke are another edge-case (same source):

Eine weitere methodische Besonderheit bilden die zwölf Berliner Bezirke. Diese bilden die innerstädtische Gliederung der Stadt Berlin ab. Aufgrund der Relevanz und Größe dieser Gebietseinheiten werden die Berliner Bezirke zusätzlich zu der Stadt Berlin auf der Kreisebene nachgewiesen. [...]

So for 12411:BEVSTD on level 3 we see the same pattern for the Berliner Bezirke as above, with the slight twist that the values for the Bezirke are all 0 for this statistic.

r <- purrr::partial(read.csv, colClasses = "character")
r("https://tabular.genesapi.org/?data=12411:BEVSTD&time=2017&level=3&parent=11")
#>   region_id year measure   value statistic
#> 1     11000 2017  BEVSTD 3613495     12411
r("https://tabular.genesapi.org/?data=12411:BEVSTD(GES)&time=2017&level=3&parent=11")
#>    region_id year measure   value X12411.BEVSTD.GES. statistic
#> 1      11000 2017  BEVSTD 1776267               GESM     12411
#> 2      11000 2017  BEVSTD 1837228               GESW     12411
#> 3   11001001 2017  BEVSTD       0               GESM     12411
#> 4   11001001 2017  BEVSTD       0               GESW     12411
#> 5   11002002 2017  BEVSTD       0               GESM     12411
#> 6   11002002 2017  BEVSTD       0               GESW     12411
#> 7   11003003 2017  BEVSTD       0               GESM     12411
#> 8   11003003 2017  BEVSTD       0               GESW     12411
#> 9   11004004 2017  BEVSTD       0               GESM     12411
#> 10  11004004 2017  BEVSTD       0               GESW     12411
#> 11  11005005 2017  BEVSTD       0               GESM     12411
#> 12  11005005 2017  BEVSTD       0               GESW     12411
#> 13  11006006 2017  BEVSTD       0               GESM     12411
#> 14  11006006 2017  BEVSTD       0               GESW     12411
#> 15  11007007 2017  BEVSTD       0               GESM     12411
#> 16  11007007 2017  BEVSTD       0               GESW     12411
#> 17  11008008 2017  BEVSTD       0               GESM     12411
#> 18  11008008 2017  BEVSTD       0               GESW     12411
#> 19  11009009 2017  BEVSTD       0               GESM     12411
#> 20  11009009 2017  BEVSTD       0               GESW     12411
#> 21  11010010 2017  BEVSTD       0               GESM     12411
#> 22  11010010 2017  BEVSTD       0               GESW     12411
#> 23  11011011 2017  BEVSTD       0               GESM     12411
#> 24  11011011 2017  BEVSTD       0               GESW     12411
#> 25  11012012 2017  BEVSTD       0               GESM     12411
#> 26  11012012 2017  BEVSTD       0               GESW     12411

The 0s may not be an issue though, because:

Mit der Anpassung der AGS-Gebietsschlüssel im Januar 2019 werden die Berliner Bezirke nicht nur auf Ebene der Gemeinden (LAU 2), sondern auch auf Ebene der Landkreise / Kreise zusätzlich ausgewiesen. Diese Änderung wird in der Datenbereitstellung, wenn Daten für die Bezirke vorliegen, ab 2019 berücksichtigt. Für bereits veröffentlichte Kreis-Tabellen älterer Berichtsjahre erfolgt die Auffüllung nach und nach, vorausgesetzt es können Daten auf Ebene der Bezirke bereitgestellt werden. D. h., der aktuelle Datenbestand für die Berliner Bezirke wird zurzeit fortlaufend bearbeitet.

However, regionalstatistik.de currently returns a ., meaning “Zahlenwert unbekannt oder geheimzuhalten”, and not ... for “Angabe fällt später an”.

Data from the Berliner Bezirke is also provided on the LAU 2 level.

Analog zur Kreisebene werden die Berliner Bezirke zusätzlich zu der Stadt Berlin auf der Gemeindeebene nachgewiesen.

On level 4, the pattern is reversed, i.e. we get the data for the Bezirke when we do not specify the GES dimension, and we don’t if we do.

r("https://tabular.genesapi.org/?data=12411:BEVSTD&time=2017&level=4&parent=11")
#>    region_id year measure   value statistic
#> 1   11000000 2017  BEVSTD 3613495     12411
#> 2   11001001 2017  BEVSTD       0     12411
#> 3   11002002 2017  BEVSTD       0     12411
#> 4   11003003 2017  BEVSTD       0     12411
#> 5   11004004 2017  BEVSTD       0     12411
#> 6   11005005 2017  BEVSTD       0     12411
#> 7   11006006 2017  BEVSTD       0     12411
#> 8   11007007 2017  BEVSTD       0     12411
#> 9   11008008 2017  BEVSTD       0     12411
#> 10  11009009 2017  BEVSTD       0     12411
#> 11  11010010 2017  BEVSTD       0     12411
#> 12  11011011 2017  BEVSTD       0     12411
#> 13  11012012 2017  BEVSTD       0     12411
r("https://tabular.genesapi.org/?data=12411:BEVSTD(GES)&time=2017&level=4&parent=11")
#>   region_id year measure   value X12411.BEVSTD.GES. statistic
#> 1  11000000 2017  BEVSTD 1776267               GESM     12411
#> 2  11000000 2017  BEVSTD 1837228               GESW     12411

Everything is reversed yet again if we retrieve 12613:BEV002 data.

level 3

r("https://tabular.genesapi.org/?data=12613:BEV002&time=2017&level=3&parent=11")
#>    region_id year measure value statistic
#> 1      11000 2017  BEV002 34339     12613
#> 2   11001001 2017  BEV002     0     12613
#> 3   11002002 2017  BEV002     0     12613
#> 4   11003003 2017  BEV002     0     12613
#> 5   11004004 2017  BEV002     0     12613
#> 6   11005005 2017  BEV002     0     12613
#> 7   11006006 2017  BEV002     0     12613
#> 8   11007007 2017  BEV002     0     12613
#> 9   11008008 2017  BEV002     0     12613
#> 10  11009009 2017  BEV002     0     12613
#> 11  11010010 2017  BEV002     0     12613
#> 12  11011011 2017  BEV002     0     12613
#> 13  11012012 2017  BEV002     0     12613
r("https://tabular.genesapi.org/?data=12613:BEV002(GES)&time=2017&level=3&parent=11")
#>   region_id year measure value X12613.BEV002.GES. statistic
#> 1     11000 2017  BEV002 16892               GESM     12613
#> 2     11000 2017  BEV002 17447               GESW     12613

level 4

r("https://tabular.genesapi.org/?data=12613:BEV002&time=2017&level=4&parent=11")
#>   region_id year measure value statistic
#> 1  11000000 2017  BEV002 34339     12613
r("https://tabular.genesapi.org/?data=12613:BEV002(GES)&time=2017&level=4&parent=11")
#>    region_id year measure value X12613.BEV002.GES. statistic
#> 1   11000000 2017  BEV002 16892               GESM     12613
#> 2   11000000 2017  BEV002 17447               GESW     12613
#> 3   11001001 2017  BEV002     0               GESM     12613
#> 4   11001001 2017  BEV002     0               GESW     12613
#> 5   11002002 2017  BEV002     0               GESM     12613
#> 6   11002002 2017  BEV002     0               GESW     12613
#> 7   11003003 2017  BEV002     0               GESM     12613
#> 8   11003003 2017  BEV002     0               GESW     12613
#> 9   11004004 2017  BEV002     0               GESM     12613
#> 10  11004004 2017  BEV002     0               GESW     12613
#> 11  11005005 2017  BEV002     0               GESM     12613
#> 12  11005005 2017  BEV002     0               GESW     12613
#> 13  11006006 2017  BEV002     0               GESM     12613
#> 14  11006006 2017  BEV002     0               GESW     12613
#> 15  11007007 2017  BEV002     0               GESM     12613
#> 16  11007007 2017  BEV002     0               GESW     12613
#> 17  11008008 2017  BEV002     0               GESM     12613
#> 18  11008008 2017  BEV002     0               GESW     12613
#> 19  11009009 2017  BEV002     0               GESM     12613
#> 20  11009009 2017  BEV002     0               GESW     12613
#> 21  11010010 2017  BEV002     0               GESM     12613
#> 22  11010010 2017  BEV002     0               GESW     12613
#> 23  11011011 2017  BEV002     0               GESM     12613
#> 24  11011011 2017  BEV002     0               GESW     12613
#> 25  11012012 2017  BEV002     0               GESM     12613
#> 26  11012012 2017  BEV002     0               GESW     12613
simonwoerpel commented 5 years ago

hey @dpprdan thanks for your issue reports. we are currently working some changes / fixes that might solve some of these, and we will come back to you afterwards to discuss this in more detail when we have released the latest changes