# 질적 자료 (범주형) : 명목척도 / 서열척도
# 양적 자료 : 구간척도 (원점 없음) / 비율척도 (원점 존재)
# 양적 자료의 요약
library(reshape)
attach(tips) # dataframe name 호출하지 않아도 됨.
summary(tips)
## total_bill tip sex smoker day
## Min. : 3.07 Min. : 1.000 Female: 87 No :151 Fri :19
## 1st Qu.:13.35 1st Qu.: 2.000 Male :157 Yes: 93 Sat :87
## Median :17.80 Median : 2.900 Sun :76
## Mean :19.79 Mean : 2.998 Thur:62
## 3rd Qu.:24.13 3rd Qu.: 3.562
## Max. :50.81 Max. :10.000
## time size
## Dinner:176 Min. :1.00
## Lunch : 68 1st Qu.:2.00
## Median :2.00
## Mean :2.57
## 3rd Qu.:3.00
## Max. :6.00
library(psych)
describe(tips)
## vars n mean sd median trimmed mad min max range skew
## total_bill 1 244 19.79 8.90 17.8 18.73 7.46 3.07 50.81 47.74 1.12
## tip 2 244 3.00 1.38 2.9 2.84 1.33 1.00 10.00 9.00 1.45
## sex* 3 244 1.64 0.48 2.0 1.68 0.00 1.00 2.00 1.00 -0.60
## smoker* 4 244 1.38 0.49 1.0 1.35 0.00 1.00 2.00 1.00 0.49
## day* 5 244 2.74 0.93 3.0 2.78 1.48 1.00 4.00 3.00 -0.06
## time* 6 244 1.28 0.45 1.0 1.22 0.00 1.00 2.00 1.00 0.98
## size 7 244 2.57 0.95 2.0 2.42 0.00 1.00 6.00 5.00 1.43
## kurtosis se
## total_bill 1.14 0.57
## tip 3.50 0.09
## sex* -1.65 0.03
## smoker* -1.77 0.03
## day* -1.02 0.06
## time* -1.04 0.03
## size 1.63 0.06
headTail(tips)
## total_bill tip sex smoker day time size
## 1 16.99 1.01 Female No Sun Dinner 2
## 2 10.34 1.66 Male No Sun Dinner 3
## 3 21.01 3.5 Male No Sun Dinner 3
## 4 23.68 3.31 Male No Sun Dinner 2
## ... ... ... <NA> <NA> <NA> <NA> ...
## 241 27.18 2 Female Yes Sat Dinner 2
## 242 22.67 2 Male Yes Sat Dinner 2
## 243 17.82 1.75 Male No Sat Dinner 2
## 244 18.78 3 Female No Thur Dinner 2
# 양적자료인 size를 범주형 자료로 처리하길 원하는 경우.
tips2 <- tips
tips2$size = factor(tips2$size)
summary(tips2)
## total_bill tip sex smoker day
## Min. : 3.07 Min. : 1.000 Female: 87 No :151 Fri :19
## 1st Qu.:13.35 1st Qu.: 2.000 Male :157 Yes: 93 Sat :87
## Median :17.80 Median : 2.900 Sun :76
## Mean :19.79 Mean : 2.998 Thur:62
## 3rd Qu.:24.13 3rd Qu.: 3.562
## Max. :50.81 Max. :10.000
## time size
## Dinner:176 1: 4
## Lunch : 68 2:156
## 3: 38
## 4: 37
## 5: 5
## 6: 4
# median : 극단값이 있는 경우 중심위치 측정에 선호
tips2$tip[1] = 100
quantile(tips$tip)
## 0% 25% 50% 75% 100%
## 1.0000 2.0000 2.9000 3.5625 10.0000
quantile(tips2$tip)
## 0% 25% 50% 75% 100%
## 1.0000 2.0000 2.9600 3.6025 100.0000
# 분산 / 표준편차
var(tip)
## [1] 1.914455
sd(tip)
## [1] 1.383638
# 변동계수(Coefficient of Variation) = 표준편차 / 평균
# 표준편차가 평균에 비하여 얼마나 큰지 나타냄. 두 집단의 변동성 비교시 사용.
# 평균이 클수록 표준편차가 큰 경향이 있기 때문에 표준편차로 변동성 비교할 수 없음.
sd(tip) / mean(tip)
## [1] 0.4614775
# 사분위수 범위 (interquartile range, IQR)
# Q1과 Q3의 차이. 자료의 중간 50%의 범위. 극단값에 상대적으로 덜 민감.
IQR(tip)
## [1] 1.5625
# plot
boxplot(tip, col = "red", horizontal = T, xlab = "Tip")
hist(tip)
hist(tip, 20, probability = T, xlim = c(0,10), ylim = c(0,0.5)) # break : 20 / probability : 갯수가 아닌 확률로 표시
lines(density(tip), col = "blue")
# Q-Q Normality Plot : 자료가 정규분포에 얼마나 근접한지 판단
qqnorm(tip)
qqline(tip) # 점들이 선위에 가까이 있을수로 정규분포를 따름.
detach(tips)
# 질적자료의 요약
# table() : 도수분포표
# barplot()
# pie()
head(tips)
## total_bill tip sex smoker day time size
## 1 16.99 1.01 Female No Sun Dinner 2
## 2 10.34 1.66 Male No Sun Dinner 3
## 3 21.01 3.50 Male No Sun Dinner 3
## 4 23.68 3.31 Male No Sun Dinner 2
## 5 24.59 3.61 Female No Sun Dinner 4
## 6 25.29 4.71 Male No Sun Dinner 4
summary(tips$day)
## Fri Sat Sun Thur
## 19 87 76 62
barplot(table(tips$day))
tips$day <- factor(tips$day, levels = c("Thur","Fri","Sat","Sun")) # 요일 순서대로 나오도록 factor levels 변경
summary(tips$day)
## Thur Fri Sat Sun
## 62 19 87 76
mytable <- table(tips$day)
mytable
##
## Thur Fri Sat Sun
## 62 19 87 76
barplot(mytable)
ratio <- round(mytable/sum(mytable)*100)
ratio
##
## Thur Fri Sat Sun
## 25 8 36 31
lbl <- paste(names(mytable), ", ", ratio, "%", sep="")
lbl
## [1] "Thur, 25%" "Fri, 8%" "Sat, 36%" "Sun, 31%"
pie(mytable, labels = lbl, col = rainbow(length(mytable)), main = "Day of Tips")
# 두 변수의 요약
# 두 범주형 변수의 요약
# xtabs(~그룹변수1 + 그룹변수2, data) = 분할표
# 성별~요일별
mytable2 <- xtabs(~ sex + day, tips)
mytable2
## day
## sex Thur Fri Sat Sun
## Female 32 9 28 18
## Male 30 10 59 58
barplot(mytable2, legend.text = c("Female", "Male"), ylim = c(0,100))
barplot(mytable2, legend.text = c("Female", "Male"), ylim = c(0,80), beside = T)
barplot(xtabs(~ sex + smoker, tips), legend.text = c("Female", "Male"), ylim = c(0,100), beside = T, xlab = "smoker")
barplot(xtabs(~ size + time, tips), legend.text = c(1,2,3,4,5,6), beside = T, xlab = "size - time")
mosaicplot(mytable2) # 성별 기준으로 요일별 비교
mosaicplot(t(mytable2)) # 요일 기준으로 성별 비교
# 범주형 변수와 양적 변수의 요약
boxplot(tip ~ day, data = tips, ylab = "tips", xlab = "day")
# 두 양적변수의 요약 (주문금액 대비 팁)
plot(tip ~ total_bill, tips)
# practice
# 2012 - 2013 년 국내 개봉 영화
kmovie <- read.csv("data/movie.csv", stringsAsFactors = F)
View(kmovie)
str(kmovie)
## 'data.frame': 227 obs. of 11 variables:
## $ title : chr "다크아워" "원더풀 라디오" "밀레니엄 : 여자를 증오한 남자들" "장화신은 고양이" ...
## $ release_date: chr "2012-01-05" "2012-01-05" "2012-01-11" "2012-01-12" ...
## $ week1_sales : num 1.17e+09 3.99e+09 2.20e+09 7.75e+09 7.37e+08 ...
## $ week1_seen : int 142322 541314 281785 883384 104258 183724 916902 335960 209516 1239057 ...
## $ nation : chr "미국" "한국" "미국" "미국" ...
## $ production : chr "" "(주)영화사아이비젼,(주)기안컬처테인먼트" "" "" ...
## $ distributor : chr "이십세기폭스코리아(주)" "쇼박스㈜미디어플렉스" "한국소니픽쳐스릴리징브에나비스타영화㈜" "씨제이이앤엠 주식회사" ...
## $ rating : chr "12세이상관람가" "15세이상관람가" "청소년관람불가" "전체관람가" ...
## $ genre : chr "액션/어드벤쳐" "드라마" "스릴러/공포" "애니메이션" ...
## $ total_seen : int 162704 986287 443855 2080445 206344 276334 3459864 467697 283449 4058225 ...
## $ total_sales : num 1.32e+09 7.26e+09 3.50e+09 1.76e+10 1.44e+09 ...
quantile(kmovie$total_seen)
## 0% 25% 50% 75% 100%
## 101351 271332 790181 1718670 12983330
quantile(kmovie$total_sales)
## 0% 25% 50% 75% 100%
## 725156071 1872791000 5758577000 12871123250 93665568500
kmovie$total_seen <- kmovie$total_seen/1000
kmovie$total_sales <- kmovie$total_sales/1000000
attach(kmovie)
# 1. 총관객수(total_seen)에 대해 통계량
mean(total_seen)
## [1] 1526.821
median(total_seen)
## [1] 790.181
sd(total_seen)
## [1] 2175.431
quantile(total_seen)
## 0% 25% 50% 75% 100%
## 101.351 271.332 790.181 1718.669 12983.330
summary(total_seen)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 101.4 271.3 790.2 1527.0 1719.0 12980.0
IQR(total_seen)
## [1] 1447.338
boxplot(total_seen, horizontal=T)
hist(total_seen, 20) # ---> 우측에 outlier가 너무 많다. 적당히 변환 후 분석 진행 필요
# 2. 등급별 평균 매출액
unique(rating)
## [1] "12세이상관람가" "15세이상관람가" "청소년관람불가" "전체관람가"
aggregate(total_sales ~ rating, data = kmovie, mean)
## rating total_sales
## 1 12세이상관람가 13595.066
## 2 15세이상관람가 15129.767
## 3 전체관람가 4716.790
## 4 청소년관람불가 7651.463
# par(las = 2, mar = c(10,5,5,5))
boxplot(total_sales ~ rating, data = kmovie, ylab = "sales (x1,000,000)", xlab = "rating")
boxplot(log(total_sales) ~ rating, data = kmovie, ylab = "sales : log(x1,000,000)", xlab = "rating")
library(plyr)
msales <- ddply(kmovie, ~rating, summarise, mean_sales = mean(total_sales))
msales
## rating mean_sales
## 1 12세이상관람가 13595.066
## 2 15세이상관람가 15129.767
## 3 전체관람가 4716.790
## 4 청소년관람불가 7651.463
barplot(msales[,2], names.arg = msales[,1])
# 3. 등급별 개봉 영화 수 : barplot & pie chart
tableOfRating <- table(rating)
tableOfRating
## rating
## 12세이상관람가 15세이상관람가 전체관람가 청소년관람불가
## 43 94 48 42
# las : style of axis labels. mar : plot margin, c(bottom, left, top, right)
bp <- barplot(tableOfRating, ylab="Count", xlab="Rating", ylim = c(0,100), las = 1, mar = c(10,5,5,5))
text(x = bp, y = tableOfRating*0.9, labels = tableOfRating, col = "red", cex = 0.9)
lbl2 <- paste(names(tableOfRating), "\n", round(prop.table(tableOfRating)* 100,2), "%", sep="")
pie(tableOfRating, labels = lbl2, col = rainbow(4))
# 4. 등급과 장르 사용해 분할표 생성. bar plot과 mosaic plot 그리기.
tab = xtabs(~ genre + rating, kmovie)
tab
## rating
## genre 12세이상관람가 15세이상관람가 전체관람가 청소년관람불가
## 가족 1 0 1 0
## 기타 3 3 2 2
## 드라마 8 20 2 6
## 멜로/로맨스 4 5 0 5
## 미스터리/범죄 1 9 0 6
## 스릴러/공포 0 10 0 6
## 애니메이션 2 0 39 0
## 액션/어드벤쳐 19 33 3 14
## 코미디 5 14 1 3
barplot(tab, legend.text=row.names(tab), col = rainbow(9), beside = T, ylim = c(0,40))
mosaicplot(tab, las = 2)
mosaicplot(t(tab), las = 2)
# 유형에 따른 분석기법
# 평균에 대한 구간 추정 : T-test t.test(x)
# 한 그룹의 평균 : One Sample T-test t.test(x, mu = , alternative = )
# 한 그룹의 두 변수
# 연관성 높은 두 그룹 : Paired T-test t.test(x2 - x1)
# 두 그룹의 평균 : Two Sample T-test t.test(y ~ x, var.equal = , data = )
# 세 그룹 이상의 평균 : ANOVA / ANCOVA lm / anova / glht("Dunnett") / interaction.plot
# 하나의 비율 : Binomial test binom.test
# 한 그룹의 비율 구간 추정
# 두 그룹 이상의 비율 : Proportions test prop.test(x, n, p)
# 정규성 검정 : Shapiro-Wilk test shapiro.test(x)
# 등분산 검정 : Variance test var.test(y ~ x, data = )
# 독립성 검정 : Chi-squard test chisq.test(x)
# 상관계수 : Correlation test cor.test
# 예측과 추정 : predict
# 회귀분석 모델 선택 : step / regsubsets
# 비모수적 방법 (정규분포를 따르지 않는 경우)
# One Sample / Paired T-test 일 경우 : Wilcoxon Signed-Rank Test wilcox.test(x)
# Two Sample T-test 일 경우 : Wilcoxon Rank-Sum Test wilcox.test(y ~ x, data = )
# ANOVA일 경우 : Kurskal-Wallis Test kruskal.test