第5回 一変量統計

2025年度 経済データ分析演習B2

伊藤 翼

2025-10-18

はじめに

出席登録は13:00から14:30まででに登録してください

出席番号

886804340

クラスコード

gsrnanuj

今回の目標

  • いくつかの変数の統計量を表にまとめる
  • 度数分布表・ヒストグラムを作成
  • gtできれいな表を作成

講義準備

講義準備(1)

第5回講義フォルダ作成

  • Drive→Classroom→2025年度 経済データ分析演習B2に「第5回」フォルダを作成

新規Colabの作成

  • Driveの「第5回」フォルダ上で
  • 「新規」→「その他」→「Google colaboratory」をクリック

ファイル名の変更

  • 「第5回_学籍番号_氏名.ipynb」に変更
  • アンダーバー(_)は必ず半角
  • 例)第5回_1220YY0XXX_伊藤翼.ipynb

講義準備(2)

  • 1 テキストセルの挿入
  • 2 テキストセルに「# 第5回講義課題(氏名)」と入力
  • 例)# 第5回講義課題(伊藤翼)
  • 3 不要なコードセルは削除(順番入れ替えでも可)
  • 4 再度テキストセルを挿入して、「## ライブラリの読み込み・呼び出し」と入力

重要:日本語以外はすべて半角であることが望ましい(例えば#やスペースなど)

Driveのマウント

マウント

  • マウントとは、ColabからDriveに接続すること
  • 方法は二つありますが、
  • どちらもランタイムのタイプが「Python 3」であることが必要
  • ランタイムのタイプを変更する前にDriveをマウントする

マウントの方法:Python code(1)

  • 以下のCodeをコードセルに入力し実行
from google.colab import drive
drive.mount('/content/drive')

実行

  • 警告が出るので、「Googleドライブに接続」を選択
  • Googleへのログインが求められるので「toyo.jp」のアカウントを選択

アクセスの許可

  • アカウントへのアクセス許可を求められるので、「許可」をクリック

マウントの方法:Python code(2)

マウントの状況のチェック

  • アイコン選択方法と異なり、左側のバーにファイルは表示されません
  • 以下のようになっていればOK

Screenshot of code with a light theme on white background

ランタイムのタイプの変更

Rへの変更

  • 左上の「ランタイム」から「ランタイムのタイプの変更」を選択
  • ランタイムのタイプをRに変更
  • Driveへのマウントをした後にランタイムのタイプを変更しても、Driveのマウントは切れません

Screenshot of code with a light theme on white background

日本語フォントのインストール

  • Colabでは日本語フォントがデフォルトで使えないことがあります
  • 特に、今後作図で使用するggplot2では文字化けしてしてしまいます
  • そこで、日本語フォントを先にインストールします
system("apt-get install -y fonts-noto-cjk", intern=TRUE)

ライブラリの読み込み

  • 前回は、標準的なパッケージの読み込み・呼び出しをしました
  • もっと簡単に、一括でパッケージの読み込み・呼び出しができるpacman関数を利用
# pacman パッケージがインストールされていることを確認する
if (!require("pacman")) install.packages("pacman")

# CRAN から入手可能なパッケージ
##############################
pacman::p_load(
  pacman, # パッケージの読み込みをする関数
  R.utils, 
  tidyverse,
  gt,
  gtsummary, # データ分析の結果を表で作成する
  rstatix # 記述、検定統計量ができる
)
  • 読み込み・呼び出しのどちらもできる
  • 複数のパッケージを一括でできる
  • ただし、CRANに登録されているパッケージのみ

データのインポート

Driveのデータをインポート

  • 以下のCodeをコードセルに入力し実行
# csvファイルは使用するファイルに更新する
data <- read.csv("/content/drive/MyDrive/Classroom/2025年度 経済データ分析演習B2 2025年/演習用データ/22学生生活アンケート.csv", header = TRUE, fileEncoding = "utf-8")
# head関数は、データの先頭を出力します
head(data)
  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.)  

文字列型データの確認(1)

  • 文字列データを質的変数に置き換えるために、データの確認をします
  • 文字列データはfactor関数を使って、内部で数値(レベル)として扱います
