見出し画像

Python3エンジニア認定データ分析試験で聞かれるPythonのライブラリを徹底解説

今回はタイトルの通りでPython3エンジニア認定データ分析試験に必要なPythonのライブラリについて解説します。

全て簡単なコード例も付いているのでかなりのボリュームです!

なので試験についての説明はほぼしません!ただ一つ知っておいて欲しいことは、Pythonやったことがなくても十分合格することができる資格です。

もちろんプログラミング自体全くの未経験だと勉強に時間はかかると思いますが、プログラミングに触れていればPython未経験でも問題ないです。

というのも公式に出ている試験範囲を見るとわかるのですが、範囲内のライブラリが4つなんです。
この4つのライブラリの使い方を覚えれば試験対策としてはバッチリです。

この記事ではまずNumpyを解説します。
一つの記事で全て紹介しようとしていましたが、Numpyだけで10000文字を余裕で超えてしまったので記事分けます!
自分の苦手な部分や勉強したいライブラリの記事だけ読むのでもいいと思います!

これから試験を受けようとしている方はぜひ参考にしてみてください!

Numpy

まず一つ目のライブラリはnumpyです。numpyは配列や行列を扱うためのライブラリです。

配列はndarray、行列はmatrixがそれぞれ用意されていますが、データ分析で主に使われるのはndarrayです。
データ分析試験でもndarrayに付いて問われるので、ndarrayについて解説していきます!

Numpyの基本

numpyをまずインストールします。

pip install numpy

pipで管理していない人やpythonが初めての人は「python numpy install」などで調べるとたくさん出てくるのでそれを参考にしてみてください。

無事インストールできたらnumpyをimportして使いましょう

import numpy as np

as npはnumpyをこのコード中ではnpとして使いますということです。npじゃなくてもなんでもいいですが慣習的にnpとすることが多いです。

配列を定義する

まずはnumpyで配列を定義しましょう。#で始まる行はコメントです。

# 1次元配列
a = np.array([1, 2, 3])

# 2次元配列
b = np.array([[1, 2, 3], [4, 5, 6]])

print(a)    # [1 2 3]

print(b)    # [[1 2 3]
               [4 5 6]]

このようにnp.array()で配列を簡単に定義することができます。

また以下のように作成した配列のタイプを確認することも可能です。

# 1次元配列
a = np.array([1, 2, 3])

print(type(a))        # numpy.ndarray

一番最初に説明したように配列はndaarayです。(行列はmatrix)
なのでaはndarrayオブジェクトと出力されます。
もちろん二次元配列になっても変わりません。

配列の形を確認する

shape属性で配列の形状を確認することができます。

# 2次元配列
b = np.array([[1, 2, 3], [4, 5, 6]])

print(b.shape)    #(2, 3)

先ほど作成した配列bの形状を確認すると、(2, 3)と出力されます。これで配列bが
2 × 3の配列だと確認できます。
少し注意が必要なのはshapeはメソッドではなく属性なので、b.shape()としないようにしてください!

配列の要素のデータ型を確認する

次に配列の中身の要素のデータ型を確認します。Numpyの配列では一つの要素だけで配列を作成します。(いろんなデータ型の要素を集めて一つの配列を作りません)

dtype属性で要素のデータ型を確認することができます。使い方は先ほどのshapeと同じです。

# 2次元配列
b = np.array([[1, 2, 3], [4, 5, 6]])

print(b.dtype)    # int64 (Windowsの場合はint32)

int64と出力されました。Windowsではデフォルトがint32なのでint32と出力されると思います。

Numpyでは配列を作成するときに、要素のデータ型を明示的に宣言することもできます。

a = np.array([1, 2, 3], dtype=np.int16)

print(a.dtype)    # int16

このように配列作成時にdtype属性を指定することで、要素のデータ型を決定できます。

配列の形を変える

次は配列の変形です。変形の方法はいくつか紹介しますが、一番の基本はreshape()メソッドを使うことです。

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

print(a)        # [1 2 3 4 5 6]
print(a.shape)  # (6,)

b = a.reshape(2, 3)

print(b)        # [[1 2 3]
                  [4 5 6]]
print(b.shape)  # (2, 3)

このようにreshape()メソッドを使うことで配列の形を自由に変更することができます。

もちろん変形不可能な形をreshape()メソッドの引数に渡すとエラーになります。
例えば配列aは6個の要素しかありませんが、b.reshape(2, 4)とすると要素数が8必要なのでエラーとなります。

ravel()とflatten()

ravel()メソッドとflatten()メソッドも配列の形を変えるメソッドです。どちらも配列を1次元に変更するメソッドです。
まずは実行結果を見てみましょう。

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

print(a)   # [[1 2 3]
             [4 5 6]]

b = a.ravel()

c = a.flatten()

print("b is ", b)    # b is  [1 2 3 4 5 6]
print("c is ", c)    # c is  [1 2 3 4 5 6]

どちらも同じ実行結果です。ではravel()とflatten()は何が違うのでしょうか。

結論から言うとravel()は参照を返し、flatten()はコピーを返します。
参照とコピーと言われてもよくわからないと思うので、もう少しわかりやすい例を見てみようと思います。

