Python可視化でカテゴリ型データを可視化する:グループ別棒グラフとカテゴリ型データの例

データ分析で最も基本的でありながら強力なツールの一つがカテゴリ型データの可視化です。性別、婚姻状況、年齢層などのグループ別にデータを可視化すると、下の図のように直感的に分布や違いを理解することができます。

범주형 데이터 예시 그래프 시각화
( カテゴリー型データ例グラフの可視化 )

今回の記事では パイソンのmatplotlibを活用してカテゴリ型データをグループ化して棒グラフで可視化する方法を学びます。さらに、カテゴリ型データの例を通じて、実生活でどのようなデータを扱うことができるかを一緒に学びます。

カテゴリ型データとは?

カテゴリ型データ(Categorical Data)は 特定のグループやカテゴリに分類されるデータを意味するします。
代表的な例は以下の通りです:

  1. 性別男性、女性
  2. 年齢層10代, 20代, 30代, 40代以上
  3. 婚姻状況未婚, 既婚, 離婚, 無回答
  4. 地域ソウル、釜山、大邱など
  5. 教育レベル高卒, 大卒, 大卒, 修士, 博士

このようなデータを分析すると、グループ間の 差、分布、比率を直感的に理解することができます。

カテゴリ型データ例

今回の例では 婚姻状況性別 データを使って各グループの分布を可視化します。次のようなカテゴリ型のデータが与えられたとします。

性別婚姻状況人数
男性無回答700
女性無回答1000
男性離婚200
女性離婚250
男性結婚3200
女性結婚2400
  • 性別男性(Male)と女性(Female)に分けられます。
  • 婚姻状況無回答(No Response), 離婚(Divorce), 結婚(Married)

このデータを グループ別棒グラフで描いて視覚化してみましょう。

Pythonのコード例

以下は上記のデータを基にカテゴリ型データを可視化するコードです。

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

# データ生成
data = {'Gender':['男性', '女性', '男性', '女性', '男性', '女性']、
        'Marital_Status':['無回答', '無回答', '離婚', '離婚', '既婚', '既婚']、
        'Count':[700, 1000, 200, 250, 3200, 2400]}。

# データフレーム生成
df = pd.DataFrame(data)

# 結婚の有無によるデータ分割
no_response = df[df['Marital_Status'] == '無反応']
divorce = df[df['Marital_Status'] == 'Divorce']]。
married = df[df[df['Marital_Status'] == '結婚している']]

# グラフを描く
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")

# 2番目のグラフ: 婚姻状況 = 離婚
axes[1].bar(divorce['Gender'], divorce['Count'], color=['#1f77b4', '#aec7e8'])
axes[1].set_title("Marital Status = Divorce")
axes[1].set_xlabel("Gender")

