搜尋感興趣的網誌

所有文章連結

2022年2月15日 星期二

Data Analytic Cacao – 語法解析

上篇是Cacao的分析報告,本篇就像Data Analytic Hotel Bookings 一樣進行流程分享與遇到的疑難解決方案,希望有與小雷遇到一樣問題的朋友們可以當作參考

 

有需要返回觀看Data Analytic Cacao的朋友們可以返回文章、進入Kaggle或是Github

 

Data Analytic Cacao文章 >> 請點選這裡瀏覽

小雷的Kaggle >> 請點這裡進入

小雷的Github >> 請點這裡進入

 

實作分析的研究流程(這是小雷個人的習慣流程,當然也會隨著經驗的變動會做最佳化的調整,各位朋友可以依照自己的習慣進行) :

1.      了解Data Set中的Col與其中的意義,可以定義好所需要的欄位作為分析,也順便思考再分析當中所需要的欄位是否數據有不足的情況,在這個CacaoData Set中,其實已經挺乾淨的,但是在Bean_type欄位存在著888NULL值,所有的Row1795行,有888NULL已經算幾乎50%了,是否不足以用來作為分析材料?有需要填補近似值嗎?還是乾脆放棄這個欄位?另外Col中還有個欄位是Bean_origin(原豆產地),是否需要將產地的特性作為補強數據呢(氣候、經濟、勞動力等..)?若不使用,是不是會有偏見的問題產生呢?

2.      所需要的流程有幾項,這些流程是否可以合併(像是Cacao的分析報告中小雷試著將數據彙總分析、可視化併為一個流程,想嘗試這樣的流程是否會比較能掌握數據間的關係與報告的流暢性)?

3.      主要的問題與需要解決的目標,這個畢竟是自己拿數據及做研究練習,並不是有特定目的存在,所以需要自己思考可能的問題與自己想掌握的目標,Cacao的分析中,小雷以平價作為基準考量,以消費者喜好為主,所以產地氣候這些進一步的深入問題,就沒有特別添加其他Data Set一併處理。

 

關於Cacao分析報告中使用的的語法例子與使用時機 :

其實使用時機這幾個字,並不是在編程與分析課程學的,而是以前上數學課,老師會將公式與使用時機(可以帶入的特徵)告訴我們,小雷個人覺得很好用,只要特徵符合使用時機,可以快速帶入並解決問題,所以在編程的語法上,我自己是用這個方式學習,用習慣了就會發現省了不少時間。

 

read.csv() : 讀取csv檔案的語法,有兩種讀取方式,另一種是read_csv.csvR內建的語法,好處是會自動辨識欄位屬性,read_csv讀取時必須將欄位屬性一併制定,否則會有錯誤提示訊息,較懶的做法就是直接使用.csv

基礎語法 : read.csv(“data”)

使用時機 : 要讀取csv檔案時

例子 : read.csv(“cacao.csv”)

 

基礎語法 : read_csv(“data”)

使用時機 : 讀取csv檔案時要可以直接變更屬性與名稱

可用參數 : col_types = cols(col_name = col_character())col_names = c(“name”, “name”..)

可變屬性 : 列出三個常用的,col_chartacter()col_double()col_integer()

