2020年9月29日 星期二

32_用R寫論文_球型檢定

 在上一篇做KMO檢定E1~E10所有的問項的值都在0.9以上,接下進行球型檢定,而球型檢定則是用來判斷多變量常態分配,也可用來檢定是否適合進行因素分析,而球型檢定的統計量的P值均小於顯著水準的1%也就是0.01,表示該資料之抽樣為是當且適合進行因素分析。

同樣也是採用上一篇的資料集測試資料每筆資料就是一位填寫問卷的人,變數就是問題本身,跟前面的問卷基本分析紀錄資料的方式一樣,但對於本次57個變數太多了,我們只要E1-E10的變數,及前500名的參與者,而這份問卷主要調查個性是否外向,問項列表如下

這是人們對等級從1 =不同意到5 =同意的外向性項目的列表:

  • E1我是聚會的一生。
  • E2我沒說很多。
  • E3我周圍的人感覺很舒服。
  • E4我一直在後台。
  • E5我開始對話。
  • E6我無話可說。
  • E7我在聚會上與許多不同的人交談。
  • E8我不喜歡引起我的注意。
  • E9我不介意成為關注的焦點。
  • E10我在陌生人周圍安靜。

程式碼如下
DataKmo <- read.csv(file = "D:/工作區/我的筆記/程式筆記/R/Ironman Challenge/Paper/BIG5/data.csv",
                    header = TRUE, sep="\t",stringsAsFactors=FALSE)

View(DataKmo)
DataKmo <- DataKmo[1:500, paste0("E", 1:10)]
bartlett.test(DataKmo)


我們可以看到P-Value為0.003小於0.01,判定可進行因素分析

目前做到KMO及Bartlett 都很蠻簡單,下一篇進行PCA主成份分析,到這邊用R做都學得很簡單,以前在想用R做論文的分析都不知從何下手,現在目前發現都很簡單,甚至比EDA資料探索還簡單。




31_用R寫論文_KMO檢定

 在論文中的資料分析中會有信度分析及效度分析,而在前一篇已經介紹信度分析,本篇介紹問卷的效度分析,效度分析簡單講就是問卷中的問項是否可準確測出欲探討的問題,一份問卷的效度愈高,表示測驗的結果越能顯現測量對象的真正特質。

而效度分析可分為內容效度及建構效度。而內容效度及為你的問卷會進行前測和試測,因此內容效度是可以達到,重點是建構效度透過施測者的回答的結果,藉由統計測得建構效度,而進行建構效度時必須進行KMO、球型、主成份分析、因素分析,是一個過程,所以本篇會針對KMO檢定在R中如何進行。

而KMO是Kaiser-Meyer-Olkin的取樣是當性衡量數,當KMO值越大,表示變數間的共同因素越多,越適合進行因素分析,根據Kaiser的觀點,若KMO>0.8表示很好;KMO>0.7表示中等;KMO>0.6表示普通;KMO<0.5表示不能接受

首先依然採用網路上的測試資料每筆資料就是一位填寫問卷的人,變數就是問題本身,跟前面的問卷基本分析紀錄資料的方式一樣,但對於本次57個變數太多了,我們只要E1-E10的變數,及前500名的參與者,而這份問卷主要調查個性是否外向,問項列表如下

這是人們對等級從1 =不同意到5 =同意的外向性項目的列表:

  • E1我是聚會的一生。
  • E2我沒說很多。
  • E3我周圍的人感覺很舒服。
  • E4我一直在後台。
  • E5我開始對話。
  • E6我無話可說。
  • E7我在聚會上與許多不同的人交談。
  • E8我不喜歡引起我的注意。
  • E9我不介意成為關注的焦點。
  • E10我在陌生人周圍安靜。
程式如下:

DataKmo <- read.csv(file = "D:/工作區/我的筆記/程式筆記/R/Ironman Challenge/Paper/BIG5/data.csv",
                    header = TRUE, sep="\t",stringsAsFactors=FALSE)

View(DataKmo)
DataKmo <- DataKmo[1:500, paste0("E", 1:10)]

library(psych)
KMO(DataKmo)



從數值來看E1~E10的KMO值都大於0.9表示很好,每個變數的關聯性都很大,適合做因素分析。

怪不得學術界都會選用R,因為統計檢定真的很簡單,因違商業界真的很少做統計檢定。

2020年9月27日 星期日

30_R互動式網頁_ValueBox & 結論

 承上一篇主題及程式碼我們加入KPI的營運指標,而本篇要在KPI指標下方加入ValueBox以增加儀表板所提供的資訊能力

ui.R程式如下

library(shiny)
library(shinydashboard)

shinyUI(
  dashboardPage(
    dashboardHeader(title = "This is header"),
    dashboardSidebar(
      
      sidebarMenu(
        sidebarSearchForm("searchText","buttonsearch","search"),#加入搜尋
      menuItem("儀表板",tabName = "dashboard",icon = icon("dashboard")),
        menuSubItem("財務儀表板",tabName = "finance"),
        menuSubItem("銷售儀表板",tabName = "sales"),
      menuItem("資料分析"),
      menuItem("原始資料")
    )),
    dashboardBody(
      tabItems(
        tabItem(tabName = "dashboard",
                fluidRow(
                  infoBox("銷售總額美元",1000,icon = icon("thumbs-up")),
                  infoBox("倉庫周轉率%",paste0('20'),icon = icon("warning")),
                  infoBoxOutput("approved")
                ),
                #Add valueBox
                fluidRow(
                  valueBox(15*200,"15天內的預算",icon = icon("hourglass-3")),
                  valueBoxOutput("itemRequested")
                ),
                
                fluidRow(
                  tabBox(
                  tabPanel(title = "財務直方圖",status = "primary",solidHeader = T,plotOutput("histogram")),#move here
                  tabPanel(title = "儀表板控制",status = "warning",solidHeader = T,
                      sliderInput("bins","Number of Breaks",1,100,50),
                      textInput("text_input","search opptunities",value = "123456"))#move here
                  ),
                  tabBox()
                )),
                tabItem(tabName = "finance",
                        h1("財務儀表板")
                        ),
                tabItem(tabName = "sales",
                        h2("銷售儀表板"))
                )
      )

    )
  )

