|
| 1 | +# Případová studie – Titanic |
| 2 | + |
| 3 | +## Obsah |
| 4 | + |
| 5 | + |
| 6 | +[**Krok 1: Obchodní porozumění**](#Step-1:-Obchodní-porozumění) |
| 7 | + |
| 8 | +[**Krok 2: Porozumění údajům**](#Step-2:-Porozumění-údajům) |
| 9 | + |
| 10 | +- [**Načíst data**](#Načíst-data) |
| 11 | +- [**Kontrola kvality dat**](#Kontrola-kvality-dat) |
| 12 | +- [**Průzkumná analýza dat-EDA**](#Průzkumná-analýza-dat---EDA) |
| 13 | + |
| 14 | +[**Krok 3: Příprava dat**](#Krok-3:-Příprava dat) |
| 15 | +- [**Vypořádejte se s chybějícími daty**](#Vypořádejte-se-s-chybějícími-daty) |
| 16 | +- [**Funkce inženýrství**](#funkce-inženýrství) |
| 17 | + |
| 18 | +[**Krok 4: Modelování**](#Krok-4:-Modelování) |
| 19 | + |
| 20 | +[Zpět na začátek](#Obsah) |
| 21 | + |
| 22 | +## Krok 1: Obchodní porozumění |
| 23 | +Tato počáteční fáze se zaměřuje na pochopení cílů a požadavků projektu z obchodní perspektivy a poté na převedení těchto znalostí do definice problému dolování dat a předběžného plánu navrženého k dosažení cílů. |
| 24 | +#### Příběh Titaniku |
| 25 | +Potopení RMS Titanic je jedním z nejneslavnějších vraků v historii. 15. dubna 1912, během své první plavby, se Titanic potopil po srážce s ledovcem a zabil 1502 z 2224 cestujících a posádky. Tato senzační tragédie šokovala mezinárodní společenství a vedla k lepším bezpečnostním předpisům pro lodě. |
| 26 | + |
| 27 | +Jedním z důvodů, proč ztroskotání vedlo k takovým ztrátám na životech, byl nedostatek záchranných člunů pro cestující a posádku. I když přežití potopení zahrnovalo určitý prvek štěstí, některé skupiny lidí měly větší šanci na přežití než jiné, jako jsou ženy, děti a cestující z vyšší třídy. |
| 28 | + |
| 29 | +#### Cíl |
| 30 | +V této výzvě dokončíme analýzu toho, jaké druhy lidí pravděpodobně přežijí. |
| 31 | + |
| 32 | +Kromě toho vytvoříme regresní model pro predikci ceny letenky (jízdného). |
| 33 | + |
| 34 | + |
| 35 | +[Zpět na začátek](#Obsah) |
| 36 | + |
| 37 | +## Krok 2: Porozumění datům |
| 38 | +Fáze porozumění datům začíná počátečním sběrem dat a pokračuje činnostmi s cílem seznámit se s daty, identifikovat problémy s kvalitou dat, objevit první pohledy na data nebo odhalit zajímavé podmnožiny za účelem vytvoření hypotéz o skrytých informacích. Tento krok se často kombinuje s dalším krokem, přípravou dat. |
| 39 | +### Datový slovník |
| 40 | +Data jsou v souboru csv ```titanic.csv```. |
| 41 | + |
| 42 | +| Proměnná | Definice | Klíč | |
| 43 | +| --- | --- | --- | |
| 44 | +| survival | Přežití | 0 = ne, 1 = ano | |
| 45 | +| pclass | Třída vstupenek | 1 = 1., 2 = 2., 3 = 3. | |
| 46 | +| sex | Sex | muž/žena | |
| 47 | +| Age | Věk | v letech | |
| 48 | +| sibsp | Počet sourozenců / manželů na palubě Titaniku | | |
| 49 | +| parch | Počet rodičů / dětí na palubě Titaniku | | |
| 50 | +| ticket | Číslo lístku | | |
| 51 | +| fare | Jízdné pro cestující | | |
| 52 | +| cabin | Číslo kabiny | | |
| 53 | +| embarked | Přístav nalodění | C = Cherbourg, Q = Queenstown, S = Southampton | |
| 54 | + |
| 55 | +**Poznámky proměnných** |
| 56 | +- pclass: proxy pro socioekonomický status (SES) |
| 57 | + - 1. = horní |
| 58 | + - 2. = střední |
| 59 | + - 3. = nižší |
| 60 | + |
| 61 | +- věk: Věk je zlomek, pokud je menší než 1. Pokud je věk odhadován, je ve tvaru xx.5 |
| 62 | + |
| 63 | +- sibsp: Dataset definuje rodinné vztahy tímto způsobem... |
| 64 | +- Sibling (Sourozenec) = bratr, sestra, nevlastní bratr, nevlastní sestra |
| 65 | +- Spouse (Manžel) = manžel, manželka (milenky a snoubenci byli ignorováni) |
| 66 | + |
| 67 | +- parch: Dataset definuje rodinné vztahy tímto způsobem... |
| 68 | + - Rodič = matka, otec |
| 69 | + - Dítě = dcera, syn, nevlastní dcera, nevlastní syn |
| 70 | + - Některé děti cestovaly pouze s chůvou, proto pro ně parch=0. |
| 71 | + |
| 72 | + |
| 73 | +### Načíst data |
| 74 | + |
| 75 | +Tato datová sada je v titanic.csv. Ujistěte se, že je soubor v aktuální složce. |
| 76 | + |
| 77 | +import pandas as pd |
| 78 | +import matplotlib.pyplot as plt |
| 79 | +import piplite |
| 80 | +await piplite.install('seaborn') |
| 81 | +import seaborn as sns |
| 82 | +import warnings |
| 83 | +warnings.filterwarnings('ignore') |
| 84 | +%matplotlib inline |
| 85 | +df_titanic = pd.read_csv('titanic.csv') |
| 86 | +df_titanic.head() |
| 87 | + |
| 88 | +### Zkontrolujte kvalitu dat |
| 89 | +Zkontrolujte kvalitu dat. Nejběžnější kontrolou je kontrola chybějících hodnot. Můžeme provést základní čištění dat, jako je čištění pole měn. |
| 90 | +- Zkontrolujte nulové hodnoty |
| 91 | +- Pole měny je třeba převést na plovoucí, odstranit '$' nebo ',', někdy je záporná hodnota uzavřena v () |
| 92 | + |
| 93 | +##### Úkol 1: Podívejte se na základní informace o datovém rámci |
| 94 | + |
| 95 | +Nápověda: funkce info(). |
| 96 | +Diskutujte o chybějících hodnotách v datovém rámci. |
| 97 | +df_titanic.info() |
| 98 | +#Další způsob, jak zobrazit počet chybějících hodnot v každém sloupci |
| 99 | +df_titanic.isnull().sum() |
| 100 | +##### Úkol 2: Vyčistit jízdné, převést na plovoucí |
| 101 | +Odstraňte "$" z Fare, převeďte datový typ na float. |
| 102 | +# uklidit Fare, převést na float |
| 103 | +df_titanic.Fare = df_titanic.Fare.str.replace('$','') |
| 104 | +df_titanic['Fare'] = df_titanic.Fare.astype(float) |
| 105 | +df_titanic.head() |
| 106 | +##### Úkol 3: Podívejte se na statistiky Numeric Columns |
| 107 | + |
| 108 | +Funkce Hint:describe(). |
| 109 | + |
| 110 | +Diskutujte: |
| 111 | +- Věk, SibSp, Parch, statistiky jízdného |
| 112 | +- Co znamená Přežil? |
| 113 | +df_titanic.describe() |
| 114 | +### Průzkumná analýza dat - EDA |
| 115 | +EDA je přístup k analýze souborů dat za účelem shrnutí jejich hlavních charakteristik, často pomocí vizuálních metod. |
| 116 | + |
| 117 | +#### Typy funkcí |
| 118 | +##### Kategorické vlastnosti: |
| 119 | +Kategorická proměnná je taková, která má dvě nebo více kategorií a každá hodnota v tomto rysu může být podle nich kategorizována. Například pohlaví je kategorická proměnná, která má dvě kategorie (muž a žena). Nyní nemůžeme třídit ani dávat žádné resp |
| 120 | +vzhledem k takovým proměnným. Jsou také známé jako nominální proměnné. |
| 121 | + |
| 122 | +Kategorické funkce v datové sadě: Sex,Embarked. |
| 123 | + |
| 124 | +##### Souvislá funkce: |
| 125 | +Prvek se nazývá spojitý, pokud může nabývat hodnot mezi libovolnými dvěma body nebo mezi minimálními či maximálními hodnotami ve sloupci prvků. |
| 126 | + |
| 127 | +Souvislé funkce v datové sadě: Jízdné |
| 128 | +### Kategorické vlastnosti |
| 129 | +Budeme analyzovat Survived jako univariantní. Vztah mezi sexem a přežitím, embarkovaným a přežitím. |
| 130 | + |
| 131 | +#### Kolik přežilo |
| 132 | +Sloupcový graf ve sloupci Přežil. Existuje několik způsobů, jak vytvořit sloupcový graf. Ukážeme si zde 2 způsoby, seaborn count plot a pandas series bar. |
| 133 | +##### Úkol 4: Vykreslete sloupcový graf pro Zahynulé vs. Přežilé |
| 134 | +Vykreslit sloupcový graf pro sloupec Přežil. Survived=0 znamená zahynulo, Survived=1 znamená přežilo. |
| 135 | +#Kolik jich přežilo |
| 136 | +f,ax=plt.subplots(figsize=(5,5)) |
| 137 | +sns.countplot('Survived',data=df_titanic, ax = ax) |
| 138 | +ax.set_title('Zahynulí vs. přežili') |
| 139 | +#Není nutné, jen k odstranění jakéhokoli výstupu |
| 140 | +plt.show() |
| 141 | +#počet přeživších |
| 142 | +f,ax=plt.subplots(figsize=(5,5)) |
| 143 | +survivd_counts = df_titanic.Survived.value_counts() |
| 144 | +přežil_počet.plot.bar(ax=ax) |
| 145 | +ax.set_title('Zahynulí vs. přežili') |
| 146 | +plt.show() |
| 147 | +#Procento přeživších |
| 148 | +f,ax=plt.subplots(figsize=(5,5)) |
| 149 | +přeživší_počet = df_titanic.Survived.value_counts(normalize=True) |
| 150 | +přežil_počet.plot.bar(ax=ax) |
| 151 | +ax.set_title('Zahynulí vs. přežili') |
| 152 | +ax.set_xticklabels( ['Zhynulo', 'Přežilo'], rotace=0) |
| 153 | +plt.show() |
| 154 | +#### Vztah mezi sexem a přežitím |
| 155 | +Můžeme použít agregační funkci nebo graf. |
| 156 | + |
| 157 | +Další 2 buňky demonstrují agregační funkci. |
| 158 | + |
| 159 | +Následující buňka znázorňuje sloupcový graf a graf počtu. |
| 160 | + |
| 161 | +##### Úkol 5: Vykreslete sloupcový graf počtu cestujících mužů a žen |
| 162 | + |
| 163 | +Tip: Použijte seaborn countplot(). |
| 164 | +#Muž vs. Žena |
| 165 | +f,ax=plt.subplots(figsize=(5,5)) |
| 166 | +sns.countplot('Sex',data=df_titanic,ax=ax) |
| 167 | +ax.set_title('Muž vs. Žena') |
| 168 | +plt.show() |
| 169 | +##### Úkol 6: Skupinové pohlaví, abyste zjistili míru přežití mužů a žen |
| 170 | +#míra přežití žen/mužů |
| 171 | +df_titanic.groupby(['Sex'], as_index=False).agg({'Survived':'mean'}) |
| 172 | +##### Úkol 7: Vykreslení zániku vs. bar přežití pro muže a ženy |
| 173 | +Znovu použijeme seaborn countplot(), ale nastavíme argument `hue` na 'Survived'. |
| 174 | +#Zhynul vs. přežil pro muže/ženu |
| 175 | +f,ax=plt.subplots(figsize=(5,5)) |
| 176 | +sns.countplot('Sex',hue='Survived',data=df_titanic,ax=ax) |
| 177 | +ax.set_title('Pohlaví: Zahynulý vs. Přežil') |
| 178 | +plt.show() |
| 179 | +Počet mužů na lodi je mnohem vyšší než počet žen. Stále je počet přeživších žen téměř dvojnásobný než počet přeživších mužů. Většina žen přežila, zatímco velká většina mužů zahynula. |
| 180 | +#### Pclass a přežití |
| 181 | +##### Úkol 8: Uveďte míru přežití každé třídy P |
| 182 | +df_titanic.groupby(['Pclass'], as_index=False).agg({'Survived':'mean'}) |
| 183 | +##### Úkol 9: Vykreslení zániku vs. přežití pro každou třídu P |
| 184 | +# barový pozemek a seaborn počítat spiknutí |
| 185 | +f,ax=plt.subplots(figsize=(5,5)) |
| 186 | +sns.countplot('Pclass',hue='Survived',data=df_titanic,ax=ax) |
| 187 | +ax.set_title('Pclass:Perished vs. Survived') |
| 188 | +plt.show() |
| 189 | +### Průběžné funkce |
| 190 | + |
| 191 | +#### Jednorozměrný distribuční graf |
| 192 | +Histogram lze udělat několika způsoby. Ukážeme si 3 způsoby. |
| 193 | +- ax.hist(): nemůže zpracovat hodnotu NnN |
| 194 | +- seaborn.distplot(): nezvládne NaN. Ve výchozím nastavení má KDE (odhad hustoty jádra). |
| 195 | +- pd.Sereis.hist(): nejjednodušší a standardně zvládne NaN |
| 196 | +##### Úkol 10: Vykreslete histogram pro věk |
| 197 | +Použijte funkci pandas Series hist(), která zpracovává chybějící hodnotu. |
| 198 | +#use dataframe hist(), který bude standardně zpracovávat NaN |
| 199 | +obr, ax = plt.subplots() |
| 200 | +df_titanic.Age.hist(ax=ax, bins=20, edgecolor='black', alpha=0.5) |
| 201 | +##### Úkol 11: Naskládejte věkový histogram přežitých na vrchol celkového věkového histogramu |
| 202 | +Vykreslete histogram pro věk, poté odfiltrujte přeživší cestující a vykreslete histogram pro věk na stejné ose. Nastavte jinou barvu a štítek. |
| 203 | +#use dataframe hist(), který bude standardně zpracovávat NaN |
| 204 | +obr, ax = plt.subplots() |
| 205 | +df_titanic.Age.hist(ax=ax, label='all', bins=20, edgecolor='black', alpha=0.5) |
| 206 | +#stack přežil |
| 207 | +df_titanic[df_titanic.Survived==1].Age.hist(ax=ax, bins=20, color='g', label='survived', edgecolor='black', alpha=0.5) |
| 208 | +ax.set_title('Věková distribuce') |
| 209 | +ax.legend() |
| 210 | +Děti mají vyšší míru přežití. |
| 211 | +[Zpět na začátek](#Obsah) |
| 212 | + |
| 213 | +## Krok 3: Příprava dat |
| 214 | +Vytvářejte nové funkce prostřednictvím inženýrství funkcí; Vypořádat se s chybějícími hodnotami; Vyčistit data, tzn. odstranit nadbytečné bílé mezery v hodnotách řetězce. Zaměříme se na řešení chybějících údajů v tomto slovním spojení. |
| 215 | +#zkontrolovat všechna chybějící data |
| 216 | +df_titanic.isnull().sum() |
| 217 | +### Vypořádejte se s chybějícími daty |
| 218 | +Předvedeme si plnění průměrem/režimem a odhadem z dalších sloupců. |
| 219 | + |
| 220 | +#### Vyplňte průměrem/režimem |
| 221 | +Embarked má pouze 2 chybějící hodnoty a neexistuje žádný zřejmý způsob, jak odhadnout chybějící hodnotu, jednoduše ji doplníme režimem sloupce nebo 'S' |
| 222 | +##### Úkol 12: Doplňte chybějící Nastoupili jste s režimem |
| 223 | +#fill NaN v režimu Embarked with |
| 224 | +df_titanic['Embarked'].fillna(df_titanic.Embarked.mode()[0],inplace=True) |
| 225 | +df_titanic.info() |
| 226 | +#### Vyplňte odhadovanou hodnotou |
| 227 | + |
| 228 | +Titul je slovo používané ve jménu osoby v určitých kontextech. Může to znamenat buď úctu, oficiální postavení nebo profesionální neboakademická kvalifikace. Je to dobrý údaj o věku, například Mr je pro dospělého muže, Master je pro mladé chlapce. |
| 229 | + |
| 230 | +Pokud se podíváme na všechna jména cestujících Titaniku, vidíme, že jméno je ve formátu Last, Title. První. Tyto informace můžeme použít k odhadu chybějících věků. |
| 231 | + |
| 232 | +- Nejprve použijeme regulární výraz k extrahování názvu z názvu. |
| 233 | +- Poté převedeme název na velká písmena. |
| 234 | +- Chybějící věk pak doplníme průměrným věkem konkrétního titulu. |
| 235 | +#extrahujte předponu z názvu |
| 236 | +df_titanic['Title']=df_titanic.Name.str.extract('([A-Za-z]+\.)') |
| 237 | +df_titanic.head() |
| 238 | +##### Úkol 13: převeďte počáteční písmena na velká písmena. |
| 239 | +Abychom zajistili přesný průměrný věk každé iniciály, převedeme iniciály na všechna velká písmena. |
| 240 | +df_titanic.Title = df_titanic.Title.str.upper() |
| 241 | +df_titanic.head() |
| 242 | +##### Úkol 14: Doplňte chybějící věk průměrným věkem iniciály |
| 243 | +df_titanic.Title.value_counts() |
| 244 | +df_titanic.Age.fillna(df_titanic.groupby('Title').Age.transform('mean'), inplace=True) |
| 245 | +df_titanic.info() |
| 246 | +### Funkce inženýrství |
| 247 | +Vytvoříme nový sloupec FamilySize. Existují 2 sloupce týkající se velikosti rodiny, parch označuje číslo rodiče nebo dětí, Sibsp označuje číslo sourozence a manžela. |
| 248 | + |
| 249 | +Vezměte si jako příklad jedno jméno 'Asplund', můžeme vidět, že celková velikost rodiny je 7 (Parch + SibSp + 1) a každý člen rodiny má stejné jízdné, což znamená, že jízdné je pro celou skupinu. Velikost rodiny tedy bude důležitou vlastností pro předpovídání Fare. V datové sadě jsou pouze 4 Asplundy ze 7, protože datová sada je pouze podmnožinou všech cestujících. |
| 250 | +df_titanic[df_titanic.Name.str.contains('Asplund')] |
| 251 | +##### Úkol 15: Vytvořte sloupec Rodinná velikost 'FamilySize' |
| 252 | +Rodinná velikost FamilySize = Parch + SibSp + 1 |
| 253 | +df_titanic['FamilySize'] = df_titanic.Parch + df_titanic.SibSp + 1 |
| 254 | +df_titanic.sample(5) |
| 255 | + |
| 256 | +[Zpět na začátek](#Obsah) |
| 257 | + |
| 258 | +## Krok 4: Modelování |
| 259 | + |
| 260 | +Nyní máme relativně čistou datovou sadu (kromě sloupce **Cabin**, který má mnoho chybějících hodnot). Můžeme provést klasifikaci na Survived, abychom předpověděli, zda cestující katastrofu přežije, nebo regresi na Fare, abychom předpověděli jízdné. Tato datová sada není vhodná pro regresi. Ale protože v tomto workshopu nehovoříme o klasifikaci, zkonstruujeme v tomto cvičení lineární regresi na Fare. |
| 261 | + |
| 262 | +import statsmodels.formula.api as smf |
| 263 | +result = smf.ols("Fare ~ C(Pclass) + C(Embarked) + FamilySize", data=df_titanic).fit() |
| 264 | +result.summary() |
| 265 | + |
0 commit comments