見出し画像

#2 マチコ先生とニャー助のデータサイエンス 「データ収集と前処理って何ニャ?」編: Rバージョン 20講 



世田谷区の某猫カフェにて、まったりお茶するマチコ先生とニャー助

ニャー助: う~ん、最近は昼寝が趣味にゃ。お昼に日向ぼっこして、夕方にはまた寝るにゃ。

マチコ先生: ふふ、ニャー助らしいわね。でも、たまには外で遊んだり、運動したりするのも大切だからね。

ニャー助: そうだにゃ。でも、データサイエンスを勉強していると、家でまったりする時間が増えちゃうにゃ。

マチコ先生: そうだね。でも、データサイエンスは将来役に立つし、色々なことができるようになるから、頑張って勉強してね。じゃあ、今日は「データの収集方法と前処理」について話そうかしら。

ニャー助: おてやわらかにお願いしますにゃー!

データの収集ってなんで大事にゃ?

マチコ先生: ニャー助、データサイエンスで一番大切なのは何だと思う?

ニャー助: うーん、データを分析することにゃ?

マチコ先生: それも大切だけど、実はデータの収集方法もすごく大事なのよ。データの質が分析結果に大きな影響を与えるからね。

ニャー助: へえ、そうなんだにゃ。でも、どうしてデータの収集方法がそんなに大事なの?

マチコ先生: 良い質問ね。データの収集方法が適切でないと、分析に使えるデータが少なかったり、偏ったデータになってしまったりするの。それによって、分析結果が正確でなくなってしまうことがあるのよ。

ニャー助: なるほどにゃ。じゃあ、データの収集方法をちゃんと勉強して、正確な分析結果を出せるようにするにゃ!

マチコ先生: その調子!データの収集方法には色々な方法があるから、それぞれの方法の特徴や適切な使い方を学んでいこうね。

データ収集が大事なのはわかったニャ。じゃあ、データってどう集めるニャ?


マチコ先生: まずはデータの収集方法について話すわね。一般的に、データはWebスクレイピングやAPIを利用して取得することができるわ。

ニャー助: Webスクレイピングって何にゃ?

マチコ先生: (まあ、そこからだよね)Webスクレイピングとは、ウェブページから情報を抽出する技術のことよ。Rでは「rvest」というパッケージを使ってWebスクレイピングができるの。まずは、rvestをインストールしましょう。

install.packages("rvest")

次に、rvestを使ってウェブページからデータを取得する例を見てみましょう。

library(rvest)
url <- "https://example.com"
webpage <- read_html(url)

このコードは、example.comというウェブサイトからHTMLを取得しているわ。さらに、特定の情報を抽出するためにCSSセレクタを使うことができるの。

ニャー助: CSSセレクタって何ニャ?

マチコ先生: あ、ごめんね。いきなり専門用語で。CSSとは、Cascading Style Sheetsの略なの。例えば、ウェブページのテキストやリンク、画像などの特定の部分にアクセスしたい場合、CSSセレクタを使ってその要素を指定することができるの。

title <- webpage %>% html_nodes("h1") %>% html_text()

この例では、ウェブページから<h1>タグのテキストを取得しているわ。

ニャー助: <h1>タグってなにニャ?

マチコ先生: いい質問ね、ニャー助。<h1>タグは、HTML文書内で最も重要な見出しを示すもので、通常ページのタイトルや大見出しに使われるわ。例えば、あるニュース記事のウェブページで、記事のタイトルが<h1>タグで囲まれていることがよくあるの。具体的には、以下のようなコードになるわね。

<!DOCTYPE html>
<html>
<head>
  <title>サンプルページ</title>
</head>
<body>
  <h1>今日の天気は晴れ!</h1>
  <p>今日の天気は晴れで、最高気温は25℃、最低気温は15℃です。</p>
  <p>午後からは少し曇りがちですが、夜にはまた晴れるでしょう。</p>
</body>
</html>

この例では、<h1>タグのテキストは「今日の天気は晴れ!」になるわ。このように、<h1>タグは通常、ページの主要な見出しやタイトルに使われるのよ。

ニャー助: なるほどにゃ。<h1>タグはページのタイトルに使われるんだにゃ。Rを使ってそのテキストを抽出できるんだにゃ。じゃあAPIって何にゃ?

マチコ先生: APIは「Application Programming Interface」の略で、ウェブサービスが提供するデータや機能にアクセスできるようにする仕組みよ。Rでは、「httr」というパッケージを使ってAPIにアクセスできるわ。まずは、httrをインストールしましょう。

install.packages("httr")

次に、httrを使ってAPIからデータを取得する例を見てみましょう。

library(httr)
api_url <- "https://api.example.com/data"
response <- GET(api_url)
content <- content(response, as = "parsed")

このコードは、api.example.comというAPIからデータを取得しているわ。

さて、データを収集したら、前処理が必要になることがあるわね。例えば、欠損値や外れ値を処理したり、データをフィルタリングしたりするの。Rでは、「tidyverse」というパッケージを使ってデータの前処理ができるわ。まずは、tidyverseをインストールしましょう。

