[Python3]データ分析 pandasライブラリを使う、認定試験

pandasは、Pythonの強みでもあるデータ分析を行うための強力なライブラリです。読み方は「パンダス」と読みます。

ここでは、pandasのセットアップから基本的な使い方をまとめていきたいと思います。

事前準備

pandasライブラリのインストール

インストールコマンド

pip install pandas

確認

$ pip list | grep pandas
pandas                 2.0.3

使い方

データの取得

まずは分析対象となるデータを取得します。ここでは前回の記事で使用したMySQLからデータ取得するコードを使用します。

https://www.s-watanabe.work/2023/06/python3wslpython3db.html

sql = "select id, email, name, birthdate from users;"
cursor.execute(sql)
users = cursor.fetchall()

DataFrameの取得

pandasによるデータ分析では、DataFrameと呼ばれる独自のデータ構造を使って分析を行います。まずは取得したデータで、DataFrameオブジェクトを生成します。

rows = pandas.DataFrame(users)

# 確認
print(rows)

実行結果

python3 exec.py
     0                     1         2           3
0   16  member01@example.com  ユーザー名_01  2001-03-31
1   17  member02@example.com  ユーザー名_02  2003-04-25
2   18  member03@example.com  ユーザー名_03  1985-08-01
3   19  member04@example.com  ユーザー名_04  1986-06-20
4   20  member05@example.com  ユーザー名_05  1998-12-13
5   21  member06@example.com  ユーザー名_06  2000-09-01
6   22  member07@example.com  ユーザー名_07  1993-03-01
7   23  member08@example.com  ユーザー名_08  1990-05-06
8   24  member09@example.com  ユーザー名_09  1989-07-08
9   25  member10@example.com  ユーザー名_10  1999-11-03
10  26  member11@example.com  ユーザー名_11  1995-01-16
11  27  member12@example.com  ユーザー名_12  1992-02-16
12  28  member13@example.com  ユーザー名_13  1996-06-07
13  29  member14@example.com  ユーザー名_14  1998-08-18
14  30  member15@example.com  ユーザー名_15  2002-02-19

DataFrameをカラム名を付けて生成する

デフォルトだとカラム名は0, 1, 2...のようにインデックスが割り振られていますが、このままだと扱いにくいので任意のカラム名を付与することができます。

DataFrame生成時に、columnsオプションにカラム名の配列を渡すことでカラム名を設定できます。

ここではcursorからテーブル上のカラム名を取得し設定してみます。

rows = pandas.DataFrame(users, columns=[c[0] for c in cursor.description])

実行結果

$ py exec.py
    id                 email      name   birthdate
0   16  member01@example.com  ユーザー名_01  2001-03-31
1   17  member02@example.com  ユーザー名_02  2003-04-25
2   18  member03@example.com  ユーザー名_03  1985-08-01
3   19  member04@example.com  ユーザー名_04  1986-06-20
4   20  member05@example.com  ユーザー名_05  1998-12-13
5   21  member06@example.com  ユーザー名_06  2000-09-01
6   22  member07@example.com  ユーザー名_07  1993-03-01
7   23  member08@example.com  ユーザー名_08  1990-05-06
8   24  member09@example.com  ユーザー名_09  1989-07-08
9   25  member10@example.com  ユーザー名_10  1999-11-03
10  26  member11@example.com  ユーザー名_11  1995-01-16
11  27  member12@example.com  ユーザー名_12  1992-02-16
12  28  member13@example.com  ユーザー名_13  1996-06-07
13  29  member14@example.com  ユーザー名_14  1998-08-18
14  30  member15@example.com  ユーザー名_15  2002-02-19

DataFrameから指定の行を取得する

配列と同じように[開始:終了]のインデックスを指定することで、必要な行のみを取得することができます。

print(rows[1:4])

実行結果

$ py exec.py
   id                 email      name   birthdate
1  17  member02@example.com  ユーザー名_02  2003-04-25
2  18  member03@example.com  ユーザー名_03  1985-08-01
3  19  member04@example.com  ユーザー名_04  1986-06-20

DataFrameから指定の列を取得する

カラム名、もしくはインデックスを指定したときは、対応するカラムを抽出することができます。

print(rows['birthdate'])

実行結果

$ py exec.py
0     2001-03-31
1     2003-04-25
2     1985-08-01
3     1986-06-20
4     1998-12-13
5     2000-09-01
6     1993-03-01
7     1990-05-06
8     1989-07-08
9     1999-11-03
10    1995-01-16
11    1992-02-16
12    1996-06-07
13    1998-08-18
14    2002-02-19
Name: birthdate, dtype: object

このように列で射影したものをSeriesと言います。Seriesは一次元のデータ構造を持ちます。

Seriesを生成する

