LoginSignup
215
263

More than 1 year has passed since last update.

「Python実践データ分析100本ノック」を写経してみた

Last updated at Posted at 2022-01-23

img_9784798058757_1.jpg
» Python実践データ分析100本ノック | 下山輝昌, 松田雄馬, 三木孝行

はじめに

この本を手にした動機

今回の読み方

  • 冒頭にある「本書の効果的な使い方」を参照し、それに準拠
  • 各章各ノックの内容を「写経」しつつ、本文とコードを読み進め、分からないところをGoogleで調べる感じ
    • 人それぞれだが、自分は本(Kindle)とブラウザ、メモ用のエディターを横に並べるスタイルがやりやすかった

image.png

  • 写経環境は「Jyupyter-Notebook」を用いたが、「Google Colaboratory(Colab)」でも全然OK!(実際最後の自然言語処理の章はColabを利用)
  • コードのメソッドや属性で初見のものがあれば、それをGoogleで検索した
    • メソッドも「Python」等を付けた検索するとほぼ100%解説記事に辿りつけた
    • 私が悩んだりつまづいたことほぼすべての内容について、先達が何らかの記事を書いてくれていたり公式を翻訳をしてくれている。感謝。
  • ノックを1つづつ写経する前に、まずその章をざっとななめ読みしてから個別ノックの写経に入る方がよいかも
    • 初心者だと各ノックのコード記述の理解で都度つまづく可能性が高い。
    • 全体の流れを抑えてから個別のノックを深く理解する方が理解が速い

「Python実践データ分析100本ノック」の写経をやってみて

  • Pythonを用いたデータ分析作業がイメージできた
    • 特にPandasでどんなことができるのかは少しイメージできた気がする
    • 昔DBAだったころにPL/SQLでやっていた各種データパッチ作業を思い出したが、相当便利になっていると思う
    • 実際のスクリプトが多く紹介されており、理解が深まりやすい
    • とくに明細から特徴量を集計したテーブルを作るコード例(ノック36)などは今後参考になりそう
  • データ分析の本質を垣間見た

    • 丁寧に何重もデータの中身を確認をしながら行う準備工程の大切さ、環境整備の重要性が伝わった
    • そして自ら目的やアプローチの最適性を考えることの重要性が再三述べられていた
    • 最新モデルでより高い精度を競えるのは随分先
    • まずは何を解決するか、そしてその判断考察の元データを整えることが最優先
  • 今後の目標が出来た

    • イメージできたことと使いこなせるには大きなギャップがあるので、データ分析が自分の武器にできるように継続的にスキルを磨いていきたい。

この本をオススメしたい方

  • Python基本的初級レベル文法は学習済みで、より具体的なコード例に多く触れたい方
  • 「データ分析」や「データサイエンス」「機械学習」の具体的な実装内容や作業イメージの一端を知りたい方

以下写経しながら取ったメモです。
この本に興味がある方、そして同じようにこの本を手に取られた方にとって何か参考になればと思い、こちらに公開します。

1章

Pandasによるデータ加工/確認

  • 行ユニオン(縦に結合する、concat自体は横結合も可能):concat
  • 列ジョイン(SQLで言うところの表JOIN。内部結合と外部結合もできる):merge
  • 計算列の追加:ds['列名']=ds['列名'] * ds['列名']
  • 列合計:ds['列名'].sum()
  • 欠損値(NULL値)があるかの確認:isnull()
  • 各列の最大値、最小値:MIN(),MAX()
  • 各種統計量の表示:describe()
  • 日付型への変更:to_datetime()
  • フォーマット変換:strftime()
  • 特定列での集計:groupby()
  • クロス集計:pivot_table()

参考記事

matplotlibによるグラフ化

  • データを2次元平面に折れ線グラフや散布図形式で描画する:matplotlib.pyplot.plot()

参考記事

2章

Pandasによるデータ加工/確認

  • クロス集計で行列が両方存在する数をカウントする:pivot_table() aggfunc='size'
  • ユニークデータ件数(SQLでいうdistinct)をカウントする:unique()
  • データをソートして並び替える:sort_values()
  • 1つでも欠損値が含まれているデータがあるかを判定する(行列どちらでも判断可能):isnull().any()
  • 条件に合致するデータを抽出する:loc()
  • SettingWithCopyWarningへの対処について:VIEWとCOPY
  • SQLで言うところの副問合せUpdate文のようなイメージ
  flg_is_null = uriage_data["item_price"].isnull()
  for trg in list(uriage_data.loc[flg_is_null, "item_name"].unique()):
      price = uriage_data.loc[(~flg_is_null) & (uriage_data["item_name"] == trg), "item_price"].max()
      uriage_data["item_price"].loc[(flg_is_null) & (uriage_data["item_name"]==trg)] = price
  uriage_data.head()
  • 型のキャスト(文字列から数値へなど):astype()
  • 数字化文字列かの判断:str.isdigit()
  • シリアル値から日付に変換:to_timedelta()
    • シリアル値からの日付変換はExcelとPythonで2日異なるので注意
    • 最小日付がExcelは1900/01/01だがシリアル値1 ― EXCELでは、本来うるう年でない1900/02/29を有効な日付にしている

文字列加工(strオブジェクトのメソッド)

  • 大文字に変換する:str.upper()
  • 文字列を置換する:replace()

