プログラミング初心者がアーキテクトっぽく語る

見苦しい記事も多数あるとは思いますが訂正しつつブログと共に成長していければと思います

Python pandasとR言語の基本操作チートシート

はじめに

本格的なデータ解析をする場合は専用のシステムを利用することが多いと思う。

ちょっと手元のPCでデータを確認したいときに使うのがPythonのpandasやR言語だ。

ここではpandasとR言語の基本的な使い方を対比するような形で紹介していく。

なお、グラフ作成まで含めると超長文になってしまうので本記事には含めていない。


pandas

pandasはデータ解析を支援するPythonライブラリだ。

データ解析に必要な基本機能を一通り具備しているだけでなく、Pythonという汎用言語の各種機能を活用して様々な状況に柔軟に対応できる点が専用言語にはないメリットだ。

グラフを作成する場合はmatplotlib等、他のライブラリを利用する必要がある。


R

Rはデータ解析専用言語で、いくつかあるデータ解析専用言語の中では特に人気が高い。

きれいなグラフを作成することもできる。

Rでは素のRを直接利用せず、tidyverseという外部ライブラリを利用することが一般的になっている。

素のRをbase RR base呼び、base Rとtidyverseでは同じことを実現する上でも書き方が異なる。

base Rの例
View(sort(table(df$hair_color), decreasing = TRUE))
同じことをtidyverseで実現した例
df %>%
 select(hair_color) %>%
 count(hair_color) %>%
 arrange(desc(n)) %>%
 view()

本記事では基本的にtidyverseを使った方式を採用している。

Pythonのような汎用性はないが、簡単なユースケースであれば非常に少ない行数で実現できるため、プログラミング未経験者にも優しいが、複雑なことをやろうとするとそれなりに複雑なコードを記述することになる。

各種ライブラリを活用すればpandasとほぼ同じようなことができる。


どちらを使うべきか

データのプロを目指すなら両方使えた方がよいだろう。

現場でどちらか片方が採用されていればそれを使えばよい。

どちらにも当てはまらない場合はどちらを使ってもよいがとりあえず汎用性の高いPython + pandasを使い、必要になったらRも学習するのが無難かと思う。

片方を学習すればもう片方を理解するのも容易になる。


Reference

pandas

https://pandas.pydata.org/pandas-docs/stable/reference/index.html

R

R Reference

https://cran.r-project.org/doc/manuals/r-release/R-intro.html#References

tidyverse Reference

https://tidyverse.tidyverse.org/index.html

  • Usageの項を参照

環境

pandas

R

  • RStudio

Import

pandas

import pandas as pd

R - tidyverse

library("tidyverse")

入出力

ファイルの読み込み

pandas

df = pd.read_csv("ファイルパス")

R

library(readr)
df <- read_csv("ファイルパス")
  • RStudioの「Import Dataset」でプレビュー画面を見ながら取り込み設定を決めて「Code Preview」欄からコピペするとよい

ファイルの書き込み

pandas

df.to_csv("ファイルパス", index=False)

R

write.csv(df, "ファイルパス")

データフレーム全体の確認

データフレームサイズ

pandas

df.shape

R

df %>% dim()

pandas

df.info()

R

df %>% glimpse()
  • 多くの場合、df %>% str()より見やすい

統計情報

pandas

df.describe()

R

df %>% summary()

全体表示

pandas

df

R

df %>% view()

画面に表示される行数/列数を増やす

pandas

pd.set_option('display.max_rows', 100)
pd.set_option('display.max_columns', 40)

R

print(n = 100, df)

欠損値処理

ある列が欠損している行

pandas

df.query("列名.isna()")`

R

df %>% filter(is.na(列名))
  • Rは基本的に列名を""で囲む必要なし

ある列が欠損していない行

pandas

df.query("列名.notna()")

R

df %>% filter(!is.na(列名))

いずれかの列に欠損値を含む行

pandas

df[df.isna().any(axis=1)]

R

df %>% filter(!complete.cases(.))
  • complete.casesは欠損値がない行
  • .はthis dataset

欠損値のある行を削除

pandas

df.dropna(subset=["列名"])

R

df %>% drop_na(列名)

欠損値を置換

pandas

df.fillna(value={"列名1": "置換文字1", "列名2": "置換文字2"})

R

df %>% replace_na(list(列名1 = 置換文字1, 列名2 = 置換文字2))

欠損値をpadding

pandas

df.ffill()
df.bfill()

R

df %>% fill(列名, .direction = "up|down")

データ閲覧

列を絞る

pandas

df.filter(items = ["列名1", "列名2"])

R

df %>% select(列名1, 列名2, ends_with("列名に含まれる文字列")) 
  • ends_with以外にcontains, starts_withなども利用できる

検索

pandas

df.query("species == 'Human'")

R

df %>% filter(species == "Human")
  • その他のfilterの条件の例
    • Age > 24 & Height > 1.78
    • gender %in% c("male", "female")
    • !sleep > 18
    • near(sleep_total, 17 tol = 0.5)

ソート

pandas

df.sort_values("列名", ascending=True|False)

R

df %>% arrange(列名)
df %>% arrange(-列名)

重複削除

pandas

drop_duplicates("列名")

R

df %>% distinct(列名)

変更/変換

列名の変更

pandas

df.rename(columns={"変更前": "変更後"})

R

df %>% rename(変更後 = 変更前)

新しい列の作成

pandas

df.assign(列名 = ラムダ式)
  • 列名を""で囲まない

R

df %>% mutate(列名 = 式)

型変換

pandas

df.apply(列名 = df["列名"].astype("str"))

R

df %>% mutate(列名 = as.character(列名))

集計

pandas

df.groupby("列名").max()
  • min()mean()についても同様

R

df %>%
 group_by(列名) %>%
 summarize(Lower = min(sleep_total),
           Average = mean(sleep_total),
           Upper = max(sleep_total))

結合

Join

pandas

df_left.merge(df_right, on="キー", how="left")

R

df_left %>% left_join(df_right, by=c("左キー" = "右キー"))

縦結合

pandas

pd.concat([df1, df2], axis=0, ignore_index=True)

R

df1 %>% bind_rows(df2)

横結合

pandas

pd.concat([df1, df2], axis=1)

R

df1 %>% bind_cols(df2)

縦横変換

long data -> wide data

pandas

df.pivot(columns="欄にする列名", values="値にする列名")

R

data %>%
 pivot_wider(names_from = 欄にする列名, values_from = 値にする列名)

wide data -> long data

pandas

df.melt(id_vars="残す列名",
        value_vars=["縦にする欄名1", "縦にする欄名2"],
        var_name="欄名1,2を集めた列の名",
        value_name="値を集めた列の名")

R

wide_data %>%
 pivot_longer(対象範囲,
              names_to = "欄名を集めた列の名",
              values_to = "値を集めた列の名")

Downsample

pandas

  • df.resample()

R

  • 苦手?

反復処理

pandas

  • df.apply()

R

  • purr::map

文字列操作

pandas

  • Series.str

R

  • stringr

可視化

pandas

  • matplotlib

R

  • ggplot2