はじめに
去年も書いたのですが、今年もM-1グランプリの採点データを使って、データ分析の基礎を学び直しをやりたいと思います。(ちなみに仕事ではデータ分析っぽいことは何もやってません。)
データ分析の実施
まずは採点結果のcsvファイルです。
,山田,大吉,富澤,塙,海原,礼二,松本
令和ロマン,92,91,94,93,94,94,90
シシガシラ,87,88,91,90,92,91,88
さや香,98,94,95,93,96,94,89
カベポスター,94,89,88,89,95,92,88
マユリカ,92,90,96,92,92,92,91
ヤーレンズ,93,91,97,93,96,93,93
真空ジェシカ,90,95,93,91,91,91,92
ダンビラムーチョ,93,89,92,91,90,89,87
くらげ,89,87,89,90,89,90,86
モグライダー,87,89,90,91,93,91,91
ここから先はJupyter Notebookを使用します。
まずはpandasをインポートしてcsvファイルの読み込み
import pandas as pd
# CSVファイルのパス
file_path = './M-1_2023_score.csv'
# CSVファイルを読み込み
df = pd.read_csv(file_path)
# データフレームの内容を表示
df
出力結果
describe()を使って手っ取り早く、基本統計情報を見てみます。
df.describe()
出力結果
審査員ごとの平均(mean)、最大(max)、最小(min)がわかりますが、ここで注目するのは標準偏差(std)です。標準偏差はデータの散らばり具合を同じ単位で表したもので、標準偏差も大きくなると、データが平均値から離れて広がっていることを意味します。
つまり、標準偏差の大きい審査員(上記の場合、山田邦子)に高得点を付けてもらえると、有利になってきます。(順位争いが僅差であれば特に)
今度は審査員ごとの箱ひげ図を表示してみましょう。
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.family'] = 'MS Gothic'
sns.boxplot(data=df)
出力結果
やはり、山田邦子が広い範囲で点数を付けてるのがわかりますね。あと大吉の高得点が外れ値がありますね。
せっかくなので各審査員ごとの最高得点、最低得点とその対象も見てみましょう。
# 結果を格納するための空のデータフレームを作成
results = pd.DataFrame(columns=['Judge', 'Max Score', 'Max Scorer', 'Min Score', 'Min Scorer'])
# 各審査員ごとに最高得点と最低得点、それぞれの参加者名を計算
for judge in df.columns:
max_score = df[judge].max()
max_scorer = df[df[judge] == max_score].index[0]
min_score = df[judge].min()
min_scorer = df[df[judge] == min_score].index[0]
# 結果を追加
results = results.append({'Judge': judge, 'Max Score': max_score, 'Max Scorer': max_scorer,
'Min Score': min_score, 'Min Scorer': min_scorer}, ignore_index=True)
results
出力結果
でも、これだと同点の人が出力されてないので修正します。
# 結果を格納するための空のデータフレームを作成(更新)
results = pd.DataFrame(columns=['Judge', 'Max Score', 'Max Scorers', 'Min Score', 'Min Scorers'])
# 各審査員ごとに最高得点と最低得点、それぞれの参加者名を計算(同点者も考慮)
for judge in df.columns:
max_score = df[judge].max()
max_scorers = df[df[judge] == max_score].index.tolist() # 最高得点の参加者を全員リストに
min_score = df[judge].min()
min_scorers = df[df[judge] == min_score].index.tolist() # 最低得点の参加者を全員リストに
# 結果を追加(同点者はカンマ区切りで表示)
results = results.append({
'Judge': judge,
'Max Score': max_score,
'Max Scorers': ', '.join(max_scorers),
'Min Score': min_score,
'Min Scorers': ', '.join(min_scorers)
}, ignore_index=True)
results
出力結果
やっぱり最高点がついているのはファイナルラウンドに進んだ令和ロマン、さや香、ヤーレンズが多いですね。
次は、審査結果が近い人と遠い人がいそうなので、PCAで次元消滅させて可視化してみましょう。
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
features = pca.fit_transform(df.T)
X = features[:, 0]
Y = features[:, 1]
plt.scatter(X, Y)
for i,(x, y) in enumerate(zip(X, Y)):
plt.annotate(df.T.index[i],(x, y))
plt.xlabel("PC1")
plt.ylabel("PC2")
plt.grid()
plt.show()
これを見ると山田、大吉、松本が集団から離れているようです。
CHatGPTによるデータ分析
最後にこのデータをChatGPTに検証してもらいましょう。
おわりに
以上が、2023年のM-1グランプリの採点結果の分析です。本当はM-1翌日にこの記事を書き上げたかったのですが、忙しくて今日になってしまいました。