2023年12月23日実施

第 ４ 章の内容
1. 回帰分析による予想
2. 決定木による予想
3. クラスター分析– その1 –
– その2 –

161

1.回帰分析による予想
回帰分析とは• 因果関係が疑われる複数の変数を使って，ある変数から他の変数の値を予測する手法• 原因となる変数のことを説明変数，結果となる変数のことを応答変数という• 説明変数と応答変数はそれぞれ独立変数と従属変数という• 説明変数が数量データであるモデルを用いた分析手法（説明変数が複数あるものを重回帰分析と呼ぶ）
162

81

2023年12月23日実施

1.回帰分析による予想
回帰分析
import seaborn as sns
x = [1, 2, 3, 4, 5, 6, 7]
y = [1, 3, 2, 5, 4, 7, 6]
sns.regplot(x=x, y=y) 散布図

163

1.回帰分析による予想
回帰分析!pip install pingouin

Pingouin（ピングイン）というパッケージをインストール

import pingouin as pg
pg.corr(x, y)
R:相関係数p値

95%信頼区間

pg.linear_regression(x, y)

傾き

p値

R2（相関係数の二乗）95%信頼区間

16482

2023年12月23日実施

1.回帰分析による予想
回帰分析と結果の可視化
既知のデータsales_data.csv

予測対象データ
sales_future.csv
一般社団法人 日本アイスクリーム協会（https://www.icecream.or.jp/about/）と国土交通省気象庁（https://www.data.jma.go.jp/obd/stats/etrn/vi
ew/monthly_s3.php?prec_no=44&block_no=47
662）のデータを合わせて作成した

sales_data.csvに基づいて回帰分析を行い，sales_future.csvに対して売上予測
165

1.回帰分析による予想
回帰分析と結果の可視化
from google.colab import files ファイルの読み込み等
uploaded = files.upload()
import pandas as pd
df = pd.read_csv('sample_sales_data.csv')
df_test = pd.read_csv('sample_sales_future.csv')

166

83

2023年12月23日実施

1.回帰分析による予想
回帰分析と結果の可視化
x_name = "temperature"y_name = "sales"
x = df[x_name]y = df[y_name]xとyに分離import statsmodels.api as sm 回帰分析の実行
model = sm.OLS(y, sm.add_constant(x))
result = model.fit(disp=0)
print(result.summary())
求めたいもの（目的変数）が「y」で，その計算に使うもの（説明変数）が「x」「add_constant」は切片を使う場合に指定
つまり，y=ax + b のbの項を使う場合に付ける
167

1.回帰分析による予想
回帰分析と結果の可視化
xとyに分離coefとconstが交わった所が切片「155.0243」

R-squaredがR2値回帰分析の実行 「0.832」
coefとtemperatureが交わった所が傾き「41.4521」
アイスクリームの売上をy,気温をx,
y = 41.45x + 155.02という関係があるっぽい
168

84

2023年12月23日実施

1.回帰分析による予想
回帰分析と結果の可視化（未知のデータの推測）
y_result=[]
for i in range(len(df_test.index)): Xの傾きが格納
y_tmp = result.params.const + result.params[x_name] *df_test[x_name][i]y_result.append(y_tmp)
切片が格納
print(y_result)169

1.回帰分析による予想
回帰分析と結果の可視化（未知のデータの推測）
df_test_y = pd.DataFrame(y_result,columns=["y"])df_result = pd.concat([df_test,df_test_y],axis=1)
df_result.to_csv("result.csv")
df_result

読み込んだファイル（sales_future.csv）に計算結果（y列）を追記し，csvファイルとして出力することも可能
170852023年12月23日実施

1.回帰分析による予想
回帰分析と結果の可視化（プロット）

import matplotlib.pyplot as plt
plt.plot(x, y, 'o')plt.plot(x, result.params.const+result.params[x_name]*x)
plt.show()
そこそこ良い感じの分析精度

171

