<jupyter_start><jupyter_text>Cvičení o lesních požárech* Představ si, že jsi ambasador OSN pro klimatické změny.* Máš to těžké, protože buď stojíš proti zájmům miliónů nebo nesmírně mocným korporacím.* Klimatické změny jsou také nesporně spojeny s extrémním počasím.* Jedním z tvých cílů je najít oblasti, kde i změna z tvé slabé pozice je možná a bude mít velký účinek.* Názorným extrémem je narůstající počet a intenzita lesních požárů ve světě.* Tak tě napadlo. Jistý podíl požárů je způsoben žháři.* Místo změny klimatu přímo, najděme země, ve kterých nejsou proti žhářům dostatečně tvrdí, zabili bychom jednou ranou dvě mouchy    * ubyde žhářů    * zachráníme životy lidí a zvířat    * ušetříme peníze    * neuvolníme CO2 a klimatu* Tomu se říká synergie.  V tomto cvičení se pokusíme identifikovat státy které potencionálně trpí přemírou žhářství. ------ Pokud je toto tvůj první Jupyter Notebook:* Každá buňka se provede po stisknutí Shift-Enter, musíš v ní mít ale kurzor.* Po úspěšném proběhnutí buňky se objeví alevo od ní "pořadové" číslo průběhu.* Pro provedení buňky a vytvoření nové prázdné pod ní, tiskni Alt-Enter.* Jakýkoli text za znakem  je komentář a Python ho ignoruje až do konce řádku.* Pozor: Pokud proběhneš prázdnou buňku, která má pod sebou výstup jako nápovědu, nápověda ti zmizí, proto Alt-Enter.------<jupyter_code># import potřebných modulů Pythonu
import pandas as pd  # asi nejpoužívanější modul pro analýzu velkáho množství tabulkových dat.
import wbgapi as wb  # modul, který umožňuje přímo importovat statistiky ze světové banky pomocí její API

