일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Cloud Run
- 다이나믹 프로그래밍
- 펜윅 트리
- BFS
- 이분탐색
- 삼성SW역량테스트
- ICPC
- 고속 푸리에 변환
- 수학
- CI/CD
- 다익스트라
- Air Table
- LCS
- 데이터 분석
- 백준 1753번
- 접미사 배열
- Cloud Pub/Sub
- 생활코딩
- Bit
- 시뮬레이션
- dp
- JavaScript
- r
- REACT
- 삼성 SW 역량테스트
- 종만북
- 컴퓨터 구조
- jpa
- 그리디
- 우선순위 큐
- Today
- Total
코딩스토리
8 일차 - 데이터 분석 프로젝트 3 본문
# 이 글을 "Do it! 쉽게 배우는 R 데이터 분석"의 내용을 바탕으로 작성한 글입니다.
드디어 데이터 분석 프로젝트 마지막 날이다.
이제는 전처리 같은 과정은 어느 정도 할 수 있어진 것 같다.
바로 분석으로 넘어가 보자.
1. 성별 직업 빈도
"성별로 어떤 직업이 가장 많을까?"에 대한 질문에 답해 보자.
남성과 여성 두 성별에 대해 각각 어떤 직업을 많이 가지고 있는지 분석해보자.
이미 필요한 모든 변수들에 대한 전처리를 앞에서 진행했으므로 바로 분석해보면
# 남성 직업 빈도 상위 10개 추출
job_male <- welfare %>%
filter(!is.na(job) & sex == "male") %>% # 결측치 제거 $ 남성
group_by(job) %>% # 직업 기준 그룹화
summarise(n = n()) %>% # 빈도수 -> 몇 명인지
arrange(desc(n)) %>% # 내림차순 정렬
head(10) # 상위 10개 추출
# 그래프로 나타내기
ggplot(data = job_male, aes(x = n, y = reorder(job, n))) +
geom_col()
앞의 분석들과 거의 비슷하나 summarise() 함수의 인자가 조금 특이한 것을 알 수 있다.
앞에서 공부했던 내용인데 내가 언급을 안 했던 것 같아서..
말 그대로 빈도수, 즉 몇 명인지로 요약하겠다는 의미이다.
즉 각 직업별로 group_by를 통해 묶어놨으므로 요약은 각 그룹당 몇 명인지로 요약하겠다는 코드이다.
여성도 분석하는 방법은 거의 똑같다.
# 여성 직업 빈도 상위 10개 추출
job_female <- welfare %>%
filter(!is.na(job) & sex == "female") %>% # 결측치 제거 $ 남성
group_by(job) %>% # 직업 기준 그룹화
summarise(n = n()) %>% # 빈도수 -> 몇 명인지
arrange(desc(n)) %>% # 내림차순 정렬
head(10) # 상위 10개 추출
# 그래프로 나타내기
ggplot(data = job_female, aes(x = n, y = reorder(job, n))) +
geom_col()
두 성별 모두 작물 재배 종사자가 매우 많음을 알 수 있다.
아마도 아직까지는 농사 하시는 분들이 많아서 그런 게 아닐까 싶다..
2. 종교 유무에 따른 이혼율
"종교가 있는 사람들이 이혼을 덜 할까?" 라는 질문에 답해보자.
음.. 신기한 주제네요.
일단 종교, 혼인 변수는 아직까지 한번도 사용한 적이 없기에 전처리 과정을 거쳐야 한다.
다행히 우리가 사용하는 데이터에는 종교가 있고 없고만 알려주기 때문에 엄청 복잡하진 않을 것 같다.
# 종교 유무 이름 부여
welfare$religion <- ifelse(welfare$religion == 1, "YES", "NO")
# 혼인 상태 전처리 -> 이혼 했는지 안했는지만 알려주는 변수 생성
welfare$divorce <- ifelse(welfare$marriage == 1, "Marriage",
ifelse(welfare$marriage == 3, "Divorce", NA))
이렇게 변수에 대해 전처리를 했으므로 본격적인 분석에 들어가 보자.
이해하기에 어렵진 않았으나 살짝 다른 점이 있어서 살펴보면
이번엔 '이혼율', 즉 비율을 계산하여야 하므로 비율 파생변수들을 만들어 줬음을 알 수 있다.
이제 어떻게 이혼율을 다뤄야 하는지 알았으니 이를 사용해 비슷한 분석을 해보자.
이번엔 "연령대 및 종교 유무에 따른 이혼율 그래프"를 만들어보자.
# 연령대, 종교, 결혼 상태 비율표 만들기
age_religion_marriage <- welfare %>%
filter(!is.na(divorce) & age_group != "young") %>%
group_by(age_group, religion, divorce) %>%
summarise(n = n()) %>%
mutate(sum_group = sum(n)) %>%
mutate(ratio = round(n/sum_group*100,1 ))
age_religion_marriage
# 연령대 및 종교 유무별 이혼율 표 만들기
df_divorce <- age_religion_marriage %>%
filter(divorce == "Divorce") %>% # 이혼에 관한 정보만 뽑음
select(age_group, religion, ratio) # 연령대, 종교, 비율만 뽑음
# 그래프로 표현
ggplot(data = df_divorce, aes(x=age_group, y=ratio, fill=religion)) +
geom_col(position = "dodge") # 막대 두개로 분리
코드가 길어서 일일이 설명하긴 어렵지만 앞에 했던 분석들을 잘 이해했다면 쉽게 넘어갈 수 있다.
(참고로 책이랑 변수를 다르게 쓴 게 많아서 책과 비교하면 조금 다를 수 있어요!)
3. 지역별 연령대 비율
"노년층이 많은 지역은 어디일까?"에 대한 질문에 답해보자.
이번에도 '지역' 변수를 처음 사용하기 때문에 빠르게 전처리 해보자.
# 지역 변수 전처리
# 지역 코드 목록 만들기
list_region <- data.frame(code_region = c(1:7),
region = c("서울",
"수도권(인천/경기)",
"부산/경남/울산",
"대구/경북",
"대전/충남",
"강원/충북",
"광주/전남/전북/제주도"))
# 지역명 변수 추가 -> 두 df 합치기
welfare <- left_join(welfare, list_region, id = "code_region")
어디서 많이 본 코드다. 그죠?
left_join을 통해 지역명을 추가시켜주었다.
아직 by와 id의 차이점을 알아내지 못했는데 갑자기 떠오른 생각이 있긴 한데 맞는지는 잘 모르겠네..
어쨌든 이제 분석을 마무리해보자.
# 지역별 연령대 비율표 만들기
region_age_group <- welfare %>%
group_by(region,age_group) %>%
summarise(n = n()) %>%
mutate(sum_group = sum(n)) %>%
mutate(ratio = round(n/sum_group*100,2))
# 그래프로 표현
ggplot(data = region_age_group, aes(x = region, y = ratio, fill = age_group)) +
geom_col() +
coord_flip()
이번 코드에서도 딱히 어려운 점은 없었다.
조금 더 그래프를 이쁘게 바꿔보면
정렬 관련 코드는 아래의 깃허브에 올려놓았다.
이렇게 해서 데이터 분석 프로젝트를 끝내게 되었다.
사실 내가 분석했다기보다는 책의 코드를 이해한 게 전부였지만 그래도 배운 게 많은 챕터였다.
언제쯤 자유자재로 데이터를 분석할 수 있을까...ㅠ
github.com/kimtaehyun98/Data_Analysis_Project1_-
'데이터 분석' 카테고리의 다른 글
10 일차 - 지도 시각화 (0) | 2021.02.08 |
---|---|
9 일차 - 텍스트 마이닝 (0) | 2021.02.06 |
7 일차 - 데이터 분석 프로젝트 2 (0) | 2021.02.01 |
6 일차 - 데이터 분석 프로젝트 1 (0) | 2021.01.30 |
5 일차 - 그래프 만들기 (0) | 2021.01.28 |