# Q3の性別データを確認する
# factor関数で文字列データをデータ内部で数値(レベル)として扱う
# summaryで度数が表示可能となる
data |>
  select(Q3) |> # 文字列データを選択
  mutate(across(everything(), factor)) |> # mutate&factor関数を使って、内部で数値として扱う
  # acrossは、複数列を一括で指定する関数であり、across(指定したい列(変数名), その列に適用したい関数)となります。
  # ここでは、上記select関数で指定しているので、全ての列に対して、factor関数を適用していることになります
  summary()
          Q3     
           :  1  
 回答しない:  1  
 女性      :133  
 男性      :163  
  • 女性、男性に加えて「回答しない」というデータがあります
  • 前回のようにif_else関数で女性を1とし、それ以外を0とすると、それ以外には男性と回答しないのどちらも入ることがあります
  • つまり、女性と男性に分けたい場合は、上記のような加工では不十分になります

文字列型データの確認(2)

  • 文字列データを分析するように加工するときは、そのデータをどのようにカテゴリー化できるのか考える必要があります
  • これもfactorとsummary関数で確認します(つまり、複数列でも確認可能です)
# Q3性別とQ12健康状態のデータを確認する
data |>
  select(Q3, Q12) |>
  mutate(across(everything(), factor)) |>
  summary()
          Q3                  Q12     
           :  1                 :  1  
 回答しない:  1   あまりよくない: 31  
 女性      :133   ふつう        : 70  
 男性      :163   まあよい      :106  
                  よい          : 87  
                  よくない      :  3  
  • 健康状態には「よくない」から「よい」まである
  • つまり、健康状態を5つのカテゴリーに分けることができる
  • ただし、factor関数での順序はすべてアルファベット順になることに注意しましょう

数値型データの確認(1)

  • 数値型のデータであっても、加工する前に確認が必要です
  • 前回お話したsummary関数でもいいですが、
  • インストールしたパッケージのrstatixにあるget_summary_stats関数を使うと便利です
# 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.  
  • typeを”common”とすると、観測値数、最小値、最大値、中央値、四分位値のQ3からQ1を引いた値(四分位範囲)、平均、標準偏差、標準誤差、信頼区間95%内の平均
  • 重要なことは、まず単位はなにであるか確認すること、
  • そして、外れ値がありそうかどうかを確認します

数値型データの確認(2)

  • 量的連続変数において、外れ値がありそうな場合は、ヒストグラムを作成し確認します
  • ヒストグラムは、tidyverseに含まれるggpolt2のgeom_histogramを使用
# ggplot関数でグラフを作成
# aesでグラフの軸などを指定します
# geom_histogram関数でヒストグラムを作成します(括弧内は指定しなくても大丈夫です)
data |>
  ggplot(aes(x = Q56)) +
  geom_histogram()

  • ここから、100という観測値が外れ値であることがわかります

ダミー変数とカテゴリー変数

  • 質的変数には、数字で表せない情報を数字に変換した変数
  • 簡単に二つにわけることができる

ダミー変数(バイナリ変数)

  • 二値変数ともいい、0か1だけの値をとる
  • 性別など二つの情報を分けることができる
  • また、識別したい情報を1として、それ以外を0とすることもできる

カテゴリー変数

  • 二値以上の数字でカテゴリ分けをする
  • ダミー変数のように他と区別、分類することができる
  • 順序尺度として、数字の順番に意味を持たせることもできる

データの加工

必要な変数の選択

  • 変数表をみて、データ分析に必要な変数を選びます
  • メモ欄やExcelなどを活用して、メモをとりましょう
  • 今回は以下の変数を使います(テキストセルを追加して、コピペしましょう)
### 使用変数
Q1:アンケートへの同意(質的変数)
Q3:性別(質的変数)
Q4:年齢(離散変数)←平均の計算では小数点も重要になるので、実は連続変数ですが、今回は離散変数とします
Q5:誕生月(質的変数)
Q6:学年(質的変数)
Q7:学部(質的変数)
Q8:留学生(質的変数)
Q9:最近1週間の幸福度(離散変数)
Q10:最近1年間の幸福度(離散変数)
Q11:これまでの幸福度(離散変数)
Q12:健康状態(質的変数)
Q22:平日の睡眠時間(連続変数)
Q28:同居関係(質的変数)
Q35:通学時間(質的変数)
Q42:GPA(質的変数)
Q56:所得(万円)(連続変数)
Q62:支出(円)(連続変数)
  • ここから、質的変数はtable関数、連続変数は統計量などをつかい、データの特徴を把握します

