15KB
公開: 更新:

2024/11/07

 名古屋市の統計の可視化などの作業をしている。

 連日のタスクで疲れすぎていて、Geminiが生成したコードを読む気力すら無いので、見た目が良さそうだったらよいことにしている。

 matplotlibを仮想環境で実行してグラフを描いているのだけれど、システムに入れたフォントが読み込まれなくて困っている。Windowsでは標準で読み込まれるものに游ゴシックがあったので、それを直接描いているけれど、環境ごとに使えるフォントは違うしなぁ、という感じ。フォント難しい。

 とりあえず、人口推移をグラフにする。https://www.city.nagoya.jp/somu/cmsfiles/contents/0000013/13717/CA0010F.csv(https://www.city.nagoya.jp/shisei/category/67-5-5-5-0-0-0-0-0-0.html)
 これをhttps://15km.jp/pv/nagoya-population-data/nagoya-city_population.csvとして(Shift-JSからUTF-16に、““で囲った)、

# pop.py
import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams['font.family'] = 'Yu Gothic'

# CSVファイルを読み込む
df = pd.read_csv("nagoya-city_population.csv", encoding="utf-16")

# 日付をdatetime型に変換し、インデックスに設定
df['西暦'] = pd.to_datetime(df['西暦'])
df.set_index('西暦', inplace=True)

# 名古屋市のデータを削除
df = df[df['地域名'] != '名古屋市']

# 各区ごとに人口の推移をグラフ化<br>plt.figure(figsize=(12, 6))

# 線の種類を定義 (例)
line_styles = ['-', '--', '-.', ':']

# 各区ごとにプロット
for i, district in enumerate(df['地域名'].unique()):
 plt.plot(df.loc[df['地域名'] == district, '人口(人)'],
 label=district,
 linestyle=line_styles[i % len(line_styles)])
# グラフの装飾
plt.title("名古屋市以外の各区の人口推移")
plt.xlabel("年")
plt.ylabel("人口(人)")
plt.legend()
plt.grid(True)

# グラフを表示
plt.show()


 こう。

 で、

# pop-100.py
import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams['font.family'] = 'Yu Gothic'

# CSVファイルを読み込む
df = pd.read_csv("nagoya-city_population.csv", encoding="utf-16")
df['西暦'] = pd.to_datetime(df['西暦'])
df.set_index('西暦', inplace=True)

# 各地域の最大値を求める
max_values = df.groupby('地域名')['人口(人)'].max()

# 各地域の値を最大値で割って正規化
normalized_df = df['人口(人)'].div(df.groupby('地域名')['人口(人)'].transform('max')) * 100

# グラフを描画 (線種を変化させる)
plt.figure(figsize=(12, 6))

# 線の種類を定義 (例)
line_styles = ['-', '--', '-.', ':']

for i, district in enumerate(df['地域名'].unique()):
 plt.plot(normalized_df[df['地域名'] == district], 
 label=district, 
 linestyle=line_styles[i % len(line_styles)])

plt.title("名古屋市各区の人口推移 (最大値を100として正規化)")
plt.xlabel("年")
plt.ylabel("人口(相対値)")
plt.legend()
plt.grid(True)
plt.show()


 おおよそ対応しているし、まぁ合っていることにする。
 こういうのってどうやって管理すればいいのか分からない。こんなの他のデータについてもやりたくなるに決まっているし、しかし、リポジトリにデータを置くのはちょっと重たいし、一元管理するのも面倒。誰か複数のデータに対して複数のコードが対応しているという形の構造をうまく管理できる方法知らないですかね。
 意外とJupyter Notebookとかがよかったりしそう。RStudioとか似たような感じだし、あの形が現状の最適解なのかもしれない。(というかRStudioってPython実行できるんだ…。時間を見つけて試してみたい。最初の頃データ系はPyCharmを使っていたのだけれど、肌に合わなくてSublimeTextとPowerShellという形に落ち着いていたのだけれど、データ系は別にするのもありだと考えてる。途中になっているプロジェクトが多すぎてどのウィンドウがどのウィンドウだ乾かなくなってきてるし。)
 これ以外にもやらなければならないことが山積みなので、またグラフを書けたらぼちぼちここに追記していこうと思う。RStudioとかJupyterNotebookとかになったら15km.jp/scripts/に放り込むだけになるかもしれないけれど。