Qualche anno fa analizzai i dati del progetto CORINE Land Cover relativi alla Campania, focalizzandomi sui tre censimenti tra il 2000 ed il 2012. Oggi invece estenderò quell'analisi inserendo sia i dati del 1990 che gli ultimi disponibili attualmente, cioè quelli del 2018.

L'analisi questa volta la farò usando Python e la estenderò al resto dell'Italia verso la fine.

Prima di iniziare

Librerie

Per raggiungere l'obiettivo userò le librerie che seguono:

import pathlib
import geopandas as gpd
import pandas as pd
from functools import reduce
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec

import warnings
warnings.filterwarnings('ignore')
warnings.simplefilter('ignore')

Fonti dati

Ho rielaborato i dati CORINE Land Cover dal 1990 al 2018 inserendoli in un unico GeoPackage che è possibile scaricare da qui. I dati sono stati processati preventivamente usando PostGIS in modo da associare ai poligoni della CLC anche quelli dei Comuni italiani al 2022 dell'ISTAT. E' stato indispensabile questo passaggio preventivo perchè ho dovuto correggere gli errori topologici sui dati ISTAT e, al momento, trovo molto più comodo correggere gli errori topologici tramite SQL piuttosto che con Python.

main_folder = pathlib.Path('/home/max/Desktop/clc')
dataset = main_folder.joinpath('clcitalia.gpkg')

1. Lettura e normalizzazione dei dati

In questa fase ho proceduto ad estrarre un po' di dati statistici che userò nei passaggi successivi. Sono perlopiu analisi mirate al calcolo delle superfici che ho espresso in ettari. Fatte queste analisi mi sono liberato dei dati geometrici perchè, non dovendoli più usare, mi alleggeriscono le analisi successive in termini di prestazioni hardware.

# CLC 1990
clc1990 = gpd.read_file(dataset, layer='clc1990')
clc1990.insert(loc=10, column='sup_com_ha', value=clc1990.sup_com_mq / 10000)
clc1990.insert(loc=11, column='surface_ha_1990', value=round(clc1990.geometry.area / 10000, 4))
clc1990.drop(columns={'sup_com_mq', 'geometry'}, inplace=True)

# CLC 2000
clc2000 = gpd.read_file(dataset, layer='clc2000')
clc2000.insert(loc=10, column='sup_com_ha', value=clc2000.sup_com_mq / 10000)
clc2000.insert(loc=11, column='surface_ha_2000', value=round(clc2000.geometry.area / 10000, 4))
clc2000.drop(columns={'sup_com_mq', 'geometry'}, inplace=True)

# CLC 2006
clc2006 = gpd.read_file(dataset, layer='clc2006')
clc2006.insert(loc=10, column='sup_com_ha', value=clc2006.sup_com_mq / 10000)
clc2006.insert(loc=11, column='surface_ha_2006', value=round(clc2006.geometry.area / 10000, 4))
clc2006.drop(columns={'sup_com_mq', 'geometry'}, inplace=True)

# CLC 2012
clc2012 = gpd.read_file(dataset, layer='clc2012')
clc2012.insert(loc=10, column='sup_com_ha', value=clc2012.sup_com_mq / 10000)
clc2012.insert(loc=11, column='surface_ha_2012', value=round(clc2012.geometry.area / 10000, 4))
clc2012.drop(columns={'sup_com_mq', 'geometry'}, inplace=True)

# CLC 2018
clc2018 = gpd.read_file(dataset, layer='clc2018')
clc2018.insert(loc=10, column='sup_com_ha', value=clc2018.sup_com_mq / 10000)
clc2018.insert(loc=11, column='surface_ha_2018', value=round(clc2018.geometry.area / 10000, 4))
clc2018.drop(columns={'sup_com_mq', 'geometry'}, inplace=True)

Test di visualizzazione

clc1990
code_90 label1 label2 label3 pro_com comune provincia regione sup_com_ha surface_ha_1990
0 211 Agricultural areas Arable land Non-irrigated arable land 101005.0 Castelsilano Crotone Calabria 4006.296249 1.1386
1 211 Agricultural areas Arable land Non-irrigated arable land 101005.0 Castelsilano Crotone Calabria 4006.296249 276.7171
2 223 Agricultural areas Permanent crops Olive groves 101005.0 Castelsilano Crotone Calabria 4006.296249 35.4001
3 223 Agricultural areas Permanent crops Olive groves 101005.0 Castelsilano Crotone Calabria 4006.296249 2.2285
4 241 Agricultural areas Heterogeneous agricultural areas Annual crops associated with permanent crops 101005.0 Castelsilano Crotone Calabria 4006.296249 1.3860
... ... ... ... ... ... ... ... ... ... ...
190238 321 Forest and semi natural areas Scrub and/or herbaceous vegetation associations Natural grasslands 81006.0 Castelvetrano Trapani Sicilia 20975.692026 34.8218
190239 323 Forest and semi natural areas Scrub and/or herbaceous vegetation associations Sclerophyllous vegetation 81006.0 Castelvetrano Trapani Sicilia 20975.692026 98.1617
190240 323 Forest and semi natural areas Scrub and/or herbaceous vegetation associations Sclerophyllous vegetation 81006.0 Castelvetrano Trapani Sicilia 20975.692026 264.2617
190241 323 Forest and semi natural areas Scrub and/or herbaceous vegetation associations Sclerophyllous vegetation 81006.0 Castelvetrano Trapani Sicilia 20975.692026 28.9076
190242 512 Water bodies Inland waters Water bodies 81006.0 Castelvetrano Trapani Sicilia 20975.692026 152.0754

190243 rows × 10 columns

Le colonne label* fanno riferimento alla nomenclatura delle tre classi della mappa CORINE Land Cover per ogni singolo anno. Per interpretare la nomenclatura vai qui. Come puoi vedere sono presenti le colonne relative al Comune, Provincia e Regione di apparteneza, l'estensione dell'area comunale(sup_com_ha) e quelle relative alle superfici della CLC che mi sono calcolato in precedenza.

2. Focus sulla Campania

Per appartenza territoriale partirò proprio dalla Campania, lo faccio anche per riprendere parte della analisi del mio vecchio articolo.

clc1990_campania = clc1990[clc1990['regione'] == 'Campania']
clc2000_campania = clc2000[clc2000['regione'] == 'Campania']
clc2006_campania = clc2006[clc2006['regione'] == 'Campania']
clc2012_campania = clc2012[clc2012['regione'] == 'Campania']
clc2018_campania = clc2018[clc2018['regione'] == 'Campania']

Test di visualizzazione

clc2000_campania
code_00 label1 label2 label3 pro_com comune provincia regione sup_com_ha surface_ha_2000
14 111 Artificial surfaces Urban fabric Continuous urban fabric 65134.0 Sapri Salerno Campania 1420.007490 82.5207
15 112 Artificial surfaces Urban fabric Discontinuous urban fabric 65134.0 Sapri Salerno Campania 1420.007490 36.5516
16 241 Agricultural areas Heterogeneous agricultural areas Annual crops associated with permanent crops 65134.0 Sapri Salerno Campania 1420.007490 17.7890
17 242 Agricultural areas Heterogeneous agricultural areas Complex cultivation patterns 65134.0 Sapri Salerno Campania 1420.007490 0.6866
18 242 Agricultural areas Heterogeneous agricultural areas Complex cultivation patterns 65134.0 Sapri Salerno Campania 1420.007490 56.9832
... ... ... ... ... ... ... ... ... ... ...
177542 323 Forest and semi natural areas Scrub and/or herbaceous vegetation associations Sclerophyllous vegetation 61072.0 Rocchetta e Croce Caserta Campania 1300.547184 206.0290
177543 324 Forest and semi natural areas Scrub and/or herbaceous vegetation associations Transitional woodland-shrub 61072.0 Rocchetta e Croce Caserta Campania 1300.547184 2.3093
177544 221 Agricultural areas Permanent crops Vineyards 61072.0 Rocchetta e Croce Caserta Campania 1300.547184 4.0201
177545 321 Forest and semi natural areas Scrub and/or herbaceous vegetation associations Natural grasslands 61072.0 Rocchetta e Croce Caserta Campania 1300.547184 1.8517
177546 222 Agricultural areas Permanent crops Fruit trees and berry plantations 61072.0 Rocchetta e Croce Caserta Campania 1300.547184 1.9998

11361 rows × 10 columns

2.1.1 Stato al 1990

Come primo step mi sono concentrato sui dati del 1990; ho pulito un po' la tabella per rendere meglio comprensibile la sua lettura ed ho estratto valori per tutte e tre le classi. Quello che ho fatto per il 1990 l'ho ripetuto per i restanti anni.

Livello 1

campania_clc1990_label1 = pd.DataFrame(clc1990_campania.groupby('label1')['surface_ha_1990'].sum())
campania_clc1990_label1.reset_index(inplace=True)
campania_clc1990_label1.rename(columns={'label1': 'CORINE Land Cover - level 1'}, inplace=True)
campania_clc1990_label1
CORINE Land Cover - level 1 surface_ha_1990
0 Agricultural areas 761041.0303
1 Artificial surfaces 80649.9550
2 Forest and semi natural areas 522870.7142
3 Water bodies 1593.6569
4 Wetlands 608.8997

Livello 2

campania_clc1990_label2 = pd.DataFrame(clc1990_campania.groupby('label2')['surface_ha_1990'].sum())
campania_clc1990_label2.reset_index(inplace=True)
campania_clc1990_label2.rename(columns={'label2': 'CORINE Land Cover - level 2'}, inplace=True)
campania_clc1990_label2
CORINE Land Cover - level 2 surface_ha_1990
0 Arable land 330066.4318
1 Artificial, non-agricultural vegetated areas 1046.0670
2 Forests 383826.2982
3 Heterogeneous agricultural areas 297503.9919
4 Industrial, commercial and transport units 8083.1341
5 Inland waters 1567.8002
6 Inland wetlands 608.8997
7 Marine waters 25.8567
8 Mine, dump and construction sites 1631.6247
9 Open spaces with little or no vegetation 8966.3806
10 Pastures 15620.1214
11 Permanent crops 117850.4852
12 Scrub and/or herbaceous vegetation associations 130078.0354
13 Urban fabric 69889.1292

Livello 3

campania_clc1990_label3 = pd.DataFrame(clc1990_campania.groupby('label3')['surface_ha_1990'].sum())
campania_clc1990_label3.reset_index(inplace=True)
campania_clc1990_label3.rename(columns={'label3': 'CORINE Land Cover - level 3'}, inplace=True)
campania_clc1990_label3
CORINE Land Cover - level 3 surface_ha_1990
0 Agro-forestry areas 420.5049
1 Airports 383.8998
2 Annual crops associated with permanent crops 42881.8119
3 Bare rocks 1122.7257
4 Beaches, dunes, sands 2282.0112
5 Broad-leaved forest 367521.2801
6 Coastal lagoons 25.8567
7 Complex cultivation patterns 165047.1097
8 Coniferous forest 7457.8770
9 Construction sites 25.4060
10 Continuous urban fabric 32608.0637
11 Discontinuous urban fabric 37281.0655
12 Dump sites 207.8811
13 Fruit trees and berry plantations 56044.2433
14 Green urban areas 731.9919
15 Industrial or commercial units 6590.0765
16 Inland marshes 608.8997
17 Land principally occupied by agriculture, with... 89154.5654
18 Mineral extraction sites 1398.3376
19 Mixed forest 8847.1411
20 Moors and heathland 16.7825
21 Natural grasslands 57150.7848
22 Non-irrigated arable land 304750.4005
23 Olive groves 58951.7577
24 Pastures 15620.1214
25 Permanently irrigated land 25316.0313
26 Port areas 458.6026
27 Road and rail networks and associated land 650.5552
28 Sclerophyllous vegetation 19255.7695
29 Sparsely vegetated areas 5561.6437
30 Sport and leisure facilities 314.0751
31 Transitional woodland-shrub 53654.6986
32 Vineyards 2854.4842
33 Water bodies 1095.5920
34 Water courses 472.2082

2.1.2 Stato al 2000

campania_clc2000_label1 = pd.DataFrame(clc2000_campania.groupby('label1')['surface_ha_2000'].sum())
campania_clc2000_label1.reset_index(inplace=True)
campania_clc2000_label1.rename(columns={'label1': 'CORINE Land Cover - level 1'}, inplace=True)

campania_clc2000_label2 = pd.DataFrame(clc2000_campania.groupby('label2')['surface_ha_2000'].sum())
campania_clc2000_label2.reset_index(inplace=True)
campania_clc2000_label2.rename(columns={'label2': 'CORINE Land Cover - level 2'}, inplace=True)

campania_clc2000_label3 = pd.DataFrame(clc2000_campania.groupby('label3')['surface_ha_2000'].sum())
campania_clc2000_label3.reset_index(inplace=True)
campania_clc2000_label3.rename(columns={'label3': 'CORINE Land Cover - level 3'}, inplace=True)

2.1.3 Stato al 2006

