파이썬 시각화로 범주형 데이터 시각화하기: 그룹별 막대 그래프와 범주형 데이터 예시
데이터 분석에서 가장 기본적이지만 강력한 도구 중 하나가 범주형 데이터 시각화입니다. 성별, 결혼 상태, 연령대 등 그룹별 데이터를 시각화하면 아래 그림과 같이 직관적으로 분포와 차이를 이해할 수 있습니다.
이번 포스트에서는 파이썬의 matplotlib를 활용해 범주형 데이터를 그룹화하고 막대 그래프로 시각화하는 방법을 배웁니다. 추가로 범주형 데이터 예시를 통해 실생활에서 어떤 데이터를 다룰 수 있는지 함께 알아보겠습니다.
범주형 데이터란?
범주형 데이터(Categorical Data)는 특정 그룹이나 카테고리로 구분되는 데이터를 의미합니다.
대표적인 예시는 다음과 같습니다:
- 성별: 남성, 여성
- 연령대: 10대, 20대, 30대, 40대 이상
- 결혼 상태: 미혼, 기혼, 이혼, 무응답
- 지역: 서울, 부산, 대구 등
- 교육 수준: 고졸, 대졸, 석사, 박사
이런 데이터를 분석하면 그룹 간의 차이, 분포, 비율을 직관적으로 이해할 수 있습니다.
범주형 데이터 예시
이번 예시에서는 결혼 상태와 성별 데이터를 사용해 각 그룹의 분포를 시각화합니다. 다음과 같은 범주형 데이터가 주어졌다고 가정해 봅시다.
성별 | 결혼 상태 | 인원 수 |
---|---|---|
남성 | 무응답 | 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()
코드 간략 해설
- 데이터 생성
- 성별, 결혼 상태, 인원 수 데이터를 딕셔너리 형태로 설정하고
pandas
DataFrame으로 만듭니다.
- 성별, 결혼 상태, 인원 수 데이터를 딕셔너리 형태로 설정하고
- 데이터 그룹화
No Response
,Divorce
,Married
결혼 상태별 데이터를 필터링합니다.
- 그래프 생성
- 3개의 서브플롯을 만들고 각 서브플롯에
bar()
를 이용해 막대 그래프를 그립니다. - X축에는 성별을, Y축에는 인원 수를 표시합니다.
- 3개의 서브플롯을 만들고 각 서브플롯에
- 레이아웃 설정
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 형태로 변환합니다.- 결과적으로 테이블 형태의 데이터가 생성됩니다.
출력 예시:
Gender Marital_Status Count Male No Response 700 Female No Response 1000 Male Divorce 200 Female Divorce 250 Male Married 3200 Female Married 2400 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()
: 그래프를 화면에 출력합니다.