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

今回の記事では パイソンのmatplotlibを活用してカテゴリ型データをグループ化して棒グラフで可視化する方法を学びます。さらに、カテゴリ型データの例を通じて、実生活でどのようなデータを扱うことができるかを一緒に学びます。
カテゴリ型データとは?
カテゴリ型データ(Categorical Data)は 特定のグループやカテゴリに分類されるデータを意味するします。
代表的な例は以下の通りです:
- 性別男性、女性
- 年齢層10代, 20代, 30代, 40代以上
- 婚姻状況未婚, 既婚, 離婚, 無回答
- 地域ソウル、釜山、大邱など
- 教育レベル高卒, 大卒, 大卒, 修士, 博士
このようなデータを分析すると、グループ間の 差、分布、比率を直感的に理解することができます。
カテゴリ型データ例
今回の例では 婚姻状況と 性別 データを使って各グループの分布を可視化します。次のようなカテゴリ型のデータが与えられたとします。
| 性別 | 婚姻状況 | 人数 |
|---|---|---|
| 男性 | 無回答 | 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()

コードの簡単な解説
- データ生成
- 性別、婚姻状況、人数データをディクショナリー形式で設定し
パンダDataFrameで作成します。
- 性別、婚姻状況、人数データをディクショナリー形式で設定し
- データのグループ化
レスポンスなし,離婚,既婚者婚姻状況別にデータをフィルタリングします。
- グラフ作成
- 3つのサブプロットを作成し、各サブプロットに
bar()を使って棒グラフを描きます。 - X軸には性別を、Y軸には人数を表示します。
- 3つのサブプロットを作成し、各サブプロットに
- レイアウト設定
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(): グラフを画面に出力します。






