楽天モバイルが改悪したからプログラミングで安い携帯会社をプログラミングで探す ~データ収集編~

R解析例

破格の基本料金0円というプランを引っさげて鳴り物入りで携帯通信事業に参入した楽天。

どこからどう見ても集客目的の一過的プランであり、いつまでも無料とはいかないことを予想していた方も多いのではないでしょうか🤔

そして参入からおよそ1年が経ち、遂に基本料金0円というプランが消滅。新たに基本料金980円が最安のプランとなる事が発表されました

理由は後で述べますが、 私はもう楽天モバイルを使い続けるつもりはなくなったので、遅かれ早かれ別事業者に乗り換えるか楽天の回線を閉じるかする と思います。

これを機にいろいろな料金プランを調査し、私なりに最適な携帯料金を調査することにしました。

参考までに自分の今の構成

スマートフォンは一台持ち、メインはUQモバイル(物理SIM)、サブ回線として楽天モバイル(eSIM)を使用しています。

UQ回線

  • メイン回線
  • 昨年スタートした「繰り越しプランS+5G(1628円)」を使用
  • 3GBしか容量が無い割に値段が若干高め
  • 通信速度がやたらと安定している
  • UQの回線は+2GBが13ヶ月間無料で追加されるキャンペーンで実質5GB/月

正直、結構これで足りてます。でも3GBだとめいっぱい使っちゃうかな?という感じ。

楽天回線

  • 通話無料機能
  • 稀にauが入らない緊急時に使用するバックアップ回線
  • eSimでの利用でした。
  • 最近ではほぼ使用せず

楽天モバイルのよかったところを振り返る

一年使ったよしみで楽天モバイルのいいところを振り返っておきます。

📞専用アプリを使用する事で無料電話ができた

正直私は滅多に通話を使うことは無いのですが、ゼロではないです。在宅ワーク時、職場の上司への連絡手段として電話は欠かせません。 この点は料金体系が変わったとしても楽天モバイルの強みであり続けるでしょう。

ただし、このアプリで通話すると音質がクソすぎて必ずと言っていいほど別人と間違えられました。(親にはオレオレ詐欺だと思われた)

また、昨年ではそもそも一部のiphoneユーザーでは電話がかからない不具合が発生していました。結構問題になってましたが、結局どうなったんでしょうね?

楽天モバイル、iPhone利用者に不具合 総務省が原因究明を要請
楽天モバイルで米アップルのスマートフォン「iPhone(アイフォーン)」を使っている利用者の間で着信ができない不具合が発生している問題で、総務省が早期の原因究…

🏅楽天ポイントの連携

楽天経済圏で生きる人達にとってはこれが最重要ポイントですよね🌅 楽天モバイルユーザーならばSPU🏅がプラス1倍されるので、楽天市場でのポイント還元が1%増加します。

しかし、 この2年ほどで楽天SPU🏅は度重なる改悪が導入され、私も今ではそこまで楽天ポイントを重要視していません 

かつては一切amazonを使わず、キャンペーン開催時に楽天市場で計15倍ポイント還元をせしめる、なんて事をやっていましたが、もうそれも過去の話。今ではどんなに頑張っても10倍が関の山です。

🔭通信エリアのバックアップになる

楽天は言わずもがな、auでもdocomoでもsoftbankでもない、自分で基地局を持つ通信事業社です。

いざと言う時にauの電波は入らないが楽天が入る、みたいな事が稀ですが起きえます。私の職場はまさにこれでした。

メイン回線のUQ(au)が入らず、楽天だとめちゃくちゃ入るという状況でした。 しかし、その後auの基地局が会社に設置されたため、この問題は解決。楽天モバイルの優位性をひとつ失いました🍃

🚅5Gが使用可能

今回の調査条件にも挙げましたが、5Gは本当に速いです

私は主に神奈川と東京都郊外をうろうろしているのですが、かなり多くの場所で5Gが入るようになりました。今更これが使えなくなるなんて考えられません。

Info