campania_clc2006_label1 = pd.DataFrame(clc2006_campania.groupby('label1')['surface_ha_2006'].sum())
campania_clc2006_label1.reset_index(inplace=True)
campania_clc2006_label1.rename(columns={'label1': 'CORINE Land Cover - level 1'}, inplace=True)

campania_clc2006_label2 = pd.DataFrame(clc2006_campania.groupby('label2')['surface_ha_2006'].sum())
campania_clc2006_label2.reset_index(inplace=True)
campania_clc2006_label2.rename(columns={'label2': 'CORINE Land Cover - level 2'}, inplace=True)

campania_clc2006_label3 = pd.DataFrame(clc2006_campania.groupby('label3')['surface_ha_2006'].sum())
campania_clc2006_label3.reset_index(inplace=True)
campania_clc2006_label3.rename(columns={'label3': 'CORINE Land Cover - level 3'}, inplace=True)

2.1.4 Stato al 2012

campania_clc2012_label1 = pd.DataFrame(clc2012_campania.groupby('label1')['surface_ha_2012'].sum())
campania_clc2012_label1.reset_index(inplace=True)
campania_clc2012_label1.rename(columns={'label1': 'CORINE Land Cover - level 1'}, inplace=True)

campania_clc2012_label2 = pd.DataFrame(clc2012_campania.groupby('label2')['surface_ha_2012'].sum())
campania_clc2012_label2.reset_index(inplace=True)
campania_clc2012_label2.rename(columns={'label2': 'CORINE Land Cover - level 2'}, inplace=True)

campania_clc2012_label3 = pd.DataFrame(clc2012_campania.groupby('label3')['surface_ha_2012'].sum())
campania_clc2012_label3.reset_index(inplace=True)
campania_clc2012_label3.rename(columns={'label3': 'CORINE Land Cover - level 3'}, inplace=True)

2.1.5 Stato al 2018

campania_clc2018_label1 = pd.DataFrame(clc2018_campania.groupby('label1')['surface_ha_2018'].sum())
campania_clc2018_label1.reset_index(inplace=True)
campania_clc2018_label1.rename(columns={'label1': 'CORINE Land Cover - level 1'}, inplace=True)

campania_clc2018_label2 = pd.DataFrame(clc2018_campania.groupby('label2')['surface_ha_2018'].sum())
campania_clc2018_label2.reset_index(inplace=True)
campania_clc2018_label2.rename(columns={'label2': 'CORINE Land Cover - level 2'}, inplace=True)

campania_clc2018_label3 = pd.DataFrame(clc2018_campania.groupby('label3')['surface_ha_2018'].sum())
campania_clc2018_label3.reset_index(inplace=True)
campania_clc2018_label3.rename(columns={'label3': 'CORINE Land Cover - level 3'}, inplace=True)

2.2 Grafici

E' il momento di approfondire questi dati! Ho estratto grafici per tutte e tre le classi ed ho cercato di dare una interpretazione del perchè di alcuni fenomeni.

2.2.1 Grafici per il livello 1

lvl1 = [campania_clc1990_label1, campania_clc2000_label1, campania_clc2006_label1, campania_clc2012_label1, campania_clc2018_label1]
lvl1_df = reduce(lambda  left,right: pd.merge(left,right,on=['CORINE Land Cover - level 1'], how='outer'), lvl1)
lvl1_df.fillna(0, inplace=True)
lvl1_df.insert(loc=6, column='Surf.Diff. | 2018-1990', value=(lvl1_df.surface_ha_2018 - lvl1_df.surface_ha_1990))
lvl1_df.set_index('CORINE Land Cover - level 1', inplace=True)
lvl1_df.rename(columns={'surface_ha_1990': '1990', 'surface_ha_2000': '2000', 'surface_ha_2006': '2006', 'surface_ha_2012': '2012', 'surface_ha_2018': '2018'}, inplace=True)
lvl1_df.sort_index(ascending=True, inplace=True)
lvl1_df
1990 2000 2006 2012 2018 Surf.Diff. | 2018-1990
CORINE Land Cover - level 1
Agricultural areas 761041.0303 753145.2349 755438.9748 752611.5454 752077.3861 -8963.6442
Artificial surfaces 80649.9550 89935.2388 97747.4059 101771.7643 102304.6984 21654.7434
Forest and semi natural areas 522870.7142 521005.1536 510731.5181 509096.9289 508050.0206 -14820.6936
Water bodies 1593.6569 2195.8983 2463.1760 2948.2571 2948.2571 1354.6002
Wetlands 608.8997 482.9084 386.6832 339.2620 339.2620 -269.6377
fig1 = plt.figure(figsize=(20, 10), dpi=100)
sub_fig = GridSpec(nrows=1, ncols=1, figure=fig1, hspace=0.35)
ax = fig1.add_subplot(sub_fig[0, 0])
lvl1_df.plot.bar(ax=ax, rot=0)

ax.yaxis.set_label_text('ha')
ax.set_xlabel('')
ax.grid(color='lightgrey', linestyle='dashdot')

plt.legend(loc='best')
<matplotlib.legend.Legend at 0x7fe2cfea3760>

E' visibile abbastanza chiaramente un netto aumento delle superfici artificiali con un conseguente arretramento di quelle forestate e di quelle agricole. Le aree forestate tra il 1990 ed il 2018 hanno subito un arretramento quasi doppio rispetto a quelle agricole e le superfici artificiali sono quelle che hanno maggiormente "beneficiato" di questo arretramento complessivo delle due classi di CLC. Si potrebbe dire che l'urbanizzato ha eroso foreste ed aree agricole in quasi 30 anni.

2.2.2 Grafici per il livello 2

lvl2 = [campania_clc1990_label2, campania_clc2000_label2, campania_clc2006_label2, campania_clc2012_label2, campania_clc2018_label2]
lvl2_df = reduce(lambda  left,right: pd.merge(left,right,on=['CORINE Land Cover - level 2'], how='outer'), lvl2)
lvl2_df.fillna(0, inplace=True)
lvl2_df.insert(loc=6, column='Surf.Diff. | 2000-1990', value=(lvl2_df.surface_ha_2000 - lvl2_df.surface_ha_1990))
lvl2_df.insert(loc=7, column='Surf.Diff. | 2006-2000', value=(lvl2_df.surface_ha_2006 - lvl2_df.surface_ha_2000))
lvl2_df.insert(loc=8, column='Surf.Diff. | 2012-2006', value=(lvl2_df.surface_ha_2012 - lvl2_df.surface_ha_2006))
lvl2_df.insert(loc=9, column='Surf.Diff. | 2018-2012', value=(lvl2_df.surface_ha_2018 - lvl2_df.surface_ha_2012))
lvl2_df.insert(loc=9, column='Surf.Diff. | 2018-1990', value=(lvl2_df.surface_ha_2018 - lvl2_df.surface_ha_1990))
lvl2_df.set_index('CORINE Land Cover - level 2', inplace=True)
lvl2_df = lvl2_df[['Surf.Diff. | 2000-1990', 'Surf.Diff. | 2006-2000', 'Surf.Diff. | 2012-2006', 'Surf.Diff. | 2018-2012', 'Surf.Diff. | 2018-1990']]
lvl2_df.sort_index(ascending=True, inplace=True)
lvl2_df
Surf.Diff. | 2000-1990 Surf.Diff. | 2006-2000 Surf.Diff. | 2012-2006 Surf.Diff. | 2018-2012 Surf.Diff. | 2018-1990
CORINE Land Cover - level 2
Arable land -6226.9986 -15007.4805 1362.7374 26.9417 -19844.8000
Artificial, non-agricultural vegetated areas 330.5367 -4.4113 58.5588 396.9458 781.6300
Forests 2963.0601 -4293.0050 1859.3801 -1391.9151 -862.4799
Heterogeneous agricultural areas -947.6309 4546.7408 9331.1283 -448.2578 12481.9804
Industrial, commercial and transport units 1550.4505 3173.2827 2094.7855 154.4961 6973.0148
Inland waters 602.2416 267.2776 398.3284 0.0000 1267.8476
Inland wetlands -125.9913 -96.2252 -73.2778 0.0000 -295.4943
Marine waters -0.0002 0.0001 86.7527 0.0000 86.7526
Maritime wetlands 0.0000 0.0000 25.8566 0.0000 25.8566
Mine, dump and construction sites -31.1788 474.9460 112.8079 -23.5198 533.0553
Open spaces with little or no vegetation 1019.9233 -287.3449 20220.0532 3005.5295 23958.1611
Pastures -1351.7336 -788.2046 -997.1098 -110.4579 -3247.5059
Permanent crops 630.5677 13542.6842 -12524.1853 -2.3853 1646.6813
Scrub and/or herbaceous vegetation associations -5848.5440 -5693.2856 -23714.0225 -2660.5227 -37916.3748
Urban fabric 7435.4754 4168.3497 1758.2062 5.0120 13367.0433
fig2 = plt.figure(figsize=(20, 10), dpi=100)
sub_fig = GridSpec(nrows=1, ncols=1, figure=fig2, hspace=0.35)
ax = fig2.add_subplot(sub_fig[0, 0])
lvl2_df.plot.bar(ax=ax, rot=0)

ax.yaxis.set_label_text('ha')
ax.set_xlabel('')
ax.grid(color='lightgrey', linestyle='dashdot')

plt.xticks(rotation = 90)
plt.legend(loc='best')
<matplotlib.legend.Legend at 0x7fe2eb2bc4f0>

Scendendo di un livello, quindi andando ad approfondire di più il dato passando al secondo livello CLC, possiamo verificare i trend negativi a quali specifiche superfici fanno riferimento.

Le aree arbustive e con alberi radi hanno avuto la peggio, a seguire i terreni arabili, pascoli e foreste. Netto è invece l'aumento delle aree aperte, classe in cui nel terzo livello CLC ci sono le aree percorse dal fuoco(da tenere in mente per richiami successivi!). Seguono, nell'incremento, le aree urbanizzate, le aree per colture eterogenee e quelle per lo sviluppo di siti industriali e commerciali.

2.2.3 Grafici per il livello 3

lvl3 = [campania_clc1990_label3, campania_clc2000_label3, campania_clc2006_label3, campania_clc2012_label3, campania_clc2018_label3]
lvl3_df = reduce(lambda  left,right: pd.merge(left,right,on=['CORINE Land Cover - level 3'], how='outer'), lvl3)
lvl3_df.fillna(0, inplace=True)
lvl3_df.insert(loc=6, column='Surf.Diff. | 2000-1990', value=(lvl3_df.surface_ha_2000 - lvl3_df.surface_ha_1990))
lvl3_df.insert(loc=7, column='Surf.Diff. | 2006-2000', value=(lvl3_df.surface_ha_2006 - lvl3_df.surface_ha_2000))
lvl3_df.insert(loc=8, column='Surf.Diff. | 2012-2006', value=(lvl3_df.surface_ha_2012 - lvl3_df.surface_ha_2006))
lvl3_df.insert(loc=9, column='Surf.Diff. | 2018-2012', value=(lvl3_df.surface_ha_2018 - lvl3_df.surface_ha_2012))
lvl3_df.insert(loc=10, column='Surf.Diff. | 2018-1990', value=(lvl3_df.surface_ha_2018 - lvl3_df.surface_ha_1990))
lvl3_df.set_index('CORINE Land Cover - level 3', inplace=True)

