파이썬 시각화로 범주형 데이터 시각화하기: 그룹별 막대 그래프와 범주형 데이터 예시

데이터 분석에서 가장 기본적이지만 강력한 도구 중 하나가 범주형 데이터 시각화입니다. 성별, 결혼 상태, 연령대 등 그룹별 데이터를 시각화하면 아래 그림과 같이 직관적으로 분포와 차이를 이해할 수 있습니다.

범주형 데이터 예시 그래프 시각화
( 범주형 데이터 예시 그래프 시각화 )

이번 포스트에서는 파이썬의 matplotlib를 활용해 범주형 데이터를 그룹화하고 막대 그래프로 시각화하는 방법을 배웁니다. 추가로 범주형 데이터 예시를 통해 실생활에서 어떤 데이터를 다룰 수 있는지 함께 알아보겠습니다.

범주형 데이터란?

범주형 데이터(Categorical Data)는 특정 그룹이나 카테고리로 구분되는 데이터를 의미합니다.
대표적인 예시는 다음과 같습니다:

  1. 성별: 남성, 여성
  2. 연령대: 10대, 20대, 30대, 40대 이상
  3. 결혼 상태: 미혼, 기혼, 이혼, 무응답
  4. 지역: 서울, 부산, 대구 등
  5. 교육 수준: 고졸, 대졸, 석사, 박사

이런 데이터를 분석하면 그룹 간의 차이, 분포, 비율을 직관적으로 이해할 수 있습니다.

범주형 데이터 예시

이번 예시에서는 결혼 상태성별 데이터를 사용해 각 그룹의 분포를 시각화합니다. 다음과 같은 범주형 데이터가 주어졌다고 가정해 봅시다.

성별결혼 상태인원 수
남성무응답700
여성무응답1000
남성이혼200
여성이혼250
남성결혼3200
여성결혼2400
  • 성별: 남성(Male)과 여성(Female)으로 구분
  • 결혼 상태: 무응답(No Response), 이혼(Divorce), 결혼(Married)

이 데이터를 그룹별 막대 그래프로 그려서 시각화해 보겠습니다.

파이썬 코드 예제

아래는 위 데이터를 기반으로 범주형 데이터를 시각화하는 코드입니다.

import matplotlib.pyplot as plt  
import pandas as pd  
import numpy as np  

# 데이터 생성  
data = {'Gender': ['Male', 'Female', 'Male', 'Female', 'Male', 'Female'],  
        'Marital_Status': ['No Response', 'No Response', 'Divorce', 'Divorce', 'Married', 'Married'],  
        'Count': [700, 1000, 200, 250, 3200, 2400]}  

# 데이터프레임 생성  
df = pd.DataFrame(data)  

# 결혼 유무별 데이터 나누기  
no_response = df[df['Marital_Status'] == 'No Response']  
divorce = df[df['Marital_Status'] == 'Divorce']  
married = df[df['Marital_Status'] == 'Married']  

# 그래프 그리기  
fig, axes = plt.subplots(1, 3, figsize=(12, 5), sharey=True)  

# 첫 번째 그래프: 결혼 상태 = 무응답  
axes[0].bar(no_response['Gender'], no_response['Count'], color=['#1f77b4', '#aec7e8'])  
axes[0].set_title("Marital Status = No Response")  
axes[0].set_xlabel("Gender")  
axes[0].set_ylabel("Count")  

# 두 번째 그래프: 결혼 상태 = 이혼  
axes[1].bar(divorce['Gender'], divorce['Count'], color=['#1f77b4', '#aec7e8'])  
axes[1].set_title("Marital Status = Divorce")  
axes[1].set_xlabel("Gender")  

# 세 번째 그래프: 결혼 상태 = 결혼  
axes[2].bar(married['Gender'], married['Count'], color=['#1f77b4', '#aec7e8'])  
axes[2].set_title("Marital Status = Married")  
axes[2].set_xlabel("Gender")  

# 공통 설정  
for ax in axes:  
    ax.set_xticks(np.arange(len(df['Gender'].unique())))  
    ax.set_xticklabels(['Male', 'Female'], fontsize=10)  
    ax.spines['top'].set_visible(False)  
    ax.spines['right'].set_visible(False)  

# 레이아웃 조정  
plt.tight_layout()  

# 그래프 출력  
plt.show()
범주형 데이터 시각화 단계 그림

코드 간략 해설

  1. 데이터 생성
    • 성별, 결혼 상태, 인원 수 데이터를 딕셔너리 형태로 설정하고 pandas DataFrame으로 만듭니다.
  2. 데이터 그룹화
    • No Response, Divorce, Married 결혼 상태별 데이터를 필터링합니다.
  3. 그래프 생성
    • 3개의 서브플롯을 만들고 각 서브플롯에 bar()를 이용해 막대 그래프를 그립니다.
    • X축에는 성별을, Y축에는 인원 수를 표시합니다.
  4. 레이아웃 설정
    • tight_layout()으로 서브플롯 간의 간격을 조정하고 깔끔하게 정리합니다.

