2020年9月20日 星期日

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作為前端介面,有助於提高停車場付費效率 - 作者預...