lvl3_df.sort_index(ascending=True, inplace=True)
lvl3_df
surface_ha_1990 surface_ha_2000 surface_ha_2006 surface_ha_2012 surface_ha_2018 Surf.Diff. | 2000-1990 Surf.Diff. | 2006-2000 Surf.Diff. | 2012-2006 Surf.Diff. | 2018-2012 Surf.Diff. | 2018-1990
CORINE Land Cover - level 3
Agro-forestry areas 420.5049 420.5224 140.9079 79.0823 79.0823 0.0175 -279.6145 -61.8256 0.000000e+00 -341.4226
Airports 383.8998 556.4307 556.4308 556.4308 556.4308 172.5309 0.0001 0.0000 0.000000e+00 172.5310
Annual crops associated with permanent crops 42881.8119 44016.3987 23501.2894 24459.1737 24062.2280 1134.5868 -20515.1093 957.8843 -3.969457e+02 -18819.5839
Bare rocks 1122.7257 1006.1738 979.8852 1274.5252 1274.5252 -116.5519 -26.2886 294.6400 0.000000e+00 151.7995
Beaches, dunes, sands 2282.0112 1852.6891 1835.3037 1904.4059 1904.4059 -429.3221 -17.3854 69.1022 0.000000e+00 -377.6053
Broad-leaved forest 367521.2801 369187.8047 365453.4552 367034.3194 366436.4566 1666.5246 -3734.3495 1580.8642 -5.978628e+02 -1084.8235
Burnt areas 0.0000 354.7607 438.4148 770.8451 3802.9844 354.7607 83.6541 332.4303 3.032139e+03 3802.9844
Coastal lagoons 25.8567 25.8565 25.8566 112.6093 112.6093 -0.0002 0.0001 86.7527 0.000000e+00 86.7526
Complex cultivation patterns 165047.1097 162777.2069 181971.5611 185634.2569 185582.9448 -2269.9028 19194.3542 3662.6958 -5.131210e+01 20535.8351
Coniferous forest 7457.8770 8154.5708 7620.7143 8876.9029 8373.6888 696.6938 -533.8565 1256.1886 -5.032141e+02 915.8118
Construction sites 25.4060 70.0172 246.1018 58.2792 58.2792 44.6112 176.0846 -187.8226 0.000000e+00 32.8732
Continuous urban fabric 32608.0637 33436.5752 29309.2673 33833.4142 33833.4142 828.5115 -4127.3079 4524.1469 0.000000e+00 1225.3505
Discontinuous urban fabric 37281.0655 43888.0294 52183.6870 49417.7463 49422.7583 6606.9639 8295.6576 -2765.9407 5.012000e+00 12141.6928
Dump sites 207.8811 27.2633 174.0802 438.6634 406.9530 -180.6178 146.8169 264.5832 -3.171040e+01 199.0719
Fruit trees and berry plantations 56044.2433 54999.5524 61954.0631 56585.3863 56585.3142 -1044.6909 6954.5107 -5368.6768 -7.210000e-02 541.0709
Green urban areas 731.9919 758.4238 805.2857 780.1128 1177.0586 26.4319 46.8619 -25.1729 3.969458e+02 445.0667
Industrial or commercial units 6590.0765 8168.7442 11005.1236 12643.3548 12797.8509 1578.6677 2836.3794 1638.2312 1.544961e+02 6207.7744
Inland marshes 608.8997 482.9084 386.6832 313.4054 313.4054 -125.9913 -96.2252 -73.2778 0.000000e+00 -295.4943
Land principally occupied by agriculture, with significant areas of natural vegetation 89154.5654 89342.2330 95489.3434 100261.7172 100261.7172 187.6676 6147.1104 4772.3738 0.000000e+00 11107.1518
Mineral extraction sites 1398.3376 1503.1654 1655.2099 1691.2572 1699.4478 104.8278 152.0445 36.0473 8.190600e+00 301.1102
Mixed forest 8847.1411 9446.9828 9422.1838 8444.5111 8153.6729 599.8417 -24.7990 -977.6727 -2.908382e+02 -693.4682
Moors and heathland 16.7825 0.0000 0.0000 0.0000 0.0000 -16.7825 0.0000 0.0000 0.000000e+00 -16.7825
Natural grasslands 57150.7848 53354.5398 48427.4297 30587.1997 29539.0655 -3796.2450 -4927.1101 -17840.2300 -1.048134e+03 -27611.7193
Non-irrigated arable land 304750.4005 298328.2037 283148.7731 284508.0453 284503.2765 -6422.1968 -15179.4306 1359.2722 -4.768800e+00 -20247.1240
Olive groves 58951.7577 60805.0013 66147.7874 61604.3214 61632.6846 1853.2436 5342.7861 -4543.4660 2.836320e+01 2680.9269
Pastures 15620.1214 14268.3878 13480.1832 12483.0734 12372.6155 -1351.7336 -788.2046 -997.1098 -1.104579e+02 -3247.5059
Permanently irrigated land 25316.0313 25511.2295 25683.1796 25686.6448 25718.3553 195.1982 171.9501 3.4652 3.171050e+01 402.3240
Port areas 458.6026 469.9879 481.6963 459.2550 459.2550 11.3853 11.7084 -22.4413 0.000000e+00 0.6524
Road and rail networks and associated land 650.5552 438.4218 763.6166 1242.6122 1242.6122 -212.1334 325.1948 478.9956 0.000000e+00 592.0570
Salt marshes 0.0000 0.0000 0.0000 25.8566 25.8566 0.0000 0.0000 25.8566 0.000000e+00 25.8566
Sclerophyllous vegetation 19255.7695 18537.4944 17072.9128 15623.7660 15530.6877 -718.2751 -1464.5816 -1449.1468 -9.307830e+01 -3725.0818
Sparsely vegetated areas 5561.6437 6772.6803 6445.3553 25969.2360 25942.6262 1211.0366 -327.3250 19523.8807 -2.660980e+01 20380.9825
Sport and leisure facilities 314.0751 618.1799 566.9067 650.6384 650.6384 304.1048 -51.2732 83.7317 0.000000e+00 336.5633
Transitional woodland-shrub 53654.6986 52337.4572 53035.8633 48611.2176 47091.9074 -1317.2414 698.4061 -4424.6457 -1.519310e+03 -6562.7912
Vineyards 2854.4842 2676.4992 3921.8866 1309.8441 1279.1677 -177.9850 1245.3874 -2612.0425 -3.067640e+01 -1575.3165
Water bodies 1095.5920 1373.7744 1687.8687 1981.1362 1981.1362 278.1824 314.0943 293.2675 2.273737e-13 885.5442
Water courses 472.2082 796.2674 749.4507 854.5116 854.5116 324.0592 -46.8167 105.0609 0.000000e+00 382.3034
fig3 = plt.figure(figsize=(20, 10), dpi=100)
sub_fig = GridSpec(nrows=1, ncols=1, figure=fig3, hspace=0.35)
ax = fig3.add_subplot(sub_fig[0, 0])
lvl3_df['Surf.Diff. | 2018-1990'].plot.bar(ax=ax, rot=0)

ax.yaxis.set_label_text('ha')
ax.set_xlabel('')
ax.grid(color='lightgrey', linestyle='dashdot')

plt.xticks(rotation = 90)
plt.legend(loc='best')
<matplotlib.legend.Legend at 0x7fe2df35bd90>

Passando al livello tre della CLC, ho voluto graficare la sola differenza tra 1990 e 2018 per motivi di leggibilità del grafico. In termini di aumento di copertura del suolo c'è l'avanzamento, quasi identico, delle piccole aree destinate a colture annuali e delle aree con vegetazione frammentata. A seguire ci sono le aree urbane discontinue e quelle occupate da orti, vigneti e alberi da frutto.

Una riflessione che mi sento di fare è che l'avanzamento del tessuto urbano discontinuo ha frazionato il territorio agricolo, generando aree a piccole colture agricole.

Significativo anche l'aumento di estensione delle aree percorse dal fuoco.

I decrementi sono la cartina di tornasole degli incrementi che ho descritto poco fa e che potrebbero confermare la mia riflessione sul frazionamento del territorio naturale ed agricolo, portato avanti dall'avanzamento delle classi legati ai suoli artificiali.

2.3 Focus sui Comuni

L'analisi che segue tenta di rispondere alla domanda: "quali sono i Comuni campani in cui i fenomeni esposti poco fa hanno avuto un maggior impatto?"

Mi concentrerò sul terzo livello della CLC, in particolare sulle aree artificiali, aree agricole e foreste ma anche sulle discariche, le aree percorse dal fuoco ed il verde urbano.

Visto che dal 2000 in poi l'accuratezza geometrica del dato CLC è aumentata considerevolmente, le analisi di dettaglio che seguono si concentreranno sulla differenza tra 2000 e 2018.

# Dati 1990
focus_1990 = clc1990_campania[['pro_com', 'comune', 'provincia', 'sup_com_ha', 'label3', 'surface_ha_1990']]
focus_1990.set_index('label3', inplace=True)
focus_1990_group = pd.DataFrame(focus_1990.groupby(['pro_com', 'comune', 'sup_com_ha', 'label3'])['surface_ha_1990'].sum())
focus_1990_group.reset_index(inplace=True)

# Dati 2000
focus_2000 = clc2000_campania[['pro_com', 'comune', 'provincia', 'sup_com_ha', 'label3', 'surface_ha_2000']]
focus_2000.set_index('label3', inplace=True)
focus_2000_group = pd.DataFrame(focus_2000.groupby(['pro_com', 'comune', 'sup_com_ha', 'label3'])['surface_ha_2000'].sum())
focus_2000_group.reset_index(inplace=True)

# Dati 2006
focus_2006 = clc2006_campania[['pro_com', 'comune', 'provincia', 'sup_com_ha', 'label3', 'surface_ha_2006']]
focus_2006.set_index('label3', inplace=True)
focus_2006_group = pd.DataFrame(focus_2006.groupby(['pro_com', 'comune', 'sup_com_ha', 'label3'])['surface_ha_2006'].sum())
focus_2006_group.reset_index(inplace=True)

# Dati 2012
focus_2012 = clc2012_campania[['pro_com', 'comune', 'provincia', 'sup_com_ha', 'label3', 'surface_ha_2012']]
focus_2012.set_index('label3', inplace=True)
focus_2012_group = pd.DataFrame(focus_2012.groupby(['pro_com', 'comune', 'sup_com_ha', 'label3'])['surface_ha_2012'].sum())
focus_2012_group.reset_index(inplace=True)

# Dati 2018
focus_2018 = clc2018_campania[['pro_com', 'comune', 'provincia', 'sup_com_ha', 'label3', 'surface_ha_2018']]
focus_2018.set_index('label3', inplace=True)
focus_2018_group = pd.DataFrame(focus_2018.groupby(['pro_com', 'comune', 'sup_com_ha', 'label3'])['surface_ha_2018'].sum())
focus_2018_group.reset_index(inplace=True)
focus_1990_group
pro_com comune sup_com_ha label3 surface_ha_1990
0 61001.0 Ailano 1605.560469 Broad-leaved forest 472.5747
1 61001.0 Ailano 1605.560469 Complex cultivation patterns 93.2780
2 61001.0 Ailano 1605.560469 Continuous urban fabric 31.0972
3 61001.0 Ailano 1605.560469 Land principally occupied by agriculture, with... 188.9317
4 61001.0 Ailano 1605.560469 Non-irrigated arable land 752.7540
... ... ... ... ... ...
4543 65158.0 Bellizzi 802.200746 Continuous urban fabric 93.9079
4544 65158.0 Bellizzi 802.200746 Discontinuous urban fabric 40.9309
4545 65158.0 Bellizzi 802.200746 Fruit trees and berry plantations 24.3220
4546 65158.0 Bellizzi 802.200746 Non-irrigated arable land 426.7024
4547 65158.0 Bellizzi 802.200746 Vineyards 33.8787

4548 rows × 5 columns

2.3.1 Aree artificiali

I gruppi 1.1 ed 1.2 della CLC

# Dati 1990
artificial_surface_1990 = focus_1990_group[focus_1990_group['label3'].isin(['Continuous urban fabric', 'Discontinuous urban fabric', 'Industrial or commercial units', 'Road and rail networks and associated land', 'Port areas', 'Airports'])]
artificial_surface_1990_group = pd.DataFrame(artificial_surface_1990.groupby(['pro_com'])['surface_ha_1990'].sum())
artificial_surface_1990_group.reset_index(inplace=True)

# Dati 2000
artificial_surface_2000 = focus_2000_group[focus_2000_group['label3'].isin(['Continuous urban fabric', 'Discontinuous urban fabric', 'Industrial or commercial units', 'Road and rail networks and associated land', 'Port areas', 'Airports'])]
artificial_surface_2000_group = pd.DataFrame(artificial_surface_2000.groupby(['pro_com'])['surface_ha_2000'].sum())
artificial_surface_2000_group.reset_index(inplace=True)

# Dati 2006
artificial_surface_2006 = focus_2006_group[focus_2006_group['label3'].isin(['Continuous urban fabric', 'Discontinuous urban fabric', 'Industrial or commercial units', 'Road and rail networks and associated land', 'Port areas', 'Airports'])]
artificial_surface_2006_group = pd.DataFrame(artificial_surface_2006.groupby(['pro_com'])['surface_ha_2006'].sum())
artificial_surface_2006_group.reset_index(inplace=True)

# Dati 2012
artificial_surface_2012 = focus_2012_group[focus_2012_group['label3'].isin(['Continuous urban fabric', 'Discontinuous urban fabric', 'Industrial or commercial units', 'Road and rail networks and associated land', 'Port areas', 'Airports'])]
artificial_surface_2012_group = pd.DataFrame(artificial_surface_2012.groupby(['pro_com'])['surface_ha_2012'].sum())
artificial_surface_2012_group.reset_index(inplace=True)

# Dati 2018
artificial_surface_2018 = focus_2018_group[focus_2018_group['label3'].isin(['Continuous urban fabric', 'Discontinuous urban fabric', 'Industrial or commercial units', 'Road and rail networks and associated land', 'Port areas', 'Airports'])]
artificial_surface_2018_group = pd.DataFrame(artificial_surface_2018.groupby(['pro_com', 'comune', 'sup_com_ha'])['surface_ha_2018'].sum())
artificial_surface_2018_group.reset_index(inplace=True)

