[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/
コメント
コメントを投稿