08. Pythonによる探索的データ分析

8.1 配列とデータフレームの操作

8.1.1 NumPy

本ウェブページは『超入門 はじめてのAI・データサイエンス』第8章に記載されたコードを埋め込んでいます。第4章で使い方を学んだColab上で,Pythonによる探索的データ分析 を行います。

最初は NumPy ライブラリを用いた配列に関するコードです。下記 コード1 では,NumPy ライブラリを読み込み,二次元の ndarray を作成 します。

コード 1

import numpy as np
a = np.array([[1, 2, 3],[4, 5, 6]])
a

コード2 は,a という行列オブジェクトの形状を返します。

コード 2

a.shape

下記 コード3 は,すべての要素に 1 が入った,引数により指定する形状の行列を作ります。NumPyones についてもっと知りたい人は こちら を参照して下さい。

コード 3

b = np.ones((2, 3))
b

下記 コード4 では,累算代入演算子 を用いて,行列 b を定数倍したものを b に上書きしています。

コード 4

b *= 10
b

下記 コード5 は,b のデータの型を返します。

コード 5

b.dtype

下記 コード6 は,行列 b の型を変換するコードの例です。

コード 6

b = b.astype(int) 
b

下記 コード7 は,行列加算のコード例です。

コード 7

a + b

下記 コード8 は,配列の形状変換の例です。

コード 8

c = a.reshape(3, 2)
c

コード9 は,行列 c の各要素に 6 を足すコードです。

コード 9

c = c + 6
c

下記 コード10 は,行列の積を返すコードです。

コード 10

d = np.dot(a, c)
d

下記 コード11 は,行列の要素積を返すコードです。

コード 11

e = a * b 
e

下記 コード12 では,配列 e の平均を返します。

コード 12

e.mean()

下記 コード13 は,配列 eaxis=0,縦方向の平均を返します。

コード 13

e.mean(axis = 0)

下記 コード14 は,配列 eaxis=1,横方向の平均を返すコードです。

コード 14

e.mean(axis = 1)

8.1.2 Pandas

ライブラリ pandas は,通常 下記 コード15 のようにエイリアス pd を付けて読み込みます。第6章でも用いましたし,データ分析には欠かせないライブラリです。これからも事あるごとに使っていきます。

コード 15

import pandas as pd

8.2 Matplotlibによる可視化

8.2.1 Matplotlib の図の構造・種類・オプション

下記 コード16 では,Pythonの可視化ライブラリである Matplotlibpyplot モジュールを読み込みます。pyplotsubplot 関数で現在の FigureAxes を準備します。

コード 16

import matplotlib.pyplot as plt
plt.subplots()

Matplotlibで日本語を使えるようにする方法の中で,下記 コード17 は外部ライブラリを用いる方法です。3つあるコードのうち,1つ目がインストール,2つ目が読み込みのためのコードです。ここまでで日本語を使うことができなかったら,3つ目の 日本語フォントのための付加的なコード も実行してください。

コード 17a

!pip install japanize-matplotlib

コード 17b

import japanize_matplotlib

コード 17c

plt.rcParams["font.family"] = "Hiragino Maru Gothic Pro"
plt.rcParams["font.family"] = "IPAexGothic"

下記 コード18 は,書籍 p.112 図8.1 の散布図を表示するコードです。

コード 18

g = np.array([3, 4, 5, 5, 6, 7, 7, 8]) 
h = np.array([2, 4, 4, 6, 5, 5, 7, 9]) 
plt.scatter(g, h)
plt.title("図タイトル")
plt.xlabel("X軸ラベル")
plt.ylabel("Y軸ラベル")
plt.show()

8.2.2 データの探索

コード19 は,pyplot に続けて,ペンギンデータセットの入った可視化ライブラリ seaborn を読み込みます。

コード 19

import matplotlib.pyplot as plt 
import seaborn as sns

コード20 は,ペンギンデータセットを読み込んでデータを確認する例です。

コード 20

df = sns.load_dataset("penguins")
df.head()

コード21 は,データ情報を得る別の方法です。

コード 21

df.info()

コード22 では,ペンギンデータセットの2つの文字列データについて調べています。

コード 22

print(df["species"].unique())
print(df["island"].unique())

8.2.3 量的変数の関係の可視化: 散布図

ペンギンのヒレの長さと体重の散布図をつくるコードが下記 コード23 です。

コード 23

X = df["flipper_length_mm"].values 
Y = df["body_mass_g"].values 
plt.scatter(X, Y)

コード24 のようにして,ドットの色を変えたり,図タイトルや軸ラベルを加えたりしています。図8.2のような散布図ができましたか?

コード 24

plt.scatter(X, Y, color = "darkviolet")
plt.title("ペンギンデータセットのヒレとくちばしの散布図")
plt.xlabel("ヒレの長さ [mm]")   
plt.ylabel("体重 [g]")
alternative

Figure 8.2 散布図

8.2.4 グループの比較のための可視化: 箱ひげ図と棒グラフ

コード25 は,書籍 p.116 の図8.3をつくる箱ひげ図のコードです。

コード 25

fig, ax = plt.subplots(2, 2)
sns.boxplot(data = df, x = "species", y = "bill_length_mm",
ax = ax[0, 0]).set_title("種別・くちばしの長さ")
sns.boxplot(data = df, x = "species", y = "bill_depth_mm",
ax = ax[0, 1]).set_title("種別・くちばしの縦の長さ")
sns.boxplot(data = df, x = "species", y = "flipper_length_mm",  
ax = ax[1, 0]).set_title("種別・ヒレの長さ")
sns.boxplot(data = df, x = "species", y = "body_mass_g",
ax = ax[1, 1]).set_title("種別・体重")
plt.tight_layout()
alternative

Figure 8.3 箱ひげ図

コード26 は,島別・種別の棒グラフをつくるコードです。書籍 p.116 の図8.4をつくります。

コード 26

sns.catplot(df, x = "island", hue = "species", kind = "count")
alternative

Figure 8.4 島別・種別度数の棒グラフ

コード27 は,カーネル密度曲線でジェンツー種のペンギンの体重をオス・メスで比べるもので,書籍 p.117 の図8.5をつくります。

コード 27

df2 = df[df["species"] == "Gentoo"]
sns.kdeplot(df2, x = "body_mass_g", hue = "sex")
alternative

Figure 8.5 ジェンツーのオス・メス体重分布図

8.2.5 Python と SQL の連結

下記の コード28 は,標準ライブラリに含まれている sqlite3 モジュールを読み込んで,PythonとSQLiteを接続するコードです。これは第7章で作成したdbファイルを trial.db という名前で保存し,それをColab Notebooksの data ディレクトリに入れておいた場合のコードです。

コード 28

import sqlite3
import pandas as pd
conn = sqlite3.connect("/content/drive/MyDrive/Colab Notebooks/data/trial.db")

下記の コード29 は,接続を切るコードです。

コード 29

conn.close