🚀

ChatGPT PlusでAndroidアプリの検証端末を選定しよう

2023/10/20に公開

はじめに

ChatGPT Plusには Advanced Data Analysis という機能があります。少し前まで Code Interpreter という名称でした。
分析したい内容をChatGPTに伝えると、ChatGPTが要件に適したソースコードを作成し、実行して結果を出力してくれます。
インプットになるファイルをアップロードしたり、アウトプットをファイルとしてダウンロードできます。

この記事では、Google Play ConsoleからダウンロードできるCSVファイルをインプットとして、そのアプリを使っているユーザー数を考慮して検証端末を選定する例を紹介します。

なお、本記事内で挙げられているデータは所属会社のものではなく、私が個人で開発しているアプリ(Aplin)のものです。

検証端末を選定する

Androidアプリの検証をどの端末で行うかというのは、実に厄介な問題です。
OSバージョンや画面サイズ、メーカー、ユーザー数など、検証したいアプリの性質によって選定基準は異なります。
そのため、統計データを元に検証端末を選定するのが理想的です。

Google Play Consoleから統計データをダウンロードする

  1. Google Play Consoleにログインする
  2. すべてのアプリ の中から対象のアプリをクリックする
  3. アプリのダッシュボードが開いたら、左メニューの リーチとデバイス > デバイスカタログ をクリックする
  4. デバイスリストのエクスポート をクリックする

上記手順でCSVファイルをダウンロードできます。
中を覗いてみると、以下のような内容です。

Brand Device Manufacturer Model Name RAM (TotalMem) Form Factor System on Chip GPU Screen Sizes Screen Densities ABIs Android SDK Versions OpenGL ES Versions Install base User-perceived ANR rate User-perceived crash rate
OPPO OP4F2BL1 Oppo Reno5 A (eSIM) 5657-5659MB Phone Qualcomm SM7250 Qualcomm Adreno 620 (625 MHz) 1080x2400 480 arm64-v8a;armeabi;armeabi-v7a 30;31 3.2 251 0.00% 0.00%
google bluejay Google Pixel 6a 5841-5876MB Phone Google Tensor ARM Mali G78 (848 MHz) 1080x2400 420 arm64-v8a;armeabi;armeabi-v7a 32;33;34 3.2 198 0.00% 0.00%
Redmi cannong Redmi Redmi Note 9T 3665-3731MB Phone Mediatek MT6853V/ZA 3x ARM Mali G57 (748 MHz) 1080x2340 440 arm64-v8a;armeabi;armeabi-v7a 29;30;31 3.2 181 0.00% 0.00%
docomo SO-51A Sony Xperia 1 II 8037MB Phone Qualcomm SM8250 Qualcomm Adreno 650 (587 MHz) 1096x2560 420 arm64-v8a;armeabi;armeabi-v7a 31 3.2 172 0.00% 0.00%

メーカーの名前や端末名、SDKバージョン、画面サイズ、インストール数など、検証端末を選定するために必要な情報は網羅されていそうです。

Advanced Data Analysis で分析を行う

先ほどのCSVファイルをアップロードして、プロンプトを入力し送信します。
アウトプット形式は、表はもちろん、グラフも描画できます。
いくつか例を挙げてみます。

なお、Advanced Data AnalysisはGPT-4の以下の箇所から切り替えることができます。

メーカー別にインストール数シェアをグラフ化する

プロンプト例は以下の通りです。

添付ファイルは、Google Play Consoleからダウンロードしたデバイスリストです。
メーカーごとのインストール数のシェアを棒グラフ、円グラフで出力してください。

アウトプットは以下のようになりました。長いですが、最初なので全文を掲載します。

了解しました。まずは、添付されたデバイスリストのデータを確認します。

import pandas as pd

# Load the CSV file into a DataFrame
devices_df = pd.read_csv('/mnt/data/devices.csv')

# Display the first few rows of the dataset to understand its structure
devices_df.head()

結果

    Brand    Device Manufacturer      Model Name RAM (TotalMem) Form Factor  \
0    OPPO  OP4F2BL1         Oppo  Reno5 A (eSIM)    5657-5659MB       Phone   
1  google   bluejay       Google        Pixel 6a    5841-5876MB       Phone   
2   Redmi   cannong        Redmi   Redmi Note 9T    3665-3731MB       Phone   
3  docomo    SO-51A         Sony     Xperia 1 II         8037MB       Phone   
4  DOCOMO    SH-51C        Sharp     AQUOS wish2    3632-3633MB       Phone

        System on Chip                            GPU Screen Sizes  \
0      Qualcomm SM7250  Qualcomm Adreno 620 (625 MHz)    1080x2400   
1        Google Tensor         ARM Mali G78 (848 MHz)    1080x2400   
2  Mediatek MT6853V/ZA      3x ARM Mali G57 (748 MHz)    1080x2340   
3      Qualcomm SM8250  Qualcomm Adreno 650 (587 MHz)    1096x2560   
4           QTI SM6375  Qualcomm Adreno 619 (840 MHz)     720x1520