# Dati aggregati
focus_artificial = [artificial_surface_2018_group, artificial_surface_2012_group, artificial_surface_2006_group, artificial_surface_2000_group, artificial_surface_1990_group]
focus_artificial_df = reduce(lambda  left,right: pd.merge(left,right,on=['pro_com'], how='outer'), focus_artificial)
focus_artificial_df = focus_artificial_df[focus_artificial_df['sup_com_ha'] > 0]
focus_artificial_df.fillna(0, inplace=True)
focus_artificial_df.insert(loc=3, column='perc_1990', value=round(focus_artificial_df.surface_ha_1990 / focus_artificial_df.sup_com_ha, 4) * 100)
focus_artificial_df.insert(loc=4, column='perc_2000', value=round(focus_artificial_df.surface_ha_2000 / focus_artificial_df.sup_com_ha, 4) * 100)
focus_artificial_df.insert(loc=5, column='perc_2006', value=round(focus_artificial_df.surface_ha_2006 / focus_artificial_df.sup_com_ha, 4) * 100)
focus_artificial_df.insert(loc=6, column='perc_2012', value=round(focus_artificial_df.surface_ha_2012 / focus_artificial_df.sup_com_ha, 4) * 100)
focus_artificial_df.insert(loc=7, column='perc_2018', value=round(focus_artificial_df.surface_ha_2018 / focus_artificial_df.sup_com_ha, 4) * 100)
focus_artificial_df.insert(loc=8, column='Perc.Diff. | 2018-2000', value=(focus_artificial_df.perc_2018 - focus_artificial_df.perc_2000))
focus_artificial_df.sort_values(by=['Perc.Diff. | 2018-2000'], ascending=True, inplace=True)
focus_artificial_df
pro_com comune sup_com_ha perc_1990 perc_2000 perc_2006 perc_2012 perc_2018 Perc.Diff. | 2018-2000 surface_ha_2018 surface_ha_2012 surface_ha_2006 surface_ha_2000 surface_ha_1990
201 63036.0 Grumo Nevano 287.688759 47.45 64.93 64.93 51.31 51.31 -13.62 147.6065 147.6065 186.8019 186.8019 136.5066
232 63067.0 San Giorgio a Cremano 415.383936 60.96 76.57 68.51 68.51 68.51 -8.06 284.5767 284.5767 284.5768 318.0615 253.2174
197 63032.0 Frattamaggiore 538.816178 58.54 71.14 72.46 63.97 63.97 -7.17 344.6705 344.6705 390.4469 383.2980 315.4185
476 65121.0 San Mango Piemonte 602.370147 7.81 7.81 3.14 3.14 3.14 -4.67 18.8890 18.8890 18.8890 47.0198 47.0222
137 62046.0 Pago Veiano 2374.895020 1.83 5.24 2.13 2.13 2.13 -3.11 50.6037 50.6037 50.6037 124.5097 43.5550
... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
228 63063.0 Quarto 1415.896056 24.40 24.95 26.90 39.26 39.26 14.31 555.9065 555.9065 380.8373 353.2075 345.4612
254 63089.0 Volla 620.630205 45.68 49.86 49.94 64.34 64.34 14.48 399.3008 399.3008 309.9351 309.4482 283.5034
212 63047.0 Monte di Procida 370.428037 31.25 31.25 31.25 48.28 48.28 17.03 178.8412 178.8412 115.7459 115.7458 115.7439
190 63025.0 Castello di Cisterna 392.135970 21.89 46.04 68.31 68.31 68.31 22.27 267.8514 267.8514 267.8514 180.5292 85.8311
380 65011.0 Atrani 12.061182 0.00 0.00 52.01 52.01 52.01 52.01 6.2730 6.2730 6.2730 0.0000 0.0000

507 rows × 14 columns

reduction_artificial_area = focus_artificial_df.iloc[0:10]
reduction_artificial_area
pro_com comune sup_com_ha perc_1990 perc_2000 perc_2006 perc_2012 perc_2018 Perc.Diff. | 2018-2000 surface_ha_2018 surface_ha_2012 surface_ha_2006 surface_ha_2000 surface_ha_1990
201 63036.0 Grumo Nevano 287.688759 47.45 64.93 64.93 51.31 51.31 -13.62 147.6065 147.6065 186.8019 186.8019 136.5066
232 63067.0 San Giorgio a Cremano 415.383936 60.96 76.57 68.51 68.51 68.51 -8.06 284.5767 284.5767 284.5768 318.0615 253.2174
197 63032.0 Frattamaggiore 538.816178 58.54 71.14 72.46 63.97 63.97 -7.17 344.6705 344.6705 390.4469 383.2980 315.4185
476 65121.0 San Mango Piemonte 602.370147 7.81 7.81 3.14 3.14 3.14 -4.67 18.8890 18.8890 18.8890 47.0198 47.0222
137 62046.0 Pago Veiano 2374.895020 1.83 5.24 2.13 2.13 2.13 -3.11 50.6037 50.6037 50.6037 124.5097 43.5550
485 65132.0 San Valentino Torio 915.632363 15.51 15.56 13.27 13.27 13.27 -2.29 121.4587 121.4587 121.4588 142.4372 141.9949
4 61005.0 Aversa 885.176217 59.33 67.87 67.96 66.24 66.24 -1.63 586.3294 586.3294 601.5394 600.7846 525.1697
170 63005.0 Arzano 473.103075 83.22 86.97 87.40 85.42 85.42 -1.55 404.1348 404.1348 413.4904 411.4785 393.7116
474 65119.0 San Giovanni a Piro 3790.148485 2.12 4.21 2.72 2.72 2.72 -1.49 103.0783 103.0783 103.0783 159.6782 80.3555
57 61067.0 Recale 321.954739 32.81 32.81 31.54 31.54 31.54 -1.27 101.5467 101.5467 101.5467 105.6199 105.6193
increase_artificial_area = focus_artificial_df.iloc[-10:]
increase_artificial_area.sort_values(by=['Perc.Diff. | 2018-2000'], ascending=False, inplace=True)
increase_artificial_area
pro_com comune sup_com_ha perc_1990 perc_2000 perc_2006 perc_2012 perc_2018 Perc.Diff. | 2018-2000 surface_ha_2018 surface_ha_2012 surface_ha_2006 surface_ha_2000 surface_ha_1990
380 65011.0 Atrani 12.061182 0.00 0.00 52.01 52.01 52.01 52.01 6.2730 6.2730 6.2730 0.0000 0.0000
190 63025.0 Castello di Cisterna 392.135970 21.89 46.04 68.31 68.31 68.31 22.27 267.8514 267.8514 267.8514 180.5292 85.8311
212 63047.0 Monte di Procida 370.428037 31.25 31.25 31.25 48.28 48.28 17.03 178.8412 178.8412 115.7459 115.7458 115.7439
254 63089.0 Volla 620.630205 45.68 49.86 49.94 64.34 64.34 14.48 399.3008 399.3008 309.9351 309.4482 283.5034
228 63063.0 Quarto 1415.896056 24.40 24.95 26.90 39.26 39.26 14.31 555.9065 555.9065 380.8373 353.2075 345.4612
82 61094.0 Trentola Ducenta 665.513019 30.18 30.19 31.44 44.05 44.05 13.86 293.1760 293.1760 209.2403 200.8859 200.8848
15 61016.0 Carinaro 631.593670 28.55 34.93 44.25 47.41 47.41 12.48 299.4077 299.4077 279.4878 220.6269 180.3185
80 61092.0 Teverola 669.906081 31.59 37.22 50.70 48.78 48.78 11.56 326.7535 326.7535 339.6324 249.3457 211.6063
188 63023.0 Casoria 1213.840286 57.66 72.14 72.14 83.48 83.48 11.34 1013.2593 1013.2593 875.7210 875.7214 699.8511
123 62032.0 Forchia 545.454120 0.00 0.00 0.00 11.00 11.00 11.00 59.9761 59.9761 0.0000 0.0000 0.0000
artificial_df = pd.concat([reduction_artificial_area, increase_artificial_area])
artificial_df.sort_values(by=['Perc.Diff. | 2018-2000'], ascending=True, inplace=True)
artificial_df = artificial_df[['comune', 'Perc.Diff. | 2018-2000']]
artificial_df['Perc.Diff. | 2018-2000'] = artificial_df['Perc.Diff. | 2018-2000']
artificial_df.set_index('comune', inplace=True)

fig_artificial = plt.figure(figsize=(20, 10), dpi=100)
sub_fig_artificial = GridSpec(nrows=1, ncols=1, figure=fig_artificial, hspace=0.35)
ax_artificial = fig_artificial.add_subplot(sub_fig_artificial[0, 0])
artificial_df.plot.bar(ax=ax_artificial, rot=0)

ax_artificial.yaxis.set_label_text('%')
ax_artificial.set_xlabel('')
ax_artificial.grid(color='lightgrey', linestyle='dashdot')

plt.xticks(rotation = 90)
plt.legend(loc='best')
<matplotlib.legend.Legend at 0x7fe2d646e0d0>

Onestamente non so come interpretare l'arretramento delle aree artificiali, andrebbe fatta una ulteriore analisi per valutare se sono Comuni che si sono spopolati in quasi trenta anni.

L'aumento è abbastanza facile da indagare per me che sono del posto. Napoli ha una popolazione di quasi un milione di abitanti che triplica nei giorni feriali, per non parlare poi dei turisti. E' un'area molto congestionata con possibilità di nuova edilizia prossime allo zero; risulta normale quindi che Comuni più prossimi al Capoluogo di Regione stiano accogliendo "l'esubero" di popolazione. Faccio riferimento a Castello di Cisterna, Volla e Quarto.

Il caso di Atrani è particolare perchè è il Comune più piccolo d'Italia ed è posto in una zona abbastanza impervia della costiera amalfitana; è probabile che nel 2000 non si sia data molta importanza all'area.

2.3.2 Aree forestate

Il gruppo 3.1 della CLC

# Dati 1990
forest_surface_1990 = focus_1990_group[focus_1990_group['label3'].isin(['Broad-leaved forest', 'Coniferous forest', 'Mixed forest'])]
forest_surface_1990_group = pd.DataFrame(forest_surface_1990.groupby(['pro_com'])['surface_ha_1990'].sum())
forest_surface_1990_group.reset_index(inplace=True)

# Dati 2000
forest_surface_2000 = focus_2000_group[focus_2000_group['label3'].isin(['Broad-leaved forest', 'Coniferous forest', 'Mixed forest'])]
forest_surface_2000_group = pd.DataFrame(forest_surface_2000.groupby(['pro_com'])['surface_ha_2000'].sum())
forest_surface_2000_group.reset_index(inplace=True)

# Dati 2006
forest_surface_2006 = focus_2006_group[focus_2006_group['label3'].isin(['Broad-leaved forest', 'Coniferous forest', 'Mixed forest'])]
forest_surface_2006_group = pd.DataFrame(forest_surface_2006.groupby(['pro_com'])['surface_ha_2006'].sum())
forest_surface_2006_group.reset_index(inplace=True)

# Dati 2012
forest_surface_2012 = focus_2012_group[focus_2012_group['label3'].isin(['Broad-leaved forest', 'Coniferous forest', 'Mixed forest'])]
forest_surface_2012_group = pd.DataFrame(forest_surface_2012.groupby(['pro_com'])['surface_ha_2012'].sum())
forest_surface_2012_group.reset_index(inplace=True)

# Dati 2018
forest_surface_2018 = focus_2018_group[focus_2018_group['label3'].isin(['Broad-leaved forest', 'Coniferous forest', 'Mixed forest'])]
forest_surface_2018_group = pd.DataFrame(forest_surface_2018.groupby(['pro_com', 'comune', 'sup_com_ha'])['surface_ha_2018'].sum())
forest_surface_2018_group.reset_index(inplace=True)

