Python 3 エンジニア認定データ分析試験
- 良く分からない点を克服するためのメモです。
試験概要
- 試験名称: Python 3 エンジニア認定データ分析試験
試験時間:60分
問題数: 40問(すべて選択問題)
合格ライン: 正答率70%
主教材: 翔泳社の教科書「Pythonによるあたらしいデータ分析の教科書」
副教材:
ディープロ(無料問題集/易しい):https://diver.diveintocode.jp/
PrimeStudy(無料問題集/本番レベル):https://study.prime-strategy.co.jp/
用語
- 適合率(Precision)
「正と予測したデータのうち、実際に正であるものの割合」
(例)「病気であると予測した患者のうち、実際に病気であった患者の割合」を表します。つまり、テストが「病気である」と予測した場合、その予測がどれだけ信頼できるかを示す。
- 再現率(Recall)
「実際に正であるデータのうち、正と予測されたものの割合」
(例)「実際に病気である患者のうち、病気であると予測された患者の割合」を表す。つまり、テストがすべての病気の患者をどれだけ見つけられたかを示す。
- F値(F1-score)
適合率と再現率の調和平均を取ったもの。
適合率と再現率の両方が高いほど、F値は高くなる。
- One-hotエンコーディング
区分を数値に変換する事。
(例) 区分:未実施、実施済み
▶ A列:未実施の場合は1、否0。B列:、実施済の場合は1、否0。
- ネイピア数
自然界に現れる様々な現象を表す数(2.71828・・・)
自然対数の底を表す数。
- 三角関数
斜辺と高さ、斜辺と底辺の比を知ることができる関数。
sin cos tan
- シグモイド関数
入力された値に対して、0から1までの値を返す。
ニューラルネットワーク活性化関数として出力を確率として解釈することができる。

- ROE曲線
分類モデルのパフォーマンスを評価するためのグラフ。
真陽性率と偽陽性率に基づいて描かれる。
真陽性率(True Positive Rate: TPR):
正しく陽性と予測された陽性の割合。感度や再現率とも呼ばれる。偽陽性率(False Positive Rate: FPR):
誤って陽性と予測された陰性の割合。1から特異度を引いたもの。正しい組み合わせ:
(横軸, 縦軸)= (偽陽性率, 真陽性率)。
これはROC曲線の基本的な定義に従っている。