server.R程式如下
library(shiny)
library(shinydashboard)

shinyServer(function(input,output){
  output$histogram <- renderPlot({
    hist(faithful$eruptions,breaks = input$bins)
  })
  output$approved <- renderInfoBox({
    infoBox("已批准訂單","10,000,000",icon = icon("bar-chart-o"))
  })
  output$itemRequested <- renderValueBox({
    valueBox(15*300,"進貨商品總金額",icon = icon("fire"),color = "red")
  })
  
})

在KPI程式碼下加入fluidRow()內含valueBox方法,相同valueBoxOutput()在server.R內加入對應的函式,其實都是相同的邏輯,成果圖如下



基本上大致都完成,但我們可以看到直方圖的右邊並沒有圖,當然我們是練習Dashboard的相關語法,但右邊空著也很奇怪,所以在ui.R的程式如下


在server.R加入


成果圖如下

就像前面所說Shiny的相關方法很多並不能用寥寥幾篇文章就能理解,但可從這些範例入手擺脫枯燥無味的基本練習,達到做中學  學中做,當然這是我個人覺得有效率的學習,也希望對各位有些幫助。

今天也是最後一篇,回首這一個月每天都要發表一篇文章,起先以為很簡單應該不會造成太大壓力,結果還是讓人感覺有重不容易...不簡單的感覺,過程中覺得難的地方是每一篇的內容規劃以及題材蒐集和說明,當自己當初的想法都實行並寫成文章,結果發現只有10天的量。

不過暮然回首第一篇的引言將文章分為三個階段

第一階段會採用R內建的資料集,因為前面提到拿外面的資料光載入及資料整理就需花大量的時間及模索,對於資料的洞悉能力以及R的語法掌握並沒有幫助。

第二階段會以實際資料為主例如購物網站的消費分析、政府公開資料平台、論文中問卷等務實資料來發掘這些資料的分析。

第三階段做資料分析都以自己電腦為主也就是單機,但資料分析的結果需要與人溝通說明,讓其他人知道你的分析結果,而R有一個套件就是Shiny將結果形成互動式的呈現,以現今主流程式來說就是Web系統。

這30天也依據上述三個原則完成本次的鐵人的挑戰,想想還真不簡單,不過時間也很巧,我的碩士論文也要進入前測階段,我的指導教授最近醒了!剛好鐵人賽也結束,但我還是會持續寫將我對R的未解之題持續探索,最後我會將我的論文的資料分析寫成R的互動式網頁,而這些過程我會記錄在我的部落格中.....

各位朋友也祝您們寫code愉快....................bye.............





2020年9月26日 星期六

29_R互動式網頁_加入KPI指標

 承上一篇的主題及程式碼,本篇規劃在右側上方加入KPI營運指標,但又發覺直方圖及拉桿似乎太佔位置了,所以在加入KPI營運指標前,將直方圖及拉感合成一頁並分為兩個頁籤,程式依然以ui.R程式為主

library(shiny)
library(shinydashboard)
shinyUI(
  dashboardPage(
    dashboardHeader(title = "This is header"),
    dashboardSidebar(
      
      sidebarMenu(
        sidebarSearchForm("searchText","buttonsearch","search"),#加入搜尋
      menuItem("儀表板",tabName = "dashboard",icon = icon("dashboard")),
        menuSubItem("財務儀表板",tabName = "finance"),
        menuSubItem("銷售儀表板",tabName = "sales"),
      menuItem("資料分析"),
      menuItem("原始資料")
    )),
    dashboardBody(
      tabItems(
        tabItem(tabName = "dashboard",
                fluidRow(
                  tabBox(
                  tabPanel(title = "財務直方圖",status = "primary",solidHeader = T,plotOutput("histogram")),#move here
                  tabPanel(title = "儀表板控制",status = "warning",solidHeader = T,
                      sliderInput("bins","Number of Breaks",1,100,50),
                      textInput("text_input","search opptunities",value = "123456"))#move here
                  )
                )),
                tabItem(tabName = "finance",
                        h1("財務儀表板")
                        ),
                tabItem(tabName = "sales",
                        h2("銷售儀表板"))
                )
      )
    )
  )

其實我們可以看到程式碼,我們改的地方主要為dishboardBody中fluidRow的程式加入tabBox()將直方圖及拉桿包起來,並將直方圖原先box改為tabPanel,同樣拉桿的程式碼前方加入tabPanel,此時可為一頁又分別為兩個頁籤,這樣的好處是若我在後續規劃有其他的統計圖,可在增加一個tabBox方便我的規畫所增加的內容,成果圖如下



現在dashBoard上方加入三個營運KPI分別為銷售金額、倉庫周轉率、核准訂單,所以會加入fliudRow()內含有兩個infoBox及一個infoBoxOutput進行呈現,程式碼如下

ui.R程式如下
library(shiny)
library(shinydashboard)

shinyUI(
  dashboardPage(
    dashboardHeader(title = "This is header"),
    dashboardSidebar(
      
      sidebarMenu(
        sidebarSearchForm("searchText","buttonsearch","search"),#加入搜尋
      menuItem("儀表板",tabName = "dashboard",icon = icon("dashboard")),
        menuSubItem("財務儀表板",tabName = "finance"),
        menuSubItem("銷售儀表板",tabName = "sales"),
      menuItem("資料分析"),
      menuItem("原始資料")
    )),
    dashboardBody(
      tabItems(
        tabItem(tabName = "dashboard",
                fluidRow(
                  infoBox("銷售總額美元",1000,icon = icon("thumbs-up")),
                  infoBox("倉庫周轉率%",paste0('20'),icon = icon("warning")),
                  infoBoxOutput("approved")
                ),
                fluidRow(
                  tabBox(
                  tabPanel(title = "財務直方圖",status = "primary",solidHeader = T,plotOutput("histogram")),#move here
                  tabPanel(title = "儀表板控制",status = "warning",solidHeader = T,
                      sliderInput("bins","Number of Breaks",1,100,50),
                      textInput("text_input","search opptunities",value = "123456"))#move here
                  ),
                  tabBox()
                )),
                tabItem(tabName = "finance",
                        h1("財務儀表板")
                        ),
                tabItem(tabName = "sales",
                        h2("銷售儀表板"))
                )
      )

    )
  )

