Графички приказ података


Графички приказ података омогућава уочавање различитих карактеристика датог скупа података и правилности које постоје. На графику треба да буду приказане особине скупа података које могу бити од помоћи за спровођење даљег истраживања и рада са тим подацима. Дакле, треба пажљиво одабрати битне приказе и не оптерећивати график информацијама које нису од користи.

Један од пакета који се могу користити за креирање и уређивање графика у R-у је ggplot2 и о њему ће бити више речи у наставку.

\(\color{lightseagreen}{\text{Уводни пример, употреба пакета ggplot2}}\)

Пакет ggplot2 је један од напопуларнијих пакета за израду графика у R-у, јер је врло флексибилан и његовом применом се могу добити разне врсте графика уз мало линија кода.

У наставку је дат пример употребе овог пакета.

#install.packages("ggplot2")
#install.packages("gapminder")
library(gapminder)
library(ggplot2)
gapminder2007 <- gapminder[gapminder$year == 2007, ]

ggplot(data = gapminder2007) + 
  geom_point(mapping = aes(x = gdpPercap,
                           y = lifeExp,
                           color = continent,
                           size = pop))

Синтакса израде графика у овом пакету заснована је на \(\def \zn{,\kern-0.2em,} \zn\)граматици графике”, односно креирању независних блокова кода чијим се комбиновањем и додавањем на већ постојећи график добијају различити графички прикази.

Главне компоненте кода за цртање графика су:

  • data: скуп података који се приказује;
  • geom_*: тип геометријског објекта којим се приказују подаци (тачке, линије, …);
  • aes(): естетски атрибути који се могу доделити геометријским објектима, на пример x и y координата, боја, облик, величина (сваки елемент у подацима има своје вредности естетских параметара).

Дакле, графици се креирају по шаблону

 ggplot(data = <Podaci>) + 

    <geom_funkcija>(mapping = aes(<estetski parametri>))

Позивом ggplot(data=...) добија се празан график, па се увек морају доделити геометријски објекти додавањем geom_* функције.

ggplot(data = gapminder2007)

Неки од естетских параметара се могу доделити на почетку, при позиву функције ggplot, па ће они бити фиксирани у наредним елемнтима графика.

ggplot(data = gapminder2007, aes(x = gdpPercap, y = lifeExp)) +
  geom_point()

\(\color{lightseagreen}{\text{Напомена.}}\) Ако се ред прелама, знак + мора стајати на крају реда, а не на почетку наредног! Пробајте.


\(\color{lightseagreen}{\text{Примери графика}}\)

У наставку ће бити приказана употреба пакета за цртање неких врста графика.


\(\color{lightseagreen}{\text{Тачкасти график}}\)

Тачкасти график приказује податке као тачке у равни. У наставку ће бити наведни примери цртања овог типа графика, као и начин промене неких од његових компоненти. У примерима ће бити коришћена база података midwest, која се налази у оквиру пакета ggplot2 (опис базе података се добија позивом ?midwest).

На празан график ggplot додајемо тачкасти функцијом geom_point.

library(ggplot2)
ggplot(midwest, aes(x=area, y=poptotal)) + 
  geom_point()

Примећујемо да су тачке концентрисане у доњем делу графика, па ћемо променити границе оса.

ggplot(midwest, aes(x=area, y=poptotal)) + 
  geom_point()+
  xlim(c(0, 0.1)) +
  ylim(c(0, 500000))
## Warning: Removed 15 rows containing missing values (`geom_point()`).

Вредности изван опсега који смо одабрали су избирисане (добили смо упозорење), а да би то избегли, можемо применити метод зумирања и функцију coord_cartesian().

ggplot(midwest, aes(x=area, y=poptotal)) + 
  geom_point()+
  coord_cartesian(xlim=c(0,0.1), ylim=c(0, 500000))

