Help us understand the problem. What is going on with this article?

Pythonデータ分析手順のカンニングシート(仮)

More than 1 year has passed since last update.

おつかれさまです、かきうち(@kakistuter)です。
必要に迫られており、クソ焦って勉強した。

とりあえずWEB上でカンニングできるように、1番素人がしっくりきそうなデータ分析手順のカンニングシートをQiitaにアップ。

必要なライブラリのインストール

# pandasはデータの取扱系ライブラリ
import pandas as pd
# とくにDataFrameはよく使うので、個別importしておく
from pandas import DataFrame
# numpyは行列計算系ライブラリ
import numpy as np
# matplotlibとseabornはグラフ系ライブラリ
import matplotlib.pyplot as plt
import seaborn as sns
# Jupyter Notebookを使う想定なのでブラウザ上にグラフ表示できるように設定
%matplotlib inline

データの取り込み

CSVファイルで取り込む場合は、
実行しているipynbファイルと同じディレクトリにCSVファイルおいた状態で、

df = pd.read_csv('CSVファイル名', header = None)
# `header=None`を指定せず`pd.read_csv('CSVファイル名')`とした場合は1行目が自動的にカラム名として挿入される

Excelファイルで取り込む場合は、
実行しているipynbファイルと同じディレクトリにExcelファイルおいた状態で、

df = pd.read_excel('Excelファイル名', sheetname='シート名', header = None)
# `header=None`を指定せず`pd.read_excel('Excelファイル名', sheetname='シート名')`とした場合は1行目が自動的にカラム名として挿入される

コピペで取り込む場合は、
コピーした状態で、

df = pd.read_clipboard(header = None)
# `header=None`を指定せず`pd.read_clipboard()`とした場合は1行目が自動的にカラム名として挿入される

とりあえず、今回のサンプルデータは、
https://www.kaggle.com/c/titanic/data
training.csvと仮定してすすめてきまーす。
Kaggleで有名なタイタニックでどんな人が生還したかのデータです!

データを眺める

実際のデータを見たいときは、

df.head()
# ()の中が何もなければ最初の5行、数字いれればその行数分を上から見れる

Image from Gyazo

各列のデータ数や平均、標準偏差、最小値、中央値、最高値とかを見たいときは、

df.describe()

単純にデータの行列のサイズを見たいときは、

df.shape

カラム名を変える

カラム名が気に入らないときは、

df = df.rename(columns = {'変更前カラム名1': '変更後カラム名1', '変更前カラム名2': '変更後カラム名2'})

欠損データがどれくらいあるか調べる

df.info()

欠損データをなんとかする

欠損データを消す場合は、

df = df.dropna()
# 1つでもNaNが含まれる行が削除される

あるカラムに欠損データがあって、その行を消す場合は、

df = df.dropna(subset=['カラム名'])
# 指定したカラム名にNaNが含まれる行が削除される

欠損データに列ごとに平均値、中央値、最頻値を入れたいときは、

# 平均値を入れたいときは
df = df.fillna(df.mean())
# 中央値を入れたいときは
df = df.fillna(df.median())
# 最頻値を入れたいときは
df = df.fillna(df.mode().iloc[0])

欠損データに前後の値から推測してデータを入れたいときは、

# 列方向に推測したデータを入れたいときは
df = df.interpolate()
# 行方向に推測したデータを入れたいときは
df = df.interpolate(axis=1)

欠損データに同列の前後の値を入れたいときは、

# 前の値を入れたいときは
df = df.fillna(method='ffill')
# 後の値を入れたいときは
df = df.fillna(method='bfill')

欠損データに特定のデータを入れる場合は、

df = df.fillna(入れたい値)

列によって欠損データに入れたい値が異なるときは、

df = df.fillna({'カラム名1':入れたい値,'カラム名2':入れたい値,'カラム名3':入れたい値})

新しい列を追加する

たとえば、Sexカラムの「male」「female」のデータをもとに、「0」「1」データのMaleカラムを作りたいときは

df['Male'] = df['Sex'].map({'male':1,'female':0})

