LoginSignup
Ryo-zZ
@Ryo-zZ

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

ggplot2

解決したいこと

ggplot2を使ってグラフを作成したいのですがエラーが多く出て何から手を付けていいのかわかりません。
簡単な手順を1から教えてほしいです。
https://drive.google.com/file/d/1SpI_r-0mIMFYWuin-xcARYdFb3M8rWLa/view?usp=sharing
このデータを使って横軸を日付、縦軸を人数、色で性別を分け年齢もわかるような棒グラフを作りたいです。
棒グラフ以外に適切なグラフがあればそちらでお願いしたいです。

0

2Answer

csv を読み込んでのデータ変換の例です。
2020年のデータのみに絞っています。

library(ggplot2)
df <- read.csv("C:/~略~/newly_confirmed_cases_detail_weekly_old.csv",
               # 1 行目は無視し、値が "*" のデータは NA 扱いとする
               skip=1, na.strings="*")

male <- c()
# 2020年代の男性だけ抜き出す
for (i in 1:18) {
  male <- rbind(male,
                c(df$Week[i], "M.Under.10", df$Male.Under.10[i]),
                c(df$Week[i], "M.10s", df$Male.10s[i]),
                c(df$Week[i], "M.20s", df$Male.20s[i]),
                c(df$Week[i],  "M.30s", df$Male.30s[i]),
                c(df$Week[i],  "M.40s", df$Male.40s[i]),
                c(df$Week[i],  "M.50s", df$Male.50s[i]),
                c(df$Week[i],  "M.60s", df$Male.60s[i]),
                c(df$Week[i],  "M.70s", df$Male.70s[i]),
                c(df$Week[i],  "M.80s", df$Male.80s[i]),
                c(df$Week[i],  "M.Over.90", df$Male.Over.90[i]))
}
df_male <- data.frame(Week=factor(male[,1], levels=unique(male[,1])), # levels で並び順を指定
                      Age=factor(male[,2], levels=unique(male[,2])), # levels で並び順を指定
                      Count=as.numeric(male[,3]))
# NA は 0 で置き換える
df_male[is.na(df_male)] <- 0

g <- ggplot(df_male, aes(Week, Count, fill=Age)) +
  geom_bar(stat="identity") +
  theme(axis.text.x = element_text(angle = 280, hjust = 1, size = 8), legend.position = "bottom")
g

# 男女で横並びの場合
d2020 <- c()
for (i in 1:18) {
  d2020 <- rbind(d2020,
                c(df$Week[i], "Male", df$Male.Under.10[i] +
                    df$Male.10s[i] +
                    df$Male.20s[i] +
                    df$Male.30s[i] +
                    df$Male.40s[i] +
                    df$Male.50s[i] +
                    df$Male.60s[i] +
                    df$Male.70s[i] +
                    df$Male.80s[i] +
                    df$Male.Over.90[i]),
                c(df$Week[i], "Female", df$Female.Under.10[i] +
                    df$Female.10s[i] +
                    df$Female.20s[i] +
                    df$Female.30s[i] +
                    df$Female.40s[i] +
                    df$Female.50s[i] +
                    df$Female.60s[i] +
                    df$Female.70s[i] +
                    df$Female.80s[i] +
                    df$Female.Over.90[i]))
}
df_2020 <- data.frame(Week=factor(d2020[,1], levels=unique(d2020[,1])), # levels で並び順を指定
                      Gender=factor(d2020[,2], levels=unique(d2020[,2])), # levels で並び順を指定
                      Count=as.numeric(d2020[,3]))
# NA は 0 で置き換える
df_2020[is.na(df_2020)] <- 0

g2 <- ggplot(df_2020, aes(Week, Count, fill=Gender)) +
  geom_bar(stat="identity", position="dodge") +
  theme(axis.text.x = element_text(angle = 280, hjust = 1, size = 8), legend.position = "bottom")
g2

2020年男性だけの年齢別グラフ
image.png

2020年男女別のグラフ
image.png

1

Comments

  1. @Ryo-zZ

    Questioner

    ありがとうございます!
    こちらのデータをさらにクラスタリングなどで分析したいと考えているのですがそちらの手順も教えていただきたいです。またほかの分析方法等ございましたら教えていただけたら幸いです。

  2. 分析方法などについてはこちらの記事などをご参考にされるのはいかがでしょうか?

    本質問はグラフの描画方法に関するものなのでグラフが描けたのであればクローズしていただき、分析方法についてはある程度ご自身で学習された上で、不明点・疑問点を明確にして新規にご質問されるのがよろしいかと思います!

    なお適切な分析方法は「何を目的に分析するのか」によって変わるのではないでしょうか?
    分析方法についてご質問される際は分析する目的を明示された方が適切な回答をいただけるのではないかと思います。

  3. @Ryo-zZ

    Questioner

    承知いたしました。
    アドバイスまでいただきありがとうございます!!

Comments

  1. CSVダウンロードできました。

    当方、ggplot2の熟知者ではございませんので、試行錯誤することになります。お時間ください。

  2. @Ryo-zZ

    Questioner

    承知致しました!

  3. 一報です。

    https://covid19.mhlw.go.jp/public/opendata/newly_confirmed_cases_detail_weekly_old.csv
    ↑このCSVの二次元のデータからグラフを作る方法が分からず、一旦、一次元のテーブル形式に変換したCSVを使ってグラフ出力してみました。

    scr1.png
    dt <- read.csv("/Users/UserName/Downloads/table.csv", header=TRUE)
    g <- ggplot(dt)+geom_bar(aes(x=Week,y=Persons,fill=Category),stat="identity")+theme(legend.position = "bottom")
    g
    
    scr2.png

    今は、Weekごとに男女が一本の積み上げ棒グラフになっていますが、これを、男女を分けて二本づつの積み上げ棒グラフにしたいと思います。
    あとは、体裁として、Y軸に目盛り(人数)を入れるとか、隣の棒グラフとの間に隙間を空ける、などあります。

    最終的には、二次元のCSVからコードにて一次元に変換する処理を入れたいとも思います。

    上のコードをベースに、@Ryo-zZ さんの方でも いじってみてください。

    なお、一次元に変換したCSV(table.csv)は、↓下のリンクからダウンロードできます。

  4. @Ryo-zZ

    Questioner

    ありがとうございます。
    試してみます!!

Your answer might help someone💌