0
0

Pythonで成績分析

Last updated at Posted at 2023-12-21

今回のデータは成績データを使って分析したいと思う。

ライブラリの読込み&データ作成

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
plt.rcParams['font.family'] = 'MS Gothic'
warnings.filterwarnings('ignore')

df = pd.DataFrame({'出席回数' : [15,15,14,10,12,8,10,15,15,13],
                   '課題提出回数': [15,15,14,5,10,8,10,15,14,15],
                   'ノートを取った回数': [0,15,14,10,12,0,0,0,0,13],
                   'テスト点数': [45,98,85,68,75,3,5,25,32,71]})
df.index = df.index+1
df = df.reset_index()
df = df.rename(columns={'index':'学籍番号'})
df.head()

相関係数を算出

df[['出席回数', '課題提出回数', 'ノートを取った回数', 'テスト点数']].corr()

スクリーンショット 2023-12-22 101808.png

ヒートマップ相関係数を算出

colormap = plt.cm.RdBu
plt.figure(figsize=(14,12))
plt.title('相関係数', y=1.05, size=15)
sns.heatmap(df[['出席回数', '課題提出回数', 'ノートを取った回数', 'テスト点数']].astype(float).corr(), linewidth=0.1, vmax=1, square=True, cmap=colormap, linecolor='white', annot=True)

スクリーンショット 2023-12-22 101120.png

テストの点数ヒストグラム

df['テスト点数'].plot.hist(bins=range(0, 100, 10))
plt.xlabel('テストの点数')
plt.ylabel('人数')
plt.title('テストの点数')
plt.legend()
plt.show()

スクリーンショット 2023-12-22 101515.png

出席回数と課題提出回数

df['出席回数'].hist(alpha=0.5, bins=15, label='出席回数', color='blue')
df['課題提出回数'].hist(alpha=0.6, bins=15, label='課題提出回数', color='orange')
plt.ylabel('人数')
plt.legend()
plt.show()

スクリーンショット 2023-12-19 23.40.58.png
出席回数とノートを取った回数

df['出席回数'].hist(alpha=0.5, bins=15, label='出席回数', color='blue')
df['ノートを取った回数'].hist(alpha=0.4, bins=15, label='ノートを取った回数', color='green')
plt.ylabel('人数')
plt.legend()
plt.show()

スクリーンショット 2023-12-19 23.44.07.png
課題提出回数とノートを取った回数

df['課題提出回数'].hist(alpha=0.6, bins=15, label='課題提出回数', color='orange')
df['ノートを取った回数'].hist(alpha=0.4, bins=15, label='ノートを取った回数', color='green')
plt.ylabel('人数')
plt.legend()
plt.show()

スクリーンショット 2023-12-19 23.51.42.png
成績をつける
60点未満が「不可」、60~69点が「可」、70~79点が「良」、80~89点が「優」、90点以上「秀」に分ける

df.loc[(df['テスト点数'] >= 90), '成績'] = ''
df.loc[(df['テスト点数'] < 90) & (df['テスト点数'] >= 80), '成績'] = ''
df.loc[(df['テスト点数'] < 80) & (df['テスト点数'] >= 70), '成績'] = ''
df.loc[(df['テスト点数'] < 70) & (df['テスト点数'] >= 60), '成績'] = ''
df.loc[(df['テスト点数'] < 60), '成績'] = '不可'
df

成績で円グラフを作成

value_counts = df['成績'].value_counts()
plt.figure(figsize=(8,8))
plt.pie(value_counts, labels=value_counts.index, autopct='%1.1f%%', startangle=90)
plt.title('成績割合')
plt.show()

スクリーンショット 2023-12-21 9.08.06.png

決定木モデルでの可視化

from sklearn.tree import DecisionTreeClassifier

tree = DecisionTreeClassifier()
df['成績'] = df['成績'].replace('不可',0).replace('',1).replace('',2).replace('',3).replace('',4)

X = df[['出席回数', '課題提出回数', 'ノートを取った回数']]
y = df['成績']
tree.fit(X,y)

import sklearn.tree
plt.figure(figsize=(40, 25))
sklearn.tree.plot_tree(tree, feature_names=X.columns,
    class_names=['不可', '', '', '', ''], filled=True)

スクリーンショット 2023-12-21 9.14.40.png

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0