Bar Chart

Author

Gabriel Yang

바 차트(막대그래프)는 카테고리 간의 데이터를 비교하고 시각화하는 데 매우 유용합니다. 바 차트는 데이터가 카테고리형 데이터이거나 연속적이지 않고 이산적인 데이터 인 경우에 유용합니다. 시간 경과에 따른 변화를 나타내기보다 특정 시점에서의 비교가 더 중요한 경우나 각 항목이 전체에서 차지하는 비중이나 기여를 비교할 때 유용하게 사용됩니다.

바 차트를 사용하기 적합한 데이터의 특징

  1. 범주형 데이터: 바 차트는 범주형 데이터를 시각화하는 데 가장 효과적입니다. 예를 들어, 국가별 인구, 제품별 판매량, 부서별 직원 수 등과 같은 범주나 그룹 간의 비교를 시각적으로 표현하는 데 적합합니다.
  2. 서로 다른 그룹 간 비교: 바 차트는 정량적 데이터, 즉 수치 데이터를 비교하는 데 유용합니다. 각 바의 길이나 높이가 해당 데이터의 값을 나타내므로, 수치적으로 비교할 수 있습니다.
  3. 정렬된 데이터: 바 차트는 데이터를 오름차순 또는 내림차순으로 정렬하여 중요한 항목을 쉽게 파악할 수 있게 합니다. (가장 많이 팔린 제품부터 적게 팔린 제품까지 정렬한 판매량 데이터.)
  4. 비교 대상이 적당한 범위: 바 차트는 비교할 데이터가 너무 많지 않은 경우 효과적입니다. 데이터 항목이 많으면 바 차트가 복잡하고 읽기 어려워질 수 있습니다.
  5. 단일 변수 : 바 차트는 주로 단일 변수의 분포를 보여주는 데 사용됩니다. 예를 들어, 특정 연도의 각 월별 판매량을 나타낼 때 유용합니다.

바 차트의 특징

  • 직사각형 막대로 데이터 표현: 바 차트는 각 데이터 포인트를 직사각형 막대로 표현합니다. 막대의 길이(또는 높이)는 데이터 값의 크기를 나타냅니다. 막대가 길수록 데이터 값이 큽니다.
  • 카테고리별 데이터 비교에 적합: 바 차트는 여러 카테고리(예: 제품, 지역, 기간 등) 간의 데이터를 비교하는 데 매우 유용합니다. 각 막대는 특정 카테고리를 대표하며, 시각적으로 각 카테고리 간의 차이를 명확하게 보여줍니다.
  • 누적 및 그룹화 기능: 여러 데이터 세트를 비교할 때, 같은 카테고리 내에서 막대를 나란히 배치하여 그룹 간의 차이를 시각적으로 비교할 수 있습니다.
  • 정렬 가능: 바 차트는 막대의 길이를 기준으로 정렬할 수 있습니다. 이를 통해 가장 큰 값에서 가장 작은 값까지, 또는 그 반대로 값을 정렬하여 데이터의 중요도를 강조할 수 있습니다.

Plotly로 라인 차트 그리는 방법

데이터 준비

이제 Plotly를 사용하여 간단한 막대그래프를 그려보겠습니다. 예시로, 카테고리별로 판매된 제품 수를 나타내는 막대그래프를 만들어 보겠습니다. 연습을 위한 데이터 프레임을 생성합니다.

import pandas as pd

# 예제 데이터 생성
data = {
    '제품': ['A', 'B', 'C', 'D'],
    '2023년 판매량': [150, 200, 300, 100],
    '2024년 판매량': [180, 210, 320, 130]
}

df = pd.DataFrame(data)
df
제품 2023년 판매량 2024년 판매량
0 A 150 180
1 B 200 210
2 C 300 320
3 D 100 130

Bar 차트 그리기

Plotly의 go.Bar를 사용해 2023년 판매량을 나타내는 기본 막대그래프를 그려보겠습니다.

import plotly.graph_objs as go


# 막대그래프 생성
fig = go.Figure(data=[
    go.Bar(name='2023년 판매량', x=df['제품'], y=df['2023년 판매량'])
])

# 그래프 레이아웃 설정
fig.update_layout(title='2023년 제품별 판매량', xaxis_title='제품', yaxis_title='판매량')

# 그래프 출력
fig.show()