NTT docomoは「docomo以外の5Gはなんちゃって5Gであって、真の速度を発揮していない」と主張していました。この主張はある種正しいのですが、そのなんちゃって5Gも十分速いです。以降で言及する5Gでは5Gとなんちゃってを区別していませんのでご注意ください。

🙇‍♂️[おことわり]この記事に関する注意

  • 携帯の料金体系は各社によって仕組みが異なるため、すべての情報を収集することは諦めました。
  • 2022年5月時点の各社HPから手動で集めた情報です。間違っているかもしれません。
  • 楽天モバイル然り、突然料金プランが変更されることがあります。私の興味が続く限りしか変更内容はフォローしません。

手動で調査した結果まとめ

調査の基準

日本で発表されているすべての料金プランを確認することなど不可能です。

そのため、今回はあくまで私的に検討の余地もないものはスルーさせていただきました

容量は原則10GBまで

私は5GBまでのプランをメイン回線で使っていて、足りないと感じることはほぼありません。

そのため、10GB以上のプランは考慮すらしいません。

5G使用可能

5G出たての頃は「4G LTEでも十分速いし、別に5Gじゃなくても良い」 と思ってましたが、今は全くそう思いません。5Gは必須です。

以前だったら数百MBくらいあるyoutube動画を携帯でストリーミングするなんて考えられませんでしたが、4Gや5Gの速度なら待ち時間ゼロで動画視聴が可能です。

 一般的に技術が進化する度、コンテンツは大容量化していきます。最早ネット上のコンテンツは5G前提です。 

1度上げてしまった生活水準を捨てることが難しいのと同様、1度味わってしまった高速通信を捨てることは厳しすぎます。

なんか信用できないと直感したら捨てる

わずかですが、料金表が税抜きなのか税込みなのか表記されていなかったり、細則が説明されていない事業者がありました。

こういう事業者は「通信事業者として信用できない気がする」ため、調査対象には含めていません。

データ収集して思ったこと

 この記事のコンセプトは定量的に解析すること ですが、データに落とし込めなかった定性的な要素もあるので紹介したいと思います。

データフリーは魅力的だが、プランは少ない

個人的に注目していたのは音楽系聴き放題のデータフリーです。

ざっと調べたところOCNモバイルやBIGLOBEなどが良さそうでしたが、BIGLOBEについてはよくよく規約を読むとポッドキャストは対象外らしい😥とのことで、希望はOCNのみ・・・!

Info

私はBBCニュースや英語学習系のポッドキャストをめっちゃ聞いてます。無料でいくらでも勉強できるのでおすすめです!

しかし私のように通勤時、車の中で聴きまくっているとあっという間に5GB使っちゃうのは注意です。

その他では、LINEの通信が無料となるプランがLINEMOやNUROから出ています。私はLINEで大容量通信をするわけでもないので関係ないかな・・・😅

安い会社、docomo使いがち

ちょっとマイナーな会社で、ぱっと見めっちゃ安い会社ほどdocomoの回線を採用しがちな気がしました。

docomoは5Gの方針で経営判断ミスをしたせいで、auやsoftbankからはややビハインドした印象があります。しかし、最近の方針転換によりこの懸念は解消するでしょう。

NTTドコモ、5Gエリア拡大のため方針転換。4G周波数帯の併用を発表
  NTTドコモは、5Gエリア拡大のため、従来4G(LTE)に使用している周波数帯を利用し、2024年3月までに人口カバー率90%の実現を目指すと発表しました。これまでは5G専用の周波数帯でサービスを提供してい

現状、docomoの5Gエリアは狭すぎるのであまり使う気にはなりません🏝️

データ作成

やっとメインのコンテンツです。

データについて手動で調べてファイルに保存しました。 以下のようなyamlファイルに記述しました。

