Geminiでデータ分析ができるようになったようですね。Googleスプレッドシートから直接分析できるのであれば結構便利かもしれません。
プログラミングの現場には様々な形で生成AIが入り込んできていますが、その流れがデータエンジニアリングやデータ分析の方にもやってくる可能性もあります。
ということで、早速ピープルアナリティクスを題材にGeminiで分析をやってみました。デモ的にざっと流した様子を動画にまとめたので、まずはこちらをご覧くださいませ。
ご覧の通り、Google WorkspaceのGoogleスプレッドシートから直接呼び出す形で実行しています。
自然言語ベースでの作業指示でここまでできるというのはすごいですね。
1年半前にChatGPTのCode Interpreterが登場したときも驚きましたが、そのときよりも洗練されています。
なお、こちらの動画は手早く見えるように編集しているので、実際はもう少し時間がかかっています。キャプチャした動画の元ファイルを確認すると、データを読み込ませてから最後のまとめまで、おおよそ10分というところでした。
AIでここまでできるようになるとデータアナリストの仕事は今後どうなるだろう?と思われるかもしれませんね。ただ、私の感触としては、まだ手放しに使えるわけではないなという印象を持ちました。経験者によるレビューや伴走は必要です。
ということで、この記事では先ほどのデモ動画を作る過程を解説しながら、注意点などを整理していきます。
※記事を書いている2025年4月3日現在、Google Workspace上でAlpha版の扱いになっています。正式リリース時には各種変更がある可能性がありますので、ご注意くださいませ。
分析テーマについて
試したテーマは、ピープルアナリティクスでは割とよく実施されている従業員エンゲージメントの分析です。
各企業は従業員エンゲージメントを向上させるべく様々な施策に取り組んでいますが、今回は問題発見フェーズを意識した探索的な分析の場面を想定しました。
つまり、何らかの形で従業員エンゲージメントのスコアを収集できたとして、それに影響を与えている要因を探ろうというわけです。ただ、実証的な分析には至っておらず、相関分析レベルで「手掛かり」を探すタスクとなります。
ふわっとしたアイデアをGeminiに投入する
一般的にデータ分析では、探索の場面でも仮説があるのが望ましいです。しかし、ピープルアナリティクスのプロジェクトでは、ふわっとした「アイデア」から話がスタートすることが多い印象です。例えばこんな感じに。

こうしたアイデアや疑問をデータ分析のタスクにと押し込むのがデータアナリストの役割ですが、今回はあえてこのレベルでGeminiに依頼してみることにしました。
時間外とエンゲージメントの関係
まずは時間外の分析からスタート。分析の過程を順に解説していきます。
全体でのざっくりとした分析
データには「残業」という項目はありませんが、「時間外時間数_月平均」という項目があります。そこで、以下のような言葉でやや曖昧にお願いしてみました。
私: 時間外時間数とエンゲージメントの関係を分析して。そうすると、こんな形で何とか目的の項目を探り当てることができたようです。
Gemini: "時間外時間数(月平均)" という列が見つからないため、KeyErrorが発生しました。列名に誤りがある可能性があります。列名をもう一度確認し、分析を再試行します。
列名を修正して再度実行しましたが、まだ"時間外時間数(月平均)" という列が見つかりません。出力された列名を確認し、"時間外時間数(月平均)" に類似する列名を探します。ところで、なぜ「時間外時間数(月平均)」という列を探しに行ったのでしょうか。実は前のステップでデータの要約を試みていて、そのときにGemini自身でカッコ付きで整理していたようなのです。

自分がこれまでに出したアウトプットを参照しながら分析できるのはよいところですが、対応表までは持っていないようですね。ちょっとうっかりなところがあります。
今回は一発で上手くいきましたが、場合によりエラーで止まってしまうこともありました。例えば、指示をより曖昧に「時間外とエンゲージメントの関係を分析して」とすると、当該項目を探せないことがしばしばありました。
現場ではこれくらい適当な言葉が出てくると思いますが、生成AIに指示を出すときには具体的にする方がよさそうです。とはいえ、このくらいのふわっとした指示で分析が進むのは画期的と言えますね。
一方、分析結果としては次のような結果が得られました。