install.packages("tidyverse")

ニャー助: なるほど、データ収集と前処理ができるんだにゃ。RとRStudioの環境設定はどうすればいいのにゃ?

マチコ先生: RとRStudioの環境設定は、まずRとRStudioをインストールすることから始めるわ。Rは以下のサイトからダウンロードしてインストールしてね。

R公式サイト: https://cran.r-project.org/

RStudioは以下のサイトからダウンロードしてインストールするわ。

RStudio公式サイト: https://rstudio.com/products/rstudio/download/

インストールが終わったら、RStudioを起動して、以下のコマンドを実行してパッケージをインストールしておいてね。

install.packages(c("rvest", "httr", "tidyverse"))

これで、RとRStudioの環境設定が完了し、データ収集と前処理を始められるわ!

データの前処理ってなんでひつようなのかニャ?


マチコ先生: ニャー助、データ分析をする前に、データの前処理が必要な理由を知ってる?

ニャー助: う~ん、そうだにゃ。データの前処理をしないと、分析結果が正確じゃなくなっちゃうんだよね?

マチコ先生: そうなの!データはそのままだと、欠損値があったり、外れ値があったり、不要な情報が含まれていたりすることがあるわ。だから、前処理をしてデータを整えることで、分析の精度を高めることができるのよ。

ニャー助: なるほどにゃ。じゃあ、前処理をしっかりやって、ちゃんとした分析結果を出せるように頑張るにゃ!

マチコ先生: そういうところが、ニャー助のいいところね。これからも一緒にデータサイエンスの勉強を頑張ろう!

ニャー助: ほめられるとやる気が出るニャ!

マチコ先生: (よしよし)

データの前処理を学ぼうニャ!欠損値の処理だニャ!

マチコ先生: では、tidyverseを使ったデータ前処理の例を見てみましょう。

library(tidyverse)

# データの読み込み
data <- read_csv("example.csv")

# 欠損値の処理
data <- data %>% drop_na()

# 外れ値の処理
data <- data %>% filter(column_name < upper_limit, column_name > lower_limit)

# 列の選択
data_selected <- data %>% select(column1, column2, column3)

この例では、CSVファイルからデータを読み込んで、欠損値を削除し、外れ値をフィルタリングし、特定の列を選択しているわ。

ニャー助: 欠損値の処理・・いきなりむつかしくなったニャ!

マチコ先生: あ、ごめん。欠損値の処理についてもっと詳しく説明するわね。欠損値は、データに存在しない値のことで、さまざまな理由で発生することがあるわ。欠損値をそのままにしておくと、データ解析の結果が正確でなくなることがあるから、適切な処理が必要なのよ。

それでは、マーケティングデータを例に、実際の欠損値の処理を見てみましょう。ニャー助、このフェイクのマーケティングデータを使って練習しましょう!下記に示すデータは、架空のオンラインショップの顧客情報と購入履歴データです。欠損値も含まれているので、注意してね。

# フェイクマーケティングデータ

customer_id,age,gender,location,product_id,category,price,purchase_date
1,25,F,Tokyo,101,Fashion,3000,2023-01-01
2,30,M,Osaka,102,Electronics,15000,2023-01-02
3,22,F,Nagoya,103,Sports,8000,2023-01-04
4,45,M,Kyoto,104,Beauty,12000,2023-01-06
5,34,F,Fukuoka,105,Home,5000,2023-01-08
6,28,M,Sendai,106,Kids,2500,2023-01-09
7,39,F,Sapporo,107,Books,1800,2023-01-10
8,,M,Hiroshima,108,Fashion,4000,2023-01-12
9,52,F,,109,Electronics,13000,2023-01-15
10,47,M,Kobe,110,Sports,10000,2023-01-17

マチコ先生:ニャー助、このフェイクデータを使ってデータの前処理をやってみましょう!まずはデータを見て、どんな欠損値があるか確認してみてね。

ニャー助:うん、見てみるにゃ。おっと、customer_idが8の人の年齢がないにゃ。それからcustomer_idが9の人の住んでる場所が分からないにゃ。

マチコ先生:いいね、ニャー助。では、欠損値の処理方法を一緒にやってみましょう。今回は、年齢の欠損値には平均値を使って埋め、場所の欠損値には「不明」という文字列で埋めることにしましょう。

ニャー助:わかったにゃ。やってみるにゃ。

マチコ先生:それぞれの方法をRで実行するコードも教えてあげるね。

ニャー助:おお、ありがたいにゃ!

マチコ先生:欠損値の削除は、リストワイズ削除とペアワイズ削除があるよ。リストワイズ削除では、欠損値が含まれる行をすべて削除する方法で、こんな感じのコードになるわ。

data <- na.omit(data)

ペアワイズ削除では、欠損値が含まれる列を削除する方法で、こういうコードになるの。

data <- data[, !is.na(data)]

ニャー助:なるほど、それで欠損値を削除できるんだにゃ。

