Veri amerikada satışa sunulan kahvaltılık gevrek gibi ürünler üreten firmalara ait çeşitli istatistiksel bilgiler içermektedir. Veri seti kaynağı: https://www.kaggle.com/semakulapaul/cereals-dataset
library(tidyverse)
library(gridExtra)
library(dplyr)
library(cowplot)
library(corrplot)
library(corrgram)
raw.data <- read.csv("cereal.csv",fileEncoding = "UTF-8-BOM",
na.strings = '-1')
Verimizde işlem yapmadan evvel bazı düzenleme işlemleri yapmalıyız. Bu sayede veriyi görselleştirken veya tablo çıkartırken hata almamızı engellemiş oluruz.
cereals.data <- raw.data
Değişken isimlerini daha düzgün bir hale getiriyorum değişken isimleri arasındaki boşlukları silmke gibi, çünkü uygun formata almazsak yapacağımız işlemlerde hata yaşayabiliriz.
colnames(cereals.data) <- c(
"Cereal_Name",
"Manufacturer",
"Type",
"Calories_per_Serve",
"Protein_per_Serve",
"Fat_per_Serve",
"Sodium_per_Serve",
"Fiber_per_Serve",
"Carbohydrates_per_Serve",
"Sugars_per_Serve",
"Potassium_per_Serve",
"Vitamins_percentage",
"Shelf",
"Weight_oz_per_Serve",
"Cups_per_Serve",
"Rating"
)
Firma isimleri kod adlarıyla bulunmak bunları gsub komutu ile değiştiriyorum.Gsub ilk pattern’i ikinci parametreye göre değiştirir.
cereals.data$Manufacturer <-
gsub("A",
"American Home Food Products",
x = cereals.data$Manufacturer)
cereals.data$Manufacturer <-
gsub("G",
"General Mills",
x = cereals.data$Manufacturer)
cereals.data$Manufacturer <-
gsub("K",
"Kellogs",
x = cereals.data$Manufacturer)
cereals.data$Manufacturer <-
gsub("N",
"Nabisco",
x = cereals.data$Manufacturer)
cereals.data$Manufacturer <-
gsub("P",
"Post",
x = cereals.data$Manufacturer)
cereals.data$Manufacturer <-
gsub("Q",
"Quaker Oats",
x = cereals.data$Manufacturer)
cereals.data$Manufacturer <-
gsub("R",
"Ralston Purina",
x = cereals.data$Manufacturer)
cereals.data$Type <- gsub("H", "Hot", x = cereals.data$Type)
cereals.data$Type <- gsub("C", "Cold", x = cereals.data$Type)
cereals.data$Cereal_Name <-
as.character(cereals.data$Cereal_Name)
Verimizde kategorik ve numerik olması istenileni ifadeleri tekrardan atamam yaparak bu kısımlarda bir hata almamak adına düzenliyorum.
cereals.data$Manufacturer <- factor(cereals.data$Manufacturer)
cereals.data$Type <- factor(cereals.data$Type)
cereals.data$Shelf <- factor(cereals.data$Shelf)
# Numerik olanların düzenlenmesi
cereals.data$Calories_per_Serve <-
as.numeric(cereals.data$Calories_per_Serve)
cereals.data$Protein_per_Serve <-
as.numeric(cereals.data$Protein_per_Serve)
cereals.data$Fat_per_Serve <-
as.numeric(cereals.data$Fat_per_Serve)
cereals.data$Sodium_per_Serve <-
as.numeric(cereals.data$Sodium_per_Serve)
cereals.data$Fiber_per_Serve <-
as.numeric(cereals.data$Fiber_per_Serve)
cereals.data$Carbohydrates_per_Serve <-
as.numeric(cereals.data$Carbohydrates_per_Serve)
cereals.data$Sugars_per_Serve <-
as.numeric(cereals.data$Sugars_per_Serve)
cereals.data$Potassium_per_Serve <-
as.numeric(cereals.data$Potassium_per_Serve)
cereals.data$Vitamins_percentage <-
as.numeric(cereals.data$Vitamins_percentage)
cereals.data$Weight_oz_per_Serve <-
as.numeric(cereals.data$Weight_oz_per_Serve)
cereals.data$Cups_per_Serve <-
as.numeric(cereals.data$Cups_per_Serve)
cereals.data$Rating <-
as.numeric(cereals.data$Rating)
Veride ağırlık birimleri oz üzerinden verilmiş.1 OZ=28.3495 gram ediyor bunu ve besin değerlerini(miligram) yine gram olarak güncelleyelim.Bu şekilde anlaşılması ve yorumlanması daha makul hala gelecektir.Yapacağımız işlem ilgili verileri 28 ve 100 ile çarpıp tekrar eklemek olacaktır.
#Ağırlıkların güncellenmesi
cereals.data$Weight_g <-
(cereals.data$Weight_oz_per_Serve * 28.3495)
#Besin değerlerinin güncelenmesi
cereals.data$Calories_100g <-
(cereals.data$Calories_per_Serve / cereals.data$Weight_g) * 100
cereals.data$Protein_100g <-
(cereals.data$Protein_per_Serve / cereals.data$Weight_g) * 100
cereals.data$Fat_100g <-
(cereals.data$Fat_per_Serve / cereals.data$Weight_g) * 100
cereals.data$Sodium_100g <-
(cereals.data$Sodium_per_Serve / cereals.data$Weight_g) * 100
cereals.data$Fiber_100g <-
(cereals.data$Fiber_per_Serve / cereals.data$Weight_g) * 100
cereals.data$Carbohydrates_100g <-
(cereals.data$Carbohydrates_per_Serve / cereals.data$Weight_g) * 100
cereals.data$Sugars_100g <-
(cereals.data$Sugars_per_Serve / cereals.data$Weight_g) * 100
cereals.data$Potassium_100g <-
(cereals.data$Potassium_per_Serve / cereals.data$Weight_g) * 100
Artık verimiz uygun formata geldi bu verileri grafiksel yöntemlerle yorumlayabiliriz. ilk olarak ürünlerin soğuk mu sıcak mı servis’e uygun üretildiğine göre kıyaslayalım.
cereals.data %>% group_by(Manufacturer,Type) %>% #üretici ve ürün tipine göre grupladık
summarise(count=n()) %>% .[order(-.$count),]
Tablomuzda en çok ürün türü sahibi olan firmanın Kellogs olduğunu görmekteyiz.Sıcak ürün sayısı ciddi miktarda azdır.
cereals.data %>% group_by(Manufacturer,Type) %>% #üretici ve ürün tipine göre grupladık
summarise(count=n()) %>%#ikinci grubu saymak için bu komutu kullanıyoruz.Summarise yeni bir tablo oluşturup değişken eklemeyi sağlar.
ggplot(aes(reorder(Manufacturer,count,),y=count))+#büyükten küçüğe doğru sıraladım
geom_bar(stat="identity",aes(fill=Type))+ scale_fill_manual(breaks = c("Cold", "Hot"),#renkleri el ile verdim
values=c("navy","red2"))+
coord_flip()#veriyi 90 derece döndürdüm
Anlaşılacağı üzere tahıl-gevrek üreten firmaların çok büyük bir kısmı soğuk tüketim için ürün üretmektedir.7 firmadan sadece 3 tanesi sıcak ürün üretmektedir.
cereals.data %>% ggplot(aes(cereals.data$Manufacturer,Calories_100g))+
geom_boxplot(fill="turquoise2")+coord_flip()
Firmaların ürettiği ürünlerinden gelen kalori dağılımları bir kısmı benzer aralıklardadadır. En düşük kaloriye sahip ürünler üreten firmanın Nabisco olduğunu görmekteyiz. Bununla beraber Raiston Purina anlaşılan en şekerli ürünleri üreten firma bu durumu yine kontrol edeceğim.
length(unique(cereals.data$Cereal_Name))#77 ürün var
## [1] 77
top_40<-cereals.data[order(-cereals.data$Calories_100g),] %>% head(40) %>%
ggplot(.,aes(reorder(Cereal_Name,Calories_100g,),Calories_100g))+geom_bar(stat = "identity",aes(fill=Manufacturer))+coord_flip()+labs(x="Ürünler",y="100G'daki kalori",title = "en yüksek 40 ürün")
bottom_40<-cereals.data[order(-cereals.data$Calories_100g),] %>% tail(37) %>%
ggplot(.,aes(reorder(Cereal_Name,Calories_100g,),Calories_100g))+geom_bar(stat = "identity",aes(fill=Manufacturer))+ylim(c(0,529))+ #arasındaki farkları görebilmek adına eksenler aynı limitlere alındı
coord_flip()+labs(x="Ürünler",y="100G'daki kalori",title = "en düşük 40 ürün")+
theme(legend.position = "bottom")
top_40
bottom_40
ASlında her firmanın her tüketici kitlesi için yüksek veya az kalorili ürünleri olduğunu görebiliyoruz. Buna rağmen Raiston Purina firmasının hem en yüksek hemde neredeyse en düşük kalorili ürünü üretiyor olması ilginç denilebilir. Sonuç olarak tüketici tercihlerine göre ürünler üretildiği söylenebilir.
cereals.data %>% group_by(Manufacturer,Cups_per_Serve) %>% #üretici ve ürün tipine göre grupladık
summarise(adet=n()) %>% .[order(-.$adet),] %>% ggplot(aes(Manufacturer,adet))+geom_bar(stat="identity",aes(fill=factor(Cups_per_Serve)),position = "dodge2")+coord_flip()+xlab("Üretici Firma")+ theme(legend.position = "bottom")
Çoğunlukla standart paketlemenin porsiyon başına 1 kase olduğunu görmekteyiz.cups per serve değişkenini aralıklara göre düzenleyip tekrar grafik çıkartmak çok daha mantıklı bir hareket olsada ürün paketle standartlarını yansıtması adına bu şekilde bırakılmasının daha uygun olduğunu düşünüyorum.
Şimdi ürünlere ait protein yağ gibi durumları göstereceğiz.
#Dplyr ile oluşturamadığım için psych paketine denk geldim. Bu paket sayesinde hızlı bir şekilde firmalara ait ürünlerin kalori değerlerinin çıkarımsal istatistk değerlerine erişebiliriz.
library(psych)
a<-describeBy(cereals.data$Calories_100g,cereals.data$Manufacturer)
rownames(a)
## [1] "American Home Food Postroducts" "General Mills"
## [3] "Kellogs" "Nabisco"
## [5] "Post" "Quaker Oats"
## [7] "Ralston Purina"
a2<-rbind(a$`American Home Food Postroducts`,
a$`General Mills`,
a$Kellogs,
a$Nabisco,
a$Post,
a$`Quaker Oats`,
a$`Ralston Purina`)
rownames(a2)<-rownames(a)
Bu şekilde her bir değişkenin aralıkları sapmalarını inceleyebiliriz fakat bunun daha hızlı bir şekilde yapılacabileceğini düşünüyorum.Tablo ile göstermektense her bir firmanın ürünlerinin besin değerlerinin dağılımlarını bir for döngüsü ile box plot üzerinden hepsini gösterebilirim.
colnm<-colnames(cereals.data[18:25])
p1<-list(NA)
for(i in 1:length(colnm)){
p1[[i]]<-ggplot(cereals.data)+aes_string("Manufacturer",colnm[i])+
geom_boxplot(fill="turquoise2")+coord_flip()}
#plot_grid(plotlist = p1) çıktı çok karmaşık oluyor
p1
## [[1]]
##
## [[2]]
##
## [[3]]
##
## [[4]]
##
## [[5]]
##
## [[6]]
##
## [[7]]
##
## [[8]]
Toplu çıktı sonuçları
En yüksek proteine sahip ürün grubu quaker oats’tır fakat en az olana sahip olanda o diyebiliriz.
Raston Purinanın en yüksek kaloriye sahip olduğunu belirtmiştik ayn zamanda en az kaloriye sahip olduğunu, yağların box plotu da bu duruma oldukça uymaktadır.
Sodium değerlerinde R.P üst sıraları kellogs ve generals mills ile paylaşmaktadır.
Fiber değerinde en yüksek aralığa sahip olan Nabiscodur.
Şaşırtıcı olarak Rasiton purina nın en yüksek karbonhidrata sahip olmasını beklerdim.Karbonhidratta en yüksek değere sahip olan Nabiscodur.
Nabisco en yüksek karbonhidrata sahip iken şekeri en az kullanan firma Nabiscodur.
Potasyoum miktarında en yüksek aralıpa sahip olan firma yine Nabiscodur.
Ratings değişkenimiz ürünlere göre kullanıcı puanlamalarını ifade etmektedir.
top_10<-cereals.data[order(-cereals.data$Rating),] %>% head(10) %>%
ggplot(.,aes(reorder(Cereal_Name,Rating,),Rating))+geom_bar(stat = "identity",aes(fill=Manufacturer))+coord_flip()+labs(x="Ürünler",y="ürünlerin skorları",title = "En iyi 10 ürün")
bottom_10<-cereals.data[order(-cereals.data$Rating),] %>% tail(10) %>%
ggplot(.,aes(reorder(Cereal_Name,Rating,),Rating))+geom_bar(stat = "identity",aes(fill=Manufacturer))+coord_flip()+labs(x="Ürünler",y="ürünlerin skorları",title = "En kötü 10 ürün")
top_10
bottom_10
Kellogs besin değerlerinde ortalama sonuçlar verirken lezzette en yüksek sonucu verdi. Bununla beraber uygun besin değerleri az yağlı yüksek karbonhidratlı ve yüksek besin değerlerine sahip olan Nabisco ürünleri zirve-10’ da 5 ürünle en çok çeşidi tercih edilen firma oldu.
General Mills’e ait olan ürünler en az tercih edilen en düşük puanların verildiği firmadır. Kendileri görüldüğünde koşarak kaçılması gerekir :)
Ürün fiyatına etki eden değişkenleri görebilmek adına bir korelasyon grafiği çıkaralım.
corrplot(M, type="upper", order="hclust",)
Fiyata etki eden değişkenlere baktığımızda yüksek şeker kalori sodium ve yağ ile ters orantılıyken yüksek protein fiber ve potasyum bulunmasıyla doğru orantılıdır.Yani müşteriler daha çok sağlıklı ürünleri tercih etmektedirler