Gemini: "時間外時間数_月平均" とエンゲージメントの相関係数は 0.17 でした。これは、弱い正の相関を示しています。つまり、時間外時間数が多い従業員ほど、エンゲージメントもわずかに高い傾向にあります。
しかし、散布図を見ると、データは広く分布しており、相関はあまり明確ではありません。時間外時間数とエンゲージメントの関係は、他の要因にも影響されている可能性があります。Geminiの考察のとおり、全体でみると両者に関係があるとは言えなさそうです。散布図について言及しているのもいいですね。
分析の詳細化をお願いする
全体で傾向が見えないときは、何らかの切り口を使って層別で見てみるのも有効な戦術です。
今は時間外に着目していまずが、職場によって働き方そのものが異なることは容易に想像ができます。元々時間外のベースラインが違うデータを混ぜて分析してもよくわからいのではないでしょうか。
ということで、部ごとに分析をするように依頼してみました。
私: では、部ごとに、散布図と相関係数を使って分析してみて。うっかり主語を抜かした曖昧な指示となりましたが、くみ取って分析してくれました。少々長いですがGeminiの分析結果を引用します。
Gemini:
各部における時間外時間数とエンゲージメントの相関関係は以下のようになりました。
営業部: 相関係数 0.59 と、中程度の正の相関が見られます。時間外時間数が多いほど、エンゲージメントも高い傾向にあります。
開発部: 相関係数 -0.23 と、弱い負の相関が見られます。時間外時間数が多いほど、エンゲージメントはわずかに低い傾向にあります。
経理部: 相関係数 -0.18 と、弱い負の相関が見られます。時間外時間数が多いほど、エンゲージメントはわずかに低い傾向にあります。
研究部: 相関係数 0.41 と、弱い正の相関が見られます。時間外時間数が多いほど、エンゲージメントもわずかに高い傾向にあります。
総務部: 相関係数 0.01 と、ほとんど相関がないと言えます。時間外時間数とエンゲージメントの間に明確な関係は見られません。
部によって時間外時間数とエンゲージメントの関係性が異なっていることがわかりました。特に営業部では正の相関が強く、開発部と経理部では負の相関が見られました。
考察
このような違いは、各部署の業務内容や働き方、従業員の特性などが影響している可能性があります。例えば、営業部では、時間外労働が成果に繋がりやすく、それがエンゲージメントを高めているのかもしれません。一方、開発部や経理部では、時間外労働が必ずしも成果に繋がらず、むしろ負担感や不満につながり、エンゲージメントを低下させている可能性があります。
注意点
相関関係は因果関係を意味するものではありません。時間外労働がエンゲージメントを直接的に引き上げる、または引き下げるわけではないことに注意が必要です。他の要因が影響している可能性もあります。
今後の分析
各部署の業務内容や働き方の違いを詳細に分析し、時間外時間数とエンゲージメントの関係性にどのような影響を与えているのかを調査する。
他の要因(例えば、年齢、性別、役職、仕事内容への満足度など)が時間外時間数とエンゲージメントの関係性にどのように影響しているのかを分析する。
エンゲージメントを向上させるための施策を検討する際に、部署ごとの特性を考慮する。部ごとに分析したことで、相関係数が高くなる部があることが発見できました。基本的に相関係数による考察をしながら、相関と因果に関する注意点も指摘してくれています。ざくっとした依頼のわりには、なかなか丁寧な印象ですね。
ところが、よく読んでみると今回は散布図に対する考察が見当たりません。以下のような散布図を出力してくれているのですが、これは見ていないようですね。散布図を見ればもう少し考察の書き方も変わるでしょう。

