-
기술통계 - 실전 예제R 2020. 7. 7. 15:20
기술 통계
실전 예제
전국 연령별 평균 월급 조사
# 데이터 로드 # 통계청 2013년 발표 연령, 남녀, 경력별 평균월급 데이터셋 df <- read.csv("r-ggagi-data/example_salary.csv", stringsAsFactors = T, na = '-') # - 값은 NA로 바꾸기
head(df)
연령 월급여액..원. 연간특별급여액..원. 근로시간..시간. 근로자수..명. 경력구분 성별 -19 1346534 151840 169.5 15042 1년미만 남 20-24 1584214 115375 180.1 74251 1년미만 남 25-29 1922043 268058 178.0 143338 1년미만 남 30-34 2130988 335710 180.8 103585 1년미만 남 35-39 2414345 352816 181.4 65385 1년미만 남 40-44 2372214 233728 182.9 55422 1년미만 남 # 한글 변수명 => 영문으로 바꾸기 colnames(df) colnames(df) <- c('age','salary','specialSalary','workingTime','numberOfWorker','career','gender')
- '연령'
- '월급여액..원.'
- '연간특별급여액..원.'
- '근로시간..시간.'
- '근로자수..명.'
- '경력구분'
- '성별'
colnames(df)
- 'age'
- 'salary'
- 'specialSalary'
- 'workingTime'
- 'numberOfWorker'
- 'career'
- 'gender'
# 평균 월급 구하기 Mean <- mean(df$salary, na.rm = T) Mean
2171577.83673469
# 아웃라이어 영향이 있는지 월 중앙값 계산 Median <- median(df$salary, na.rm = T) Median
2120345
# 범위 구하기 Range <- range(df$salary, na.rm = T) Range
- 1117605
- 4064286
# 4064286 월급 연령대, 성별, 경력 확인 w <- which(df$salary == 4064286) w
48
df[w,]
age salary specialSalary workingTime numberOfWorker career gender 48 50-54 4064286 12716896 178.2 439450 10년이상 남 # 월급 4분위 수 Quantile <- quantile(df$salary, na.rm = T) Quantile
- 0%
- 1117605
- 25%
- 1689658.25
- 50%
- 2120345
- 75%
- 2519221.25
- 100%
- 4064286
# 리스트에 데이터 담기 / R에서의 list는 다양한 데이터를 담을 수 있다 Salary <- list(평균=Mean, 중앙값=Median, 범위=Range, 사분위=Quantile) Salary
- $평균
- 2171577.83673469
- $중앙값
- 2120345
- $범위
-
- 1117605
- 4064286
- $사분위
-
- 0% 1117605
- 25% 1689658.25
- 50% 2120345
- 75% 2519221.25
- 100% 4064286
그룹별 평균 구하기
# 데이터 확인 head(df)
age salary specialSalary workingTime numberOfWorker career gender -19 1346534 151840 169.5 15042 1년미만 남 20-24 1584214 115375 180.1 74251 1년미만 남 25-29 1922043 268058 178.0 143338 1년미만 남 30-34 2130988 335710 180.8 103585 1년미만 남 35-39 2414345 352816 181.4 65385 1년미만 남 40-44 2372214 233728 182.9 55422 1년미만 남 # 성별 평균월급 - tapply() : group by temp <- tapply(df$salary, df$gender, mean, na.rm = T) temp
- 남
- 2477332.3877551
- 여
- 1865823.28571429
library('reshape2') library('ggplot2') # 재 구조화 그냥 temp로는 그래프 작업 불가 melt <- melt(temp) melt # 그래프로 확인 ggplot(melt, aes(x=Var1, y=value, fill=Var1)) + geom_bar(stat='identity')
Warning message: "package 'reshape2' was built under R version 3.6.3"Warning message: "package 'ggplot2' was built under R version 3.6.3"
Var1 value 남 2477332 여 1865823 # 표준편차 - 남 월급도 높고, 격차도 큼 tapply(df$salary, df$gender, sd, na.rm=T)
- 남
- 646470.66723018
- 여
- 468270.600001128
# 범위 tapply(df$salary, df$gender, range, na.rm=T)
- $남
-
- 1346534
- 4064286
- $여
-
- 1117605
- 3002440
# 경력별 평균월급 temp <- tapply(df$salary, df$career, mean, na.rm=T) temp
- 1~3년미만
- 1905011.9
- 10년이상
- 2907118.61111111
- 1년미만
- 1730835.35
- 3~5년미만
- 2028014.9
- 5~10년미만
- 2360462.5
# 그래프로 확인 melt <- melt(temp) melt ggplot(melt, aes(x=Var1, y=value, group=1))+ geom_line(colour='skyblue2', size=2) + coord_polar() + ylim(0, max(melt$value))
Var1 value 1~3년미만 1905012 10년이상 2907119 1년미만 1730835 3~5년미만 2028015 5~10년미만 2360463 # 표준편차 tapply(df$salary, df$career, sd, na.rm=T)
- 1~3년미만
- 421332.817832436
- 10년이상
- 690976.727993927
- 1년미만
- 408110.437480279
- 3~5년미만
- 460790.871315817
- 5~10년미만
- 507244.739786116
# 범위 tapply(df$salary, df$career, range, na.rm=T)
- $`1~3년미만`
-
- 1172399
- 2619221
- $`10년이상`
-
- 1685204
- 4064286
- $`1년미만`
-
- 1117605
- 2414345
- $`3~5년미만`
-
- 1245540
- 2827420
- $`5~10년미만`
-
- 1548036
- 3309231
# 경력별 가장 월급이 작은 그룹 - 경력 1~3, 여 나이 60 이상 a1 <- df[which(df$salary == '1172399'),] a1
age salary specialSalary workingTime numberOfWorker career gender 70 60- 1172399 299639 151.2 30253 1~3년미만 여 # 경력별 가장 월급이 작은 그룹 - 경력 10년 이상, 여 나이 20~24 a2 <- df[which(df$salary == '1685204'),] a2
age salary specialSalary workingTime numberOfWorker career gender 92 20-24 1685204 1970720 179.4 1886 10년이상 여 # 경력별 가장 월급이 작은 그룹 - 경력 1년미만, 여 나이 60이상 a3 <- df[which(df$salary == '1117605'),] a3
age salary specialSalary workingTime numberOfWorker career gender 60 60- 1117605 10667 148 18737 1년미만 여 # 경력별 가장 월급이 작은 그룹 - 경력 3~5년미만, 여 나이 60이상 a4 <- df[which(df$salary == '1245540'),] a4
age salary specialSalary workingTime numberOfWorker career gender 80 60- 1245540 423826 155.1 21106 3~5년미만 여 # 경력별 가장 월급이 작은 그룹 - 경력 5~10년미만, 여 나이 60이상 a5 <- df[which(df$salary == '1548036'),] a5
age salary specialSalary workingTime numberOfWorker career gender 90 60- 1548036 806919 169.1 20282 5~10년미만 여 아웃라이어 찾기와 제거하기
-
대장암 관련 데이터 사용
# 데이터 로드 df <- read.csv('r-ggagi-data/example_cancer.csv', stringsAsFactors = F, na='기록없음')
# 요약 확인 str(df)
'data.frame': 18310 obs. of 8 variables: $ age : int 75 52 67 62 70 76 55 72 64 71 ... $ sex : chr "남" "여" "여" "남" ... $ height : num 161 177 154 162 171 ... $ weight : num 64 75.3 65.6 57 65 87 77 55 67 55.5 ... $ dateOfoperation: chr "2011-06-22" "2011-05-19" "2011-05-31" "2011-06-21" ... $ cancerStaging : chr "I" "IV" "III" "I" ... $ hospitalization: int 48 17 10 11 10 10 12 18 15 35 ... $ diseaseCode : chr "C187" "C187" "C187" "C187" ...
# 대장암에 걸리는 평균 나이 mean(df$age)
63.5079191698525
# age 특징확인 summary(df$age)
Min. 1st Qu. Median Mean 3rd Qu. Max. 18.00 55.00 64.00 63.51 72.00 102.00
# 시각화 boxplot(df$age) # 100세 이상, 30세 이하는 잘 안걸림
# IQR(InterQuantile Range) * 1.5 = 아웃라이어(이상치) dist_iqr <- IQR(df$age, na.rm=T) dist_iqr
17
# IQR위치 확인 post_iqr <- quantile(df$age, probs = c(0.25, 0.75), na.rm=T) post_iqr
- 25%
- 55
- 75%
- 72
# whisker = 수염 down_whisker <- post_iqr[[1]] - dist_iqr*1.5 up_whisker <- post_iqr[[2]] + dist_iqr*1.5
down_whisker up_whisker
29.5
97.5
outlier <- subset(df, subset=(df$age < down_whisker | df$age > up_whisker)) str(outlier)
'data.frame': 62 obs. of 8 variables: $ age : int 29 28 29 25 24 28 29 28 24 102 ... $ sex : chr "남" "남" "남" "여" ... $ height : num 162 151 166 177 161 ... $ weight : num 70.6 44.9 57.3 73.6 64.1 61 55 63.3 79 62.5 ... $ dateOfoperation: chr "2011-05-17" "2011-08-02" "2011-09-06" "2011-11-10" ... $ cancerStaging : chr "II" "I" "II" "II" ... $ hospitalization: int 24 8 9 10 19 7 11 57 19 16 ... $ diseaseCode : chr "C184" "C187" "C187" "C184" ...
head(outlier)
age sex height weight dateOfoperation cancerStaging hospitalization diseaseCode 426 29 남 162.0 70.6 2011-05-17 II 24 C184 531 28 남 151.4 44.9 2011-08-02 I 8 C187 902 29 남 165.8 57.3 2011-09-06 II 9 C187 1042 25 여 176.9 73.6 2011-11-10 II 10 C184 1299 24 남 161.0 64.1 2011-08-05 IV 19 C187 1783 28 여 154.0 61.0 2011-05-27 IV 7 C188 평균값을 표준화하여 그래프 한 눈에 보기
-
통계청 월급 정보 사용
# 데이터 로드 df <- read.csv('r-ggagi-data/example_salary.csv', stringsAsFactors = F, na='-')
# 한글 변수명 => 영문으로 바꾸기 colnames(df) colnames(df) <- c('age','salary','sepcialSalary','workingTime','numberOfWorker','career','gender')
- '연령'
- '월급여액..원.'
- '연간특별급여액..원.'
- '근로시간..시간.'
- '근로자수..명.'
- '경력구분'
- '성별'
# 표준화 - scale() salary_scale <- scale(df$salary) head(salary_scale)
-1.28886999 -0.91757018 -0.38981924 -0.06340878 0.37924689 0.31343053 # 표준화 값 추가 df_scale <- cbind(df, scale=salary_scale) head(df_scale)
age salary sepcialSalary workingTime numberOfWorker career gender scale -19 1346534 151840 169.5 15042 1년미만 남 -1.28886999 20-24 1584214 115375 180.1 74251 1년미만 남 -0.91757018 25-29 1922043 268058 178.0 143338 1년미만 남 -0.38981924 30-34 2130988 335710 180.8 103585 1년미만 남 -0.06340878 35-39 2414345 352816 181.4 65385 1년미만 남 0.37924689 40-44 2372214 233728 182.9 55422 1년미만 남 0.31343053 # 시각화 g1 <- ggplot(df_scale, aes(x=scale, y=age)) g2 <- geom_segment(aes(yend=age), xend=0) g3 <- geom_point(size=7, aes(colour=gender, shape=career)) g1 + g2 + g3 + theme_minimal()
Warning message: "Removed 2 rows containing missing values (geom_segment)."Warning message: "Removed 2 rows containing missing values (geom_point)."
'R' 카테고리의 다른 글
시각화 - 예제 (0) 2020.07.09 시각화 (0) 2020.07.07 기술통계 (0) 2020.07.06 데이터 개념 예제로 이해하기 (0) 2020.07.06 데이터 개념 이해하기 (0) 2020.07.02