파이썬으로 대량의 CSV를 단번에 시각화

Kei입니다. 전회 투고한 파이썬으로 인공 사회 시뮬레이션 의 기사로 예상외에 많은 좋아요를 받고 웃고 있습니다.

전회의 투고에서는 일단 인공사회에서 에이전트들에게 좋아하는 게임을 하게 되었을 때까지는 갔습니다만, 덤에 실고 있는 듯한 예쁜 히트 맵의 만드는 방법은 설명하고 있지 않았습니다.
그래서 이번에는 Pandas와 Matplot와 Seaborn을 사용하여 시뮬레이션 결과의 시각화 기법을 설명하고 싶습니다만, 단지 그래프를 쓰는 것만이라면 다른 기사에서도 흩어져 소개되고 있으므로 모처럼이므로 이번에는 "어쨌든 대량 CSV를 읽고 히트 맵이나 산포도를 쓰지 않으면 안된다! 합니다.

하고 싶은 것 1. 대량의 히트 맵을 한 번에 그려 비교해 본다



예를 들면
output1.csv
output2.csv
output3.csv
.
.
.
output100.csv
같은 파일마다 숫자의 일련 번호가 내려있는 CSV 파일을 단번에 모두 히트 맵으로 하고 싶다!
특히 자신처럼 확률적 시뮬레이션이라면, 계산 결과가 매번 실행될 때마다 미묘하게 바뀌므로(사용하는 난수 계열의 관계), 100회 정도 다른 난수 계열을 사용하여 계산하여 각각의 에피소드에서 계산 결과가 얼마나 달라지는지를 확인하고 싶은 장면이 자주 있으며, 그럴 때 다음 스크립트들이 도움이 됩니다.
또한 csv 파일의 이름은 위에서 쓴 것처럼 "output(숫자).csv"와 같이 되어 있는 경우를 상정하고 있습니다.
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

num_figure = 10    # 描画したいcsvファイルの数

fig = plt.figure()

for i in range(1, num_figure+1):
    df = pd.read_csv('output{}.csv'.format(i))    # csvファイル読み込み
    df_pivot = df.pivot('column1','column2', 'value')   # col1, col2, valueの部分は読み込みたいデータに応じて変えてください
    ax = fig.add_subplot(2, 5, i)                 # これだと10枚のヒートマップを2行5列の配置で順に描画してくれます。
    sns.heatmap(df_pivot, cbar=False)             # cbar=Trueにすると同じカラーバーが10個出てくるので鬱陶しければこの例のようにFalseにしておく。
    ax.set_title("Episode{}".format(i))           # それぞれのヒートマップにタイトルをつける

plt.tight_layout()                                # こいつを書くだけでグラフ同士の間隔を程よく調整してくれる
fig.suptitle('Fraction of Cooperation')           # グラフ全体のタイトル
plt.savefig('heatmaps.png')
plt.show()

위에서는 for문과 format문을 사용하여 파일마다 숫자가 다른 부분을 바꾸면서 데이터를 읽어 가고 있습니다. 덧붙여서 이런 느낌으로 10 장의 히트 맵을 나란히 비교할 수 있습니다 ↓


이것은 내가 이전 연구 중에 인공 사회 시뮬레이션의 계산 결과를 10개의 에피소드에 대해 비교했을 때의 것입니다만, Episode7만 다른 에피소드보다 색의 밝은 범위가 넓어지고 있습니다(=보다 강한 사회 딜레마의 아래에서도 이타적인 인간이 살아남고 있다). 이것은 계산시에 사용한 난수 계열의 차이로, 우연히 이타적인 에이전트에게 유리한 초기 조건으로 계산이 시작된 것이 Episode7이었다는 것이 됩니다.

하고 싶은 것 그 2.대량의 시계열 데이터를 하나의 그래프에 정리해 묘화



위와 비슷한 느낌으로 대량의 시계열 데이터도 하나의 그래프에 밀어 비교할 수 있습니다.

예를 들면 위와 같은 형태로 시계열 데이터가 저장되어 있는 많은 CSV 파일에,
time_series(parameter=0.0).csv
time_series(parameter=0.1).csv
.
.
time_series(parameter=1.0).csv
와 같이 파라미터 설정이 파일명에 흔들리고 있는 상황을 생각하면, 다음과 같은 느낌으로 단번에 그릴 수 있습니다↓
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(12, 8))
for param in [format(i, '.1f') for i in np.arange(0.0, 1.1, 0.1)]:  # ここのformat文重要
    df = pd.read_csv('time_series(parameter={}).csv'.format(param))
    ax = fig.add_subplot(111)
    ax.scatter(df['time'], df['Fraction of Cooperation'], label='Parameter ={}'.format(param))
    ax.set_xlabel('Time step')
    ax.set_ylabel('Fraction of Cooperation')
    ax.set_xlim([0, 300])
plt.legend()
plt.tight_layout()
plt.savefig('time_series_data.png')
plt.show()


이 예 보고 싶은 10개의 시계열 데이터 정도라면 Excel에서도 물론 할 수 있습니다만, 이것이 100개라고 되어 오면 유석에 다르지 않습니까. 그런 때 이 손의 스크립트 만들면 python script.py 라고 치면 끝이니 고맙네요.

좋은 웹페이지 즐겨찾기