ちなみに、この分析のためにGeminiが書いたPythonコードはこちらになります。
import pandas as pd
import altair as alt
from difflib import get_close_matches
# Read the CSV file into a DataFrame
df = pd.read_csv('HRトイデータ_人事情報_拡張版 - HRトイデータ_人事情報_拡張版 - v5.csv')
# Display all column names
print(df.columns)
# Replace full-width spaces in column names with half-width spaces
df.columns = df.columns.str.replace(' ', ' ', regex=False)
# Check for the column "時間外時間数_月平均" or find a similar one
if '時間外時間数_月平均' in df.columns:
target_col = '時間外時間数_月平均'
else:
similar_columns = get_close_matches('時間外時間数(月平均)', df.columns)
if similar_columns:
target_col = similar_columns[0]
else:
raise ValueError('「時間外時間数(月平均)」に類似する列名は見つかりませんでした。')
# Get unique values from the "部" column
unique_departments = df['部'].unique()
# Iterate through each unique department
for department in unique_departments:
# Filter the DataFrame for the current department
df_filtered = df[df['部'] == department].copy()
# Drop rows with null values in the relevant columns
df_filtered.dropna(subset=[target_col, 'エンゲージメント'], inplace=True)
# Calculate the correlation coefficient
correlation_coefficient = df_filtered[target_col].corr(df_filtered['エンゲージメント'])
# Create a scatter plot
chart = alt.Chart(df_filtered).mark_circle().encode(
x=alt.X(target_col, title='時間外時間数'),
y=alt.Y('エンゲージメント', title='エンゲージメント'),
tooltip=[target_col, 'エンゲージメント']
).properties(
title=f'部: {department} - 時間外時間数 vs エンゲージメント (相関係数: {correlation_coefficient:.2f})'
).interactive()
# Save the chart as a JSON file
chart.save(f'scatter_plot_dept_{department}.json')
# Print the department name and correlation coefficient
print(f"部: {department}, 相関係数: {correlation_coefficient:.2f}") グラフを描くのにaltairを使っていることがわかります。また、前処理はアドホックな感じですが、それまでにやった分析のプロセスを上手く流用(コピペ)していることもわかりました。
実行するたびにアプローチが変わる
今回は散布図を使ってくれましたが、実行するたびにアプローチがコロコロ変わるのは少し困りました。例えば、以下のようなバリエーションがありましたが、どれもイマイチですね。
- 時間外を細かな階級に区切り、階級ごとのエンゲージメントスコアの平均をエラーバー付きの棒グラフで分析する。
- 時間外を3つの階級(高・中・低)に区切って箱ひげ図を使って分析する。
- 時間外とエンゲージメントを量的変数のまま分析するが、なぜか折れ線グラフで分析しようとする。
また、はじめの分析で躓いてしまうと軌道修正が難しい印象もありました。そのような場合は画面をリフレッシュして一からやり直した方が早かったです。
分析アプローチに唯一の正解はないため、バリエーションが出てくるのは仕方のない話かもしれません。つまり、ユーザーがアプローチも含めてその妥当性を評価できる必要があるわけですね。
上司の影響を分析する
従業員エンゲージメントを高めるにはチームの文化に着目する必要があり、チームリーダー、つまり上司が重要な役割を果たすといわれています。
エンゲージメントを高める主な原動力が、対話の場と目配りであることを踏まえると、「目の届く範囲」をいかに定めるかが重要だ。従業員のエンゲージメントを高めるスパン・オブ・コントロールは、リーダーが年間を通して毎週、メンバー一人ひとりと一対一で対話できる範囲でなくてはならないことが調査で明らかになっている。
引用元:チームの力が従業員エンゲージメントを高める,マーカス・バッキンガム ,アシュリー・グッドール ,マット・ペリー,ハーバードビジネスレビュー2019年11月号
とはいえ、上司の大切さを一般論で語っても「ウチの会社ではどうなんだろう?」という疑問が解消されなければ、具体的な対策に乗り出せないこともあるでしょう。そこで、上司と部下の関係に着目して分析を進めていきます。
ノーヒントで分析ネタを考えるのは難しそう
クライアントの理想としては、「上司によって部下のエンゲージメントが影響するかもしれないから、何か考えて分析してみて」と言いたいところでしょうか。
実際にこの雰囲気の言葉を何度かプロンプトに投入してみたのですが、上手くいくことはほとんどありませんでした。データに「上司」という名称の項目がないので、どうしたらよいか分からなくなってしまうのでしょう。
一度だけ奇跡的に分析が進んだことがあり、その場合は上司の違いを組織の違いに見立てて層別に分析をしていました。ただ、私がやりたかったことには到達しませんでした。
複雑なタスクはアプローチの揺れが大きい
ということで、より細かくお願いしてみました。まず試したのがこちらのプロンプトです。
私: 上司によって部下のエンゲージメントが影響するかも。上司と部下の関係はデータ上明記されていないので、同じ課のグレードMの従業員を上司、グレードLまたはSの従業員を部下と見立てて、上司のコンピテンシーと部下のエンゲージメントの関係を分析してみて。上司と部下を関係づけるデータはありませんが、課に着目すると概ね上司が見ているチームメンバーの範囲を特定することができます。一方、上司のビヘイビアやスキルを計量したデータはありません。そこで、上司の特徴を表す代替変数として、上司のコンピテンシーを利用することにしたわけです。
HRトイデータにはいくつかのコンピテンシーの項目が含まれているので、チームのエンゲージメントと関連のあるコンピテンシーを探ることが狙いです。これはHRトイデータを作ったとき、ある項目と緩やかに関連づけていたので、それを発見するタスクとなります。
これで上手くいきそうだったのですが、何度か試したところ、概ね以下2つのアプローチにランダムにわかれてしまいました。
- データを課単位でGroupbyし、管理職(グレードM)のコンピテンシーの平均と、一般従業員(グレードLまたはS)のエンゲージメントの平均を算出。つまり、課レベルでデータを集約して分析する。
- データから一般従業員(グレードLまたはS)のデータを抽出して分析対象に⇒①。それと並行して課の管理職(グレードM)のコンピテンシーの平均値を算出⇒②。①を起点にLeft Joinして②を結合して分析する。
管理職の特性を調査するのであれば、1.の方法が素直に見えます。それでもいいのですが、今回は従業員の働き方として時間外にも着目しているので、2.のアプローチをとった方が後々便利です。
データ処理の方法を明記すると狙い通りに
ということで、以下のようなプロンプトに変えてみたところ、狙い通りの分析となりました。データ処理の方法を追記したわけです。
私: 上司によって部下のエンゲージメントが影響するかも。上司と部下の関係はデータ上明記されていないので、同じ課のグレードMの従業員を上司、グレードLまたはSの従業員を部下と見立てて、上司のコンピテンシーと部下のエンゲージメントの関係を分析してみて。
そのとき、データをグレードLとSのデータに絞り込んだ上で、各々のデータに対して上司のコンピテンシーを計算してデータを作って。Geminiの分析結果は以下の通り。相関係数の表はカットしました。
Gemini: 分析結果は以下のようになりました。
グレードLの考察
グレードLの従業員では、上司の「チームワーク」と「専門力」のコンピテンシーが高いほど、部下のエンゲージメントが高いという正の相関が見られました。 それ以外のコンピテンシーでは、弱い負の相関が見られましたが、あまり影響はないと考えられます。
グレードSの考察
グレードSの従業員では、「戦略構想力」と「チームワーク」のコンピテンシーが高いほど、部下のエンゲージメントが高い傾向にあり、「マネジメント」と「対人」のコンピテンシーが高いほど、部下のエンゲージメントが低い傾向にありました。
まとめ
グレードL、Sともに、上司の「チームワーク」のコンピテンシーは部下のエンゲージメントに良い影響を与えている可能性があります。
グレードSでは、「戦略構想力」の高さも部下のエンゲージメントに良い影響を与えている可能性があります。
グレードSでは、「マネジメント」と「対人」のコンピテンシーの高さは、部下のエンゲージメントに悪影響を与えている可能性があります。
考察
分析結果から、上司のコンピテンシーは部下のエンゲージメントに影響を与える可能性があることが示唆されました。特に「チームワーク」のコンピテンシーは、部下のエンゲージメントに良い影響を与える可能性が高いと考えられます。
ただし、今回の分析では、同じ課のグレードMの従業員を上司と見立てましたが、実際の上司と部下の関係とは異なる可能性があります。また、相関関係があるからといって因果関係があるとは限りません。他の要因が影響している可能性もあります。
今後の分析
上司と部下の関係を明確にしたデータを用いて、上司のコンピテンシーと部下のエンゲージメントの関係を分析する。
エンゲージメントに影響を与える他の要因(例えば、年齢、性別、役職、仕事内容への満足度など)を分析する。
上司のコンピテンシーを向上させるための施策を検討する。散布図も欲しいところですが、ひとまず相関係数で仮説の種を見つけたのだと解釈すれば一歩目として許容できそうです。
また、ここでも相関と因果についての注意もあり、更に上司と部下の関係が正確に表現できていない点にも言及しています。データアナリストのビヘイビアとして、制約事項を誠実に伝えるのは常に正しいことです。
重回帰による検証をお願いする
次に、現場でもリクエストされることが多い回帰分析をお願いしてみることにしました。単に回帰をやってみてというのではなく、先ほどGeminiが答えた内容を引用して指示を出しています。
私: 以下の仮説を重回帰を使って分析してみて。
『特に「チームワーク」のコンピテンシーは、部下のエンゲージメントに良い影響を与える可能性が高いと考えられます。』そうすると、少々時間をかけながら重回帰を回してくれました。今回はstatsmodelsを使って分析していますが、ときどきscikit-learnを使うこともありました。統計的にあれこれ考察したいのならstatsmodelsの方がやりやすいので、上手くいかないときは明示した方がよいでしょう。
import pandas as pd
import statsmodels.api as sm
# Read the CSV file into a DataFrame
df = pd.read_csv('HRトイデータ_人事情報_拡張版 - HRトイデータ_人事情報_拡張版 - v9.csv')
# Replace full-width spaces in column names with half-width spaces
df.columns = df.columns.str.replace(' ', ' ', regex=False)
# Filter data to only keep rows where 'グレード' is either 'L' or 'S'
df_filtered = df[df['グレード'].isin(['L', 'S'])].copy()
# Get competency columns
COMPETENCY_COLUMNS = [col for col in df.columns if col.startswith('コンピテンシー_')]
# Calculate mean competency scores for managers and merge with the original dataframe
df_merged = df_filtered.merge(
df[df['グレード'] == 'M'][COMPETENCY_COLUMNS + ['課']].groupby('課').mean(),
on='課',
suffixes=('', '_マネージャー')
)
# Create separate DataFrames for 'L' and 'S' grades
df_L = df_merged[df_merged['グレード'] == 'L'].copy()
df_S = df_merged[df_merged['グレード'] == 'S'].copy()
# Add a constant term to the predictor variables
X_L = sm.add_constant(df_L[[col + '_マネージャー' for col in COMPETENCY_COLUMNS]])
X_S = sm.add_constant(df_S[[col + '_マネージャー' for col in COMPETENCY_COLUMNS]])
# Fit the regression models
model_L = sm.OLS(df_L['エンゲージメント'], X_L).fit()
model_S = sm.OLS(df_S['エンゲージメント'], X_S).fit()
# Print the results
print("\n--- 重回帰分析結果 (グレード L) ---\n")
print(model_L.summary())
print("\n--- 重回帰分析結果 (グレード S) ---\n")
print(model_S.summary())
# Extract coefficients and p-values for 'チームワーク'
coef_teamwork_L = model_L.params['コンピテンシー_チームワーク_マネージャー']
pvalue_teamwork_L = model_L.pvalues['コンピテンシー_チームワーク_マネージャー']
coef_teamwork_S = model_S.params['コンピテンシー_チームワーク_マネージャー']
pvalue_teamwork_S = model_S.pvalues['コンピテンシー_チームワーク_マネージャー']
# Print the results for 'チームワーク'
print("\n--- チームワークの影響 (グレード L) ---")
print(f"係数: {coef_teamwork_L:.2f}, p-値: {pvalue_teamwork_L:.2f}")
print("\n--- チームワークの影響 (グレード S) ---")
print(f"係数: {coef_teamwork_S:.2f}, p-値: {pvalue_teamwork_S:.2f}") このPythonコードを見ていて気付いたことがありました。
プロンプトを実行するたびにライブラリを読み込むところから始まり、データの読み込みや前処理も実行されているように見えます。もしかすると、前のプロンプトで実行したときのオブジェクトが残っていないのかもしれません。実際、上のコードの前半部分は前のプロンプトで実行されたコードでした。
プロンプトが実行されるたびにコード全体が再実行されるなら、大規模なデータや複雑な前処理をするとオーバーヘッドが高そうです。正式版でこのあたりの課題が解決されていると嬉しいですね。
時間外と上司の特徴を含めて重回帰する
続いて、モデル改善として、時間外や部の情報を重回帰の説明変数に入れてみることにしました。はじめて実行したときには以下の一文目だけでやってみました。そうすると、元のモデルとの比較をしてくれなかったので、二文目を追加しました。
私: このモデルの説明変数に時間外時間数と部(職場環境の代替変数)の情報を加えて分析して。元のモデルと比較しながら考察して。今回は偏回帰係数の推定結果を表で出力してくれました。