2.決定木による予想決定木とは（Decision Tree Analysis:DCA）• データから分類・判別のために作られる決定木と呼ばれる樹形図を作成し，予測や検証をする分析（機械学習の1つ）• 購買情報やアンケート結果等のさまざまなデータに対して実施することが可能• 目的変数の予測や目的変数に影響している因子の検証等に

活用

172

86

2023年12月23日実施

2.決定木による予想
決定木分析と回帰分析の違い• どちらも目的変数を予想するモデル、ただプロセスが違う• 計算式などを使わずにシンプルな分岐のみで予想（Yes or No）

気温 < 15℃
Yes

No

気温 < 10℃

焼き芋を購入したNo

Yes

焼き芋を購入しなかった

焼き芋を購入した焼き芋を購入しなかった

173

2.決定木による予想
流れ 事前準備 決定木の前処理• 説明変数（x）と目的変数（y）に分割• ダミー変数処理（文字列→数値）• 学習用-テスト用に分割

 決定木モデルの作成と予想• パラメータ:max_depth（最大深度）

 決定木の可視化（plot_tree）• ツリーの見方• パラメータ:説明変数の名前（feature_names）• パラメータ:目的変数の名前（class_names）• パラメータ:色（filled）

174

87

2023年12月23日実施

2.決定木による予想
事前準備（タイタニック号データ）
import seaborn as sns
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn import tree
df = sns.load_dataset('titanic')
df.head()175

2.決定木による予想
事前準備（タイタニック号データ）
survivedpclass
sex
age

生存フラグ

sibsp
parch
fare

兄弟・配偶者の数

チケットクラス
性別
年齢
親・子の数
料金

embarked
class
who
adult_male

出航地

deck
embark_town
alivealone

乗船していたデッキ

チケットクラス
性別
成人男性かどうか
出航地名
生存一人だったか

176

88

2023年12月23日実施

2.決定木による予想
決定木の前処理:説明変数（x）と目的変数（y）に分割
df_x = df[['sex','pclass','fare']]df_y = df['survived']
事前に定義したタイタニック号のデータの変数（df）から，説明変数（df_x）と目的変数（df_y）に分ける
決定木の可視化を見やすくするために，性別・チケットクラス・運賃に限定

177

2.決定木による予想
決定木の前処理:ダミー変数処理（文字列→数値）
df_x = pd.get_dummies(df_x, drop_first=True)
drop_first カラム数を減らすパラメータ
性別のカラムに「male / female」の文字列が格納されているので，数値列に変換
get_dummies

178

89

2023年12月23日実施

2.決定木による予想
決定木の前処理:学習用-テスト用に分割

from sklearn.model_selection import train_test_split
train_x, test_x, train_y, test_y =train_test_split(df_x,df_y,random_state=1)
学習用とテスト用にデータを分割
train_test_split
説明変数（df_x）

目的変数（df_y）

sex_malepclassfare

survived

137.2500

0

︙

︙

︙

︙

︙

︙

︙

︙

0

155.0080

学習データ（train）
テストデータ（test）

179

2.決定木による予想
決定木の前処理:学習用-テスト用に分割

from sklearn.model_selection import train_test_split
train_x, test_x, train_y, test_y =train_test_split(df_x,df_y,random_state=1)
学習用とテスト用にデータを分割
train_test_split
説明変数（df_x）

sex_male

目的変数（df_y）pclasstrain_xfare37.2500

0

︙

︙

︙

︙

︙

︙

︙

︙

0

155.00801

test_xsurvived
train_ytest_y

学習データ（train）
テストデータ（test）

18090

2023年12月23日実施

2.決定木による予想
決定木モデルの作成と予測
from sklearn import treemodel = tree.DecisionTreeClassifier(max_depth=2, random_state=1)
決定木のモデルを作成
scikit-learnというpython用機械学習ライブラリの中から決定木モデルのtreeを拝借
sklearn.tree.DecisionTreeClassifierというクラスに決定木が実装されている
max_depth:分類技の最大深さ
random_state:学習時の乱数シード，常に同じ結果を得たい場合は適当な整数を指定