Боја тачака на графику се може мењати, на пример, у зависности од државе на коју се податак односи. Слично, величина тачака се може мењати у односу на вредност неке друге променљиве из базе. Такође, може се мењати и облик тачкица употербом естетског параметра shape.

ggplot(midwest, aes(x=area, y=poptotal)) + 
  geom_point(mapping = aes(col=state, size=popdensity))+
  coord_cartesian(xlim=c(0,0.1), ylim=c(0, 500000))

Графику и осама се могу додати називи помоћу функције labs(). Друга опција је да се називи мењају појединачно функцијама ggtitle(), xlab() и ylab().

ggplot(midwest, aes(x=area, y=poptotal)) + 
  geom_point(mapping = aes(col=state))+
  coord_cartesian(xlim=c(0,0.1), ylim=c(0, 500000))+ 
  labs(title="Povrsina Vs Broj stanovnika", subtitle="Iz baze midwest ", y="Broj stanovnika", x="Povrsina", caption="Midwest Demographics")

У оквиру ggplot- а могу се користити и неке статистичке функције, па тако можемо доцртати линију која описује тренд у подацима помоћу функције geom_smooth, која прави одређену апроксимацију података.

Подазумевани метод функције geom_smooth за одређивање праве која најбоље описује податке је метод loess која даје нелинеарну оцену тренда, а у наредном примеру ћемо додавањем аргумента method = "lm" доцртати оцену тренда добијену коришћењем линеарне регресије. На графику се може уочити и трака поверења.

ggplot(midwest, aes(x=popwhite, y=popdensity)) + 
  geom_point(mapping = aes(col=state))+
  coord_cartesian(xlim=c(0,200000), ylim=c(0, 7500))+ 
  geom_smooth(method = "lm")
## `geom_smooth()` using formula = 'y ~ x'


\(\color{lightseagreen}{\text{Линијски график}}\)

Линијски графици се најчешће користе за цртање временски уређених података попут временских серија.

У наредном примеру биће коришћена база података economics из пакета ggplot2.

library(ggplot2)
ggplot(economics, aes(x = date, y = unemploy)) +
  geom_line()

И овај график се може употпунити додатним компонентама.

ggplot(economics, aes(x = date, y = unemploy)) +
  geom_line(color = "darkgreen") +
  geom_smooth() + 
  scale_x_date(date_breaks = "5 years", date_labels = "%b %Y") +
  labs(x = "Vreme", y = "Broj nezaposlenih")
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'


\(\color{lightseagreen}{\text{Bar-plot}}\)

Bar-plot се користи за приказ категоричких променљивих. На њему се приказује колико има података у бази из одређене категорије.

library(ggplot2)
ggplot(mpg, aes(manufacturer))+
 geom_bar(aes(fill=class))

Мало ћемо улепшати график.

ggplot(mpg, aes(manufacturer))+
 geom_bar(aes(fill=class), width = 0.5) + 
  theme(axis.text.x = element_text(angle=65, vjust=0.6)) +
  labs(title="Categorywise Bar Chart", 
       subtitle="Manufacturer of vehicles", 
       caption="Source: Manufacturers from 'mpg' dataset")

Прегледнија варијанта оваквог графика се добија додавањем аргумента position = "dodge" функцији geom_bar(). Тако се добија график код кога је лакше поређење по категоријама.

ggplot(mpg, aes(manufacturer))+
 geom_bar(aes(fill=class), width = 0.5, position = "dodge") + 
  theme(axis.text.x = element_text(angle=65, vjust=0.6)) +
  labs(title="Categorywise Bar Chart", 
       subtitle="Manufacturer of vehicles", 
       caption="Source: Manufacturers from 'mpg' dataset")


\(\color{lightseagreen}{\text{Хистограм}}\)

Хистограм jе наjjедноставниjа непараметарска “оцена” густине расподеле. То jе посебна врста графика са bar-овима, коjа се користи за приказ расподеле фреквенциjа низа (непрекидних) нумеричких вредности.