Screen Densities                           ABIs Android SDK Versions  \
0              480  arm64-v8a;armeabi;armeabi-v7a                30;31   
1              420  arm64-v8a;armeabi;armeabi-v7a             32;33;34   
2              440  arm64-v8a;armeabi;armeabi-v7a             29;30;31   
3              420  arm64-v8a;armeabi;armeabi-v7a                   31   
4              280  arm64-v8a;armeabi;armeabi-v7a                31;33

OpenGL ES Versions  Install base User-perceived ANR rate  \
0                3.2           251                   0.00%   
1                3.2           198                   0.00%   
2                3.2           181                   0.00%   
3                3.2           172                   0.00%   
4                3.2           137                   0.00%

User-perceived crash rate  
0                     0.00%  
1                     0.00%  
2                     0.00%  
3                     0.00%  
4                     0.00%

デバイスリストのデータを確認しました。Manufacturer 列にメーカー名があり、Install base 列にインストール数が記載されているようです。

次に、メーカーごとのインストール数の合計を計算し、棒グラフおよび円グラフで表示します。

import matplotlib.pyplot as plt

# Group by manufacturer and sum the install base
manufacturer_installs = devices_df.groupby('Manufacturer')['Install base'].sum().sort_values(ascending=False)

# Plot the bar graph
plt.figure(figsize=(15, 6))
manufacturer_installs.plot(kind='bar', color='skyblue', edgecolor='black')
plt.title('Install Base by Manufacturer')
plt.ylabel('Number of Installs')
plt.xlabel('Manufacturer')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

# Plot the pie chart
plt.figure(figsize=(10, 10))
manufacturer_installs.plot(kind='pie', autopct='%1.1f%%', startangle=140, colors=plt.cm.Paired.colors)
plt.title('Install Base Share by Manufacturer')
plt.ylabel('')
plt.show()


メーカーごとのインストール数のシェアを示す棒グラフと円グラフを出力しました。

棒グラフでは、各メーカーのインストール数を示しています。円グラフでは、全体に対する各メーカーのインストール数のシェアを示しています。

グラフに表示される一部の文字が正しく表示されない問題がありますが、内容は正確に表示されています。何か他に質問や要望がありますか?

こちらの指示が曖昧だったばかりに、全ての凡例が表示されてしまいました。
通常のChatGPT同様、追加のやりとりで軌道修正してみます。

メーカー名が重なってしまい読みづらいです。
ユーザー数のシェアが3%を超えるメーカーのみを表示し、あとはまとめてください。

結果は以下のようになりました。良い感じですね。

# Threshold for percentage
threshold = 0.03

# Calculate the percentages
manufacturer_percentage = manufacturer_installs / manufacturer_installs.sum()

# Filter manufacturers that are above the threshold
major_manufacturers = manufacturer_percentage[manufacturer_percentage >= threshold]
other_percentage = manufacturer_percentage[manufacturer_percentage < threshold].sum()
major_manufacturers['Other'] = other_percentage

# Plot the filtered bar graph
plt.figure(figsize=(15, 6))
major_manufacturers.sort_values(ascending=False).plot(kind='bar', color='skyblue', edgecolor='black')
plt.title('Install Base by Major Manufacturers')
plt.ylabel('Percentage of Total Installs')
plt.xlabel('Manufacturer')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

# Plot the filtered pie chart
plt.figure(figsize=(10, 10))
major_manufacturers.plot(kind='pie', autopct='%1.1f%%', startangle=140, colors=plt.cm.Paired.colors)
plt.title('Install Base Share by Major Manufacturers')
plt.ylabel('')
plt.show()



ユーザー数のシェアが3%を超えるメーカーのみを表示し、その他のメーカーは「Other」としてまとめて表示しました。

これでグラフが読みやすくなったと思います。何か他に質問や要望がありますか?

データの正確性を担保するには

このまま鵜呑みにして先に進むこともできますが、「このグラフは本当に正しいのか」はどのように確認するべきでしょうか。
私が思いつく手段は以下の3つです。

  1. ChatGPTが作成・実行したPythonのソースコードをレビューする
  2. 実際のデータをいくつかピックアップし、自分で計算して同じ値になるかを確認してみる
  3. ChatGPTを信じて鵜呑みにする

Pythonが読めなければ選択肢2・3を選ぶほかありません。 ただ、毎回計算するのは手間ですし、部分的に正しかったとしても全てが正しいと言い切るのは難しいです。
正確に担保するには、Pythonのソースコードレビューを行うべきでしょう。
こうして考えてみると、誰かに作業を依頼するときと何ら変わりありませんね。
(Aさんにデータ分析を依頼したら、分析に使ったコードをレビューするか、自分で検算するか、Aさんを信じるかを選ぶことになる)