データはコピーできるようにしました。
OCN:
  PLAN_500:
    company: OCN
    plan: PLAN_500
    data: 0.5
    free_call: 10
    call_rate: 11
    call_rate_unit: 30
    free_music: 1
    price: 550
    speed: 5G
    area: docomo
    initial_cost: 3300
    exit_cost: 0
  PLAN_1000:
    company: OCN
    plan: PLAN_1000
    data: 1
    free_call: 0
    call_rate: 11
    call_rate_unit: 30
    free_music: 1
    price: 770
    speed: 5G
    area: docomo
    initial_cost: 3300
    exit_cost: 0
  PLAN_3000:
    company: OCN
    plan: PLAN_3000
    data: 3
    free_call: 0
    call_rate: 11
    call_rate_unit: 30
    free_music: 1
    price: 990
    speed: 5G
    area: docomo
    initial_cost: 3300
    exit_cost: 0
  PLAN_6000:
    company: OCN
    plan: PLAN_6000
    data: 6
    free_call: 0
    call_rate: 11
    call_rate_unit: 30
    free_music: 1
    price: 1320
    speed: 5G
    area: docomo
    initial_cost: 3300
    exit_cost: 0
  PLAN_10000:
    company: OCN
    plan: PLAN_10000
    data: 10
    free_call: 0
    call_rate: 11
    call_rate_unit: 30
    free_music: 1
    price: 1320
    speed: 5G
    area: docomo
    initial_cost: 3300
    exit_cost: 0
BIGLOBE:
  PLAN_1000_with_option:
    company: BIGLOBE
    plan: PLAN_1000_with_option
    data: 1
    free_call: 0
    call_rate: 9
    call_rate_unit: 30
    free_music: 1
    free_youtube: 1
    price: 1386
    speed: 5G
    exit_cost: 1000
    exit_period: 12
    area: au|docomo
    initial_cost: 3733
  PLAN_3000_with_option:
    company: BIGLOBE
    plan: PLAN_3000_with_option
    data: 3
    free_call: 0
    call_rate: 9
    call_rate_unit: 30
    free_music: 1
    free_youtube: 1
    price: 1628
    speed: 5G
    exit_cost: 1000
    exit_period: 12
    area: au|docomo
    initial_cost: 3733
  PLAN_6000_with_option:
    company: BIGLOBE
    plan: PLAN_6000_with_option
    data: 6
    free_call: 0
    call_rate: 9
    call_rate_unit: 30
    free_music: 1
    free_youtube: 1
    price: 2178
    speed: 5G
    exit_cost: 1000
    exit_period: 12
    area: au|docomo
    initial_cost: 3733
  PLAN_3000:
    company: BIGLOBE
    plan: PLAN_3000
    data: 3
    free_call: 0
    call_rate: 100000
    call_rate_unit: 0
    price: 990
    speed: 5G
    area: au|docomo
    initial_cost: 3733
  PLAN_6000:
    company: BIGLOBE
    plan: PLAN_6000
    data: 6
    free_call: 0
    call_rate: 100000
    call_rate_unit: 0
    price: 1595
    speed: 5G
    area: au|docomo
    initial_cost: 3733
NURO:
  PLAN_3000:
    company: NURO
    plan: PLAN_3000
    data: 3
    free_call: 0
    call_rate: 22
    call_rate_unit: 30
    price: 792
    speed: 4G
    area: au|softbank|docomo
    initial_cost: 3740
    exit_cost: 0
  PLAN_5000:
    company: NURO
    plan: PLAN_5000
    data: 5
    free_call: 0
    call_rate: 22
    call_rate_unit: 30
    free_line: 1
    price: 990
    speed: 4G
    area: au|softbank|docomo
    exit_cost: 0
    initial_cost: 3740
  PLAN_10000:
    company: NURO
    plan: PLAN_10000
    data: 10
    free_call: 0
    call_rate: 22
    call_rate_unit: 30
    free_line: 1
    price: 1485
    speed: 4G
    area: au|softbank|docomo
    exit_cost: 0
    initial_cost: 3740
