LogoMark.png

Pandas のバックアップ(No.5)


Pandas

https://pandas.pydata.org/

Pandas は、データの読込、集計、組み替えなどを行うことができる Pythonプログラミングにおけるデータ解析の定番ライブラリです。.csv、.xlsx 他、多様な形式かつ、大量のデータの読み込みに対応しており、表計算ソフトよりも高速で処理を行うことができます。

Pandas が扱うデータ構造には、Series(1次元)と DataFrame(2次元)がありますが、重要なのは DataFrame で、表構造の組み替え・抽出、統計解析、グラフ化など、様々な手法を理解することで、実践的なデータ解析ができるようになります。

以下、公式のチートシートで全体像を把握できます。
https://pandas.pydata.org/Pandas_Cheat_Sheet.pdf

CONTENTS




はじめに

Pandasのインストールとインポート

Python 言語のライブラリとしてのインストールになるので、一般の Python3 の環境であれば、Terminalから以下のコマンドでインストールできます。

$ pip3 install pandas

import する際は、以下のように pd という名称を与えるのが一般的です。

 import pandas as pd

Google Colaboratory では Jupyter Notebook で利用できるライブラリーが「すべてインストール済み」という前提なので、ローカル環境での作業のように、必要なライブラリのインストールを行う必要はなく、コードセルに import 文を書くだけで使うことができます。

Pandas のキーワード

Pandasが扱うデータ構造には、以下の2つがあります。

Pandas では、以下の2つのラベルでデータを特定します。




Seriesとは

Series は Pandas の1次元データ構造で、dataindex の2つの要素から構成されます。

以下のように data と index を定義します。

ser = pd.Series( data = [ 60, 80, 70 ] , index=['Alice','Bob','Charlie'] )
ser
-----------------
Alice      60
Bob        80
Charlie    70

データ部分のみを定義した場合、index は自動的に 0, 1, 2・・となります。

ser = pd.Series( [ 60, 80, 70 ] )
ser
-----------------
0    60
1    80
2    70

データは、ラベル(index)を使って抽出することができます。

ser['Bob']
-----------------
80

その他様々な操作が可能ですが、実際には2次元の表構造である DataFrame の活用が中心になりますので、ここでは省略します(以下、公式文書)。
https://pandas.pydata.org/docs/reference/api/pandas.Series.html




DataFrame とは

The primary pandas data structure.
Two-dimensional size-mutable, potentially heterogeneous tabular 
data structure with labeled axes (rows and columns). 
Arithmetic operations align on both row and column labels. 
Can be thought of as a dict-like container for Series objects. 

DataFrame とは、Pandasライブラリ扱う「主要なデータ構造」で、以下のような特徴を持つオブジェクトです。

DataFrame は dataindexcolumns の3つの要素から構成されます。

以下、DataFrame を扱う変数として df を使って事例を紹介します。
df は DataFrame の略として一般によく用いられる変数名です。



DataFrame の定義

一般に、データフレームは CSV や Excel 等のデータを読み込んで生成するものですが(後述)、ここではデータフレームの構造を理解する意味で、直接的なデータの定義方法について紹介します。

pd.DataFrame( data, index, columns, dtype, copy)


定義例1

import pandas as pd
df = pd.DataFrame( [ [ '佐藤', 170, 60 ] , ['田中', 160, 50 ] , [ '鈴木', 165, 58 ] ]  )
df
          0         1     2
0     佐藤   170   60
1     田中   160   50
2     鈴木   165   58

行ラベル、列ラベル(index と columns ) には、自動的に番号数字が入ります。

定義例2

import pandas as pd
df = pd.DataFrame(
     data =[ [ '佐藤', 170, 60 ] , ['田中', 160, 50 ] , [ '鈴木', 165, 58 ] ] ,
     index = ['S01', 'S02', 'S03'],
     columns =[ 'name' , 'height', 'weight']
)
df
          name  height  weight
S01    佐藤     170         60
S02    田中     160         50
S03    鈴木     165         58


定義例3

numpy の2次元配列を使って定義する事例

import pandas as pd
import numpy as np

df = pd.DataFrame(
    data = np.array( [ [10, 20, 30, 40], [11, 21, 31, 41], [12, 22, 32, 42] ] ),
    index = [ 'row_1', 'row_2', 'row_3' ] ,
    columns = [ 'col_1', 'col_2', 'col_3', 'col_4' ]
)
df
              col_1     col_2     col_3     col_4
row_1        10          20          30          40
row_2        11          21          31          41
row_3        12          22          32          42


定義例4

0から11までの数値を 3行・4列にあてはめて定義する事例

import pandas as pd
import numpy as np

df = pd.DataFrame(
    data = np.arange(12).reshape(3, 4),
    index = [ 'row_1', 'row_2', 'row_3' ],
    columns = [ 'col_1', 'col_2', 'col_3', 'col_4' ]
)
df
               col_1     col_2     col_3     col_4
row_1          0            1            2           3
row_2          4            5            6           7
row_3          8            9           10         11




DataFrame へのファイルの読込と基本情報

データファイルの読み込み

基本情報の表示


行・列数の最大値

DataFrame.set_option( )

処理の実行後の表示では、行・列数が制限されていて、データ数が多い場合は、中途が・・・と省略表示になります。これを回避するためのメソッド。

DataFrame からのデータの抽出

基本的なデータの抽出

DataFrame[ ]、DataFrame.iloc[ ]、DataFrame.loc[ ]