参考記事

3章

Pandas

  • とりあえずデータ読み込んだらこの2点
    • lenで件数確認
    • head()で先頭5行を見る
  • ジョインした時は件数確認
    • ジョインが失敗すると自動的に欠損値が入る。欠損値確認を行うこと
  • NaTはdatetime型の欠損値を指す
  • ある特徴を見出しその条件に符号するデータにフラグを立てていく
    • 例えば習慣化されている人
    • 同じ曜日が4回以上ある月が1か月でもある人
  • 曜日を知りたい:dt.weekday()
  • 欠損値を一律の値で置き換える:fillna()
  • 日付期間の計算、特に月単位でカウントする場合:dateutil.relativedelta()

参考記事

4章

クラスタリング(K-means法)

  • データ分析の1つの手法として対象データのグループ化がある。どうやってグループ化するかどうかには正解はない。
  • そんな時は教師なし学習のクラスタリングが効果的
    • scikit-learnライブラリを使用
    • 最もオーソドックスなクラスタリング手法 K-means法
    • 変数間の距離をベースにグルーピング
  • クラスタリングにはまず対象データの「標準化」が必要
    • 「標準化」とは、項目間の値の絶対値のばらつきの違いによって発生するAI(人工知能)が認識する重要性の違いを取り除くこと
    • 標準化された値 = (元の値 - 平均) / 標準偏差
  • sclit-learnのstandardscaler()を使うと簡単に標準化が行える
  • 可視化のためには二次元まで次元を減らす。次元削除の代表的な手法が主成分分析:PCA()
    • 新たな軸がどの変数から成り立っていくかを見ていくと軸の意味付けが出来る。

線形回帰

  • 予測のための回帰モデルとして線形回帰モデルを利用する
    • scikit-learnのLinearRegression()
  • 予測モデルの構築には学習用データと評価用データが必要
    • 所与のデータを教師データと評価データに分割する
    • train_test_split()
    • 無指定の場合評価用が25%になる
  • 作成したモデルを用意した教師データで学習させる
    • model.fit(x, y)を利用する
    • 予測に使う変数x:説明変数
    • 予測したい変数y:目的変数
  • 学習用データで作成したモデルを評価用データにあてて精度を検証する
    • LinearRegression.score()
  • 寄与している変数の寄与度(係数)を確認する
    • model.coef_
  • 予測する
    • model.predict

Pandas

  • グループ別の集計を行う:groupby().cout()
    • indexの見せ方を変える:as_index=False
  • 欠損値を含むデータを削除する:dropna()

参考記事

  tmp_before.rename(columns={"count":"count_{}".format(j-1)}, inplace=True)

5章

決定木分析

  • ノック42でエラーが出たが以下のページで解決
  • 事前準備
    • 退会者データと継続者データをそのまま並べると不均衡なのでバランスを取る
    • 欠損値対応(機械学習は欠損値があると対応できない)
    • 文字列データ(カテゴリカル変数)のダミー変数化
    • 文字列データを一括でダミー変数化:pd.get_dummies
    • pandasでカテゴリ変数をダミー変数に変換(get_dummies) | note.nkmk.me
      • カテゴリの数が限定されている場合、例えば3つの場合は2つが0なら最後が1と決まる。重複した意味を持つ場合は列を削除する
    • ここまで準備できて初めてモデル化へ「データ分析はデータ加工が8割」
  • 決定木モデル構築
  • モデルの評価とチューニング
    • 学習データと評価データの精度を比較する。その差が少ないのが理想。
    • 学習データの精度の方が高い場合はそのモデルは過学習傾向にある(学習データに寄り過ぎている)
    • 今回は決定木の深さで制御する
    • max_depth属性
    • モデルに寄与している変数の確認
    • model.feature_importances_
    • 決定木の可視化: GraphViz

6章

ネットワーク最適化/NetworkX

numpy

7章

Ptyhonにおける数理最適化を行う上での概要(主にPuLP)

PuLPについて

最適化計算とは

詳細な定義とは言えないが、非常に乱暴だが自己理解を言語化すると以下の通り。

  • 数理モデルの作成
    • 最大化と最小化がある
  • 変数の定義
    • 変数はdict形式で与える
  • 目的関数の設定
    • モデルに数式を追加(+=)していくイメージ
    • 輸送問題の場合は、各輸送コストと変数v1の要素の積の和として目的関数を定義する。
  • 制約の追加
    • 目的関数と同じくモデルに数式を追加(+=)していくイメージ
  • ソルバーの実行

参考記事

サンプルコードを読み解く上で参考になったサイト(特にPython文法およびメソッドの使い方関連)

8章

ネットワーク分析

Python Tips

9章(画像認識)

OpenCV

※なおdlibはインストールが必要になったため割愛した
【python】Windowsにdlibをインストールする - ソースに絡まるエスカルゴ

Python Tips

  • 可変長引数について:引数を変数化して受け渡す時に使える。**を付ける
  hogParams = {'winStride': (8, 8), 'padding': (32, 32), 'scale': 1.05, 'hitThreshold':0, 'finalThreshold':5}

  human, r = hog.detectMultiScale(gray, **hogParams)

10章(自然言語処理)

前処理

形態素解析

参考記事

215
263
0

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
215
263