R 데이터분석
- 직업별 월급 최대 찾기 문제



문제 요약

1. welfare.csv 불러와 df만들기
*사용변수명 수정하고 나이 파생변수 추가하기
2.직업코드 목록 들어가있는 list_job.csv불러오기
3.작업코드 기준 welfare 직업변수결합.
직업코드, 직업명 변수 결합 확인
4.직업빈도 상위 10개 추출, 최대찾기
5.우러급 가장 많은 상위 10개 직업 알기
*분석결과 저장
6.위 표 막대그래프 표현
*막대 오름차순 정렬, 오른쪽으로 90도 회전
7.20대 대상 최대 월급 상위 10개 직업 막대그래프 표현
*막대 오름차순 정렬, 오른쪽 90도 회전

문제풀이코드

데이터불러오기


library(dplyr)
df=read.csv("welfare.csv")
#데이터구조확인
str(welfare)
#변수명 변경
welfare=rename(df, birth=생년월일항목,
    income=월급항목,
     code_job=직업코드항목)
#파생변수만들기 - 나이
welfare=welfare %>%
    mutate(age=2023-birth +1)

항목 결합 - 직업코드결합하기

llist_job=read.csv("list_job.csv")
welfare=left_join(welfare,list_job,
    by="code_job")
welfare %>%
    select(code_job, job)
    %>%>head()

상위10개추출하기

-job별로 분류후 개수세기

welfare %>%
    group_by(job) %>%
    summarise(n=n()) %>% #빈도수세기
    arrange(desc(n)) %>% #정렬
    head(10) #상위10개

막대그래프그리기

- 내림차순 정렬

library("ggplot2")
ggplot(data=job_income,
    aes(x=reorder(job, mean_income),    
             y=mean_income))+
    geom_col()+ #막대그래프
    coord_flip()  #회전

필터링

- 20대이상 상위 10개직업구하기
#데이터확인 - 최소 20살로 10대에 대한 필터링 불필요
summary(welfare$age)
#필터링
job_20 = welfare%>%
    filter(age<=29) %>%
    group_by(job) %>% summarise(mean_income=mean(income))%>%
    arrange(desc(mean_income)) %>%
    head(10)

그래프그리기

ggplot(job_20,        
                aes(x=reorder(job,mean_inomce),    
                 mean_income)+
    geom_col()+
    coord_flip()
    

로지스틱 회귀분석 분류문제

-베르누이 시행 (1 또는 0 결과만 존재)에 대한 분류문제
-모델 결과값은 각 데이터가 1이 될 확률 나옴
-분류를 위해 threshold=문턱값이 필요
별도 요구없으면 0.5 기준으로 학습시행
ex) 0.5이상인 값은 1로취급
         0.5미만인 값은 0 으로 취급

사용라이브러리

Metrics

분류 모델 평가 함수들

accuracy(class)
precision()
recall() 재현율
f1()
auc(pred)


응용문제

독립변수를 혈압, 혈당,BMI, 인슐린,
종속변수를 당뇨여부로 모델 학습시 분류 정확도는?

- 데이터 diabetes.csv 사용
-caTools 패키지의 sample.split() 함수사용하기
-학습데이터 비율 80%
- seed 123으로 설정
-답: 0.72

#종속변수가명목형 변수이고, 독립변수가 수치형 변수일때 로지스틱 회귀분석 이용하기

0)데이터분리

set.seed(123)
idx_train = caTools::sample.split(df$종속변수, Splitratio=0.7)
df_train = df[idx_train, ]
df-test = df[!idx_train, ]

1) 학습

model=glm(Outcome~BloodPressure+Glucose+Insulin,  #사용할 변수만 정리
df_train, #수치형변수
family = "binomial") #family 누락주의

2)예측

pred=predict(model, df_test, type="response") #type 누락주의
pred_class = (pred>0.5)+0
#확인 table(df[,"Outcome"], pred_class)

3)평가하기

accuracy(df_test$Outcome, pred_class) #분류문제이므로 class로 넣기
auc(df_test$outcome, pred) #주의 , pred_class가아니라 확률값 상태 pred로 넣기. 이때 class로 넣어도 오류메시지가 안뜨므로 특히 주의하기

4)승산비(Odds ratio, OR)

exp(model$coefficients["Insuline"])


인터랙티브 그래프

-마우스 클릭에 반응하는 그래프

-주요 패키지 : plotly

install.packages("plotly")
library(plotly)

응용예시1 : 산점도

1. 산점도 그리기
ggplot(mpg, aes(x=displ, y=hwy))+geom_point()

2. 구동방식(drv)별 색깔 다르게 설정
ggplot(mpg, aes(x=displ, y=hwy, col=drv))+geom_point()

3.인터렉티브화
p=ggplot(mpg, aes(x=displ, y=hwy, col=drv))+geom_point()
ggplotly(p)
#viewer에서 확인가능
#export>save as webpage 처리시 웹사이트로 확인가능

응용예시: 막대그래프

df=diamonds이

1. 표만들기
#cut 및 clarty 별 빈도
table(diamonds$cut)
table(diamonds$clarity)
df= diamonds %>%    
    group_by(cut, clarity) %>%
    summarise(n=n())

2.그래프그리기
ggplot(df, aes(x=cut, y=n)) + geom_col()
#색칠하기
p= ggplot(df, aes(x=cut, y=n, fill=clarity)) + geom_col(position="dodge")

3. 인터랙티브화하기
ggplotly(p)


막대그래프

-집단간 차이를 나타내기에 좋음
- 데이터 크기를 막대길이로 표현
- 성벽 소득 차이처럼 집단간 비교에 좋음

