Pythonを実際に動かしてみよう!ということで、ビギナーも取り掛かりやすい、Microsoft Officeのアプリがより便利になる【Pythonのサンプルコード・ライブラリ】をご紹介します。今回は、Excel。【読むだけでも、なるほど】と思っていただけるよう、関連トピックも多く記載しています。スキルアップのお役に立てますように。
▼Pythonのインストールがまだの方はこちらから!
メーカー勤務機械系エンジニア。WATLABブログ運営者。工学計算に関する知識の習得を目指し、Pythonの学習を2019年から始める。仕事以外にも、趣味のプログラミングやPythonコミュニティへの参加を行っている。また、月間数万PVのPythonブログ「WATLAB」を立ち上げ、初心者向けに図を多くしたわかりやすい記事を作成・公開している。著書は『いきなりプログラミング Python』(翔泳社)。
ブログ:https://watlab-blog.com/
1.アンケートの自由記入欄の分析に、苦労したことはありませんか?
アンケートは顧客や従業員の声を直接収集する貴重な手段です。通常は数段階(1から5など)の数値(スコア)を記入者に選択してもらい、そのスコアの最小値や最大値、平均を集計して今後の方針のヒントとします。一方で、自由に文章を記述できる欄には記入者の生の声が書かれることが多いのに、一文一文細かく分析することは困難です。
単なる数値の集計であればExcelの基本機能だけで十分ですが、Pythonで感情分析を導入することで、一歩進んだ自由記入欄の分析を行うことができます。
2. Pythonプログラミングの準備
■Pythonプログラミング環境の構築
Pythonプログラミングの環境は前回の「最速でPython環境を構築してプログラミングをはじめよう」を参照してください。Pythonのインストール方法、プログラムの記述・実行方法、外部ライブラリのインストール方法をまとめています。
■必要なライブラリのインストール
まずは次の3つの外部ライブラリをインストールしておきましょう。
jupyter lab
コマンドを実行する手前)。(1)Pandas
PandasはPythonで表形式のデータ操作を行う際に便利なライブラリです。Excelファイルの読み込みや各種集計などに活用されています。次のコマンドでインストールしましょう。
pip install pandas
(2)TextBlob
TextBlobはシンプルかつ強力な自然言語処理ライブラリで、テキストの感情分析や文法の解析を行うことができます。TextBlob自体は英語の文章しか扱えませんが、他の多くの自然言語処理ライブラリと異なり、ユーザー登録や認証処理が不要です。初心者はそれらの事前処理で挫折することもあるので、今回は手軽に始められるTextBlobを使ってみます。次のコマンドでインストールを行いましょう。
pip install textblob
(3)deep-translator
deep-translatorはテキスト翻訳を簡単に行うための外部ライブラリです。GoogleTranslatorというモジュールを使うことで、Google翻訳を活用できます。先ほどのTextBlobは英語ベースなので、日本語の文章を一度英語に翻訳してから感情解析を行うために使用します。次のコマンドでインストールしましょう。
pip install deep-translator
外部ライブラリのインストールが終了したら、以下のコマンドを入力して、JupyterLabを立ち上げましょう。
jupyter lab
■サンプルファイル
この記事ではサンプルのExcelファイルを使いながらプログラムを作ります。PCで記事をご覧の方は、次のsample.xlsxをダウンロードしてPythonプログラムと同じフォルダに置いておきましょう。
▼クリックするとExcelファイルがダウンロードされます。
https://www.r-staffing.co.jp/rasisa/wp-content/uploads/2024/10/sample.xlsx
サンプルファイルの中身はこちらです。A列からE列が計5個の質問を意味しています。1行目はヘッダーで、各質問をQ1からQ5と名前を付けています。2行目以降がそれぞれの回答者の結果を意味しており、Q1からQ4は1〜5までの5段階評価、Q5は自由記入欄として日本語の文章が記載されているという内容です。
3. まずは普通に集計してみる
いきなり感情分析から入るのではなく、Pythonに慣れるためにまずは普通の集計をしてみましょう。Q1からQ4はすべて数値データで構成されているため、この数値の最小値や最大値、平均値を計算します。
■Excelファイルを読み込んで集計する
はじめにExcelファイルを読み込みます。次のPythonコードを入力してみましょう。
import pandas as pd
# Excelファイルを読み込む
df = pd.read_excel('sample.xlsx')
# 集計:最小値、最大値、平均値を計算
min_values = df[['Q1', 'Q2', 'Q3', 'Q4']].min()
max_values = df[['Q1', 'Q2', 'Q3', 'Q4']].max()
mean_values = df[['Q1', 'Q2', 'Q3', 'Q4']].mean()
pandas
をimportする 7〜9行目:集計する
この部分で最小値
min_values
、最大値max_values
、平均値mean_values
を算出しています。.min()
、.max()
、.mean()
がそれらを計算するためのメソッドです。ここで各計算行で共通している[['Q1', 'Q2', 'Q3', 'Q4']]
という部分は、データフレームの中で「Q1」から「Q4」までの列を抽出していることを意味します。プログラムを実行して、実行結果に「
ModuleNotFoundError
」が出る場合はpandas
が正常にインストールされていません。再度pip install pandas
を実行し、何かエラーが出ていないか確認しましょう。Pythonの外部ライブラリをインストールする際、自動的に関連ライブラリもインストールされます。しかし、環境によってはそのインストールに失敗している場合があります。その場合は
ImportError
が表示されるので、足りないライブラリをpip install
しましょう。ここではopenpyxl
が足りないのでpip install openpyxl
を実行しましょう。openpyxl
以外のライブラリが足りない場合も足りないライブラリをインストールすれば解決します。プログラミングにエラーは付きものです。
FileNotFoundError
が出る場合はサンプルのExcelファイルがプログラム実行フォルダにない可能性があります。ファイルの置き場やファイル名に間違いがないかを確認してみましょう。■集計結果をデータフレームに追加する
次のコードを追加し、先ほど集計した結果をデータフレームに追加しましょう。
<省略> # 計算した結果をデータフレームに追加 df.loc['Min'] = min_values df.loc['Max'] = max_values df.loc['Ave'] = mean_values # 既存の列ヘッダーの調整 df.insert(0, 'Summary', [''] * (len(df) - 3) + ['Min', 'Max', 'Ave'])
min_values
、最大値max_values
、平均値mean_values
をデータフレームに追加します。.loc
は行方向のデータ参照を行う操作です。この操作で新しくMin, Max, Aveという行が作成され、各データが代入されます。.insert()
で0番目の行にSummaryという列を追加し、行の値を設定しています。先ほど集計した3行より前には空白文字を設定し、その後にMin, Max, Aveのラベルをセルに代入します。この値は[''] * (len(df) - 3) + ['Min', 'Max', 'Ave'])
というリストにて与えられます。■新しいExcelファイルに保存する
データ集計とセルの値設定が終了したら、最後に新しいExcelファイルを保存しましょう。次のコードを追加します。
<省略> # 新しいExcelファイルとして保存 output_file = 'results.xlsx' df.to_excel(output_file, index=False)
output_file
という変数は保存するファイル名です。Pythonではシングルクォート「'
」やダブルクォート「"
」で囲んだ範囲を文字列として扱えます。文字列でファイル名を設定し、.to_excel()
メソッドでExcelファイルに保存します。プログラムの実行フォルダにresults.xlsx
が保存されていることを確認したら、ファイルを開いてみましょう。集計結果の3行とSummary列が追加されていることが確かめられるはずです。
ここまでで数値データの集計やExcelファイルのデータを操作する基礎を習得したことになります。
4. 「感情分析」を試してみよう
■関数を定義する
上記のコードは単純に数値データを集計しただけです。この内容であればExcel単体の方がまだ簡単にできるでしょう。続いてPythonならではのデータ分析として冒頭で紹介した感情分析を行ってみましょう。
次のライブラリをコード上でimportします。一行目の下に追加してください。
import pandas as pd from textblob import TextBlob # 追加 from deep_translator import GoogleTranslator # 追加 <省略>
そしてimport文の下に、関数を定義します。
<省略> from deep_translator import GoogleTranslator def sentiment_analysis(text, min_score=1, max_score=5): # ここから追加 """感情解析をする関数""" translated_text = GoogleTranslator(source='ja', target='en').translate(text) analysis = TextBlob(translated_text) polarity = analysis.sentiment.polarity # 指定範囲のスコアにスケーリング score = ((polarity + 1) * (max_score - min_score) / 2) + min_score return score # ここまで追加 <省略>
sentiment_analysis()
という関数を定義しました。Pythonで関数を定義するには、まずdef
というキーワードを書き、その後に半角スペースを1つ空けて任意の関数名を書きます。text
と最小スコアmin_score
、最大スコアmax_score
を受け取ります。そしてテキストの感情分析を行い、min_score
からmax_score
までの範囲にスケーリングしたスコア(感情を数値化したもの)を戻り値とする設定がされています。戻り値はreturn
の後に半角スペースを入れて設定します。GoogleTranslator()
を使い、日本語を英語に翻訳します。source
にja
を指定することで元の言語が日本語であることを示し、target
にen
を指定することで翻訳先の言語を英語に設定しています。TextBlob
による感情解析が実行され、10行目でスコアを取得します。ここでスコアはpolarity
(極性)という形で表現され、-1.0(ネガティブ)から1.0(ポジティブ)の範囲で得られます。 polarity
の値は-1.0〜1.0の範囲ですが、アンケートの数値範囲は1.0〜5.0です。この範囲にデータをスケーリングすることで、他のアンケート結果と同じスケールで評価ができるようにしています。
■関数を使う
関数を定義したら、メイン文でその関数を呼びだすことで関数を使うことができます。次のコード修正を行い、sentiment_analysis()
関数を使ってみましょう。
<省略> df = pd.read_excel('sample.xlsx') # Q5の文章を感情解析し、新規作成したQ5_score列に結果を追加 # 追加 df['Q5_score'] = df['Q5'].apply(sentiment_analysis) # 追加 # 集計:最小値、最大値、平均値を計算 min_values = df[['Q1', 'Q2', 'Q3', 'Q4', 'Q5_score']].min() # Q5_scoreを追加 max_values = df[['Q1', 'Q2', 'Q3', 'Q4', 'Q5_score']].max() # Q5_scoreを追加 mean_values = df[['Q1', 'Q2', 'Q3', 'Q4', 'Q5_score']].mean() # Q5_scoreを追加 <省略>
df['Q5_score']
で新しい「Q5_score」という列を「Q5」の右隣に作成します。.apply()
メソッドは指定した列や行のすべての要素に対して同じ関数による処理を実行するためのメソッドです。Q5_score
を追加することで、この列に対しても集計が行われるようになります。■結果を確認する
こちらが実行した後に作られるExcelファイルの中身です。Q5列の文章に対して感情分析された結果がQ5_score列に数値化され、その数値データがMin, Max, Aveで集計されている結果となりました。
5. 全体のコードはこちらから
Excelは色々な企業でさまざまな用途に使える素晴らしいソフトです。しかし、Pythonと併用することでより柔軟で高度な分析が可能になります。世界中で開発が進んでいるPythonのライブラリ群を使えば、きっとあなたの仕事に役立つ新たな可能性が見えてくるはずです。
今回のコードは詳細な説明をあえて省きました。ご興味のある読者はぜひ基礎からPythonの文法を学び、何か面白いアプリを作ってみてください。
最後に、この記事で紹介した全体のコードを載せます。PCで開ける方はぜひコピペして遊んでみてください。
import pandas as pd
from textblob import TextBlob
from deep_translator import GoogleTranslator
def sentiment_analysis(text, min_score=1, max_score=5):
"""感情解析をする関数"""
translated_text = GoogleTranslator(source='ja', target='en').translate(text)
analysis = TextBlob(translated_text)
polarity = analysis.sentiment.polarity
# 指定範囲のスコアにスケーリング
score = ((polarity + 1) * (max_score - min_score) / 2) + min_score
return score
# Excelファイルを読み込む
df = pd.read_excel('sample.xlsx')
# Q5の文章を感情解析し、新規作成したQ5_score列に結果を追加
df['Q5_score'] = df['Q5'].apply(sentiment_analysis)
# 集計:最小値、最大値、平均値を計算
min_values = df[['Q1', 'Q2', 'Q3', 'Q4', 'Q5_score']].min()
max_values = df[['Q1', 'Q2', 'Q3', 'Q4', 'Q5_score']].max()
mean_values = df[['Q1', 'Q2', 'Q3', 'Q4', 'Q5_score']].mean()
# 計算した結果をデータフレームに追加
df.loc['Min'] = min_values
df.loc['Max'] = max_values
df.loc['Ave'] = mean_values
# 既存の列ヘッダーの調整
df.insert(0, 'Summary', [''] * (len(df) - 3) + ['Min', 'Max', 'Ave'])
# 新しいExcelファイルとして保存
output_file = 'results.xlsx'
df.to_excel(output_file, index=False)
いかがでしたか。次回はPython×PowerPointというテーマで学んでいきます。お楽しみに。