ノート/本

Pythonのデータ分析環境pandasを触ってみる

pandasの説明?

まず初めに、データをpandasで扱う時に便利な、データフレームを触ってみましょう。

データフレームを触ってみる

pandasでは、データフレームという表の形式で、データを保持しています。 これは、Pythonでよく用いられるリストや辞書とは少し違う形で、統計パッケージRで 使われるデータフレームと同じようなもので、Excelの表のイメージに近いものです。

表の形のデータを表すのに、数学の行列のような形を考えることもできますが、データフレーム は欄ごとにのデータの種類(データ型)が違っていて構いません。名前の欄は文字列で、 成績の欄は数値、所属は文字列、というような組み合わせは、行列ではできませんが、 pandasでは可能です。

pandasでデータフレームを作ったり、値を読み出す基本的なやり方をいくつか 試しておきます。後の章でデータの解析をする時に必要になる、基本的な操作です。

<データフレームを作る>

データフレームにデータを入力する方法を、2通り試してみます。

第1の方法は、データを並べて用意し、それを初期データとするデータフレームを作る 方法です。今から見るような小さいデータフレームの例では、データの量が少ないので データを1つずつ書き並べることがそれほどの手間になりませんが、 本格的に大量のデータになると手で書き込むことはできません。そうなると外部から取り込む 方法を使うことになります。

ここでは、山田、田中、佐藤、小林、伊藤、の5人の学生それぞれの、国語と数学の点数を 表にしてみました。

import pandas as pd        # pandasライブラリを読み込み、それをpdと名付ける
df1 = pd.DataFrame(       # pdのDataFrameメソッドでデータフレームを作りdf1とする
    {'国語': [75, 66, 90, 79, 45],
     '数学': [80, 50, 95, 64, 63]}, 
     index = ['山田', '田中', '佐藤', '小林', '伊藤'] )