데이터 시각화 단계

data=ggplot2::mpg #데이터셋이용

1. 표만들기

df=mpg %>%
    group_by(drv)%>%
    summarise(mean_hwy = mean(hwy))

2. 그래프그리기

ggplot(data=df, aes(x=drv,y=mean_hwy)+
    geom_col() #막대그래프#기본정렬:drv알파벳순
#reorder로 정렬해주기
ggplot(data=df, aes(x=reorder(drv,-mean_hwy), y=mean_hwy)+  geom_col()
#기준변수 : mean_hwy
# '-' : 작아지는 순서로


응용문제. suv 차종 대상으로 cty가 가장 높은 회사?
5곳의 평균 cty 막대 그래프 그리고, 막대 연비 높은 순 정렬하기.


1. 표만들기
df_mpg=mpg%>% filter(class=="suv")%>%
    group_by(manufacturer) %>%
    summarise(mean_cty=mean(cty)) %>%
    arrange(desc(mean_cty)) %>%
    head()
2. 그래프그리기
ggplot(df_mpg, aes(x=reorder(manufacturer, -mean_cty), y=mean_cty))+geom_col()


상자그림(box plot)

-데이터 분포 표현에 좋음
-데이터 분포(퍼짐형태)로 막대그래프보다 더 많은 데이터 해석 가능
-분포를 알수 잇어 평균만 볼때보다 데이터 특성 이해 용이함
-상자그림으로 알수있는것 :
1)중앙값 비교
2)상자폭보기(=다양한 분포, 동질한 분포
3)중앙값이 어디에 위치하는지
가운데 : 정상분포
밑에있을 경우 : 오른쪽으로 꼬리긴 분포 등

기본구조

ggplot(mpg, aes(x=drv, y=hwy))+geom_boxplot()

응용예시

df=mpg %>% filter(class %in% c("compact","subcompact","suv"))
ggplot(df, aes(x=class, y=cty))+geom_boxplot()



ggplot2 패키지

-레이어 구조로 이루어짐
1. 배경설정 (축, 데이터 뭘 다룰지 정해주기)
2. 그래프 추가 (점, 막대, 선 등 모양 정하기)
3. 설정추가 (축범위, 색, 표식 등 추가하기)

산점도 그리기

-변수 관계를 표현하기에 좋음
(참고) qplot #간단한 확인


산점도 응용예시

#배경설정
ggplot(data=mpg, aes(x=displ, y=hwy))+
    geom_point()+ #그래프종류설정 : 산점도
    xlim(3,6)+ylim(10,30) #세부설정
#xlim=x축제한 의미




선그래프 그리기

- 시간 변화를 표현하기에 좋음
-주로 주로 시계열 데이터 다룸 (환율, 주가지수 등)
-x는 날짜정보


선그래프 응용예시

ggplot(data=economics, aes(x=date, y=unemploy)) + geom_line() #그래프종류설정 : 선



여러 데이터 결합하기

#열결합 = 가로결합

df= left_join(df1, df2, by="열기준")



#행결합 = 세로결합 #rbind유사

group_alll=bind_row(group_a,group_b)


응용문제

mpg=ggplot2::mpg #데이터셋활용

fuel=data.frame(fl=c("c","d","e","p","r"),
    price_fl=c(2.35, 2.36, 2.11, 2.5,2.22))

mpg=left_join(mpg, fuel, by="fl")



책보다는 최신기술을 공부하면 좋음.

구글링으로 최신자료보기 (상위 2-3개)
구글링으로 cheat sheet(치트시트) 보기
주로쓰는 패키지는 프린트해서 자주보며 익숙해지기

하루 200줄 코딩하기

챗GPT에게 R코드 작성해달라고하기
ex) 랜덤포레스트분석을 위한 R코드를 작성해줘
해당 코드에 대해 한줄씩 알려달라하기
해당 코드 해석 및 공부하기




* 주로쓰는 패키지

dplyr : 데이터전처리에 유용, 샘플링 sample_frac, 데이터병합 join

ggplot2 : 대부분 그래프 가능, 부족시 ggplot2
extension 검색후 추가 다운로드

caret : 분류knn3와 회귀knnreg모델, 정규화preProcess

car : 다중공선성문제 vif

reshape2 : 데이터구조변환하기 melt, dcast

fastDummies : 명목변수 더미화

caTools : 샘플링 sample.split

cluster : 군집분석, 실루엣계수

lubridate : 시간과 날짜 다루기

Metrics : 회귀평가 rmse, precision, auc

rpart : 의사결정나무 + rpart.plot : 그래프

e1071 : 왜도, 첨도, 나이브베이즈


그룹별 요약하기

요약통계량은 summarise () 안에서 처리하며,
주로 group_by와 같이 쓰임

df=ggplot2::mpg #데이터셋사용

R함수 사용방법


df %>% group_by(manufacturer) %>%
    summarise(mean_cty=mean(cty),
    sum_hwy=sum(hwy),
    median_cty=median(cty),
    n_n()) #개수=빈도

#각 집단별로 다시 집단나누기
mpg %>% group_by(manufacturer, drv)%>%
    summarise(mean_cty=mean(cty))

#정렬해주기
mpg  %>% group_by(class) %>% #알파벳순
    summarise(mean=mean(cty)) %>%
    arrange(desc(mean)) %>% #정렬해주기
    head()

응용문제

문제. compact클래스중 제조사별로 차종수, 상위 6?

mpg %>% filter(class=="compact") %>%
    group_by(manufacturer) %>%
    summarise(count=n()) %>% #빈도구하기#행수
    arrange(desc(count)) %>%
    head()

+ Recent posts