羅德興老師的教學歷程檔案 - 107-1 資訊科技大數據分析 - 資料分析第一步
 

企業資訊與管理系
助理教授/日導
羅德興


歷程檔案 Portfolio

    資料分析第一步

    # R 的 資料分析第一步
    # https://rpubs.com/skydome20/R-Note5-First_Practice
     
    # Ex. B1 
     
    setwd("d:/temp0922")
    getwd()
     
    # 從 右下方 <packages> Install 安裝所需 packages
    ## install.packages(car)
     
    # 簡單的資料分析(迴歸分析)
    # 本篇目錄
    # 查看資料集
    # 敘述統計-繪圖
    # 資料預處理
    # 迴歸分析
    # 常態性假設
    # 獨立性假設
    # 變異數同質性假設
    # 預測
    # 變異數分析(anova)
    # 總結
     
    # 這裡將會運用之前提到過的技巧(以及介紹新技巧),進行一次簡單、完整的資料分析,帶大家體會整個資料探勘的流程。
     
    # 1. 查看資料集
    # 這裡使用的資料,是R內建的鳶尾花(iris)資料(來自於datasets套件)。
     
    # 先用str()和head(),查看資料裡面的狀態:
     
    require(datasets)  # source package
    str(iris)          # check structure of iris
    head(iris, n=6)
     
    # B1-1: 不難看出,iris的資料筆數為  (      ) 筆,共有 (    ) 個欄位:
     
    # 花萼長度(Sepal.Length):計算單位是公分。(連續)
    # 花萼寬度(Sepal.Width):計算單位是公分。(連續)
    # 花瓣長度(Petal.Length) :計算單位是公分。(連續)
    # 花瓣寬度(Petal.Width):計算單位是公分。(連續)
     
     
    # 此外也可以用summary(),看各個欄位的基本統計資訊:
     
    summary(iris)
     
    # B1-2: 品種(Species):可分為  s(    ),V(             )和V(           )。(類別)
     
    # 2. 敘述統計-繪圖
    # 在進行資料分析之前,先仔細觀察資料,看看能不能從裡面找到一些隱藏資訊。
    # 例如,花萼長度(Sepal.Length)和花萼寬度(Sepal.Width),既然都是花萼,可能會有相關,於是畫圖來看看:
    # *** 附上三種繪圖系統的程式碼,以ggplot2輸出 ***#
     
    ### Base Plotting System 
    plot(x=iris$Sepal.Length, y=iris$Sepal.Width,pch=2)
     
    ### Lattice 
    require(lattice)
    xyplot(Sepal.Width~Sepal.Length, data=iris)
     
    ### ggplot2 
    require(ggplot2)
    ggplot(data=iris) +
      geom_point(aes(x=Sepal.Length,
                     y=Sepal.Width)) +
      theme_bw() 
     
    # 嗯…好像看不出什麼東西?
    # 那試試看花瓣長度(Petal.Length)和花瓣寬度(Petal.Width):
     
    #*** 附上三種繪圖系統的程式碼,以ggplot2輸出 ***#
     
    ### Base Plotting System 
    plot(x=iris$Petal.Length, y=iris$Petal.Width,pch=16)
     
    ### Lattice 
    require(lattice)
    xyplot(Petal.Width~Petal.Length, data=iris)
     
    ### ggplot2 
    require(ggplot2)
    ggplot(data=iris) +                        # 準備畫布
      geom_point(aes(x=Petal.Length,           # 散布圖
                     y=Petal.Width)) +
      theme_bw()                               # 改變主題背景成白色
     
    # Bingo,可以觀察出來,花瓣長度和寬度之間,存在著線性關係,而且明顯分成兩群(左下角和右上角),推測可能和種類(Species)有關,左下角的資料可能是屬於同一種類的鳶尾花。
    # 為了確認這一點,我們在上面那張圖標上顏色:
     
    #*** 附上三種繪圖系統的程式碼,以ggplot2輸出 ***#
     
    ### Base Plotting System 
    plot(x=iris$Petal.Length, y=iris$Petal.Width,pch=16)
    d1 <- iris[iris$Species=="versicolor", ]
    points(x=d1$Petal.Length, y=d1$Petal.Width,pch=16, col="green")
    d2 <- iris[iris$Species=="setosa", ]
    points(x=d2$Petal.Length, y=d2$Petal.Width,pch=16, col="red")
    d3 <- iris[iris$Species=="virginica", ]
    points(x=d3$Petal.Length, y=d3$Petal.Width,pch=16, col="blue")
    legend("topleft", pch=16,
    legend=c("setosa","versicolor","virginica"), 
       col=c("red", "green", "blue"))
    # B1-3: 圖中品種(Species)圖示可分為 紅色為 (       ),綠色為 (             ),和藍色為 (           )
     
    ### Lattice 
    require(lattice)
    xyplot(Petal.Width~Petal.Length, 
          data=iris, 
          pch=16,
          group=Species, 
          auto.key=list(space="top",
                        columns=3, 
                        cex.title=1, 
                        title="Species Labels",
                        pch=16)  
         )
     
    ### ggplot2 
    require(ggplot2)
    ggplot(data=iris) +                        # 準備畫布
      geom_point(aes(x=Petal.Length,           # 散布圖
                     y=Petal.Width,
                     color=Species)) +         # 把不同品種的資料標上顏色
      
      theme_bw()                               # 改變主題背景成白色
     
    # 並且看不同種類的鳶尾花,長度和寬度的盒鬚圖:
     
    #*** 附上三種繪圖系統的程式碼,以ggplot2輸出 ***#  
     
    ### Base Plotting System 
    boxplot(Petal.Length~Species, data=iris, xlab="Species", ylab="Petal.Length")
    boxplot(Petal.Width~Species, data=iris, xlab="Species", ylab="Petal.Length")
     
     
    ### Lattice 
    require(lattice)
    bwplot(x = Petal.Length~Petal.Width | Species, data = iris)
     
    ### ggplot2 
    require(ggplot2)
    qplot(x=Petal.Length,      
          y=Petal.Width, 
          data=iris, 
          geom="boxplot",    # graph type is boxplot
          color=Species)
     
    # 3. 資料預處理
    # 資料探勘的分析過程中,「資料預處理」往往是最花時間的(佔整個流程的70~80%)。
    # 根據不同的資料,預處理手法也會不一樣(改變結構、類別轉啞變數、正規化…),
    # 而在預處理之中,最常見的莫過於「遺漏值的處理」!
    # 要用R檢查資料裡是否有遺漏值的存在,需要使用is.na()的函式:
    # 範例
    data <- data.frame(x=c(1,2,3,NA,5),
                       y=c(4,5,3,NA,NA))
    data  
     
    is.na(data)        # 遺漏值的地方,標註為TRUE (TRUE/FALSE矩陣的型態)
     
    table(is.na(data)) # 資料中總共有多少個遺漏值  
     
    # 有遺漏值的資料會影響分析結果,因此我們會採取一些手段,
    # 主要可以分為兩類「移除有遺漏值的資料」、「填補遺漏值」:
    # 移除有遺漏值的資料,以下兩種方法都可以 #
    data[complete.cases(data), ] # 1.使用 complete.cases() 
    na.omit(data)                # 2.或是使用 na.omit()
     
    # 填補遺漏值(用平均數填值) #
    data[is.na(data[,"y"]), "y"] <- mean(data[,"y"], na.rm=T)
    data
     
    # 現在回到iris的資料,檢查看看裡面有沒有遺漏值:
    table(is.na(iris))
     
    # B1-4: 看來十分完美,有(    ) 個遺漏值,所以讓我們繼續下去吧!
     
    # 4. 迴歸分析
    # 廻歸分析是以一個或一組自變數(解釋變數、預測變項,Xi),
    # 來預測一個數值性的因變數(依變數、應變數、被預測變項,Y)。
    # 相信大家都知道,簡單迴歸表示只有一個Y;複回歸則允許多個Y存在。
    # 要在R跑線性回歸的模型,要使用函式lm()(Linear Model): model = lm(Y ~ X1+X2+…+Xk, data=…)
     
    # 在這裡,我們以Sepal.Length為依變數(Y),以Sepal.Width、Petal.Length、Petal.Width為自變數(X),進行迴歸分析:
     
    model <- lm(formula= Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width,
                data=iris)
    summary(model)
     
    # 從報表中來看,我們可以獲得許多資訊:
     
    # B1-5: Sepal.Length = (        ) + (       )xSepal.Width + (        )xPetal.Length - (        )xPetal.Width
     
    # 根據p-value,三個自變數(X)對Y都表示顯著。
     
    # B1-6: R-squared: (       ) ; Adj R-squared: (      ),表示模型預測能力不錯。
     
    # B1-7: Residual standard error: (        )
     
    # 然而,當我們建立出一個線性回歸時,必須要確認其殘差(residual)是否符合下面三個假設:
    # 常態性(Normality)
    # 獨立性(Independence)
    # 變異數同質性(Homogeneity of Variance)
     
    # 故,首先我們要先從回歸模型中找到殘差的值,可以使用names()函式,查看回歸模型內具有的資訊:
     
    names(model)
     
    # 其中,residuals就是指殘差的值(coefficients代表係數),因此我們可以取出來後進行上面三個假設的檢定:
     
    model$residual
     
    # 常態性假設
    # shapiro.test()函式可以用來檢驗殘差的常態性:
     
    shapiro.test(model$residual)
     
    # 由於虛無假設H0:殘差服從常態分配,因為p-value > 0.05,代表不會拒絕H0。
     
    # 獨立性假設
    # 要檢驗殘差的獨立性,需要使用套件car中的durbinWatsonTest()函式:
     
    require(car)
    # 因為這個函式會自動去抓模型中的殘差,故這裡放的是模型,而不是殘差的值
    durbinWatsonTest(model) 
     
    # 由於虛無假設H0:殘差間相互獨立,因為p-value > 0.05,代表不會拒絕H0。
     
    # 變異數同質性假設
    # 要檢驗殘差的變異數同質性,需要使用套件car中的ncvTest()函式:
     
    require(car)
    # 因為這個函式會自動去抓模型中的殘差,故這裡放的是模型,而不是殘差的值
     
    ncvTest(model)
     
    # 由於虛無假設H0:殘差變異數具有同質性,因為p-value < 0.05,代表拒絕H0。(這表示上面的線性模型無法使用)
     
    # 預測
    # 最後,我們建立模型的目的,是要用來預測!
     
    # 因此,現在我們手上有一筆新的觀測值,只有Sepal.Width、Petal.Length、Petal.Width的資訊,
    # 那我們就可以用建好的迴歸模型,預測出Sepal.Length的值,這時使用predict()函式:
     
    new.iris <- data.frame(Sepal.Width=3.456, Petal.Length=1.535, Petal.Width=0.341)
    new.iris
     
    predict(model, new.iris)
     
    # 5. 變異數分析(anova)
    # 經過視覺化的步驟,發現三個品種鳶尾花的Petal.Width或Petal.Length(平均數)有所差異。
     
    # 若要用統計上的檢定,要進一步地確認,就可以使用變異數分析(anova)。
     
    # 假設檢定的對應H0和H1分別如下:
     
    # H0: μ(Setosa) = μ(Versicolor) = μ(Virginica)
    # H1: 至少有一種平均數和其他品種不相等
     
    # 要用one-way-anova ,R的函式是anova(),並且事先要跑線性迴歸模型:
     
    a.lm <- lm(Petal.Width~Species, data=iris)
    anova(a.lm)
     
    b.lm <- lm(Petal.Length~Species, data=iris)
    anova(b.lm)
    # B1-8: Analysis of (             ) Table
    # 兩者的 p-value 都遠小於0.05,表示不同品種間確實有顯著差異。
     
    # 總結
    # 完成這篇作業後,除了複習之前的技巧之外,還學到了新的技巧:遺漏值處理,迴歸分析,變異數分析。
     
    # 事實上,要學會R的各種技巧並不難!難的是當我們陸續學到許多技巧後,要如何把這些技巧靈活運用在各式各樣的資料上。同時,你需要了解R再強大,充其量不過只是一個工具而已,若沒有紮實基礎與清楚的思維,也只是在舞刀耍棍罷了,實際上是派不上用場的。
    # 之後,會繼續介紹各種不同的模型(決策樹、類神經網路…),在R上怎麼操作,並且根據不同的資料,導入不同(資料)處理手法。
     




    全部共 0則留言
    登入帳號密碼代表遵守學術網路規範


    文章分類 Labels


    最新文章 Top10

    中華科技大學數位化學習歷程 - 意見反應