server.R程式如下
library(shiny)
library(shinydashboard)

shinyServer(function(input,output){
  output$histogram <- renderPlot({
    hist(faithful$eruptions,breaks = input$bins)
  })
  output$approved <- renderInfoBox({
    infoBox("已批准訂單","10,000,000",icon = icon("bar-chart-o"))
  })
})

上述程式碼中我們可以發現在ui.R中的infoBoxOutput,相對在server.R中也相對應,成果圖如下








28_R互動式網頁_版型調整

 承上一篇主題及程式碼我們已經完成初步的儀表板版型,本篇會進入版型的調整,對於我而言我會將UI的版型完成框架後,進行版型不足之處的加強,當然這是我的習慣,每個人都有自己開發的流程,所以本篇會以下列主題進行UI版型的調整

一、SidebarMenu內容調整

SidebarMenu會進行三個部分做調整包含滑桿下移、增加條件搜尋、增加文字框輸入等三個部分,程式碼如下,如同我針對ui.R做調整

library(shiny)
library(shinydashboard)
shinyUI(
  dashboardPage(
    dashboardHeader(title = "This is header"),
    dashboardSidebar(
      
      sidebarMenu(
        sidebarSearchForm("searchText","buttonsearch","search"),#加入搜尋
      menuItem("儀表板",tabName = "dashboard",icon = icon("dashboard")),
        menuSubItem("財務儀表板",tabName = "finance"),
        menuSubItem("銷售儀表板",tabName = "sales"),
      menuItem("資料分析"),
      menuItem("原始資料"),
      sliderInput("bins","Number of Breaks",1,100,50),#將滑桿移至功能列下方
      textInput("text_input","search opportunities",value = "123456")#增加文字輸入框
    )),
    dashboardBody(
      tabItems(
        tabItem(tabName = "dashboard",
                fluidRow(
                  box(plotOutput("histogram"))
                )),
                tabItem(tabName = "finance",
                        h1("財務儀表板")
                        ),
                tabItem(tabName = "sales",
                        h2("銷售儀表板"))
                )
      )
    )
  )

在ui.R程式碼中可看到加入註記#字號,為本次調整的部分,其實都不示很難,都是一般程式與法範圍功能即可完成,成果圖如下圖,當然條件搜尋即文字輸入沒有反應,因為沒跟資料做連結。


二、直方圖的調整

圖中我們可以感受直方圖很陽春!所以我們會將直方圖加點顏色,以及調整直方圖的動態滑桿拉至與直方圖相同的Body中並加入顏色,讓側邊功能選單能更單純以功能為主,在調整還是以ui.R為主程式碼如下

library(shiny)
library(shinydashboard)
shinyUI(
  dashboardPage(
    dashboardHeader(title = "This is header"),
    dashboardSidebar(
      
      sidebarMenu(
        sidebarSearchForm("searchText","buttonsearch","search"),#加入搜尋
      menuItem("儀表板",tabName = "dashboard",icon = icon("dashboard")),
        menuSubItem("財務儀表板",tabName = "finance"),
        menuSubItem("銷售儀表板",tabName = "sales"),
      menuItem("資料分析"),
      menuItem("原始資料")
    )),
    dashboardBody(
      tabItems(
        tabItem(tabName = "dashboard",
                fluidRow(
                  box(title = "財務直方圖",status = "primary",solidHeader = T,plotOutput("histogram")),#move here
                  box(title = "儀表板控制",status = "warning",solidHeader = T,
                      sliderInput("bins","Number of Breaks",1,100,50),
                      textInput("text_input","search opptunities",value = "123456"))#move here
                )),
                tabItem(tabName = "finance",
                        h1("財務儀表板")
                        ),
                tabItem(tabName = "sales",
                        h2("銷售儀表板"))
                )
      )
    )
  )

我們可以看程式碼其實並沒有多撰寫甚麼程式,只是移動功能的位置,其實在做UI的規劃會花很多的時間調整各功能的位置,有時會看到成果時才發現,UI還可以在做調整。



下一篇!會加入KPI指標





2020年9月25日 星期五

27_R互動式網頁_Dashboard之版型建立

 在前面幾篇都在介紹Shiny套件一些基礎的概念,當然Shiny套件不僅是如此,也不可能幾篇就能介紹完畢,但前面幾篇為重要的操作語言的概念,可了解很多大神的作品及自學的基礎,就像前面幾篇所提到當面對一些新的語法不外乎就是重基礎學起,但又不知如何是好又囫圇吞棗,學習的過程總充滿了挫折,喪失了寫程式的樂趣。

而今天這篇Dashbord儀表板會著重在ui.R中,因為當分析的結果總是要出去跟其他人溝通,在商業的世界可能是老闆或是單位的主管及決策者,而這些人可能不懂資訊就是一般的使用者,若我們以工程是師的概念將結果呈現,效果可能不太好,所以在Shiny套件有Dashboard能讓我們快速製作專業的網頁,當然該套件整合了css語法,但又不像css語法那麼羅唆,所以後續的幾篇程式碼是延續的。

本次儀表板的主題為公司營運管理儀表板,而資料採用R黃石公園溫泉爆發時間與等待時間資料集,對!我知道資料集的內容跟主題不一樣,但我們主要了解Dashboard套件的撰寫方式,須以資料作呈現,若以真實的世界資料為主工程就大了!反而混淆本次的主題,未來可置換資料集即可。

