BellCurve 統計WEB

  • Step3. 実践編
  • 1. データの整理と可視化

1-4. 積み上げ棒グラフ

次のデータは、「Step0. 初級編 2-3. 積み上げ棒グラフを読み取ってみよう」で用いたデータです。このデータを使って、積み上げ棒グラフの作成を行ってみましょう。

ファイルのダウンロードはこちらから

■Excelによる解析例

  1. 「neko_ensoku.csv」のデータを選択(A1セルからE7セルまで)
  2. 挿入 > すべてのグラフを表示 > 積み上げ縦棒を選択
  3. 
    

  4. デフォルトのグラフが出力される
  5. デフォルトのグラフを加工
  6. ※棒グラフ間の線(区分線)を入れる場合には、次の手順で行います。:出力されたグラフをクリック > グラフツールのデザイン > グラフ要素の追加 > 線 > 区分線を選択

    ※100% 積み上げ縦棒を選択すると、各データ全体を100%としたときの各項目の割合を表す棒グラフを描くことができます。

    
    

■Rによる解析例

・その1(packageを使わない場合)

dat <- read.csv("neko_ensoku_eng.csv", header=T, row.names = 1)  #データの読み込み
dat2 <- t(dat[1:6,1:4])  #必要なデータ(1~6行目、1~4列目)の抽出&転置(行列の入れ替え)

#積み上げ棒グラフ
barplot(dat2,  #barplot関数にデータをセット 
        ylab = "Frequency",  #y軸ラベルを設定 
        legend = rownames(dat2),  #凡例をセット 
        col=topo.colors(4))  #棒グラフの色を設定(topo.colorsのカラースケールを4分割)

#100%積み上げ棒グラフ
par(mar=c(5, 5, 4, 10))  #凡例がグラフに重ならないようにするため、余白を設定
barplot(prop.table(dat2, 2),  #列ごとの割合を算出 
        ylab = "Proportion", 
        legend = rownames(dat2),
        col=topo.colors(4), 
        args.legend = list(x = "topright", inset = c(-0.25, 0)))  #凡例の位置を設定

dev.off()  #描画設定を初期値に戻す   


■Rによる解析例

・その2(ggplot2を使う場合)

library(reshape2)
library(ggplot2)

dat <- read.csv("neko_ensoku_eng.csv", header=T, row.names = 1)  #データの読み込み
dat2 <- melt(as.matrix(dat[1:6,1:4]))  #データを縦に並べかえる

#積み上げ棒グラフ
G1 <-ggplot(dat2, aes(x = Var1, y = value, fill = Var2)) +  #x軸、y軸、塗りつぶしの色のデータを設定 
  geom_bar(stat = "identity") +  #与えられた値をそのまま棒グラフとして使う
  scale_fill_brewer(palette = "Set2") +  #棒グラフの色を設定(Set2というカラーパレットを使用)
  labs(x = "", y = "Frequency", fill = "Category") +  #グラフのラベルを設定
  theme(panel.grid.major = element_blank(),  #背景のgridの削除
        panel.grid.minor = element_blank(),  #背景のgridの削除 
        panel.background = element_blank(),  #背景色の削除
        axis.line=element_line(colour = "black"),  #グラフの線の色を指定
        axis.ticks=element_line(colour = "black"),  #グラフの目盛(ticks)の色を指定
        axis.text=element_text(size = 14),  #グラフの目盛のフォントサイズを指定
        axis.title=element_text(size = 16),  #グラフのラベルのフォントサイズを指定
        legend.text=element_text(size = 14),  #凡例のフォントサイズを指定 
        legend.title=element_text(size = 16))  #凡例のラベルのフォントサイズを指定
plot(G1)

#100%積み上げ棒グラフ
G2 <-ggplot(dat2, aes(x = Var1, y = value, fill = Var2)) + 
  geom_bar(stat = "identity", position = "fill") +
  scale_fill_brewer(palette = "Set2") +
  labs(x = "", y = "Proportion", fill = "Category") +  #与えられた値をそのまま棒グラフとして使う+100%に積み上げる 
  theme(panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(),
        panel.background = element_blank(),
        axis.line=element_line(colour = "black"),
        axis.ticks=element_line(colour = "black"),
        axis.text=element_text(size = 14),
        axis.title=element_text(size = 16),
        legend.text=element_text(size = 14), 
        legend.title=element_text(size = 16))
plot(G2)


■Pythonによる解析例

・その1(for文を使わずに積み上げる場合)

import pandas as pd
import matplotlib.pyplot as plt

dat = pd.read_csv("neko_ensoku_eng.csv", index_col = 0)  #データの読み込み
dat2 = dat.iloc[0:6,0:4]  #必要なデータの抽出

#積み上げ棒グラフ
dat2.plot.bar(stacked = True)  #クロス集計表データから積み上げ棒グラフを作成
plt.legend(dat2.columns, fontsize = 10)  #凡例の項目、フォントサイズの設定
plt.ylabel("Frequency", fontsize = 10)  #y軸ラベルを設定、フォントサイズの設定

plt.show()  #グラフの出力

#100%積み上げ棒グラフ
dat3 = dat2.copy()  #dat2をdat3へコピー
for i in range(6):  #for文を使って列ごとの割合を算出
    dat3.iloc[i,:] = dat3.iloc[i,:] / dat3.iloc[i,:].sum()
dat3.plot.bar(stacked = True)
plt.legend(dat2.columns, fontsize = 10, loc='upper left', bbox_to_anchor = (1, 1))  #凡例の項目、フォントサイズ、位置の設定
plt.ylabel("Proportion", fontsize = 10)
plt.tight_layout()  #グラフの要素が画面からはみ出さないようにする

plt.show()


■Pythonによる解析例

・その2(for文を使って積み上げる場合)

import pandas as pd
import matplotlib.pyplot as plt

dat = pd.read_csv("neko_ensoku_eng.csv", index_col = 0)
dat2 = dat.iloc[0:6,0:4]

#積み上げ棒グラフ
fig, ax = plt.subplots()  #グラフの大枠の作成
for i in range(4):  #for文を使って列ごとデータを積み上げる
    ax.bar(dat2.index, dat2.iloc[:,i], bottom=dat2.iloc[:,:i].sum(axis = 1))
plt.legend(dat2.columns, fontsize = 10)
plt.ylabel("Frequency", fontsize=10)

plt.show()

#100%積み上げ棒グラフ
dat3 = dat2.copy()
for i in range(6):
    dat3.iloc[i,:] = dat3.iloc[i,:] / dat3.iloc[i,:].sum()
fig, ax = plt.subplots()
for i in range(4):
    ax.bar(dat3.index, dat3.iloc[:,i], bottom = dat3.iloc[:,:i].sum(axis = 1))
plt.legend(dat2.columns, fontsize = 10, loc = 'upper left', bbox_to_anchor = (1, 1))
plt.ylabel("Proportion", fontsize = 10)
plt.tight_layout()

plt.show()


1. データの整理と可視化


統計学やデータ分析を学ぶなら、大人のための統計教室 和(なごみ) [業務提携]


【BellCurve監修】統計検定®2級対策に最適な模擬問題集1~3を各500円(税込)にて販売中!

Kindleストアで配信中

統計検定®2級 模擬問題集1

500円(税込)

統計検定®2級 模擬問題集2

500円(税込)

統計検定®2級 模擬問題集3

500円(税込)