이 코드로 생성된 그래프는 2023년의 제품별 판매량을 보여줍니다. go.Bar 객체를 사용해 각 제품의 판매량을 막대로 시각화합니다.

여러 데이터 시리즈 비교: 그룹화된 막대그래프

이제 2023년과 2024년의 판매량을 함께 비교할 수 있는 그룹화된 막대그래프를 만들어 보겠습니다.

fig = go.Figure()

# 그룹화된 막대그래프 생성
fig.add_trace(go.Bar(name='2023년 판매량', x=df['제품'], y=df['2023년 판매량']))
fig.add_trace(go.Bar(name='2024년 판매량', x=df['제품'], y=df['2024년 판매량']))

# 막대그래프 그룹화
fig.update_layout(
    title='2023년 vs 2024년 제품별 판매량 비교',
    xaxis_title='제품',
    yaxis_title='판매량')

# 그래프 출력
fig.show()

이 그래프는 각 제품에 대해 2023년과 2024년의 판매량을 나란히 비교할 수 있도록 해줍니다. 막대가 서로 다른 색상으로 구분되어 있어 시각적으로 쉽게 비교할 수 있습니다.

fig.add_trace(go.Bar(...)) 함수는 여러 개의 막대그래프를 함께 표시하기 위해 사용합니다. 2023년과 2024년 막대그래프를 함께 표현하기 위해 사용합니다. fig.update_layout(...)함수는 그래프의 레이아웃을 조정하고 제목과 축 레이블을 변경하기 위해 사용합니다. 마지막으로 fig.show()함수를 사용해서 그래프를 화면에 출력합니다.

fig = go.Figure()

# 그룹화된 막대그래프 생성
fig.add_trace(go.Bar(name='2023년 판매량', x=df['제품'], y=df['2023년 판매량']))
fig.add_trace(go.Bar(name='2024년 판매량', x=df['제품'], y=df['2024년 판매량']))

# 막대그래프 그룹화
fig.update_layout(barmode='stack', title='2023년 vs 2024년 제품별 판매량 비교', xaxis_title='제품', yaxis_title='판매량')

# 그래프 출력
fig.show()

위와 같이 그래프의 barmodestack으로 변경하면 2023년과 2024년 제품이 stack되는 형태로 나타납니다. 각 제품의 전체 총량의 비교를 위해 사용될 수 있습니다.

데이터를 변환하여 막대그래프 그리기

기존 dataframe의 형태는 아래와 같이 “넓은 형식”의 데이터입니다.

제품 2023년 판매량 2024년 판매량
0 A 150 180
1 B 200 210
2 C 300 320
3 D 100 130

여기서 2023년 판매량, 2024년 판매량이라는 열이 각각 독립적인 값들로 존재합니다. melt() 함수를 사용하면 여러 열(column)을 하나의 열로 합쳐서 “긴 형식” 데이터로 변환할 수 있습니다. 이 방식은 여러 데이터 열을 하나로 합쳐서 시간 또는 카테고리별 데이터로 변환하는 데 유용합니다.

데이터를 길게 변환(melt)하여 두 해의 판매량을 하나의 열로 합치고, 이를 사용해 막대그래프를 그려보겠습니다.

# 데이터 변환
df_melted = df.melt(id_vars='제품', var_name='년도', value_name='판매량')

# 변환된 데이터 확인
df_melted
제품 년도 판매량
0 A 2023년 판매량 150
1 B 2023년 판매량 200
2 C 2023년 판매량 300
3 D 2023년 판매량 100
4 A 2024년 판매량 180
5 B 2024년 판매량 210
6 C 2024년 판매량 320
7 D 2024년 판매량 130

df.melt() 함수는 Pandas에서 데이터를 “넓은 형식(wide format)”에서 “긴 형식(long format)”으로 변환할 때 사용되는 메서드입니다. 이 메서드는 데이터를 시각화하거나 분석할 때 좀 더 유연하게 다룰 수 있도록 도와줍니다.

  • id_vars='제품' : 이 인자는 변환 후에도 그대로 남길 열을 지정합니다. 여기서는 제품 열을 그대로 유지합니다. 즉, 제품 열은 melt 이후에도 변하지 않습니다.
  • var_name='년도': 이 인자는 새로 만들어질 열의 이름을 지정합니다. 원래 여러 개의 열(2023년 판매량, 2024년 판매량)이 년도라는 이름의 하나의 열로 합쳐집니다.
  • value_name='판매량': 이 인자는 새롭게 생성될 값 열의 이름을 지정합니다. 원래 여러 열에 있던 실제 값(판매량)이 이 열에 저장됩니다.

