# 질적 자료 (범주형) : 명목척도 / 서열척도
# 양적 자료 : 구간척도 (원점 없음) / 비율척도 (원점 존재)
# 양적 자료의 요약
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