ユーザーシェアの多い検証端末を選定する

傾向が分かったところで、本命である検証端末の選定します。
私の場合、Google Pixelは複数台持っており、家族のお古であるXperia(Sony)も何台かあるので、Sony・Google以外から選定してみます。

なお、データを確認すると、例えば Model NameAQUOS wish2 の行は複数に分かれています。 BrandDOCOMOKDDI など、キャリアで分かれているようです。
そのため、同じ Model Name の行を合算する指示も追加しています。

添付ファイルは、Google Play Consoleからダウンロードしたデバイスリストです。
このデータを分析し、追加で購入する検証端末の候補を選定してください。

現在検証端末として用意しているのは以下の端末です。
- Pixel 5
- Pixel Fold
- Xperia XZ2 Compact

選定基準は以下の通りです。
- 多様な画面サイズでのテストができること
  - 既存の検証端末と重複しないこと
- 画面サイズが小さい端末を優先すること
- 多様なManufacturerの端末を含めること
  - アプリユーザー全体のシェアが1%を下回るManufacturerは除外すること
  - 既存の検証端末と重複しないこと
- ユーザーシェアを考慮して効果的にカバーできること
- Android SDK Versionsが29以上であること

また、同じModel Nameでも、ブランド名やデバイス名によって行が分かれる場合があります。
例えば、Model Name="AQUOS wish2"の行は、Brand="DOCOMO", "KDDI"のように分かれています。
そのため、インストール数を計算する際は、同じModel Nameの行を合算する必要があることに注意してください。

結果は以下の通りです。

了解しました。まず、提供されたCSVファイルの内容を確認して、必要な分析を進めていきます。

(編集注:長いため省略)

選定基準に基づき、以下のデバイスを検証端末の候補として選定しました:

  1. Model Name: RZ-H271, Manufacturer: Sharp, Screen Sizes: 480x800, Install base: 0
  2. Model Name: Lenovo Tab M7 (3rd Gen), Manufacturer: Lenovo, Screen Sizes: 600x1024, Install base: 1
  3. Model Name: AQUOS wish2, Manufacturer: Sharp, Screen Sizes: 720x1520, Install base: 152
  4. Model Name: Xperia Ace III, Manufacturer: Sony, Screen Sizes: 720x1496, Install base: 89
  5. Model Name: Xperia Ace II, Manufacturer: Sony, Screen Sizes: 720x1496, Install base: 69

これらのデバイスは、指定された基準に基づいて選定されました。特に、画面サイズが小さいものを優先し、さらにインストールベースが大きいものを優先して選定しました。

これで、検証端末の選定が完了しました。何か他にご質問や要望がありますか?

長くなってしまうのでソースコードは省略しましたが、特に指示せずともSDKバージョンの 32;33;34 のような形式にきちんと対応しています。
該当箇所の抜粋です。

# Filter devices based on Android SDK Version (should be 29 and above)
devices_df['Max SDK Version'] = devices_df['Android SDK Versions'].str.split(';').apply(lambda x: max([int(ver) for ver in x]))
filtered_devices_df = devices_df[devices_df['Max SDK Version'] >= 29]

インストール数が0の端末まで候補に挙がってしまいました。少し調整してみます。

ありがとうございます。
デバイスを絞り込む条件を以下のように変更してください。
1. 既存の検証端末とメーカーが重複しないこと
2. インストール数が多い端末を選ぶこと

結果、以下のような端末が候補に挙がってきました。期待通りですね。

Model Name: Reno5 A (eSIM), Manufacturer: Oppo, Screen Sizes: 1080x2400, Install base: 251
Model Name: Redmi Note 9T, Manufacturer: Redmi, Screen Sizes: 1080x2340, Install base: 181
Model Name: Galaxy S20 5G, Manufacturer: Samsung, Screen Sizes: 1440x3200, Install base: 154
Model Name: AQUOS wish2, Manufacturer: Sharp, Screen Sizes: 720x1520, Install base: 152
Model Name: Galaxy S10, Manufacturer: Samsung, Screen Sizes: 1440x3040, Install base: 135

画面の小さい検証端末を選定する

最初の例で「画面サイズが小さい」を条件にしましたが期待通りにならなかったので、さらにプロンプトを調整してみます。

工夫した点は以下の通りです。

  • 画面サイズの定義を「画面の高さ・幅・解像度の積」と定義
    適切かは何とも言えませんが、それらしいものが出てくることを期待します。
  • Screen SizesScreen Densitiesにはセミコロンが含まれることを明示
    1080x1920;1200x2000のような値があった場合、プロンプトで明示せずとも、ChatGPTはきちんと考慮してくれます。
    (分析しようとする→Pythonのコードで実行時エラーになる→エラーメッセージから「セミコロンが原因なので、コードを修正して再実行」という流れになります)
    しかし、出力が長くなるに伴い、前半のデータを忘れてしまう傾向があるため、事前情報としてプロンプトに渡しておきます。