import matplotlib.pyplot as plt  # Standartní modul pro kreslení grafů
from matplotlib_venn import venn2, venn3  # specifický modul na vykreslení Vennových diagramů<jupyter_output><empty_output><jupyter_text>Poznámka:* U těchto typů úloh, mít přesná a důvěryhodná data je časově náročné.* I tak si nemůžeme být jisti, že jsou data naprosto správná.* Mimoto, některá data prostě nejsou k dipozici (tímto se níže zabývat moc nebudeme)* Nicméně, jak důležité si myslíte, že je mít k dispozici data ze všech částí světa pro jeho udržitelný a spravedlivý rozvoj? Všechna tato fakta jsou nesmírně důležitá, hlavně se zodpovědností pozice ambasadora OSN.---  Pro ulehčení jsme pro vás již data našli a z různých zdrojů nakombinovali:* Vědecky zanalizovaná data from pozorování satelitů MODIS slouží jako podklad k:    1. Rozsah lesních porostů každého státu, shrnutého do jednoho čísla (plochy v hektarech, ha).     2. Spálené lesy mezi lety 2012-2020 (roky sečteny opět do jedné hodnoty v ha)  Poznámky k tabulkovým datům.* Vědecky zanalizovaná data from pozorování satelitů MODIS slouží jako podklad k:    1. MODIS je zkratkou pro Moderate Resolution Imaging Spectroradiometer (přístroj na palubě NASA satelitů Terra a Aqua)    2. Ta jsou dostupná například na stránkách Global Forest Watch ([GFW](https://www.globalforestwatch.org/dashboards/global/?burnedAreaCumulative=eyJzdGFydEluZGV4IjowLCJlbmRJbmRleCI6NTEsInN0YXJ0RGF0ZUFic29sdXRlIjoiMjAyMS0wMS0wNCIsImVuZERhdGVBYnNvbHV0ZSI6IjIwMjEtMTItMjcifQ%3D%3D&burnedAreaRanked=eyJoaWdobGlnaHRlZCI6ZmFsc2V9&category=fires&dashboardPrompts=eyJzaG93UHJvbXB0cyI6dHJ1ZSwicHJvbXB0c1ZpZXdlZCI6WyJ2aWV3TmF0aW9uYWxEYXNoYm9hcmRzIiwiZG93bmxvYWREYXNoYm9hcmRTdGF0cyIsInNoYXJlV2lkZ2V0Iiwid2lkZ2V0U2V0dGluZ3MiXSwic2V0dGluZ3MiOnsic2hvd1Byb21wdHMiOnRydWUsInByb21wdHNWaWV3ZWQiOlsidmlld05hdGlvbmFsRGFzaGJvYXJkcyIsImRvd25sb2FkRGFzaGJvYXJkU3RhdHMiLCJzaGFyZVdpZGdldCJdLCJzZXR0aW5ncyI6eyJzaG93UHJvbXB0cyI6dHJ1ZSwicHJvbXB0c1ZpZXdlZCI6WyJ2aWV3TmF0aW9uYWxEYXNoYm9hcmRzIiwiZG93bmxvYWREYXNoYm9hcmRTdGF0cyIsInNoYXJlV2lkZ2V0Il0sInNldHRpbmdzIjp7InNob3dQcm9tcHRzIjp0cnVlLCJwcm9tcHRzVmlld2VkIjpbInZpZXdOYXRpb25hbERhc2hib2FyZHMiLCJkb3dubG9hZERhc2hib2FyZFN0YXRzIl0sInNldHRpbmdzIjp7Im9wZW4iOmZhbHNlLCJzdGVwSW5kZXgiOjAsInN0ZXBzS2V5IjoiIn0sIm9wZW4iOnRydWUsInN0ZXBJbmRleCI6MCwic3RlcHNLZXkiOiJzaGFyZVdpZGdldCJ9LCJzdGVwc0tleSI6InNoYXJlV2lkZ2V0Iiwic3RlcEluZGV4IjowLCJvcGVuIjpmYWxzZSwiZm9yY2UiOnRydWV9LCJvcGVuIjp0cnVlLCJzdGVwSW5kZXgiOjAsInN0ZXBzS2V5Ijoid2lkZ2V0U2V0dGluZ3MifSwic3RlcHNLZXkiOiJ3aWRnZXRTZXR0aW5ncyIsImZvcmNlIjp0cnVlfQ%3D%3D&fireAlertStats=eyJjb21wYXJlWWVhciI6MjAxM30%3D&gfwfires=true&location=WyJnbG9iYWwiXQ%3D%3D&map=<KEY>))    3. Sloupec 'plocha_lesa_ha' pro každou zem, pro jednoduchost jen jedna hodnota v ha.    4. Sloupec 'spal_plocha_ha' značí spálenou plochu lesa mezi roky 2012-2020 (roky sečteny opět do jedné hodnoty v ha)* Změny teploty mohou být také důvodem zhoršení požárů, teplotní změny jsou dostupné z Food and Agriculture Organization při OSN [FAO](http://www.fao.org/faostat/en/data/ET)    1. Tam jsou teplotní změny uvedeny v porovnání s úrovní mezi roky 1951-1980.    2. Data  jsou původně za každý měsíc pro všechny roky.    3. My jsme je tedy zprůměrovali mezi lety 2012-2020 do jedné hodnoty ve sloupci 'zmena_t'* Úbytek srážek může být dalším důvodem k požárům    1. Proto máme sloupec Therefore we have column 'prum_srazky_mm_rok' v mm za rok (opět jedna hodnota pro každý stát)    2. Ke stažení [OSN data](http://data.un.org/Data.aspx?d=CLINO&f=ElementCode%3A06)* Úroveň rozvoje dané země bude nesmírně důležitá v její schopnosti zabývat se žhářstvým.    1. Jedním z názorných ukazatelů je HDP na obyvatele (za rok 2020) v dolarech (sloupec 'hdp_per_capita')    2. Data získána ze stránek [Světové banky](https://data.worldbank.org/indicator)* K porovnání můžeme například použít příslušnost ke kontinentu.* Nebo také použít rozdělení do 4 úrovní popsané [Hansem Roslingem](https://www.gapminder.org/factfulness-book/) and [Gapminder](https://www.gapminder.org/), která nahrazuje zastaralé vnímání světa jako chudý jih a bohatý sever.    1. Soupec 'hdp_uroven'.  Načtení předpřipravených dat ve formátu .csv<jupyter_code>df = pd.read_csv('data_pozary.csv')
df.set_index('iso', inplace=True)
df.head()<jupyter_output><empty_output><jupyter_text>Najdeme zlomek shořelých lesů pro každý stát<jupyter_code>df['zlomek_spaleno'] = df['spal_plocha_ha']/df['plocha_lesa_ha']
df.head()<jupyter_output><empty_output><jupyter_text>Podívejme se nejdřív na Evropu Kvantily* Kvantil je hodnota, která rozděluje soubor hodnot na dvě části v poměru hodnoty kvantilu* Příklad: kvantil(0.6) je hodnota, kdy 60% hodnot je meších, a 40% hodnot je větších než hodnota kvantilu<jupyter_code># vyber evropské země: Region=='Europe'
df_evropa = df[df.Region=='Europe']
# spálené lesy
velky_spal_limit = df_evropa.zlomek_spaleno.quantile(0.7)  # hodnota rozděluje 30% států, které mají největší zlomek spálenišť
velky_spal_df = df_evropa[df_evropa.zlomek_spaleno > velky_spal_limit]  # vyber těch 30% států pomocí: sloupec > kvantil
mnoz_velky_spal = set(velky_spal_df.index)  # převod tabulky na množinu
# stejný postup pro změnu teploty
# Státy, které netrpí přílišným nárůstem teploty
zmena_t_limit = df_evropa.zmena_t.quantile(0.5)
ne_velka_zmena_t_df = df_evropa[df_evropa.zmena_t < zmena_t_limit] # opačné znamínko 
mnoz_ne_velka_zmena_t = set(ne_velka_zmena_t_df.index)
# Ne příliš nízké srážky
srazky_limit = df_evropa.prum_srazky_mm_rok.quantile(0.5)
ne_nizke_srazky_df = df_evropa[df_evropa.prum_srazky_mm_rok > srazky_limit]
mnoz_ne_nizke_srazky = set(ne_nizke_srazky_df.index)<jupyter_output><empty_output><jupyter_text>Pozn: Není žádné striktní pravidlo, jaké hodnoty kvantilů použít, neboj se experimentovat<jupyter_code># průnik dvou množin
# Země, které mají velký spal 'a zároveň' nemají přílišný nárůst teploty, který by spal objasnil.
prunik2 = mnoz_velky_spal.intersection(mnoz_ne_velka_zmena_t)
# použitím metody .loc na náš df, můžeme vypsat státy z prunik2
df.loc[prunik2]<jupyter_output><empty_output><jupyter_text>Teplota je jen jedním z faktorů* Extrémně nízké srážky také mohou vysvětlit velký spal* Přidejme podmínku, že srážky nemohou být příliš nízké* Těď logicky říkáme: velký spal 'a zároveň' ne velký nárůst teploty 'a zároveň' ne nízké srážky<jupyter_code># průnik 3 množin
prunik3 = mnoz_velky_spal.intersection(mnoz_ne_velka_zmena_t).intersection(mnoz_ne_nizke_srazky)
# výpis států z původního df
df.loc[prunik3]
# Pro zajímavost si vypišme státy s velkým podílem spálenišť
df.loc[mnoz_velky_spal].Stat<jupyter_output><empty_output><jupyter_text>Znázornění Vennova diagramu* Použitím funkcí z modulu matplotlib_venn, jak naše množiny sdílejí prvky (Státy)<jupyter_code>plt.figure(figsize=(6,4))
venn3([mnoz_velky_spal, mnoz_ne_velka_zmena_t, mnoz_ne_nizke_srazky],  
      set_labels=('Velký spal', 'Nízký nárůst tepl.', 'Ne nízké srážky'),
      alpha=0.5)
