Pythonを一から勉強してデータ分析できるようになる

~ Pythonとデータ分析のお勉強の記録 ~

統計値の続き、標準偏差とか

[Take0] サンプルデータの作成

平均値は同じだが、分布の異なる2系列のデータを定義する

 

【書式】

書式:ディクショナリ型データの作成
data={
 "項目名1": [値1],
 "項目名2": [値2],
 "項目名3":[値3]
}

 

【コード】

import pandas as pd
 
data={
   "ID": [0,1,2,3,4,5,6,7,8,9],
   "A": [118,48,124,96,116,38,64,176,94,126],
   "B":[98,100,98,108,90,104,112,96,90,104]
}
 
# data のデータ型を確認する。
print(type(data))
print("\n")
 
# data をデータフレームに変換する。
df=pd.DataFrame(data)
# df の内容を確認する
print(df.head())
print("\n")
# 平均値の表示
print(df.mean())
 
# 平均値を別の記述で表示
print("\nインデックス毎に平均値を計算する")
print("A:",df["A"].mean())
print("B:",df["B"].mean())

 

【結果】

<class 'dict'>
 
 
ID A B
0 0 118 98
1 1 48 100
2 2 124 98
3 3 96 108
4 4 116 90
 
 
ID 4.5
A 100.0
B 100.0
dtype: float64
 
インデックス毎に平均値を計算する
A: 100.0
B: 100.0

 

 

[Take1] これらのデータを可視化する。(グラフ化する)

 

【書式】

散布図
df.plot.scatteter()
横線を描く
plt.axhline(y=yの値,c="色")

 

【コード】

%matplotlib inline
import matplotlib.pyplot as plt
import japanize_matplotlib
 
data={
"ID": [0,1,2,3,4,5,6,7,8,9],
"A": [118,48,124,96,116,38,64,176,94,126],
"B":[98,100,98,108,90,104,112,96,90,104]
}
df=pd.DataFrame(data)
 
df.plot.scatter(x="ID",y="A",color="b",ylim=(0,150))
plt.axhline(y=100,c="Magenta")
plt.title("Aの系列",fontsize=24)
plt.show()
 
df.plot.scatter(x="ID",y="B",color="b",ylim=(0,150))
plt.axhline(y=100,c="Magenta")
plt.title("Bの系列",fontsize=24)
plt.show()

 

【結果】



 

 

[Take2] 各系列の分散(不偏分散)を求める

 

【書式】

必要なライブラリ:pandas
df.var()
戻り値のデータ型は float
オプションで標本分散と不変分散を設定できる。

 

【コード】

import pandas as pd
 
data={
   "ID": [0,1,2,3,4,5,6,7,8,9],
   "A": [118,48,124,96,116,38,64,176,94,126],
   "B":[98,100,98,108,90,104,112,96,90,104]
}
df=pd.DataFrame(data)
print("不偏分散")
print(df.var())
print("\n標本分散")
print(df.var(ddof=0))

 

【結果】

不偏分散
ID 9.166667
A 1722.666667
B 51.555556
dtype: float64
 
標本分散
ID 8.25
A 1550.40
B 46.40
dtype: float64

 

 

[Take3] 各系列の標準偏差を求める

 

【書式】

必要なライブラリ:pandas
df.std()
戻り値のデータ型は float
オプションで標本分散と不変分散を設定できる。

 

【コード】

import pandas as pd
 
data={
   "ID": [0,1,2,3,4,5,6,7,8,9],
   "A": [118,48,124,96,116,38,64,176,94,126],
   "B":[98,100,98,108,90,104,112,96,90,104]
}
df=pd.DataFrame(data)
print("不偏標準偏差")
print(df.std())
print("\n母標準偏差")
print(df.std(ddof=0))

 

【結果】

ID 3.02765
A 41.50502
B 7.18022
dtype: float64
 
ID 2.872281
A 39.375119
B 6.811755
dtype: float64

 

 

[Take4] Aの分布と平均、(不偏)標準偏差を可視化する

 

【書式】

 

【コード】

%matplotlib inline
import matplotlib.pyplot as plt
import japanize_matplotlib
 
data={
"ID": [0,1,2,3,4,5,6,7,8,9],
"A": [118,48,124,96,116,38,64,176,94,126],
"B":[98,100,98,108,90,104,112,96,90,104]
}
df=pd.DataFrame(data)
 
meanA=df["A"].mean()
stdA=df["A"].std()
 
df.plot.scatter(x="ID",y="A",color="b",ylim=(0,150))
plt.axhline(y=meanA,c="Red")
plt.axhline(y=meanA+stdA,c="g")
plt.axhline(y=meanA-stdA,c="g")
plt.title("Aの分布、平均、分散",fontsize=24)
plt.show()
 
meanB=df["B"].mean()
stdB=df["B"].std()
 
df.plot.scatter(x="ID",y="B",color="b",ylim=(0,150))
plt.axhline(y=meanB,c="Red")
plt.axhline(y=meanB+stdB,c="g")
plt.axhline(y=meanB-stdB,c="g")
plt.title("Bの分布、平均、分散",fontsize=24)
plt.show()

 

【結果】



 

補足)matplotlibで指定可能な色

一文字指定、16進数など複数の指定方法があるらしい。 ここでは、一文字指定のリストを記述しておく。



 

[Take5] データをヒストグラムで表示する。

 

【書式】

df["列名"].plot.hist(bins=階級リスト,color="色",ylim=(最小値,最大値))

 

【コード】

%matplotlib inline
import matplotlib.pyplot as plt
import japanize_matplotlib
 
data={
"ID": [0,1,2,3,4,5,6,7,8,9],
"A": [118,48,124,96,116,38,64,176,94,126],
"B":[98,100,98,108,90,104,112,96,90,104]
}
df=pd.DataFrame(data)
 
bins=[20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200]
 
df["A"].plot.hist(bins=bins,color="c",ylim=(0,6))
plt.title("Aの分布",fontsize=24)
plt.show()
 
df["B"].plot.hist(bins=bins,color="c",ylim=(0,6))
plt.title("Bの分布",fontsize=24)
plt.show()

 

【結果】



 

 

[Take6] TAKE4と同様に、平均値、標準偏差も追記する

 

【書式】

グラフに縦線を描く
plt.axvline(x=xの値,c="色")

 

【コード】

%matplotlib inline
import matplotlib.pyplot as plt
import japanize_matplotlib
 
data={
"ID": [0,1,2,3,4,5,6,7,8,9],
"A": [118,48,124,96,116,38,64,176,94,126],
"B":[98,100,98,108,90,104,112,96,90,104]
}
df=pd.DataFrame(data)
 
bins=[20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200]
 
meanA=df["A"].mean()
stdA=df["A"].std()
 
df["A"].plot.hist(bins=bins,color="c",ylim=(0,6))
plt.axvline(x=meanA,c="Red")
plt.axvline(x=meanA+stdA,c="g")
plt.axvline(x=meanA-stdA,c="g")
plt.title("Aの分布",fontsize=24)
plt.show()
 
meanB=df["B"].mean()
stdB=df["B"].std()
 
df["B"].plot.hist(bins=bins,color="c",ylim=(0,6))
plt.axvline(x=meanB,c="Red")
plt.axvline(x=meanB+stdB,c="g")
plt.axvline(x=meanB-stdB,c="g")
plt.title("Bの分布",fontsize=24)
plt.show()

 

【結果】