즉 제품 열은 그대로 유지되고 2023년 판매량, 2024년 판매량 열은 년도 열의 값으로 합쳐진 후 각각의 판매량 값은 판매량 열에 들어갑니다. 이렇게 변환된 데이터는 년도에 따라 데이터를 나누고, 그에 따른 판매량을 분석하거나 시각화하기 더 용이한 형태로 변환됩니다. 특히 시계열 분석이나 여러 카테고리를 비교할 때 유용합니다.

Note

Pandas의 melt 함수를 사용하여 데이터를 긴 형식으로 변환해야 하는 상황은 여러 개의 열(column)이 동일한 변수에 해당하는 경우입니다. 이런 상황에서는 데이터를 변환하여 분석 및 시각화를 더 쉽게 할 수 있습니다.

Plotly.express는 Plotly의 하위 모듈로, 간단한 시각화 작업을 위해 고안된 고수준 인터페이스를 제공합니다. Plotly Express를 사용하면 color 옵션을 사용해서 연도별 데이터를 색상으로 구분하여 표시할 수 있습니다.

import plotly.express as px

# 그룹화된 막대그래프 생성
fig = go.Figure()

# 각 년도별로 막대 추가
fig = px.bar(df_melted, x='제품', y='판매량', color='년도', barmode='group',
             title='제품별 연도별 판매량 비교')

# 그래프 출력
fig.show()

cf_melted는 긴 형식(long format)으로 변환된 데이터로, 제품, 년도, 판매량의 세 가지 열로 구성되어 있습니다. 판매량 내부의 연도별 데이터가 서로 다른 색상으로 표현되었습니다. 이처럼 기존의 코드에서 각각의 열을 bar로 표현했던 코드를 meltPlotly Express의 바 차트의 color옵션을 사용해서 간결하게 표현할 수 있습니다.

Note

px.bar를 이용해서 긴 형식 데이터를 바 차트로 표현할 때 위의 코드와 같이 barmode=’grounp’을 적용하지 않으면 stack된 형태도 막대 그래프가 생성됩니다.

Bar 형태 및 색상 변경하기

fig.update_traces는 Plotly에서 데이터 시각화를 커스터마이즈할 때 사용되는 메서드로, 그래프의 모든 트레이스(traces)에 대해 공통적인 속성을 업데이트할 수 있게 해줍니다. traces는 그래프에 표시된 각각의 데이터 시리즈를 의미하며, 예를 들어 막대그래프에서는 각각의 막대가 하나의 트레이스입니다. 이 메서드는 공통된 스타일을 적용할 때 유용합니다.

import plotly.express as px

# 그룹화된 막대그래프 생성
fig = go.Figure()

# 각 년도별로 막대 추가
fig = px.bar(df_melted, x='제품', y='판매량', color='년도', barmode='group',
             title='제품별 연도별 판매량 비교')

fig.update_traces(
    marker=dict(
        opacity=0.7,  # 막대의 투명도
    )
)

fig.show()

위의 예시에서는 update_tracesmarker 속성을 사용하며 이 속성은 막대, 점 등의 시각적 스타일을 정의합니다. opacity를 이용해서 투명도를 변경했습니다.

import plotly.express as px

# 그룹화된 막대그래프 생성
fig = go.Figure()

# 각 년도별로 막대 추가
fig = px.bar(df_melted, x='제품', y='판매량', color='년도', barmode='group',
             title='제품별 연도별 판매량 비교')

fig.update_traces(
    marker=dict(
        line=dict(
            color='black',  # 막대의 외곽선 색상
            width=2  # 외곽선의 두께
        )
    )
)

fig.show()

이번 예제는 line속성을 이용해서 막대의 외곽선 색생과 외곽선의 두께를 조정했습니다.

# 색상을 조건에 따라 설정하기 위한 데이터 추가


# 조건부 색상 적용
fig = px.bar(df_melted, x='제품', y='판매량', color='년도', barmode='group',
             color_discrete_map={'2023년 판매량': 'lightblue', '2024년 판매량': 'lightgreen'})

# 그래프 출력
fig.show()