まずは次のコードを実行してみてください。

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

b = a.ravel()

b[0] = 10

print(a)  # [[10  2  3]
              [ 4  5  6]]

実行結果はコメント行に書いてあるものが出力されていると思います。
まずこのコードが何をしているか説明します。

最初に配列aを定義します。
次に配列aをravel()メソッドにより一次元に変形します。これが配列bです。
この時点で配列bは[1 2 3 4 5 6]です。

そして配列bの最初の要素b[0]に10を代入します。(配列の要素へのアクセス方法はこの後解説します。)

ここまでで配列aの値は何も変えていないように見えます。あくまで配列bに値を代入しただけです。

ここで配列aを出力してみましょう。
すると配列aの最初の要素が10になっていることが確認できます。

これが起こるのが参照です。

ravel()メソッドで行っているのは、配列bは配列aと同じメモリ領域を参照してね、と言うことです。

そのため配列bの値を変更すると、それと同じメモリ領域を参照している配列aの要素も変更されます。

これがravel()メソッドです。

flatten()メソッドは参照ではなくコピーです。aと全く同じ配列をコピーして配列bを生成します。

なのでbの要素を変更しても配列aには影響がありません。一応確認してみましょう。

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

b = a.flatten()

b[0] = 10

print(a)  # [[1 2 3]
            [4 5 6]]

配列bの要素を変更しても、配列aに影響がないことを確認できました!

配列の要素にアクセスする

先ほど少し出てきた配列の要素へのアクセスの仕方について説明します。要素へのアクセスにはインデックスを使う方法とスライスを使う方法があります。

まずはインデックスを使う方法から説明します。

インデックスを使って配列の要素にアクセスするには、先ほど出てきたようにアクセスしたい要素のインデックスを[]で指定します。
例を見てみましょう。まずは1次元配列の場合です。

a = np.array([1, 2, 3, 4 ,5])

print(a[0])  # 1

このように配列の要素にアクセスすることができます。ここで一つ注意なのが、一番目の要素のインデックスは0であることです。
a[1]とすると2が出力されるので気を付けてください。

次に二次元配列の場合も見てみましょう。

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

print(a[0])  # [1 2 3]

a[0]とすると[1 2 3]と出力されました。なぜこうなるのか一度考えてみてください。

これは0番目の行(1行目)を指定しているので[1 2 3]がしゅつりょくされます。

なのでa[1] とすると、[4 5 6]が出力されます。

では、1だけを出力したい場合はどのように指定すればいいのでしょうか。それは行だけでなく列も指定することで実現できます。

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

print(a[0,0])  # 1

a[0,0]と書くことで1行目、1列目を指定し、1を取り出すことができます。

a[1,0]とすれば2行目,1列目の4を取り出すことができます。

またインデックスには負数を使うこともできます。

a = np.array([1, 2, 3])

print(a[-1])  # 3
print(a[-2])  # 2

インデックス-1は一番最後の要素、-2は最後から二番目の要素のように指定できます。

ここからはスライスについて説明していきます。スライスは簡単に言うと範囲指定です。
例を見てみましょう。

a = np.array([1, 2, 3, 4, 5])

print(a[1:])  # [2 3 4 5]

上の例の「:」がスライスで用いる記号です。a[1:]は配列aのインデックス1以降の要素を意味します。
インデックス1の要素は2なので[2 3 4 5]が出力されます。

もちろん二次元配列でもスライスを使えます。

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

print(a[:,1])

一度出力がどうなるか考えてみてください。

答えは[2 5]です。

行はスライスを指定しているので"全ての行"、そして列は1を指定しているので2列目が出力されます。

つまり、全ての行の2列目を出力しています。

列にスライスを使うパターンも見てみましょう。

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

print(a[1,:])

これも出力がどうなるか考えてみてください。

答えは[4 5 6]です。

2行目の全ての列を出力しています。ここらへんで一度復習しておきますが、インデックス1の行は2行目ですよ!!

あと二つ問題を出してみるので考えてみてください。

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

print(a[0,1:])

答えは[2 3]です。1行目の2列目以降を出力しています。

最後の問題は応用です。少し難しいですが考えてみてください!

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

print(a[:,[0,2]])

行は何行目で、列は何列目かを丁寧に考えていくとわかりやすいかもしれません。

答えは、[[1 3]
              [4 6]] です!

まず行はスライスを使っているので全ての行です。列は0,2なので1列目と3列目です。
つまり、全ての行の1列目と3列目を出力しています!

arange()

arange()関数を使うことで、数列(要素が数値の配列)を作成することができます。
見た方がわかりやすいと思うのでまずは例を見てみましょう。

a = np.arange(10)

print(a)  # [0 1 2 3 4 5 6 7 8 9]

0から9までの10個の要素が入った配列を作成することができました。
a = np.array([0, 1 , 2 ,3 ,4 ,5 ,6 ,7, 8, 9])と作成するより簡単です。

範囲を指定して配列を作ることも可能です。

ここから先は

5,945字

¥ 500

期間限定!Amazon Payで支払うと抽選で
Amazonギフトカード5,000円分が当たる

この記事が気に入ったらチップで応援してみませんか?