R

[R] 기술통계 - 실전예제

빵으니 2020. 7. 8. 18:26
Chap03-2

기술통계

실전예제

전국 연령별 평균 월급 조사(2013년)

In [1]:
# 데이터 로드
# 통계청 2013년 발표 연령, 남녀, 경력별 평균월급 데이터 셋
df <- read.csv('R-ggagi-data/example_salary.csv', stringsAsFactors = T, na='-') 
# - 값은 NA 로 바꾸기
In [2]:
head(df)
연령월급여액..원.연간특별급여액..원.근로시간..시간.근로자수..명.경력구분성별
-19 1346534151840 169.5 15042 1년미만
20-24 1584214115375 180.1 74251 1년미만
25-29 1922043268058 178.0 143338 1년미만
30-34 2130988335710 180.8 103585 1년미만
35-39 2414345352816 181.4 65385 1년미만
40-44 2372214233728 182.9 55422 1년미만
In [3]:
# 한글 변수명 -> 영문으로 바꾸기
colnames(df)
colnames(df) <- c('age','salary', 'specialSalary', 'workingTime', 'numberOfWorker', 'career', 'sex')
  1. '연령'
  2. '월급여액..원.'
  3. '연간특별급여액..원.'
  4. '근로시간..시간.'
  5. '근로자수..명.'
  6. '경력구분'
  7. '성별'
In [4]:
colnames(df)
  1. 'age'
  2. 'salary'
  3. 'specialSalary'
  4. 'workingTime'
  5. 'numberOfWorker'
  6. 'career'
  7. 'sex'
In [5]:
str(df)
'data.frame':	100 obs. of  7 variables:
 $ age           : Factor w/ 10 levels "-19","20-24",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ salary        : num  1346534 1584214 1922043 2130988 2414345 ...
 $ specialSalary : num  151840 115375 268058 335710 352816 ...
 $ workingTime   : num  170 180 178 181 181 ...
 $ numberOfWorker: num  15042 74251 143338 103585 65385 ...
 $ career        : Factor w/ 5 levels "1~3년미만","10년이상",..: 3 3 3 3 3 3 3 3 3 3 ...
 $ sex           : Factor w/ 2 levels "남","여": 1 1 1 1 1 1 1 1 1 1 ...
In [6]:
# 평균 월급 구하기
Mean <- mean(df$salary, na.rm=T)
Mean
2171577.83673469
In [8]:
# 아웃라이어 영향이 있는지 확인. 월급 중앙값 계산
Median <- median(df$salary, na.rm=T)
Median
2120345
In [9]:
# 범위 구하기
Range <- range(df$salary, na.rm=T)
Range
  1. 1117605
  2. 4064286
In [10]:
# 4064286 월급 연령대, 성별, 경력 확인
w <- which(df$salary == 4064286)
w
48
In [11]:
df[w,]
agesalaryspecialSalaryworkingTimenumberOfWorkercareersex
4850-54 4064286 12716896178.2 439450 10년이상
In [12]:
# 월급 4분위 수
Quantile <- quantile(df$salary, na.rm=T)
Quantile
0%
1117605
25%
1689658.25
50%
2120345
75%
2519221.25
100%
4064286
In [13]:
# 리스트에 데이터 담기
Salary <- list(평균=Mean, 중앙값=Median, 범위=Range, 사분위=Quantile)
Salary
$평균
2171577.83673469
$중앙값
2120345
$범위
  1. 1117605
  2. 4064286
$사분위
0%
1117605
25%
1689658.25
50%
2120345
75%
2519221.25
100%
4064286

그룹별 평균 구하기

In [14]:
# 데이터 확인
head(df)
agesalaryspecialSalaryworkingTimenumberOfWorkercareersex
-19 1346534151840 169.5 15042 1년미만
20-24 1584214115375 180.1 74251 1년미만
25-29 1922043268058 178.0 143338 1년미만
30-34 2130988335710 180.8 103585 1년미만
35-39 2414345352816 181.4 65385 1년미만
40-44 2372214233728 182.9 55422 1년미만
In [15]:
# 성별 평균 월급 - tapply() : group by
temp <- tapply(df$salary, df$sex, mean, na.rm=T)
temp
2477332.3877551
1865823.28571429
In [18]:
# 그래프로 확인
library('reshape2')
library('ggplot2')
melt <- melt(temp)
melt

ggplot(melt, aes(x=Var1, y=value, fill=Var1)) + geom_bar(stat='identity')
Var1value
2477332
1865823
In [19]:
# 표준편차 - 남, 월급도 높고 격차도 큼
tapply(df$salary, df$sex, sd, na.rm=T)
646470.66723018
468270.600001128
In [20]:
# 범위
tapply(df$salary, df$sex, range, na.rm=T)
$남
  1. 1346534
  2. 4064286
$여
  1. 1117605
  2. 3002440
In [22]:
# 경력별 평균월급
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
In [23]:
# 그래프로 확인
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))
Var1value
1~3년미만 1905012
10년이상 2907119
1년미만 1730835
3~5년미만 2028015
5~10년미만2360463
In [24]:
# 표준편차
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
In [25]:
# 범위
tapply(df$salary, df$career, range, na.rm=T)
$`1~3년미만`
  1. 1172399
  2. 2619221
