この記事の目的
データ分析を行うとき、統計的データ分析(EDA)を行っていると思います。
データを可視化する前の準備(データ加工)でpandasを使用すると思います。
そこで、データを眺める際に便利なpandasの機能を簡単に記事にまとめます。
便利機能
使用するデータは有名なタイタニックのデータを用いて説明します。
せっかくなんでSeabornから読み込んできましょう。
df = sns.load_dataset('titanic')
データの先頭を確認
df.head()
データの先頭5行を表示できます。
引数に数字を入れることで、その分表示できます。
データの末尾を確認
df.tail()
データの末尾5行を表示できます。
データ全体の量を確認
df.shape
(891, 15)
インデックスの数とカラムの数を表示できます。
データの情報を確認
df.info()
各カラムのデータ情報を確認できます。
non-nullとは欠損値ではないデータを意味しています。
このデータでは、deckというカラムのデータが欠損値が多いようですね。
あとは、どのような型でデータが入っているかもわかります。
ここで、数値に直す必要があるのか、ダミー変数、カテゴリー変数に直す必要があるのかなどを考える必要があります。
データの要素の確認
df['pclass'].unique()
array([3, 1, 2], dtype=int64)
pclassというカラムには1,2,3というデータが入力されていることがわかります。
ちなみに、.nunique()とnを追加すると、要素数を確認できます。
データの統計値の確認
df.describe()
データの数、平均値、標準偏差などの統計値を算出することができます。
各要素のデータ数の確認
df['pclass'].value_counts()
pclass
3 491
1 216
2 184
Name: count, dtype: int64
pclassの要素が1,2,3であり、それぞれどれだけデータがあるかを確認できます。
今回のデータでは3が491と一番データが多いようですね。
グルーピング
追記
以前まではエラーが生じて実行できませんでしたが、ご教授いただきましたので共有します。
groupbyのエラーメッセージとして
FutureWarning: The default value of numeric_only in DataFrameGroupBy.mean is deprecated. In a future version, numeric_only will default to False. Either specify numeric_only or select only columns which should be valid for the function.
numeric_onlyはデフォルトでFalseになっているため、mean()を取れない列(文字列のデータが含まれる列)があるときには、numeric_only=Trueを明示するか、必要な列だけを指定する必要があるみたいです。
df.groupby('pclass').mean(numeric_only=True)
通常、groupby()はデータフレームをグループ化し、その後指定した処理を行うため、グループ化したデータフレーム全体を処理するのは無謀であるようです。
以下のように書き換えることが良いようです。
group_df = df.groupby('pclass')
group_df[['age', 'sibsp']].mean()
この例ではデータフレームをグループ化し、それに対して必要な列のみに平均を出していますね。
非常に勉強になりました。
ご指摘いただきありがとうございました!!!
ソート
df.sort_values('age')
ageでソートをかけました。
デフォルトは昇順のため、降順にするなら以下のように書き換えてください。
df.sort_values('age',ascending=False)
ascending=Flaseを追加すればできます。
欠損値の確認
df.isnull().sum()
survived 0
pclass 0
sex 0
age 177
sibsp 0
parch 0
fare 0
embarked 2
class 0
who 0
adult_male 0
deck 688
embark_town 2
alive 0
alone 0
dtype: int64
各カラムの欠損値の数を確認できます。
この情報から欠損値補完をどのようにしていくかを考えます。
欠損値を削除したい場合には
df.dropna()
特定の数字で補完したい場合には(今回は0で補完)
df['age'].fillna(0)
上記では年齢を0で補完しましたが、通常年齢は中央値や平均値で補完することが多いので、例として平均値で補完してみましょう。
df['age'].fillna(df['age'].mean())
fillna()の引数にageの平均値を入れるだけですね。
文字列のデータをダミー変数に変換
pd.get_dummies(df)
文字列で入力されていたデータがダミー変数に変換されましたね。
sex_femaleというカラムが追加され、sexカラムでmaleであれば0が、femaleであれば1が入力されていることがわかります。
ちなみに、カテゴリー変数に変換したい場合は
df['sex'].astype('category')
でいけます。
相関係数
df.corr()
相関係数は数字として出てくるので、Seabornなどでヒートマップを作成すると可視化できます。
sns.heatmap(df.corr())
まとめ
お疲れさまでした!
ひとまずはこのあたり知ってれば大丈夫だろってやつを紹介しました。
他にも、これ便利だよ~ってのがあれば紹介していただけると嬉しいです!!!
groupbyができない理由については調査しますが、もしわかる方いましたら教えてください( ;∀;)
それでは!!!