- ROC曲線
予測モデルの性能を視覚的に評価するためのグラフで、
感度(真陽性率)と1-特異度(偽陽性率)の関連を表す。
- PEP8
Pythonのコーディング規約名称
- 回帰直線
f(x)=ax+bの事。
(例) 身長が高くなれば、多分体重も重くなる。
- 単回帰分析
f(x)=ax+bでa,bが点と線の距離の2乗誤差がより0になるとこを微分によって計算する。
- 線形回帰と微分の関係
・線形回帰とは、点と点の間に直線を引いて、点の動きを予測する方法。
・直線を引くときには、点とのズレ(誤差)が小さくなるようにする。
・誤差が最小になるときは、誤差の曲線の傾きが0になるとき。
・傾きを求めるのに、微分を使う。
- 決定木
質問によってグループを分けてデータを分類する方法。
グループを分ける時、不純度という指標を使う。理由はできるだけ同じ種類のデータが集まるようにするため。
- 不純度
指標。ジニ不純度、エントロピー、分類誤差などで計算できる
- 情報利得
質問によって不純度がどのくらい減ったか
- 確率変数
いろいろな値が出る可能性のあるもの
- 確率関数
離散型確率変数の場合で、各値が出る確率を確率関数と言います。
(例)サイコロを振って1がでる確率
・離散型確率変数
確率変数がとりうる値が飛び飛びのもの。サイコロなど。
・連続型確率変数
確率変数がとりうる値が連続的なもの。身長など。
- 確率密度
連続型確率変数の場合に使う
確率密度関数は、確率変数の値とその値の近くになる確率の割合の関係を表したものです。
確率密度関数の高さは、確率ではない。確率は、確率密度関数の面積で表される。
確率密度関数の面積は積分で計算する
- 交差検証
データをグループに分けて、モデルの精度を測る方法。
欠点:予測ラベルの割合が不均一になる問題がある。
(例)全体データがバラ80%/向日葵15%/チューリップ5%の時、
グループ分けした時にあるグループにはチューリップが含まれていないなど
対策:層化k分割交差検証。全データの割合とグループ分けの割合を同じにする。
均一k分割交差検証:データセットをk個のグループに分けて、モデルの精度を測る方法。
ブートストラップ法:データセットからランダムにサンプルを抽出して、新しいデータセットを作る方法。
Leave-One-Out法:データセットの中から一つだけをテストデータとして使う方法。
- GridSearchCV
モデルのパラメータを最も精度の高いものを自動で探してくれる機能。
パラメータ:モデルの動きを決めるための設定のこと。
(例)木の数や木の深さなど
GridSearchCVクラスには、もっとも精度が良い時のパラメータの値を取得するための属性は以下4つ。属性:クラスが持っている情報のこと。
・best_params_:もっとも精度が良かったときのパラメータの値を辞書型で返す。
(例){‘木の数’: 10, ‘木の深さ’: 5}
・best_estimator_:もっとも精度が良かったときのモデルのオブジェクトを返す。
・best_index_: もっとも精度が良かったときのパラメータの組み合わせの番号を返す。番号は、探索したパラメータの組み合わせの順番に対応。
(例)3つ目の組み合わせが最も精度が良かった場合は、2という値が返されます。番号は0から始まることに注意
・cv_results_: これは、探索したすべてのパラメータの組み合わせとその結果を辞書型で返す。
- サポートベクターマシン
分類や回帰のためのアルゴリズム。
- ハイパーパラメータ
モデルの動きを決める設定の事。
C: 誤分類をどの程度許容するかを決めるパラメータ。
Cが小さいほど誤分類を許容し、Cが大きいほど誤分類を許容しない。kernel: カーネル関数の種類を決めるパラメータ。
カーネル関数:データを高次元空間に写像する関数のこと。scikit-learnでは、linear, poly, rbf, sigmoidなどのカーネル関数が使える。degree: polyカーネルの場合に、多項式の次数を決めるパラメータ。
degreeが大きいほど、複雑な決定境界を作る。gamma: rbfカーネルの場合に、カーネルの幅を決めるパラメータ。
gammaが小さいほど、カーネルの幅が広くなり、gammaが大きいほど、カーネルの幅が狭くなる。coef0: polyカーネルやsigmoidカーネルの場合に、カーネル関数に加える定数を決めるパラメータ。coef0が大きいほど、カーネル関数の値が変化しやすくなる。
- ポアソン分布
ある事象が一定の時間内に発生する回数を表す離散確率分布。
- ピアソンの相関係数
ピアソンの相関係数は、2つの量的変数間の線形関係の強さを測る統計的指標。
-1から1までの範囲で値をとり、1に近いほど正の相関(一方の変数が増加するともう一方も増加する)、-1に近いほど負の相関(一方の変数が増加するともう一方は減少する)があることを示す。0に近い場合は、2つの変数間にはほとんどまたは全く線形関係がないことを示す。
- k-means法
k-means法は、非階層型クラスタリングのアルゴリズムで、与えられたクラスタ数k個にデータを分類します。このアルゴリズムは以下のような手順で行われます。
各データにランダムなクラスタを割り当てます
クラスタごとに中心を求めます
各データを、クラスタ中心が最も近いクラスタに変更します
全てのデータのクラスタの割り当てが変化しなくなるまで、2と3の手順を繰り返します
コード
- numpy
import numpy as np #使用宣言
a=np.array([1,2,3]) #配列
A = np.full((2,2),1) # 2×2のリスト。全て1で埋める。
B = np.zeros((2,2))# 2×2のリスト。全て0で埋める。
np.concatenate([A, B], axis=0)#AとBを結合。0:行方向/1:列方向np.log(np.exp(np.eye(2)))
np.eye(2):2×2の単位行列を作る([[1,0],[0,1]])
np.exp():ネイピア(2.718・・)を掛ける([[2.718・・,0],[0,2.718・・]])
np.log():ネイピアの何乗になるか([[1,0],[0,1]])(乗)B = A.ravel() と B = A.flatten()
ravel :変更を加えると元の値も変わる。(Bに変更加えるとAも変更される)
flatten:変更を加えても元の値は変わらない。(BとAは内容が異なる。)D = np.diff(C, axis=0) #行方向の差分を取得
np.sum(D) #合計np.meshgrid(m,n)
m = np.arange(4)
n = np.arange(3)
xx, yy = np.meshgrid(m,n)
#xx :[0,1,2,3]×3行
#yy :[0,0,0,0],[1,1,1,1],[2,2,2,2]np.hstack((a,b)) # aとbの列方向連結
np.vstack((a,b)) # aとbの行方向連結
- pandas
import pandas as pd #使用宣言
#データフレーム (表形式)
b = pd.DataFrame([[0,75.0,4667,"男性","既婚"],
[1,74.0,5041,"女性","独身"],
[2,74.0,4667,"男性","既婚"],
[3,73.0,5041,"女性","独身"]])
b.index = [1,2,3,4,5,6] #行名称設定
b.columns=["ID","利用回数","料金","性別","区分"] #列名称設定
b.sort_values(“利用回数”, ascending=False) # 並び替え。利用回数の降順
b[“利用回数”].value_counts().to_frame() #利用回数列をカウントしてdfとして返す
b.set_index(“ID”) # IDを行名称に設定pd.read_csv(‘data.csv’, usecols=[カラム名]) #CSVファイルの読込 。列指定。
pd.to_csv(‘data.csv’, index=False) #CSVファイルへの書込 。indexは出力無データフレームの結合
pd.merge(A, B, how=”inner”, on=”日付”)日付範囲の生成(datetime型)
import pandas as pd
pd.date_range(start="2024/1/1",freq = "2D",periods = 10)
#1 /1〜2日ごとに10個生成
pd.date_range(start="2024/1/1",end = "2024/1/31" ,freq = "2D")df.drop(“人口/万人”, axis=0)
- matplotlib
import matplotlib.pyplot as plt #使用宣言
円グラフパラメタ
shadow=False: 弧に影をつける。デフォルトは「False」。
counterclock: 円グラフを作成する方向を反時計回りにする。デフォルトは「True」
explode: 弧を中心から浮かせる。デフォルトは「False」。
frame: 円グラフの周りに枠を描画する。デフォルトは「False」グラフ作成例
fig, ax = plt.subplots()
x1 = [x for x in range(1,4)]
y1 = [1,2,3]
x2 = [x for x in range(1,6)]
#10までのランダム整数を5個生成
y2 = [np.random.randint(10) for x in range(5)]
ax.bar(x1, y1, label="y1") #棒グラフ
ax.plot(x2, y2, label="y2") #折れ線グラフ
ax.set_ylabel("Tate_Label")
ax.set_xlabel("Yoko_Label")
ax.legend() #凡例表示 (場所自動)
plt.show() #グラフ表示 。Notebookでは記述なくても表示される。