plt.title('Evropské státy s velkými požáry', fontsize=16)
plt.show()<jupyter_output><empty_output><jupyter_text>* Naší motivací bylo najít průnik všech tří množin, znázorněný tmavo-fialově.* Kombinací množinových operací UNION/INTERSECTION můžeme nalézt státy z ostatních podmnožin našeho Vénova diagramu* Co logicky znamenají, a jsou potencionálně užitečné ambasadorovi při OSN? ------ Porovnávání všech zemí najednou je nejspíš špatný nápad, vzhledem k jejich mnoha rozdílům.* Opět neexistuje univerzální odpověď, jak státy seskupovat, zvažte například tyto možnosti:  * Úroveň rozvoje (HDP)  * Geografie  * Klima  * A mnoho dalších* Zde vyzkouším rozdělení Států podle HDP na hlavu (per capita), pro porovnání požárů v podobně rozvinutých zemích* Výše jsme porovnávali evropsé státy, což je možné díky malé velikosti evropy a integraci v rámci EU------  Jak tedy rozdělit státy dle HDP per capita?<jupyter_code># použitím modulu wb, můžeme do sešitu natáhnout tabulková data přímo ze Světové banky
hdp = wb.data.DataFrame('NY.GDP.PCAP.CD', time=2020)
hdp.index.names = ['iso']  # přejmenovat index
df = df.merge(hdp, on='iso')  # sjednotit tabulku hdp s naším df na základě identifikátoru 'iso' (index naší tabulky)
# přejmenovat hdp sloupec
df = df.rename(columns={'NY.GDP.PCAP.CD':'hdp_per_capita_dolary'})
df.head()
# Vypišme na ukázku, kolik dolarů na rok (a míň) musí v průměru vyjít lidé v 10% nejchhudších zemí?
# ANO, opět je to kvantil
df['hdp_per_capita_dolary'].quantile(0.1)
# V dolarech na den
df['hdp_per_capita_dolary'].quantile(0.1)/365<jupyter_output><empty_output><jupyter_text>Pokud je člověk v extrémní chudobě, musí vyžít s méně než 2 dolary na den. * Jak píšeme v úvodu, svět se již nerozděluje na chudý jih a bohatý sever (jako v roce 1960), ale spíš do 4 různých úrovní bohatství* Úrovně začínají na extémní chudobě s 2$ na den, a pak s násobky 4 následují další úrovně* Takže dělící úrovně jsou 2, 8, 32 dolarů na den* V jaké úrovni se nacházíš ty?<jupyter_code># Musíme tedy přidat ke každé zemi její úroveň hdp
# Nejdřív udělme všem zemím úroveň 4
df['hdp_uroven'] = 4
# Teď postupně projdeme df a pokud je hdp per capita nižší než .., snížíme úroveň o jedna
# hdp v tabulce je za rok, takže musíme úrovně násobit počtem dní v roce
df.loc[df['hdp_per_capita_dolary'] < 365*32, 'hdp_uroven'] = 3
df.loc[df['hdp_per_capita_dolary'] < 365*8, 'hdp_uroven'] = 2
df.loc[df['hdp_per_capita_dolary'] < 365*2.5, 'hdp_uroven'] = 1
# A je to
df.head()
# Kolik Států (řádků) máme v df
len(df)
# Vynecháme státy, kde nějaké hodnoty chybí
# Profesionální by ovšem bylo najít dodatečné zdroje chybějících dat
df.dropna(inplace=True)
# Ze 195 států bohužel v naší studii ignorujeme mnoho lidí světa
len(df)
# Kolik zemí na té které HDP úrovni mamé v naší tabulce? 
# Najdeme pomocí metody value_counts(), kterou aplikujeme na sloupec hdp_uroven
df.hdp_uroven.value_counts()<jupyter_output><empty_output><jupyter_text>Analýza požárů pro státy úrovně 1* Zde opakujeme přesně stejné kroky jako pro Evropu* S výhodou že pracujeme se všemi státy světa, rozdělených dle HDP<jupyter_code>df_l1 = df[df['hdp_uroven']==1]
# velké spáleniště
velky_spal_limit = df_l1.zlomek_spaleno.quantile(0.7)
velky_spal_df = df_l1[df_l1.zlomek_spaleno > velky_spal_limit]
mnoz_velky_spal = set(velky_spal_df.index)
# Státy, které netrpí přílišným nárůstem teploty
zmena_t_limit = df_l1.zmena_t.quantile(0.5)
ne_velka_zmena_t_df = df_l1[df_l1.zmena_t < zmena_t_limit] # opačné znamínko 
mnoz_ne_velka_zmena_t = set(ne_velka_zmena_t_df.index)
# Ne příliš nízké srážky
srazky_limit = df_l1.prum_srazky_mm_rok.quantile(0.5)
ne_nizke_srazky_df = df_l1[df_l1.prum_srazky_mm_rok > srazky_limit]
mnoz_ne_nizke_srazky = set(ne_nizke_srazky_df.index)
prunik2 = mnoz_velky_spal.intersection(mnoz_ne_velka_zmena_t)
df.loc[prunik2]
prunik3 = mnoz_velky_spal.intersection(mnoz_ne_velka_zmena_t).intersection(mnoz_ne_nizke_srazky)
df.loc[prunik3]
plt.figure(figsize=(6,4))
venn3([mnoz_velky_spal, mnoz_ne_velka_zmena_t, mnoz_ne_nizke_srazky],
      set_labels=('Velký spal', 'Nízký nárůst tepl.', 'Ne nízké srážky'),
      alpha=0.5)