上記で取得した生年月日から、日数を計算して年齢のSeriesを生成します。

ages = [(datetime.date.today() - d).days // 365 for d in rows['birthdate']]
series = pandas.Series(ages)
print(series)

実行結果

$ py exec.py
0     22
1     20
2     38
3     37
4     24
5     23
6     30
7     33
8     34
9     23
10    28
11    31
12    27
13    25
14    21
dtype: int64

統計情報を取得する

取得した年齢のSeriesから、describeメソッドにより統計情報を生成します。

print(series.describe())

実行結果

$ py exec.py
count    15.000000
mean     27.733333
std       5.848891
min      20.000000
25%      23.000000
50%      27.000000
75%      32.000000
max      38.000000
dtype: float64
count 要素の個数
mean 平均値
std 標準偏差
min 最小値
25% 1/4分位数
50% 中央値
75% 3/4分位数
max 最大値

SeriesをDataFrameに結合する

assignメソッドにより、生成した年齢のSeriesを最初に取得したDataFrameに結合します。

new_rows = rows.assign(age=series)
print(new_rows)

実行結果

    id                 email      name   birthdate  age
0   16  member01@example.com  ユーザー名_01  2001-03-31   22
1   17  member02@example.com  ユーザー名_02  2003-04-25   20
2   18  member03@example.com  ユーザー名_03  1985-08-01   38
3   19  member04@example.com  ユーザー名_04  1986-06-20   37
4   20  member05@example.com  ユーザー名_05  1998-12-13   24
5   21  member06@example.com  ユーザー名_06  2000-09-01   23
6   22  member07@example.com  ユーザー名_07  1993-03-01   30
7   23  member08@example.com  ユーザー名_08  1990-05-06   33
8   24  member09@example.com  ユーザー名_09  1989-07-08   34
9   25  member10@example.com  ユーザー名_10  1999-11-03   23
10  26  member11@example.com  ユーザー名_11  1995-01-16   28
11  27  member12@example.com  ユーザー名_12  1992-02-16   31
12  28  member13@example.com  ユーザー名_13  1996-06-07   27
13  29  member14@example.com  ユーザー名_14  1998-08-18   25
14  30  member15@example.com  ユーザー名_15  2002-02-19   21

ソースコード全体

exec.py [クリックで表示]

import pymysql
import pandas
import datetime

conn = pymysql.connect(
    host='localhost',
    port=3306,
    user='user',
    password='password',
    db='test')

try:
    with conn.cursor() as cursor:
        sql = "select id, email, name, birthdate from users;"
        cursor.execute(sql)
        users = cursor.fetchall()

        # DataFrameをカラム名を付けて生成する
        rows = pandas.DataFrame(users, columns=[c[0] for c in cursor.description])
        print(rows)
        print()

        # DataFrameから指定の列を取得する
        print(rows['birthdate'])
        print()

        # 生年月日から年齢を算出して、Seriesを生成する
        ages = [(datetime.date.today() - d).days // 365 for d in rows['birthdate']]
        series = pandas.Series(ages)
        print(series)
        print()

        # 年齢の統計情報を取得
        print(series.describe())
        print()

        # DataFrameに列(年齢)を追加
        new_rows = rows.assign(age=series)
        print(new_rows)
        print()

        # DataFrameから列を指定して統計情報を取得する
        print('count', new_rows.describe().at['count', 'age'])
        print('mean', new_rows.describe().at['mean', 'age'])
        print('std', new_rows.describe().at['std', 'age'])
        print('min', new_rows.describe().at['min', 'age'])
        print('25%', new_rows.describe().at['25%', 'age'])
        print('50%', new_rows.describe().at['50%', 'age'])
        print('75%', new_rows.describe().at['75%', 'age'])
        print('max', new_rows.describe().at['max', 'age'])
finally:
    conn.close()

Pythonエンジニア認定試験について

Odyssey CBTにより、認定試験(基礎・データ分析・実践)が配信されています。
https://cbt.odyssey-com.co.jp/pythonic-exam/index.html

データ分析ライブラリは今回紹介した以外にも様々な機能があり、この技術の習得は機械学習の分野において大きな強みになるので、2023年10月末までにPython3エンジニア認定データ分析試験を受験します!

なお、基礎試験については無事合格することができました。

※Pythonエンジニア認定試験については、Pythonエンジニア育成推進協会にて運営されています。試験についての情報や、認定教材など参考になる情報が発信されているので、チェックしておくとよいです。
https://www.pythonic-exam.com/

コメント

このブログの人気の投稿

docker-compose up で proxyconnect tcp: dial tcp: lookup proxy.example.com: no such host

docker-compose で起動したweb、MySQLに接続できない事象

【PHP】PHP_CodeSnifferを使う(コーディングルールのカスタマイズ)