# Dati aggregati
focus_forest = [forest_surface_2018_group, forest_surface_2012_group, forest_surface_2006_group, forest_surface_2000_group, forest_surface_1990_group]
focus_forest_df = reduce(lambda  left,right: pd.merge(left,right,on=['pro_com'], how='outer'), focus_forest)
focus_forest_df = focus_forest_df[focus_forest_df['sup_com_ha'] > 0]
focus_forest_df.fillna(0, inplace=True)
focus_forest_df.insert(loc=3, column='perc_1990', value=round(focus_forest_df.surface_ha_1990 / focus_forest_df.sup_com_ha, 4) * 100)
focus_forest_df.insert(loc=4, column='perc_2000', value=round(focus_forest_df.surface_ha_2000 / focus_forest_df.sup_com_ha, 4) * 100)
focus_forest_df.insert(loc=5, column='perc_2006', value=round(focus_forest_df.surface_ha_2006 / focus_forest_df.sup_com_ha, 4) * 100)
focus_forest_df.insert(loc=6, column='perc_2012', value=round(focus_forest_df.surface_ha_2012 / focus_forest_df.sup_com_ha, 4) * 100)
focus_forest_df.insert(loc=7, column='perc_2018', value=round(focus_forest_df.surface_ha_2018 / focus_forest_df.sup_com_ha, 4) * 100)
focus_forest_df.insert(loc=8, column='Perc.Diff. | 2018-2000', value=(focus_forest_df.perc_2018 - focus_forest_df.perc_2000))
focus_forest_df.sort_values(by=['Perc.Diff. | 2018-2000'], ascending=True, inplace=True)
focus_forest_df
pro_com comune sup_com_ha perc_1990 perc_2000 perc_2006 perc_2012 perc_2018 Perc.Diff. | 2018-2000 surface_ha_2018 surface_ha_2012 surface_ha_2006 surface_ha_2000 surface_ha_1990
139 62073.0 Solopaca 3112.664003 43.63 43.63 43.46 11.69 11.69 -31.94 363.9901 363.9901 1352.7210 1358.0359 1358.0275
143 62077.0 Vitulano 3599.050416 50.86 50.81 50.81 26.82 26.82 -23.99 965.1276 965.1276 1828.5273 1828.5272 1830.3353
410 65115.0 Salento 2378.507005 51.73 50.93 37.94 37.93 37.93 -13.00 902.2741 902.2741 902.4736 1211.3768 1230.4272
179 63082.0 Terzigno 2346.480829 20.68 20.68 20.68 20.68 8.01 -12.67 187.8420 485.2334 485.2333 485.2338 485.2356
147 63007.0 Barano d'Ischia 1096.089426 49.21 49.21 49.21 38.59 38.59 -10.62 422.9915 422.9915 539.3662 539.3660 539.3685
... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
439 65147.0 Torchiara 846.167482 20.76 20.76 20.86 29.14 29.14 8.38 246.5860 246.5860 176.5072 175.6504 175.6495
436 65144.0 Stella Cilento 1451.726154 39.51 43.25 43.25 52.64 52.64 9.39 764.2043 764.2043 627.8681 627.8690 573.5525
393 65098.0 Pollica 2816.525386 11.44 17.14 17.15 27.01 27.01 9.87 760.6785 760.6785 482.9555 482.8660 322.2088
359 65064.0 Lustra 1524.153297 34.01 34.02 34.02 44.61 44.61 10.59 679.9189 679.9189 518.4959 518.4971 518.4368
408 65113.0 Sacco 2365.702940 42.11 42.02 42.02 63.01 63.01 20.99 1490.6391 1490.6391 994.0414 994.0408 996.2456

450 rows × 14 columns

reduction_forest_area = focus_forest_df.iloc[0:10]
reduction_forest_area
pro_com comune sup_com_ha perc_1990 perc_2000 perc_2006 perc_2012 perc_2018 Perc.Diff. | 2018-2000 surface_ha_2018 surface_ha_2012 surface_ha_2006 surface_ha_2000 surface_ha_1990
139 62073.0 Solopaca 3112.664003 43.63 43.63 43.46 11.69 11.69 -31.94 363.9901 363.9901 1352.7210 1358.0359 1358.0275
143 62077.0 Vitulano 3599.050416 50.86 50.81 50.81 26.82 26.82 -23.99 965.1276 965.1276 1828.5273 1828.5272 1830.3353
410 65115.0 Salento 2378.507005 51.73 50.93 37.94 37.93 37.93 -13.00 902.2741 902.2741 902.4736 1211.3768 1230.4272
179 63082.0 Terzigno 2346.480829 20.68 20.68 20.68 20.68 8.01 -12.67 187.8420 485.2334 485.2333 485.2338 485.2356
147 63007.0 Barano d'Ischia 1096.089426 49.21 49.21 49.21 38.59 38.59 -10.62 422.9915 422.9915 539.3662 539.3660 539.3685
304 65006.0 Amalfi 570.014402 48.51 48.51 38.86 38.86 38.86 -9.65 221.4838 221.4838 221.4838 276.5111 276.5144
170 63064.0 Ercolano 1989.359843 21.47 21.26 21.26 17.39 11.75 -9.51 233.6730 345.9226 422.9398 422.9397 427.1795
155 63035.0 Gragnano 1464.244074 53.35 53.35 52.42 44.07 44.07 -9.28 645.3063 645.3063 767.6083 781.1773 781.1751
159 63041.0 Marano di Napoli 1565.253641 13.09 13.09 13.09 3.98 3.98 -9.11 62.3734 62.3734 204.9146 204.9145 204.9150
183 63091.0 Trecase 621.312671 8.86 8.86 8.86 8.86 0.08 -8.78 0.4777 55.0368 55.0368 55.0368 55.0371
increase_forest_area = focus_forest_df.iloc[-10:]
increase_forest_area.sort_values(by=['Perc.Diff. | 2018-2000'], ascending=False, inplace=True)
increase_forest_area
pro_com comune sup_com_ha perc_1990 perc_2000 perc_2006 perc_2012 perc_2018 Perc.Diff. | 2018-2000 surface_ha_2018 surface_ha_2012 surface_ha_2006 surface_ha_2000 surface_ha_1990
408 65113.0 Sacco 2365.702940 42.11 42.02 42.02 63.01 63.01 20.99 1490.6391 1490.6391 994.0414 994.0408 996.2456
359 65064.0 Lustra 1524.153297 34.01 34.02 34.02 44.61 44.61 10.59 679.9189 679.9189 518.4959 518.4971 518.4368
393 65098.0 Pollica 2816.525386 11.44 17.14 17.15 27.01 27.01 9.87 760.6785 760.6785 482.9555 482.8660 322.2088
436 65144.0 Stella Cilento 1451.726154 39.51 43.25 43.25 52.64 52.64 9.39 764.2043 764.2043 627.8681 627.8690 573.5525
439 65147.0 Torchiara 846.167482 20.76 20.76 20.86 29.14 29.14 8.38 246.5860 246.5860 176.5072 175.6504 175.6495
405 65110.0 Romagnano al Monte 966.995480 18.35 18.35 18.35 26.64 26.64 8.29 257.5984 257.5984 177.4251 177.4254 177.4249
151 63022.0 Casola di Napoli 259.318212 34.28 34.28 42.15 42.15 42.15 7.87 109.3078 109.3078 109.3078 88.8917 88.8916
102 62036.0 Ginestra degli Schiavoni 1478.706162 22.20 22.20 22.20 29.90 29.90 7.70 442.1457 442.1457 328.2494 328.2500 328.2562
229 64045.0 Luogosano 606.809422 10.43 12.63 12.63 18.42 18.42 5.79 111.7932 111.7932 76.6287 76.6287 63.2980
355 65060.0 Laureana Cilento 1374.420460 25.62 25.64 25.64 30.10 31.15 5.51 428.1047 413.7489 352.3810 352.3819 352.1644
forest_df = pd.concat([reduction_forest_area, increase_forest_area])
forest_df.sort_values(by=['Perc.Diff. | 2018-2000'], ascending=True, inplace=True)
forest_df = forest_df[['comune', 'Perc.Diff. | 2018-2000']]
forest_df['Perc.Diff. | 2018-2000'] = forest_df['Perc.Diff. | 2018-2000']
forest_df.set_index('comune', inplace=True)

fig_forest = plt.figure(figsize=(20, 10), dpi=100)
sub_fig_forest = GridSpec(nrows=1, ncols=1, figure=fig_forest, hspace=0.35)
ax_forest = fig_forest.add_subplot(sub_fig_forest[0, 0])
forest_df.plot.bar(ax=ax_forest, rot=0)

ax_forest.yaxis.set_label_text('%')
ax_forest.set_xlabel('')
ax_forest.grid(color='lightgrey', linestyle='dashdot')

plt.xticks(rotation = 90)
plt.legend(loc='best')
<matplotlib.legend.Legend at 0x7fe2d401af40>

E' significativo per me che nella top 10 del decremento di aree forestate ci siano Terzigno, Ercolano e Trecase. Lo è perchè sono tra i Comuni ricadenti nell'area del Parco Nazionale del Vesuvio che hanno subito danni al patrimonio boschivo a causa dell'incendio che ci fu nel 2017.

Le aree in cui i boschi avanzano sono perlopiu aree rurali, a vocazione agricola, che pian piano si stanno spopolando.

2.3.3 Aree agricole

Il gruppo 2.1 della CLC

# Dati 1990
arable_lands_surface_1990 = focus_1990_group[focus_1990_group['label3'].isin(['Non-irrigated arable land', 'Permanently irrigated land'])]
arable_lands_surface_1990_group = pd.DataFrame(arable_lands_surface_1990.groupby(['pro_com'])['surface_ha_1990'].sum())
arable_lands_surface_1990_group.reset_index(inplace=True)

# Dati 2000
arable_lands_surface_2000 = focus_2000_group[focus_2000_group['label3'].isin(['Non-irrigated arable land', 'Permanently irrigated land'])]
arable_lands_surface_2000_group = pd.DataFrame(arable_lands_surface_2000.groupby(['pro_com'])['surface_ha_2000'].sum())
arable_lands_surface_2000_group.reset_index(inplace=True)

# Dati 2006
arable_lands_surface_2006 = focus_2006_group[focus_2006_group['label3'].isin(['Non-irrigated arable land', 'Permanently irrigated land'])]
arable_lands_surface_2006_group = pd.DataFrame(arable_lands_surface_2006.groupby(['pro_com'])['surface_ha_2006'].sum())
arable_lands_surface_2006_group.reset_index(inplace=True)

# Dati 2012
arable_lands_surface_2012 = focus_2012_group[focus_2012_group['label3'].isin(['Non-irrigated arable land', 'Permanently irrigated land'])]
arable_lands_surface_2012_group = pd.DataFrame(arable_lands_surface_2012.groupby(['pro_com'])['surface_ha_2012'].sum())
arable_lands_surface_2012_group.reset_index(inplace=True)

# Dati 2018
arable_lands_surface_2018 = focus_2018_group[focus_2018_group['label3'].isin(['Non-irrigated arable land', 'Permanently irrigated land'])]
arable_lands_surface_2018_group = pd.DataFrame(arable_lands_surface_2018.groupby(['pro_com', 'comune', 'sup_com_ha'])['surface_ha_2018'].sum())
arable_lands_surface_2018_group.reset_index(inplace=True)

# Dati aggregati
focus_arable_lands = [arable_lands_surface_2018_group, arable_lands_surface_2012_group, arable_lands_surface_2006_group, arable_lands_surface_2000_group, arable_lands_surface_1990_group]
focus_arable_lands_df = reduce(lambda  left,right: pd.merge(left,right,on=['pro_com'], how='outer'), focus_arable_lands)
focus_arable_lands_df = focus_arable_lands_df[focus_arable_lands_df['sup_com_ha'] > 0]
focus_arable_lands_df.fillna(0, inplace=True)
focus_arable_lands_df.insert(loc=3, column='perc_1990', value=round(focus_arable_lands_df.surface_ha_1990 / focus_arable_lands_df.sup_com_ha, 4) * 100)
focus_arable_lands_df.insert(loc=4, column='perc_2000', value=round(focus_arable_lands_df.surface_ha_2000 / focus_arable_lands_df.sup_com_ha, 4) * 100)
focus_arable_lands_df.insert(loc=5, column='perc_2006', value=round(focus_arable_lands_df.surface_ha_2006 / focus_arable_lands_df.sup_com_ha, 4) * 100)
focus_arable_lands_df.insert(loc=6, column='perc_2012', value=round(focus_arable_lands_df.surface_ha_2012 / focus_arable_lands_df.sup_com_ha, 4) * 100)
focus_arable_lands_df.insert(loc=7, column='perc_2018', value=round(focus_arable_lands_df.surface_ha_2018 / focus_arable_lands_df.sup_com_ha, 4) * 100)
focus_arable_lands_df.insert(loc=8, column='Perc.Diff. | 2018-2000', value=(focus_arable_lands_df.perc_2018 - focus_arable_lands_df.perc_2000))
focus_arable_lands_df.sort_values(by=['Perc.Diff. | 2018-2000'], ascending=True, inplace=True)
focus_arable_lands_df
pro_com comune sup_com_ha perc_1990 perc_2000 perc_2006 perc_2012 perc_2018 Perc.Diff. | 2018-2000 surface_ha_2018 surface_ha_2012 surface_ha_2006 surface_ha_2000 surface_ha_1990
238 64072.0 Pietradefusi 924.149874 77.90 77.90 20.16 20.16 20.16 -57.74 186.3344 186.3344 186.3345 719.9375 719.9308
229 64056.0 Montefusco 823.823558 59.13 59.13 2.01 2.01 2.01 -57.12 16.5238 16.5238 16.5238 487.1327 487.1269
250 64093.0 Santa Paolina 843.429641 29.95 29.95 0.25 0.25 0.25 -29.70 2.0832 2.0832 2.0832 252.5909 252.5864
189 63089.0 Volla 620.630205 33.87 29.74 29.74 1.05 1.05 -28.69 6.5071 6.5071 184.6057 184.6056 210.2015
260 64110.0 Torre Le Nocelle 1004.158412 43.42 43.42 17.52 17.52 17.52 -25.90 175.8839 175.8839 175.8840 436.0116 436.0185
... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
130 62049.0 Paupisi 683.272709 0.00 0.00 0.00 23.31 23.31 23.31 159.2668 159.2668 0.0000 0.0000 0.0000
13 61016.0 Carinaro 631.593670 13.06 9.15 9.15 41.13 41.13 31.98 259.7728 259.7728 57.8113 57.8112 82.5094
17 61020.0 Casaluce 955.842829 0.70 0.70 0.70 60.53 60.53 59.83 578.6141 578.6141 6.7225 6.7226 6.7222
32 61037.0 Frignano 985.795577 0.00 0.00 0.00 69.03 69.03 69.03 680.5149 680.5149 0.0000 0.0000 0.0000
84 61098.0 Villa di Briano 854.692612 3.91 3.91 3.91 74.03 74.03 70.12 632.7436 632.7436 33.4422 33.4424 33.4453