У примеру који следи користе се подаци из базе weather из пакета nycflights13.

#install.packages("nycflights13")
library(nycflights13)
# dodajemo kolonu u kojoj je temperatura po celzijusovoj skali
weather$celsius <- (weather$temp - 32) * 5 / 9

# izdvajamo podatke samo za jedan dan
weather_today <- weather[weather$month == 2 & weather$day == 28, ]

library(ggplot2)

ggplot(weather_today, aes(x = celsius)) + 
  geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

График не изгледа добро, јер је број категорија превелик за податке који се користе (функција задаје број категорија 30, ако јој се не проследи другачије), али то можемо да променимо.

ggplot(weather_today, aes(x = celsius)) + 
  geom_histogram(bins = 10)

Број категорија се може одредити помоћу формуле \(\lceil log_2n + 1\rceil\), што се R-у добија позивом функције nclass.Sturges().

bin_count <- nclass.Sturges(weather_today$celsius)
ggplot(weather_today, aes(x = celsius)) + 
  geom_histogram(bins = bin_count)

Како би график добио јасну форму хистограма, обојићемо границе између стубића, као и саме стубиће.

ggplot(weather_today, aes(x = celsius)) + 
  geom_histogram(bins = bin_count, color = "white", fill = "lightblue")

Границе интервала категорија се у R-у могу одредити позивом функције pretty().

bin_count <- nclass.Sturges(weather_today$celsius)
R_breaks <- pretty(range(weather_today$celsius), n = bin_count, min.n = 1)
ggplot(weather_today, aes(x = celsius)) + 
  geom_histogram(breaks = R_breaks, color = "white", fill = "lightblue")

Дакле, функција geom_histogram() не задаје неке смислене подразумеване вредности броја категорија и њихових граница, већ те вредности треба претходно прилагодити подацима који се користе и проследити функцији.

\(\color{lightseagreen}{\text{Цртање више графика одједном}}\)

За цртање више графике одједном користи се функција facet_wrap().

Нацртаћемо хистограме за податке из претхдног примера за различите месеце.

ggplot(weather, aes(x = celsius)) +
  geom_histogram(color = "white", fill = "lightblue") +
  facet_wrap(~ month)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 1 rows containing non-finite values (`stat_bin()`).


\(\color{lightseagreen}{\text{Box-plot}}\)

Box-plot је график на коме су приказане неке од важних сумарних статистика и погодан је за поређење расподела.

ggplot(mpg, aes(class, cty)) + 
  geom_boxplot(varwidth=T, fill="plum") + 
  labs(title="Box plot", 
       subtitle="City Mileage grouped by Class of vehicle",
       caption="Source: mpg",
       x="Class of Vehicle",
       y="City Mileage")

Правоугаони дијаграм садржи [25%,75%] узорка, дебела линија на правоугаонику представља медијану. Линије иду до најмање/највеће вредности која упада у дужину од 1.5 дужине правоугаоника (IQR - интерквартилно растојање) од крајева правоугаоника. Кружићи представљају екстремне вредности.


\(\color{lightseagreen}{\text{Виолински график}}\)

Овај график приказује густину унутар група, али даје мање информација од box-plot-a.

library(ggplot2)

ggplot(mpg, aes(class, cty))+ 
  geom_violin() + 
  labs(title="Violin plot", 
       subtitle="City Mileage vs Class of vehicle",
       caption="Source: mpg",
       x="Class of Vehicle",
       y="City Mileage")


\(\color{lightseagreen}{\text{Кружни дијаграм - пита}}\)

ggplot(mpg, aes(x = "", fill = factor(class))) + 
  geom_bar(width = 1) +
  labs(fill="class", 
       x=NULL, 
       y=NULL, 
       title="Pie Chart of class", 
       caption="Source: mpg")+
  coord_polar(theta = "y")