plt.title('Požáry pro státy urovně 1', fontsize=16)
plt.show()<jupyter_output><empty_output><jupyter_text>Závěr pro úroveň 1:* Zdá se, že žádný stát nevystupuje z řady, kdy by zaznamenal příliš požárů při mírném klimatu* Požáry v Mali a Chadu se dají vysvětlit nízkými srážkami  Analýza požárů pro státy úrovně 2<jupyter_code>df_l2 = df[df['hdp_uroven']==2]
# velké spáleniště
velky_spal_limit = df_l2.zlomek_spaleno.quantile(0.7)
velky_spal_df = df_l2[df_l2.zlomek_spaleno > velky_spal_limit]
mnoz_velky_spal = set(velky_spal_df.index)
# Státy, které netrpí přílišným nárůstem teploty
zmena_t_limit = df_l2.zmena_t.quantile(0.5)
ne_velka_zmena_t_df = df_l2[df_l2.zmena_t < zmena_t_limit] # opačné znamínko 
mnoz_ne_velka_zmena_t = set(ne_velka_zmena_t_df.index)
# Ne příliš nízké srážky
srazky_limit = df_l2.prum_srazky_mm_rok.quantile(0.5)
ne_nizke_srazky_df = df_l2[df_l2.prum_srazky_mm_rok > srazky_limit]
mnoz_ne_nizke_srazky = set(ne_nizke_srazky_df.index)
prunik2 = mnoz_velky_spal.intersection(mnoz_ne_velka_zmena_t)
df.loc[prunik2]
prunik3 = mnoz_velky_spal.intersection(mnoz_ne_velka_zmena_t).intersection(mnoz_ne_nizke_srazky)
df.loc[prunik3]
plt.figure(figsize=(6,4))
venn3([mnoz_velky_spal, mnoz_ne_velka_zmena_t, mnoz_ne_nizke_srazky],
      set_labels=('Velký spal', 'Nízký nárůst tepl.', 'Ne nízké srážky'),
      alpha=0.5)
plt.title('Požáry pro státy urovně 2', fontsize=16)
plt.show()<jupyter_output><empty_output><jupyter_text>Závěr pro úroveň 2:* Nízké srážky neospravedlňují požáry v žádné zemi z prunik2 * OSN ambasador by mohl zadat svým pracovníkům podívat se na tyto státy blíže.  Analýza požárů pro státy úrovně 3<jupyter_code>df_l3 = df[df['hdp_uroven']==3]
# velké spáleniště
velky_spal_limit = df_l3.zlomek_spaleno.quantile(0.7)
velky_spal_df = df_l3[df_l3.zlomek_spaleno > velky_spal_limit]
mnoz_velky_spal = set(velky_spal_df.index)
# Státy, které netrpí přílišným nárůstem teploty
zmena_t_limit = df_l3.zmena_t.quantile(0.5)
ne_velka_zmena_t_df = df_l3[df_l3.zmena_t < zmena_t_limit] # opačné znamínko 
mnoz_ne_velka_zmena_t = set(ne_velka_zmena_t_df.index)
# Ne příliš nízké srážky
srazky_limit = df_l3.prum_srazky_mm_rok.quantile(0.5)
ne_nizke_srazky_df = df_l3[df_l3.prum_srazky_mm_rok > srazky_limit]
mnoz_ne_nizke_srazky = set(ne_nizke_srazky_df.index)
prunik2 = mnoz_velky_spal.intersection(mnoz_ne_velka_zmena_t)
df.loc[prunik2]
prunik3 = mnoz_velky_spal.intersection(mnoz_ne_velka_zmena_t).intersection(mnoz_ne_nizke_srazky)
df.loc[prunik3]
plt.figure(figsize=(6,4))
venn3([mnoz_velky_spal, mnoz_ne_velka_zmena_t, mnoz_ne_nizke_srazky],
      set_labels=('Velký spal', 'Nízký nárůst tepl.', 'Ne nízké srážky'),
      alpha=0.5)