363 rows × 14 columns

# Superfici in arretramento
reduction_arable_lands_area = focus_arable_lands_df.iloc[0:10]
reduction_arable_lands_area
pro_com comune sup_com_ha perc_1990 perc_2000 perc_2006 perc_2012 perc_2018 Perc.Diff. | 2018-2000 surface_ha_2018 surface_ha_2012 surface_ha_2006 surface_ha_2000 surface_ha_1990
238 64072.0 Pietradefusi 924.149874 77.90 77.90 20.16 20.16 20.16 -57.74 186.3344 186.3344 186.3345 719.9375 719.9308
229 64056.0 Montefusco 823.823558 59.13 59.13 2.01 2.01 2.01 -57.12 16.5238 16.5238 16.5238 487.1327 487.1269
250 64093.0 Santa Paolina 843.429641 29.95 29.95 0.25 0.25 0.25 -29.70 2.0832 2.0832 2.0832 252.5909 252.5864
189 63089.0 Volla 620.630205 33.87 29.74 29.74 1.05 1.05 -28.69 6.5071 6.5071 184.6057 184.6056 210.2015
260 64110.0 Torre Le Nocelle 1004.158412 43.42 43.42 17.52 17.52 17.52 -25.90 175.8839 175.8839 175.8840 436.0116 436.0185
190 63090.0 Santa Maria la Carità 397.883761 24.44 24.44 0.29 0.29 0.29 -24.15 1.1544 1.1544 1.1544 97.2554 97.2552
76 61088.0 Sessa Aurunca 16218.704457 25.28 25.35 2.23 2.56 2.56 -22.79 415.3546 415.3546 362.1214 4112.0036 4099.7632
166 63025.0 Castello di Cisterna 392.135970 44.25 44.25 21.85 21.85 21.85 -22.40 85.6953 85.6953 85.6953 173.5036 173.5048
232 64059.0 Montemiletto 2163.480616 34.90 33.95 14.70 14.70 14.70 -19.25 318.1006 318.1006 318.1007 734.5263 755.1347
163 63017.0 Casalnuovo di Napoli 783.538578 44.85 41.66 41.66 27.45 27.45 -14.21 215.1126 215.1126 326.3900 326.3901 351.4509
# Superfici in avanzamento
increase_arable_lands_area = focus_arable_lands_df.iloc[-10:]
increase_arable_lands_area.sort_values(by=['Perc.Diff. | 2018-2000'], ascending=False, inplace=True)
increase_arable_lands_area
pro_com comune sup_com_ha perc_1990 perc_2000 perc_2006 perc_2012 perc_2018 Perc.Diff. | 2018-2000 surface_ha_2018 surface_ha_2012 surface_ha_2006 surface_ha_2000 surface_ha_1990
84 61098.0 Villa di Briano 854.692612 3.91 3.91 3.91 74.03 74.03 70.12 632.7436 632.7436 33.4422 33.4424 33.4453
32 61037.0 Frignano 985.795577 0.00 0.00 0.00 69.03 69.03 69.03 680.5149 680.5149 0.0000 0.0000 0.0000
17 61020.0 Casaluce 955.842829 0.70 0.70 0.70 60.53 60.53 59.83 578.6141 578.6141 6.7225 6.7226 6.7222
13 61016.0 Carinaro 631.593670 13.06 9.15 9.15 41.13 41.13 31.98 259.7728 259.7728 57.8113 57.8112 82.5094
130 62049.0 Paupisi 683.272709 0.00 0.00 0.00 23.31 23.31 23.31 159.2668 159.2668 0.0000 0.0000 0.0000
143 62062.0 San Lorenzo Maggiore 1629.550368 0.93 0.93 0.93 18.00 18.00 17.07 293.3587 293.3587 15.1138 15.1136 15.1112
134 62053.0 Ponte 1791.529818 18.98 18.98 18.11 35.86 35.86 16.88 642.4110 642.4110 324.5012 339.9875 339.9830
217 64037.0 Greci 3026.329172 33.15 34.35 50.04 50.02 50.02 15.67 1513.7004 1513.7004 1514.3325 1039.4665 1003.1417
36 61043.0 Gricignano di Aversa 997.757144 27.33 19.84 19.70 35.43 35.43 15.59 353.4710 353.4710 196.5586 197.9250 272.6607
63 61074.0 San Cipriano d'Aversa 619.009752 44.14 44.14 43.49 56.38 56.38 12.24 348.9748 348.9748 269.2010 273.2419 273.2415
arable_lands_df = pd.concat([reduction_arable_lands_area, increase_arable_lands_area])
arable_lands_df.sort_values(by=['Perc.Diff. | 2018-2000'], ascending=True, inplace=True)
arable_lands_df = arable_lands_df[['comune', 'Perc.Diff. | 2018-2000']]
arable_lands_df['Perc.Diff. | 2018-2000'] = arable_lands_df['Perc.Diff. | 2018-2000']
arable_lands_df.set_index('comune', inplace=True)

fig_arable_lands = plt.figure(figsize=(20, 10), dpi=100)
sub_fig_arable_lands = GridSpec(nrows=1, ncols=1, figure=fig_arable_lands, hspace=0.35)
ax_arable_lands = fig_arable_lands.add_subplot(sub_fig_arable_lands[0, 0])
arable_lands_df.plot.bar(ax=ax_arable_lands, rot=0)

ax_arable_lands.yaxis.set_label_text('%')
ax_arable_lands.set_xlabel('')
ax_arable_lands.grid(color='lightgrey', linestyle='dashdot')

plt.xticks(rotation = 90)
plt.legend(loc='best')
<matplotlib.legend.Legend at 0x7fe2d5ed0fd0>

Tra i Comuni con maggior aumento della aree articifiali abbiamo visto che c'è Volla che è tra i Comuni con maggior decremento delle aree agricole. Poco sopra ho fatto una riflessione sul perchè della redistribuzione del livello 1 della CLC. Due indizi non fanno una prova, ma tre?

2.3.4 Aree bruciate

# Dati 1990
burnt_surface_1990 = focus_1990_group[focus_1990_group['label3'].isin(['Burnt areas'])]
burnt_surface_1990_group = pd.DataFrame(burnt_surface_1990.groupby(['pro_com'])['surface_ha_1990'].sum())
burnt_surface_1990_group.reset_index(inplace=True)

# Dati 2000
burnt_surface_2000 = focus_2000_group[focus_2000_group['label3'].isin(['Burnt areas'])]
burnt_surface_2000_group = pd.DataFrame(burnt_surface_2000.groupby(['pro_com'])['surface_ha_2000'].sum())
burnt_surface_2000_group.reset_index(inplace=True)

# Dati 2006
burnt_surface_2006 = focus_2006_group[focus_2006_group['label3'].isin(['Burnt areas'])]
burnt_surface_2006_group = pd.DataFrame(burnt_surface_2006.groupby(['pro_com'])['surface_ha_2006'].sum())
burnt_surface_2006_group.reset_index(inplace=True)

# Dati 2012
burnt_surface_2012 = focus_2012_group[focus_2012_group['label3'].isin(['Burnt areas'])]
burnt_surface_2012_group = pd.DataFrame(burnt_surface_2012.groupby(['pro_com'])['surface_ha_2012'].sum())
burnt_surface_2012_group.reset_index(inplace=True)

# Dati 2018
burnt_surface_2018 = focus_2018_group[focus_2018_group['label3'].isin(['Burnt areas'])]
burnt_surface_2018_group = pd.DataFrame(burnt_surface_2018.groupby(['pro_com', 'comune', 'sup_com_ha'])['surface_ha_2018'].sum())
burnt_surface_2018_group.reset_index(inplace=True)