LINEMO:
  PLAN_3000:
    company: LINEMO
    plan: PLAN_3000
    data: 3
    free_call: 0
    call_rate: 22
    call_rate_unit: 30
    free_line: 1
    price: 990
    speed: 5G
    area: softbank
    initial_cost: 0
    exit_cost: 0
  PLAN_20000:
    company: LINEMO
    plan: PLAN_3000
    data: 3
    free_call: 0
    call_rate: 22
    call_rate_unit: 30
    free_line: 1
    price: 2728
    speed: 5G
    area: softbank
    initial_cost: 0
    exit_cost: 0
ahamo:
  PLAN:
    company: ahamo
    plan: PLAN
    data: 20
    free_call: 5
    call_rate: 22
    call_rate_unit: 30
    price: 2970
    speed: 5G
    initial_cost: 0
    area: docomo
    exit_cost: 0
RakutenMobile:
  PLAN:
    company: RakutenMobile
    plan: PLAN
    data: 3
    free_call: 100000
    call_rate: 0
    call_rate_unit: 30
    price: 1078
    speed: 5G
    area: rakuten
    exit_cost: 0
  PLAN2:
    company: RakutenMobile
    plan: PLAN2
    data: 20
    free_call: 100000
    call_rate: 0
    call_rate_unit: 30
    price: 2178
    speed: 5G
    area: rakuten
    exit_cost: 0
IIJmio:
  PLAN_2000_phone:
    company: IIJmio
    plan: PLAN_2000_phone
    data: 3
    free_call: 0
    call_rate: 11
    call_rate_unit: 30
    price: 850
    speed: 5G
    area: docomo|au
    initial_cost: 3733
    exit_cost: 1000
  PLAN_2000_esim:
    company: IIJmio
    plan: PLAN_2000_esim
    data: 3
    free_call: 0
    call_rate: 100000
    call_rate_unit: 0
    price: 440
    speed: 5G
    area: docomo
    initial_cost: 3520
    exit_cost: 1000
  PLAN_4000_phone:
    company: IIJmio
    plan: PLAN_4000_phone
    data: 5
    free_call: 0
    call_rate: 11
    call_rate_unit: 30
    price: 990
    speed: 5G
    area: docomo|au
    initial_cost: 3733
    exit_cost: 1000
  PLAN_4000_esim:
    company: IIJmio
    plan: PLAN_4000_esim
    data: 5
    free_call: 0
    call_rate: 100000
    call_rate_unit: 0
    price: 660
    speed: 5G
    area: docomo
    initial_cost: 3520
    exit_cost: 0
  PLAN_8000_phone:
    company: IIJmio
    plan: PLAN_8000_phone
    data: 9
    free_call: 0
    call_rate: 11
    call_rate_unit: 30
    price: 1500
    speed: 5G
    area: docomo|au
    initial_cost: 3733
    exit_cost: 0
  PLAN_8000_esim:
    company: IIJmio
    plan: PLAN_8000_esim
    data: 9
    free_call: 0
    call_rate: 1000000
    call_rate_unit: 0
    price: 1100
    speed: 5G
    area: docomo
    initial_cost: 3520
    exit_cost: 0
HISmobile:
  PLAN_kakuyasu1:
    company: HISmobile
    plan: PLAN_kakuyasu1
    data: 1
    free_call: 0
    call_rate: 11
    call_rate_unit: 30
    speed: 4G
    area: docomo
    price: 590
    initial_cost: 3300
    exit_cost: 0
  PLAN_kakuyasu3:
    company: HISmobile
    plan: PLAN_kakuyasu3
    data: 3
    free_call: 0
    call_rate: 11
    call_rate_unit: 30
    speed: 4G
    area: docomo
    price: 790
    initial_cost: 3300
    exit_cost: 0
JCOM:
  PLAN_5000:
    company: JCOM
    plan: PLAN_5000
    data: 1
    free_call: 0
    call_rate: 20
    call_rate_unit: 30
    speed: 5G
    area: docomo|softbank|au
    price: 1078
    initial_cost: 0
    exit_cost: 0
  PLAN_10000:
    company: JCOM
    plan: PLAN_10000
    data: 5
    free_call: 0
    call_rate: 20
    call_rate_unit: 30
    speed: 5G
    area: docomo|softbank|au
    price: 1628
    initial_cost: 0
    exit_cost: 0