$`10년이상`
  1. 1685204
  2. 4064286
$`1년미만`
  1. 1117605
  2. 2414345
$`3~5년미만`
  1. 1245540
  2. 2827420
$`5~10년미만`
  1. 1548036
  2. 3309231
In [27]:
# 경력별 가장 월급이 적은 그룹 - 경력 1~3, 여, 나이 60 이상
a1 <- df[which(df$salary == '1172399'),]
a1
agesalaryspecialSalaryworkingTimenumberOfWorkercareersex
7060- 1172399 299639 151.2 30253 1~3년미만
In [28]:
# 경력별 가장 월급이 적은 그룹 - 경력 10년 이상, 여 나이 20-24
a2 <- df[which(df$salary == '1685204'),]
a2
agesalaryspecialSalaryworkingTimenumberOfWorkercareersex
9220-24 1685204 1970720 179.4 1886 10년이상
In [34]:
# 경력별 가장 월급이 적은 그룹 - 경력 1년 마만, 여, 나이 60 이상
a3 <- df[which(df$salary == '1117605'),]
a3
agesalaryspecialSalaryworkingTimenumberOfWorkercareersex
6060- 111760510667 148 18737 1년미만
In [35]:
# 경력별 가장 월급이 작은 그룹 - 경력 3~5년미만, 여 나이 60이상
a4 <- df[which(df$salary == '1245540'),]
a4
agesalaryspecialSalaryworkingTimenumberOfWorkercareersex
8060- 1245540 423826 155.1 21106 3~5년미만
In [36]:
# 경력별 가장 월급이 작은 그룹 - 경력 5~10년미만, 여 나이 60이상
a5 <- df[which(df$salary == '1548036'),]
a5
agesalaryspecialSalaryworkingTimenumberOfWorkercareersex
9060- 1548036 806919 169.1 20282 5~10년미만

아웃라이어 찾기와 제거하기

In [43]:
# 데이터 로드 - 대장암 관련 데이터 셋
df <- read.csv('R-ggagi-data/example_cancer.csv', stringsAsFactors = F, na='기록없음')
# F - factor 형 아닌 문자열로 가져와
In [44]:
# 요약 확인
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" ...
In [45]:
# 대장암에 걸리는 평균 나이
mean(df$age)
63.5079191698525
In [46]:
# age 특징 확인
summary(df$age)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  18.00   55.00   64.00   63.51   72.00  102.00 
In [47]:
# 시각화
boxplot(df$age)
In [48]:
boxplot(df$age, range=1.5)
In [49]:
# 아웃라이어 위치 찾기 IQR * 1.5
# IQR 길이
dist_iqr <- IQR(df$age, na.rm=T)
dist_iqr
17
In [50]:
# IQR 위치
post_iqr <- quantile(df$age, probs=c(0.25, 0.75), na.rm=T)
post_iqr
25%
55
75%
72
In [51]:
down_whisker <- post_iqr[[1]] - dist_iqr * 1.5
up_whisker <- post_iqr[[2]] + dist_iqr * 1.5
In [52]:
down_whisker
up_whisker
29.5
97.5
In [54]:
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" ...
In [55]:
head(outlier)
agesexheightweightdateOfoperationcancerStaginghospitalizationdiseaseCode
42629 162.0 70.6 2011-05-17II 24 C184
53128 151.4 44.9 2011-08-02I 8 C187
90229 165.8 57.3 2011-09-06II 9 C187
104225 176.9 73.6 2011-11-10II 10 C184
129924 161.0 64.1 2011-08-05IV 19 C187
178328 154.0 61.0 2011-05-27IV 7 C188

평균값을 표준화하여 그래프 한 눈에 보기

In [56]:
# 데이터 로드 - 통계청 월급 정보
df <- read.csv('R-ggagi-data/example_salary.csv', stringsAsFactors = F, na='-')
In [58]:
# 한글 변수명 -> 영문으로 바꾸기
colnames(df)
colnames(df) <- c('age','salary','specialSalary','workingTime','numberOfWorker','career','sex')
  1. '연령'
  2. '월급여액..원.'
  3. '연간특별급여액..원.'
  4. '근로시간..시간.'
  5. '근로자수..명.'
  6. '경력구분'
  7. '성별'
In [59]:
# 표준화 - scale() 
# scale을 동일하게 맞춰야 각 데이터를 동일한 기준으로 분석할 수 있기 때문
# 표준화를 통해 평균 0, 표준편차 1인 정규분포로 맞춰주는 것
salary_scale <- scale(df$salary)
In [60]:
head(salary_scale)
-1.28886999
-0.91757018
-0.38981924
-0.06340878
0.37924689
0.31343053
In [61]:
# 표준화 값 추가하기
df_scale <- cbind(df, scale=salary_scale)
head(df_scale)
agesalaryspecialSalaryworkingTimenumberOfWorkercareersexscale
-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
In [64]:
# 시각화
g1 <- ggplot(df_scale, aes(x=scale, y=age))
g2 <- geom_segment(aes(yend=age), xend=0)
g3 <- geom_point(size=7, aes(colour=sex, 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)."
In [ ]: