Skip to content

Commit 351c615

Browse files
authored
Úpravy lekcí o agregaci a vizualizacích (#107)
1 parent dc1279d commit 351c615

File tree

4 files changed

+19
-26
lines changed

4 files changed

+19
-26
lines changed

python-pro-data-1/agregace/agregace-a-razeni.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ food_other = pd.read_csv("food_other.csv")
99
# Sjednotíme tabulky o potravinách do jedné tabulky food
1010
food = pd.concat([food_sample_100, food_other], ignore_index=True)
1111
# Načteme data o výživných látkách
12-
food_other = pd.read_csv("food_nutrient.csv")
12+
food_nutrient = pd.read_csv("food_nutrient.csv")
1313
# Propojíme tabulky o potravinách a výživných látkách
1414
food_merged = pd.merge(food, food_nutrient, on="fdc_id")
1515
# Načteme tabulku o značkách potravin
@@ -35,7 +35,7 @@ food_merged_brands_protein = food_merged_brands[food_merged_brands["nutrient_nam
3535
Při agregaci se musíme nejprve rozhodnout, podle jakého sloupce chceme řádky sloučit. V našem případě to bude `branded_food_category`. Poté vybereme sloupec, jehož hodnoty mají být sloučeny, a početní operaci, která k tomu bude použita. Vybereme si sloupec `amount` (množství výživné látky) a operaci výpočtu aritmetického průměru (`.mean()`). Zápis je uvedený v řádku níže.
3636

3737
```py
38-
food_merged_brands_protein.groupby("branded_food_category")["amount"].mean()
38+
food_merged_brands_protein_agg = food_merged_brands_protein.groupby("branded_food_category")["amount"].mean()
3939
```
4040

4141
Ve výsledné tabulce vidíme průměrné množství proteintů v jednotlivých kategoriích potravin.
@@ -64,5 +64,5 @@ Dále se pojďme podívat, které kategorie potravin obsahuje v průměru nejví
6464
Při řazení dat v původní tabulce je třeba uvést, podle jakého sloupečku chceme data seřadit. Název sloupce nebo sloupců zadáváme jako první parametr. Pokud chceme řadit podle více sloupců, vložíme jejich názvy do seznamu.
6565

6666
```py
67-
food_merged_brands_protein_agg.sort_values("amount", ascending=False)
67+
food_merged_brands_protein_agg.sort_values(ascending=False)
6868
```

python-pro-data-1/agregace/excs/tuky.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ title: Lipidy a tuky
33
demand: 3
44
---
55

6-
Podívej se nyní na to, které kategorie potravin obsahují nejvíce lipidů (tuků). Nejprve pomocí dotazu vytvořit novou tabulku `food_merged_brands_lipid`, do které pomocí dotazu vlož pouze řádky, které mají jako název výživné látky hodnotu `Total lipid (fat)`. Poté proveď agregaci podle návu kategorie a seřaď výslednou tabulku tak, aby nahoře byly vidět kategorie s největším počtem tuků. Porovnej si výslednou tabulku s tabulkou `food_merged_brands_protein_agg`, kterou jsme vytvořili v rámci lekce. Podívej se, zda se některé kategorie objevují v obou tabulkách.
6+
Podívej se nyní na to, které kategorie potravin mají nejvyšší průměrné množství tuků. Nejprve pomocí dotazu vytvořit novou tabulku `food_merged_brands_lipid`, do které pomocí dotazu vlož pouze řádky, které mají jako název výživné látky hodnotu `Total lipid (fat)`. Poté proveď agregaci podle návu kategorie s tím, že vypočítej průměrné množství tuků. Výslednou tabulku seřaď sestupně.

python-pro-data-1/agregace/excs/vyrobci.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ title: Výrobci a kategorie
33
demand: 3
44
---
55

6-
Nyní uvažuj, že si chceme udělat přehled o tom, jaký výrobce produkuje jaké typy potravin. Proveď agregaci tabulky `food_merged_brands` podle dvou sloupců: `brand_owner` a `branded_food_category`. Sloupce musíš metodě `food_merged_brands` zadat jako seznam, tj. musíš použít hranaté závorky. Dále vyber sloupec `fdc_id` pro provedení agregace a použij agregaci `nunique()`, který vrátí počet unikátních hodnot. Nakonec použij metodu `sort_values` s tím, že chceš data seřadit sestupně.
6+
Nyní uvažuj, že si chceme udělat přehled o tom, jaký výrobce produkuje jaké typy potravin. Proveď agregaci tabulky `food_merged_brands` podle dvou sloupců: `brand_owner` a `branded_food_category`. Sloupce musíš metodě `groupby` zadat jako seznam, tj. musíš použít hranaté závorky. Dále vyber sloupec `fdc_id` pro provedení agregace a použij agregaci `nunique()`, která vrátí počet unikátních hodnot. Nakonec použij metodu `sort_values` s tím, že chceš data seřadit sestupně.

python-pro-data-1/vizualizace/vizualizace.md

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,23 @@ food = pd.concat([food_sample_100, food_other])
1717
food_brands = pd.merge(food, branded_food, on="fdc_id")
1818

1919
top_cat_list = ['Candy', 'Popcorn, Peanuts, Seeds & Related Snacks', 'Cheese', 'Ice Cream & Frozen Yogurt', 'Chips, Pretzels & Snacks', 'Cookies & Biscuits', 'Pickles, Olives, Peppers & Relishes', 'Breads & Buns', 'Fruit & Vegetable Juice, Nectars & Fruit Drinks', 'Snack, Energy & Granola Bars', 'Chocolate', 'Other Snacks']
20-
food_top_cat = food_brands[food_brands["branded_food_category"].isin(top_cat_list)]
20+
food_brands = food_brands[food_brands["branded_food_category"].isin(top_cat_list)]
2121
```
2222

2323
Graf vytvoříme pomocí funkce `countplot`. Jako první hodnotu zadáme název tabulku s daty a jako parametr `x` název sloupce, podle kterého se vygenerují sloupce grafu. V předchozí lekci to odpovídalo sloupci, který jsme zadávali do metody `groupby()`. Výsledek uložíme do proměnné `ax`. Jde o zkratku slova axis, která obsahuje odkaz na vytvořený graf. Pomocí metody `tick_params()` otočíme popisky osy *x* o 90 stupňů, protože jinak by se popisy vzájemně překrývaly.
2424

2525
```py
26-
ax = sns.countplot(food_top_cat, x="branded_food_category")
26+
ax = sns.countplot(food_brands, x="branded_food_category")
2727
ax.tick_params(axis='x', rotation=90)
2828
```
2929

30-
Pokud píšeme program jako skript, je nutné ještě přidat řádek `plt.show()`. Ten zajistí, že se graf zobrazí v samostatném okně. Pozor ale na to, že program se pozastaví, dokud okno s grafem neuzavřeme. Pokud používáme Jupyter notebook, tento řádek přidávat nemusíme.
30+
Alternativní možností je zobrazení grafu "naležato".
31+
32+
```py
33+
ax = sns.countplot(food_brands, y="branded_food_category")
34+
```
35+
36+
Pokud píšeme program jako skript, je nutné ještě přidat řádek `plt.show()` a do importů přidat `import matplotlib.pyplot as plt`. Ten zajistí, že se graf zobrazí v samostatném okně. Pozor ale na to, že program se pozastaví, dokud okno s grafem neuzavřeme. Pokud používáme Jupyter notebook, tento řádek přidávat nemusíme.
3137

3238
Vygenerovaný graf je poměrně špatně čitelný. Můžeme ale zkusit názvy kategorií zkrátit. V rámci toho rovnou provedeme překlad do češtiny. K přejmenování použijeme metodu `.replace()`. Hodnoty můžeme vložit jako slovník. Vložíme do něj původní hodnotu a jejích náhradu, obojí opět oddělíme dvojtečkou. Protože chceme přejmenovat více hodnot, vložíme více dvojic, které oddělíme čárkou.
3339

@@ -46,15 +52,12 @@ food_brands["branded_food_category"] = food_brands["branded_food_category"].repl
4652
"Chocolate": "Čokoláda",
4753
"Other Snacks": "Další snacky"
4854
})
49-
food_list = ["Cukrovinky", "Slané snacky", "Sýry", "Zmrzlina", "Chipsy", "Sušenky", "Nakl. zelenina", "Pečivo", "Džusy", "En. tyčinky", "Čokoláda", "Další snacky"]
50-
food_top_cat = food_brands[food_brands["branded_food_category"].isin(top_cat_list)]
5155
```
5256

5357
Po přejmenování kategorií stačí otočit popisky o 45 stupňů, takže budou lépe čitelné.
5458

5559
```py
56-
ax = sns.countplot(food_top_cat, x="branded_food_category")
57-
ax.tick_params(axis='x', rotation=45)
60+
sns.countplot(food_brands, y="branded_food_category")
5861
```
5962

6063
Pokud bychom chtěli graf zveřejnit například v nějakém článku, je vhodné jej doplnit o popisky. K tomu využijeme metodu `set`, které nastavíme následující parametry:
@@ -64,7 +67,7 @@ Pokud bychom chtěli graf zveřejnit například v nějakém článku, je vhodn
6467
- `title` nastaví titulek grafu.
6568

6669
```py
67-
ax = sns.countplot(food_top_cat, x="branded_food_category")
70+
ax = sns.countplot(food_brands, x="branded_food_category")
6871
ax.tick_params(axis='x', rotation=45)
6972
ax.set(xlabel="Kategorie", ylabel="Počet potravin", title="Počty potravin ve 12 nejpočetnějších kategoriích")
7073
```
@@ -95,8 +98,7 @@ ax.set(xlabel="Množství proteinu (g)", ylabel="Počet potravin", title="Množs
9598
Dále se můžeme podívat, jak se liší průměrné množství proteinu pro jednotlivé kategorie potravin. K tomu slouží `barplot`. Ten vypočte průměrné hodnoty dle sloupce, který zadáme jako parametr `x`. Parametr `y` udává, ze kterého sloupce se vypočítá průměr, který udává výšku sloupců. Černá čára v grafu je označovaná jako `errorbar`. Vychází z předpokladu, že v datech máme vždy jen vzorek dat, například v našich datech je jen část potravin, které jsou na trhu k dostání. Sloupec, který udává výšku sloupce, je tedy v podstatě jen odhadem hodnoty, kterou bychom zjistili, pokud bychom analyzovali všechny dostupné potraviny na trhu. Černá čára pak udává tzv. interval spolehlivosti, tedy interval, ve kterém by se ten průměr nacházel s pravděpodobností 95 %.
9699

97100
```py
98-
food_brands_nut = pd.merge(food_brands, food_nutrient, on="fdc_id")
99-
ax = sns.barplot(food_brands_nut, x="branded_food_category", y="amount")
101+
ax = sns.barplot(food_merged_brands_protein, y="branded_food_category", x="amount")
100102
ax.tick_params(axis='x', rotation=45)
101103
ax.set(xlabel="Kategorie", ylabel="Množství proteinu (g)", title="Průměrné množství proteinů v potravinách")
102104
```
@@ -105,20 +107,11 @@ Další z oblíbených grafů je krabicový graf :term{cs="krabicový graf" en="
105107

106108
- Černá čára uprostřed udává průměr. Průměrná hodnota pro obě látky je tedy přibližně stejná.
107109
- Modré obdélníky udávají rozsah, ve kterém se nachází 50 % hodnot. Dolní hrana obdélníku odděluje 25 % nejmenších hodnot od zbývajících 75 %. Horní hrana obdélníku odděluje 75 % nejmenších hodnot od zbývajících 25 %. Tento obdélník ukazuje různorodost dat. Na našem příkladu vidíme, že z pohledu množství proteinů jsou jednotlivé energetické tyčinky více různorodé než z pohledu množství lipidů (tuků).
108-
- Černé čáry jsou označované jako *whisker* (kočičí vousy). V našem případě fungují podobně jako obdélník, ale oddělují vždy 5 % nejmenších a největších hodnot od zbývajících 90 %.
110+
- Černé čáry jsou označované jako *whisker* (kočičí vousy). V našem případě fungují podobně jako obdélník, ale oddělují vždy 5 % nejmenších a největších hodnot od zbývajících 90 % (tj. od 95 % výše).
109111
- Zbývajících 10 % hodnot je vykresleno pomocí černých teček.
110112

111113
Aby byl graf celý v jednom jazyce, pojďme nejprve přejmenovat názvy výživných látek do češtiny
112114

113115
```py
114-
food_merged_brands["nutrient_name"] = food_merged_brands["nutrient_name"].replace({
115-
"Total lipid (fat)": "Lipid (tuk)",
116-
"Protein": "Protein"
117-
})
118-
```
119-
120-
```py
121-
food_merged_brands_box = food_merged_brands[(food_merged_brands["nutrient_name"].isin(["Proteiny", "Lipidy (tuky)"])) & (food_merged_brands["branded_food_category"] == "Snack, Energy & Granola Bars")]
122-
ax = sns.boxplot(food_merged_brands_box, x="nutrient_name", y="amount", whis=[5, 95])
123-
ax.set(xlabel="Kategorie", ylabel="Množství v gramech", title="Množství proteinů a lipidů (tuků) v potravinách")
116+
ax = sns.boxplot(food_merged_brands_protein, y="branded_food_category", x="amount", whis=[5, 95])
124117
```

0 commit comments

Comments
 (0)