![見出し画像](https://assets.st-note.com/production/uploads/images/103861021/rectangle_large_type_2_368cee3236bd9bcf0a93af28eb9d36eb.png?width=1200)
#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のように欠損値の補完に予測モデルを使う方法もあるけど、今回は簡単な方法で大丈夫。これでデータの前処理ができるね!
ニャー助: なるほど、欠損値の処理には色々な方法があるんだにゃ。これでデータをきれいにできるにゃ。
前処理を学ぼうニャ!外れ値の処理もあるニャ!
マチコ先生:ニャー助、欠損値だけじゃないの。データ分析の前処理でもうひとつ大切なことは、外れ値の処理だよ。外れ値って知ってる?ニャー助。
ニャー助:うーん、ちょっと聞いたことあるけど、よくわからないニャ。
マチコ先生:外れ値は、データの中で異常に大きかったり、小さかったりする値のことを言うよ。これを適切に処理しないと、データ分析の結果がおかしくなることがあるんだ。
ニャー助:なるほどニャ。じゃあ、どうやって外れ値を見つけるんだニャ?
マチコ先生:いろんな方法があるけど、よく使われるのは四分位範囲(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
マチコ先生:(うーん、ニャー助はいつ学んでいるのかな・・?)
◆ツイッターでマチコ先生とニャー助が学ぶデータサイエンスの最新記事のお知らせをしています。