當然開一個資料夾分別存放ui.R及server.R兩個檔案,程式如下

ui.R程式如下

library(shiny)
library(shinydashboard)
shinyUI(
  dashboardPage(
    dashboardHeader(title = "This is header"),
    dashboardSidebar(
      sliderInput("bins","Number of Breaks",1,100,50),
      menuItem("儀表板"),
        menuSubItem("財務儀表板"),
        menuSubItem("銷售儀表板"),
      menuItem("資料分析"),
      menuItem("原始資料")
    ),
    dashboardBody(
      fluidRow(
        box(plotOutput("histogram"))
        
      )
    )
  )
)

server.R程式如下

library(shiny)
library(shinydashboard)
shinyServer(function(input,output){
  output$histogram <- renderPlot({
    hist(faithful$eruptions,breaks = input$bins)
  })
})

ui.R程式中其實細細看來很像html語法,但又沒有html語法的囉唆!簡潔有力,但其中要了解的是sliderInput("bins","Number of Breaks",1,100,50),這為動態拉桿的語法,而在dashboardBody中宣告要繪製直方圖,配合拉桿進行拖曳。

server.R程式中語法很簡單!配合上述所說本次以ui為主,所以我們要了解 hist(faithful$eruptions,breaks = input$bins)該句語法即可,所以翻成白話文為繪製直方圖,使用黃石公園資料集中的爆發時間欄位,並配合動態拉桿中的變數為bins。

成果如下圖



在成果圖上操作發現所功能都沒有連結,也就是html功能都連到一個超連結,所以下面就將功能連上連結,ui.R程式如下

library(shiny)
library(shinydashboard)

shinyUI(
  dashboardPage(
    dashboardHeader(title = "This is header"),
    dashboardSidebar(
      sliderInput("bins","Number of Breaks",1,100,50),
      sidebarMenu(
      menuItem("儀表板",tabName = "dashboard",icon = icon("dashboard")),
        menuSubItem("財務儀表板",tabName = "finance"),
        menuSubItem("銷售儀表板",tabName = "sales"),
      menuItem("資料分析"),
      menuItem("原始資料")
    )),
    dashboardBody(
      tabItems(
        tabItem(tabName = "dashboard",
                fluidRow(
                  box(plotOutput("histogram"))
                )),
                tabItem(tabName = "finance",
                        h1("財務儀表板")
                        ),
                tabItem(tabName = "sales",
                        h2("銷售儀表板"))
                )
      )

    )
  )

程式碼中我們可以發現其實跟html語法的邏輯是相同的,在menuItem指定功能名稱,在dashboardBody指定對應的功能名稱,而在dashboardBody中的tabItem撰寫該功能的程式;而在上述的程式碼中tabItems和tabItem兩個我搞了一小時,看來看去都沒問題程式就跑不起來,原來可以看到兩個函式一個有s一個沒s,有s的為相同類型的東西有很多加s,這是英文的基本文法,搞完才發現原來就這麼簡單,下面為成果圖



在成果圖上可以看儀表板有圖示icon,在程式碼中也有看到,其實Shiny套件也支援一般網頁第三方圖示套件,我們在console中輸入?icon即可出現相關說明如下圖


我們可看到網址有在寫前端的朋友應該都不陌生,只要知道該圖示的名稱,如本篇程式輸入圖示名稱,及自動去該網站取得該圖示。

今天到這邊,明天見!













2020年9月24日 星期四

26_互動式網頁_關聯規則

 關聯關則是資料探勘中很有名的買尿布有一定的機率會買啤酒,所以尿布和啤酒有一定的關聯度,所以在消費行為分析上是很有用,而分析的結果店家可以進行商品組合促銷,增加商品銷售率,關聯規則本來是要在店商分析中說明,不過沒關係配合Shiny網頁讓行銷人員透過Web進行分析,不過這些預測性的東西都須要對一些名詞的理解才能解釋,所以在這邊以尿布和啤酒,言簡意賅做解釋。

Support (支持度) : 意思是某特定種類在所有種類的比重,例如我有100名會員,其中有20名購買過尿布,則support(尿布) = 20% 。

Confidence (信賴度) : 意思是某A種類中,含有某B種類的比重,例如我有100名會員,其中40人買過啤酒,而這40買過啤酒者當中,又另有10人買過尿布,則confidence(啤酒->尿布) = 10/40 = 25% 。

Lift (提升度) : 意思為某兩者關係的比值,如果小於1 代表兩者是負相關,等於1 表示兩者獨立,大於1 表示兩者正相關,公式為confidence(A->B) / support(B) ,帶入上述例子可表示成 lift(尿布->啤酒) = 25/20 = 1.25 。

在R執行關聯規則須將原本資料結構dataframe轉換成transactions類別,也就是二元關聯矩陣,聽起來很像很偉大,其實就一個指令而已,而本次資料集採用套件arules中的Groceries內建資料集,該資料集為便利商店30天內的交易共計9835 筆,169各類別商品,該資料集已經為transactions資料類別,程式如下:

server.R程式

library(shiny)
library(arules)
shinyServer(function(input,output){
  
  output$mba <- renderPrint({
    rules <- apriori(Groceries,parameter = list(support=.001,
                                                confidence=.8))
    inspect(rules)
  })
  
})
ui.R程式
library(shiny)

shinyUI(fluidPage(
  sidebarLayout(
    sidebarPanel(
    
    ),
    mainPanel(
      verbatimTextOutput("mba")
    )
  )
))

在server程式中將商品的關聯結果採用renderPrint(),而不採用renderTable因為試過所呈現的效果不好,而在ui.R使用verbatimTextOutput(),該函式是建立文字元素通常是跟renderPrint()配合使用,因此成果如下圖


上圖我們可以看到關聯規則將所有的結果呈現,若使用者要調整不同的支持度和信賴度是無法調整,因為我們在server.R將兩個值給了固定值,所以我們將調整可以讓使用者調整兩個值,程式如下

