データ分析
pandasとは
Python製の強力なデータ分析ツール。2次元の表形式データの処理に長けており、財務、統計、その他多くの分野で使える。
データ分析の実務では、データが最初から分析可能な状態で整備されているとは限らない。そのため、データの整合性をチェックして対応したり、複数のデータソースからデータを統合するといった整備作業が必要。
pandasの機能
- データの入出力
- CSVやExcel、DBなど、さまざまな形式のデータソースから表形式のデータを読み込めます。また、pandasで処理したデータを、各形式のファイルに書き込めます。
- データの絞り込み
- 「列Aが 100 以上の行だけを抽出する」など、指定した条件に合致するデータだけを絞り込めます。
- データのクリーニング
- 「身長のデータなのに負の値になっている」といった異常な値をチェック・修正したり、欠損値を補間・削除するなど、「おかしなデータ」を分析可能な形に整備できます。
-データの集約 - 「店舗ごとの売り上げの合計値を計算する」「ユーザの年齢ごとに契約日数の平均値を計算する」など、グループごとに特定の処理を適用できます。
- 「身長のデータなのに負の値になっている」といった異常な値をチェック・修正したり、欠損値を補間・削除するなど、「おかしなデータ」を分析可能な形に整備できます。
- データの統合
- 複数のデータをひとつのデータに統合します。単純な連結のほか、SQLのJOINのような異なる種類のデータも結合できます。
- データの分析・可視化
- 各列の基本統計量を計算したり、棒グラフや散布図などいろいろなグラフを作成できます。
データ構造
- DataFrame:2次元の表形式のデータ構造
- Series:1次元のデータ構造で、DataFrameの1列分のデータに相当
データの読み込み
pandasには、さまざまなデータソースをDataFrameとして読み込むための機能が用意されています。
データの読み込み
- CSVファイル(.csv)
- 区切りのあるテキストファイル
- HTML内のtableタグ(.html)
- JSON(.json)
- リレーショナルデータベース
- Google BigQuery
データの確認
DataFrameは、pandasの基本となる重要なデータ構造です。そのため、pandasを使ってデータ処理をしていると、DataFrameの状態を確認する場面が何度もあります。
pandasでは、DataFrameの基本情報を確認するための機能が多数用意されています。たとえば、次のようなものです。
データの確認
- DataFrameの先頭数行を表示(
head()
) - DataFrameの末尾数行を表示(
tail()
) - DataFrameの形状(行数と列数)(
shape
) - 列名一覧 (
columns
) - 各列の型 (
dtypes
) - 基本統計量 (
describe()
)
データの絞り込み
pandasのDataFrameでは、df[条件式]
のように書くことで条件に一致する行を絞り込めます。
たとえばdf[df["A"] >= 30]
とすると、「列Aが30以上の行」だけを絞り込みます。条件式にはPythonの比較同様、==、!=、>、<、>=、<=
などが使えます。
データのクリーニング
データ分析の実務で扱うデータでは、何らかの「おかしなデータ」が含まれていることが多い。たとえば、以下のようなケースがある。
おかしなデータ
- 体重を表すデータなのに、負の値が入っている(範囲外の値)
- システムの障害により、特定の期間のデータだけが記録されていない(データの欠損)
- アンケートの仕様変更により、変更前と変更後で回答項目が表記揺れしている(表記揺れ)
- データ仕様上ありえないはずなのに、まったく同じ値の行が重複して存在する(データの重複)
このようなデータに気づかないまま詳細な分析に入ると、分析の精度が落ちたり、手戻りが発生する恐れがある。そのため、詳細な分析に入る前にまずは簡単なチェックを行い、不自然なデータに対して何らかの対応をする必要がある。この「汚れたデータをきれいに整備する」工程のことを、データのクリーニングと呼ぶ。
データのクリーニングで行うチェックには、次のようなものがある。
データのチェックの例
- データの最大値・最小値を確認し、期待する範囲外の値がないか確認する
- 欠損値の有無を確認する
- データの種類を確認し、意図しない値や表記揺れがないか確認する
- データの分布を確認し、不自然な点がないか確認する
- データの重複を確認し、本来なら発生しないような不自然な重複がないか確認する
データの不自然な点に気付いたら、データ仕様が書かれたドキュメントを確認したり、データの入手元に問い合わせるなどして、なぜそのようなデータが発生しているのか背景の把握に努める。その結果を踏まえた上で、どう対処するか決める。
対処方法には次のようなものがある。
対処方法の例
- おかしなデータを、行または列ごと削除する
- おかしなデータを、他の値で置換する
データのクリーニングは地道な作業だが、その後の分析結果の出来に関わる非常に重要な工程。
pandasには、このようなデータのチェック・修正を行うための機能が多数用意されている。
欠損値の除去
実務で扱うデータでは、何らかの理由によりデータが存在しないことがある。このような、「データが存在しないこと」を示す値のことを欠損値と呼びます。
欠損値がある場合、意図しない分析結果やプログラムのエラーにつながることがあります。そのため、データを入手したらまず欠損値の有無を確認し、必要に応じて「欠損値を含む行や列を削除する」「欠損値を別の値で補完する」といった対応をします。
pandasには、欠損値の確認や対応のための機能がいろいろ備わっています。たとえば、次のような関数です。
欠損値の確認や対応
- 欠損値を確認する:
info()
,isna()
など - 欠損値を含む行を削除する:
dropna()
- 欠損値を他の値で置換する:
fillna()
データの置換
ここまでの問題では、おかしなデータを含む場合は行ごと削除していました。削除する以外に、適切な値がわかっている場合はその値で置き換えることもあります。
データ置換のメソッド
-
mask(条件式, 置換後の値)
: 指定した条件に一致するデータを置換する -
where(条件式, 置換後の値)
: 指定した条件に一致しないデータを置換する -
apply(関数)
: 全ての行に対して、指定した関数を適用する。より複雑なルールで値を置換したいときに便利。
df[既存の列名] = 更新後の値
とすることで既存の列の値を更新できます。
列の追加と演算
同様に、df[新しい列名] = 新しい列の値
とすると、新しい列が追加されます。新しい列の値 の部分は、固定の値か、Series型の値(DataFrameの1列分のデータ)が使えます。
pandasでは、既存の列の値を使った演算が可能です。
たとえば df["A"] + 10
のように書くと、「列Aの各データに10を足したSeries」が生成されます。+
以外に、-、*、/、//、%、**
など他の算術演算子も使えます。
固定の値同様、df[新しい列名] = Series
とすることで列を追加できます。そのため、df[新しい列名] = df["A"] + 10
のように書くと、「列Aの各データに10を足した結果」が新しい列として追加されます。
DataFrameの連結
concat()
を使うと、DataFrameを縦また横方向に連結できます。引数axisで0を指定すると縦方向に、1を指定すると横方向に連結します(デフォルトでは0のため、未指定だと縦方向の連結になります)。
またmerge()
を使うと、基準となるキーを指定して複数の種類のデータを結合できます。SQLを知っている方は、JOINのような結合をイメージしてください。
グループごとの統計量
データ分析の過程では、データをグループごとに分けて処理したい場面が多々あります。
df.groupby(列名).処理
のように書くことで、指定した列の値でグループ分けして処理を行います。たとえば、df.groupby("カテゴリ").mean()
は「DataFrame型のオブジェクトdfを、列カテゴリの値ごとにグループ分けして平均値をとる」処理をします。
グラフの描画
DataFrameクラスとSeriesクラスは、簡単なグラフを描画するためのメソッドを備えています。内部では、グラフ描画ライブラリであるMatplotlibが使われていますが、pandasではより簡潔な記述でグラフを描画できます。
plot.<グラフのメソッド名>
のように、グラフの種類の名前がついたメソッドを呼ぶことで、対応するグラフを描画できます。
グラフのメソッド
- 折れ線グラフ:
plot.line()
- 棒グラフ:
plot.bar()
- 散布図:
plot.scatter()
- 箱ひげ図:
plot.box()
Discussion