survey <- readr::read_csv("mock_survey.csv", show_col_types = FALSE)データの前処理
1 目的
このページでは、データの前処理を練習します。データの前処理とは、分析の目的に合わせてデータを整える作業です。成人1,000人の生活や仕事についての架空の回答を使い、次の4つの作業を行います。
- 分析に使う質問の列を選ぶ。
- 範囲外の値や欠測(回答が記録されていない箇所)を含む行を除く。
- 逆転項目(他の質問と意味の向きが逆になっている質問)の回答の向きをそろえる。
- ある条件にあてはまる人を区別する変数を作る。
作業は、次の順に進めます。
- どの列を使い、どのような変数を作るかを決める。
- 決めた内容をAIに伝えて、Rコードを作ってもらう。
- コードを実行し、結果が決めた内容どおりかを確かめる。
最後に、欠測を含む小さな例で、どの人が分析から外れるかも確認します。
2 準備
ここでは、模擬調査データを使います。CSVとコードブックを授業用フォルダに保存してください。コードブックには、変数名、質問文、回答の選択肢が書かれています。
このページでは、tidyverseに含まれるreadrとdplyrを使います。tidyverseをまだインストールしていない場合は、RとPositronのセットアップの「パッケージの導入」で手順を確認してください。
- mock_survey.csvをダウンロードし、ファイル名を変えずに保存してください。
- Positronで授業用フォルダを開き、Rスクリプトを作成してください。操作はRとPositronのセットアップで確認できます。
- 次のコードをRスクリプトに書いて実行し、CSVを読み込んでください。読み込んだデータは
surveyに保存されます。
続いて、行数と列数を調べる dim() を実行してください。
dim(survey)[1] 1000 25
出力の1つ目の数字が行数、2つ目が列数です。1,000人分の回答が25列に入っています。
このCSVには欠測がありません。欠測の扱いは、第8節(欠測を含む例)で別の小さな架空データを使って練習します。
3 分析の仕様を言葉にする
どの列を選び、どの変数を作るかは、分析で何を調べたいかで決まります。ここでは、次の問いを調べる準備をする場合を考えてみましょう。
働いている人と働いていない人とで、頼れる人がいると感じる程度は違うか。
この問いに答えるには、データを次の2点で整える必要があります。
- 社会的サポートの回答の向きをそろえる。質問によって、点数が高いほど「頼れる人がいる」を表す場合と、「頼れる人がいない」を表す場合があります。向きが混ざったままでは、質問どうしを比べたり、平均して1つの得点にまとめたりできません。
- 働いているかどうかを0と1で表す。就業区分の列
employment_statusには4種類の値がありますが、今回の問いでは「働いている」と「働いていない」の2グループに分けられれば十分です。回帰分析では、このような0/1の列を使って2グループの平均を比べます。
このページで行うのは、比較の準備としてデータを整えるところまでです。0/1の列を使って2つのグループの平均を比べる方法は、単回帰モデルの「2群の平均差とダミー変数」で説明しています。そのページでは別の実験データを使いますが、2つのグループを0と1で表す考え方は同じです。
取り出す列
CSVの25列のうち、問いに必要な次の4列だけを取り出します。列を絞ると、処理前後の出力を見比べやすくなります。
| 列名 | 取り出す理由 |
|---|---|
id |
回答者番号。処理後の行が元データのどの人かを照合するために残す |
employment_status |
就業区分。0/1の列を作る元になる |
support_1 |
社会的サポートの1番の質問。向きがそろった質問の例 |
support_5 |
社会的サポートの5番の質問。逆転項目の例 |
社会的サポートの質問は5つありますが、逆転処理の練習には、向きがそろった質問と逆転項目が1つずつあれば足ります。実際に社会的サポートの得点を求めるときは、コードブックのとおり5つの質問すべてを使います。
逆転項目をそろえる
support_1 と support_5 の質問文を読み比べてください。
| 列名 | 質問文 |
|---|---|
support_1 |
困ったときに相談に乗ってくれる人がいる。 |
support_5 |
悩みがあっても、頼れる人がいない。 |
どちらも1が「まったくあてはまらない」、5が「とてもよくあてはまる」です。同じ5という回答でも、2つの質問では意味が反対になります。
support_1に5と答えた人は、頼れる人がいると感じています。support_5に5と答えた人は、頼れる人がいないと感じています。
support_5 のように、他の質問と意味の向きが逆になっている質問を逆転項目と呼びます。向きをそろえるには、support_5 の1、2、3、4、5を、それぞれ5、4、3、2、1に置き換えます。この処理を逆転処理と呼びます。今回は次のように処理します。
6 - support_5を計算し、点数が高いほど頼れる人がいると感じる向きにそろえる。- 計算結果は新しい列
support_5_rに入れ、元のsupport_5も残す。
0/1の列を作る
ある条件にあてはまるときに1、あてはまらないときに0をとる変数を、ダミー変数と呼びます。今回は、就業区分から次の employed を作ります。
employment_status の値 |
employed |
|---|---|
regular(正規雇用) |
1 |
nonregular(非正規雇用) |
1 |
self_employed(自営業等) |
1 |
not_employed(非就業) |
0 |
1と0に何を対応させるかは、変数を作る前に決めておきます。
残す行
変数を作る前に、使う回答が有効な値かも確認します。範囲外の値や欠測が混ざったまま計算すると、逆転処理や0/1の列が意味のない値になるためです。今回は、support_1 と support_5 がともに1〜5で、就業区分が上の表の4種類のいずれかである人だけを残します。
Rでは、このような条件を条件式で書きます。AIが出したコードの条件を読むときは、次の折りたたみを参照してください。
仕様の一覧
ここまでに決めたことを表にまとめます。第4節(AIへの指示例)では、この表をもとにAIへの指示を書きます。
| 項目 | 今回の仕様 |
|---|---|
| 元データ | survey。変更せずに残す |
| 取り出す列 | 回答者番号 id、employment_status、support_1、support_5 |
| 残す行 | 2つの回答がともに1〜5で、就業区分が下記4種類のいずれかである行 |
| 就業区分の値 | regular、nonregular、self_employed、not_employed |
| 逆転処理 | support_5_r = 6 - support_5。1〜5を5〜1に対応させる |
| 就業の指標 | employed。前の3区分なら1、not_employed なら0 |
| 保存先 | 新しいデータフレーム prepared。元の4列と追加した2列を残す |
| 確認する出力 | 処理前後の人数、逆転前後の対応、就業区分と0/1の対応 |
このデータでは全員が条件を満たすので、処理後も1,000人が残るはずです。人数が減った場合は、次の2点を確かめてください。
- AIが余分な条件を付けていないか。
- 読み込んだデータが配布したCSVと同じか。
4 AIへの指示例
AIには、ここまでに決めた処理のRコードを書いてもらいます。CSVや回答者ごとの値は渡さず、次の内容を伝えてください。
- 使う列と、その値の意味
- 残す行の条件
- 作る変数
- 確認したい出力
「社会的サポートのデータをきれいにして」だけでは、どの列を使い、どの行を残すかが伝わりません。
AIが出したコードは、CSVを読み込むコードの後に貼り付け、順番に実行してください。第5節(参照コードと出力)のコードと書き方が違っても、仕様どおりに処理できていれば構いません。
5 参照コードと出力
自分で実行してから、次のコードと出力を開いて照合してください。
6 検証チェックリスト
コードが最後まで動いても、条件が正しいとは限りません。人数に加えて、変換前後の値の組み合わせを確認しましょう。例えば 5 - support_5 と書いてもエラーは出ませんが、結果は0〜4になり、今回の仕様から外れます。
7 結果の解釈
今回の処理では、4列を選び、2列を追加しました。全員が条件を満たしたので、人数は1,000人のままです。追加した2列は、次のように読みます。
support_5_r:高いほど、頼れる人がいると感じていることを表します。例えば、元の質問「悩みがあっても、頼れる人がいない」に2と答えた人は4になります。1つの質問の点数であり、5つの質問をまとめた尺度得点ではありません。employed:1は、正規雇用、非正規雇用、自営業等のいずれかであることを表します。正規雇用だけを表す変数ではありません。
この模擬データには、非就業でも年収がある人がいます。年収が0かどうかで就業を判定すると、ここで決めた定義とは別の変数になります。
8 欠測を含む例
ここからは、欠測や特殊なコードを含むデータの処理を、6人分の小さな架空データで練習します。先ほどの survey とは別のデータです。
2つの質問 item_a と item_b の値は、次の意味だと決めておきます。
- 1〜5:有効な回答
- 9:「わからない」
NA:回答が記録されていない(NAはRで欠測を表す値)
9は数値として保存されています。意味を知らずに平均を計算すると、9が有効な点数に混ざってしまいます。
まず、次のコードを実行して、6人分のデータ example を作ってください。
example <- data.frame(
id = 1:6,
item_a = c(1, 2, 9, 4, NA, 5),
item_b = c(5, NA, 3, 2, 1, 9)
)
example id item_a item_b
1 1 1 5
2 2 2 NA
3 3 9 3
4 4 4 2
5 5 NA 1
6 6 5 9
今回は、2つの回答がともに1〜5の人だけを残します。AIにコードを頼むときは、有効な値に加えて、9と NA がそれぞれ何を表すかも伝えてください。
有効な値の範囲を伝えずに「欠測を除いて」とだけ頼むと、NA だけを除き、9を残すコードが返ってくることがあります。1〜5の回答だけを使うことを必ず伝えましょう。
指示例をAIに送り、返ってきたコードを実行する前に、先ほど表示した example の表を見て、残る人の id を予想してください。実行した後は、次の参照コードと出力で確認します。
残す行の条件を書くときに、起こりやすい誤りが2つあります。
- 一部の列にしか条件を付けない。例えば
item_a %in% 1:5だけを条件にすると、item_bがNAのID 2と、9のID 6が残ってしまいます。 - 使わない列の欠測まで、除外の理由にする。例えば、列を指定せずに「欠測のある行を除いて」とAIに頼むと、どこか1つの列でも
NAがある行をすべて除くコードが返ってくることがあります。実際の調査データには多くの列があるため、今回の分析で使わない質問に答えていないだけの人まで除かれてしまいます。
どちらの誤りも、どの列について、どの値を有効とするかを指定すれば防げます。
なお、除外した人数を数えるのは、コードが決めたとおりに動いたかを確かめるためです。そもそも除外してよいかどうかは別の問題で、第9節(練習問題)で考えます。
9 練習問題
別の質問で処理する
ストレスの質問を使って、ここまでと同じ処理をしてみましょう。使う2つの列と質問文は、次のとおりです。
| 列名 | 質問文 |
|---|---|
stress_1 |
やるべきことに追われていると感じる。 |
stress_5 |
気持ちに余裕を持って過ごせている。 |
どちらも、1が「まったくあてはまらない」、5が「とてもよくあてはまる」を表します。
survey から id、stress_1、stress_5 の3列を選び、次の処理を行ってください。まず仕様を言葉にし、AIにコードを依頼してから実行します。
- 2つの回答がともに1〜5の行を残す。
- 逆転項目
stress_5を6から引き、stress_5_rを追加する。 stress_1が4または5なら1、1〜3なら0をとるstress_1_highを追加する。- 結果を
stress_preparedに保存し、行数・列数、逆転前後と0/1の対応を表示する。
処理結果を説明する
前の問題で作った stress_prepared と、欠測を含む例について、次の問いに答えてください。
stress_1_high = 1の人は何人ですか。stress_1の回答ごとの人数と照らし合わせて確かめてください。stress_1の5段階を0と1にまとめると、区別できなくなる回答があります。どの回答とどの回答か、例を挙げて説明してください。- 欠測を含む例では、6人から2人に減りました。このことを「データの質が改善した」と説明してよいでしょうか。
AIが出したコードを点検する
欠測を含む例で、2つの回答がともに1〜5の人を残したいと伝えたところ、次のコードが返ってきました。このコードでは誰が残りますか。仕様との違いを説明し、修正してください。
example |>
dplyr::filter(item_a %in% 1:5 | item_b %in% 1:5)最終更新: 2026-10-05