pandasで分析する
- 解説
- 1. pandasの導入
- 2. 平均値・中央値・最頻値
解説
1. pandasの導入
前回は基本的な統計量(平均値、中央値、最頻値)をPythonのみで算出しましたが、pandasというライブラリを使用することで、簡単に算出できるようにしましょう。
(1) | Colab上で「step04.ipynb」を新規作成してください。 |
(2) | 下記のコードをそれぞれ新しいセルに入力して、 「ランタイム」 > 「すべてのセルを実行」してください。 |
# インポート
import random
import pandas as pd
# 定数
DICE_A = 'サイコロA'
DICE_B = 'サイコロB'
DICE_A_MAX = 6
DICE_B_MAX = 6
ROLLS = 10
C_FACE = 'face'
# 「サイコロを振る」のと同じ状態を再現する関数
# 引数1つ目はint型、dice_max=サイコロの最大値
# 引数2つ目はint型、dice_min=サイコロの最小値、省略時は1
# 戻り値はint型、サイコロを振った結果の目の値
def roll_dice(dice_max: int, dice_min: int = 1) -> int:
return random.randint(dice_min, dice_max)
# サイコロをROLLS回振る
diceA_faces = [roll_dice(DICE_A_MAX) for _ in range(ROLLS)]
diceB_faces = [roll_dice(DICE_A_MAX) for _ in range(ROLLS)]
# pandasのDataFrameに変換
diceA_df = pd.DataFrame(diceA_faces, columns=[C_FACE])
diceB_df = pd.DataFrame(diceB_faces, columns=[C_FACE])
# 表形式で出力される
print('{}を{}回振った結果\n{}'.format(DICE_A, ROLLS, diceA_df))
print('{}を{}回振った結果\n{}'.format(DICE_B, ROLLS, diceB_df))
実行して次のような結果が出力されればOKです。
サイコロAを10回振った結果
face
0 4
1 4
2 5
3 6
4 5
5 6
6 4
7 3
8 2
9 1
サイコロBを10回振った結果
face
0 3
1 1
2 1
3 4
4 6
5 1
6 5
7 4
8 1
9 1
(3) | 下記のコードを新しいセルに入力して、 「ランタイム」 > 「すべてのセルを実行」してください。 |
# 単独で出力させると整形される
diceA_df
実行して次のような結果が出力されればOKです。
このように単独で出力すると表として整形してくれます。また、右側の青い丸いアイコンを押すことで表やグラフに加工してくれる機能もありますので、随時利用してみましょう。
ポイント
DataFrame
これ以降、ほとんどの処理はDataFrame化したデータに対して行います。pd.DataFrameの後に続く丸括弧の中にデータとパラメータを渡すことでDataFrameを生成できます。(関数ではなくクラスのコンストラクタですが、ここでは解説しません。)
step04.ipynb - セル 3 の 6行目でサイコロAをROLLS回振ったデータを渡していますが、これは配列です。DataFrameは表形式のようなもので、操作するためには列名が必要となります。そのため、columnsパラメータでfaceという列名を渡しています。
2. 平均値・中央値・最頻値
それでは、平均値・中央値・最頻値の3つをまとめて算出してみましょう。
(1) | 下記のコードを新しいセルに入力して、 「ランタイム」 > 「すべてのセルを実行」してください。 |
# サイコロをROLLS回振った結果の平均値を算出
diceA_faces_mean = diceA_df[C_FACE].mean()
diceB_faces_mean = diceB_df[C_FACE].mean()
print('{}を{}回振った結果の平均値は{}でした'.format(DICE_A, ROLLS, diceA_faces_mean))
print('{}を{}回振った結果の平均値は{}でした'.format(DICE_B, ROLLS, diceB_faces_mean))
# サイコロをROLLS回振った結果の中央値を算出
diceA_faces_median = diceA_df[C_FACE].median()
diceB_faces_median = diceB_df[C_FACE].median()
print('{}を{}回振った結果の中央値は{}でした'.format(DICE_A, ROLLS, diceA_faces_median))
print('{}を{}回振った結果の中央値は{}でした'.format(DICE_B, ROLLS, diceB_faces_median))
# サイコロをROLLS回振った結果の最頻値を算出
diceA_faces_mode = diceA_df[C_FACE].mode().tolist()
diceB_faces_mode = diceB_df[C_FACE].mode().tolist()
print('{}を{}回振った結果の最頻値は{}でした'.format(DICE_A, ROLLS, diceA_faces_mode))
print('{}を{}回振った結果の最頻値は{}でした'.format(DICE_B, ROLLS, diceB_faces_mode))
実行して次のような結果が出力されればOKです。
サイコロAを10回振った結果の平均値は4.1でした
サイコロBを10回振った結果の平均値は3.6でした
サイコロAを10回振った結果の中央値は4.5でした
サイコロBを10回振った結果の中央値は4.0でした
サイコロAを10回振った結果の最頻値は[5]でした
サイコロBを10回振った結果の最頻値は[4]でした
ポイント
mean・median・mode
Pythonのみで算出する場合には、事前にソートしたり出現回数を数えたりする必要がありましたが、pandasでは関数を呼び出すだけで結果が取得できています。今後はどんどん複雑な処理を関数呼出ひとつで実現することになりますが、その関数が内部でどんな処理を行なっているのか、大体で構いませんので、調べて把握できるようにしましょう。
tolist
modeだけさらにtolistという関数を呼び出していますね。modeの結果は複数になる可能性がありますが、pandasの場合には純粋な配列で返ってきません。printしたい場合などはtolist関数で純粋な配列に変換すれば可能となりますので、覚えておきましょう。
問題
実践問題
問題
step04.ipynbの新しいセルに必要なコードを入力して、平均値などと同様に、face列の「個数・合計・最大値・最小値・分散・標準偏差」を出力させてください。
なお、各関数名は次を参考にして構いません。
count・sum・max・min・var・std