例子 : read_csv(“cacao.csv”, col_names(“maker”, “specific_bean”, …), col_types(maker-if know = col_character(), …)

 

-          encoding = UTF-8,這不是甚麼特殊語法,只是把編碼設定為utf-8以免讀取出來會有亂碼,在這份CacaoData Set中,有看到不是英文的字母,不知道是法文還是甚麼的,所以自然而言就把這段加上去了,在Python也是同樣的語法。

例子 : read.csv(“cacao.csv”, encoding = “utf-8”)

 

-          as欄位屬性變換、levelsNULL值變換Hotel Booking的語法解析有,就不加贅述了,有需要的朋友可以點連結觀看文章 >> Hotel Bookings連結

 

-          group_by() : dplyr包內的函式,將所選的欄位進行分組,搭配summarisepipes可以分類後進行統計計算,在分析階段時可以很輕鬆的觀察所需要的欄位關係,這個與SQL中與法一樣。

基礎語法 : group_by(data, col_name, …)

使用時機 : 彙總數據進行分析觀察時

例子 : x <- data %>% group_by(rate, bean_type)

 

-          summarise() : 同樣是dplyr包內的函式,要用前需要先library(dplyr),用來統計選定欄位的值

基礎語法 : summarise(data, col_name = 計算方式, …)

可用函式 : 進行計算時列出幾個常用的函式,像平均值mean(),最大值max(),最小值min()

使用時機 : 計算欄位相關值使用

例子 : summarise(data, mean_num = mean(num), max_num = max(num), min_num = min(num))

 

-          filter() : dplyr內的函式,簡單說就是數據過濾,過濾成想要的,或是把不要的過濾掉,除了大於小於之外,也可以使用&|!等邏輯值。

基礎語法 : filter(col_name, …)

使用時機 : 過濾出想要的,或是不要的值

例子 : filter(bean_type != “NULL”) >> 過濾掉欄位裡有NULL的值

 

-          arrange() : 變更排序的方式,讓檢視數據時更清楚,預設為遞增,若要遞減需要加上desc()函式

基礎語法 : arrange()

使用時機 : 數據很亂需要重新排列時

例子 : arrange(desc(rate))

 

-          stat = “identity”: 會想放上這個特殊參數是因為geom_bar()一般來說只能設定x軸,y軸預設會是自動計算,所以在圖形上y軸會顯示count,但是需要x,y軸相呼應時,就需要這段參數,讓y軸的設定變更為自定義,就可以按照需求進行y軸的設定了。

使用時機 : 需要設定y軸作為x軸呼應時

例子 : geom_bar(mapping = aes(x = x, y = y), stat = “identity”)

 

以上就是在Cacao 的分析上,小雷個人覺得有解決所遭遇的問題,若是有朋友遇到一樣的問題,希望可以有些許幫助!

2022年2月13日 星期日

Data Analytic Cacao – 案例分析報告

 慢慢的來到了新一篇的分析報告,剛好最近打電腦時喜歡吃點苦苦的巧克力,所以就選擇了這份Cacao Data Set作為數據分析主軸,後續也會將本篇的報告中,小雷使用後有比較便利的語法也會整理上來,有興趣的朋友可以多加留意一下~

 

在本篇的數據分析報告之中,CacaoData Set有欄位是產地,所以一開始就有幾點讓小雷煩惱了,產地關係到的不只是地點的選擇,還包含當地的經濟條件勞動力季節相關的氣候水土,都可能影響原豆的生產品質,以下幾點是當時考慮的問題 :

1.      是否該把氣候、經濟條件數據加入作為分析中的一環呢?

2.      若是沒有將氣候、經濟、勞動力作為分析項目,是否會產生偏見?

3.      這些對於未來的原豆產地選擇上是否有意義?

4.      產地的選擇上是否有其他戰略考量,還是只與氣候、經濟、勞動力相關?例如運送等問題

 

最後並沒有將以上的因素做為分析的考量,考慮後有幾點因素 :

1.      在一開始的目標問題就是以消費者評分的依據進行數據間相關性的連結,並不是以原產地做為分析目標。

2.      消費者喜愛的廠商與其製造的產品,其中不一定只採用單一產地的單一品種,也會有混合的問題,在其中混合的比例上並沒有數據標明那些品種用了多少。

3.      假使加入了其他的數據資料,這份分析報告可能會變得非常複雜,以目前的能力,也有可能會分析不出來。

 

上完了Google Data Analytic的課程後,常常會想到課程裡面所說的偏見問題,也很擔心自己分析時,是否有經過思考與反思的過程取得客觀性的見解?還是其實已經偏離了很多?綜合以上的考量,選擇了先單純分析此份的數據資料,找出消費者喜好的關聯為優先,之後有取得其他的數據集,可以再另做分析報告出來。

 

以下是本次的分析報告內容,編程的語法也同樣放置於Kaggle與Github中,有以Github進行版本控制,新增刪減的過程可以不用特別看😂

小雷的Kaggle >> 點我連結

小雷的Github >> 點我連結


---------------------------------------------做個分隔線---------------------------------------------------------

Dara Analytic Cacao In R

Cacao產品對於消費者喜好研究

說起甜點,不分年齡層,也不分男女,更不分國籍,相信都是許多人喜愛的。

其中經由可可豆製成的甜點,更是多數人愛不釋口的選擇,市場上充斥著琳瑯滿目的品項。

本次研究項目透過分析可可豆產品,進一步了解不同品項中可可比例、可可豆型態等類別對於消費者評分情形。

分析階段與流程

主要分為五個流程,流程如下 :

  • 確定目標問題。
  • 數據來源、保存方式與數據資料檢視。
  • 數據清洗、調整內容與變更紀錄。
  • 數據彙總、分析與可視化。
  • 見解與結論。

階段一 : 確定目標問題

1. 主要問題

  • 消費者對於可可豆製作的成品進行評分與其間的關係。
  • 如何掌握消費者喜好以及透過消費者喜愛的可可豆產品,提取並導入市場。

2. 數據分析之目標

  • 那些廠商受到消費者評分較好?
  • 對於不同可可的含量比例,哪種比較為消費者喜愛?
  • 可可豆含量較高,是否較消費者喜愛並取得高評分?
  • 甚麼樣的可可形態較為消費者所接受?
  • 對於產地而言,是否有特殊喜好的產地?

階段二 : 數據來源、保存方式與數據資料檢視

  • 特定數據集出處引用 : 作者 : Wanying Z
  • 圖片來源引用 : 維基百科
  • 圖片拍攝作者 : David Monniaux
  • 數據集來源 : 由公開平台Kaggle取得。
  • 數據資料內包含了9 Col與1795 Row,包含製造商與品項、年份、可可比例、評分等..
  • 數據存放 : MySQL、Kaggle。
  • 編碼位置 : Kaggle、Github。
  • 操作語言 : R。
  • 報告格式 : R Markdown。
  • IDE : RStudio, VScode。


CSV File Import,導入數據資料。

# File loc
setwd("D:/Github_version_file_R/data_set/cacao")
# CSV File Import
cacao_df = read.csv("cacao.csv", encoding = "utf-8")

Check Data Set,檢視數據集內容與各欄位型態。

# CSV File View
str(cacao_df)
## 'data.frame':    1795 obs. of  9 variables:
##  $ Maker         : chr  "A. Morin" "A. Morin" "A. Morin" "A. Morin" ...
##  $ Origin        : chr  "Agua Grande" "Kpime" "Atsane" "Akata" ...
##  $ REF           : int  1876 1676 1676 1680 1704 1315 1315 1315 1319 1319 ...
##  $ Review.Date   : int  2016 2015 2015 2015 2015 2014 2014 2014 2014 2014 ...
##  $ Cocoa.Percent : chr  "63%" "70%" "70%" "70%" ...
##  $ Maker.Location: chr  "France" "France" "France" "France" ...
##  $ Rating        : num  3.75 2.75 3 3.5 3.5 2.75 3.5 3.5 3.75 4 ...
##  $ Bean.Type     : chr  "NULL" "NULL" "NULL" "NULL" ...
##  $ Bean.Origin   : chr  "Sao Tome" "Togo" "Togo" "Togo" ...
head(cacao_df)
##      Maker      Origin  REF Review.Date Cocoa.Percent Maker.Location Rating
## 1 A. Morin Agua Grande 1876        2016           63%         France   3.75
## 2 A. Morin       Kpime 1676        2015           70%         France   2.75
## 3 A. Morin      Atsane 1676        2015           70%         France   3.00
## 4 A. Morin       Akata 1680        2015           70%         France   3.50
## 5 A. Morin      Quilla 1704        2015           70%         France   3.50
## 6 A. Morin    Carenero 1315        2014           70%         France   2.75
##   Bean.Type Bean.Origin
## 1      NULL    Sao Tome
## 2      NULL        Togo
## 3      NULL        Togo
## 4      NULL        Togo
## 5      NULL        Peru
## 6   Criollo   Venezuela
colnames(cacao_df)
## [1] "Maker"          "Origin"         "REF"            "Review.Date"   
## [5] "Cocoa.Percent"  "Maker.Location" "Rating"         "Bean.Type"     
## [9] "Bean.Origin"
ncol(cacao_df)
## [1] 9
nrow(cacao_df)
## [1] 1795

Check NA Value,檢查是否存在不正確NA值與統計NULL值。

# Check NA
if(sum(is.na(cacao_df) > 0)){
    print(sum(is.na(cacao_df)))
}else{
    print("no na")
}
## [1] "no na"
sum(cacao_df == "NULL")
## [1] 933

資料集檢視狀況 :

  • 數據集檢查後不存在NA錯誤值。
  • 數據集中存在NULL空值,於bean_type(888個),bean_origin(45個),總計933個空值。
  • 欄位名稱未統一,含有其餘標點符號。

階段三 : 數據清洗、調整內容與變更紀錄

Fix NULL And Adjust The Value

# 統一欄位名稱
cacao_df = clean_names(cacao_df)

# Change DataType
cacao_df = cacao_df %>% 
    mutate(maker = as.factor(maker), 
    origin = as.factor(origin), 
    percent = as.factor(cocoa_percent), 
    maker_location = as.factor(maker_location), 
    bean_type = as.factor(bean_type),
    bean_origin = as.factor(bean_origin), 
    year = review_date, 
    rate = round(rating, digits = 2))

# Check NULL loc
levels(cacao_df$bean_type) # 33 > null
##  [1] "Amazon"                   "Amazon mix"              
##  [3] "Amazon, ICS"              "Beniano"                 
##  [5] "Blend"                    "Blend-Forastero,Criollo" 
##  [7] "CCN51"                    "Criollo"                 
##  [9] "Criollo (Amarru)"         "Criollo (Ocumare 61)"    
## [11] "Criollo (Ocumare 67)"     "Criollo (Ocumare 77)"    
## [13] "Criollo (Ocumare)"        "Criollo (Porcelana)"     
## [15] "Criollo (Wild)"           "Criollo, +"              
## [17] "Criollo, Forastero"       "Criollo, Trinitario"     
## [19] "EET"                      "Forastero"               
## [21] "Forastero (Amelonado)"    "Forastero (Arriba)"      
## [23] "Forastero (Arriba) ASS"   "Forastero (Arriba) ASSS" 
## [25] "Forastero (Catongo)"      "Forastero (Nacional)"    
## [27] "Forastero (Parazinho)"    "Forastero(Arriba, CCN)"  
## [29] "Forastero, Trinitario"    "Matina"                  
## [31] "Nacional"                 "Nacional (Arriba)"       
## [33] "NULL"                     "Trinitario"              
## [35] "Trinitario (85% Criollo)" "Trinitario (Amelonado)"  
## [37] "Trinitario (Scavina)"     "Trinitario, Criollo"     
## [39] "Trinitario, Forastero"    "Trinitario, Nacional"    
## [41] "Trinitario, TCGA"
levels(cacao_df$bean_origin) # 54 > null
##   [1] "Africa, Carribean, C. Am."     "Australia"                    
##   [3] "Belize"                        "Bolivia"                      
##   [5] "Brazil"                        "Burma"                        
##   [7] "Cameroon"                      "Carribean"                    
##   [9] "Carribean(DR/Jam/Tri)"         "Central and S. America"       
##  [11] "Colombia"                      "Colombia, Ecuador"            
##  [13] "Congo"                         "Cost Rica, Ven"               
##  [15] "Costa Rica"                    "Cuba"                         
##  [17] "Dom. Rep., Madagascar"         "Domincan Republic"            
##  [19] "Dominican Rep., Bali"          "Dominican Republic"           
##  [21] "DR, Ecuador, Peru"             "Ecuador"                      
##  [23] "Ecuador, Costa Rica"           "Ecuador, Mad., PNG"           
##  [25] "El Salvador"                   "Fiji"                         
##  [27] "Gabon"                         "Ghana"                        
##  [29] "Ghana & Madagascar"            "Ghana, Domin. Rep"            
##  [31] "Ghana, Panama, Ecuador"        "Gre., PNG, Haw., Haiti, Mad"  
##  [33] "Grenada"                       "Guat., D.R., Peru, Mad., PNG" 
##  [35] "Guatemala"                     "Haiti"                        
##  [37] "Hawaii"                        "Honduras"                     
##  [39] "India"                         "Indonesia"                    
##  [41] "Indonesia, Ghana"              "Ivory Coast"                  
##  [43] "Jamaica"                       "Liberia"                      
##  [45] "Mad., Java, PNG"               "Madagascar"                   
##  [47] "Madagascar & Ecuador"          "Malaysia"                     
##  [49] "Martinique"                    "Mexico"                       
##  [51] "Nicaragua"                     "Nigeria"                      
##  [53] "NILL"                          "NULL"                         
##  [55] "Panama"                        "Papua New Guinea"             
##  [57] "Peru"                          "Peru(SMartin,Pangoa,nacional)"
##  [59] "Peru, Belize"                  "Peru, Dom. Rep"               
##  [61] "Peru, Ecuador"                 "Peru, Ecuador, Venezuela"     
##  [63] "Peru, Mad., Dom. Rep."         "Peru, Madagascar"             
##  [65] "Philippines"                   "PNG, Vanuatu, Mad"            
##  [67] "Principe"                      "Puerto Rico"                  
##  [69] "Samoa"                         "Sao Tome"                     
##  [71] "Sao Tome & Principe"           "Solomon Islands"              
##  [73] "South America"                 "South America, Africa"        
##  [75] "Sri Lanka"                     "St. Lucia"                    
##  [77] "Suriname"                      "Tanzania"                     
##  [79] "Tobago"                        "Togo"                         
##  [81] "Trinidad"                      "Trinidad-Tobago"              
##  [83] "Trinidad, Ecuador"             "Trinidad, Tobago"             
##  [85] "Uganda"                        "Vanuatu"                      
##  [87] "Ven, Bolivia, D.R."            "Ven, Trinidad, Ecuador"       
##  [89] "Ven., Indonesia, Ecuad."       "Ven., Trinidad, Mad."         
##  [91] "Ven.,Ecu.,Peru,Nic."           "Venez,Africa,Brasil,Peru,Mex" 
##  [93] "Venezuela"                     "Venezuela, Carribean"         
##  [95] "Venezuela, Dom. Rep."          "Venezuela, Ghana"             
##  [97] "Venezuela, Java"               "Venezuela, Trinidad"          
##  [99] "Venezuela/ Ghana"              "Vietnam"                      
## [101] "West Africa"
# Change NULL Value 
null_beanType = which(levels(cacao_df$bean_type) == "NULL") 
levels(cacao_df$bean_type)[null_beanType] = "no_record" 

null_beanOrigin = which(levels(cacao_df$bean_origin) == "NULL")
levels(cacao_df$bean_origin)[null_beanOrigin] = "no_record"

# 確認數值
summary(cacao_df$year)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    2006    2010    2013    2012    2015    2017
summary(cacao_df$percent)
##   100%    42%    46%    50%    53%    55%    56%    57%    58%    60% 60.50% 
##     20      1      1      1      1     16      2      1      8     43      1 
##    61%    62%    63%    64%    65%    66%    67%    68%    69%    70%    71% 
##      8     14     12     34     78     23     27     47     10    672     31 
##    72% 72.50%    73% 73.50%    74%    75%    76%    77%    78%    79%    80% 
##    189      4     40      2     50    222     23     33     17      1     72 
##    81%    82%    83%    84%    85%    86%    87%    88%    89%    90%    91% 
##      5     17      4      4     36      1      1      8      2      8      3 
##    99% 
##      2
summary(cacao_df$rate)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   2.875   3.250   3.186   3.500   5.000

清洗、調整結果 :

  • 進行欄位名稱統一與清理,移除標點符號、空格等
  • 字符欄位變更型態為因子,方便後續統計分析,評分欄位調整小數點顯示位數
  • 不移除NULL值欄位,避免損害原始數據集,變更NULL值為”無紀錄”

階段四 : 數據彙總、分析與可視化

Aggregate data

summary(cacao_df)
##       maker                     origin          ref        review_date  
##  Soma    :  47   Madagascar        :  57   Min.   :   5   Min.   :2006  
##  Bonnat  :  27   Peru              :  45   1st Qu.: 576   1st Qu.:2010  
##  Fresco  :  26   Ecuador           :  42   Median :1069   Median :2013  
##  Pralus  :  25   Dominican Republic:  37   Mean   :1036   Mean   :2012  
##  A. Morin:  23   Venezuela         :  21   3rd Qu.:1502   3rd Qu.:2015  
##  Arete   :  22   Chuao             :  19   Max.   :1952   Max.   :2017  
##  (Other) :1625   (Other)           :1574                                
##  cocoa_percent      maker_location     rating                     bean_type  
##  Length:1795        U.S.A. :764    Min.   :1.000   no_record           :888  
##  Class :character   France :156    1st Qu.:2.875   Trinitario          :419  
##  Mode  :character   Canada :125    Median :3.250   Criollo             :153  
##                     U.K.   : 96    Mean   :3.186   Forastero           : 87  
##                     Italy  : 63    3rd Qu.:3.500   Forastero (Nacional): 52  
##                     Ecuador: 54    Max.   :5.000   Blend               : 41  
##                     (Other):537                    (Other)             :155  
##              bean_origin     percent         year           rate      
##  Venezuela         :214   70%    :672   Min.   :2006   Min.   :1.000  
##  Ecuador           :193   75%    :222   1st Qu.:2010   1st Qu.:2.875  
##  Peru              :165   72%    :189   Median :2013   Median :3.250  
##  Madagascar        :145   65%    : 78   Mean   :2012   Mean   :3.186  
##  Dominican Republic:141   80%    : 72   3rd Qu.:2015   3rd Qu.:3.500  
##  Nicaragua         : 60   74%    : 50   Max.   :2017   Max.   :5.000  
##  (Other)           :877   (Other):512
summary(cacao_df$year)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    2006    2010    2013    2012    2015    2017
summary(cacao_df$rate)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   2.875   3.250   3.186   3.500   5.000
summary(cacao_df$percent)
##   100%    42%    46%    50%    53%    55%    56%    57%    58%    60% 60.50% 
##     20      1      1      1      1     16      2      1      8     43      1 
##    61%    62%    63%    64%    65%    66%    67%    68%    69%    70%    71% 
##      8     14     12     34     78     23     27     47     10    672     31 
##    72% 72.50%    73% 73.50%    74%    75%    76%    77%    78%    79%    80% 
##    189      4     40      2     50    222     23     33     17      1     72 
##    81%    82%    83%    84%    85%    86%    87%    88%    89%    90%    91% 
##      5     17      4      4     36      1      1      8      2      8      3 
##    99% 
##      2
summary(cacao_df$maker_location)
##         Amsterdam         Argentina         Australia           Austria 
##                 4                 9                49                26 
##           Belgium           Bolivia            Brazil            Canada 
##                40                 2                17               125 
##             Chile          Colombia        Costa Rica    Czech Republic 
##                 2                23                 9                 1 
##           Denmark Domincan Republic           Ecuador           Eucador 
##                15                 5                54                 1 
##              Fiji           Finland            France           Germany 
##                 4                 2               156                35 
##             Ghana           Grenada         Guatemala          Honduras 
##                 1                 3                10                 6 
##           Hungary           Iceland             India           Ireland 
##                22                 3                 1                 4 
##            Israel             Italy             Japan         Lithuania 
##                 9                63                17                 6 
##        Madagascar        Martinique            Mexico       Netherlands 
##                17                 1                 4                 4 
##       New Zealand         Niacragua         Nicaragua              Peru 
##                17                 1                 5                17 
##       Philippines            Poland          Portugal       Puerto Rico 
##                 1                 8                 3                 4 
##            Russia          Sao Tome          Scotland         Singapore 
##                 1                 4                10                 3 
##      South Africa       South Korea             Spain         St. Lucia 
##                 3                 5                25                 2 
##          Suriname            Sweden       Switzerland              U.K. 
##                 1                 5                38                96 
##            U.S.A.         Venezuela           Vietnam             Wales 
##               764                20                11                 1
summary(cacao_df$bean_type)
##                   Amazon               Amazon mix              Amazon, ICS 
##                        1                        2                        2 
##                  Beniano                    Blend  Blend-Forastero,Criollo 
##                        3                       41                        1 
##                    CCN51                  Criollo         Criollo (Amarru) 
##                        1                      153                        2 
##     Criollo (Ocumare 61)     Criollo (Ocumare 67)     Criollo (Ocumare 77) 
##                        2                        1                        1 
##        Criollo (Ocumare)      Criollo (Porcelana)           Criollo (Wild) 
##                        1                       10                        1 
##               Criollo, +       Criollo, Forastero      Criollo, Trinitario 
##                        1                        2                       39 
##                      EET                Forastero    Forastero (Amelonado) 
##                        3                       87                        1 
##       Forastero (Arriba)   Forastero (Arriba) ASS  Forastero (Arriba) ASSS 
##                       37                        6                        1 
##      Forastero (Catongo)     Forastero (Nacional)    Forastero (Parazinho) 
##                        2                       52                        8 
##   Forastero(Arriba, CCN)    Forastero, Trinitario                   Matina 
##                        1                        1                        3 
##                 Nacional        Nacional (Arriba)                no_record 
##                        2                        3                      888 
##               Trinitario Trinitario (85% Criollo)   Trinitario (Amelonado) 
##                      419                        2                        1 
##     Trinitario (Scavina)      Trinitario, Criollo    Trinitario, Forastero 
##                        1                        9                        2 
##     Trinitario, Nacional         Trinitario, TCGA 
##                        1                        1
  • 數據紀錄時間自西元2006年至2017年止。
  • 評分範圍最低為一最高為五。
  • 可可百分比最低含量為42%,最高為100%
  • 大多數生產地集中於U.S.A(764筆).,France(156筆),Canada(125筆)。
  • 可可豆型態前三名有Trinitario(419筆),Criollo(153筆),Forastero(87筆),不包含未紀錄值。

Viualization

  • 多少製造商獲得大於四分的評價
# 多少製造商評分大於四分
maker_rate <- cacao_df %>%
    group_by(maker) %>%
    summarise(rate = max(rate)) %>%
    filter(rate >= 4.00) %>%
    arrange(desc(rate)) %>%
    view()

ggplot(data = maker_rate) +
    geom_bar(mapping = aes(x = maker, y = rate, fill = rate), stat = "identity") +
    xlab("Maker") +
    ylab("Rating") +
    labs(title = "Maker & Avg Rating", subtitle = "the most popular maker") +
    theme(axis.text.x = element_text(angle = 45)) +
    ylim(0, 5.00)

# 那些廠商的評價較低
maker_rate <- cacao_df %>%
    group_by(maker) %>%
    summarise(rate = max(rate)) %>%
    filter(rate <= 2.00) %>%
    arrange(desc(rate)) %>%
    view()
  • 可可含量與高低評分關係
# 高於4.00評分的可可含量有那些
percent_high_rate <- cacao_df %>%
    group_by(rate, percent) %>%
    summarise(rate = mean(rate)) %>%
    filter(rate >= 4.00) %>%
    arrange(desc(rate)) %>%
    view()
## `summarise()` has grouped output by 'rate'. You can override using the `.groups` argument.
ggplot(data = percent_high_rate) +
    geom_bar(mapping = aes(x = percent, fill = rate)) +
    xlab("Cacao Percent") +
    ylab("Count") +
    labs(title = "High Rating Of The Cacao Percent", subtitle = "most favorite ratio content") +
    theme(axis.text.x = element_text(angle = 45))

# 低於2.00評分的可可含量有那些
percent_lower_rate <- cacao_df %>%
    group_by(rate, percent) %>%
    summarise(rate = mean(rate)) %>%
    filter(rate <= 2.00) %>%
    arrange(desc(rate)) %>%
    view()
## `summarise()` has grouped output by 'rate'. You can override using the `.groups` argument.
ggplot(data = percent_lower_rate) +
    geom_bar(mapping = aes(x = percent, fill = rate)) +
    xlab("Cacao Percent") +
    ylab("Count") +
    labs(title = "Lower Rating Of The Cacao Percent", subtitle = "least favorite ratio content") +
    theme(axis.text.x = element_text(angle = 45))

  • 不同年份對於評價的變化
# 各年間對於可可產品的綜合評分
year_rate <- cacao_df %>%
    group_by(year) %>%
    summarise(top_rate = max(rate), bottom_rate = min(rate)) %>%
    arrange(desc(year)) %>%
    view()

ggplot(data = year_rate) +
    geom_line(mapping = aes(x = year, y = top_rate), color = "blue", size = 1.5) +
    geom_line(mapping = aes(x = year, y = bottom_rate), color = "red", size = 1.5) +
    xlab("Year") +
    ylab("The Heigh And Lower Rating") +
    labs(title = "The Relationship Between Years And Rating", subtitle = "ratings tend to be average") +
    xlim(2006, 2017)

  • 可可豆的型態對於對於消費者評價的影響
# 甚麼樣形態的可可豆評分較好
bean_type_rate <- cacao_df %>%
    group_by(rate, bean_type) %>%
    summarise(rate = max(rate)) %>%
    filter(rate >= 4.00, bean_type != "no_record") %>%
    arrange(desc(rate)) %>%
    view()
## `summarise()` has grouped output by 'rate'. You can override using the `.groups` argument.
ggplot(data = bean_type_rate) +
    geom_bar(mapping = aes(x = bean_type, y = rate, fill = rate), size = 0.5, stat = "identity") +
    ylim(0, 5.00) +
    xlab("Bean Type") +
    ylab("Rating") +
    labs(title = "Bean Type & Rating", subtitle = "the bean type effect rating") +
    theme(axis.text.x = element_text(angle = 30))
## Warning: Removed 2 rows containing missing values (geom_bar).

  • 高評分的可可豆產地集中於何處
origin_rate <- cacao_df %>%
    group_by(bean_origin, rate) %>%
    summarise(rate = max(rate)) %>%
    filter(rate >= 4.00, bean_origin != "no_record") %>%
    arrange(desc(rate)) %>%
    view()
## `summarise()` has grouped output by 'bean_origin'. You can override using the `.groups` argument.
ggplot(data = origin_rate) +
    geom_bar(mapping = aes(x = bean_origin, y = rate, fill = rate), stat = "identity") +
    ylim(0, 5.00) +
    xlab("Bean Origin") +
    ylab("Rating") +
    labs(title = "Bean Origin & Rating", subtitle = "the bean origin effect rating") + 
    theme(axis.text.x = element_text(angle = 30))
## Warning: Removed 1 rows containing missing values (geom_bar).

Analyze Problem

  • 高於4分評價的廠商有45間,其中Amedei獲得的最高的五分評價,獲得較低評價的廠商只有5間,其餘廠商都在2~4分的評價區間。
  • 可可比例中獲得最高五分評價的為70%比例,四分評價區間在60%88%,令人意外的是低於兩分評價的比例最高為100%,其次為70%,剩餘範圍在53%99%之間。
  • 隨著時間的推移,在2006年時最高與最低的評價差距最多,相反在2017年時最高與最低的評價分數開始趨於靠近,自2008年到2016年間,最高評價沒有改變,反而是低評價逐步往高分評價移動。
  • 可可原豆型態,獲得最高評價的有Blend與Trinitario,獲得四分評價的也有14筆之多。
  • 在產地的部分,Venezuela獲得最高評價,其餘也有30個產地所產出的可可豆獲得消費者四分評價。

階段五 : 見解與結論

  1. 最適當可可比例雖然在60%~88%,其中70%的比例獲得最高評價,但在較低評價之中,也包含了70%的比例,顯示除了可可比例影響消費者喜愛之外,可可原豆產地、型態、甚至於製造商位置都影響著消費者評價選擇,並不是70%比例就一定可以獲得好的評價。
  2. 獲得高評價廠商之中,發現在原豆型態的選擇上較為固定,以Blend(混合)、Trinitario(為Criollo與Forastero混合品種)、Criollo(擁有果香、細膩風味)、Forastero(苦味較強、味道較重)為最常見原豆型態,顯示消費者對於口味上有一定的習慣程度。
  3. 原豆產地的部分,Venezuela、Madagascar為最大宗,該區的氣候條件,種植的可可原豆獲得了消費者青睞,在低於兩分評價的原產地選擇上並未出現Venezuela與Madagascar兩個產地,顯示在消費者習慣的口味上,種植可可豆地區的氣候為評分最主要的影響條件,其次為可可豆品種
  4. 製造商位置的選擇上,前三大位置為Italy(評價區間2.25 ~ 5.0)、France(評價區間2.5 ~ 4.0)、U.S.A.(評價區間1.5 ~ 4.0),有趣的是在Italy與France的製造商,在原豆產地與型態的選擇上較為固定,也造成了評價區間較小的主因。
  5. 從過往評分紀錄來看,每年對於評價的高低區間有越發靠近的趨勢,在11年的發展過程中,許多廠商抓住了消費者喜好,包含氣候、原豆產地、型態以至於比例調配,消費者最低評價逐年上漲,最高評價則幾乎維持不變,優點是消費者很容易取得習慣性口味的產品,製作商也容易製作出消費者喜好的產品,在另一個層面來看,市場上的產品趨於相似,容易導致消費者區分不出製作商,對於品牌來說較難維持忠誠度與印象,各家廠商競爭模式容易轉變為依靠大量廣告行銷預算,藉此穩定消費者,很快會造成強者恆強、弱者恆弱的趨勢,不利於市場發展。




其他文章

看看精選文章

納希克房價分析 | Nashik Apartment Price Analyze – 語法解析(上)

  這次 Nashik 的房價分析有上傳至 Kaggle ,有興趣的朋友可以前往閱覽, RMarkdown PDF 報告存放在 Google 雲端,程式碼則是存放於 Github ,照慣例會分享好用的函式語法,雖說基本的 Packages 與語法可能很多人都會完整的閱覽,但是實際...