14 R 에서의 막대그래프
문제70. 점심시간 문제로 풀었던 직업, 직업별 인원수를 가로로 출력하는 결과를 막대그래프로 시각화 하시오.
# R x <- tapply(emp$empno, emp$job, length) barplot(x, ylim=c(0,5), main = '직업별 인원수', col=rainbow(5))
barplot(데이터프레임 명, ylim=c(높이 지정), main = 타이틀 제목, col=색상 지정(rainbow()하면 알아서 색 지정해줌 ))

문제71. 부서번호, 부서번호별 토탈월급을 막대 그래프로 그리시오.
# R x <- tapply(emp$sal,emp$deptno, sum) barplot(x, ylim = c(0,12000), main = '부서번호별 월급 토탈', col=rainbow(3))
데이터를 가로로 출력해야 그래프 그릴 수 있음.

문제72. 위 결과를 파이썬에서 수행하시오.
import seaborn as sns import pandas as pd import numpy as np emp = pd.read_csv("c:\\data\\emp2.csv") pd_result = emp.groupby('deptno')['sal'].sum().reset_index() pd_result.plot.bar(x = 'deptno',color = 'lightsteelblue')

문제73. 아래의 SQL을 R과 python으로 구현하시오.
-- SQL select job, sum(decode(deptno, 10, sal, null) ) as "10", sum(decode(deptno, 20, sal, null) ) as "20", sum(decode(deptno, 30, sal, null) ) as "30" from emp group by job;

# R tapply(emp$sal, list(emp$job, emp$deptno), sum)
# python emp.pivot_table(columns = 'deptno', index='job', values='sal', aggfunc='sum')
문제74. 위의 출력결과에서 NA(null)를 0으로 출력되게 하시오.
-- SQL select job, sum(decode(deptno, 10, sal, 0) ) as "10", sum(decode(deptno, 20, sal, 0) ) as "20", sum(decode(deptno, 30, sal, 0) ) as "30" from emp group by job;
# R x <- tapply(emp$sal, list(emp$job, emp$deptno), sum) is.na(x) # NA가 True로 출력됨
10 20 30
ANALYST TRUE FALSE TRUE
CLERK FALSE FALSE FALSE
MANAGER FALSE FALSE FALSE
PRESIDENT FALSE TRUE TRUE
SALESMAN TRUE TRUE FALSE
결측치에 0을 넣으면 됨
x[is.na(x)] <-0 # is.na(x)에서 True에 해당하는 부분에 0을 할당 x
10 20 30
ANALYST 0 6000 0
CLERK 1300 1900 950
MANAGER 2450 2975 2850
PRESIDENT 5000 0 0
SALESMAN 0 0 5600
# python x = emp.pivot_table(columns = 'deptno', index='job', values='sal', aggfunc='sum') x.fillna('0', inplace = True) # 데이터프레임의 nan을 0으로 변경 x
그래프로 시각화하려면 결측치가 없어야함. 그래서 모든 결측치를 0으로 변경했음.
문제75. 아래의 x데이터 프레임에서 컬럼명과 인덱스명을 출력하시오.
10 20 30
ANALYST 0 6000 0
CLERK 1300 1900 950
MANAGER 2450 2975 2850
PRESIDENT 5000 0 0
SALESMAN 0 0 5600
# R colnames(x) rownames(x)
문제76. 위의 x데이터 프레임을 막대 그래프로 시각화 하시오.
# R barplot(x, col=rainbow(5), legend = rownames(x), beside = T)
legend는 그래프의 설명 박스,
beside = T 를 넣어줘야 직업별로 각각 그래프들이 그려짐. 쓰지 않으면 막대가 하나로 쌓아서 그려짐.

+) 범례 투명하게 넣는 방법
barplot(x, col=rainbow(5), legend = rownames(x), args.legend = list(x = 'topright',cex = 0.7, bg = 'transparent'), beside = T)
args.legend = list() 범례옵션으로 범례 위치 및 범례에 관한 스타일을 설정할 수 있음.
list(x = 'topright',cex = 0.7, cex = 0.7 ) 을 설명하자면,
x = 'topright' # 오른쪽 상단
cex = 0.7 # 범례 크기
bg = 'transparent' # 범례 배경색, tranparent 은 투명을 의미함\