マチコ先生:そう!それから、欠損値の補完は平均値、中央値、最頻値での補完が一般的よ。例えば、年齢の欠損値を平均値で補完するには、こんなコードを使うわ。

data$age[is.na(data$age)] <- mean(data$age, na.rm = TRUE)

中央値や最頻値での補完も同じようにできるの。中央値はmedian()、最頻値はMode()関数を使うだけよ。

ニャー助:おお、なるほど!これで欠損値の処理ができるにゃ。

マチコ先生:まとめると、欠損値の処理方法には、主に次の3つがあるわ。データや状況に応じて適切な方法を選んでね。

  1. 欠損値を含む行や列を削除する(リストワイズ削除やペアワイズ削除)

  2. 欠損値を他の値で置き換える(代入法)

  3. 欠損値を予測するモデルを作成して、そのモデルで欠損値を埋める(多重代入法)


今回は1と2をしました。3のように欠損値の補完に予測モデルを使う方法もあるけど、今回は簡単な方法で大丈夫。これでデータの前処理ができるね!

ニャー助: なるほど、欠損値の処理には色々な方法があるんだにゃ。これでデータをきれいにできるにゃ。

前処理を学ぼうニャ!外れ値の処理もあるニャ!

マチコ先生:ニャー助、欠損値だけじゃないの。データ分析の前処理でもうひとつ大切なことは、外れ値の処理だよ。外れ値って知ってる?ニャー助。

ニャー助:うーん、ちょっと聞いたことあるけど、よくわからないニャ。

マチコ先生:外れ値は、データの中で異常に大きかったり、小さかったりする値のことを言うよ。これを適切に処理しないと、データ分析の結果がおかしくなることがあるんだ。

ニャー助:なるほどニャ。じゃあ、どうやって外れ値を見つけるんだニャ?

マチコ先生:いろんな方法があるけど、よく使われるのは四分位範囲(IQR)という方法だね。データを小さい順に並べたときに、25%、50%、75%の位置にある値をそれぞれ第1四分位数、第2四分位数(中央値)、第3四分位数と言うんだ。そして、第3四分位数から第1四分位数を引いた値がIQRになるよ。

ニャー助:へー、それでどうやって外れ値を見つけるんだニャ?

マチコ先生:IQRを使って、第1四分位数から1.5IQRを引いた値より小さいもの、または第3四分位数に1.5IQRを足した値より大きいものを、外れ値とみなすことが多いよ。

ニャー助:おお、なんとなくわかったニャ。でも、外れ値を見つけたらどうするんだニャ?

マチコ先生:外れ値を見つけたら、その値を除外したり、他の値で置き換えたり、あるいはその値を修正する方法があるよ。どの方法を使うかは、データの性質や目的によって変わるけどね。

ニャー助:ふむふむ、外れ値の処理って大事だねニャ。じゃあ、具体的にプログラムでどう処理するニャ?

マチコ先生:ハンズオンな姿勢がいいね、ニャー助!Rで外れ値処理をする例を見ていこうね。まずはフェイクデータを作成するよ。

# ライブラリをインポート
library(dplyr)

# 乱数のシードを設定(再現性のため)
set.seed(123)

# フェイクデータを生成 (1〜100の整数を30個ランダムに生成)
data <- data.frame(value = sample(1:100, 30, replace = TRUE))

# 外れ値を追加 (500という大きな値を1つ追加)
data <- rbind(data, data.frame(value = 500))

ニャー助:データができたニャ!外れ値を見つけるにゃ!

マチコ先生:じゃあ、IQRを使って外れ値を見つけるコードを書いてみるね。

# 四分位数を計算
Q1 <- quantile(data$value, 0.25)
Q3 <- quantile(data$value, 0.75)

# IQRを計算
IQR <- Q3 - Q1

# 外れ値の範囲を計算
lower_bound <- Q1 - 1.5 * IQR
upper_bound <- Q3 + 1.5 * IQR

# 外れ値を特定
outliers <- data %>% filter(value < lower_bound | value > upper_bound)

ニャー助:外れ値が見つかったニャ!これでどう処理するニャ?

マチコ先生:今回は外れ値を除外する方法で処理してみるね。

# 外れ値を除外
data_clean <- data %>% filter(value >= lower_bound & value <= upper_bound)

これで、外れ値を除外したデータが得られたよ。もちろん、外れ値を他の値で置き換えたり、修正する方法もあるけど、今回は簡単な例で説明したかったからね。

ニャー助:なるほど、外れ値処理ができるんだニャ!

マチコ先生: そうよ、データをきれいにしておくことで、解析の精度が上がることもあるから、ぜひ覚えておいてね。これからもっとデータ解析のスキルを身につけていくわよ。次回はデータの可視化について学びましょうね。

ニャー助: たのしみにゃ!じゃあ、昼寝するにゃーーzzz

マチコ先生:(うーん、ニャー助はいつ学んでいるのかな・・?)



◆ツイッターでマチコ先生とニャー助が学ぶデータサイエンスの最新記事のお知らせをしています。

https://twitter.com/ProfX_US

この記事が気に入ったらサポートをしてみませんか?