범주형 데이터 활용 팁

범주형 데이터는 비즈니스, 통계 분석, 설문 조사 등 다양한 분야에서 활용됩니다. 각 분야에서 어떻게 범주형 데이터를 활용해 의미 있는 인사이트를 얻을 수 있는지 아래 예시를 통해 자세히 알아보겠습니다.

1. 비즈니스 인사이트 도출

제품 구매 데이터고객 행동 데이터를 분석하면 고객 그룹별 특성을 파악하고 비즈니스 전략을 수립하는 데 유용합니다.

활용 사례

  • 성별 및 나이대별 구매 비율 분석
    • 예를 들어 특정 제품의 구매 비율을 성별(남성, 여성)과 나이대(20대, 30대, 40대 등)로 나누어 시각화합니다.
    • 결과적으로 어느 그룹에서 가장 많은 구매가 발생하는지 확인해 타겟 마케팅 전략을 세울 수 있습니다.
  • 지역별 매출 분석
    • 특정 제품이나 서비스의 매출 데이터를 지역별로 나누어 시각화하면 지역 특성에 맞는 판매 전략을 세울 수 있습니다.
    • 예: 서울 지역에서 특정 제품의 판매가 높을 경우, 해당 지역에 집중적인 광고를 진행합니다.

2. 사회 통계 분석

인구 통계 데이터를 분석하면 사회적 특성과 변화를 파악하는 데 큰 도움이 됩니다. 특히 결혼 상태, 교육 수준, 지역별 분포 등은 정책 수립이나 연구에 유용한 데이터입니다.

활용 사례

  • 결혼 상태 분석
    • 결혼, 이혼, 미혼 비율을 나이대나 지역별로 시각화하면 특정 그룹의 사회적 변화를 이해할 수 있습니다.
    • 예: 특정 지역에서 이혼율이 높다면 해당 지역에 대한 복지 정책이 필요할 수 있습니다.
  • 교육 수준별 소득 분포 분석
    • 교육 수준(고졸, 대졸, 석사 등)에 따른 소득 수준을 시각화하면 교육이 소득에 미치는 영향을 분석할 수 있습니다.

3. 설문조사 결과 분석

설문조사 데이터를 시각화하면 특정 그룹의 선호도나 의견을 명확히 파악할 수 있습니다.

활용 사례

  • 제품 만족도 조사
    • 제품 만족도를 성별, 연령대별로 분석해 특정 그룹의 의견을 수집합니다.
    • 예: 남성 30대 그룹에서 제품 만족도가 낮다면 해당 그룹의 피드백을 기반으로 제품 개선이 필요합니다.
  • 소비자 선호도 분석
    • 특정 제품이나 서비스에 대한 선호도를 범주별(지역, 성별 등)로 분석합니다.
    • 예: A지역 고객이 B지역보다 특정 서비스에 더 높은 만족도를 보인다면 해당 지역에 마케팅을 집중합니다.

마무리

이번 포스트에서는 범주형 데이터를 시각화하는 방법을 배웠습니다. matplotlib을 활용하면 다양한 범주형 데이터를 막대 그래프로 손쉽게 시각화할 수 있습니다. 실제 데이터를 활용해 분석하고 다양한 그룹화 조건을 시도해 보세요. 시각화는 데이터를 해석하고 인사이트를 얻는 강력한 도구가 될 것입니다!

파이썬 시각화 하는 것에 흥미가 있으시다면, 파이썬 시각화로 배우는 도넛 차트 그리기와 중첩 방법 포스트를 보시고 관련 지식을 쌓아보세요!

# 코드 상세 해설

1. 라이브러리 불러오기

import matplotlib.pyplot as plt  
import pandas as pd  
import numpy as np  
  • matplotlib.pyplot: 그래프 및 시각화를 위한 라이브러리입니다.
  • pandas: 데이터프레임을 생성하고 데이터를 다룰 수 있는 라이브러리입니다.
  • numpy: 수치 연산 및 배열 데이터를 다루는 라이브러리입니다.

2. 데이터 생성

data = {'Gender': ['Male', 'Female', 'Male', 'Female', 'Male', 'Female'],  
        'Marital_Status': ['No Response', 'No Response', 'Divorce', 'Divorce', 'Married', 'Married'],  
        'Count': [700, 1000, 200, 250, 3200, 2400]}  
  • data 딕셔너리: 시각화할 데이터를 딕셔너리 형태로 만듭니다.
    • Gender: 성별을 나타내며 ‘Male'(남성)과 ‘Female'(여성) 두 그룹입니다.
    • Marital_Status: 결혼 상태를 범주형 데이터로 설정합니다. (No Response, Divorce, Married)
    • Count: 각 그룹의 인원 수를 나타냅니다.