演習問題

演習問題(1):質的変数と連続変数のデータの特徴をまとめなさい

  • 質的変数はfactor & summary関数、
  • 連続変数はget_summary_stats関数を使ってください
  • 連続変数については、外れ値などの問題がありそうな場合、ヒストグラムを作成してください
  • そこから、わかることをテキストセルを使ってまとめてください

データの加工と新しいデータ作成

  • dataを加工したものを新しいデータフレームの「df」として保存
  • dfに保存するオブジェクトは、使用するものだけとするとやりやすいです
  • オブジェクト名は自身で分かりやすいものにしましょう(日本語でもOK)
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というオブジェクトを選択(それ以外は選択しない)

select(var)
  • v3は選択せず、それ以外を選択(マイナス”-“をつける)
select(-v3)
  • 頭文字に”v”がつくオブジェクトをすべて選択(starts_with関数)
select(starts_With("v")) #頭文字をダブルクォーテーションで囲む
  • 末尾に1がつくオブジェクトををすべて選択(ends_with関数)
select(ends_with("1")) #末尾をダブルクォーテーションで囲む
  • それ以外にもいろいろな指定方法があります
  • 興味ある方は調べてみてください

一変量統計

get_summary_stats関数の応用

  • 記述統計量はget_summar_stats関数を使うことで、簡単に出力可能です
# dfの全ての列の記述統計量を出力
# show = c(出力したい統計量)
get_summary_stats(df, show = c("n", "mean", "median", "sd", "min", "max"))
# 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
  • もし、特定の列だけの記述統計量を出力したい場合は、これまで通りdfをパイプ(|>)でつなぎ、
  • get_summary_stats関数内で列を指定すればよい

きれいな表を作成:gt関数

  • このままでももちろん大丈夫だが、
  • もう少しきれいな表を作成してみましょう

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位まで

きれいな表を作成:gt関数

  • Colabは、Pythonの補助ツールです
  • gt関数を表示させるには、少し特殊な操作が必要です
  • PC上にダウンロードしたRやRStudioではこのコードは必要ありません
## gtで作成した関数をpython上に表示させます
## PC上のRやRStudioでは、statで表示してくれます
gt:::as.tags.gt_tbl(stat)
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

度数分布表(1)

  • 所得変数con_incomeの度数分布表を作成します
  • table関数では度数分布表は作成できない
  • なぜなら、所得変数con_incomeは連続変数だらかです
table(df$con_income)
  • そのため、summarise関数を使って度数分布表を作成します
  • まず、度数分布表の作成には、データの個数、範囲、階級数、階級幅が必要
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

度数分布表(2)

  • 度数分布表の基本情報をもとに、summarise関数を使って度数分布表を作成
  • cut & breaks関数で階級を一括で区切れる
  • cut(階級を指定する連続変数, breaks = seq(始点の値, 終点の値, 階級幅))
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) # 密度%

度数分布表(3)

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" = "%密度") #列名を変更
  • freq_income_gtを表として表示
## 表をColabで表示
gt:::as.tags.gt_tbl(freq_income_gt)
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

gt関数で作った表の保存

gtsave関数 - オブジェクトをhtmlファイルで保存

  • gtsave(保存したいデータオブジェクト, “パス/ファイル名.html”)
## 作成した表をhtmlとしてGoogle driveの第5回フォルダに出力
gtsave(freq_income_gt, "/content/drive/MyDrive/Classroom/2025年度 経済データ分析演習B2 2025年/第5回/第5回度数分布表.html")
  • パスは自分で修正する
  • htmlで書き出す利点は、WordにもExcelにも表を維持したまま貼り付けることが可能であるから

講義課題

第5回講義課題(1):これまでの要領で支出の度数分布表を作成し、Excelファイルを提出

  • Excelファイルのファイル名は「第5回_1220YY0XXX_氏名.xlsx」とする


第5回講義課題(2):講義課題(1)で作成したColabファイルを提出

  • ipynbファイルのファイル名は「第5回_1220YY0XXX_氏名.ipynb」とする


  • 注意(1):二つ提出が必要です。提出場所を間違えないようにしてください
  • 注意(2):htmlではなく、Excelファイルでの提出です
  • 提出期限:2025年10月20日(月) 23時59分