[ 데이터 분석 입문 ] 개인 과제 | 다중 막대그래프 그리기
[ Library 개인 과제 ]
기간: 5/30 ~ 6/5
목표: 전처리 & 시각화의 이해
오늘은 데이터 분석 입문 개인 과제 제출 마감일이었다.
지금까지는 강의를 들으면서 예시 코드로만 실습해 봤는데, 실제 데이터를 사용해서 전처리와 시각화를 해보려니까 생각보다 어려웠다. 특히, 시각화하는 과정에서 내가 의도하는 대로 그래프가 나오지 않고 계속 에러가 떠서 해결하느냐고 시간을 많이 썼다.
그중에서 가장 어려웠던 2-1번 문제 풀이 과정을 정리해 보았다.
(문제 2-1) Bar Chart : 라인별 Production & Defects
공장 내에는 A, B, C 등 여러 생산 라인(Line) 이 존재하며, 각 라인마다 하루 생산량(Production)과불량(Defects) 데이터가 기록됩니다. 라인별로 이러한 데이터를 그룹화하여 생산량과 불량 수치를 파악하고, 막대 그래프(Bar Chart) 로 시각화하여 비교하려고 합니다.
1. 라인별 그룹화
▪︎ 주어진 데이터에서 라인(Line) 을 기준으로 그룹화하세요.
▪︎ 각 라인별 생산량(Production) 과 불량(Defects) 의 총합(합계)을 구하세요.
df_bar = df.groupby('Line')[['Production','Defects']].sum().reset_index()
-> 먼저 왼쪽에 있는 데이터는 생산량, 불량품 개수, 온도 등이 포함된 공장 데이터의 일부이고, 이미 결측치와 이상치에 대한 전처리가 완료된 상태이다.
각 라인별 생산량과 불량의 총합을 구하기 위해 groupby( ) 를 사용해 Line을 기준으로 그룹화하고, Production과 Defects 각각의 총합을 구한다. 이렇게 하면 'Line'이 인덱스가 되는데 코드 마지막에 reset_index( ) 를 붙여주면 오른쪽 데이터프레임처럼 컬럼으로 바꿀 수 있다.
2. Bar Chart 작성
▪︎ X축에는 라인(Line) 을 표시합니다.
▪︎ Y축에는 생산량(Production) 과 불량(Defects) 의 합계를 나타냅니다.
▪︎ 각 라인별로 두 가지 막대(Production/Defects)를 나란히 배치하여 시각적인 비교가 가능하도록 합니다.
# 잘못된 코드
plt.bar(df_bar['Line'], df_bar['Production'])
plt.bar(df_bar['Line'], df_bar['Defects'])
-> 앞서 그룹화한 데이터프레임(df_bar)를 이용해 각 라인별로 두 가지 막대(Production/Defects)를 나란히 배치해야 하는데 방법을 몰라서 일단 각각 plt.bar 를 해보니 위 사진처럼 막대 두 개가 겹쳐서 나왔다. 두 막대를 왼쪽/오른쪽으로 밀어야 하는데 코드로 구현하기가 너무 어려워서 튜터님께 질문을 드렸더니 '막대를 배치할 x축 좌표를 숫자로 만들어주라는' 힌트를 얻을 수 있었다.
import numpy as np
x= np.arange(len(df_bar['Line']))
# → array([0, 1, 2])
-> 막대그래프에서 x축 좌표를 생성하기 위해, np.arange( ) 를 이용해 Line의 개수만큼 0~2까지의 배열을 만들어준다.
📍range vs np.arange 차이점
range( ) | np.arange( ) | |
반환 타입 | range 객체 (반복자) | numpy.ndarray (배열) |
실수 지원 | 정수만 가능 | 실수(step=0.1 등) 지원 |
연산 가능성 | 벡터연산 불가 | 벡터연산 가능 |
활용 용도 | 반복문 (for i in range(...)) 등 | 수치 연산, 시각화 등 |
width = 0.3
plt.bar(x - width/2, df_bar['Production'], width)
plt.bar(x + width/2, df_bar['Defects'], width)
-> 막대는 기본적으로 각 x위치에 가운데로 그려지기 때문에 서로 다른 값을 같은 x 위치에 두면 위의 그래프처럼 겹쳐버린다.
따라서, 막대 너비의 절반만큼 Production(파란색) 막대는 왼쪽으로, Defects(주황색) 막대는 오른쪽으로 x좌표를 이동시켜주면 두 막대가 나란히 표시된다.
3. 그래프 꾸미기
▪︎ 범례(legend)를 추가하여 Production 와 Defects 를 명확하게 구분하세요.
▪︎ X축에 라인(A, B, C) 이름이 정확히 표시되도록 하세요. (필요에 따라 plt.xticks 등을 사용)
▪︎ Y축에 대한 격자(grid)를 추가하여 막대의 높이를 쉽게 확인할 수 있도록 합니다.
plt.title('Total Production and Defects by Line')
plt.xlabel('Line')
plt.ylabel('Count')
plt.xticks(x, df_bar['Line']) # x축 숫자를 'Line' 이름으로 대체
plt.xlim(-0.6,2.6)
plt.legend(['Production', 'Defects'])
plt.grid(axis='y')
plt.show()
-> 그래프를 그릴 때 주의해야 할 점은 이전에 x축 좌표를 숫자로 만들어줬기 때문에 plt.xticks(x, df_bar['Line']) 코드를 추가해 'Line' 이름으로 대체해줘야 한다.
드.디.어. 원하던 이중 막대그래프를 그릴 수 있게 됐다 !!
3-3번에서 또 다른 데이터를 살펴보고 자유롭게 시각화해보는 문제가 나왔는데, 이중 그래프를 응용해서 삼중 그래프도 수월하게 만들 수 있었다.
width = 0.2
x= np.arange(len(data_cleaned['date']))
plt.bar(x - width, data_cleaned['operation_time_A'], width)
plt.bar(x, data_cleaned['operation_time_B'], width)
plt.bar(x + width, data_cleaned['operation_time_C'], width)
📌 다중 그래프 그리는 간단한 방법
6월 4일 라이브 세션 수업에서 pandas의 내장 기능을 활용해 바로 시각화하는 방법을 배우고, 혹시나 해서 아래와 같은 코드를 쳐봤는데
df_bar.plot(kind='bar')
바로 그 이중 그래프가 나왔다..! 코드 한 줄로 이렇게 간단하게 될 줄이야 😂
암튼 이제부터는 이 방법을 사용해야겠다.