Gemini: 時間外時間数と部(職場環境の代替変数)の情報を加えてエンゲージメントへの影響を分析した結果、以下のようになりました。
考察
1. チームワークの影響: 前回の分析と同様に、上司の「チームワーク」コンピテンシーは、部下のエンゲージメントに正の影響を与えており、両方のグレードで統計的に有意な結果となっています。
2. モデルの改善: 部と時間外時間数の変数を追加したことで、両方のグレードで決定係数(R-squared)が向上しました。これは、追加した変数がエンゲージメントの説明に役立っていることを示しています。
3. 時間外時間数と部:
- 時間外時間数: グレードLでは、時間外時間数が多いほどエンゲージメントが低くなるという有意な負の相関が見られました。グレードSでは、弱い負の相関が見られましたが、有意ではありませんでした。
- 部: 部によってエンゲージメントに差があることがわかりました。特に、研究部と開発部は、他の部と比較してエンゲージメントが高い傾向が見られました。
結論
今回の分析により、上司の「チームワーク」コンピテンシーが部下のエンゲージメントに良い影響を与えるという仮説は、時間外時間数と部を考慮に入れたモデルでも引き続き支持されました。また、時間外時間数と部もエンゲージメントに影響を与える要因であることが示唆されました。特に、長時間労働はエンゲージメントを低下させる可能性があり、所属する部によってエンゲージメントに差があることがわかりました。
注意点
- 「部」はあくまで職場環境の代替変数であり、実際の職場環境を完全に反映しているわけではありません。
- 相関関係は因果関係を意味するものではありません。
- モデルの解釈や変数の選択には、専門的な知識が必要です。
今後の課題
- 職場環境をより詳細に測定する変数を収集し、分析を行う。
- エンゲージメントに影響を与える他の要因(例えば、年齢、性別、役職、仕事内容への満足度など)を分析する。
- 上司のコンピテンシーを向上させるための具体的な施策を検討する。
- 部署ごとのエンゲージメント向上施策を検討する。ここでも「注意点」のセッションでいろいろと制約事項を述べていますね。「今後の課題」を読むと、今回の分析で分かったことを踏まえつつ、その限界も加味してアクションを促している様子がわかります。"~を検討する"という文言が多いのは人間的ですね。
この後、全体のアウトプットをまとめる指示を出して分析を完了させました。その様子は動画(3:15付近)をご覧ください。
まとめ
今回はピープルアナリティクスを題材にGeminiでデータ分析を試してみました。ビジネス向けGoogle WorkspaceのGoogleスプレッドシートから直接呼び出す形ですので、正式版ではある程度セキュリティも担保されるのではと期待しています。
まだ課題も多い
一方、手放しで分析をお願いできるかというとやや疑問で、やはりデータ分析に慣れた方が評価しながら使わないとリスクがあります。実行のたびに分析アプローチが変わりますし、場合により意図と異なる手法を選択する場合もありました。
それではシニアデータアナリストが本業の中でがっつり使えるかというと、まだ改善の余地があると思います。例えば、プロンプトが実行されるたびに前処理が実行されて非効率です。
また、手を動かしながらデータを理解するという行為から遠く、発想を広げるには工夫が必要に感じました。今回の例では、私がデータを作っているのでプロンプトを作りやすかったのは否めません。もしリアルな分析の場で利用しようとするなら、問題設定やデータの理解に時間がかかるはずです。
データドリブン経営の武器になる日が来るかも
とはいえ、データアナリストやデータサイエンティストの立場で考えると、生成AIの応用範囲の広がりは注視すべきでしょう。
データドリブン経営の定着には分析業務の内製化が重要だと私は考えています。業務で発生した疑問を素早く解消するためには外注している暇などないからです。
特に、ピープルアナリティクスにおいては、ガチっとした分析に入る前にアレコレディスカッションをすることが大切になりますが、そのサイクルに生成AIが自然と入り込めば随分楽になるのではないでしょうか。

とはいえ、そんな日がやってきたとしても、生成AIを使う側がデータ分析に対するリテラシーやノウハウを持っていることの大切さは変わらないはずです。
ゆえに、今データ分析の実践を積むことは決して無駄にはならないと考えています。