- sklearn
・ロジスティック回帰(LogisticRegression)
predict:予測する proba:probability(確率)
from sklearn.linear_model import LogisticRegression #使用宣言
from sklearn.datasets import load_iris #データセットをインポート
X, y = load_iris(return_X_y=True) #データセットを読み込み
model = LogisticRegression()#ロジスティック回帰モデルのインスタンスを作成
model.fit(X, y)#モデルの重みを学習
proba = model.predict_proba(X) #ラベルの予測確率を取得
print(proba)
model.predict(X) #最も確率の高い属するクラスを返す
model.get_params() # modelの設定値を取得
[[9.81815537e-01 1.81844486e-02 1.44032759e-08] [9.71757371e-01 2.82425992e-02 3.01211473e-08] [9.85463786e-01 1.45362021e-02 1.23092622e-08] [9.76312476e-01 2.36874844e-02 3.96761028e-08] [9.85396994e-01 1.46029945e-02 1.19264844e-08]・・・・・
・ランダムフォレスト(RandomForestClassifier)
複数の決定木を組み合わせてデータを分類
・max_depth:各決定木のノードの深さ最大値。
学習データへの過学習を防止したり、精度向上に寄与
・num_leaves:各決定木の葉の最大数。同上
・n_estimators: 決定木の数。
・サポートベクタマシン
import sklearn.svm as svm # svmモジュールをインポート
clf = svm.SVC(kernel='linear', gamma=0.7, C=0.1) # SVCクラスのインスタンスを作成
kernel値:
・'rbf’:ガウスカーネルと呼ばれる非線形のカーネル関数。
・'linear’:線形のカーネル関数
・'poly’:多項式のカーネル関数
dot/行列掛け算
import numpy as np
1次元配列(ベクトル)の定義
v1 = np.array([1, 2])
v2 = np.array([3, 4])
v3 = np.array([[3, 4]])
numpy.dot()による内積の計算
dot_product = np.dot(v1, v2)
print(f"Dot product: {dot_product}")
行列の掛け算による外積の計算
outer_product = np.matmul(v1[:, np.newaxis], v2[np.newaxis, :])
print(f"Outer product:\n{outer_product}")
print(v1*v3)
Dot product: 11
Outer product: [[3 4] [6 8]]
[[3 8]]