ui.R程式調整如下

library(shiny)
shinyUI(fluidPage(
  sidebarLayout(
    sidebarPanel(
      selectInput("sup","請選擇支持度",choices = c(.1,.01,.05,.001,.005)),
      selectInput("conf","請選擇信賴度",choices = c(.5,.6,.7,.8,.9))
    ),
    mainPanel(
      verbatimTextOutput("mba")
    )
  )
))

server.R程式調整如下

library(shiny)
library(arules)
shinyServer(function(input,output){
  
  output$mba <- renderPrint({
    rules <- apriori(Groceries,parameter = list(support=as.numeric(input$sup),
                                                confidence=as.numeric(input$conf)))
    inspect(rules)
  })
})

在上述程式在ui.R中設定兩個變數分別為sup及conf`,存放支持度和信賴度的值,因此在server.R將值帶入,成果如下圖


以第一筆紅框來講,買{酸奶,優格}=>{全指牛奶}來看,兩者商品同時出現占所有商品的1%,而買了{酸奶,優格}會買{全指牛奶}佔全部數據58%,兩者商品的提升2.2為正相關。


2020年9月23日 星期三

25_R互動式網頁_DataTable

 在前面有介紹到Shiny套件在網頁呈現資料表格的方式,當然是很陽春!而今天我們在開發Web時都會常做的頁面,將資料呈現在網頁上,可讓使用者選擇整個頁面總共出現幾筆資料,並有關鍵字可進行搜尋,網頁的下方有資料的分頁。

我相信!在開發Web頁面時這些都是很基本的功能,甚至有時使用者會要求依據他篩選的資料要求,下載成csv或Execl檔案,供它們後續的加值應用。

因此本篇將以R的資料集iris進行,首先也是開一個新的資料夾,並將ui.R及server.R開新檔分別命名,當然也可以將之前幾篇的檔案複製過來;接下來安裝套件DT,而DT套件是甚麼?DT套件使得JavaScript中的方法能在R中被應用,並將矩陣或者數據表在網頁中可視化成表格,程式碼如下

ui.R程式

library(shiny)
library(DT)
ui <- fluidPage(
  titlePanel("Data Table Download"),
  sidebarLayout(
    sidebarPanel(
      
    ),
    mainPanel(
      DT::dataTableOutput("iris")
    )
  )
)

server.R程式

library(shiny)
server <- shinyServer(function(input,output){
  output$iris <- DT::renderDataTable({
    iris
  })
})

成果如下


老實說真的很簡單!做出來東西雖然不很炫!但簡單乾淨,當然有很多參數可調,可使用?DT()就會有眾多參數進行調整,接下來就是依據使用者的篩選後的結果下載,目前我們的搜尋針對項次做搜尋,而搜尋的結果可下載成csv檔案,本次只要修改server.R即可,ui.R維持原樣程式碼如下
library(shiny)
server <- shinyServer(function(input,output){
  output$iris <-  DT::renderDataTable({
    DT::datatable(iris,
                  extensions = 'Buttons',
                  options = list(
                    dom = 'Blfrtip',
                    buttons = 
                      list(
                        list(
                          extend = 'csv',
                          buttons = c('csv'),
                          exportOptions = list(
                            modifiers = list(page = "current")
                          )
                        ))
                  )
    )
  })
  
})

其中程式碼中Blfrtip是有意義不是單純字串,解釋如下

l- l更改輸入量
f- f過濾輸入
t-有t能力!
i-表i信息摘要
p- p攪拌控制
r- r處理顯示元素

成果如下



下一篇見!









2020年9月21日 星期一

24_R互動式網頁_Shiny Plot

 上一篇中將資料集以renderTable()涵式以往頁方式呈現,並以動態的方式進行選擇,讓使用者能夠清楚瞭該資料集的結構,而今天我們將了解繪圖的部分,一樣我們還是使用鐵達尼的資料集,並以上一篇的程式碼為基礎進行程式碼的撰寫

首先我們在ui.R撰寫,程式如下

library(shiny)
ui <- fluidPage(
  titlePanel("This is a demo"),
  sidebarLayout(
    sidebarPanel(
      selectInput("inState","請依鐵達尼資料集選擇欄位",choices = names(titanic))
    ),
    mainPanel(
      plotOutput("titanicData")
    )
  )
)

上圖程式碼跟上一篇差不多,不一樣,choices = names(titanic),告訴Shiny套件鐵達尼資料集內所有的變數都可進行選擇;在上一篇我們要呈現資料集的表格,而本次要呈現圖形所以採用  plotOutput("titanicData")涵式告知套件,接下進入到server.R檔案撰寫,程式如下

library(shiny)
server <- shinyServer(function(input,output){
  output$titanicData <- renderPlot({
    hist(titanic[,input$inState])
   
 #stateFilter <- subset(titanic,titanic$Pclass == input$inState)
  })
})

我們把上一篇的語法變為註解,我們可以發現兩者不同之處,告訴套件我們要繪圖renderPlot(),而圖怎麼多我們要要會甚麼圖ㄋ?所以告訴套件繪製直方圖hist(),那直方圖的資料你需要以哪個值為主input$inState,而這個就是在ui.R檔案所設的變數名稱,而我們可以注意input$inState在逗號的右邊,意思為選擇欄相對在逗號的左邊為選擇行,而詳細的部分可參考本篇的第一篇。

最後的成果如下圖



若你的欄位是字串會出現錯誤畫面,不過這不影響我們金要講的重點!

下一篇見!





2020年9月20日 星期日

23_R互動式網頁_Shiny table

 上一篇提到在Shiny套件中具備ui和server兩個物件,ui就是網頁的版型及事件,server將前端的ui進行運算,所以這兩個物件是Shiny套件很重要的觀念,我們延續上一篇的內容發現ui及server都是寫在同一個檔案app.R中,在簡單的程式中這樣是沒有問題,但是在複雜的需求中這樣的寫法就不妥了,所以Shiny套件中的說明建議開發者將ui及server分為兩個檔案撰寫,在維護中也會比較簡單,在修改程式碼中滾輪也不會滾到變成多爾袞。

在分成成各個檔案撰寫聽起來好像有點困難,其實不難其實跟.NET一樣一個專案一個資料夾,資料夾內有網頁所需的檔案以及ui.R及server.R,而分成兩個檔案只需將前一篇的ui貼製ui.R即可,server也是如此,如下圖


成果如下:



要執行時在ui或server兩個檔案都可執行,按下Run App即可


接下來我們要做一個web系統經常做的事,就是依下拉選單的選擇後出現屬於下拉所選的資料,如此的好處因為使用者不會想看所有的資料,所以依下拉選單篩選所屬資料從以前到現在歷久不衰,所以我們使用鐵達尼的資料,先開一個新檔把資料讀進R中,而資料集和讀進R中可參閱第二篇有資料集的下載網址及第三篇將資料至R的程式中。

ui.R程式如下

library(shiny)

ui <- fluidPage(
  titlePanel("This is a demo"),
  sidebarLayout(
    sidebarPanel(
      selectInput("inState","請選擇船艙等級",choices = titanic$Pclass)
    ),
    mainPanel(
      tableOutput("titanicData")
    )
  )
)

server.R程式如下
library(shiny)
server <- shinyServer(function(input,output){
  output$titanicData <- renderTable({
    stateFilter <- subset(titanic,titanic$Pclass == input$inState)
  })
})

在程式碼中跟上一篇shiny的程式都相同,只有renderTable()涵式及subset()涵式不一樣,因本次是要依下拉選單篩選出來的資料,所以是以table方式出現,所以使用renderTable()進行計算;篩選出來的資料使用subset()資料子集涵式包裹。

其實相對的參數都不難理解,成果如下圖

當然你也使用其他資料集自行實驗一下,其實我寫這段時蠻訝異的!因為真的很簡單,比以前在開發web同樣的功能,設過來設過去,有時搞得我好亂啊!記得!若要載進其它資料時,先開依各檔將資料集先讀進R,在開始寫ui及server的程式,當然後續會介紹如何將資料集自動讀進R中。

我們下一篇見!








22_R互動是網頁_基本功

 在R的互動是網頁中必須安裝Shiny套件,如何安裝套件在第二篇資料的視覺化有明確說明,而我們以最簡單的例子來說明,在網頁有輸入框及選擇縣市,當我輸入文字及選擇縣市時右側會顯示,成果如下圖


萬丈高樓平地起,不起眼的程式卻蘊涵絕妙的上乘武功心法,首先開一個新檔名為app.R,程式如下

library(shiny)

ui <- fluidPage(
  titlePanel("This is a demo"),
  sidebarLayout(
    sidebarPanel(
      textInput("txtInput","Input the text to display"),
      selectInput("slctInput","Select the country you live in",choices = c("高雄","台中","台北","台南"))
    ),
    mainPanel(
      paste("You are entering"),
      textOutput("txtOutput"),
      textOutput("countryOutput")
    )
  )
)

server <- shinyServer(function(input,output){
  output$txtOutput <- renderText({
    paste(input$txtInput)
  })
  output$countryOutput <- renderText({
    paste(input$slctInput)
  })
})

shinyApp(ui = ui, server = server)

上面就Shiny網頁的基本語法,不論你要從頭寫還是要複製貼上,上述程式都是一個基本的模板,了解這個基本模板你在參閱一些網路大神作品,你才能使用吸星大法納為己有,首先看下圖三個紅框


上圖1-3的紅框是基本架構ui變數是宣告網頁有甚麼東西正如變數名稱,而server也就網頁所輸入的東西交給後台進行運算,其實跟一般Web架構差不多的概念,而至於第三個紅框很重要將ui及server所撰寫的東西交給shiny涵式進行運算,第四個紅框就是執行所有的結果並以網頁呈現。

而對於語法而言,很簡單說明如下
1.fluidPage:建立一個網頁介面
2.titlePanel("This is a demo")告訴頁抬頭是甚麼
3.  sidebarLayout():告訴網頁我要右側開一個網頁
4.sidebarPanel():告訴網頁建立一個面板
5.面板內包含textInput()及selectInput()

mainPanel():主要將textInput()及selectInput()兩個涵式宣告變數即告訴此兩個變數為textOutput類型涵式,裡面為變數名稱。

shinyServer(function(input,output):告訴shiny涵式會有input也就是ui的兩個變數,以及運算後要輸出的值就是output。

output$txtOutput <- renderText({
    paste(input$txtInput)
  })
在運算部分在shiny使用renderText,而上述為ui的變數所執行的內容,若ui有兩個輸入項,在server就需以上的方式進行處理。

shinyApp(ui = ui, server = server),因為本程式使用ui及server作為變數名稱,當然你的ui及server的名稱可自取,相對shinyApp()函式的等於就是您設定的變數。

今天先到這邊寫太多,就太雜了。
下一篇見!




21_R的互動式網頁之雜談

在以前對互動式這個名詞的感覺,停留在電玩以及PS4才是我認知的互動式的感覺,而網頁也有互動式但在個人的感覺,都是功能為什麼要稱互動式?隨著年紀漸長寫程式的經驗也愈多,看的書籍也相對的多,對網頁互動式的認知也愈來愈清晰,相對我將PS4的遊戲互動降到1/10000就是網頁的互動了!也沒錯!在一些分析的資料PO到網頁上,可讓使用者輸入或拖動拉桿的數值來觀看不同的結果,讓你的分析結果更讓其他人了解,就可稱之為互動式的結果。

相對在R的世界將你的分析結果PO到網頁上呈現就是套件Shiny,翻成中文叫閃亮,那Shiny這個套件跟一般的Web程式有何不同ㄋ?一般的MIS系統都是因應組織單位任務不同所開發出來,所以會有完整的業務流程,並可快速進行業務資料回溯(就是查詢),而使用的語言目前在台灣就是.NET、JAVA、Javascript、PHP,相對這些應用程式都會配合資料庫進行操作。

而R並不是為上述MIS系統而生,若你要用R寫出MIS系統也不是不可以,只是很痛苦而已,所以R就跟他當初的定位一樣就是在資料科學的領域上做分析、預測、統計檢定....等等,Shiny將這些結果以互動式網頁將你的分析結果或預測結果做呈現,而這種呈現會跟你在寫MIS系統的成就很不一樣(我個人感覺)。

最近附近的朋友或同學都在跟我爭論用Python還是R,這種問題就是很早以前要用JAVA還是.NET是一樣,在早期工程師一般都支持JAVA剩至為了支持還集體辭職,到了現在還不是喜歡用.NET繼續用,喜歡用JAVA也繼續用,兩方也不在爭論那一種語言比較好,彼此也互相承認兩種語言的優點,是啊!現在的R和Python不是跟以前一樣,若是就是硬要區分也可以,可區分兩部分

一、學習包袱

若是你已經對MIS系統開發有一定程度或是公司的開發皆以MIS系統為主,所以你對.NET、JAVA、PHP有一定程度的了解,我會建議學習R,因為工程師的青春是有限的學習某一種語言都需要花時間的,而R就是為了巨量資料而來,而R的學習曲線也不高,所以兩者加起來Web及大數據R兩者都會,相對競爭力提高並且兩者互不衝突。

若是你剛進入程式的領域對我會建議你學Python,因為Python對於Web和大數據都很支援,對於建立領域應用的觀念都是很好的程式工具,並且也很新潮對你找工作也有幫助。

二、專注於資料科學領域

這一部分就是要看兩套語言的能力了,其實對於一般資料分析(EDA)兩者軟體不分伯仲,但網路上有人說大量資料還是用Python比較好,我個人覺得這是一個假議題,就像我的資料探勘的老師說,資料要多大才能稱之為大?以我這次參加鐵人找題目做實驗,跑一個10萬和20-30萬筆資料也是嚇嚇叫,跑統計圖也沒讓我等,注意我的筆電i5 CPU低電壓 8GB 內建顯卡,所以說當資料大到某一個程度時,不論是Python還是R都要用專業伺服器跑,要不然每所大學都有大數據實驗中心是假的嗎?但兩套語言還是有不一樣的,說明如下

R對於統計、統計檢定、機器學習、資料探勘等是較為強大。

Python對於深度學習、類神經網路、Web是較為強大的。

所以你的職業是專注那一部份就很重要了,當然網路上有人說兩套都學,因為你在做預測模型時會用到統計檢定,看你的模型的準確性,而R的統計檢定真的很簡單,因為他就是做統計出身的語言,當然你要用Python進行統計檢定也可以,那就自行寫程式,而R就一行就搞定,所以這部分就看大家的需求而定了。

當然我並不是要爭論兩套語言誰比較好,並說服大家選邊站,只是最近在學校及朋友都有討論到這話題,在討論中雙方都進入二元論中,就是有你沒有我,有我沒有你,甚至連我都進入這個二元論中,這也難怪!當你努力學習某一種語言時,被人否定時當然會不舒服,相對他人也是如此....所以寫這篇文章畢竟開卷有益,學習東西都是好事,每種語言只要符合你的需求都是好語言。

在第一篇中的引言有講到第二階段會以實際案例為主,到了上一篇也就告一段落,所以進入第三階段就是R 的 Shiny套件,所以這一篇也算是第三階段的引言,所以後續都會以Shiny套件為主,當然我也會以自身的經驗為主,一開始不會用很炫的案例,因為當初在學習Shiny就被這些酷炫的範例給迷惑,結果自己要從無到有不知道如何建立,甚至閱讀其他人的程式碼也很辛苦,所以會以基礎到實際。

下一篇見!


2020年9月15日 星期二

20_老媽問我最近青菜水果那一種比較便宜_我用R告訴她!

 上一篇用R寫論文做到信度分析,後面就是效度分析,本想繼續寫下去但要講到KOM、球形、CFA、SEM等檢定方法,若是寫下去各位程度都沒問題一定都看得懂,但小弟必須將研究方法上下學期筆記拿起來在K一遍,消化完再用言簡意賅寫出來,心想天都亮了!再者,後面的效度分析以及建構因子,有在寫論文的人比較用得到,對於商業的應用比較少,比較多的是上一篇的信度分析及基本分析,經過幾番思量用R寫論文就到上一篇就告一段落,就像寫論文題目太大寫的人很辛苦,看的人也很累,因此本篇就以我母親的抱怨為題目吧!

本篇系列的資料集來自政府資料公開平台中,在搜尋欄位輸入農產品交易,會出現各縣市的農產品交易,但我們以農委會所產的資料為主。但近一個月的觀察農委會將每日交易行情在中午12點以前PO到資料公開平台,所以我就翻遍資料公開平台所有連結,就是要找到網址界接,並使用for迴圈撈一個月的資料,但怎麼都沒看到,所以採用每日單點下載,所以日期會跳日不過這不會影響我們的分析,資料下載點:https://drive.google.com/file/d/1dMXFMZ5WhfR03bWbNMmm0c0CxutoeJVH/view?usp=sharing

解壓縮後會看到一堆csv檔案,所以我們會用list.file()函式將資料夾內的csv檔案彙整為一個資料集,其時我個人很喜歡這個函式,因為在平常會有很多的檔案要做分析,稍做整理就能成為一個資料集,注意資料夾就只有本次的csv檔案不要參雜其他的csv檔案,程式碼如下

Agricultural <- list.files(path = "D:/工作區/我的筆記/程式筆記/R/Ironman Challenge/Agricultural",
                           pattern="*.csv",full.names=TRUE) %>% 
  map_df(~read_csv(.))
str(Agricultural)
View(Agricultural)

看一資料結構













我們可以看到紅框資料集為tibble為dataframe的延伸換言之式繼承了dateframe,所以使用起來很靈活,本次資料集為7988筆資料11個變數,但變數名稱為中文字,不過沒關係因為原始資料就是如此,若是正式的話還是建議將變數名稱改為英文,接著瀏覽一下資料


看完資料不得要稱讚一下農委會資料很乾淨,當然啦!若是你用execl開不會如此的井然有序,所以本次的資料集不須進行整理,但該如何分析?....首先我們可以看到光9/2號就有很多的交易為其一,其二市場名稱有多少個市場?是全台灣嗎?其三每個做物名稱都有上、中、下、平均、交易等。

首先我就看總共有多少日的交易,以及多少個市場,全日的總交易及總評均價,先從此部分做個探索
AgriculturalTrans <- Agricultural  %>% 
   group_by(交易日期,市場名稱) %>% 
   summarise(TotalTransaction = sum(交易量),
             TotalMeanPrices = sum(平均價)) %>% 
   ungroup()
 View(AgriculturalTrans)

看起來市場為全台灣,而全台灣共有83各市場,當天每交易金額為0,劃一下統計圖程式如下
options(scipen = 200)
 ggplot(data = AgriculturalTrans)+
   geom_bar(aes(x=交易日期,y=TotalTransaction,fill=市場名稱),
            stat="identity") 


所以交易日共計六天,其中9/11交易量最高次之為8/23日,從市場來看台北一、台北二、三重,為全國交易量最多,次之為台中市,相對南部的市場交易並不是很多。

在上述程式中 options(scipen = 200)主要功能為呈現正確數字,而不適用科學數字,各位可試一下。





2020年9月14日 星期一

19_用R寫論文_信度分析

 上一篇是論文的基本分析就是將問卷發放後,觀察填寫問卷者的背景,而本篇介紹的為問卷的信度,也就是這一份問卷經多人填寫完後,問卷的結果可信度是如何?而信度分析若發放問卷,都一定會做,像我們的總統大選都會做問卷調查,調查完後一定做信度分析。

而甚麼是信度分析所謂信度是衡量沒有誤差的程度,也是測驗結果的一致性(consistency)程度,信度是以衡量的變異理論為基礎。

為什麼會有誤差,因為發放問卷填寫者會受到以下影響,第3項和第4項是可控制,而第一項和第二項是較難控制,因此需進行信度分析,以了解此份問卷的結果是否可相信。

1.由回應者(respondent)產生的誤差

2.由情境因素產生的誤差

3.由衡量者產生的誤差

4.由衡量工具產生的誤差

信度分析衡量包含了再測信度、折半信度、複本信度、庫李信度等,一般問卷都會採用庫李信度,也就是內部一致性,每一個問項的可信度。

上面概略解釋所謂的信度分析,看起來似乎有點複雜,但在R做信度分析尤其是內部一致性是很簡單,甚至比在做探索性分析還簡單。

首先我依然採用網路的資料集來,而這次下載資料集的方法有點不一樣,先建立暫存變數(存放),使用download.file()下載,在將資料讀進R,程式法如下

temp <- tempfile()
download.file("http://personality-testing.info/_rawdata/BIG5.zip", temp, mode="wb")
d <- read.table(unz(temp, "BIG5/data.csv"), header = TRUE, sep="\t")
unlink(temp); rm(temp)

str(d)
View(d)

該資料集共有19719筆資料換言之有19719人填寫問卷,共有57個變數,在看該資料集的內容如下

每筆資料就是一位填寫問卷的人,變數就是問題本身,跟前面的問卷基本分析紀錄資料的方式一樣,但對於本次57個變數太多了,我們只要E1-E10的變數,及前500名的參與者,而這份問卷主要調查個性是否外向,問項列表如下

這是人們對等級從1 =不同意到5 =同意的外向性項目的列表:

  • E1我是聚會的一生。
  • E2我沒說很多。
  • E3我周圍的人感覺很舒服。
  • E4我一直在後台。
  • E5我開始對話。
  • E6我無話可說。
  • E7我在聚會上與許多不同的人交談。
  • E8我不喜歡引起我的注意。
  • E9我不介意成為關注的焦點。
  • E10我在陌生人周圍安靜。
取前500名參與者以及E1-E10變數,程式如下
d <- d[1:500, paste0("E", 1:10)]
str(d)

由於(E2,E4,E6,E8,E10)為測謊題,需進行以下操作(測謊題的計算可上網了解),程式如下

d[, paste0("E", c(2, 4, 6, 8, 10))] <- 6 - d[, paste0("E", c(2, 4, 6, 8, 10))]

首先將套件載入,扣除套件的程式只需兩行,其嚴格來說只需第三行即可算出,如下

library(psych)
library(dplyr)

psych::alpha(d,check.keys = TRUE)
psych::alpha(d,check.keys = TRUE)$total$std.alpha

在Console會跑出一堆資料,其時只需看紅框的部分,內部一致性的值要大於0.7,由上至下來看,第一個紅框告你10個變數均有0.9,第二個紅框是每個問項的內部一致性大部分為0.89,所以從檢定的數值來看該份問卷的信度分析總體檢訂為0.9,每個問項均有0.89其中E6為9.0,因此該份問卷可信度符合內部一致性檢定。

當然在此份問卷內部一致性設為0.7,而在一些論文中也看過設0.5是最低,而你要設多少可能要跟你的指導教授討論,但最低值就是0.5,若是一般商業問卷依據自行的情況設定,相對標準值設愈高,問卷的可信度就愈高。


無現金支付的反思!

  **購物經歷** - 作者花費大量時間尋找立燈,最終在IKEA購買了一個649元的立燈 - 在IKEA附近停車場遇到只接受無現金支付的情況,被迫註冊並使用Line Pay **無現金支付的觀察** - 作者認為Line Pay作為前端介面,有助於提高停車場付費效率 - 作者預...