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です。

step04.ipynbセル4実行結果

このように単独で出力すると表として整形してくれます。また、右側の青い丸いアイコンを押すことで表やグラフに加工してくれる機能もありますので、随時利用してみましょう。

ポイント

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列の「個数合計最大値最小値分散標準偏差」を出力させてください。

なお、各関数名は次を参考にして構いません。
countsummaxminvarstd

実行結果例を表示
サイコロAを10回振った結果の個数は10でした
サイコロBを10回振った結果の個数は10でした
サイコロAを10回振った結果の合計は24でした
サイコロBを10回振った結果の合計は38でした
サイコロAを10回振った結果の最大値は4でした
サイコロBを10回振った結果の最大値は6でした
サイコロAを10回振った結果の最小値は1でした
サイコロBを10回振った結果の最小値は2でした
サイコロAを10回振った結果の分散は1.3777777777777778でした
サイコロBを10回振った結果の分散は2.4でした
サイコロAを10回振った結果の標準偏差は1.1737877907772674でした
サイコロBを10回振った結果の標準偏差は1.5491933384829668でした

正解


正解プログラムコード全文を表示
# サイコロをROLLS回振った結果の個数を算出
diceA_faces_count = diceA_df[C_FACE].count()
diceB_faces_count = diceB_df[C_FACE].count()

print('{}を{}回振った結果の個数は{}でした'.format(DICE_A, ROLLS, diceA_faces_count))
print('{}を{}回振った結果の個数は{}でした'.format(DICE_B, ROLLS, diceB_faces_count))

# サイコロをROLLS回振った結果の合計を算出
diceA_faces_sum = diceA_df[C_FACE].sum()
diceB_faces_sum = diceB_df[C_FACE].sum()

print('{}を{}回振った結果の合計は{}でした'.format(DICE_A, ROLLS, diceA_faces_sum))
print('{}を{}回振った結果の合計は{}でした'.format(DICE_B, ROLLS, diceB_faces_sum))

# サイコロをROLLS回振った結果の最大値を算出
diceA_faces_max = diceA_df[C_FACE].max()
diceB_faces_max = diceB_df[C_FACE].max()

print('{}を{}回振った結果の最大値は{}でした'.format(DICE_A, ROLLS, diceA_faces_max))
print('{}を{}回振った結果の最大値は{}でした'.format(DICE_B, ROLLS, diceB_faces_max))

# サイコロをROLLS回振った結果の最小値を算出
diceA_faces_min = diceA_df[C_FACE].min()
diceB_faces_min = diceB_df[C_FACE].min()

print('{}を{}回振った結果の最小値は{}でした'.format(DICE_A, ROLLS, diceA_faces_min))
print('{}を{}回振った結果の最小値は{}でした'.format(DICE_B, ROLLS, diceB_faces_min))

# サイコロをROLLS回振った結果の分散を算出
diceA_faces_var = diceA_df[C_FACE].var()
diceB_faces_var = diceB_df[C_FACE].var()

print('{}を{}回振った結果の分散は{}でした'.format(DICE_A, ROLLS, diceA_faces_var))
print('{}を{}回振った結果の分散は{}でした'.format(DICE_B, ROLLS, diceB_faces_var))

# サイコロをROLLS回振った結果の標準偏差を算出
diceA_faces_std = diceA_df[C_FACE].std()
diceB_faces_std = diceB_df[C_FACE].std()

print('{}を{}回振った結果の標準偏差は{}でした'.format(DICE_A, ROLLS, diceA_faces_std))
print('{}を{}回振った結果の標準偏差は{}でした'.format(DICE_B, ROLLS, diceB_faces_std))