Python3
単回帰分析
Jupyter-notebook
.csv

pythonによる.csvの読み込みから線形単回帰分析まで

今年から学部2年生の誤差解析がpythonを用いたものなるということで、事前に院生の自分が実際に流れを通ってみようということでやってみたのと、技術的アウトプットの練習ということでこの記事を書きました。参考になれば幸いです。

.csvファイルの作成

そもそも.csvファイルとはなんなのかというと、文字(数字)とカンマだけで構成されたファイルである。こんなやつ↓()

今回の実習では実際に測定したものをPCに打ち込むらしいのだが、macでテキストエディタを用いて作成する際は"フォーマット"から"標準テキストにする"を忘れないように。拡張子を.csvに変更できなくなってしまう。()

pythonによる処理

フォルダを準備してそこに準備した.csvファイルを置いてjupyterを起動します。

必要なモジュールをimportする

import pandas as pd 
import numpy as np
from sklearn import linear_model
%matplotlib inline
from matplotlib import pyplot as plt

.csvを読み込んでみる

pd.read_csv("tab2.csv") #今回用いたファイル名はtab2.csv

jupyter上だと読み込むと以下のように表示される()

読み込んだ.csvをデータフレーム(df)に格納する

df = pd.read_csv("tab2.csv")
print(df)
x = df["n"] #ついでに各カラム(列)ごとに取り出してみる
print(x)
ya = df["測定A"]
print(ya)
yb = df["測定B"]
print(yb)

データフレームを使いやすいように変形する

(本体のデータがxy対応してあればこの作業は必要ないもので、一つのキーに複数のハッシュをもつ配列かあれば、もっと上手いやり方があるかもしれません。知識不足のパワープレイです)
使いづらいので要素を取り出して使いやすいよう変形する(3列をx,yの二成分の2列へ)
カラム名(列名)が異なると同じ列として結合できないことに注意する 1回目をdf1に、2回目をdf2に格納し、"n"を"x"に、"測定値"を"y"に変更した。

df1 = df[["n","測定A"]]
print(df1)
df1_new = df1.rename(columns={'n': 'x', '測定A': 'y'})
print(df1_new)
df2 = df[["n","測定B"]]
print(df2)
df2_new = df2.rename(columns={'n': 'x', '測定B': 'y'})
print(df2_new)

二つのデータフレームを結合させdf3として、これを解析に用いる。

df3 = pd.concat([df1_new, df2_new])
print(df3)

散布図として出してみる

x = df3["x"]
y = df3["y"]
plt.scatter(x,y)

回帰係数、切片、決定係数を求めた

model = linear_model.LinearRegression()
model.fit(x[:, np.newaxis], y) #ここで線形回帰モデルへの当てはめを実行している
print(model.coef_, model.intercept_)
a = float(model.coef_)
b = float(model.intercept_)
print("y=" + str(round(a,2)) + "x+" + str(round(b,2)))
print(model.score(x[:, np.newaxis], y))

散布図と回帰直線をプロットしてみる

xx = np.arange(0, 10)
yy = model.predict(xx[:, np.newaxis])
plt.plot(xx, yy)
plt.scatter(x, y)
plt.xlim(0,10)
plt.ylim(0,30)

画像準備します。

サンプルが少なくほぼ散布図上を通る直線が引けるという結果であるが、今回はあくまで手法の流れという事と技術的アウトプットの練習という事で一時的にこのような形で投稿することをお許しください。