Python カテゴリ変数を作成し、散布図を作成する

 本記事では下図の凡例(legend)のRMのようにカテゴリ変数を指定数に分割して作成する。またそれを散布図にする雛形コードを載せました。

f:id:HK29:20220111235133p:plain

下図中にある列名「RM」のデータから、列名「label」というカテゴリ変数を作成します。それを上図のようにカテゴリ別に色を変えてプロットします。
f:id:HK29:20220111235104p:plain

■本プログラム

#!/usr/bin/env python
# coding: utf-8

# In[1]:


import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
plt.rcParams['font.size'] = 18 # グラフの基本フォントサイズの設定

# csvファイルをpandasデータフレームで読み込む
df = pd.read_csv('boston_XYdata.csv')
df


# In[2]:


# カテゴリ変数にする列データをリストで取得する
legend_name = 'RM'
legend_list = df[legend_name].tolist()
print(legend_list)


# In[3]:


# データの最小と最大を抽出する
data_min = min(legend_list)
data_max = max(legend_list)
print(data_min, data_max)


# In[4]:


# カテゴリ変数作成に当たって、区分する数を指定する。ここでは3
# 区間の間隔を算出する
n_split = 3
data_delta = (data_max - data_min) / n_split
data_delta


# In[5]:


# 指定した区間の値を算出
x1_list = list(np.arange(data_min, data_max + 0.1, data_delta))
print(len(x1_list))
x1_list


# In[6]:


# 各区間の最小と最大をリスト化する
# まず、リスト内要素をひとつずらした新規リストを2つ作成する
n = 1
x2_list = x1_list[n:] + x1_list[:n] # 要素のインデックスをひとつずらす
print(x2_list) # リストの先頭にあった要素が一番最後に移る
x1_list.pop() # リストの末尾の要素を削除
x2_list.pop()
print(x1_list, x2_list) # ひとつずれたリストが二つできる


# In[7]:


# 上記二つのリストを用いて、2つずつをひとつずらしずつ取り出す
range_list = []
for x1, x2 in zip(x1_list, x2_list):
    range_list.append([x1, x2])
print(len(range_list))
range_list


# In[8]:


# カテゴリ変数を列名「label」として作成する
df_list = []
for _ in range_list:
    my_min, my_max = _
    df_buf = df[(df[legend_name] >= my_min) & (df[legend_name] < my_max)]
    df_buf['label'] = '{0:.1f}'.format(my_min) + '<=' + legend_name + '<' + '{0:.1f}'.format(my_max)
    df_list.append(df_buf)
#df_list


# In[9]:


# 作成したカテゴリ変数「label」を元のデータフレームに追記する
DF = pd.concat(df_list)
DF


# In[10]:


# カテゴリ変数を凡例に、散布図を作成する。
x_name = 'LSTAT'
y_name = 'PRICE'
label = 'label'
title = 'boston_data'

fig = plt.figure(dpi=80, figsize=(6,4))

# ひとつの散布図にカテゴリ別にプロットする
handle_list = []
for i, legend in enumerate(DF[label].unique()):
    print(i, legend)
    plt.scatter(DF.loc[DF[label] == legend, x_name],
                DF.loc[DF[label] == legend, y_name],
                facecolor = 'None',
                #facecolor = cm.cool(i / len(DF[label].unique())), #'None'
                edgecolors = cm.cool(i / len(DF[label].unique())),
                label = legend)
plt.legend(bbox_to_anchor = (1, 1), title = legend_name)
plt.xlabel(x_name)
plt.ylabel(y_name)
plt.title(title)
'''
x_min = 0
x_max = 20
y_spec = 150
'''
# x軸の範囲(レンジ)を指定
#plt.xlim(x_min, x_max)
# 横線を入れる
#plt.hlines(y_spec, x_min, x_max, 'r', linestyles='dashed')
# テキストを挿入する
#plt.text(x_min, y_spec + 10, r'Spec 150[MPa]', size=18, color='r')
plt.grid()
plt.tick_params()
#plt.tight_layout()
plt.show()
#plt.savefig('picture.jpg')
#plt.close()


# In[ ]:

以上

<広告>