mineo:
  PLAN_1000:
    company: mineo
    plan: PLAN_1000
    data: 1
    free_call: 0
    call_rate: 22
    call_rate_unit: 30
    speed: 5G
    area: docomo|softbank|au
    price: 1298
    initial_cost: 0
    exit_cost: 0
  PLAN_5000:
    data: 5
    company: mineo
    plan: PLAN_5000
    free_call: 0
    call_rate: 22
    call_rate_unit: 30
    speed: 5G
    area: docomo|softbank|au
    price: 1628
    initial_cost: 0
    exit_cost: 0
yumobile:
  PLAN_5000:
    company: yumobile
    plan: PLAN_5000
    data: 5
    free_call: 0
    price: 1070
    call_rate: 11
    call_rate_unit: 30
    area: docomo
    speed: 4G
    initial_cost: 3740
Libmo:
  PLAN_3000_phone:
    company: Libmo
    plan: PLAN_3000_phone
    data: 3
    free_call: 0
    price: 980
    call_rate: 22
    call_rate_unit: 30
    area: docomo
    speed: 4G
    initial_cost: 3300
    exit_cost: 10450
    exit_period: 12
  PLAN_8000_phone:
    company: Libmo
    plan: PLAN_8000_phone
    data: 3
    free_call: 0
    price: 1518
    call_rate: 22
    call_rate_unit: 30
    area: docomo
    speed: 4G
    initial_cost: 3300
    exit_cost: 10450
    exit_period: 12
UQ:
  PLAN_3000:
    company: UQ
    plan: PLAN_3000
    data: 3
    free_call: 0
    price: 1628
    call_rate: 22
    call_rate_unit: 30
    area: au
    speed: 5G
    initial_cost: 3300
    exit_cost: 0

今回あえてリストとして扱いやすいyamlにしてみました💡

もう少しデータが多ければcsvなどの表形式にしたかもしれません。

yamlの読み込み

yamlはyamlパッケージを使用して扱うことができます。

Base PipeMagrittr Pipe
pacman::p_load(tidyverse, yaml)

dat <- yaml::read_yaml("./data.yaml")

dat |> 
    head()
pacman::p_load(tidyverse, yaml)

dat <- yaml::read_yaml("./data.yaml")

dat %>% 
    head()
# Show in New Window
# $OCN
# $OCN$PLAN_500
# $OCN$PLAN_500$company
# [1] "OCN"
# 
# $OCN$PLAN_500$plan
# [1] "PLAN_500"
# 
# $OCN$PLAN_500$data
# [1] 0.5
# 
# $OCN$PLAN_500$free_call
# [1] 10
# 
# $OCN$PLAN_500$call_rate
# [1] 11
# 
# 以下省略

ネストしたリストを平たくする

このままではリストのリスト(2段階の入れ子状、ネストしているともいう)で扱いにくいので、平たい表形式にします。

ネスト図

purrrのmap_dfr()関数を使って結合していきます。 この関数はリストに対して同じ処理を実行することができる柔軟な関数で、戻り値のデータフレームを結合して返してくれます。

今回は2段階潜ればas_tibbleによるtibble変換が可能な形式にしておいたので、以下のように2回map_dfrします。

Info

as.data.frame()でdataframeに変換するのも良いですが、as_tibble()でtibbleにしましょう。 tibbleはdataframeの進化版みたいなもので、多くの場合tibbleの方が扱いやすいです。

map系の関数は使い方が難しいのでまた今度説明記事を書きたいと思います。

Base PipeMagrittr Pipe
df_raw <- 
    dat |> 
    map_dfr(function(x) {
        x |> 
        map_dfr(function(y) {
            y |> 
                as_tibble()
        })
    })
df_raw <- 
    dat %>% 
    map_dfr(function(x) {
        x %>% 
        map_dfr(function(y) {
            y %>% 
                as_tibble()
        })
    })