181

2.決定木による予想
決定木モデルの作成と予測
model.fit(train_x, train_y)

fitメソッドで学習を行う

fit(x, y):特徴量 x, クラス y を教師データとして学習する

182

91

2023年12月23日実施

2.決定木による予想
決定木モデルの作成と予測
model.predict(test_x)

モデルに対してpredictfitで予想を実施

predict (x):特徴量 x に対するクラスの予想結果を返す

183

2.決定木による予想
決定木モデルの作成と予測
model.score(test_x,test_y)scoreメソッドでスコア（正解率）を算出

score (x, y):決定係数を出力，予想値 xと正解値 yの相関を測る

184

92

2023年12月23日実施

2.決定木による予想
決定木の可視化（plot_tree）
from sklearn.tree import plot_tree
plot_tree(model, feature_names=train_x.columns, class_names=True,
filled=True)
性別（男性=1）が0.5より小さい

Yes=女性No=男性

185

2.決定木による予想
決定木の可視化（plot_tree）
from sklearn.tree import plot_tree class_name:目的変数の名前
plot_tree(model, feature_names=train_x.columns, class_names=True,
filled=True)
filled:色gini（ジニ係数）:不純度
各葉（ノード）にどれくらい間違いが含まれているのか
不純度が低い（正しい）と値は「0」
不純度が高い（間違い）と「1」に近づく
色合い:濃いほど目的変数に近い（ジニ係数も低い）
sample:ノードの個数
value:その条件に当てはまる数
186932023年12月23日実施

3.クラスター分析
クラスター分析とは（クラスタリング）• 個々のデータから似ているデータ同士をグルーピングする

分析手法• クラスタ（群）ごとに分けることで，データの中身を理解しやすくしたり，群ごとに施策を行うことができる

187

3.クラスター分析流れ 事前準備 k-meansの前処理• データを限定する• 欠損値を処理する• ダミー変数処理（文字列→数値）• データを標準化する

 k-meansのクラスタリングを実行
 クラスタリングの結果を確認• 主成分分析でグラフ化

188

94

2023年12月23日実施

3.クラスター分析事前準備（タイタニック号データ）
import seaborn as sns
import pandas as pd
df = sns.load_dataset('titanic')
df.head()189

3.クラスター分析
事前準備（タイタニック号データ）
survivedpclass
sex
age
sibsp
parch
fare

生存フラグ
チケットクラス
性別
年齢
兄弟・配偶者の数
親・子の数
料金

embarked 出航地
チケットクラス
class
性別
who
adult_male 成人男性かどうか
deck
embark_to
wn
alive
alone

乗船していたデッキ
出航地名
生存一人だったか

190

95

2023年12月23日実施

3.クラスター分析
k-meansの前処理:データを限定する
columns = ['survived','pclass','sex','age','fare']df = df[columns]
生存・チケットクラス・性別・年齢・運賃に絞り込む

191

3.クラスター分析
k-meansの前処理:欠損値を処理する
df.isnull().sum()

isnull と sum の組み合わせ

年齢に177件の欠損を確認，これを今回は平均で補う

mean = df['age'].mean()df['age'] = df['age'].fillna(mean) fillna を使う
192

962023年12月23日実施

3.クラスター分析
k-meansの前処理:ダミー変数処理（文字列→数値）
df = pd.get_dummies(df, drop_first=True)
isnull と sum の組み合わせ
df.head()
データに文字列が含まれているのでダミー変数処理を行う

193

3.クラスター分析
k-meansの前処理:データの標準化
from sklearn.preprocessing import StandardScaler StandardScalerを使用
sc = StandardScaler()df_sc = sc.fit_transform(df)df_sc = pd.DataFrame(df_sc, columns=df.columns)
df_sc.head()
年齢は22・26…，チケットクラスは1・3…，スケールの違いを合わせる:標準化