DataFrameメソッドの引数は、Pythonの辞書型(中括弧{}で括られている部分)として 書かれており、データフレーム中のそれぞれの行が、 辞書型の1要素( '国語’: [75, 66, 90, 79, 45] )となっています。また1行の中の データ部分 ([75, 66, 90, 79, 45]) は、Pythonのリスト(脚注)として書かれています。 3つの行の要素数はいずれも5つで、これで長方形の表の要素がすべて書かれるわけです。

また、最後の行 index = ['山田', '田中', '佐藤', '小林', '伊藤'] は、このデータフレームの インデックス、行の見出しを指定しています。

確認のためにprint関数でdf1を出力してみます。

print(df1)

これを実行すると、出力結果は

    国語  数学
山田  75  80
田中  66  50
佐藤  90  95
小林  79  64
伊藤  45  63

のようになります。なお最後の index = [ ... ] を指定しないと、インデックスとして行番号 が付きます。

<データフレームの要素にアクセスする>

データフレームでは、1つ1つの要素に対してアクセスする(読み出したり、値を書き換える) ことができます。サンプルを見てください。

print(df1['国語'])
print(df1['国語']['山田'])

1行目は、’国語'の欄のみを抽出します。printした結果は

山田    75
田中    66
佐藤    90
小林    79
伊藤    45
Name: 国語, dtype: int64

のようになります。結果がデータフレームとして戻されるので、print関数は最後の行に そのデータフレームの属性を印字しています。

また2行目は、'国語’の欄の'山田'さんの点数を取り出します。結果は

75

のようになります。

欄と同様に、行で指定して1行分を抽出したい場合がありますが、この形では範囲で 指定することしかできません。

print(df1['山田':'田中'])
print(df1['山田':'山田'])
print(df1['山田'])

1行目は、行の名前が'山田'から'田中'の範囲を取り出します。

     国語  数学
山田  75  80
田中  66  50

2行目は、同じ方法ですが範囲を'山田'から'山田'にしたものです。

    国語  数学
山田  75  80

3行目は、'山田'のみを指定した場合ですが、これはエラーになります。

このように、1つの欄全体、1つの行全体、もしくは行と欄を指定した1つのデータを 取り出すことができますが、もう少し分かりやすい方法として、iloc。

<ファイルからデータフレームにデータを読み込む>

ファイルからデータを読み込む方法として、カンマ区切りのCSV形式のファイルや、Excelのxlsxファイルを読み込むことができます。CSV形式は、他のアプリケーションとのデータ 交換(読書き)に幅広く使えますし、Excelからはxlsx形式で直接読み込んだり書き込んだり できるので好都合です。

CSV形式のファイルは、

???

総和、平均、分散などの計算

データフレームの各欄について、総和や平均値、分散などを簡単に計算することができます。

print(df1.sum())    # 総和
# 出力は
国語    355
数学    352
dtype: int64

print(df1.mean())    # 平均
# 出力は
国語    71.0
数学    70.4
dtype: float64

print(df1.var())    # (不偏)分散  numpyでは標本分散
# 出力は
国語    285.5
数学    302.3
dtype: float64
print(df1.std())    # (不偏)標準偏差   numpyでは標本標準偏差
# 出力は
国語    16.896745
数学    17.386777
dtype: float64
print(df1.max())
# 出力は
国語    90
数学    95
dtype: int64
print(df1.min())
# 出力は
国語    45
数学    50
dtype: int64

気が付いたかもしれませんが、平均や分散、標準偏差は dtype が float64 つまり浮動小数点 小数になっています。もともとの点数は整数なので、総和や最大値・最小値は整数のまま ですが、平均などは割り算の計算のために小数点以下の数字が出てきます。このとき、 Pythonでは自動的に浮動小数型を生成します。

ヒストグラム(度数分布図)

たとえば成績のデータで、どのぐらいの点数の人が何人ぐらいいるのかを、 図のようにグラフに示すことがあります。このグラフをヒストグラム(度数分布図)と 呼びます。

前節のデータフレーム df1 にもう5人分のデータを追加して、グラフがそれらしく 見えるようにしましょう。これを df2 とします。 、

# -*- coding: utf-8 -*-
import pandas as pd             # pandasライブラリを読み込み、pdと名付ける
import matplotlib.pyplot as plt # matplotlibライブラリ内のpyplotを読み込みpltと>名付ける

df2 = pd.DataFrame(       # pdのDataFrameメソッドでデータフレームを作りdf2とする
    {'国語': [75, 66, 90, 79, 45, 55, 62, 83, 57, 42],
     '数学': [80, 50, 95, 64, 63, 63, 56, 71, 68, 55]},
    index =  ['山田', '田中', '佐藤', '小林', '伊藤', '斎藤', '小川', '近藤',
      '菅原', '中村'] )


df2['国語'].hist(bins=20, range=(0,100))

plt.show()

プログラムに追加した文を説明しておきます。

import matplotlib.pyplot as plt

ライブラリ matplotlib の中の pyplot というモジュールをインポートし、plt と名前をつけておきます。

df2['国語'].hist(bins=20, range=(0,100))

データフレーム df2 のうちの'国語'の欄を抽出したもの(これもデータフレームです)に対して、ヒストグラムを生成するメソッド hist を起動します。 この hist は pandasの中で定義されているものです。histのいろいろな振る舞いを指定するパラメタを 指定することができます。ここでは bin=20 によってビン(横軸のための区間、この 区間ごとに頻度を数える)を20に等分することを指定し、range=(0,100) によって 横軸の値の範囲が0点から100点であることを指定しています。つまり、0点から100点まで を20等分します。 このほかにもいろいろな指定ができますが、その説明は*.*節に 譲ります。

plt.show()

生成された絵を、実際に描画・表示します。これを実行しないと絵が見えるようになりません。 実際に表示された画像は、図のようなものです。

histgram-kokugo.png

ここでは、ヒストグラムが簡単に描けるということを覚えておくだけにしましょう。

グラフを実際に使うときには、グラフのタイトル、軸のラベルを追加したり、 複数のデータを重ねて表示するなどの細かい細工が必要になりますが、それは *.*節で詳しく紹介することにします。 また、このpandasの中のhist機能は matplotlibのもつ描画機能の一部を切り出して提供しているもので、元のmatplotlib より機能が限定されています。matplotlibのもつ細かい機能は、マニュアル等を 参照してください。(matplotlibのマニュアルへのリファレンス)

散布図

ヒストグラムと同様に、pandasの描画機能を使って散布図を描く例を紹介します。

# -*- coding: utf-8 -*-
import pandas as pd        # pandasライブラリを読み込み、それをpdと名付ける
import matplotlib.pyplot as plt # matplotlibライブラリ内のpyplotを読み込みpltと>名付ける

df2 = pd.DataFrame(       # pdのDataFrameメソッドでデータフレームを作りdf1とする
    {'国語': [75, 66, 90, 79, 45, 55, 62, 83, 57, 42],
     '数学': [80, 50, 95, 64, 63, 63, 56, 71, 68, 55]},
    index =  ['山田', '田中', '佐藤', '小林', '伊藤', '斎藤', '小川', '近藤',
      '菅原', '中村'] )

df2.plot.scatter(x='国語', y='数学', xlim=(0,100), ylim=(0,100))

plt.show()

ここで、

df2.plot.scatter(x='国語', y='数学', xlim=(0,100), ylim=(0,100))

によって散布図を描いています。x='国語' でx軸方法に国語の点数を、y='数学'で y軸方向に数学の点数を取り、それぞれの値の範囲を0点から100点に設定しています。

scatter-kokugo-suugaku.png

全体の傾向は右肩上がりの分布になっており、国語の点数がよいと数学の点数がよい、 もしくは数学の点数がよいと国語の点数がよい、というような傾向が見られます。

漢字フォント設定。


添付ファイル: filescatter-kokugo-suugaku.png [詳細] filehistgram-kokugo.png [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-06-18 (日) 16:26:56 (7d)