df_raw
# # A tibble: 34 × 15
#    company plan           data free_call call_rate call_rate_unit
#    <chr>   <chr>         <dbl>     <int>     <int>          <int>
#  1 OCN     PLAN_500        0.5        10        11             30
#  2 OCN     PLAN_1000       1           0        11             30
#  3 OCN     PLAN_3000       3           0        11             30
#  4 OCN     PLAN_6000       6           0        11             30
#  5 OCN     PLAN_10000     10           0        11             30
#  6 BIGLOBE PLAN_1000_wi…   1           0         9             30
#  7 BIGLOBE PLAN_3000_wi…   3           0         9             30
#  8 BIGLOBE PLAN_6000_wi…   6           0         9             30
#  9 BIGLOBE PLAN_3000       3           0    100000              0
# 10 BIGLOBE PLAN_6000       6           0    100000              0
# # … with 24 more rows, and 9 more variables: free_music <int>,
# #   price <int>, speed <chr>, area <chr>, initial_cost <int>,
# #   exit_cost <int>, free_youtube <int>, exit_period <int>,
# #   free_line <int>

これで「tidyなデータ」になりました。

前処理

とにもかくにもデータが手に入ったら前処理です。

「前処理」とは、扱いやすい形式にデータを整えたり、欠損値や空白といった**"データの汚い部分"を綺麗にしてあげる**ことを指します。

R界隈では 「前処理」イコール「tidyデータの作成」 と解釈しても問題ありません💡

欠損値の補完

自分でデータを作っておいてなんですが、今回欠損値がたくさんあります😅

なぜかと言うと、**LINE通信量が無料になる特典(データフリー)**などの特殊なプランを全てのプランで記入するのが面倒だったからです。

こういう時はとりあえずNAにしておいて、tidyverseで直すのが楽です👋

NAを埋めるにはreplace_na()を使うのが正攻法です。

Base PipeMagrittr Pipe
df_nafilled <- 
    df_raw |> 
    replace_na(list(
        exit_cost = 0,
        free_youtube = 0,
        exit_period = 0,
        free_line = 0,
        free_music= 0,
        initial_cost = 0
    ))
df_nafilled <- 
    df_raw %>% 
    replace_na(list(
        exit_cost = 0,
        free_youtube = 0,
        exit_period = 0,
        free_line = 0,
        free_music= 0,
        initial_cost = 0
    ))
df_nafilled
# # A tibble: 34 × 15
#    company plan           data free_call call_rate call_rate_unit
#    <chr>   <chr>         <dbl>     <int>     <int>          <int>
#  1 OCN     PLAN_500        0.5        10        11             30
#  2 OCN     PLAN_1000       1           0        11             30
#  3 OCN     PLAN_3000       3           0        11             30
#  4 OCN     PLAN_6000       6           0        11             30
#  5 OCN     PLAN_10000     10           0        11             30
#  6 BIGLOBE PLAN_1000_wi…   1           0         9             30
#  7 BIGLOBE PLAN_3000_wi…   3           0         9             30
#  8 BIGLOBE PLAN_6000_wi…   6           0         9             30
#  9 BIGLOBE PLAN_3000       3           0    100000              0
# 10 BIGLOBE PLAN_6000       6           0    100000              0
# # … with 24 more rows, and 9 more variables: free_music <int>,
# #   price <int>, speed <chr>, area <chr>, initial_cost <int>,
# #   exit_cost <int>, free_youtube <int>, exit_period <int>,
# #   free_line <int>

NA(欠損値)は何かと解析の邪魔になる存在ですが、扱い方を知っていればデータ入力の手間を軽減することにもつながります。

方法は今回のreplace_na()以外にもあるので、少しずつ覚えるとよいでしょう🌤️

通信エリアの整頓 ~結合された文字列を分解して新しい行をつくる~

調査して分かったのですが、事業者によっては通信回線(au, softbank, docomo)が選択可能なプランがありました

今回はこれらをau|softbank|docomoといった感じで表記したのですが、たとえば、

AUが使えるのは何社か?

とか、

3回線選べるのはどこか?

