本小節的目的為統整統計學在敘述性統計在R語言上的寫法
我們採用內建的iris資料
data(iris)
dim(iris) # 查看列數與欄數
#看看IRIS資料集的頭尾
head(iris, 10) #取前10筆資料
tail(iris,10) #取後10筆資料
mean(iris$Sepal.Length) #「花萼長度」的平均值
median(iris$Sepal.Length) #「花萼長度」的中位數
max(iris$Sepal.Length) #「花萼長度」中的最大值
min(iris$Sepal.Length) #「花萼長度」中的最小值
sum(iris$Sepal.Length) #「花萼長度」加總
#類別資料算平均,得到NA不是夢
mean(iris$Species)
var(iris$Sepal.Length) #「花萼長度」的變異數
sd(iris$Sepal.Length) #「花萼長度」的標準差
range(iris$Sepal.Length) #「花萼長度」最小值和最大值(全距)
quantile(iris$Sepal.Length, probs=0.25) # 第一四分位數
quantile(iris$Sepal.Length, probs=0.75) # 第三四分位數
summary(iris)
#可是summary 指令有些東西沒有呈現, 還是要自己算
sd(iris$Sepal.Length) #標準差
n=table(iris$Sepal.Length)
as.numeric(names(n))[which.max(n)] #眾數
在處理遺漏值時,大多數的人都會「直接移除資料」或是用「平均值來填補遺漏值」,但這樣的做法並不推薦:前者會讓資料減少,後者不會產生任何資訊。
因此在遺漏值處理的手法上,最推崇的就是「k-Nearest Neighbours」或「mice套件」來填補遺漏值。其中,mice的全名為Multivariate Imputation via Chained Equations。
#我們先使用iris的資料集,讓資料中隨機產生遺漏值
install.packages("missForest")
require(missForest) # prodNA() function
data <- prodNA(iris, noNA = 0.1) ## 在iris資料內,隨機產生10%的遺漏值
head(data)
# 當一筆資料是完整的,回傳TRUE;當一筆資料有遺漏值,回傳FALSE
complete.cases(data)
# 移除有遺漏值的資料
rm.data <- data[complete.cases(data), ]
dim(rm.data) # 查看列數與欄數
rm.data
mean.data <- data
mean.1 <- mean(mean.data[, 1], na.rm = T) # 取第一欄位的平均數
na.rows <- is.na(mean.data[, 1]) # 第一欄位中,有遺漏值存在的資料
mean.data[na.rows, 1] <- mean.1 # 用第一欄位的平均數,填補第一欄位的遺漏值
# 當一筆資料是完整的,回傳TRUE;當一筆資料有遺漏值,回傳FALSE
complete.cases(mean.data$Sepal.Length) #看一下還有沒有遺漏值
[Tutorial on 5 Powerful R Packages used for imputing missing values] https://www.analyticsvidhya.com/blog/2016/03/tutorial-powerful-packages-imputing-missing-values/
K-Nearest Neighbours(KNN)運用在遺漏值填補上的想法很簡單:
這就是用KNN來填補遺漏值的想法。
install.packages("bitops"); install.packages("DMwR"); library(DMwR)
imputeData <- knnImputation(data); head(imputeData)
h1<-hist(iris$Sepal.Length, breaks=10, xlab="Sepal Length", main="Histogram of Sepal Length")
# break 切成 10組
# 但你會發現怎麼只取8組
# 別忘了最左最右的兩刀
h1$breaks #看一下它怎麼切的
seq(4,8,by=0.4) # 自己決定切割的組距 (從4到8 每0.4 切一組距)
h2<-hist(iris$Sepal.Length, breaks=seq(4,8,by=0.4))
在直方圖中, 我們很常搭配常態分配曲線, 來看資料符不符合常態
h3<-hist(iris$Sepal.Length, breaks=seq(4,8,by=0.4), prob=TRUE)
m = mean(iris$Sepal.Length)
std = sqrt(var(iris$Sepal.Length))
curve(dnorm(x, mean=m, sd=std), col="darkblue", lwd=2, add=TRUE) #add=TRUE 是將曲線疊加上去
plot(iris$Species, xlab="Species")
par(mfrow=c(1,2))
boxplot(iris[,1:2]) #單變數畫圖
boxplot(iris$Sepal.Length~iris$Species) #兩個變數
dev.off()
par(mfrow=c(2,2))
boxplot(Sepal.Length ~ Species, iris, main = "Sepal Length wrt Species", col = "lightpink3")
boxplot(Sepal.Width ~ Species, iris, main = "Sepal Width wrt Species", col = "antiquewhite1")
boxplot(Petal.Length ~ Species, iris, main = "Petal Length wrt Species", col = "lightskyblue4")
boxplot(Petal.Width ~ Species, iris, main = "Petal Width wrt Species", col = "orange1")
dev.off()
plot(iris$Petal.Length, iris$Petal.Width, pch=19, col=iris$Species)
abline(lm(iris$Petal.Width~iris$Petal.Length), col="blue") #abline是畫一條線(本例而言是畫迴歸線 lm)
相關係數(Correlation Coefficient)
#### [補充]:
with(iris, plot(iris, col = Species)) #散布矩陣圖
#你會看到最右邊與最下面呈現是名目資料
# 另外 Petal.Length 及 Petal.Width 呈現線性關系 (在我還沒有用其它任何統計方法, 我就大概猜的到這兩個變數有關係)
table(iris$Species)
pie(table(iris$Species), main = "Pie Chart of the Iris data set Species",
col = c("orange1", "chocolate", "coral"), radius = 1)