VIF(分散拡大要因)とは結局何なのか
重回帰分析を行う際、多重共線性を回避するため、あらかじめその有無をVIF(Variance inflation factor: 分散拡大要因)によって確認することか一般的かと思います。
一般的にはVIFが10を超えると多重共線性の問題が生じる恐れがあると判断し1、適切な対処が必要と言われていますが、そもそもVIFは何をどう計算して求められる値なのでしょうか。
ということで調べてみたことをまとめてみます。
ちなみに、多重共線性については過去に記事を書いているので参考までに見てみてください。
VIFとは
分散拡大要因(Variance Inflation Factor: VIF)は重回帰分析などの多変量解析で多重共線性を評価する際の指標です。分散拡大要因は多変量解析で使用している説明変数のうち1つを従属変数,その他の説明変数を説明変数とした重回帰分析の決定係数(R2)を用いて以下の式で計算されます。VIF=1/(1-R2)
ある説明変数が、それ以外の説明変数にどれだけ説明されるかを示す値がVIFです。したがって、VIFは説明変数の数だけ求められることになります(被説明変数は対象外)。
仮に説明変数Aと説明変数Bに高い相関関係があるとしましょう。この場合、説明変数Bの説明変数Aに対する説明力があるため、R2は大きくなります(たとえば0.9)。その場合のVIFは、1 / (1 - 0.9) = 10となるため、多重共線性が生じる可能性が高いと判断できます。
なおこのVIFは、x1~xiによるyへの重回帰分析で得られた当該説明変数の偏回帰係数の分散を、xj(当該説明変数)によるyへの単回帰分析で得られた偏回帰係数の分散を割ることでも計算できます2。これが分散拡大要因と言われるゆえんです。
偏回帰係数の分散が大きい=標準誤差が大きいといえます。標準誤差が大きいとt値が小さくなるため(分母が標準誤差)、t値と連動するP値も当然大きくなります。
P値が大きくなると、有意水準を超えてしまい、本来的には有意となるはずだった偏回帰係数が有意とならない事象が発生する可能性が出てきます。これがまさに多重共線性による問題の一つです。
このような問題を防ぐため、不要な説明変数を削除したり、因子分析や主成分分析によって説明変数を合成したりするなどの対処が必要となります。
参考資料
- Q23 | 統計に関するFAQ | 看護・保健系大学院生のための統計学習サイト
- http://www.econ.kyoto-u.ac.jp/~hujii/myweb/Semi%20Statistic%20Analysis%2006.pdf
- http://www.omori.e.u-tokyo.ac.jp/coretext/chapter4_vif.pdf
-
ちなみに、Pythonの統計解析ライブラリであるstatsmodelsではVIFが5を超えると標準誤差が過大となる(=結果として多重共線性の問題が生じる)ことについて指摘しています。↩
なぜARPUを離脱率で割るとLTVが求められるのか
LTV(Lifetime value: 顧客生涯価値)を売上ベースで計算する場合、計算式は以下のようになります1。
なるほど、と言いたいところですが、なんで離脱率で割ってるのか直感的にはわかりません。
ということで計算してみました。
計算
まず、1ユーザーではなくユーザー全体の総収益からユーザー全体のLTVを求めていきます。その際、ユーザー数は毎月一定の割合(離脱率)で減少すると仮定します。言い換えると、毎月一定の割合のユーザーが継続利用しているといえます。
継続率をr, 離脱率をcr3, ユーザー数をu, 継続率をrとすると、LTVはこんな感じで求まります。
LTV = u × ARPU + u × r × ARPU + u × r2 × ARPU + ... + u × rn × ARPU・・・①
※あえて等比数列の公式は使わずこのまま進めます。
両辺にrを掛けると、
r × LTV = u × r × ARPU + u × r2 × ARPU + ... + u × rn+1 × ARPU・・・②
ここで①-②して
(1 - r) × LTV = u × ARPU (1 - rn+1)
r < 1なのでrn+1は0に収束します。したがって、
(1 - r) × LTV = u × ARPU
LTV = (u × ARPU) / (1 - r)
最終的に求めたいのはユーザー一人あたりのLTVなのでuで割ると、
LTV = ARPU / (1 - r)
継続していない人=離脱した人なので、1 - r = crとなります。したがってLTVは、
LTV = ARPU / cr
ということで、ARPUを離脱率で割るとLTVが求められることがわかりました!冷静に計算すると結構簡単なことでしたね。
この記事が誰かのお役に立ったのであれば幸いです。
参考
Pythonでコンジョイント分析に挑戦
マーケティング戦略や施策を検討する際、その第一歩として、自社の顧客を深く理解することが重要となります。
ここ数年のAI・データサイエンティストブームもあってか、属性・行動データの分析を顧客理解の主たる手段として位置付けているケースをしばしば目にします。しかしながら、限られた属性・行動データだけではわかり得ないことも多く、データ分析だけで顧客に関する理解を深めるのは簡単ではありません。
属性・行動データの分析を超え、より顧客の真意を明らかにできるような方法がないか探していたとき、コンジョイント分析(Conjoint analysis)のことを知りました。深く顧客を理解するという点では、デプスインタビューやエスノグラフィーなどの手法には劣るとは思いますが、従来のデータ分析を超える洞察を得られると感じています。
ということで前置きが長くなりましたが、コンジョイント分析の概要とPythonでの分析方法、分析結果の解釈について簡単にまとめていきたいと思います。ちなみに、2020年12月18日現在、Pythonでコンジョイント分析を実装したという日本語の記事はこれが初です!(たぶん)
コンジョイント分析とは
Albertさんに聞いてみました。
コンジョイント分析とは、最適な商品コンセプトを決定するための代表的な多変量解析を用いた分析方法で、個別の要素を評価するのではなく、商品全体の評価(全体効用値)することで、個々の要素の購買に影響する度合い(部分効用値)を算出する手法です
この文章だけで理解するのは難しそうなので、具体的な例をあげて説明します。
ノートパソコンを購入するときのことを考えてみましょう。 購入に際して検討するポイントはある程度決まっているかと思います。価格、ブランド、CPU性能、メモリ、ディスク容量、重さなどがありそうです。
それらの要素を使い、被調査者から以下のようなアンケートを収集します。
以下に示すノートパソコンについて、10点満点で評価してください。
- No.1 60,000円, メモリ8GB, SSD256GB
- No.2 70,000円, メモリ4GB, SSD1TB
- No.3 50,000円, メモリ8GB, SSD128GB
・・・
このようなアンケートを複数人から収集することで、製品・サービスそのもの対する評価と、製品・サービスを構成する要素との関係性をデータとして集めることができます。
コンジョイント分析では、アンケートで得られた消費者の製品・サービスそのものに対する評価を通じて、製品・サービスが有する各要素の購買への影響度・重要度を明らかにします。
たとえば「消費者にとっては価格が一番重要で、二番目はメモリだった」というように、消費者が製品・サービスに対して何を重視しているを分析結果から客観的に説明することができます。
なぜコンジョイント分析か
このような回りくどいアンケートを取らなくても、製品・サービスの各要素に対して個別に評価してもらってもよさそうにも思えます。
しかしこれでは、実際に購買を検討する際に発生するようなトレードオフ(たとえば、価格とディスク容量)を考慮した評価は難しいため、実際の購買と整合しないような精度の低い回答となってしまうおそれがあります。
これに対しコンジョイント分析で用いるアンケートでは、実際に店頭やネットで商品を選ぶときのようなシチュエーションを再現することによって、よりリアリティのある回答を得られることができるのです。
使用するデータ
前述の通り、被調査者から収集したアンケートが必要となります。
このとき問題となるのが各要素の組合せです。
仮に、ノートパソコンに関する質問項目を「価格、メモリ、ディスク容量」の三つとし、各要素のパターンが高い/低い(大きい/小さい)の二択だったとしましょう。
この場合、単純に考えると2×2×2で8パターンを被調査者に質問する必要が出てきます。8パターンならまだ許せますが、要素・パターンが増えるにつれ、回答数が膨大な数になり、すべてに回答してもらうことが難しくなりそうです。
これに対処するための手法が直交表です。
詳細の説明は省きますが、直交表の考え方に合わせて質問項目を設定することで、すべての組合せを質問しなくても、より少ない質問数で各要素について分析することが可能となります。
先ほどのノートパソコンの例では4通りだけ質問すればよいので、回答を得ることは容易にできそうですね。
Pythonによる実装
実務でコードと触れることが少ない私ですが、Pythonはギリギリ触れるので、Pythonでコンジョイント分析にトライしてみたいと思います。
データ
今回、ノートパソコンの価格、メモリ・ディスクのスペックに対して10点満点で評価してもらったという体で私が作成した回答データを使用します。
こういう感じのデータです。
回答者はprice, memory, storageの組合せに対してrating(評価)を付けています。
分析手法
今回は10点満点の評価を目的変数とするため、重回帰分析によって分析を行います。偏回帰係数やp値などの分析結果を確認する必要があるため、それらを出力できるstatsmodelsというライブラリを使用します。
重回帰分析の部分だけ抜き出すとこのようなコードになります。シンプルですね。
今回、各説明変数は2択となるため、分析にあたりpandasのget_dummiesで説明変数をダミー変数に変換する必要があります。このとき、多重共線性による問題を避けるため、オプションでdrop_first=Trueを設定するようにしましょう。
多重共線性の問題については以下の記事で簡単にまとめているのでご覧ください。 wannko5296.hatenablog.com
簡単に言うと、説明変数間の相関が大きい場合、偏回帰係数(目的変数に対する寄与度)の大きさや正負が不安定となり、分析結果の解釈が困難となる問題のことです。
ちなみに、今回実装したソースコードはこちらにあります。ご参考までに。
分析結果の解釈
さて、分析結果を見ていきましょう。
ダミー変数化の際に各要素の選択肢を一つ削除したため、他方の選択肢のみ表示されています。 ※なお、削除した方の偏回帰係数は0として解釈します。
coef(coefficient)は偏回帰係数を表しており、ある説明変数が1増加した場合に目的変数に対してどれだけ変化をもたらすかを示します。メモリ(memory_8GB)を例にとると、他の説明変数が一定としたとき、メモリが8GBだと評価が2.6点も上がるということになります。
ちなみに、5人分の回答を入力した際、メモリ重視な人を何人か想定して記入したので、これはある意味予想通りの結果です。
P>|t|はP値のことで、説明変数の目的変数に対する影響が統計的に有意であるかを判断するデータとなります。有意水準5%としたとき、メモリ(memory_8GB)のP値は0.000<0.05なので、メモリは評価に影響を及ぼす要素であると判断することができます。
P値についても以前記事を書いたので見てみてください。 wannko5296.hatenablog.com
一応グラフも載せておきます。
偏回帰係数がマイナスのものがあれば左側にもバーが伸びる予定だったのですが... 今回はすべて偏回帰係数が正であるため右側に伸びた普通のグラフになっています。
この分析結果を見ると、評価に対してもっとも寄与度が大きいのがメモリ、次いでストレージということがわかります。
価格については今回の分析では有意とならなかったため赤色で表現しています。なお、この場合はあくまで今回の分析では有意とならなかったというだけですので、「価格は評価には影響しない」と言い切ることはできません。
今回は要素の数と選択肢が少ないため、分析しなくてもある程度わかるような結果となりましたが、それらをより複雑にすることで、直感的にはわかり得ないような顧客の購買要因やトレードオフが見えてくるかもしれませんね。
おわりに
この記事ではコンジョイント分析の概要とPythonでの分析について簡単に説明しました。
アンケートが必要なのでちょっと手間はかかりますが、属性・行動データを分析するだけでは見えてこないような洞察が得られると思います。機会があればぜひやってみてください。
なお、「Pythonでマーケティングサイエンス(コンジョイント分析編)」(キリッ と書いていますが、続編の予定はありませんんのでご了承ください。
参考資料
- Conjoint Analysis: A simple python implementation
- How to Do Conjoint Analysis in python | Arie P Sutiono
- エクセルでコンジョイント - マーケティングテクノロジー株式会社
- コンジョイント分析についての考察
- コンジョイント分析とは | データ分析基礎知識
- 学習意欲向上にむけた講義形態の違いによる選好の分析
- Rでコンジョイント分析
- コンジョイント分析 | CBR消費者行動研究所
参考:ソースコード
import matplotlib.pyplot as plt import numpy as np import pandas as pd import statsmodels.api as sm import seaborn as sns plt.style.use('bmh')
df = pd.read_csv('./conjoint/conjoint_sample.csv')
df.head()
ans_id | price | memory | storage | rating | |
---|---|---|---|---|---|
0 | 1 | 60,000 | 4GB | 128GB | 3 |
1 | 1 | 60,000 | 8GB | 512GB | 9 |
2 | 1 | 80,000 | 4GB | 512GB | 5 |
3 | 1 | 80,000 | 8GB | 128GB | 7 |
4 | 2 | 60,000 | 4GB | 128GB | 4 |
y = pd.DataFrame(df['rating'])
x = df.drop(columns=['ans_id', 'rating'])
x_dum = pd.get_dummies(x, columns=x.columns, drop_first=True)
x_dum.head()
price_80,000 | memory_8GB | storage_512GB | |
---|---|---|---|
0 | 0 | 0 | 0 |
1 | 0 | 1 | 1 |
2 | 1 | 0 | 1 |
3 | 1 | 1 | 0 |
4 | 0 | 0 | 0 |
model = sm.OLS(y, sm.add_constant(x_dum)) result = model.fit() result.summary()
Dep. Variable: | rating | R-squared: | 0.749 |
---|---|---|---|
Model: | OLS | Adj. R-squared: | 0.702 |
Method: | Least Squares | F-statistic: | 15.94 |
Date: | Thu, 17 Dec 2020 | Prob (F-statistic): | 4.60e-05 |
Time: | 11:12:48 | Log-Likelihood: | -26.635 |
No. Observations: | 20 | AIC: | 61.27 |
Df Residuals: | 16 | BIC: | 65.25 |
Df Model: | 3 | ||
Covariance Type: | nonrobust |
coef | std err | t | P>|t| | [0.025 | 0.975] | |
---|---|---|---|---|---|---|
const | 4.2000 | 0.458 | 9.165 | 0.000 | 3.229 | 5.171 |
price_80,000 | 0.2000 | 0.458 | 0.436 | 0.668 | -0.771 | 1.171 |
memory_8GB | 2.6000 | 0.458 | 5.674 | 0.000 | 1.629 | 3.571 |
storage_512GB | 1.8000 | 0.458 | 3.928 | 0.001 | 0.829 | 2.771 |
Omnibus: | 1.314 | Durbin-Watson: | 1.581 |
---|---|---|---|
Prob(Omnibus): | 0.518 | Jarque-Bera (JB): | 1.148 |
Skew: | 0.514 | Prob(JB): | 0.563 |
Kurtosis: | 2.435 | Cond. No. | 3.73 |
Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
df_res = pd.DataFrame({ 'name': result.params.keys() , 'weight': result.params.values , 'p_val': result.pvalues })
df_res.head()
name | weight | p_val | |
---|---|---|---|
const | const | 4.2 | 9.108060e-08 |
price_80,000 | price_80,000 | 0.2 | 6.683526e-01 |
memory_8GB | memory_8GB | 2.6 | 3.456625e-05 |
storage_512GB | storage_512GB | 1.8 | 1.201026e-03 |
# グラフ表示のため行追加 # ※多重共線性回避のために削除した項目は偏回帰係数0 df_add = pd.DataFrame([['price_60,000', 0, 0.05], ['memory_4GB', 0, 0], ['storage_128GB', 0, 0]], columns=df_res.columns) df_graph = df_res.append(df_add , ignore_index=True) df_graph = df_graph.drop(df_graph.index[[0]])
df_graph = df_graph.sort_values('name')
df_graph
name | weight | p_val | |
---|---|---|---|
5 | memory_4GB | 0.0 | 0.000000 |
2 | memory_8GB | 2.6 | 0.000035 |
4 | price_60,000 | 0.0 | 0.050000 |
1 | price_80,000 | 0.2 | 0.668353 |
6 | storage_128GB | 0.0 | 0.000000 |
3 | storage_512GB | 1.8 | 0.001201 |
# 前処理 df_graph['abs_weight'] = np.abs(df_graph['weight']) df_graph['color'] = ["blue" if s < 0.05 else "red" for s in df_graph['p_val']] df_graph = df_graph.sort_values(by='abs_weight', ascending=True)
# グラフ表示 xbar = np.arange(len(df_graph['weight'])) plt.barh(xbar, df_graph['weight'], color=df_graph['color']) plt.yticks(xbar, labels=df_graph['name']) plt.show()
因子分析を行う前に知っておきたいこと
多変量解析について調べるとよく目にする因子分析(Factor analysis)。 個人的には使ったことがなく、わからないことが多かったので今回いろいろ調べてみました。
基本的な考え方というよりは、分析の大前提や注意点を中心にまとめていきます。
因子分析とは
因子分析を一言でいうと「観測可能な変数から、直接観測できない要因(因子)を明らかにする分析」です。
因子分析の考え方については、当記事の主題ではないので他のWebサイトにお任せします。
個人的にはこちらの資料とこちらの記事がわかりやすかったです。
どのような目的で使うか?
個人的に関心のあるマーケティングに的を絞ってまとめていきます。
まず、因子分析によって求められる因子得点、すなわち各個体が持つ各因子に対する重み*1をインプットとして顧客をクラスタリングすることが結構あるようです*2。顧客の行動データやアンケートの回答などから、価格重視クラスター、品質重視クラスターなどでわけることができそうですね。
また、ブランドイメージに関する調査においてブランドへの印象を因子分析で明らかにする(因子を明らかにしグルーピングする)という使い方もあります*3。個々の質問項目に対する回答からブランドに対する本質的な意識を抽象するイメージですね。
どのようなデータを使えばいいか?
使用するデータは量的変数(比例尺度や間隔尺度)です。
なお、非常に悪い~非常に良いなどの5段階評価(順序尺度)を間隔尺度とみなして使用しても構いません*4。
ただ、順序尺度をデータとして採用した場合、ピアソンの相関係数では値が伸びづらくなってしまいます。因子分析は変数間の関係性(相関)を基に因子を導く手法であるため、相関の有無が見えづらくなると意味のある分析結果が出てこない可能性があります。
順序尺度を用いる場合はポリコリック相関係数を用いて因子分析を行う方がが望ましいようです*5。
重回帰分析と因子分析の違いは何か?
重回帰分析では被説明変数を設定しますが、因子分析では被説明変数を設定しません。
重回帰分析は被説明変数に対する各説明変数の直接的な影響度(偏回帰係数)を明らかにする手法ですが、因子分析では説明変数(観測変数)の裏にある因子を明らかにする手法であるため、そもそもの考え方が異なります。
また、重回帰分析では多重共線性に対する検討が必要となるため、分析にあたり説明変数間の関係性をチェックする必要がありますが、因子分析はそもそも説明変数間の関係性が分析結果の源泉であるため、多重共線性の検討は不要となります。
ちなみに、多重共線性に関してはいくつか記事化しています。詳しく知りたい方はこちらをどうぞ。
おまけ:重回帰分析の前処理としての因子分析
通常の重回帰分析では、説明変数同士で相関係数が高くなるような場合、多重共線性の問題を回避するため、説明変数の削除を行います。たとえば、年齢と社会人経験年数という説明変数があった場合、片方残して他方は削除します。
因子分析を使えば、年齢と社会人経験年数は一つの因子にまとめられるため、このときの因子得点を説明変数として使用する(年齢と社会人経験年数は使用しない)ことで、少なくとも当該部分については多重共線性の問題は発生しなくなります。
おわりに
データサイエンスについてはまだまだ勉強中です...。
今後も何か気になることがあったら記事化していきます。
なぜバランススコアカードは使われなくなったのか
古のビジネスフレームワーク(?)であるバランススコアカード(Balanced Scorecards)。
日本でも2000年代には勢いがあったものの、近年導入している企業はほぼ皆無(要出典)。使われなくなったのにも何か理由があるはずです。
ということで、ごく簡単にですがバランススコアカード(以下BSCと呼ぶ)が使われなくなった理由をまとめていきます。
先人の意見
「バランススコアカード 使えない」などのキーワードで検索してヒットした記事からポイントだけ引用します。なお、太字部分は私が編集したものです。
BSCをいわゆる“箱モノ”と捉えてシステム系のツールと同様に現場に任せて導入してしまえば、ある程度のことは進むだろうという安易な企業がいらっしゃるようです。新しいやり方を取り入れるということは、組織に変化を促すということですから、経営トップおよび幹部クラスの方々には相応の覚悟を持って進めなければなりません。そういう覚悟ができないから、とりあえずBSCという“箱モノ”に頼ろうと考えているのであれば本末転倒と言わざるを得ません。
(中略)
BSCは会社全体の戦略マップ作成の後に、各部門ごとのBSC、個人別のBSCと落とし込んでいくことが重要だと言われています。確かにそれは間違いではありません。しかしながら、会社全体のBSCはこうなっているから後は各部門で考えておくように、といった落とし込み方では、せっかくのトップダウンからいきなりボトムアップ的な展開に変わってしまいます。
BSCは単なるツールではなくビジネスシステムであるため、本来的にはトップダウンで導入・定着化が必要です。しかし、実態としては現場任せになってしまい、結果的に導入・定着化がうまくいかずに失敗するケースが多かったようです。
BSCは日本企業の経営に非常に役立つツールだと実感しています。私が特に効果を感じるのは、「1.企業に対する戦略性の付与」、「2.部門横断の計画検討」、「3.目標の明確化」の3つです。
(中略)
「戦略マップも見せてください」というと、「いえ、当社は戦略マップ(筆者注:重要成功要因の因果関係を示したもの)を策定していないのです」という答えが返ってくることもあります。戦略マップ無しでは、BSCの効果「3.目標の明確化」には資することになりますが、「1.戦略性の付与」、「2.部門横断の計画検討」には役立ちません。
本来、BSCの4つの視点の重要成功要因(CSF)・KPIがそれぞれ因果関係を構成しストーリーができている必要がありますが、その検討が不十分で単なるKPIの集合になってしまうというわけです。
『ストーリーとしての競争戦略』でも主張されているように、良い戦略には「これがここにつながって、それがこっちにつながって...」という筋の通ったストーリーが存在します。言い換えると、ストーリーなき目標(KPI)の羅列は戦略になり得ないため、戦略マップがないというのは戦略がないのと同じです。
達成目標の選択と集中ができていない
目標達成のためのシナリオ不在
シナリオへの合意とコミットメントが不充分
PDCAサイクルを回すための仕組みが無い
「シナリオ不在」は一つ前での指摘と同様で、コミットメントとPDCAサイクルの話は二つ前の指摘と同様です。
たった三つの記事だけで結論を出すのはかなり早計ですが、BSCが失敗する理由は①導入・定着化に伴うトップのコミットメントが弱いことと②ストーリー性のある戦略的なCSF/KPI定義ができていないことにまとめられそうです。
使われなくなった理由というのはまさに失敗した(する)からでしょうね。
個人的に思うこと
別の概念(たとえばアジャイルとか)でもまったく同じのように思いますが、どうやら日本では新しい概念を「なんか良さそうな"ツール"があるからこれでなんかやってみて!!」と、ツール扱い&現場任せで導入することが多いようです。
そのような扱いのせいで、本質的な部分に触れないまま「なんかイマイチだったね」と捨て去られるわけです。今回の件でもBSCは悪くないはず!
別にBSCにこだわらなくてもいいのですが、BSCのように目標を多角的な観点で組み立てる考え方は非常に有効に思えます。ちなみにBSCの場合は財務、顧客、ビジネスプロセス、学習と成長の四つの観点ですね*1。
個人的な思いとして、先日ツイートした通り、特定のKPIに執着し全体像が見えなくなることは結構危険だと思っています。
財務指標・業務指標でKPIツリーを作ってそれをベースに施策を考えるのは個人的にあまり好きではない。顧客目線で思考することが疎かになりそうなので。
— まつ@SIer (@wannko5296) November 11, 2020
具体的に言うと、たとえばWebマーケティングにおけるKPI至上主義によって、マーケティングの根幹でもある顧客理解・人間理解が疎かになることが非常に危険だと感じます。
そのようなことにならないためにも、多角的にCSF/KPIを定め、それらの因果関係を理解しながら自らのKPIをモニタリングできるような仕組みづくりが重要になりそうですね。
おわり。
SIerはいかにして滅びるか
「SIerはオワコン」、「時代は内製化。SIerは消滅する。」なんて言葉をネット上でよく見かけます。
SIerが嫌われ者なのは重々承知していますが、果たして本当にSIerは滅びるのでしょうか。仮に滅びるとして、どのような因果をたどって消滅するのでしょうか。
その謎を探るべく我々はア...
SIer消滅論者の意見
SIerは今後消滅する、あるいは衰退すると主張している方々をここではSIer消滅論者と呼ぶことにします。
まずは彼らの意見に耳を傾けてみましょう。
「2025 年、従来型のSIer は滅びると考えています」
(中略)
「まず『詳細に書かれた仕様をコード化するだけのプログラマー』はいなくなるだろうと思います。また、『OutSystems』(筆者注:ローコード開発プラットフォーム) を使えば一人でもシステムを開発できてしまうので、単純に工数の負担を売りにしていたようなSIerの需要はなくなるのではないかと感じています」(松岡氏)
出所:「2025 年、いままでのSIerは滅びる!」迫り来るIT革命を生き延びるために身に付けなければいけない、エンジニアにとっての“付加価値”とは? - エンジニアtype | 転職type
ノーコード・ローコード開発によって従来より容易に、なおかつ少ない工数でシステムを実装できるという主張です。 ベンダー企業に頼らなくともユーザー企業内で開発が完結するため、SIerにわざわざ頼む必要はないという論理ですね。
開発の仕事を外部に委託する場合の一番のネックは、コミュニケーションです。これについてはどんなに密に連絡を取ってくれる外注先であっても、内製する場合と比べるとコミュニケーションがとりにくくなることは避けられません。
(中略)
非効率な仕組みしか提供できないSI企業に発注するくらいなら、自社で効率よくシステムを開発できる体制を作ることも検討すべきです。システムを内製するということは、雇用のリスクをとるということですが、ITシステムが極めて重要となった今の時代は、エンジニアに任せられる仕事はいくらでもあるはずです。
そうなるともはやSI企業にシステムを発注する意味はなくなります。そこにお金をかけるくらいなら自社でエンジニアを雇用してシステムを内製することを検討すべきです。
この方は、対応スピードが業務的に求められるような場合にコミュニケーションロスによる対応スピード低下を特に懸念されているようです。
そのような外部委託による弊害を防ぐためにも自社でエンジニアを雇用し内製化すべきであると主張されています。
運用のスペシャリストがその職人技を駆使して、運用の現場で起きる様々なインシデントに臨機応変に対応し、システムの安定稼働を維持してきました。
それら専門ノウハウが、クラウド・サービスやアプライアンスに組み込まれ、誰もが最高のノウハウを容易に利用できる時代になろうとしています。
これまでは、これらはSIerの仕事であり、その対価が収益の源泉でした。それがサービスとして、あるいは製品として安い費用で利用できるようになるのです。
出所:SIと運用が消える! - ベテランIT営業が教える「正しいITの使い方、営業の使い方」 - ZDNet Japan
クラウドサービスの高度化に伴い、インフラのコード化や運用自動化がより簡単に実現できるため、これまでSIerが担っていた役割がそれらに取って替えられるという話です。
今後は、ユーザーが自ら業務に必要なアプリケーションを開発する「シチズンデベロッパー(一般人開発者)」が拡大しつつあります。シチズンデベロッパーが台頭してくるとSIの形も大きく影響を受けるでしょう。
(中略)
新たな業務ニーズに即応しなければならない場合、従来型の開発に頼る情報システム部門に依頼しても「時間がかかりすぎる」と不満をこぼすことは少なくありません。そのような需要に、高い開発生産性を誇るツールを駆使し、ユーザーが短期間でアプリケーションを開発しようことは今後どんどん増えてゆくでしょう。
出所:シチズンデベロッパーのうねりがSIerを駆逐する!?:後藤晃がIT業界を斬る~Take away~:オルタナティブ・ブログ
ここでもノーコード・ローコードの話が出てきています。SIerに頼まなくても自分たちで実装できます系の論理ですね。
まとめると、ツールやサービスの進化に伴い、これまで多大な工数をかけなければならなかったアプリ開発やインフラ構築がより少ない労力で実現できるようになり、自社内で完結できる(ゆえにSIerは不要)という論理のようです。
コミュニケーションに関する問題点を指摘する記事もありましたが、内製化すべしという結論は同じです。
つまり、内製化で何とかなるからSIerいらないよ!!ってわけですね。よくわかりました。
SIer壊滅論に対する疑問
工数を確保してひたすらスクラッチで作り込むという非本質的な作業はなくなる、あるいは減少するという主張は間違いなさそうですし、私もその認識です。
いまや、業務に特化した多様なSaaSがあふれ、アプリ・インフラ面でもさまざまなSaaS/PaaS/IaaSがサービス提供されているなかで、過去10, 20年続けてきたビジネススタイルは今後通用しないと考えます。
一方で、仮に企業の内製化が進んでいったとして、SIerが不要になり消滅するという論理にはいささか懐疑的です。
そもそも内製できる人材を確保できるのか問題
以前書いた記事でも言及していますが、IT人材の需給バランスは10年ほど前に崩れ始め、年々人材不足が悪化しています。
確かに、簡単なWebアプリの実装や仮想サーバの構築は社内で簡単に行えるかもしれません。
しかし、実業務を抱えながらユーザー部門が実装することは現実的に厳しいこと、ガバナンスの実現のためには結局情報システム部門による統制・支援が必要となることから、情報システム部門が重要な役割を担うことになります。
各企業がIT人材を求める中、優秀な人材を雇う、あるいは雇い続けることは容易ではないはずです。
優秀なIT人材を自社で抱え、内製化するというのは確かに合理的ですが、情報システム部門がコストセンターである以上、優秀な人材を何人も雇い続けることはやはり現実的ではないように思います。
全体最適化できるのか問題
仮にエンドユーザーによって個別のアプリを開発できるとしましょう。
そこに待つのは個別最適化によるサイロ化。
個別のシステムだけ見ると合理的に見えても、企業全体で見たときに不合理になる危険性をはらんでいます。これも前述の通り、十分なガバナンスが必要であり、全体最適やガバナンスの視点を持ったITエンジニアが必要になります。
また、特定のSaaSや特定の技術・方法論であれば、ある程度は自社の人材や特定の外部企業との連携でうまくいくように思えますが、これまで使ったことのない技術の導入や組織全体の業務、システムアーキテクチャを加味した筋のよいロードマップ、システム像を導き出すのはなかなか簡単ではありません。
これも結局は人材の問題と同様ですが、全体最適の視点で考えられるITエンジニアを組織内に常時十分なリソースで確保するのは難しそうです。
今後、企業内部から顧客接点まであらゆる部分がデジタル化・高度化されていくからこそ、真の意味でのSystems "Integrator"が求められるはずです。このような状況下では、複数の企業に対して多種多様なシステム構築を経験したSIerが活躍できる余地は十分にあります。
というわけで、内製化と言ってもいろいろ問題はありそうです。一方でSIerも、従来のビジネスが縮小することが明らかな今、どのようなサービスを提供し生き残っていけばよいのでしょうか。
この点について近日中に書いていこうと思います。
※2020/12/26追記
私のモチベーションがどこかへ消えてしまったので後半の執筆予定はなくなりました!!!モチベーションが帰ってきたら書きます。
Raspberry Pi4 ModelBを動かしてみた(用意するもの&OSインストール手順の説明)
つい先日、Raspberry Pi4を買って組み立ててみたので、そのときの手順をまとめておきます。
目指すゴール
- OS(Rapsbian NOOBS)のインストール完了
前提
microSDカードのセットアップに用いたPCはWindows10 Home 64bitです。
準備するもの
- Raspberry Pi4 ModelB本体
- 本体ケース
- 電源
- microSDカード
- microHDMIケーブル
- モニタ
- マウス
- キーボード
- ドライバー
本体はこちらから買いました。
【国内正規代理店品】Raspberry Pi4 ModelB 4GB ラズベリーパイ4 技適対応品
本体ケースはこちらです。
電源やファンなどもセットになのでお得ですね。
Miuzei 最新Raspberry Pi 4 ケース ラスベリー パイ 4 ケース+ 冷却ファン+ヒートシンク Raspberry Pi 4 Model B対応(Raspberry Pi 4 Model B 本体含まりません) (電源付き)
microSDはキングストンの128GBのものを使用しました。
画像、動画を扱う予定があったため、128GBのSDXCカードを購入しました。このSDXCがトラブルの原因となるとは。。(後述)
Raspberry Pi本体にはmicroSDしか挿入できませんが、Rapsbian NOOBSのデータ転送などPCとのやり取りも必要となるため、SDカードへの変換アダプタも買っておくとよいですね。
※ちなみに、私が購入した以下のSDには変換アダプタが付いてきました。
キングストン microSD 128GB 170MB/s UHS-I U3 V30 A2 Nintendo Switch動作確認済 Canvas Go! Plus SDCG3/128GB 永久保証
microHDMIケーブルはこちら。
Amazonベーシック HDMIケーブル 1.8m (タイプAオス - マイクロタイプDオス) ハイスピード
今回、マウス、キーボードは家にある有線のものを使いました。 モニタは持っていなかったのでテレビをモニタ代わりに使用しました。今時のテレビであればHDMI端子はあるので問題ないですね。
組み立て
こちらの説明書をもとに組み立てました。とりわけ言及することはないですね。
【国内正規代理店品】Raspberry Pi4 ModelB 4GB ラズベリーパイ4 技適対応品
完成品はこんな感じです。
(最後に写真を撮ったのでマウスとかHDMIとかがつながった状態になってます)
OSインストールのためのデータ準備
ここでは、OSのデータをmicroSDカードに入れます。
OSは、他のサイトでもよく紹介されているRapsbian NOOBSにしてみました。こちらにアクセスして「NOOBS」と書かれたアイコンをクリックし、ダウンロードします。
Raspberry Pi OS – Raspberry Pi
次はSDカードの準備です。PCにmicroSDを差し込んでおきましょう。 前述の通りここでトラブルがあったのですが、正解の手順を先に書いておきますね。
FAT32 Formatをダウンロードし、実行します。初期設定のまま「Start」をクリックし完了したことを確認します。 ちなみに、他のプロセスが使っててフォーマットできないとか言われましたが、Windows標準のクイックフォーマットを先に実行すると解消しました。
先ほどダウンロードしたNOOBSを展開(解凍)し、フォルダの中身をコピーしSDカードに貼り付けます。 貼り付けたSDカードの中身はこんな感じです。整理されていない感じもしますがこれで大丈夫です。
OSインストール
microSDカードをRaspberry Piに挿入し、マウスやキーボードなど接続したうえで電源をONにします。
指示に従い、OSのインストール、その他、パスワード、言語、WiFiの設定などを行います。基本的に指示に従って進めていけば大丈夫です(雑)。 この方のブログを見て進めてみてください。 shikasen-engineer.com
ちなみにOSインストール後の画面はこんな感じ。
あとは自分のやりたいことに合わせて必要なハード・ソフトをそろえて試行錯誤するだけです。 最終的には映像解析系のプロダクトをつくろうとしているので、この後はカメラをセットアップし、防犯カメラ的なものでも作っていこうと思ってます。
結局トラブルって何があったの
事象
- RaspberryPiの電源を入れても何も起きない
- 具体的には、赤ランプは点灯するものの緑ランプは点灯しない(正確に言うと、電源を入れた直後に一瞬点灯するだけでそれ以降はまったく反応がない)
原因
SDカードのフォーマット方法が正しくなかったため
(exFATでフォーマットしていたが、FATでフォーマットしなければならなかった)
「Raspberry Pi 電源つかない」、「Raspberry Pi 緑ランプ つかない」などいろいろ調べ、以下のサイトが見つかり、すべて解決しました。
Raspberry Pi 4で64GB以上のインストールメディアを作成する - PCまなぶ
多くのサイトでSD Memory Card Formatterが紹介されていますが、今回使ったSDXCのmicroSDカードの場合はこれでは正しくフォーマットできません。もちろん、Windows標準のフォーマットでもダメです。exFATという、Raspberry Piで対応していないフォーマットになってしまいます。
対応
FATでフォーマットするため、FAT32 Formatを使ってフォーマットを実施。改めてNOOBSのデータを保存。
結果
問題なく起動。緑ランプも点灯。
いや~ なんか壊しちゃったかな~とか心配してしまいましたが、無事に起動してほっとしました。
最後に
1, 2か月くらいしたらRaspberry Piで作った成果物について記事を書こうと思います。隙間時間でコツコツつくるぞー