たとえば、Ageカラムをもとに、「adult」「child」「baby」のデータを持つAge_rangeカラムを作りたいときは

def adult_child_baby(age):
    if age < 4:
        return 'baby'
    elif age < 19:
        return 'child'
    else:
        return 'adult'

df['Age_range'] = df['Age'].apply(adult_child_baby)

たとえば、SexカラムとAge_rangeカラムをもとに、「0」「1」データのBoyカラムを作りたいときは

def check_boy(human):
    sex, age_range = human
    if sex = 'male' and age_range = 'child':
        return 1
    else:
        return 0

df['Boy'] = df[['Sex','Age_range']].apply(check_boy,axis=1)

最終的に下記のような感じになります!

Image from Gyazo

ピボット化

Excelでいうピボットテーブルみたいなもの。
たとえば、行がAge_rangeで列がPclassで値をAgeの平均値にしたいときは、

pd.pivot_table(df, values='Age',index='Age_range', columns='Pclass', aggfunc='mean')
# valueに値、indexに行項目、columnsに列項目、aggfuncに値の計算方法を指定

で下記みたいな感じになります!

Image from Gyazo

たとえば、行がAge_rangeで列がSurvivedで値をAgeのデータ数にしたいときは、

df.pivot_table(values='Age',index='Age_range',columns='Survived',aggfunc="count")

で下記みたいな感じになります!

Image from Gyazo

グループ化

そのまんま、グルーピングです。
たとえば、Age_rangeごとに平均値を出したいときは、

df.groupby(['Age_range']).mean()

で下記みたいになります!

Image from Gyazo

グルービングは二重にできたりもします。
例えば下記みたいな感じ。

df.groupby(['Survived','Age_range']).mean()

すると下記みたいになります。

Image from Gyazo

カウント

これも結構つかえます。
例えばAge_rangeのそれぞれのデータ数がほしいときは、

df['Age_range'].value_counts()

でこんな感じに表示されます!

Image from Gyazo

棒グラフ化

まずはヒストグラムってやつから。

df['Age'].hist(bins=50)
# binsで棒の本数を指定

Image from Gyazo

つぎに棒グラフ。

# まずSurvivedごとにAgeの標準偏差をしらべておく
std = df.groupby('Survived')['Age'].std()
# SurvivedごとのAgeの平均値を棒グラフ(bar)にして標準偏差の棒をつける
df.groupby('Survived')['Age'].mean().plot(yerr=std, kind='bar', legend=False)
# kind='bar'で棒グラフになる
# legendはTrue, Falseで凡例はつけるかどうか
# yerrでエラーバーをいれれる

Image from Gyazo

つぎは横棒グラフ。

df.groupby('Sex')['Age'].mean().plot(kind='barh', legend=False, figsize=(5,3))
# kind='barh'で横棒になる
# figsizeでグラフの大きさ

Image from Gyazo

次は、データ数の棒グラフ化。

sns.countplot('Age_range',data=df)
# 引数にカテゴリーを指定

Image from Gyazo

データ数の棒グラフ化は更に細分化できる。

sns.countplot('Age_range',data=df,hue='Survived', order=['adult','child','baby'])
# hueで細分化したいカテゴリを指定
# orderで棒グラフの順番を指定できる

Image from Gyazo

Seaborn(barplot)を使うと、これらのカテゴリ分解やエラーバーが一瞬でできる!

sns.barplot(x='Age_range', y='Survived', hue='Sex', data = df)
# エラーバーは信頼区間95%を表現

Image from Gyazo

Seaborn(distplot)を使うと、ヒストグラムにそれっぽい曲線が追加される!

sns.distplot(df['Age'].dropna(), bins=50, color='gray')
# 曲線はカーネル密度推定
# distplotは欠損データがあるとエラーになるのでdropna()を忘れないこと
# colorで色が指定できたりもする

Image from Gyazo

なんかそれっぽいグラフ化

何という名前かわからんが、Seaborn(factorplot)を使うと下記みたいになる。