# 3番目のグラフ: 結婚状態 = 結婚している
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.range(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. データ生成
    • 性別、婚姻状況、人数データをディクショナリー形式で設定し パンダ DataFrameで作成します。
  2. データのグループ化
    • レスポンスなし, 離婚, 既婚者 婚姻状況別にデータをフィルタリングします。
  3. グラフ作成
    • 3つのサブプロットを作成し、各サブプロットに bar()を使って棒グラフを描きます。
    • X軸には性別を、Y軸には人数を表示します。
  4. レイアウト設定
    • tight_layout()でサブプロット間の間隔を調整し、きれいに整理します。

カテゴリ型データ活用のヒント

カテゴリ型データは ビジネス、統計分析、アンケート調査など様々な分野で活用されます。各分野でカテゴリー型データを活用し、どのように有意義なインサイトを得ることができるのか、以下の例で詳しく説明します。

1.ビジネス洞察を引き出す

製品購入データ顧客行動データを分析すると、顧客グループ別の特性を把握し、ビジネス戦略を策定するのに役立ちます。

活用事例

  • 性別・年齢層別購入率分析
    • 例えば、特定の製品の購入比率を性別(男性、女性)と年齢層(20代、30代、40代など)に分けて視覚化します。
    • その結果、どのグループから最も多くの購入が発生するかを確認することで、ターゲットを絞ったマーケティング戦略を立てることができます。
  • 地域別売上分析
    • 特定の商品やサービスの売上データを地域別に分けて視覚化すると 地域特性に合わせた販売戦略を立てることができます。
    • 例:ソウル地域で特定の製品の売上が高い場合、その地域に集中的な広告を行います。

2.社会統計分析

人口統計データを分析することで、社会的特性や変化を把握するのに大きな助けになります。 特に、婚姻状況、教育レベル、地域別分布などは、政策立案や研究に役立つデータです。

活用事例

  • 婚姻状況分析
    • 結婚、離婚、未婚の割合を年齢層や地域別に可視化することで、特定のグループの社会的変化を理解することができます。
    • 例:特定の地域で離婚率が高い場合は、その地域に対する福祉政策が必要かもしれません。
  • 教育レベル別所得分布分析
    • 教育レベル(高卒、大卒、大卒、修士など)に応じた所得レベルを視覚化すると 教育が収入に与える影響を分析することができます。

3.アンケート結果分析

アンケートデータを視覚化することで、特定のグループの好みや意見を明確に把握することができます。

活用事例

  • 製品満足度調査
    • 製品満足度を性別、年齢層別に分析し、特定のグループの意見を収集します。
    • 例:30代男性グループで製品満足度が低い場合、そのグループのフィードバックをもとに製品の改善が必要です。
  • 消費者の嗜好分析
    • 特定の製品やサービスに対する好みをカテゴリー別(地域、性別など)に分析します。
    • 例:A地域の顧客がB地域よりも特定のサービスに高い満足度を示した場合、その地域にマーケティングを集中します。

仕上げ

今回の記事では カテゴリ型データを可視化する方法を学びました。 matplotlibを活用すれば、様々なカテゴリ型データを棒グラフで簡単に視覚化することができます。実際のデータを活用して分析し、様々なグループ化条件を試してみてください。可視化は、データを解釈し、インサイトを得るための強力なツールになります!

Pythonで視覚化することに興味がある方、 Pythonの視覚化で学ぶドーナツチャートの描画とネスト方法 記事をご覧いただき、関連知識を深めてみてください!

# コード詳細解説

1.ライブラリの読み込み

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np  
  • matplotlib.pyplot: グラフと可視化のためのライブラリです。
  • パンダ:データフレームを生成してデータを扱うことができるライブラリです。
  • numpy: 数値演算や配列データを扱うライブラリです。

2.データ生成

data = {'性別':['男性', '女性', '男性', '女性', '男性', '女性', '男性', '女性']、
        'Marital_Status':['無回答', '無回答', '離婚', '離婚', '既婚', '既婚']、
        'Count':[700, 1000, 200, 250, 3200, 2400]}。  
  • データ ディクショナリー: 可視化するデータを辞書形式で作成します。
    • 性別性別を表し、'Male'(男性)と'Female'(女性)の2つのグループです。
    • 婚姻状況(No Response, Divorce, Married)結婚状態をカテゴリ型データに設定します。
    • カウント各グループの人数を示します。

3.データフレーム生成

df = pd.DataFrame(data)  
  • pd.DataFrame()上記で作成した データ 辞書を データフレーム 形に変換します。
  • その結果、表形式のデータが生成されます。

出力例:

性別婚姻状況カウント
男性レスポンスなし700
女性レスポンスなし1000
男性離婚200
女性離婚250
男性既婚者3200
女性既婚者2400

4.婚姻状況別のデータ分割

no_response = df[df[df['Marital_Status'] == '無反応']
divorce = df[df['Marital_Status'] == '離婚している']]
married = df[df['Marital_Status'] == '既婚']].  
  • 条件フィルタリング: DataFrameの 婚姻状況 カラムを基準にデータを分割します。
    • df[df['Marital_Status'] == '無反応']。: 結婚状態が「No Response」の行のみを抽出します。
    • df[df['Marital_Status'] == '離婚']。:結婚状態が'Divorce'の行のみを抽出します。
    • df[df['Marital_Status'] == '既婚']。:結婚状態が'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軸の値で各性別の人数数を設定します。
    • :バーの色を設定します。
      • '#1f77b4'カラー:ダークブルー(男性)
      • '#aec7e8'カラー:ライトブルー(女性)
  • set_title(): サブプロットのタイトルを設定します。
  • set_xlabel(): X 軸のラベルを設定します。
  • set_ylabel(): Y軸のラベルを設定します。

7.2番目のグラフ:Divorce

axes[1].bar(divorce['Gender'], divorce['Count'], color=['#1f77b4', '#aec7e8'])
axes[1].set_title("Marital Status = Divorce")
axes[1].set_xlabel("Gender")  
  • 軸[1]: 2番目のサブプロットです。
  • データ結婚状態が「Divorce」であるグループの性別と人数を視覚化します。
  • X軸/Y軸設定: 最初のグラフと同じです。

8.3番目のグラフ: Married

axes[2].bar(married['Gender'], married['Count'], color=['#1f77b4', '#aec7e8'])
axes[2].set_title("Marital Status = Married")
axes[2].set_xlabel("Gender")  
  • 軸[2]: 3つ目のサブプロットです。
  • データ:結婚ステータスが「Married」であるグループの性別と人数を視覚化します。

9.共通設定

for ax in ax:
    ax.set_xticks(np.array(len(df['Gender'].unique())))
    ax.set_xticklabels(['Male', 'Female'], fontsize=10)
    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)  
  • 斧の斧の場合各サブプロットに共通の設定を適用します。
  • 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(): グラフを画面に出力します。

類似の投稿