+) 범례 색상 다양하게 넣는 방법
+) 범례 관련 참고
https://rvisuall.tistory.com/21
문제77. 위의 x데이터 프레임을 막대 그래프로 파이썬으로 시각화 하시오.
x = emp.pivot_table(columns = 'deptno', index='job', values='sal', aggfunc='sum') x.fillna(0, inplace = True) x.plot(kind = 'bar', figsize = (10,8), rot=False) # rot = False는 x축의 이름이 회전됨

R의 경우 x데이터 프레임의 컬럼을 x축으로 구성했고, 파이썬의 경우 x데이터 프레임의 로우이름(index)를 x 축으로 구성함.
x = emp.pivot_table(columns = 'job', index='deptno', values='sal', aggfunc='sum') x.fillna(0, inplace = True) x.plot(kind = 'bar', figsize = (10,8), rot=False) # rot = False는 x축의 이름이 회전됨

15 R 에서의 원형그래프
문제79. 직업, 직업별 토탈월급을 가로로 출력하시오.
-- SQL select * from (select job, sal from emp) pivot (sum(sal) for job in ('ANALYST' as "ANALYST", 'CLERK' as "CLERK", 'MANAGER' as "MANAGER", 'PRESIDENT' as "PRESIDENT", 'SALESMAN' as "SALESMAN" ) );
# R tapply(emp$sal, emp$job, sum)
# python x = emp.groupby('job')['sal'].sum().reset_index() x.pivot_table(columns = 'job')
문제80. 위의 결과를 원형(pie)그래프로 그리시오.(R)
# R a <- tapply(emp$sal, emp$job, sum) pie(a, col = rainbow(5))

원형 그래프에 비율을 표시하려면,
a <- tapply(emp$sal, emp$job, sum) pie(a, col = rainbow(5)) a2 <- aggregate(sal ~ job, emp, sum) pct <- round(a2$sal/sum(emp$sal) * 100, 1) job_label <- paste(a2$job, ':', pct, '%') job_label
"ANALYST : 20.7 %" "CLERK : 14.3 %" "MANAGER : 28.5 %" "PRESIDENT : 17.2 %" "SALESMAN : 19.3 %"
원형그래프의 비율을 표시하기 위해서 job_labels데이터를 만들었음
pie(a, col=rainbow(5), labels = job_label)

문제81. 위의 결과를 원형(pie)그래프로 파이썬을 이용해 그리시오.
x = emp.pivot_table(columns = 'job', values='sal', aggfunc='sum') x.iloc[0,:].plot(kind = 'pie', autopct = '%0.0f%%') # pivot안쓰고 이렇게 해도 가능함 x = emp.groupby('job')['sal'].sum().reset_index() x['sal'].plot(kind = 'pie', labels = x['job'], autopct = '%0.0f%%')

문제82. 부서번호, 부서번호별 토탈월급을 원형그래프로 시각화 하시오(R)
result <- tapply(emp$sal, emp$deptno, sum) result result2 <- aggregate(sal ~ deptno, emp, sum) # result에서는 부서번호별 sum(sal)이 인덱스라서 result2를 만들어 sum(sal)컬럼 가져옴. pct <- round(result2$sal/sum(emp$sal)*100, 1) deptno_label <- paste(result2$deptno, ':', pct, '%') pie(result, col=rainbow(3), labels = deptno_label )

문제83. 부서번호, 부서번호별 토탈월급을 원형 그래프로 시각화 하시오 (python)
x = emp.pivot_table(columns = 'deptno', values='sal', aggfunc='sum') x.iloc[0,:].plot(kind = 'pie', autopct = '%0.0f%%')

+) R 원형그래프 색 및 스타일 다양
x<- merge(emp, dept, by = 'deptno') result <- tapply(x$sal, x$loc, sum) result2 <- aggregate(sal~loc, x, sum) result2 pct <- round(result2$sal/sum(emp$sal)*100, 1) loc_label <- paste(result2$loc, ':',pct,'%') pie(result, density = 20, col=14:1, labels = loc_label)

'Study > class note' 카테고리의 다른 글
R / 조인(outer join, self join, 조직도 시각화), pivot_table, tapply, 집합연산자 (0) | 2022.01.20 |
---|---|
R / 조인 (0) | 2022.01.19 |
R / 그룹함수, aggregate, tapply, table, format (0) | 2022.01.19 |
R / 문자함수(gsub), 날짜함수, 변환함수, 일반함수, 그룹함수 (0) | 2022.01.18 |
R / R자료형, 연산자, 중복제거, 데이터 정렬, 문자함수(lower, substr) (0) | 2022.01.17 |