[Pandas 입문] 칼럼명이 없는 csv파일을 불러와 칼럼명을 붙인다

열 이름이 없는 csv 파일에 열 이름을 붙입니다.



칼럼명이 없는 csv파일을 읽어들여 칼럼명을 붙이는 작업을 가끔 하는데도, 방법을 잘 잊기 때문에 비망록으로서 메모해 둡니다.

죄송합니다. 내용은 정말 큰 일이 아닙니다.

사용할 데이터



사용한 데이터는 UCI machine learning repository에서 공개된 주택 데이터를 사용했습니다.
housing data

데이터 로드



먼저 데이터를 읽습니다. 데이터는 쉼표가 아닌 공백으로 구분되므로 sep에서 공백을 지정합니다. 또, housing.data에는 컬럼명이 없기 때문에, 보통으로 읽어들일 때 1행째의 데이터가 컬럼명이라고 인식되어 버리므로, 그것을 피하기 위해서 header=None를 지정합니다.
import pandas as pd
df = pd.read_csv("housing.data", header=None, sep="\s+")

데이터를 읽은 결과는



됩니다. 자동으로 0~13까지의 번호가 할당되어 칼럼명이 되고 있습니다. 이 자동으로 작성된 컬럼명을 본래의 컬럼명으로 옮겨놓습니다. 먼저 변환 전의 열명과 변환 후의 열명을 대응시키는 사전(labels_dict)을 작성합니다. 데이터 프레임의 rename 메도드에서 labels_dict를 지정하면 사전에 표시된대로 컬럼 이름이 대체됩니다.
labels =  ["CRIM", "ZN", "INDUS", "CHAS", "NOX", "RM", "AGE", "DIS", "RAD", "TAX", "PTRATIO", "B", "LSTAT", "MEDV"]
labels_dict = {num: label for num, label in enumerate(labels)}
df = df.rename(columns = labels_dict)
# カラム名を追加したデータフレームをcsvファイルとして保存する。
df.to_csv("housing_data.csv", index=False)

실행 후 df를 확인하면 열 이름이 변경되었음을 알 수 있습니다.



오 · 마 · 케 (이하, 본 기사의 본래의 내용과는 일절 관계 없기 때문에 주의해 주세요)



모처럼이므로이 데이터를 사용하여 주택 가격의 예상을 살펴보십시오.

데이터를 훑어보자.



아래의 코드를 실행하면, 이 데이터가 모두 수치 데이터로 결손치가 없는 것을 알 수 있습니다. 또한 통계량을 표시할 수 있습니다. 원한다면 실행해보십시오.
from IPython.display import display
# データ型表示
display(df.dtypes)
# 欠損値数の表示
display(df.isnull().sum())
# 統計量の表示
display(df.describe())

보통은, 데이터의 통계량등을 확인하면서 데이터의 전처리를 행해, 그 후로 기계 학습의 알고리즘에 데이터를 투입합니다만, 이번은 할애합니다. 뭐라고 말했다고, 오·마·케니까.

선형 회귀 모델에서의 학습



여러가지 생략하고 있습니다. 뭐니뭐니해도, 오 · 마 · 케니까. 최저한의 데이터의 표준화와 테스트 데이터로의 평가는 행하고 있습니다만, 하이퍼파라미터의 조정등은 일절 행하고 있지 않습니다. 평가는 단순히 평균 제곱 오차 (RMSE)로 수행되었습니다. 코드는 다음과 같습니다.
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
%matplotlib inline

# パイプライン設定
pipe = Pipeline([
    ("scl", StandardScaler()),
    ("pca", PCA(n_components=10)),
    ("lr", LinearRegression(normalize=False))
])

# データの分割
xtrain, xtest, ytrain, ytest = train_test_split(df[df.columns[df.columns != "MEDV"]], df["MEDV"], test_size=0.3, random_state=1)

# モデルの学習
pipe.fit(X=xtrain, y=ytrain)

# 価格の予想
ypred = pipe.predict(xtest)

# モデルの評価
display(mean_squared_error(ytest, ypred))

# 結果の表示
result = pd.DataFrame(columns=["index", "true", "pred"])
result["index"] = range(len(ytest))
result["true"] = ytest.tolist()
result["pred"] = ypred

plt.figure(figsize=(15,5))
plt.scatter(result["index"], result["true"], marker="x", label="true")
plt.scatter(result["index"], result["pred"], marker="v", label="predict")
plt.xlabel("ID")
plt.ylabel("価格の中央値")
plt.grid()
plt.legend()
plt.show()

이것을 실행하면, 평균 제곱 오차로서 21.19가 되었습니다. 이것이 좋은지 나쁜지 제대로 데이터를 보지 않으면 모르겠지만, 우선 가격의 예측과 진정한 값의 어긋남을 평가할 수 있었습니다.

또, 예측치와 참치를 그램으로 하면 이하가 됩니다. 확실히 봐, 가격이 높은 쪽의 어긋남이 크고, 예측치는 낮게 예상하고 있는 것을 알 수 있습니다.

좋은 웹페이지 즐겨찾기