# Dati aggregati
focus_arable_lands = [burnt_surface_2018_group, burnt_surface_2012_group, burnt_surface_2006_group, burnt_surface_2000_group, burnt_surface_1990_group]
focus_burnt_df = reduce(lambda  left,right: pd.merge(left,right,on=['pro_com'], how='outer'), focus_arable_lands)
focus_burnt_df = focus_burnt_df[focus_burnt_df['sup_com_ha'] > 0]
focus_burnt_df.fillna(0, inplace=True)
focus_burnt_df.insert(loc=3, column='perc_1990', value=round(focus_burnt_df.surface_ha_1990 / focus_burnt_df.sup_com_ha, 4) * 100)
focus_burnt_df.insert(loc=4, column='perc_2000', value=round(focus_burnt_df.surface_ha_2000 / focus_burnt_df.sup_com_ha, 4) * 100)
focus_burnt_df.insert(loc=5, column='perc_2006', value=round(focus_burnt_df.surface_ha_2006 / focus_burnt_df.sup_com_ha, 4) * 100)
focus_burnt_df.insert(loc=6, column='perc_2012', value=round(focus_burnt_df.surface_ha_2012 / focus_burnt_df.sup_com_ha, 4) * 100)
focus_burnt_df.insert(loc=7, column='perc_2018', value=round(focus_burnt_df.surface_ha_2018 / focus_burnt_df.sup_com_ha, 4) * 100)
focus_burnt_df.insert(loc=8, column='Perc.Diff. | 2018-2000', value=(focus_burnt_df.perc_2018 - focus_burnt_df.perc_2000))
focus_burnt_df.sort_values(by=['Perc.Diff. | 2018-2000'], ascending=False, inplace=True)
focus_burnt_df
pro_com comune sup_com_ha perc_1990 perc_2000 perc_2006 perc_2012 perc_2018 Perc.Diff. | 2018-2000 surface_ha_2018 surface_ha_2012 surface_ha_2006 surface_ha_2000 surface_ha_1990
20 63082.0 Terzigno 2346.480829 0.0 0.00 0.00 0.00 18.50 18.50 434.1155 0.0000 0.0000 0.0000 0.0
16 63064.0 Ercolano 1989.359843 0.0 0.00 0.00 8.49 17.54 17.54 348.9169 168.9727 0.0000 0.0000 0.0
10 63009.0 Boscotrecase 753.047593 0.0 0.00 0.00 0.00 16.95 16.95 127.6552 0.0000 0.0000 0.0000 0.0
22 63091.0 Trecase 621.312671 0.0 0.00 0.00 0.00 13.75 13.75 85.4539 0.0000 0.0000 0.0000 0.0
13 63051.0 Ottaviano 2002.268341 0.0 0.00 0.00 0.88 12.06 12.06 241.4028 17.6023 0.0000 0.0000 0.0
50 65142.0 Siano 856.918877 0.0 0.00 0.00 0.00 10.24 10.24 87.7539 0.0000 0.0000 0.0000 0.0
24 64076.0 Quadrelle 693.114011 0.0 0.00 0.00 0.00 9.65 9.65 66.9010 0.0000 0.0000 0.0000 0.0
21 63084.0 Torre del Greco 3066.110669 0.0 0.00 0.00 1.58 9.19 9.19 281.8574 48.5022 0.0000 0.0000 0.0
11 63041.0 Marano di Napoli 1565.253641 0.0 0.00 0.00 9.11 9.11 9.11 142.5412 142.5412 0.0000 0.0000 0.0
45 65108.0 Roccapiemonte 531.325342 0.0 3.85 0.00 0.00 10.68 6.83 56.7487 0.0000 0.0000 20.4508 0.0
41 65067.0 Mercato San Severino 3033.314668 0.0 3.72 0.00 0.00 9.55 5.83 289.6134 0.0000 0.0000 112.7573 0.0
36 65047.0 Corbara 673.181063 0.0 0.00 0.00 0.00 5.43 5.43 36.5565 0.0000 0.0000 0.0000 0.0
27 64100.0 Sirignano 618.669347 0.0 0.00 0.00 0.00 5.42 5.42 33.5478 0.0000 0.0000 0.0000 0.0
33 65020.0 Calvanico 1490.919524 0.0 0.00 0.00 0.00 4.50 4.50 67.0813 0.0000 0.0000 0.0000 0.0
1 61024.0 Castel di Sasso 2032.307571 0.0 0.00 0.00 0.00 3.73 3.73 75.8659 0.0000 0.0000 0.0000 0.0
29 64121.0 Montoro 4014.094054 0.0 0.10 0.00 0.00 3.73 3.63 149.7874 0.0000 0.0000 4.0627 0.0
30 65013.0 Baronissi 1792.982916 0.0 0.00 0.00 0.00 3.61 3.61 64.6775 0.0000 0.0000 0.0000 0.0
17 63065.0 Roccarainola 2833.151640 0.0 0.00 0.00 0.00 3.55 3.55 100.4408 0.0000 0.0000 0.0000 0.0
9 62028.0 Durazzano 1290.490693 0.0 0.00 0.00 3.36 3.36 3.36 43.3596 43.3596 0.0000 0.0000 0.0
8 62009.0 Bonea 1146.261236 0.0 0.00 0.00 0.00 3.09 3.09 35.4456 0.0000 0.0000 0.0000 0.0
44 65079.0 Nocera Superiore 1466.245166 0.0 0.00 0.00 0.00 3.00 3.00 44.0193 0.0000 0.0000 0.0000 0.0
48 65131.0 Santomenna 891.925366 0.0 0.00 0.00 2.94 2.94 2.94 26.1979 26.1980 0.0000 0.0000 0.0
4 61051.0 Mignano Monte Lungo 5309.523303 0.0 0.00 0.00 0.00 2.72 2.72 144.4552 0.0000 0.0000 0.0000 0.0
51 65151.0 Tramonti 2482.596555 0.0 0.00 0.00 2.59 2.59 2.59 64.2754 64.2754 0.0000 0.0000 0.0
14 63060.0 Pozzuoli 4343.389600 0.0 0.00 0.00 2.38 2.38 2.38 103.1784 103.1784 0.0000 0.0000 0.0
49 65135.0 Sarno 4000.061759 0.0 0.00 0.00 0.00 2.15 2.15 85.9694 0.0000 0.0000 0.0000 0.0
40 65060.0 Laureana Cilento 1374.420460 0.0 0.00 0.00 0.00 1.98 1.98 27.2732 0.0000 0.0000 0.0000 0.0
6 61075.0 San Felice a Cancello 2717.900285 0.0 0.00 0.00 0.00 1.98 1.98 53.7304 0.0000 0.0000 0.0000 0.0
25 64077.0 Quindici 2390.824174 0.0 0.00 0.00 0.00 1.90 1.90 45.4393 0.0000 0.0000 0.0000 0.0
42 65069.0 Moio della Civitella 1718.872945 0.0 0.00 0.00 0.00 1.58 1.58 27.1520 0.0000 0.0000 0.0000 0.0
23 63092.0 Massa di Somma 304.205206 0.0 0.00 0.00 0.00 1.51 1.51 4.6046 0.0000 0.0000 0.0000 0.0
46 65124.0 San Mauro la Bruca 1905.442534 0.0 0.00 0.00 0.00 1.34 1.34 25.6184 0.0000 0.0000 0.0000 0.0
28 64101.0 Solofra 2221.354782 0.0 0.00 0.00 0.00 1.30 1.30 28.9118 0.0000 0.0000 0.0000 0.0
43 65078.0 Nocera Inferiore 2094.467250 0.0 0.00 0.00 0.00 1.24 1.24 26.0176 0.0000 0.0000 0.0000 0.0
15 63063.0 Quarto 1415.896056 0.0 0.00 0.00 1.17 1.17 1.17 16.5525 16.5525 0.0000 0.0000 0.0
18 63068.0 San Giuseppe Vesuviano 1417.126283 0.0 0.00 0.00 0.00 1.04 1.04 14.7355 0.0000 0.0000 0.0000 0.0
32 65019.0 Caggiano 3542.966709 0.0 0.00 0.00 0.93 0.93 0.93 32.9540 32.9540 0.0000 0.0000 0.0
34 65034.0 Castel San Giorgio 1358.506777 0.0 0.00 0.00 0.00 0.75 0.75 10.1730 0.0000 0.0000 0.0000 0.0
0 61022.0 Caserta 5406.845910 0.0 0.00 0.00 0.67 0.67 0.67 36.0326 36.0326 0.0000 0.0000 0.0
12 63049.0 Napoli 11894.407425 0.0 0.00 0.00 0.53 0.53 0.53 63.0803 63.0803 0.0000 0.0000 0.0
5 61052.0 Mondragone 5572.569052 0.0 0.00 2.74 0.00 0.52 0.52 29.0151 0.0000 152.8844 0.0000 0.0
39 65055.0 Giffoni Sei Casali 3507.503961 0.0 0.00 0.00 0.00 0.22 0.22 7.7114 0.0000 0.0000 0.0000 0.0
31 65016.0 Bracigliano 1440.868176 0.0 0.26 0.00 0.00 0.47 0.21 6.7033 0.0000 0.0000 3.7261 0.0
19 63079.0 Somma Vesuviana 3066.640742 0.0 0.00 0.00 0.11 0.11 0.11 3.3491 3.3491 0.0000 0.0000 0.0
3 61045.0 Liberi 1758.913730 0.0 0.00 0.00 0.00 0.10 0.10 1.7792 0.0000 0.0000 0.0000 0.0
2 61026.0 Castel Morrone 2534.392208 0.0 0.00 0.00 0.10 0.10 0.10 2.6154 2.6154 0.0000 0.0000 0.0
26 64099.0 Serino 5249.939474 0.0 0.00 0.00 0.00 0.04 0.04 1.9971 0.0000 0.0000 0.0000 0.0
38 65054.0 Futani 1485.058368 0.0 0.00 0.00 0.00 0.02 0.02 0.3298 0.0000 0.0000 0.0000 0.0
7 61079.0 San Pietro Infine 1371.735131 0.0 0.00 0.00 0.00 0.01 0.01 0.1720 0.0000 0.0000 0.0000 0.0
47 65130.0 Sant'Egidio del Monte Albino 724.511924 0.0 0.00 0.00 0.00 0.00 0.00 0.0259 0.0000 0.0000 0.0000 0.0
35 65037.0 Cava de' Tirreni 3653.112071 0.0 1.55 0.00 0.04 1.48 -0.07 54.0169 1.6314 0.0000 56.7053 0.0
37 65052.0 Fisciano 3168.742849 0.0 4.15 0.00 0.00 1.43 -2.72 45.1761 0.0000 0.0000 131.4723 0.0

In questa analisi ci sono in 6 delle prime 10 posizioni alcuni dei Comuni interessati dall'incendio del 2017.

2.3.5 Aree adibite a discarica

# Dati 1990
dump_surface_1990 = focus_1990_group[focus_1990_group['label3'].isin(['Dump sites'])]
dump_surface_1990_group = pd.DataFrame(dump_surface_1990.groupby(['pro_com'])['surface_ha_1990'].sum())
dump_surface_1990_group.reset_index(inplace=True)

# Dati 2000
dump_surface_2000 = focus_2000_group[focus_2000_group['label3'].isin(['Dump sites'])]
dump_surface_2000_group = pd.DataFrame(dump_surface_2000.groupby(['pro_com'])['surface_ha_2000'].sum())
dump_surface_2000_group.reset_index(inplace=True)

# Dati 2006
dump_surface_2006 = focus_2006_group[focus_2006_group['label3'].isin(['Dump sites'])]
dump_surface_2006_group = pd.DataFrame(dump_surface_2006.groupby(['pro_com'])['surface_ha_2006'].sum())
dump_surface_2006_group.reset_index(inplace=True)

# Dati 2012
dump_surface_2012 = focus_2012_group[focus_2012_group['label3'].isin(['Dump sites'])]
dump_surface_2012_group = pd.DataFrame(dump_surface_2012.groupby(['pro_com'])['surface_ha_2012'].sum())
dump_surface_2012_group.reset_index(inplace=True)

# Dati 2018
dump_surface_2018 = focus_2018_group[focus_2018_group['label3'].isin(['Dump sites'])]
dump_surface_2018_group = pd.DataFrame(dump_surface_2018.groupby(['pro_com', 'comune', 'sup_com_ha'])['surface_ha_2018'].sum())
dump_surface_2018_group.reset_index(inplace=True)

# Dati aggregati
focus_arable_lands = [dump_surface_2018_group, dump_surface_2012_group, dump_surface_2006_group, dump_surface_2000_group, dump_surface_1990_group]
focus_dump_df = reduce(lambda  left,right: pd.merge(left,right,on=['pro_com'], how='outer'), focus_arable_lands)
focus_dump_df = focus_dump_df[focus_dump_df['sup_com_ha'] > 0]
focus_dump_df.fillna(0, inplace=True)
focus_dump_df.insert(loc=3, column='perc_1990', value=round(focus_dump_df.surface_ha_1990 / focus_dump_df.sup_com_ha, 4) * 100)
focus_dump_df.insert(loc=4, column='perc_2000', value=round(focus_dump_df.surface_ha_2000 / focus_dump_df.sup_com_ha, 4) * 100)
focus_dump_df.insert(loc=5, column='perc_2006', value=round(focus_dump_df.surface_ha_2006 / focus_dump_df.sup_com_ha, 4) * 100)
focus_dump_df.insert(loc=6, column='perc_2012', value=round(focus_dump_df.surface_ha_2012 / focus_dump_df.sup_com_ha, 4) * 100)
focus_dump_df.insert(loc=7, column='perc_2018', value=round(focus_dump_df.surface_ha_2018 / focus_dump_df.sup_com_ha, 4) * 100)
focus_dump_df.insert(loc=8, column='Perc.Diff. | 2018-2000', value=(focus_dump_df.perc_2018 - focus_dump_df.perc_2000))
focus_dump_df.sort_values(by=['Perc.Diff. | 2018-2000'], ascending=False, inplace=True)
focus_dump_df
pro_com comune sup_com_ha perc_1990 perc_2000 perc_2006 perc_2012 perc_2018 Perc.Diff. | 2018-2000 surface_ha_2018 surface_ha_2012 surface_ha_2006 surface_ha_2000 surface_ha_1990
4 63034.0 Giugliano in Campania 9463.207795 0.01 0.01 0.16 1.89 1.89 1.88 179.2958 179.2958 14.7856 0.9317 0.9314
1 61085.0 San Tammaro 3696.678415 0.00 0.00 0.00 2.09 1.63 1.63 60.2521 77.3722 0.0000 0.0000 0.0000
3 63011.0 Caivano 2722.117368 1.34 0.00 1.32 1.32 1.32 1.32 35.9863 35.9863 35.9863 0.0000 36.5076
2 61099.0 Villa Literno 6182.490260 0.00 0.00 1.15 1.19 1.19 1.19 73.7065 73.7065 70.9893 0.0000 0.0000
0 61084.0 Santa Maria la Fossa 2972.966831 0.00 0.00 0.00 1.56 1.07 1.07 31.7251 46.3154 0.0000 0.0000 0.0000
5 64005.0 Ariano Irpino 18673.653095 0.00 0.00 0.14 0.14 0.14 0.14 25.9872 25.9872 25.9872 0.0000 0.0000

Qui abbiamo le più grandi discariche campane, cresciute con la crisi dei rifiuti di inizio anni 2000.

2.3.6 Aree verdi urbane

green_urban_surface_1990 = focus_1990_group[focus_1990_group['label3'].isin(['Green urban areas'])]
green_urban_surface_1990_group = pd.DataFrame(green_urban_surface_1990.groupby(['pro_com'])['surface_ha_1990'].sum())
green_urban_surface_1990_group.reset_index(inplace=True)

# Dati 2000
green_urban_surface_2000 = focus_2000_group[focus_2000_group['label3'].isin(['Green urban areas'])]
green_urban_surface_2000_group = pd.DataFrame(green_urban_surface_2000.groupby(['pro_com'])['surface_ha_2000'].sum())
green_urban_surface_2000_group.reset_index(inplace=True)

# Dati 2006
green_urban_surface_2006 = focus_2006_group[focus_2006_group['label3'].isin(['Green urban areas'])]
green_urban_surface_2006_group = pd.DataFrame(green_urban_surface_2006.groupby(['pro_com'])['surface_ha_2006'].sum())
green_urban_surface_2006_group.reset_index(inplace=True)

# Dati 2012
green_urban_surface_2012 = focus_2012_group[focus_2012_group['label3'].isin(['Green urban areas'])]
green_urban_surface_2012_group = pd.DataFrame(green_urban_surface_2012.groupby(['pro_com'])['surface_ha_2012'].sum())
green_urban_surface_2012_group.reset_index(inplace=True)

# Dati 2018
green_urban_surface_2018 = focus_2018_group[focus_2018_group['label3'].isin(['Green urban areas'])]
green_urban_surface_2018_group = pd.DataFrame(green_urban_surface_2018.groupby(['pro_com', 'comune', 'sup_com_ha'])['surface_ha_2018'].sum())
green_urban_surface_2018_group.reset_index(inplace=True)