19497

2023年12月23日実施

3.クラスター分析
k-meansのクラスタリングを実行
from sklearn.cluster import KMeansmodel = KMeans(n_clusters=4, random_state=1)
model.fit(df_sc)
n_clustersは分割するクラスタ数
sklearnからKMeansをインポートし，モデルを作成
cluster = model.labels_cluster

labels_ でクラスタ番号を取得

195

3.クラスター分析
k-meansのクラスタリングを実行
df['cluster'] = cluster
dfDataFrame の新しいカラムにクラスタ番号を追加

196

98

2023年12月23日実施

3.クラスター分析
クラスタリングの結果を確認# style.bar で DataFrame にカラーバーを追加
df.groupby('cluster').mean().style.bar(axis=0)
読み込ませたデータの平均値をクラスタごとに確認

197

3.クラスター分析
クラスタリングの結果を確認
import matplotlib.pyplot as plt
fig, axes = plt.subplots(2,3, figsize=(14, 6))
sns.barplot(ax=axes[0,0], data=df, x='cluster', y='survived')
sns.barplot(ax=axes[0,1], data=df, x='cluster', y='pclass')
sns.barplot(ax=axes[0,2], data=df, x='cluster', y='age')sns.barplot(ax=axes[1,0], data=df, x='cluster', y='fare')sns.barplot(ax=axes[1,1], data=df, x='cluster', y='sex_male')

198

99

2023年12月23日実施

3.クラスター分析
クラスタリングの結果を確認
クラスタ0:男性で高齢，良い客室に泊まっており，生存率が低い
クラスタ1:女性で良い客室に泊まり運賃が最も高く，生存率も一番高い
クラスタ2:女性で安い客室に泊まっている
クラスタ3:男性で若年，安い客室に泊まっており，一番生存率が低い

199

3.クラスター分析
クラスタリングの結果を確認:主成分分析でグラフ化
df_sc['cluster'] = cluster

PCAをインポートし学習させる
from sklearn.decomposition import PCA
pca = PCA(n_components=2, random_state=1)
pca.fit(df_sc)feature = pca.transform(df_sc)feature200100

2023年12月23日実施

3.クラスター分析
クラスタリングの結果を確認:主成分分析でグラフ化
import matplotlib.pyplot as plt 散布図で可視化
plt.figure(figsize=(6, 6))
plt.scatter(feature[:, 0], feature[:, 1], alpha=0.8,c=cluster)
plt.xlabel('principal component 1')
plt.ylabel('principal component 2')
plt.show()

201

3.クラスター分析（その2）
階層的クラスタリング（Hierarchical Clustering）• 最も類似する（または最も類似しない）サンプルデータの組み合わせを見つけ出し，順番にグループ分けしていく
手法• 樹形図（デンドログラム）をプロットできる• 二分木で階層的クラスタリングを可視化したもの

202

101

2023年12月23日実施

3.クラスター分析（その2）
計算の流れ• 各サンプルを単一のクラスターとみなし，全てのクラスター間のユークリッド距離を計算• クラスター間の距離に基づき，クラスターを連結• クラスター情報を更新し，ユークリッド距離を再計算• クラスターが最終的に１つになるまで繰り返す

203

3.クラスター分析（その2）流れ• 事前準備• 最適なクラスターの数を見つけるための樹形図の作成• クラスター数の決定・モデル学習• クラスター可視化

204102

2023年12月23日実施

3.クラスター分析（その2）
事前準備（SSDSE:教育用標準データセット）
from google.colab import files
uploaded = files.upload()
import pandas as pd
df = pd.read_csv('sample_7.csv')
df.head()

サンプルデータをインポート

統計センターのSSDSE（教育用標準データセット）を利用
https://www.nstac.go.jp/use/literacy/ssdse/

205

3.クラスター分析（その2）
事前準備（SSDSE:教育用標準データセット）
from google.colab import files
uploaded = files.upload()
import pandas as pd
df = pd.read_csv('sample_7.csv')
df.head()

