2025年度 経済データ分析演習B2
2025-10-18
出席登録は13:00から14:30まででに登録してください
出席番号
886804340
クラスコード
gsrnanuj
第5回講義フォルダ作成
新規Colabの作成
ファイル名の変更
※ 重要:日本語以外はすべて半角であることが望ましい(例えば#やスペースなど)
マウント
実行
アクセスの許可
マウントの状況のチェック
Rへの変更
Driveのデータをインポート
id Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9
1 1 同意します ゼミⅢ 男性 21 7月 3年 経済学部 留学生ではない。 3
2 2 同意します seminar 3 女性 24 2月 3年 経済学部 留学生である。 9
3 3 同意します ゼミ3 男性 22 1月 3年 経済学部 留学生である。 7
4 4 同意します ゼミナール IIIB 男性 20 3月 3年 経済学部 留学生ではない。 8
5 5 同意します ゼミナール 女性 21 1月 4年 経済学部 留学生ではない。 8
6 6 同意します 環境リテラシーB 男性 18 3月 1年 経済学部 留学生ではない。 6
Q10 Q11 Q12 Q13 Q14 Q15
1 3 1 あまりよくない ときどきあった よくあった ときどきあった
2 9 10 まあよい ほとんどなかった 全くなかった 全くなかった
3 10 10 よい 全くなかった 全くなかった 全くなかった
4 6 7 よい 全くなかった 全くなかった 全くなかった
5 5 6 よい 全くなかった 全くなかった 全くなかった
6 8 8 まあよい よくあった 全くなかった ときどきあった
Q16 Q17 Q18 Q19
1 よくあった よくあった ときどきあった ときどきあった
2 ときどきあった ときどきあった 全くなかった 全くなかった
3 よくあった 全くなかった 全くなかった 全くなかった
4 全くなかった 全くなかった 全くなかった 全くなかった
5 全くなかった 全くなかった 全くなかった 全くなかった
6 ほとんどなかった よくあった ほとんどなかった ほとんどなかった
Q20 Q21 Q22 Q23 Q24
1 よくあった よくあった 5.0 8.0 賃貸住宅
2 全くなかった ほとんどなかった 8.0 8.0 賃貸住宅
3 全くなかった ほとんどなかった 6.0 10.0 賃貸住宅
4 全くなかった ときどきあった 5.0 5.0 持ち家(家族や親戚が所有している家)
5 ときどきあった ときどきあった 5.5 6.5 賃貸住宅
6 ほとんどなかった 全くなかった 8.0 8.0 賃貸住宅
Q25 Q26 Q27 Q28 Q29 Q30 Q31 Q32
1 7.0 2 30年以上 一人暮らし 東京都 埼玉県 両方ある
2 8.7 1 5年未満 友人 東京都 東京都 バス停
3 5.3 2 10から20年未満 寮 東京都 東京都 両方ある
4 NA NA 家族 オフィスワーク中心 千葉県 千葉県 両方ある
5 7.0 1 5年未満 一人暮らし 東京都 福島県 駅
6 6.5 1 10から20年未満 一人暮らし 東京都 山形県 両方ある
Q33 Q34 Q35 Q36 Q37 Q38 Q39 Q40 Q41 Q42
1 5 電車 30分未満 3 1 1 1 4 10 2以上3未満
2 3 電車 30分以上1時間未満 2 4 3 5 5 6 3以上4未満
3 3分 徒歩 30分未満 6 5 4 5 5 24 3以上4未満
4 5 電車 1時間以上1時間30分未満 2 4 4 4 5 7 3以上4未満
5 5 電車 30分未満 1 3 3 3 3 2 3以上4未満
6 5 電車 30分未満 5 3 4 4 2 24 4以上
Q43 Q44 Q45 Q46 Q47 Q48 Q49 Q50 Q51
1 所属していない いいえ 0 0 18 20 している 東京都
2 所属していない はい 進学前から決めていた 14 0 20 6 している 東京都
3 所属している はい 進学前から決めていた 24 24 0 10 していない
4 所属していない いいえ 5 10 6 10 している 千葉県
5 所属していない はい 就職活動 5 0 15 10 している 東京都
6 所属している はい 進学前から決めていた 10 5 10 60 している 東京都
Q52 Q53
1 飲食・フード(レストラン・居酒屋・カフェ等) 1100
2 飲食・フード(レストラン・居酒屋・カフェ等) 1100
3 NA
4 販売・接客・サービス(コンビニ・レジ・書店・ガソリンスタンド等) 1000
5 販売・接客・サービス(コンビニ・レジ・書店・ガソリンスタンド等) 1045
6 販売・接客・サービス(コンビニ・レジ・書店・ガソリンスタンド等) 1150
Q54
1 生活費のため;日常の娯楽・嗜好品のため
2 生活費のため
3
4 社会経験を養うため
5 生活費のため;学費のため;日常の娯楽・嗜好品のため
6 生活費のため;日常の娯楽・嗜好品のため;高額商品購入(自動車、パソコンなど)のため
Q55 Q56 Q57 Q58 Q59 Q60 Q61 Q62 Q63 Q64 Q65 Q66 Q67 Q68 Q69 Q70 Q71
1 8 11 70 30 0 0 10 90000 5 10 10 10 10 5 いいえ NA NA
2 8 16 50 50 25 2 0 160000 60 5 10 5 10 5 はい 1.0 5
3 NA 10 NA 80 NA NA 20 50000 50 10 0 3 0 4 はい 0.5 6
4 2 4 50 50 0 0 50 20000 20 10 30 10 10 5 はい 1.0 5
5 7 15 70 20 10 0 0 15 30 10 25 5 10 10 いいえ NA NA
6 4 4 100 4 7 50 60 4 50 30 10 20 40 0 いいえ NA NA
Q72 Q73 Q74 Q75 Q76 Q77
1 NA それ以上 twitter
2 ロールプレイング ロールプレイング 0 減らしたい それ以上 instagram
3 シミュレーション シミュレーション 0 このままでいい それ以上 instagram
4 アクション;スポーツ アクション 0 このままでいい 無制限 instagram
5 NA 無制限 instagram
6 NA 6 instagram
Q78 Q79 Q80
1 500 60 1000
2 301 0 4000
3 200 30 1000
4 150 50 1000
5 400 50 1000
6 250 60 0
| 種類 | Description |
|---|---|
| 量的:連続型 | 連続的な値をとるデータ(例:価格、消費額 etc.) |
| 量的:離散型 | 個数、回数など決まった値をとる(例:人数、日数 etc.) |
| 質的 | 数字で表せない情報を示す(例:性別、学籍番号 etc.) |
| 尺度 | Description |
| 比率尺度 | 数の比が意味を持ち、乗除が可能(例:距離、金額 etc.) |
| 間隔尺度 | 数字の間隔が意味を持ち、加減が可能(例:温度、年代 etc.) |
| 順序尺度 | 大小関係に意味があり、加減乗除に意味がない(例:満足度 etc.) |
| 名義尺度 | 観測対象の情報を数にしている(例:性別、学年 etc.) |
# Q3の性別データを確認する
# factor関数で文字列データをデータ内部で数値(レベル)として扱う
# summaryで度数が表示可能となる
data |>
select(Q3) |> # 文字列データを選択
mutate(across(everything(), factor)) |> # mutate&factor関数を使って、内部で数値として扱う
# acrossは、複数列を一括で指定する関数であり、across(指定したい列(変数名), その列に適用したい関数)となります。
# ここでは、上記select関数で指定しているので、全ての列に対して、factor関数を適用していることになります
summary() Q3
: 1
回答しない: 1
女性 :133
男性 :163
# Q3性別とQ12健康状態のデータを確認する
data |>
select(Q3, Q12) |>
mutate(across(everything(), factor)) |>
summary() Q3 Q12
: 1 : 1
回答しない: 1 あまりよくない: 31
女性 :133 ふつう : 70
男性 :163 まあよい :106
よい : 87
よくない : 3
# Q56所得、Q62支出のデータを確認する
# どちらも量的な連続変数です
data |>
get_summary_stats(
Q56, Q62, # 計算をする変数を指定
type = "common") # 利用する統計量を指定(基本は"common"で良い)# A tibble: 2 × 10
variable n min max median iqr mean sd se ci
<fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Q56 297 0 100 8 5 8.85 7.62 0.442 0.87
2 Q62 297 0 300000 10000 39993 24802. 39371. 2285. 4496.
ダミー変数(バイナリ変数)
カテゴリー変数
### 使用変数
Q1:アンケートへの同意(質的変数)
Q3:性別(質的変数)
Q4:年齢(離散変数)←平均の計算では小数点も重要になるので、実は連続変数ですが、今回は離散変数とします
Q5:誕生月(質的変数)
Q6:学年(質的変数)
Q7:学部(質的変数)
Q8:留学生(質的変数)
Q9:最近1週間の幸福度(離散変数)
Q10:最近1年間の幸福度(離散変数)
Q11:これまでの幸福度(離散変数)
Q12:健康状態(質的変数)
Q22:平日の睡眠時間(連続変数)
Q28:同居関係(質的変数)
Q35:通学時間(質的変数)
Q42:GPA(質的変数)
Q56:所得(万円)(連続変数)
Q62:支出(円)(連続変数)演習問題(1):質的変数と連続変数のデータの特徴をまとめなさい
df <- data |>
filter(Q1=="同意します") |> #アンケートに同意しているサンプルのみ抽出
mutate(dum_female = case_when(Q3 == "女性" ~ 1, #女性を1、男性を0とするダミー変数(回答しないの行は欠損値に)
Q3 == "男性" ~ 0,
TRUE ~ NA_real_)) |> # データの欠損値とする場合は、"NA_real_"とする
mutate(dis_age = Q4) |> #年齢の離散変数
mutate(cat12_birth = case_when(Q5 == "1月" ~ 1,
Q5 == "2月" ~ 2,
Q5 == "3月" ~ 3,
Q5 == "4月" ~ 4,
Q5 == "5月" ~ 5,
Q5 == "6月" ~ 6,
Q5 == "7月" ~ 7,
Q5 == "8月" ~ 8,
Q5 == "9月" ~ 9,
Q5 == "10月" ~ 10,
Q5 == "11月" ~ 11,
Q5 == "12月" ~ 12,
TRUE ~ NA_real_)) |> # 誕生月をカテゴリー変数に変換
mutate(cat5_grade = case_when(Q6 == "1年" ~ 1,
Q6 == "2年" ~ 2,
Q6 == "3年" ~ 3,
Q6 == "4年" ~ 4,
TRUE ~ 5)) |> # 学年のカテゴリー変数
mutate(dum_econ = if_else(Q7 == "経済学部", 1, 0)) |> #経済学部を1、それ以外を0とするダミー変数
mutate(dum_exstud = if_else(Q8 == "留学生である。", 1, 0)) |> # 留学生を1とし、それ以外を0とするダミー変数
mutate(dis_happy_wk = Q9,
dis_happy_yr = Q10,
dis_happy_lf = Q11) |> #幸福度の離散変数
mutate(cat5_health = case_when(Q12 == "よくない" ~ 1,
Q12 == "あまりよくない" ~ 2,
Q12 == "ふつう" ~ 3,
Q12 == "まあよい" ~ 4,
Q12 == "よい" ~ 5)) |> #健康状態のカテゴリー変数(順序尺度)
mutate(con_sleep_wd = Q22) |> # 平日の睡眠時間の連続変数
mutate(dum_live_single = if_else(Q28 == "一人暮らし", 1, 0)) |> #一人暮らしを1、それ以外を0とするダミー変数
mutate(cat5_commut_time = case_when(Q35 == "30分未満" ~ 1,
Q35 == "30分以上1時間未満" ~ 2,
Q35 == "1時間以上1時間30分未満" ~ 3,
Q35 == "1時間30分以上2時間未満" ~ 4,
Q35 == "2時間以上3時間未満" ~ 5)) |> # 通学時間をfactor関数でカテゴリー変数に変換
mutate(cat5_gpa = case_when(Q42 == "1未満" ~ 1,
Q42 == "1以上2未満" ~ 2,
Q42 == "2以上3未満" ~ 3,
Q42 == "3以上4未満" ~ 4,
Q42 == "4以上" ~ 5)) |> #GPAをfactor関数でカテゴリー変数に変換
mutate(con_income = if_else(Q56>=70, NA_real_, Q56)) |> #所得の連続変数(70万以上は欠損値扱い)
mutate(con_consump = case_when(Q62 >= 5000 ~ Q62/10000, #5000以上は単位を万円にするために「/10000」とする
Q62 >= 50 & Q62 < 5000 ~ NA_real_, #50以上5000未満は欠損値扱い
TRUE ~ Q62)) |> #上記以外はそのまま採用 -> 支出の連続変数
select(-starts_with("Q")) #idとQ1-Q80以外の作成した変数を残す。starts_with("Q")は頭文字がQから始まる変数のすべてということである。また、前に"-"をつけることで、この変数は選択しないことを意味する
head(df) id dum_female dis_age cat12_birth cat5_grade dum_econ dum_exstud dis_happy_wk
1 1 0 21 7 3 1 0 3
2 2 1 24 2 3 1 1 9
3 3 0 22 1 3 1 1 7
4 4 0 20 3 3 1 0 8
5 5 1 21 1 4 1 0 8
6 6 0 18 3 1 1 0 6
dis_happy_yr dis_happy_lf cat5_health con_sleep_wd dum_live_single
1 3 1 2 5.0 1
2 9 10 4 8.0 0
3 10 10 5 6.0 0
4 6 7 5 5.0 0
5 5 6 5 5.5 1
6 8 8 4 8.0 1
cat5_commut_time cat5_gpa con_income con_consump
1 1 3 11 9
2 2 4 16 16
3 1 4 10 5
4 3 4 4 2
5 1 4 15 15
6 1 5 4 4
select関数の指定
v1, v2, v3, w1, w2, w3のオブジェクトが格納されているデータがあるとします
v1, v2, v3というオブジェクトを選択(それ以外は選択しない)
# A tibble: 17 × 7
variable n mean median sd min max
<fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 id 297 149. 149 86.3 1 298
2 dum_female 296 0.449 0 0.498 0 1
3 dis_age 297 19.9 20 1.61 18 27
4 cat12_birth 297 6.48 7 3.32 1 12
5 cat5_grade 297 1.91 2 1.03 1 5
6 dum_econ 297 0.391 0 0.489 0 1
7 dum_exstud 297 0.061 0 0.239 0 1
8 dis_happy_wk 297 5.53 6 2.77 0 10
9 dis_happy_yr 297 5.48 6 2.52 0 10
10 dis_happy_lf 297 6.01 6 2.52 0 10
11 cat5_health 297 3.82 4 1.00 1 5
12 con_sleep_wd 297 6.31 6 1.14 2 10
13 dum_live_single 297 0.259 0 0.439 0 1
14 cat5_commut_time 297 2.44 2 0.995 1 5
15 cat5_gpa 297 3.84 4 0.764 1 5
16 con_income 296 8.54 8 5.48 0 30
17 con_consump 285 5.60 5 4.93 0 34
gt関数 - 表化に特化した関数
## 最後にgt()とつけるときれいな表を作成してくれます。
## その場合は新たなオブジェクトに代入してください。
## また、tab_header関数で表のタイトル、fmt_number関数で指定した変数のフォーマット(小数点)を設定
stat <- get_summary_stats(df, show = c("n", "mean", "median", "sd", "min", "max")) |>
gt() |>
tab_header(
title = "Table 1", # タイトル
subtitle = md("記述統計量")) |> # サブタイトル
fmt_number(
columns = -c("n"), # c()の前にマイナスをつけることで、n以外の列を小数点第3位とします.
decimals = 3) # 小数点第3位まで| Table 1 | ||||||
|---|---|---|---|---|---|---|
| 記述統計量 | ||||||
| variable | n | mean | median | sd | min | max |
| id | 297 | 149.461 | 149.000 | 86.312 | 1.000 | 298.000 |
| dum_female | 296 | 0.449 | 0.000 | 0.498 | 0.000 | 1.000 |
| dis_age | 297 | 19.896 | 20.000 | 1.611 | 18.000 | 27.000 |
| cat12_birth | 297 | 6.478 | 7.000 | 3.317 | 1.000 | 12.000 |
| cat5_grade | 297 | 1.906 | 2.000 | 1.035 | 1.000 | 5.000 |
| dum_econ | 297 | 0.391 | 0.000 | 0.489 | 0.000 | 1.000 |
| dum_exstud | 297 | 0.061 | 0.000 | 0.239 | 0.000 | 1.000 |
| dis_happy_wk | 297 | 5.529 | 6.000 | 2.774 | 0.000 | 10.000 |
| dis_happy_yr | 297 | 5.475 | 6.000 | 2.519 | 0.000 | 10.000 |
| dis_happy_lf | 297 | 6.013 | 6.000 | 2.523 | 0.000 | 10.000 |
| cat5_health | 297 | 3.818 | 4.000 | 1.004 | 1.000 | 5.000 |
| con_sleep_wd | 297 | 6.309 | 6.000 | 1.138 | 2.000 | 10.000 |
| dum_live_single | 297 | 0.259 | 0.000 | 0.439 | 0.000 | 1.000 |
| cat5_commut_time | 297 | 2.441 | 2.000 | 0.995 | 1.000 | 5.000 |
| cat5_gpa | 297 | 3.845 | 4.000 | 0.764 | 1.000 | 5.000 |
| con_income | 296 | 8.545 | 8.000 | 5.481 | 0.000 | 30.000 |
| con_consump | 285 | 5.603 | 5.000 | 4.926 | 0.000 | 34.000 |
df |>
select(con_income) |> # 度数分布表を作成する変数のみを指定
summarise("n" = sum(con_income, na.rm=TRUE)/mean(con_income, na.rm=TRUE), # 観測値数
"max" = max(con_income, na.rm=TRUE), # 最大値
"min" = min(con_income, na.rm=TRUE), # 最小値
"J" = round(sqrt(sum(con_income, na.rm = TRUE)/mean(con_income, na.rm = TRUE))), # 階級数
"R" = max - min, # 範囲
"h" = R/J) # 階級幅
# summarise関数はmutateと違い全行をすべて計算します -> つまり、統計量などの計算に便利です
# summarise(新しい列名 = 関数名(列名))となり、mutate関数と違うのが右辺がベクトルではないことです
# 関数内のna.rm = は欠損値の扱いについてで、"TRUE"なら欠損値を無視、"FALSE"なら欠損値を含めます n max min J R h
1 296 30 0 17 30 1.764706
freq_income <- df |> # 作成した度数分布表をfreq_incomeというオブジェクトに代入
select(id, con_income) |> #不要な列(変数)を除く
mutate(class = cut(con_income, breaks = seq(0, 30, 2), right = FALSE, include.lowest = TRUE, ordered_result = TRUE)) |> # 準備で作成した情報から、階級を作成
filter(!is.na(class)) |> # is.na()ですべて欠損値を指定します。その前に!を付けることで、すべての欠損値以外ということになります
group_by(class) |> # classでグループ化
summarise("freq." = sum(con_income, na.rm = TRUE)/mean(con_income, na.rm = TRUE)) |> # 度数 <- con_incomeの全行をclassごとに計算するので、summarise関数
mutate(cumu.freq. = cumsum(freq.)) |> # 累積度数 <- 以降は列の追加なので、mutate関数
mutate(rela.freq. = freq. / sum(freq.)) |> # 相対度数
mutate(rela.cumu.freq. = cumu.freq. / sum(freq.)) |> # 累積相対度数
mutate(dins = rela.freq. / 2) |> # 密度
mutate(per_dins = dins*100) # 密度%gt関数 - 表を自動作成
## freq_incomeデータをgt関数に使って表化 -> それをfreq_income_gtオブジェクトに代入
freq_income_gt <- freq_income |>
gt() |>
tab_header(
title = "Table 2",
subtitle = md("所得の度数分布表")) |> #タイトルの作成
fmt_number(
columns = -c("class", "freq.", "cumu.freq."), #階級数、度数、累積度数以外は、
decimals = 3) |> #小数点第3位まで
cols_label("class" = "階級", "freq." = "度数", "cumu.freq." = "累積度数", "rela.freq." = "相対度数",
"rela.cumu.freq." = "累積相対度数", "dins" = "密度", "per_dins" = "%密度") #列名を変更| Table 2 | ||||||
|---|---|---|---|---|---|---|
| 所得の度数分布表 | ||||||
| 階級 | 度数 | 累積度数 | 相対度数 | 累積相対度数 | 密度 | %密度 |
| [0,2) | 26 | 26 | 0.088 | 0.088 | 0.044 | 4.392 |
| [2,4) | 15 | 41 | 0.051 | 0.139 | 0.025 | 2.534 |
| [4,6) | 53 | 94 | 0.179 | 0.318 | 0.090 | 8.953 |
| [6,8) | 47 | 141 | 0.159 | 0.476 | 0.079 | 7.939 |
| [8,10) | 48 | 189 | 0.162 | 0.639 | 0.081 | 8.108 |
| [10,12) | 39 | 228 | 0.132 | 0.770 | 0.066 | 6.588 |
| [12,14) | 12 | 240 | 0.041 | 0.811 | 0.020 | 2.027 |
| [14,16) | 24 | 264 | 0.081 | 0.892 | 0.041 | 4.054 |
| [16,18) | 14 | 278 | 0.047 | 0.939 | 0.024 | 2.365 |
| [18,20) | 1 | 279 | 0.003 | 0.943 | 0.002 | 0.169 |
| [20,22) | 11 | 290 | 0.037 | 0.980 | 0.019 | 1.858 |
| [22,24) | 1 | 291 | 0.003 | 0.983 | 0.002 | 0.169 |
| [24,26) | 3 | 294 | 0.010 | 0.993 | 0.005 | 0.507 |
| [28,30] | 2 | 296 | 0.007 | 1.000 | 0.003 | 0.338 |
gtsave関数 - オブジェクトをhtmlファイルで保存
第5回講義課題(1):これまでの要領で支出の度数分布表を作成し、Excelファイルを提出
第5回講義課題(2):講義課題(1)で作成したColabファイルを提出