といった解析をするには不向きは表記方法です。そこで、separate_rows()関数を使って複数行に分割します💡

Base PipeMagrittr Pipe
df_nafilled |> 
    # ここでは対象列だけを示しています
    dplyr::filter(str_detect(area, "\\|")) |>
    # わかりやすくするためarea列を先頭に移動
    relocate(area)
df_nafilled %>% 
    # ここでは対象列だけを示しています
    dplyr::filter(str_detect(area, "\\|")) %>%
    # わかりやすくするためarea列を先頭に移動
    relocate(area)
# # A tibble: 15 × 15
#    area           company plan   data free_call call_rate call_rate_unit
#    <chr>          <chr>   <chr> <dbl>     <int>     <int>          <int>
#  1 au|docomo      BIGLOBE PLAN…     1         0         9             30
#  2 au|docomo      BIGLOBE PLAN…     3         0         9             30
#  3 au|docomo      BIGLOBE PLAN…     6         0         9             30
#  4 au|docomo      BIGLOBE PLAN…     3         0    100000              0
#  5 au|docomo      BIGLOBE PLAN…     6         0    100000              0
#  6 au|softbank|d… NURO    PLAN…     3         0        22             30
#  7 au|softbank|d… NURO    PLAN…     5         0        22             30
#  8 au|softbank|d… NURO    PLAN…    10         0        22             30
#  9 docomo|au      IIJmio  PLAN…     3         0        11             30
# 10 docomo|au      IIJmio  PLAN…     5         0        11             30
# 11 docomo|au      IIJmio  PLAN…     9         0        11             30
# 12 docomo|softba… JCOM    PLAN…     1         0        20             30
# 13 docomo|softba… JCOM    PLAN…     5         0        20             30
# 14 docomo|softba… mineo   PLAN…     1         0        22             30
# 15 docomo|softba… mineo   PLAN…     5         0        22             30
# # … with 8 more variables: free_music <int>, price <int>, speed <chr>,
# #   initial_cost <int>, exit_cost <int>, free_youtube <int>,
# #   exit_period <int>, free_line <int>
Base PipeMagrittr Pipe
df_nafilled |> 
    # ここでは対象列だけを示しています
    dplyr::filter(str_detect(area, "|")) |>
    separate_rows(area) |>
    # わかりやすくするためarea列を先頭に移動
    relocate(area)
df_nafilled %>% 
    # ここでは対象列だけを示しています
    dplyr::filter(str_detect(area, "|")) %>%
    separate_rows(area) %>%
    # わかりやすくするためarea列を先頭に移動
    relocate(area)
# # A tibble: 56 × 15
#    area   company plan           data free_call call_rate call_rate_unit
#    <chr>  <chr>   <chr>         <dbl>     <int>     <int>          <int>
#  1 docomo OCN     PLAN_500        0.5        10        11             30
#  2 docomo OCN     PLAN_1000       1           0        11             30
#  3 docomo OCN     PLAN_3000       3           0        11             30
#  4 docomo OCN     PLAN_6000       6           0        11             30
#  5 docomo OCN     PLAN_10000     10           0        11             30
#  6 au     BIGLOBE PLAN_1000_wi…   1           0         9             30
#  7 docomo BIGLOBE PLAN_1000_wi…   1           0         9             30
#  8 au     BIGLOBE PLAN_3000_wi…   3           0         9             30
#  9 docomo BIGLOBE PLAN_3000_wi…   3           0         9             30
# 10 au     BIGLOBE PLAN_6000_wi…   6           0         9             30
# # … with 46 more rows, and 8 more variables: free_music <int>,
# #   price <int>, speed <chr>, initial_cost <int>, exit_cost <int>,
# #   free_youtube <int>, exit_period <int>, free_line <int>

ちょっと解析してみる

すでに結構長くなってしまっているので、今回は今操作したエリアだけ軽い解析を一個だけしようと思います。

今回ご紹介する解析方法は <span class="marker-under"><strong>「集計」と「pieチャート」</strong></span> です! 解析のパターンとしてはよく使われる手法だと思います。