sns.factorplot('Age_range','Survived',hue='Pclass',data=df, order=['adult','child'])

Image from Gyazo

さらに何という名前かわからんが、Seaborn(lmplot)を使うと下記みたいになる。

sns.lmplot('Age','Survived', hue='Sex', data=df, hue_order=['female', 'male'], aspect=3)
# 直線は回帰直線
# 影は信頼区間95%を表現
# aspectでグラフの縦横比率を指定できる

Image from Gyazo

散布クラフ化

タイタニックデータは数値データが少ないので、数値データの多い別のものを準備!

df2 = sns.load_dataset('car_crashes')
df2.head()

こんな感じです。
これは縁起悪いですが、クルマの事故データです。

Image from Gyazo

pyplotのscatterメソッドをつかったら散布グラフになります!

plt.scatter(df2['speeding'], df2['alcohol'])
# 第一引数にX軸にしたいもの、第二引数にY軸にしたいものを指定

Image from Gyazo

pyplotはいろんなことを指定できます。

plt.scatter(df2['speeding'], df2['alcohol'])
# X軸とY軸の最大値と最小値を指定
plt.xlim([0, 10])
plt.ylim([0, 12])
# X軸とY軸の名前を指定
plt.xlabel('speeding')
plt.ylabel('alcohol')

Image from Gyazo

でも!Seaborn(scatterplot)を使うと一瞬で散布グラフができます!

sns.scatterplot(x='speeding', y='alcohol', data=df2)

Image from Gyazo

さらにSeaborn(jointplot)を使うと散布グラフとヒストグラムの合体版になります!

sns.jointplot('speeding', 'alcohol', df2)

Image from Gyazo

さらにさらに!なんかスゲーことになります。

sns.jointplot('speeding', 'alcohol', df2, kind="reg")
# kind="reg"を指定すると回帰直線と信頼区間95%の影がでてくる

Image from Gyazo

Seaborn(pairplot)を使うと、全通りの散布グラフ!!

sns.pairplot(df2)
# pairplotの引数は欠損値があるとエラーになる

Image from Gyazo

Seaborn(pairplot)でカテゴリ細分化までできる。

sns.pairplot(df2, hue='abbrev')

Image from Gyazo

ヒートマップ

もはや説明不要だろう。
Seabornはかってにスゴいグラフになる。

sns.heatmap(df2.corr(), annot=True)
# annot=Trueで各マスに数値が入る

Image from Gyazo

clustermapを使うと樹形図てきなものまで入る。

sns.clustermap(df2.corr(), annot=True)

Image from Gyazo

折れ線グラフ

折れ線グラフは時系列データを対象にするとわかりやすいので、Googleの株価を取得してみる。

import pandas_datareader.data as pdr
import datetime
end = datetime.date.today()
start = end - datetime.timedelta(days=10)
df3 = pdr.DataReader('GOOG', 'yahoo', start, end)
df3.head()

こんな感じ。

Image from Gyazo

対象データに対してplotメソッドを使うと下記のような感じになる。

df3['High'].plot(legend=True, figsize=(10,4))

Image from Gyazo

点や、点と点をむずぶ線のスタイルを変更することもできる。

df3[['High', 'Low']].plot(figsize=(10,4), legend=True, linestyle='--', marker='o')
# markerで点スタイルを指定
# linestyleで点と点を結ぶ線スタイルを指定

Image from Gyazo

ここでやはりSeabornを使えば一瞬。

sns.lineplot(x=df3.index, y='High', data=df3)

Image from Gyazo

参考にさせていただきました!

kakiuchis
京都の大学と大学院で光合成の基礎研究→中国のパン屋で見習いパン職人→インドネシアの工場で小さな備品調達→IT人材サービス会社で苦手な営業担当→RubyとAIのプログラミングスクールでちょっとだけ教材作成お手伝い。
https://www.techpit.jp/p/python_-cloudfunding
itpm-gk
頑張るエンジニアを応援する会社です。まだまだ発展途上です!
https://www.itpm-gk.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした