IGD – cv. 07

Diskriminační analýza

Diskriminační analýza patří k nejdůležitějším úlohám vícerozměrné statistické analýzy. Tato metoda patří mezi klasifikační úlohy, kdy hledáme klasifikační pravidlo (diskriminační funkci), díky kterému jsme schopni zařadit analyzovaný objekt, který je charakterizovaný ukazateli do jedné z předem stanovených tříd. Cílem této metody tak je vytvořit pravidlo, díky kterému budeme schopni zařadit jednotlivé prvky objekty do předem připravených kategorií. Abychom minimalizovali pravděpodobnost chybného zařazení objektu do kategorie, kam nepatří = abychom vytvořili optimální klasifikační pravidlo, vytváříme trénovací množinu. Touto množinou rozumíme skupinu objektů, u nichž je známá příslušnost k dané kategorii a rovněž jsou známe všechny hodnoty ukazatelů. Výsledkem analýzy na trénovací množině získáváme diskriminační funkci a na základě naměřených ukazatelů u zbylých objektů stanovujeme pravděpodobnost, že daný objekt má být zařazen do určité kategorie. Důležitým předpokladem pro diskriminační analýzu je fakt, že každý ukazatel musí být lineárně nezávislý na ostatních.

Při diskriminační analýze musí být dodrženy následující kritéria:

  1. musí být minimálně 2 kategorie
  2. v každé kategorii musí být alespoň dva objekty z trénovací množiny
  3. počet ukazatelů musí být menší než rozdíl počtu objektů a počtu kategorií
  4. žádná hodnota ukazatele nesmí být konstantní v jakékoliv kategorii

Matematické základy diskriminační analýzy jsou uvedeny v prezentaci Mgr. Michaely Tučkové z Univerzity Palackého v Olomouci, která zazněla na první letní škole GeoComputation v roce 2011 ve Vysokém Poli.

Zadání

Vyzkoušíme si lineární diskriminační analýzu. Ta se skrývá pod funkcí lda() a je součástí balíčku MASS. Kromě lineární existuje také kvadratická diskriminační analýza, funkce qda(). Budeme pracovat opět s daty ze SLDB, přesněji řečeno s daty za jednotlivé obce s menším počtem ukazatelů. Pokusíme se zařadit obce do tří různých kategorií – město, městys a vesnice. Pro porovnání si vybereme status obcí, který mimo jiné bere v potaz také velikost obce, ale není to jediné kritérium. Porovnáme naše dělení s tím skutečným

Data si načtěte v R a aktivujte si také balíček MASS. Hned po importu musíme posoudit lineární závislost jednotlivých relativních ukazatelů a to pomocí funkce lm() – linear modelling a následně si necháme vypsat výsledky.

linMod=lm(obceSLDB[,4]~obceSLDB[,5]+obceSLDB[,6]+obceSLDB[,7]+obceSLDB[,8]

+obceSLDB[,9]+obceSLDB[,10]+obceSLDB[,11]+obceSLDB[,12]+obceSLDB[,13]

+obceSLDB[,14]+obceSLDB[,15]+obceSLDB[,16])

> summary(linMod)

Porovnáme hodnoty p-value a pokud jsou výsledky statisticky významné, tak je vše v pořádku. Toto je také náš případ, kdy všechny ukazatele jsou statisticky významné. Pokud by nějaký z ukazatelů nebyl statisticky významný, vyřadíme ho ze vstupních ukazatelů do diskriminační analýzy. Toto se nás tedy netýká.

Abychom mohli využít lineární diskriminační analýzu, musíme nejdříve datový soubor rozdělit na dvě části – část trénovací a testovací. Soubor si rozdělíme v procentuálním poměru cca 80:20.

obceSLDB<- read.table(„C:/rFolder/obceSLDB2013.csv“, header=TRUE, separator=”;”)

dTrain=obceSLDB[c(1:100,551:690,3500:4000, 5800:6200),]

dTest=obceSLDB[c(101:550,691:3499,4001:5799,6201:6246),]

Následuje vlastní trénování a vytvoření klasifikačního pravidla. Řekneme, že se má vytvořit pravidlo na základě hodnot čtvrtého – šestnáctého sloupce v souboru dTrain s tím, že zařazení těchto objektů (obcí) do kategorií je uvedeno ve třetím sloupci téže souboru.

lda_sldb=lda(dTrain[,4:16],grouping=dTrain[,3])

Příkaz lda_sldb$prior vypíše počáteční pravděpodobnost přiřazení objektu do dané kategorie. V našem případě je pravděpodobnost přiřazení pro město 0,08931699, pro městys 0,03327496 a pro vesnice 0,87740806. Hodnoty odpovídají relativnímu zastoupení kategorií v trénovací množině. Je patrné, že městysy jsou málo zastoupeny a tak může vzniknout problém při zařazování právě této kategorie. Příkazem sldb$means zjistíme průměrné hodnoty pro všechny kategorie. Tyto hodnoty jsou stejné, jako bychom vypočetli průměr zvlášť za každou množinu.

means_trenovaci_mnozina

Trénovací množinu máme natrénovánu a nyní můžeme vyzkoušet, jak by byly zařazeny obce dle hodnot. Můžeme zkusit zadat ručně dva vektory. První je pro vesnici Okrouhlá z trénovací množiny, druhý pro město Benešov nad Ploučnicí z testovací množiny a třetí pak městys Cerhenice.

predict(lda_sldb,c(14.2,12,41.3,36.4,9.8,14.6,45.9,53,5.9,0.8,36,4.2,91.6))

$class

[1] vesnice

Levels: město městys vesnice

$posterior

město     městys   vesnice

[1,] 0.001737354 0.01427682 0.9839858

$x

LD1      LD2

[1,] 1.070421 1.075987

Pro automatické zadání zařazení do kategorie musíme vytvořit nový sloupec do matice dTest a následně do tohoto sloupce zapsat příslušnost ke kategorii.

dTest[,29] <- NA # přidání nového sloupce jako 29. sloupec

colnames(dTest)[29] <- “vysledek” # pojmenujeme daný sloupec

dTest$vysledek<-predict(lda_sldb,dTest[,c(4:16)])$class # přidáme nové zařazení do nově vytvořeného sloupce

Pro vypsání výsledků použijeme kontingenční tabulku, kdy v řádcích je původní zařazení a ve sloupcích nové zařazení. Z finálního vyhodnocení vidíme, že se nám potvrdila naše obava o zařazení městysů. Žádná z obcí nebyla zařazena do kategorie městys, které byly většinou zařazeny mezi vesnice. To je způsobeno malým počtem městysů v trénovací skupině.

tabulka=table(dTest$typ_obce, dTest$vysledek)

tabulka

vysledek_DA

Zpracování v IBM SPSS

Postup je výborně popsán na tomto videu.

Detailní popis všech výsledků pak naleznete zde.

Samostatná práce

  • použijte stejný soubor, ale absolutní čísla a posuďte jejich lineární závislost
  • vytvořte trénovací a testovací množinu dle jiných kritérií
  • natrénujte zařazovací algoritmus
  • zatřiďte obce do tří kategorií
  • porovnejte výsledky s těmi uvedenými výše (potřeby převést na relativní hodnoty)

doc_icon Data pro cvičení

logolink

Cvičení je vytvořeno v rámci projektu Inovace bakalářských a magisterských studijních oborů na Hornicko-geologické fakultě VŠB-TUO pod číslem CZ.1.07/2.2.00/28.0308. Tento projekt je realizován za spoluúčasti EU.