【R】主成分分析と探索的因子分析で顧客満足度を分析する
初めまして、Datum StudioのLeon(リオン)と申します。
本記事では模擬案件を通じて、分析手法の説明を行います。
依頼内容は、3つの航空会社にがランダムで1000名顧客を対象にアンケート調査したデータを利用して、自社のどこが他の2社より優れているのか、もしくは劣っているのか?また、顧客の体験も一緒に知りたいとのです。
今回使用する手法は主成分分析(PCA)と探索的因子分析(EFA)です。
(具体的な紹介はWikipediaのページをご覧ください:主成分分析、探索的因子分析(英語))
早速ですが、始めましょう。
0. 模擬案件の背景
今回の顧客はA航空会社です。彼達がランダムで1000人利用者に3つ航空会社に対する満足度のアンケートを取りました。
※ 生データはここでダウンロードできます。(Data download)
データ中の変数(値の範囲は 1 ~ 9で、1 は最低値、9 は最高値):
# Easy_Revervation : 座席の購入やすさ # Preferred_Seats : 座席の選択 # Flight_Options : 航空便の選択 # Ticket_Prices : チケットの価格 # Seat_Comfort : 座席の座り心地の良さ # Seat_Roominess : 席の大きさ # Overhead_Storage : 収納棚の大きさ # Clean_Aircraft : 機内の清潔さ # Courtesy : 礼儀 # Friendliness : 親切さ # Helpfulness : 有用さ # Service : 機内サービスの良さ # Satisfaction : 満足度 # Fly_Again : 再度利用する # Recommend : 友人に推薦する # ID : 回答者番号 # Airline : AirlineCo.1 ~ AirlineCo.3 計 3 社
1. パッケージの読込
# library library(readr) library(dplyr) library(corrplot) library(gplots) library(RColorBrewer) library(GPArotation)
2. データインプット
# Input data airline<-read.csv("https://raw.githubusercontent.com/happyrabbit/DataScientistR/master/Data/AirlineRating.csv") # Check data glimpse(airline)
データを一回確認します。
# Observations: 3,000 # Variables: 17 # $ Easy_Reservation <int> 6, 5, 6, 5, 4, 5, 6, 4, 6, 4, 5, 5, 6, 5, 5, 3, 6,... # $ Preferred_Seats <int> 5, 7, 6, 6, 5, 6, 6, 6, 5, 4, 7, 5, 7, 6, 6, 5, 7,... # $ Flight_Options <int> 4, 7, 5, 5, 3, 4, 6, 3, 4, 5, 6, 6, 6, 5, 6, 4, 4,... # $ Ticket_Prices <int> 5, 6, 6, 5, 6, 5, 5, 5, 5, 6, 7, 7, 6, 7, 7, 6, 8,... # $ Seat_Comfort <int> 5, 6, 7, 7, 6, 6, 6, 4, 6, 9, 7, 7, 6, 6, 6, 7, 7,... # $ Seat_Roominess <int> 7, 8, 6, 8, 7, 8, 6, 5, 7, 8, 8, 9, 7, 8, 6, 8, 8,... # $ Overhead_Storage <int> 5, 5, 7, 6, 5, 4, 4, 4, 5, 7, 6, 6, 7, 5, 4, 6, 6,... # $ Clean_Aircraft <int> 7, 6, 7, 7, 7, 7, 6, 4, 6, 7, 7, 7, 7, 7, 6, 7, 7,... # $ Courtesy <int> 5, 6, 6, 4, 2, 5, 5, 4, 5, 6, 4, 6, 4, 5, 5, 5, 6,... # $ Friendliness <int> 4, 6, 6, 6, 3, 4, 5, 5, 4, 5, 6, 7, 5, 4, 4, 4, 6,... # $ Helpfulness <int> 6, 5, 6, 4, 4, 5, 5, 4, 3, 5, 5, 6, 5, 4, 5, 5, 5,... # $ Service <int> 6, 5, 6, 5, 3, 5, 5, 5, 3, 5, 6, 6, 5, 5, 4, 5, 5,... # $ Satisfaction <int> 6, 7, 7, 5, 4, 6, 5, 5, 4, 7, 6, 7, 6, 4, 4, 6, 7,... # $ Fly_Again <int> 6, 6, 6, 7, 4, 5, 3, 4, 7, 6, 8, 6, 5, 4, 6, 6, 6,... # $ Recommend <int> 3, 6, 5, 5, 4, 5, 6, 5, 8, 6, 8, 7, 6, 5, 6, 7, 7,... # $ ID <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,... # $ Airline <fct> AirlineCo.1, AirlineCo.1, AirlineCo.1, AirlineCo.1...
変数間の相関度を確認します。
# Correlation select(airline, Easy_Reservation:Recommend) %>% # Get Correlation Matrix cor() %>% # Plot correlation map corrplot(, order="hclust")
※ ブルーになるほど相関度が「1」に近い、レッドになるほど相関度が「0」に近いです。
上記の図から、変数間の相関度が「1に近い」か、「ほぼ0」か、「-1に近い」かがわかります。
3. 主成分分析
# PCA analysis airline.pc <- select(airline, Easy_Reservation : Recommend) %>% prcomp() summary(airline.pc)
各航空会社の平均点を取ります。
# Get mean scores of variables for each airline airline.mean <- select(airline,-ID) %>% group_by(Airline) %>% summarise_each(funs(mean)) %>% glimpse()
結果
# Observations: 3 # Variables: 16 # $ Airline <fct> AirlineCo.1, AirlineCo.2, AirlineCo.3 # $ Easy_Reservation <dbl> 5.031, 2.939, 2.038 # $ Preferred_Seats <dbl> 6.025, 2.995, 2.019 # $ Flight_Options <dbl> 4.996, 2.033, 2.067 # $ Ticket_Prices <dbl> 5.997, 3.016, 2.058 # $ Seat_Comfort <dbl> 6.988, 5.009, 7.918 # $ Seat_Roominess <dbl> 7.895, 3.970, 7.908 # $ Overhead_Storage <dbl> 5.967, 4.974, 7.924 # $ Clean_Aircraft <dbl> 6.947, 6.050, 7.882 # $ Courtesy <dbl> 5.016, 7.937, 7.942 # $ Friendliness <dbl> 4.997, 7.946, 7.914 # $ Helpfulness <dbl> 5.017, 7.962, 7.954 # $ Service <dbl> 5.019, 7.956, 7.906 # $ Satisfaction <dbl> 5.944, 3.011, 7.903 # $ Fly_Again <dbl> 5.983, 3.008, 7.920 # $ Recommend <dbl> 6.008, 2.997, 7.929
図を描くため、行の名前を「1、2、3」から「AirlineCo.1、AirlineCo.2、AirlineCo.3」に変更します。
# Change rownames of airline.mean row.names(airline.mean) <- airline.mean$Airline airline.mean <- select(airline.mean,-Airline)
ヒートマップを描きます。
# Plot heatmap heatmap.2(as.matrix(airline.mean), col=brewer.pal(5,"YlGn"), trace="none", key=FALSE, dend="none", cexCol=0.6, cexRow =1) title(main = "Mean values for different airlines")
※ 色が濃いほど点数が高い。
この図から、AirlineCo.3(航空会社3)が2/3以上の項目が他の2社より優れていることがわかります。また、AirlineCo.2(航空会社2)が点数が一番低い項目が3社の中で最も多いことがわかります。
4. 探索的因子分析(EFA)
# Factor analysis airline.fa <- airline %>% subset(select = Easy_Reservation : Recommend) %>% factanal(factors=3, rotation="oblimin") title(main = "Factor load of airline satisfactory")
各因子の重要度を算出します。
# Calculate the factor score airline.fa <- airline %>% subset(select = Easy_Reservation : Recommend) %>% factanal(factors = 3, rotation = "oblimin", scores = "Bartlett") fa.score<-airline.fa$scores %>% data.frame()
結果:
# Factor1 Factor2 Factor3 # Easy_Reservation 0.941 # Preferred_Seats 0.880 # Flight_Options 0.167 0.803 # Ticket_Prices 0.887 # Seat_Comfort 0.865 # Seat_Roominess 0.844 -0.242 # Overhead_Storage 0.833 0.137 -0.142 # Clean_Aircraft 0.708 # Courtesy 0.818 # Friendliness 0.868 # Helpfulness 0.953 # Service 0.922 # Satisfaction 0.921 # Fly_Again 0.943 # Recommend 0.942
上記の結果からもうすでに15個変数を影響している潜在変数の意味をほぼ推定できます。
# Factor 1 : 全体的な体験 # Factor 2 : 機内サービス体験 # Factor 3 : チケット購入体験
各航空会社の因子の平均点を算出します。
fa.score$Airline <- airline$Airline fa.score.mean <- fa.score %>% group_by(Airline) %>% summarise(Factor1 = mean(Factor1), Factor2 = mean(Factor2), Factor3 = mean(Factor3))
図を描くため、行の名前を「1、2、3」から「AirlineCo.1、AirlineCo.2、AirlineCo.3」に変更します。
row.names(fa.score.mean) <- as.character(fa.score.mean$Airline) fa.score.mean <- select(fa.score.mean,-Airline)
ヒートマップで因子を図表化します。
heatmap.2(as.matrix(fa.score.mean), col = brewer.pal(5,"YlGn"), trace = "none", key = FALSE, dend = "none", cexCol = 0.6, cexRow = 1) title(main="Average factor load satisfaction for each airline")
※ 色が濃いほど点数が高い。
上記の図の解釈の例:AirlineCo.1(航空会社1)は「Factor 3 : チケット購入体験」では他社より優れていますが、「Factor 2 : 機内サービス体験」ではもっと工夫する必要があります。
5. まとめ
今回はデータの前処理が要らず、単純に分析するだけの仕事で、結構時間の節約ができました。通常の生データ前処理は総案件の半分以上、偶に70%以上の時間をかかるケースもあります。
PCAとEFAの使い方は少しでもお役に立ちましたでしょうか?今後面白そうな模擬案件がありましたら、また紹介いたします。
Bye~
DATUM STUDIOは、クライアントの事業成長と経営課題解決を最適な形でサポートする、データ・ビジネスパートナーです。
データ分析の分野でお客様に最適なソリューションをご提供します。まずはご相談ください。
Contact
Explore Jobs
関連記事