Study/class note

R / 막대그래프, 원형그래프

chanzae 2022. 1. 19. 16:04

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://blog.naver.com/PostView.nhn?blogId=lado135&logNo=221937743074&parentCategoryNo=&categoryNo=318&viewDate=&isShowPopularPosts=true&from=search 

+) 범례 관련 참고

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)

반응형