まずは複数の選択肢があるプランを分解せずに集計してみます。

Base PipeMagrittr Pipe
df_nafilled |> 
  # 集計表を作る
  distinct(area, company) |> 
  count(area) |> 
  # カウントの多い順にareaをソート
  arrange(-n) |> 
  # ソートのためfactorを利用
  # pieチャートはなぜか反時計回りになるのでrevで順番を逆転させる
  mutate(area = factor(area, levels = rev(unique(area)))) |> 
  # ggplotでpieチャートを作る
  ggplot(aes(x = "", y = n, fill = area)) +
  geom_bar(stat = "identity", position = "stack") + 
  coord_polar(theta = "y") +
  # legendを再び逆転させて整合性を合わせる
  ggsci::scale_fill_aaas(guide = guide_legend(reverse = TRUE))
df_nafilled %>% 
  # 集計表を作る
  distinct(area, company) %>% 
  count(area) %>% 
  # カウントの多い順にareaをソート
  arrange(-n) %>% 
  # ソートのためfactorを利用
  # pieチャートはなぜか反時計回りになるのでrevで順番を逆転させる
  mutate(area = factor(area, levels = rev(unique(area)))) %>% 
  # ggplotでpieチャートを作る
  ggplot(aes(x = "", y = n, fill = area)) +
  geom_bar(stat = "identity", position = "stack") + 
  coord_polar(theta = "y") +
  # legendを再び逆転させて整合性を合わせる
  ggsci::scale_fill_aaas(guide = guide_legend(reverse = TRUE))

image1

やはり直感通りdocomoの採用率がやたらと高いです

次に複数の選択肢がある場合を分けてみます。

Base PipeMagrittr Pipe
df_nafilled %>% 
  separate_rows(area) |>
  # 集計表を作る
  distinct(area, company) %>% 
  count(area) %>%
  # カウントの多い順にareaをソート
  arrange(-n) %>% 
  # ソートのためfactorを利用
  # pieチャートはなぜか反時計回りになるのでrevで順番を逆転させる
  mutate(area = factor(area, levels = rev(unique(area)))) %>% 
  # ggplotでpieチャートを作る
  ggplot(aes(x = "", y = n, fill = area)) +
  geom_bar(stat = "identity", position = "stack") + 
  coord_polar(theta = "y")+
  # legendを再び逆転させて整合性を合わせる
  ggsci::scale_fill_aaas(guide = guide_legend(reverse = TRUE))
df_nafilled %>% 
  separate_rows(area) %>%
  # 集計表を作る
  distinct(area, company) %>% 
  count(area) %>%
  # カウントの多い順にareaをソート
  arrange(-n) %>% 
  # ソートのためfactorを利用
  # pieチャートはなぜか反時計回りになるのでrevで順番を逆転させる
  mutate(area = factor(area, levels = rev(unique(area)))) %>% 
  # ggplotでpieチャートを作る
  ggplot(aes(x = "", y = n, fill = area)) +
  geom_bar(stat = "identity", position = "stack") + 
  coord_polar(theta = "y")+
  # legendを再び逆転させて整合性を合わせる
  ggsci::scale_fill_aaas(guide = guide_legend(reverse = TRUE))

image2

楽天は楽天一社しかないですが、やっぱり採用率的にはdocomoが圧倒しています

これは人気の問題ではなく、MVNOの回線使用料がdocomoの方が安いからなのかな?と思ったのですが、総務省の資料を見ると価格差は特にないみたいです。

資料の白抜き部分が多すぎて肝心の利益率などがわかりませんでしたが・・・ 各社の決算資料でも読めば情報は追跡可能でしょうが、面倒なのでしません

さいごに

ということで、今回は楽天モバイルの代わりを探すためにデータを集めてみました

仕事がなかなかに忙しくて、リアルタイムに情報提供ができなくて残念ですが・・・次回はいろいろな視点から作ったデータを眺めてみたいと思います♪

あ~この記事書くのに一週間もかかっちゃったー! では!

コメント

タイトルとURLをコピーしました