3. 데이터프레임 생성

df = pd.DataFrame(data)  
  • pd.DataFrame(): 위에서 만든 data 딕셔너리를 DataFrame 형태로 변환합니다.
  • 결과적으로 테이블 형태의 데이터가 생성됩니다.

출력 예시:

GenderMarital_StatusCount
MaleNo Response700
FemaleNo Response1000
MaleDivorce200
FemaleDivorce250
MaleMarried3200
FemaleMarried2400

4. 결혼 상태별 데이터 나누기

no_response = df[df['Marital_Status'] == 'No Response']  
divorce = df[df['Marital_Status'] == 'Divorce']  
married = df[df['Marital_Status'] == 'Married']  
  • 조건 필터링: DataFrame의 Marital_Status 컬럼을 기준으로 데이터를 나눕니다.
    • df[df['Marital_Status'] == 'No Response']: 결혼 상태가 ‘No Response’인 행만 추출합니다.
    • df[df['Marital_Status'] == 'Divorce']: 결혼 상태가 ‘Divorce’인 행만 추출합니다.
    • df[df['Marital_Status'] == 'Married']: 결혼 상태가 ‘Married’인 행만 추출합니다.

5. 서브플롯 생성

fig, axes = plt.subplots(1, 3, figsize=(12, 5), sharey=True)  
  • plt.subplots(): 여러 개의 그래프(서브플롯)를 동시에 그릴 수 있도록 설정합니다.
    • 1, 3: 1행 3열의 서브플롯을 생성합니다.
    • figsize=(12, 5): 전체 그래프의 가로, 세로 크기를 설정합니다.
    • sharey=True: Y축 값을 모든 서브플롯에서 공유하도록 설정합니다.

6. 첫 번째 그래프: No Response

axes[0].bar(no_response['Gender'], no_response['Count'], color=['#1f77b4', '#aec7e8'])  
axes[0].set_title("Marital Status = No Response")  
axes[0].set_xlabel("Gender")  
axes[0].set_ylabel("Count")  
  • axes[0].bar(): 첫 번째 서브플롯에 막대 그래프를 그립니다.
    • no_response['Gender']: X축 값으로 성별(‘Male’, ‘Female’)을 설정합니다.
    • no_response['Count']: Y축 값으로 각 성별의 인원 수를 설정합니다.
    • color: 막대의 색상을 설정합니다.
      • '#1f77b4': 진한 파란색 (남성)
      • '#aec7e8': 연한 파란색 (여성)
  • set_title(): 서브플롯의 제목을 설정합니다.
  • set_xlabel(): X축 레이블을 설정합니다.
  • set_ylabel(): Y축 레이블을 설정합니다.

7. 두 번째 그래프: Divorce

axes[1].bar(divorce['Gender'], divorce['Count'], color=['#1f77b4', '#aec7e8'])  
axes[1].set_title("Marital Status = Divorce")  
axes[1].set_xlabel("Gender")  
  • axes[1]: 두 번째 서브플롯입니다.
  • 데이터: 결혼 상태가 ‘Divorce’인 그룹의 성별과 인원 수를 시각화합니다.
  • X축/Y축 설정: 첫 번째 그래프와 동일합니다.

8. 세 번째 그래프: Married

axes[2].bar(married['Gender'], married['Count'], color=['#1f77b4', '#aec7e8'])  
axes[2].set_title("Marital Status = Married")  
axes[2].set_xlabel("Gender")  
  • axes[2]: 세 번째 서브플롯입니다.
  • 데이터: 결혼 상태가 ‘Married’인 그룹의 성별과 인원 수를 시각화합니다.

9. 공통 설정

for ax in axes:  
    ax.set_xticks(np.arange(len(df['Gender'].unique())))  
    ax.set_xticklabels(['Male', 'Female'], fontsize=10)  
    ax.spines['top'].set_visible(False)  
    ax.spines['right'].set_visible(False)  
  • for ax in axes: 각 서브플롯에 공통된 설정을 적용합니다.
  • X축 눈금 설정:
    • np.arange(len(df['Gender'].unique())): 성별이 2개(‘Male’, ‘Female’)이므로 눈금을 2개로 설정합니다.
    • set_xticklabels(): X축 레이블을 ‘Male’과 ‘Female’로 표시합니다.
  • 테두리 제거:
    • spines['top'].set_visible(False): 상단 테두리를 제거합니다.
    • spines['right'].set_visible(False): 오른쪽 테두리를 제거합니다.

10. 레이아웃 및 그래프 출력

plt.tight_layout()  
plt.show()  
  • tight_layout(): 서브플롯 간의 간격을 자동으로 조정해 그래프가 겹치지 않도록 합니다.
  • plt.show(): 그래프를 화면에 출력합니다.

유사한 게시물