サンプルデータをインポート

統計センターのSSDSE（教育用標準データセット）を利用
https://www.nstac.go.jp/use/literacy/ssdse/

206

103

2023年12月23日実施

3.クラスター分析（その2）
事前準備（SSDSE:教育用標準データセット）
import numpy as np
基本統計量を確認
df.describe()

207

3.クラスター分析（その2）
事前準備（SSDSE:教育用標準データセット）
import scipy.cluster.hierarchy as sch# import matplotlib.pyplot as plt
クラスタリング軸設定 (人口vs残業時間の平均)
X = df.iloc[:, [1, 3]].values
dendrogram = sch.dendrogram(sch.linkage(X, method = 'ward'))
樹形図作成用インスタンス

scipy.cluster.hierarchyクラスからインスタンスを生成することで、樹形図を作成
インスタンス内のlinkage()メソッドはデータ間の距離を計算しつながりを作る。
連結方法としてウォード連結法で距離を計算。

208

104

2023年12月23日実施

3.クラスター分析（その2）最適なクラスターの数を見つけるための樹形図の作成
plt.xlabel('population vs over work hours')
plt.ylabel('Euclidean distances')
ラベルを貼りながら出力
plt.show()
この結果から２つのクラスターで分割するのが良いかもしれない。

209

3.クラスター分析（その2）
モデル学習from sklearn.cluster import AgglomerativeClustering モデルの訓練
hir_clus = AgglomerativeClustering(n_clusters = 3, affinity = 'euclidean',linkage = 'ward')
y_hir_clus = hir_clus.fit_predict(X)

第一引数:クラスター数（n_clusters）デフォルト値は2
第二引数:距離のパラメータ（affinity）
第三引数:クラスター連結法（linkage）

210

105

2023年12月23日実施

3.クラスター分析（その2）モデル学習によって予想されたクラスターの結果
print(y_hir_clus)

211

3.クラスター分析（その2）クラスターの可視化
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cmcluster_labels = np.unique(y_hir_clus)
n_clusters = cluster_labels.shape[0]クラスターの配列情報
一意なクラスター要素
配列の⾧さ

for i in range(len(cluster_labels)):
可視化
color = cm.jet(float(i) / n_clusters)
plt.scatter(X[y_hir_clus == i, 0], X[y_hir_clus == i, 1], s = 50, c = color, label ='Cluster'+str(i))
plt.title('Clusters of population')
plt.xlabel('population')plt.ylabel('over work hours')
plt.legend(loc="best")
plt.show()

グラフに関する情報

212

106

2023年12月23日実施

3.クラスター分析（その2）クラスターの可視化（以下再掲）
plt.title('Clusters of population')
plt.xlabel('population')plt.ylabel('over work hours')
plt.legend(loc="best")
plt.show()

グラフに関する情報

213

参考文献（継続して学習したい方向け）
 谷合廣紀（2018）『Pythonで理解する統計解析の基礎』技術評論社

 塚本邦尊 (著), 山田典一 (著), 大澤文孝 (著), 中山浩太郎（監修） (その他), 松尾豊（監修）（2019）『東京大学のデータサイエンティスト育成講座 Pythonで手を動かして学ぶデータ解析』マイナビ出版

 馬場真哉 (著)（2022）『Pythonで学ぶあたらしい統計学の教科書 第2版』翔泳社

214107

2023年12月23日実施

データサイエンス・オンライン講座のご紹介「誰でも使える統計オープンデータ」受講者募集中!
講座の目的:e-Stat、jSTAT MAP、API機能等を使い、統計オープンデータを活用したデータ分析の基本的な知識を習得する
開 講 期 間:令和６年１月16日（火）～３月19日（火）学 習 時 間:１回10分程度×５～７回程度（１週間）×４週
課
題:各週の確認テストと最終課題の実施
講師:西内啓氏（統計家）ほか

申込はこちらから!

215

108