以下、いずれも抽出後の DataFrame を返しますが、元のデータフレームそのものが更新されることはありません(非破壊操作)。

query メソッドによるデータの抽出

DataFrame.query( )

以下、いずれも抽出後の DataFrame を返しますが、元のデータフレームそのものが更新されることはありません(非破壊操作)。

DataFrame のリシェイプ

データフレームのメルト

pd.melt( )

データフレームのピボット

pd.pivot( )

データフレームの結合

pd.concat( )

DataFrame の操作

データの並べ替え

DataFrame.sort_values( ) , DataFrame.sort_index( )

行・列名の変更

DataFrame.rename( )

rename メソッドの引数 index および columns に、{ 元の値 : 新しい値 } のかたちで(辞書型の定義)で元の値と新しい値を指定します。デフォルトでは変更後の状態を返すだけで、元の DataFrame そのものを破壊・更新するわけではありません。引数 inplace = True にすると、元の DataFrame が変更されます。

行・列の削除

DataFrame.drop( )

dropメソッドは、デフォルトでは削除後の状態を返すだけで、元のデータフレームそのものを破壊・更新するわけではありません。引数 inplace = True にすると、元の DataFrame が変更されます。

欠損値に関する処理

DataFrame.isnull( ) , DataFrame.dropna( ) , DataFrame.fillna( )

実際のデータには、無回答や入力ミスなどで欠損値が発生することがあります。pandas では NaN(Not a Number:非数) と表記され部分が欠損値ですが、これは後の演算等でエラーを発生させる原因となるので、それを含む部分は除去することが必要です(データクレンジング)。

DafaFrame における統計処理

カウント・合計・平均・中央値・分散

DataFrame.value_counts( ) ,
DataFrame.sum(numeric_only=True ) , 
DataFrame.mean(numeric_only=True),
DataFrame.median(numeric_only=True) ,
DataFrame.var(numeric_only=True)

GroupByオブジェクトの利用

DataFrame.groupby( )

特定の列データの値を基準にグルーピングした上で、グループごとの統計処理を行うことができます。例えば、全学生の成績一覧がある場合に、学部ごとの成績の平均を求める・・といったことが可能です。


クロス集計

pandas.crosstab( )

2項目のカテゴリの組み合わせでサンプル数の算出ができます。
第一引数が index(行見出し)、第二引数が columns(列見出し)となる DataFrame が返されます。

ピボットテーブルの利用

pandas.pivot_table( index = , columns = , values =  , aggfunc =  )

2項目のカテゴリの組み合わせで、データの統計量(平均、合計、最大、最小、標準偏差など)を確認・分析できます。




Pandas の可視化メソッド

pandas のメソッドを用いたのグラフ描画の方法を紹介します(pandas は matplotlib を用いてグラフを描画しています)。

ライブラリの読み込み

最低限必要なのは、matplotlib と pandas です。以下典型的な記載例です。

import matplotlib.pyplot as plt
import pandas as pd


ヒストグラム:DataFrame.hist( )

hist.png

ヒストグラム(柱状グラフ、度数分布図)は、横軸に階級、縦軸に度数をとった統計グラフで、データの分布状況を可視化するために用いられます。

ボックスプロット:DataFrame.boxplot( )

box.png

ボックスプロット(箱ひげ図)は、データのばらつきを可視化する統計グラフで、箱(box)と、その両側に出たひげ(whisker)で表現されることからその名が付けられています。

一般に以下の五数が要約(five-number summary)されて表示されます。

以下のコードは、対象カラム(XXX)をグループ(AAA)別に表示します。

df.boxplot( column='XXX' , by='AAA' )


散布図:DataFrame.plot.scatter( )

scatter.png

散布図(scatter plot)は、縦軸、横軸に2つの量的データ項目を対応させて、各レコードのデータを点でプロットしたものです。項目間の相関の有無が可視化されます。

以下のコードは、x軸とy軸にカラム項目を指定して表示します。

df.plot.scatter( x='XXX', y='YYY' )


折れ線グラフ・棒グラフ・円グラフ

これらのグラフは項目間の推移や比較を見るために使います。数万件もある全レコードを表示しても視覚的に読み取ることはできないので、グラフにしたい内容によって、事前に「データの平均値を出す」、「クロス集計する」といった処理を行った後、それを新たなデータフレームとしてグラフの表示に利用するのが一般的です(以下、棒グラフの事例です)。

# 性別ごとに国語・英語・数学の平均値を算出
df_mean = df.groupby( 'Gender' , as_index=False ).mean( ) 
df_mean
GenderJapaneseEnglishMathematics
0F62.35000058.47500039.800000
1M56.42045541.14204539.539773
bar.png

生成された df_mean を使うと、簡単に積み重ね棒グラフができます。

df_mean.plot.bar( stacked=True )

stacked=True は、積み重ねを有効にする・・という意味です。

汎用グラフ:DataFrame.plot( )  引数kindでグラフの種類を指定できます。


APPENDIX

sklearn ライブラリのサンプルデータを読む事例

California Housing(カリフォルニアの住宅価格)のデータを読む事例です。

# サンプルデータセットを取得
from sklearn.datasets import fetch_california_housing
data_housing = fetch_california_housing()
# 読み込んだデータを Pandas の DataFrame型に変換
train_x = pd.DataFrame(data_housing.data, columns=data_housing.feature_names)
# 目的変数をDataFrameへ追加
train_y = pd.Series(data_housing.target, name="target")
# 先頭の5件を表示
train_x.head()