データ分析の基本であるデータの可視化の方法をまとめます。
データ分析はjupyter notebookの使用を前提とします。
また、グラフの描画やデータ処理に必要なライブラリはあらかじめインポートしておきしょう。
import numpy as np import scipy as sp import pandas as pd from pandas import Series, DataFrame import matplotlib.pyplot as plt import matplotlib as mpl import seaborn as sns sns.set() %matplotlib inline %precision 3
データのダウンロード
web上のデータをダウンロードすることを想定します。
まず、必要なライブラリをインポートします。
import requests from io import StringIO import io
①csvファイルを直接ダウンロードする場合
下記のURLから赤ワインの品質データをダウンロードする場合を想定します。
URL: http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv
url = 'http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv' res = requests.get(url).content df = pd.read_csv(io.BytesIO(res),sep=";")
Webからデータをダウンロードするときに、requests.getを利用します。
ダウンロードしたデータをio.BytesIOを使ってバイナリストリームとしてpd.read_csvに与え、DataFrameとして読み込みます。
ここでは、すでに区切り文字を’;’で指定していますが、もし区切り文字が分かっていなければ、まずは区切り文字を指定しないほうがよいでしょう。一度DataFrameに読み込んだ後に、
df.head()
で、区切り文字を確認し、改めて読み込みなおすとよいでしょう。
※.head()で先頭の5行を確認できます。.head(10)とすれば10行確認できます。
②zipファイルをダウンロードする場合
zipfileを扱えるようにライブラリをインポートします。
import zipfile
ここでは、下記のURLからデータをダウンロード、zipファイルを展開します。
URL: https://archive.ics.uci.edu/ml/machine-learning-databases/00356/student.zip
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/00356/student.zip' r = requests.get(url, stream=True) z = zipfile.ZipFile(io.BytesIO(r.content)) z.extractall()
Webからダウンロードしたデータをバイナリストリームとして、ZipFileオブジェクトに与えます。そして、extractall()ですべて展開します。
ダウンロードしたファイルをDataFrameとして読み込みます。
student_data_math = pd.read_csv('student-mat.csv')
上の場合は、生徒の数学の成績データを読み込んでいます。
今回、csvファイルとzipファイルのダウンロードの具体例を示しました。自分でデータを読む際にはどちらか都合の良い方法を参考にしてください。
データの確認
データを読み込んだら、すぐにグラフを描画、、、する前に、読み込んだデータの個数や型を確認します。
まずは、infoを使ってすべての変数についてデータの個数や変数の型を確認します。
df.info()
これで、データに含まれるカラムの個数や変数の型が分かります。
次にデータのカラムがそれぞれどのようなデータなのか確認しましょう。データの仕様書があれば、それを見て確認しましょう。
ない場合は、データを作った人に確認しましょう。
それもできない場合は、カラム名から推測しましょう
データの仕様書がないような場合には、データ分析しようと思っても満足にできないでしょうから、あきらめるというのも一つ手かもしれませんね。。。
逆に言うと、人にデータを渡すときにはこれが何のデータなのか、しっかり定義して伝えないといけないということです。
脱線しましたが、変数の型も重要な情報です。
というのも、データには量的データと質的データの二つがあります。
量的データは、四則演算が可能な連続した値であらわされるデータで金額や人数などがあります。
質的データは、四則演算が不可能なデータで性別や職業など状態を表現するためのデータです。
各カラムがどちらのデータなのか、変数の型から判断することができます。
どちらのタイプのデータなのかで、データ同士の比較の仕方が変わりますので、これも重要な情報になります。
基本統計量の計算
DataFrameに読み込んだデータを整理するにあたって、まずは基本統計量を計算しましょう。
DataFrameの場合、describe()である程度の基本統計量は簡単に計算することができます。
df.describe()
この1行ですべてのカラムに対して、データ数、平均値、標準偏差、最大・最小値、四分位が計算されます。
カラム数が多い時は、計算に時間がかかりますが、カラムを指定して計算することもできます。
df['カラム名'].describe()
そのほかの統計量として、中央値、最頻値は、
#中央値 df.median() #最頻値 df.mode()
で求めることができます。
データの可視化
ヒストグラム
まずはヒストグラムを描いてみましょう。
ヒストグラムは次のコマンドで描けます。
plt.hist(df['カラム名']) #x軸のラベル plt.xlabel('カラム名') #y軸のラベル plt.ylabel('counts') #グリッドをつける plt.grid(True)
箱ひげ図
つづいて箱ひげ図を描いてみましょう。
箱ひげ図は次のコマンドで描けます。
plt.boxplot(df['カラム名']) plt.grid(True)
また、複数の箱ひげ図を同時に描画することもできます。
plt.boxpolt([df['カラム1'], df['カラム2'], df['カラム3']]) plt.grid(True)
散布図
二つの変数の関係を見るために、散布図を描いてみましょう。
散布図は次のコマンドで描けます。
plt.plot(df['カラム1'], df['カラム2'], 'o') plt.grid(True)
すべての変数に対してグラフを描く
最後に各変数のグラフを一度に描く方法を紹介します。
これはSeabornというライブラリを利用します。Seabornパッケージのpairplotを使うことで、各変数の関係性を一度に確認できます。
ただし、変数の数が多い場合にはすべての変数で描画すると時間がかかる上に多少見づらくなります。その場合には描画する変数の数を絞りましょう。
すべての変数で描くとき
sns.pairplot(df) plt.grid(True)
変数を指定する場合
sns.pairplot(df[['カラム1', 'カラム2', 'カラム3']]) plt.grid(True)
まとめ
データのダウンロードからDataFrameへの読み込み、ヒストグラフの描画までのやり方をまとめました。
データ分析する際の初めの一歩で、どんなときにもまずはここから、です。しっかりマスターしましょう。