# Dati aggregati
focus_green_urban = [green_urban_surface_2018_group, green_urban_surface_2012_group, green_urban_surface_2006_group, green_urban_surface_2000_group, green_urban_surface_1990_group]
focus_green_urban_df = reduce(lambda  left,right: pd.merge(left,right,on=['pro_com'], how='outer'), focus_green_urban)
focus_green_urban_df = focus_green_urban_df[focus_green_urban_df['sup_com_ha'] > 0]
focus_green_urban_df.fillna(0, inplace=True)
focus_green_urban_df.insert(loc=3, column='perc_1990', value=round(focus_green_urban_df.surface_ha_1990 / focus_green_urban_df.sup_com_ha, 4) * 100)
focus_green_urban_df.insert(loc=4, column='perc_2000', value=round(focus_green_urban_df.surface_ha_2000 / focus_green_urban_df.sup_com_ha, 4) * 100)
focus_green_urban_df.insert(loc=5, column='perc_2006', value=round(focus_green_urban_df.surface_ha_2006 / focus_green_urban_df.sup_com_ha, 4) * 100)
focus_green_urban_df.insert(loc=6, column='perc_2012', value=round(focus_green_urban_df.surface_ha_2012 / focus_green_urban_df.sup_com_ha, 4) * 100)
focus_green_urban_df.insert(loc=7, column='perc_2018', value=round(focus_green_urban_df.surface_ha_2018 / focus_green_urban_df.sup_com_ha, 4) * 100)
focus_green_urban_df.insert(loc=8, column='Perc.Diff. | 2018-2000', value=(focus_green_urban_df.perc_2018 - focus_green_urban_df.perc_2000))
focus_green_urban_df.sort_values(by=['Perc.Diff. | 2018-2000'], ascending=False, inplace=True)
focus_green_urban_df
pro_com comune sup_com_ha perc_1990 perc_2000 perc_2006 perc_2012 perc_2018 Perc.Diff. | 2018-2000 surface_ha_2018 surface_ha_2012 surface_ha_2006 surface_ha_2000 surface_ha_1990
3 62062.0 San Lorenzo Maggiore 1629.550368 0.00 0.00 0.00 0.00 11.89 11.89 193.6792 0.0000 0.0000 0.0000 0.0000
2 62037.0 Guardia Sanframondi 2109.748292 0.00 0.00 0.00 0.00 9.63 9.63 203.2666 0.0000 0.0000 0.0000 0.0000
8 65078.0 Nocera Inferiore 2094.467250 0.00 0.00 1.91 1.91 1.91 1.91 39.9739 39.9739 39.9740 0.0000 0.0000
6 63060.0 Pozzuoli 4343.389600 0.96 0.61 0.68 0.68 0.68 0.07 29.4516 29.4516 29.4517 26.6666 41.7480
0 61018.0 Casagiove 635.694991 0.79 0.79 0.79 0.79 0.79 0.00 5.0499 5.0499 5.0499 5.0499 5.0496
1 61022.0 Caserta 5406.845910 2.50 2.50 2.50 2.50 2.50 0.00 135.0386 135.0386 135.0386 135.0386 135.0388
5 63059.0 Portici 460.130721 0.00 12.99 12.99 12.99 12.99 0.00 59.7546 59.7546 59.7546 59.7546 0.0000
7 63064.0 Ercolano 1989.359843 0.00 0.21 0.21 0.21 0.21 0.00 4.2403 4.2403 4.2403 4.2404 0.0000
4 63049.0 Napoli 11894.407425 3.15 4.44 4.47 4.26 4.26 -0.18 506.6039 506.6039 531.7766 527.6737 374.2016

3. Analisi a scala nazionale

Fino a qui abbiamo visto una analisi focalizzata sulla Campania. Di seguito ripeterò tutte le analisi ma a scala nazionale.

3.1.1 Stato al 1990

clc1990_label1 = pd.DataFrame(clc1990.groupby('label1')['surface_ha_1990'].sum())
clc1990_label1.reset_index(inplace=True)
clc1990_label1.rename(columns={'label1': 'CORINE Land Cover - level 1'}, inplace=True)
clc1990_label1
CORINE Land Cover - level 1 surface_ha_1990
0 Agricultural areas 1.582623e+07
1 Artificial surfaces 1.347486e+06
2 Forest and semi natural areas 1.263937e+07
3 Water bodies 3.122569e+05
4 Wetlands 6.897894e+04
clc1990_label2 = pd.DataFrame(clc1990.groupby('label2')['surface_ha_1990'].sum())
clc1990_label2.reset_index(inplace=True)
clc1990_label2.rename(columns={'label2': 'CORINE Land Cover - level 2'}, inplace=True)
clc1990_label2
CORINE Land Cover - level 2 surface_ha_1990
0 Arable land 8.392567e+06
1 Artificial, non-agricultural vegetated areas 2.798779e+04
2 Forests 7.831590e+06
3 Heterogeneous agricultural areas 4.778702e+06
4 Industrial, commercial and transport units 2.363946e+05
5 Inland waters 2.175910e+05
6 Inland wetlands 1.585394e+04
7 Marine waters 9.466595e+04
8 Maritime wetlands 5.312500e+04
9 Mine, dump and construction sites 5.153499e+04
10 Open spaces with little or no vegetation 1.106064e+06
11 Pastures 4.560942e+05
12 Permanent crops 2.198869e+06
13 Scrub and/or herbaceous vegetation associations 3.701717e+06
14 Urban fabric 1.031569e+06
clc1990_label3 = pd.DataFrame(clc1990.groupby('label3')['surface_ha_1990'].sum())
clc1990_label3.reset_index(inplace=True)
clc1990_label3.rename(columns={'label3': 'CORINE Land Cover - level 3'}, inplace=True)
clc1990_label3
CORINE Land Cover - level 3 surface_ha_1990
0 Agro-forestry areas 1.875953e+05
1 Airports 2.061481e+04
2 Annual crops associated with permanent crops 3.948806e+05
3 Bare rocks 4.823748e+05
4 Beaches, dunes, sands 8.237502e+04
5 Broad-leaved forest 5.477418e+06
6 Burnt areas 3.688807e+03
7 Coastal lagoons 9.441910e+04
8 Complex cultivation patterns 2.208152e+06
9 Coniferous forest 1.322878e+06
10 Construction sites 6.608806e+03
11 Continuous urban fabric 1.465191e+05
12 Discontinuous urban fabric 8.850498e+05
13 Dump sites 1.813232e+03
14 Estuaries 2.468468e+02
15 Fruit trees and berry plantations 3.995981e+05
16 Glaciers and perpetual snow 5.296383e+04
17 Green urban areas 1.029782e+04
18 Industrial or commercial units 1.935121e+05
19 Inland marshes 1.581604e+04
20 Land principally occupied by agriculture, with... 1.988074e+06
21 Mineral extraction sites 4.311295e+04
22 Mixed forest 1.031295e+06
23 Moors and heathland 2.759264e+05
24 Natural grasslands 1.452501e+06
25 Non-irrigated arable land 8.075700e+06
26 Olive groves 1.263777e+06
27 Pastures 4.560942e+05
28 Peat bogs 3.790290e+01
29 Permanently irrigated land 4.081855e+04
30 Port areas 9.735064e+03
31 Rice fields 2.760486e+05
32 Road and rail networks and associated land 1.253256e+04
33 Salines 1.000881e+04
34 Salt marshes 4.311619e+04
35 Sclerophyllous vegetation 9.609517e+05
36 Sparsely vegetated areas 4.846612e+05
37 Sport and leisure facilities 1.768997e+04
38 Transitional woodland-shrub 1.012338e+06
39 Vineyards 5.354933e+05
40 Water bodies 1.681098e+05
41 Water courses 4.948117e+04

3.1.2 Stato al 2000

clc2000_label1 = pd.DataFrame(clc2000.groupby('label1')['surface_ha_2000'].sum())
clc2000_label1.reset_index(inplace=True)
clc2000_label1.rename(columns={'label1': 'CORINE Land Cover - level 1'}, inplace=True)

clc2000_label2 = pd.DataFrame(clc2000.groupby('label2')['surface_ha_2000'].sum())
clc2000_label2.reset_index(inplace=True)
clc2000_label2.rename(columns={'label2': 'CORINE Land Cover - level 2'}, inplace=True)

clc2000_label3 = pd.DataFrame(clc2000.groupby('label3')['surface_ha_2000'].sum())
clc2000_label3.reset_index(inplace=True)
clc2000_label3.rename(columns={'label3': 'CORINE Land Cover - level 3'}, inplace=True)

3.1.3 Stato al 2006

clc2006_label1 = pd.DataFrame(clc2006.groupby('label1')['surface_ha_2006'].sum())
clc2006_label1.reset_index(inplace=True)
clc2006_label1.rename(columns={'label1': 'CORINE Land Cover - level 1'}, inplace=True)

clc2006_label2 = pd.DataFrame(clc2006.groupby('label2')['surface_ha_2006'].sum())
clc2006_label2.reset_index(inplace=True)
clc2006_label2.rename(columns={'label2': 'CORINE Land Cover - level 2'}, inplace=True)

clc2006_label3 = pd.DataFrame(clc2006.groupby('label3')['surface_ha_2006'].sum())
clc2006_label3.reset_index(inplace=True)
clc2006_label3.rename(columns={'label3': 'CORINE Land Cover - level 3'}, inplace=True)

3.1.4 Stato al 2012

clc2012_label1 = pd.DataFrame(clc2012.groupby('label1')['surface_ha_2012'].sum())
clc2012_label1.reset_index(inplace=True)
clc2012_label1.rename(columns={'label1': 'CORINE Land Cover - level 1'}, inplace=True)

clc2012_label2 = pd.DataFrame(clc2012.groupby('label2')['surface_ha_2012'].sum())
clc2012_label2.reset_index(inplace=True)
clc2012_label2.rename(columns={'label2': 'CORINE Land Cover - level 2'}, inplace=True)

clc2012_label3 = pd.DataFrame(clc2012.groupby('label3')['surface_ha_2012'].sum())
clc2012_label3.reset_index(inplace=True)
clc2012_label3.rename(columns={'label3': 'CORINE Land Cover - level 3'}, inplace=True)

3.1.5 Stato al 2018

clc2018_label1 = pd.DataFrame(clc2018.groupby('label1')['surface_ha_2018'].sum())
clc2018_label1.reset_index(inplace=True)
clc2018_label1.rename(columns={'label1': 'CORINE Land Cover - level 1'}, inplace=True)

clc2018_label2 = pd.DataFrame(clc2018.groupby('label2')['surface_ha_2018'].sum())
clc2018_label2.reset_index(inplace=True)
clc2018_label2.rename(columns={'label2': 'CORINE Land Cover - level 2'}, inplace=True)

clc2018_label3 = pd.DataFrame(clc2018.groupby('label3')['surface_ha_2018'].sum())
clc2018_label3.reset_index(inplace=True)
clc2018_label3.rename(columns={'label3': 'CORINE Land Cover - level 3'}, inplace=True)

3.2 Grafici

Mi limiterò a commentare solo la analisi a scala nazionale perchè quelle a scala comunale hanno risultati che, sebbene intuibili dal punto di vista delle variazioni, hanno una valenza territoriale molto forte(come lo è stato per la Campania) e non conoscendo tutti quei territori preferisco lasciare a chi è del posto le considerazioni del caso.

3.2.1 Grafici per il livello 1

lvl1_naz = [clc1990_label1, clc2000_label1, clc2006_label1, clc2012_label1, clc2018_label1]
lvl1_naz_df = reduce(lambda  left,right: pd.merge(left,right,on=['CORINE Land Cover - level 1'], how='outer'), lvl1_naz)
lvl1_naz_df.insert(loc=6, column='Surf.Diff. | 2018-1990', value=(lvl1_naz_df.surface_ha_2018 - lvl1_naz_df.surface_ha_1990))
lvl1_naz_df.fillna(0, inplace=True)
lvl1_naz_df.set_index('CORINE Land Cover - level 1', inplace=True)
lvl1_naz_df.rename(columns={'surface_ha_1990': '1990', 'surface_ha_2000': '2000', 'surface_ha_2006': '2006', 'surface_ha_2012': '2012', 'surface_ha_2018': '2018'}, inplace=True)
lvl1_naz_df
1990 2000 2006 2012 2018 Surf.Diff. | 2018-1990
CORINE Land Cover - level 1
Agricultural areas 1.582623e+07 1.580692e+07 1.578178e+07 1.569692e+07 1.568826e+07 -137975.0803
Artificial surfaces 1.347486e+06 1.443652e+06 1.562164e+06 1.646988e+06 1.655775e+06 308288.5459
Forest and semi natural areas 1.263937e+07 1.256172e+07 1.246520e+07 1.246121e+07 1.245564e+07 -183733.2104
Water bodies 3.122569e+05 3.152274e+05 3.145802e+05 3.228559e+05 3.226620e+05 10405.1059
Wetlands 6.897894e+04 6.780469e+04 7.179663e+04 6.758186e+04 6.796058e+04 -1018.3605
fig1_naz = plt.figure(figsize=(20, 10), dpi=100)
sub_fig_naz = GridSpec(nrows=1, ncols=1, figure=fig1_naz, hspace=0.35)
ax_naz = fig1_naz.add_subplot(sub_fig_naz[0, 0])
lvl1_naz_df.plot.bar(ax=ax_naz, rot=0)

ax_naz.yaxis.set_label_text('ha')
ax_naz.set_xlabel('')

plt.legend(loc='best')
<matplotlib.legend.Legend at 0x7fe2d08eedc0>