VB のたまご

作成日: 2017/08/11, 更新日: 2017/08/11


Pythonでデータ分析して、VBでグラフ表示しよう!

  •  データ分析が得意な Python と VB.NET を組み合わせて使うサンプルです。

  • ・環境
  • ・Ubuntu 17.04
  • ・Python3
  • ・VB.NET(WinForms) on Mono5

  •  Python 環境は、いくつかの解説サイトを見ながら、pyenv 入れて、anaconda 入れて作成しました。 切り替え運用の予定は今のところないため、virtualenv までは入れていません。

  •  そういえば、pyenv 入れる時に git が入っていないと言われたので、git を入れてから pyenv を入れました。

  •  Git のインストール
  • $ sudo apt-get install git
    


実験システムと役割分担

  •  今回は、日本郵便株式会社が公開している郵便番号辞書( csv ファイル)を読み込んで、 各都道府県別の市区町村の件数をグラフに表示するシステムを想定します。

  •  具体的には、(手動)csv ファイルは手動でダウンロードして、(Python)csv ファイルを読み込んで、条件別に分析して、 画像保存して、(VB.NET)画面アプリに画像を表示する流れです。

  •  合間合間に手動の作業が入りますので、完全自動化とまでは行きませんが、初期段階としてはまずまずだろうと妥協しています (言い訳ですが、とりあえず形にするところまでを第一段階と見ていて、改良は二の次)。


csv ファイルのダウンロードと展開

  •  本家のサイトに行って、全国一括のリンクより、 全国分登録された zip ファイルをダウンロードします。その後、フォルダを開いて、zip ファイルを右クリック→「アーカイブマネージャーで開く」 をして、csv ファイルを取得します。


Python プログラムの作成

  •  Python はスクリプトなので、書いたら即実行するタイプの言語です。Python でおこなうのは、pandas モジュールを使って、 データ分析、matplotlib モジュールを使って、グラフの描画と画像保存です。Python のソースファイルは任意の場所に作成していて、 同じ場所に csv ファイルも置いています。

  •  データ分析は、結構適当で、都道府県別にグルーピングして、それぞれの市区町村の件数をカウントして、 降順にソートし直して、上位5件に絞るところまでをおこなっています。

  •  ここでハマってしまったのがソートの命令でした。sort() でもなく order() でもダメで、解説記事の通りに書いたのに~と、 あちこち調べた結果、sort_values() というメソッド名であることが分かりました(´Д⊂ヽわかりやすいのにしてくれ~。

  •  csv2png.py
  • import pandas as pd
    import matplotlib.pyplot as plt
    import matplotlib as mpl
    
    #
    # pandas でデータ分析、matplotlib でグラフ保存
    #
    
    
    
    # 日本語が豆腐にならないように、フォントを指定
    mpl.rcParams['font.family'] = 'TakaoGothic'
    
    # Ken_ALL.csv の列名とともに、csv を読み込む
    columnNames = ['chiho_kokyo_code', 'old_zip_code', 'zip_code', 'todofuken_name', 'shikuchoson_name', 'chouiki_name', 'todofuken_kanji', 'shikuchoson_kanji', 'choumei_kanji', 'j', 'k', 'l', 'm', 'n', 'o']
    data = pd.read_csv("KEN_ALL.CSV", names=columnNames, encoding='shift_jis')
    
    # 都道府県名とひらがなに絞る
    data = data[['todofuken_kanji', 'todofuken_name']]
    # print(data)
    
    # 都道府県名でグルーピング、それぞれの件数をカウントして、降順にソート
    # 見やすいように上位5県に絞る(ブログ用)
    data = data.groupby('todofuken_kanji')
    data = data.count()
    data = data.sort_values('todofuken_name', ascending=False)
    data = data.head(5)
    # print(data)
    
    # この状態を csv として保存
    # data.to_csv('ken_group_shikuchoson_count.csv')
    
    # データをグラフに描く
    data.plot(kind='bar')
    
    # グラフに補助データを追加
    plt.title('各都道府県における市区町村の件数トップ5')
    plt.xlabel('都道府県')
    plt.ylabel('件数')
    
    # 画像として保存
    plt.savefig('ken_top5.png')
    


VB.NET プログラムの作成

  •  こちらでは、png ファイルを PictureBox で表示するだけの画面アプリを作成します。実行ファイルと同じ場所に、生成した png ファイルを置いています。 プログラムは、GTK# アプリケーションではなく、コンソールアプリケーションに System.Drawing、System.Windows.Forms の dll を参照追加して、 無理やりコンソール上から画面アプリケーションを表示しています。

  •  Form1.vb
  • Imports System
    Imports System.Drawing
    Imports System.Windows.Forms
    
    Public Class Form1
        Inherits Form
    
        Public Shared Sub Main()
    
            Application.Run(New Form1)
    
        End Sub
    
        Public Sub New()
    
            Dim img As New BitMap("ken_top5.png")
            Dim PictureBox1 As New PictureBox
    
            Me.Width = img.Width
            Me.Height = img.Height + 50
    
            PictureBox1.Width = Me.Width
            PictureBox1.Height = Me.Height
    
            PictureBox1.BackColor = Color.Gray
            PictureBox1.Image = img
    
            Me.Text = "簡易グラフビューア"
            Me.Controls.Add(PictureBox1)
    
        End Sub
    
    End Class
    

  •  実行して、グラフ表示される画面が表示されたら成功です!