R / 막대그래프, 원형그래프
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)