plt.title('Požáry pro státy urovně 3', fontsize=16)
plt.show()<jupyter_output><empty_output><jupyter_text>Závěr pro úroveň 3:* Nízké srážky vyřadily pouze Mexico.* OSN ambasador by se mohl blíže zaměřit na těchto 7 států.  Analýza požárů pro státy úrovně 4<jupyter_code>df_l4 = df[df['hdp_uroven']==4]
# velké spáleniště
velky_spal_limit = df_l4.zlomek_spaleno.quantile(0.7)
velky_spal_df = df_l4[df_l4.zlomek_spaleno > velky_spal_limit]
mnoz_velky_spal = set(velky_spal_df.index)
# Státy, které netrpí přílišným nárůstem teploty
zmena_t_limit = df_l4.zmena_t.quantile(0.5)
ne_velka_zmena_t_df = df_l4[df_l4.zmena_t < zmena_t_limit] # opačné znamínko 
mnoz_ne_velka_zmena_t = set(ne_velka_zmena_t_df.index)
# Ne příliš nízké srážky
srazky_limit = df_l4.prum_srazky_mm_rok.quantile(0.5)
ne_nizke_srazky_df = df_l4[df_l4.prum_srazky_mm_rok > srazky_limit]
mnoz_ne_nizke_srazky = set(ne_nizke_srazky_df.index)
prunik2 = mnoz_velky_spal.intersection(mnoz_ne_velka_zmena_t)
df.loc[prunik2]
prunik3 = mnoz_velky_spal.intersection(mnoz_ne_velka_zmena_t).intersection(mnoz_ne_nizke_srazky)
df.loc[prunik3]
plt.figure(figsize=(6,4))
venn3([mnoz_velky_spal, mnoz_ne_velka_zmena_t, mnoz_ne_nizke_srazky],
      set_labels=('Velký spal', 'Nízký nárůst tepl.', 'Ne nízké srážky'),
      alpha=0.5)
plt.title('Požáry pro státy urovně 4', fontsize=16)
plt.show()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.07604973869165615, 'fraction_numerical': 0.024448849642578242, 'mean_word_length': 6.650735294117647, 'pattern_counts': {'":': 0, '<': 62, '<?xml version=': 0, '>': 65, 'https://': 4, 'lorem ipsum': 0, 'www.': 4, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '13', 'dir': 'jupyter-structured-clean-dedup', 'id': '534673', 'license': 'MIT', 'n_tokens_mistral': 8514, 'n_tokens_neox': 8483, 'n_words': 1591, 'path': 'cz/03_mnoziny/pozary_final.ipynb', 'repo_name': 'palec87/pymarad-pilot', 'size': '16778'}