"BOKU"のITな日常

62歳・文系システムエンジニアの”BOKU”は日々勉強を楽しんでます

Pandas:構造化データ(structured data)の内容を把握してあたりをつける

目的変数が2値のシンプルなデータを対象に、自分がよく使っているやり方を備忘メモ的に書いてます。

f:id:arakan_no_boku:20200329000112p:plain

 

はじめに

 

データ分析ビギナーが、フリーの「構造化データ(structured data)」を使って何かやろうとするときの最初のハードルが「内容を把握して、学習データとして適切なものと不要なものにあたりをつける」ことです。

基本、Pandasを使ってやります。

試行錯誤しつつやってますが、なんとなく最近よく使うなと思うパターンができてきたので、備忘のために書いておくことにします。

今回は、その初回です。

なお。

コード例は、以下がインポートされている前提とします。

import pandas as pd

以下の要領でCSVファイルを読み込んで「df01」というDataFrameがある想定です。

df01 = pd.read_csv('./csvdata/train.csv')

例では kaggleのtitanicデータを一部使わせていただいてます。

 

データ型や行数などの基本情報

 

基本情報を見る方法です。

  • データ型(Dtype)
  • 行数(entries)
  • カラム名(Column)
  • 欠損値の有無(Non-Null Countの列の数字が、行数より少ない)

などをまとめてみるには「info()」が便利です。

df01.info()

f:id:arakan_no_boku:20200510004837p:plain

 

数値データの統計情報を知る

 

数値データ(int、floatなど)の統計情報をまとめてみます。

df01.describe()

f:id:arakan_no_boku:20200510005856p:plain

これで

  • count:欠損値以外の数
  • mean:平均
  • std:標準偏差
  • min:最小値
  • 25%:第一四分位数
  • 50%:中央値(第二四分位数)
  • 75%:第三四分位数
  • max:最大値

をまとめて確認できます。

 

数値以外の統計情報を見る

 

数値以外の統計情報を見ます。

同じdescribeですが、「数値項目以外(exclude=number)」を指定します。

df01.describe(exclude='number')

f:id:arakan_no_boku:20200510132915p:plain

これで

  • count:要素の個数
  • unique:一意(ユニークである)な要素の数
  • top:最頻値(もっとも多く登場する値)
  • freq:最頻値の出現回数

がまとめてわかります。

uniqueの数とcountでばらつきが少ない項目はカテゴリデータとして利用できます。

 

目的変数が2値の時、カテゴリ変数をピボット分析する

 

特徴変数ごとに、該当する目的変数(今回の例だとSurvived)の割合をみると、特徴変数の重要度のあたりがつけやすいので、目的変数と特徴変数との関連性をピボットで見ていきます。

今回は、pandasの「croostab」とか「pivot_table」を使わずにやってます。

目的変数が「0」と「1」の2値の時だけ使える技です。

目的変数が3つ以上あったり、crosstabなどを使うパターンは、別の機会にします。

さて。

カテゴリタイプの特徴変数でピボットする例です。

[ と ]を2つ続けると化けてしまうので、画像で張り付けてます。

 

f:id:arakan_no_boku:20200521004150p:plain

 

Survivedの生存が「1」死亡が「0」なので、平均をとって0.5なら生存と死亡が拮抗してて、それより上なら生存率が高い要素、低ければ生存率が低い要素になります。

f:id:arakan_no_boku:20200510134426p:plain

 

数値を分割してレンジでピボット分析する(その1)

 

数値データの場合はカテゴリのようなやり方をするとバリエーションが多くなりすぎるので、数値が含まれる範囲で分析することがあります。

その分割のやり方のひとつとして、等分割して、ピボット分析します。

等間隔に5等分して、生存率と対比します。

この例も画像で貼ってます。

 

f:id:arakan_no_boku:20200521001745p:plain

 

結果はこうです。

f:id:arakan_no_boku:20200510212333p:plain

 

数値を分割してレンジでピボット分割する(その2)

 

今度は範囲指定で分割して、ピボット分割します。

年齢を10歳きざみで分割して、生存率と対比させます。

この例も画像で貼ってます。

 

f:id:arakan_no_boku:20200521001824p:plain

 

結果はこうです。

f:id:arakan_no_boku:20200510213048p:plain

 

おまけ・・単純な情報確認でよく使うもの

 

最後に、単純な情報確認でちょこちょこ使うのをまとめておきます。

 

dtypeとかはNumpyのそれと同じです。

意味 結果例
t.head() 先頭の5行を表示

id name price

0 S01 アイテム1 50000

1 S02 アイテム2 85000

2 S03 アイテム3 120000

3 S04 アイテム4 180000

4 S06 アイテム5 210000

t.tail() 最後の5行を表示

id name price

5 S07 アイテム6 50000

6 S08 アイテム7 85000

7 S09 アイテム8 120000

8 S10 アイテム9 180000

9 S11 アイテム10 210000

t.shape 形状を表示 (10, 3)
t.isnull().sum()

欠損値(NaNなど)をカウントする。

チェックに使う。

右例なら「name」と「price」に欠損がある。

id 0
name 3
price 3
cate 0
size 0

今のところこんな感じです。

ではでは。