以下、最終的なプロンプトです。

添付ファイルは、Google Play Consoleからダウンロードしたデバイスリストです。
このデータを分析し、追加で購入する検証端末の候補を選定してください。

選定基準は以下の通りです。
- 既存の検証端末とメーカー(Manufacturer)が重複しないこと
GoogleとSonyを除外してください。
- 画面サイズが小さい端末を優先すること
画面サイズの定義は、画面の高さ・幅・解像度の積とします。
- 全体シェアの0.5%以上のユーザーがいる端末を選ぶこと
- Android SDK Versionsが29以上であること

分析時の注意事項は以下の通りです。
- 同じModel Nameでも、ブランド名やデバイス名によって行が分かれる場合があります。
例えば、Model Name="AQUOS wish2"の行は、Brand="DOCOMO", "KDDI"のように分かれています。
そのため、インストール数を計算する際は、同じModel Nameの行を合算してください。
- 画面サイズ、解像度の列はセミコロン(;)で複数定義される場合があります。
例えば `1080x1920;1200x2000` や `160;213` などです。
セミコロンが含まれる場合、一番小さい値を採用してください。

出力結果には以下の情報を含めてください。
- メーカー名
- 端末名
- 画面サイズ
- 解像度
- 計算した画面サイズ(高さ・幅・解像度の積)
- インストール数

出力結果はMarkdownの表形式で、上位15件を出力してください。

結果は以下の通りです(Pythonのコードは省略)。

了解しました。まずは、添付されたファイルを読み込み、中身を確認します。

データを確認しました。次に、以下の手順で分析を進めていきます。

  1. GoogleとSonyのメーカーを除外します。
  2. Android SDK Versionsが29以上の端末のみを選択します。
  3. 同じModel Nameの端末のインストール数を合算します。
  4. 画面サイズと解像度の列について、セミコロンで分割された値の中から最小値を選択します。
  5. 画面サイズの定義(高さ・幅・解像度の積)を計算します。
  6. 全体シェアの0.5%以上のユーザーがいる端末のみを選択します。
  7. 上記の条件を満たす端末を、計算した画面サイズの昇順(小さい順)でソートし、上位15件を選出します。

これを基に分析を開始します。

以下は、選定基準に基づいて選ばれた上位15件の端末リストです。

メーカー名 端末名 画面サイズ (幅) 画面サイズ (高さ) 解像度 計算した画面サイズ インストール数
Oppo A9 2020 720 1600 160 184,320,000 51
Sharp AQUOS wish2 720 1520 280 306,432,000 152
Motorola moto g53j 5G 720 1600 280 322,560,000 41
Samsung Galaxy A22 5G 720 1560 300 336,960,000 47
Rakuten Rakuten Hand 720 1520 320 350,208,000 39
Rakuten Rakuten Hand5G 720 1520 320 350,208,000 63
FCNT arrows We F-51B 720 1520 320 350,208,000 61
FCNT arrows We FCG01 720 1520 320 350,208,000 42
Samsung Galaxy A20 720 1560 320 359,424,000 53
Samsung Galaxy A21 720 1560 320 359,424,000 65
Fujitsu F-04K 1080 1920 320 663,552,000 35
Lenovo d-42A 1200 1920 320 737,280,000 38
Motorola moto g52j 5G 1080 2460 400 1,062,720,000 56
Sharp AQUOS sense5G 1080 2280 440 1,083,456,000 46
Samsung Galaxy A51 5G 1080 2400 420 1,088,640,000 41

ここまで候補が出てくれば、あとは中古の端末を選ぶだけです。1万円台で購入可能なものも多そうでした。
また、Android SDK Versionsが29以上全体シェアの0.5%以上の条件を調整し、ご自身の要望に沿った分析が可能です。

まとめ

最後のプロンプトのように、要件を正確に言語化できていれば、エンジニア自身の手でも計算可能ではあります。
しかし、ChatGPT Plusを使うことで、より簡単に、より早く実現できるようになるのは間違い無いでしょう。

ぜひ、ご自身のアプリの端末リストも分析してみてください。

アイスタイルのアプリ開発グループでは、当記事でまとめた分析方法を用いて、実際に検証端末を選定し、購入することになりました。
今後も積極的にAIを活用したいと考えています。
興味を持ってくださる方がいましたら、お気軽にご連絡ください。
https://open.talentio.com/r/1/c/isytyle_career/pages/43022
https://open.talentio.com/r/1/c/isytyle_career/pages/43019

株式会社アイスタイル

Discussion