In this project, we will analyze data for a company that creates mobile applications for Android and iOS. These apps are available on Google Play and the App Store.
Only apps that can be downloaded and installed for free are created, and the main source of revenue consists of in-app advertisements. This means that the number of app users determines the revenue for a given app: the more users see and engage with the ads, the better.
Our goal in this project is to analyze the data to help developers understand what kind of apps can attract more users.
As of September 2018, there were approximately 2 million iOS apps available on the App Store, and 2.1 million Android apps on Google Play.
Collecting data for over 4 million apps requires a significant amount of time and money, so we'll try to analyze a sample of the data instead. To avoid spending resources on collecting new data ourselves, we should first try to see if we can find any relevant existing data at no cost. Luckily, here are two data sets that seem suitable for our goals:
A dataset containing data about approximately 10,000 Android apps from Google Play; the data was collected in August 2018. You can download the data set directly from this lin.
A dataset containing data about approximately 7,000 iOS apps from the App Store; the data was collected in July 2017. You can download the data set directly from this link.
Let's start by opening the two data sets and then continue with exploring the data.
from csv import reader
# The Google Play data set
google_play_file = open('googleplaystore.csv', encoding='utf-8')
read_google_file = reader(google_play_file)
android = list(read_google_file)
android_header = android[0]
android = android[1:]
google_play_file.close()
# The App Store data set
app_store_file = open('AppleStore.csv', encoding='utf-8')
read_app_file = reader(app_store_file)
ios = list(read_app_file)
ios_header = ios[0]
ios = ios[1:]
app_store_file.close()
To make it easier to explore the two data sets, we'll first write a function named explore_data()
that we can use repeatedly to explore rows in a more readable way. We'll also add an option for our function to show the number of rows and columns for any data set.
def explore_data(dataset, start, end, rows_and_columns=False):
dataset_slice = dataset[start:end]
for row in dataset_slice:
print(row)
print('\n') # adds a new (empty) line after each row
if rows_and_columns:
print('Number of rows:', len(dataset))
print('Number of columns:', len(dataset[0]))
# Exploring some records from the Google Play dataset
print(android_header)
print('\n')
explore_data(android, 0, 3, True)
['App', 'Category', 'Rating', 'Reviews', 'Size', 'Installs', 'Type', 'Price', 'Content Rating', 'Genres', 'Last Updated', 'Current Ver', 'Android Ver'] ['Photo Editor & Candy Camera & Grid & ScrapBook', 'ART_AND_DESIGN', '4.1', '159', '19M', '10,000+', 'Free', '0', 'Everyone', 'Art & Design', 'January 7, 2018', '1.0.0', '4.0.3 and up'] ['Coloring book moana', 'ART_AND_DESIGN', '3.9', '967', '14M', '500,000+', 'Free', '0', 'Everyone', 'Art & Design;Pretend Play', 'January 15, 2018', '2.0.0', '4.0.3 and up'] ['U Launcher Lite – FREE Live Cool Themes, Hide Apps', 'ART_AND_DESIGN', '4.7', '87510', '8.7M', '5,000,000+', 'Free', '0', 'Everyone', 'Art & Design', 'August 1, 2018', '1.2.4', '4.0.3 and up'] Number of rows: 10841 Number of columns: 13
We see that the Google Play data set has 10,841 apps and 13 columns. At a quick glance, the columns that might be useful for the purpose of our analysis are 'App'
, 'Category'
, 'Reviews'
, 'Installs'
, 'Type'
, 'Price'
, and 'Genres'
.
Now let's take a look at the App Store data set.
print(ios_header)
print('\n')
explore_data(ios, 0, 3, True)
['id', 'track_name', 'size_bytes', 'currency', 'price', 'rating_count_tot', 'rating_count_ver', 'user_rating', 'user_rating_ver', 'ver', 'cont_rating', 'prime_genre', 'sup_devices.num', 'ipadSc_urls.num', 'lang.num', 'vpp_lic'] ['284882215', 'Facebook', '389879808', 'USD', '0.0', '2974676', '212', '3.5', '3.5', '95.0', '4+', 'Social Networking', '37', '1', '29', '1'] ['389801252', 'Instagram', '113954816', 'USD', '0.0', '2161558', '1289', '4.5', '4.0', '10.23', '12+', 'Photo & Video', '37', '0', '29', '1'] ['529479190', 'Clash of Clans', '116476928', 'USD', '0.0', '2130805', '579', '4.5', '4.5', '9.24.12', '9+', 'Games', '38', '5', '18', '1'] Number of rows: 7197 Number of columns: 16
We have 7,197 iOS apps in this data set, and the columns that seem interesting are: 'track_name'
, 'currency'
, 'price'
, 'rating_count_tot'
, 'rating_count_ver'
, and 'prime_genre'
. Not all column names are self-explanatory in this case, but details about each column can be found in the data set documentation.
The Google Play data set has a dedicated discussion section, and we can see that one of the discussions outlines an error for row 10,472. Let's print this row and compare it against the header and another row that is correct.
print(android[10472])
print('\n')
print(android_header)
print('\n')
print(android[0])
['Life Made WI-Fi Touchscreen Photo Frame', '1.9', '19', '3.0M', '1,000+', 'Free', '0', 'Everyone', '', 'February 11, 2018', '1.0.19', '4.0 and up'] ['App', 'Category', 'Rating', 'Reviews', 'Size', 'Installs', 'Type', 'Price', 'Content Rating', 'Genres', 'Last Updated', 'Current Ver', 'Android Ver'] ['Photo Editor & Candy Camera & Grid & ScrapBook', 'ART_AND_DESIGN', '4.1', '159', '19M', '10,000+', 'Free', '0', 'Everyone', 'Art & Design', 'January 7, 2018', '1.0.0', '4.0.3 and up']
The row 10,472 corresponds to the app Life Made WI-Fi Touchscreen Photo Frame
, and we can see that the rating is 19. This is clearly off because the maximum rating for a Google Play app is 5 (as mentioned in the discussions section, this problem is caused by a missing value in the 'Category'
column). As a consequence, we'll delete this row.
print("Number of rows before removing the wrong row:", len(android))
del android[10472] # don't run this more than once
print("Number of rows after removing the wrong row:", len(android))
Number of rows before removing the wrong row: 10841 Number of rows after removing the wrong row: 10840
for app in android:
name = app[0]
if name == 'Instagram':
print(app)
['Instagram', 'SOCIAL', '4.5', '66577313', 'Varies with device', '1,000,000,000+', 'Free', '0', 'Teen', 'Social', 'July 31, 2018', 'Varies with device', 'Varies with device'] ['Instagram', 'SOCIAL', '4.5', '66577446', 'Varies with device', '1,000,000,000+', 'Free', '0', 'Teen', 'Social', 'July 31, 2018', 'Varies with device', 'Varies with device'] ['Instagram', 'SOCIAL', '4.5', '66577313', 'Varies with device', '1,000,000,000+', 'Free', '0', 'Teen', 'Social', 'July 31, 2018', 'Varies with device', 'Varies with device'] ['Instagram', 'SOCIAL', '4.5', '66509917', 'Varies with device', '1,000,000,000+', 'Free', '0', 'Teen', 'Social', 'July 31, 2018', 'Varies with device', 'Varies with device']
In total, there are 1,181 cases where an app occurs more than once:
duplicate_apps = []
unique_apps = []
for app in android:
name = app[0]
if name in unique_apps:
duplicate_apps.append(name)
else:
unique_apps.append(name)
print('Number of duplicate apps:', len(duplicate_apps))
print('\n')
print('Examples of duplicate apps:', '-' * 27, sep='\n')
print(*duplicate_apps[:15], sep='\n')
Number of duplicate apps: 1181 Examples of duplicate apps: --------------------------- Quick PDF Scanner + OCR FREE Box Google My Business ZOOM Cloud Meetings join.me - Simple Meetings Box Zenefits Google Ads Google My Business Slack FreshBooks Classic Insightly CRM QuickBooks Accounting: Invoicing & Expenses HipChat - Chat Built for Teams Xero Accounting Software
We don't want to count certain applications more than once when we analyze the data, so we have to eliminate duplicate entries and keep only one entry per application. One thing we could do is remove the duplicate rows at random, but we will discuss a better way to do it.
If we examine the rows that we print for the Instagram application, the main difference occurs in the fourth position of each row, which corresponds to the number of reviews. The different numbers show that the data was collected at different times. We can use this information to build criteria to eliminate duplicates. The higher the number of reviews, the more recent the data should be. So, We'll only keep the rows that have the highest number of reviews.
To do that, we will:
Let's start by building the dictionary
reviews_max = {}
for app in android:
name = app[0]
n_reviews = float(app[3])
if name in reviews_max and reviews_max[name] < n_reviews:
reviews_max[name] = n_reviews
elif name not in reviews_max:
reviews_max[name] = n_reviews
In a previous code cell, we found that there are 1,181 cases where an app occurs more than once, so the length of our dictionary (of unique apps) should be equal to the difference between the length of our data set and 1,181.
print('Expected length:', len(android) - 1181)
print('Actual length:', len(reviews_max))
Expected length: 9659 Actual length: 9659
Now, let's use the reviews_max
dictionary to remove the duplicates. For the duplicate cases, we'll only keep the entries with the highest number of reviews. In the code cell below:
android_clean
and already_added
.android
data set, and for every iteration, do the following:android_clean
list, and the app name (name) to the already_added
list if:reviews_max
dictionary.already_added
list. We need to add this supplementary condition to account for those cases where the highest number of reviews of a duplicate app is the same for more than one entry (for example, the Box app has three entries, and the number of reviews is the same). If we just check for reviews_max[name] == n_reviews
, we'll still end up with duplicate entries for some apps.android_clean = []
already_added = []
for app in android:
name = app[0]
n_reviews = float(app[3])
if (reviews_max[name] == n_reviews) and (name not in already_added):
android_clean.append(app)
already_added.append(name)
Now let's quickly explore the new data set, and confirm that the number of rows is 9,659.
explore_data(android_clean, 0, 3, True)
['Photo Editor & Candy Camera & Grid & ScrapBook', 'ART_AND_DESIGN', '4.1', '159', '19M', '10,000+', 'Free', '0', 'Everyone', 'Art & Design', 'January 7, 2018', '1.0.0', '4.0.3 and up'] ['U Launcher Lite – FREE Live Cool Themes, Hide Apps', 'ART_AND_DESIGN', '4.7', '87510', '8.7M', '5,000,000+', 'Free', '0', 'Everyone', 'Art & Design', 'August 1, 2018', '1.2.4', '4.0.3 and up'] ['Sketch - Draw & Paint', 'ART_AND_DESIGN', '4.5', '215644', '25M', '50,000,000+', 'Free', '0', 'Teen', 'Art & Design', 'June 8, 2018', 'Varies with device', '4.2 and up'] Number of rows: 9659 Number of columns: 13
We have 9659 rows, just as expected.
print(ios[813][1])
print(ios[6731][1])
print('\n')
print(android_clean[4412][0])
print(android_clean[7940][0])
爱奇艺PPS -《欢乐颂2》电视剧热播 【脱出ゲーム】絶対に最後までプレイしないで 〜謎解き&ブロックパズル〜 中国語 AQリスニング لعبة تقدر تربح DZ
We're not interested in keeping these apps, so we'll remove them. One way to do this is to remove each app with a name containing a symbol that isn't commonly used in English text — English text usually includes letters from the English alphabet, numbers composed of digits from 0 to 9, punctuation marks (., !, ?, ;), and other symbols (+, *, /).
All these characters that are specific to English texts are encoded using the ASCII standard. Each ASCII character has a corresponding number between 0 and 127 associated with it, and we can take advantage of that to build a function that checks an app name and tells us whether it contains non-ASCII characters.
We built this function below, and we use the built-in ord()
function to find out the corresponding encoding number of each character.
def is_english(string):
for character in string:
if ord(character) > 127:
return False
return True
print(is_english('Instagram'))
print(is_english('爱奇艺PPS -《欢乐颂2》电视剧热播'))
True False
The function seems to work fine, but some English app names use emojis or other symbols (™, –, etc.) that fall outside of the ASCII range. Because of this, we'll remove useful apps if we use the function in its current form.
print(is_english('Docs To Go™ Free Office Suite'))
print(is_english('Instachat 😜'))
print(ord('™'))
print(ord('😜'))
False False 8482 128540
To minimize the impact of data loss, we'll only remove an app if its name has more than three characters with corresponding numbers falling outside the ASCII range.
def is_english(string):
non_ascii = 0
for character in string:
if ord(character) > 127:
non_ascii += 1
if non_ascii > 3:
return False
return True
print(is_english('Docs To Go™ Free Office Suite'))
print(is_english('Instachat 😜'))
True True
The function is still not perfect, and very few non-English apps might get past our filter, but this seems good enough at this point in our analysis — we shouldn't spend too much time on optimization at this point.
Below, we use the is_english()
function to filter out the non-English apps for both data sets:
android_english = []
ios_english = []
for app in android_clean:
name = app[0]
if is_english(name):
android_english.append(app)
for app in ios:
name = app[1]
if is_english(name):
ios_english.append(app)
print("Android apps:", '-' * 13, sep='\n')
explore_data(android_english, 0, 3, True)
print('\n')
print("iOS apps:", '-' * 9, sep='\n')
explore_data(ios_english, 0, 3, True)
Android apps: ------------- ['Photo Editor & Candy Camera & Grid & ScrapBook', 'ART_AND_DESIGN', '4.1', '159', '19M', '10,000+', 'Free', '0', 'Everyone', 'Art & Design', 'January 7, 2018', '1.0.0', '4.0.3 and up'] ['U Launcher Lite – FREE Live Cool Themes, Hide Apps', 'ART_AND_DESIGN', '4.7', '87510', '8.7M', '5,000,000+', 'Free', '0', 'Everyone', 'Art & Design', 'August 1, 2018', '1.2.4', '4.0.3 and up'] ['Sketch - Draw & Paint', 'ART_AND_DESIGN', '4.5', '215644', '25M', '50,000,000+', 'Free', '0', 'Teen', 'Art & Design', 'June 8, 2018', 'Varies with device', '4.2 and up'] Number of rows: 9614 Number of columns: 13 iOS apps: --------- ['284882215', 'Facebook', '389879808', 'USD', '0.0', '2974676', '212', '3.5', '3.5', '95.0', '4+', 'Social Networking', '37', '1', '29', '1'] ['389801252', 'Instagram', '113954816', 'USD', '0.0', '2161558', '1289', '4.5', '4.0', '10.23', '12+', 'Photo & Video', '37', '0', '29', '1'] ['529479190', 'Clash of Clans', '116476928', 'USD', '0.0', '2130805', '579', '4.5', '4.5', '9.24.12', '9+', 'Games', '38', '5', '18', '1'] Number of rows: 6183 Number of columns: 16
We can see that we're left with 9,614 Android apps and 6,183 iOS apps.
As we mentioned in the introduction, we only build apps that are free to download and install, and our main source of revenue consists of in-app ads. Our datasets contain both free and non-free apps; we'll need to isolate only the free apps for our analysis.
Next, we isolate the free apps for both our data sets.
android_final = []
ios_final = []
for app in android_english:
price = app[7]
if price == '0':
android_final.append(app)
for app in ios_english:
price = app[4]
if price == '0.0':
ios_final.append(app)
print("Number of records in the Android dataset:", len(android_final))
print("Number of records in the iOS dataset.", len(ios_final))
Number of records in the Android dataset: 8864 Number of records in the iOS dataset. 3222
We're left with 8,864 Android apps and 3,222 iOS apps, which should be enough for our analysis.
As we mentioned in the introduction, our aim is to determine the kinds of apps that are likely to attract more users because our revenue is highly influenced by the number of people using our apps.
To minimize risks and overhead, our validation strategy for an app idea has three steps:
Because our end goal is to add the app on both Google Play and the App Store, we need to find app profiles that are successful in both markets. For instance, a profile that works well for both markets might be a productivity app that makes use of gamification.
Let's begin the analysis by determining the most common genres for each market. For this, we'll need to build frequency tables for a few columns in our datasets.
We'll build two functions we can use to analyze the frequency tables:
def freq_table(dataset, index):
table = {}
total = 0
for row in dataset:
total += 1
value = row[index]
if value not in table:
table[value] = 0
table[value] += 1
table_percentages = {}
for key in table:
percentage = round((table[key] / total) * 100, 2)
table_percentages[key] = percentage
return table_percentages
def display_table(dataset, index, title):
table = freq_table(dataset, index)
table_display = []
for key in table:
key_val_as_tuple = (table[key], key)
table_display.append(key_val_as_tuple)
table_sorted = sorted(table_display, reverse = True)
print(title, '-' * len(title), sep='\n')
for entry in table_sorted:
print(entry[1], ':', entry[0])
We start by examining the frequency table for the prime_genre
column of the App Store data set.
display_table(ios_final, -5,
"Frequency table by prime genres - iOS")
Frequency table by prime genres - iOS ------------------------------------- Games : 58.16 Entertainment : 7.88 Photo & Video : 4.97 Education : 3.66 Social Networking : 3.29 Shopping : 2.61 Utilities : 2.51 Sports : 2.14 Music : 2.05 Health & Fitness : 2.02 Productivity : 1.74 Lifestyle : 1.58 News : 1.33 Travel : 1.24 Finance : 1.12 Weather : 0.87 Food & Drink : 0.81 Reference : 0.56 Business : 0.53 Book : 0.43 Navigation : 0.19 Medical : 0.19 Catalogs : 0.12
We can see that among the free English apps, more than a half (58.16%) are games. Entertainment apps are close to 8%, followed by photo and video apps, which are close to 5%. Only 3.66% of the apps are designed for education, followed by social networking apps which amount for 3.29% of the apps in our data set.
The general impression is that App Store (at least the part containing free English apps) is dominated by apps that are designed for fun (games, entertainment, photo and video, social networking, sports, music, etc.), while apps with practical purposes (education, shopping, utilities, productivity, lifestyle, etc.) are more rare. However, the fact that fun apps are the most numerous doesn't also imply that they also have the greatest number of users — the demand might not be the same as the offer.
Let's continue by examining the Genres
and Category
columns of the Google Play data set (two columns which seem to be related).
display_table(android_final, 1,
"Frequency table by category - Android")
Frequency table by category - Android ------------------------------------- FAMILY : 18.91 GAME : 9.72 TOOLS : 8.46 BUSINESS : 4.59 LIFESTYLE : 3.9 PRODUCTIVITY : 3.89 FINANCE : 3.7 MEDICAL : 3.53 SPORTS : 3.4 PERSONALIZATION : 3.32 COMMUNICATION : 3.24 HEALTH_AND_FITNESS : 3.08 PHOTOGRAPHY : 2.94 NEWS_AND_MAGAZINES : 2.8 SOCIAL : 2.66 TRAVEL_AND_LOCAL : 2.34 SHOPPING : 2.25 BOOKS_AND_REFERENCE : 2.14 DATING : 1.86 VIDEO_PLAYERS : 1.79 MAPS_AND_NAVIGATION : 1.4 FOOD_AND_DRINK : 1.24 EDUCATION : 1.16 ENTERTAINMENT : 0.96 LIBRARIES_AND_DEMO : 0.94 AUTO_AND_VEHICLES : 0.93 HOUSE_AND_HOME : 0.82 WEATHER : 0.8 EVENTS : 0.71 PARENTING : 0.65 ART_AND_DESIGN : 0.64 COMICS : 0.62 BEAUTY : 0.6
The landscape seems significantly different on Google Play: there are not that many apps designed for fun, and it seems that a good number of apps are designed for practical purposes (family, tools, business, lifestyle, productivity, etc.). However, if we investigate this further, we can see that the family category (which accounts for almost 19% of the apps) means mostly games for kids.
Even so, practical apps seem to have a better representation on Google Play compared to App Store. This picture is also confirmed by the frequency table we see for the Genres column:
display_table(android_final, -4,
"Frequency table by genres - Android")
Frequency table by genres - Android ----------------------------------- Tools : 8.45 Entertainment : 6.07 Education : 5.35 Business : 4.59 Productivity : 3.89 Lifestyle : 3.89 Finance : 3.7 Medical : 3.53 Sports : 3.46 Personalization : 3.32 Communication : 3.24 Action : 3.1 Health & Fitness : 3.08 Photography : 2.94 News & Magazines : 2.8 Social : 2.66 Travel & Local : 2.32 Shopping : 2.25 Books & Reference : 2.14 Simulation : 2.04 Dating : 1.86 Arcade : 1.85 Video Players & Editors : 1.77 Casual : 1.76 Maps & Navigation : 1.4 Food & Drink : 1.24 Puzzle : 1.13 Racing : 0.99 Role Playing : 0.94 Libraries & Demo : 0.94 Auto & Vehicles : 0.93 Strategy : 0.91 House & Home : 0.82 Weather : 0.8 Events : 0.71 Adventure : 0.68 Comics : 0.61 Beauty : 0.6 Art & Design : 0.6 Parenting : 0.5 Card : 0.45 Casino : 0.43 Trivia : 0.42 Educational;Education : 0.39 Board : 0.38 Educational : 0.37 Education;Education : 0.34 Word : 0.26 Casual;Pretend Play : 0.24 Music : 0.2 Racing;Action & Adventure : 0.17 Puzzle;Brain Games : 0.17 Entertainment;Music & Video : 0.17 Casual;Brain Games : 0.14 Casual;Action & Adventure : 0.14 Arcade;Action & Adventure : 0.12 Action;Action & Adventure : 0.1 Educational;Pretend Play : 0.09 Simulation;Action & Adventure : 0.08 Parenting;Education : 0.08 Entertainment;Brain Games : 0.08 Board;Brain Games : 0.08 Parenting;Music & Video : 0.07 Educational;Brain Games : 0.07 Casual;Creativity : 0.07 Art & Design;Creativity : 0.07 Education;Pretend Play : 0.06 Role Playing;Pretend Play : 0.05 Education;Creativity : 0.05 Role Playing;Action & Adventure : 0.03 Puzzle;Action & Adventure : 0.03 Entertainment;Creativity : 0.03 Entertainment;Action & Adventure : 0.03 Educational;Creativity : 0.03 Educational;Action & Adventure : 0.03 Education;Music & Video : 0.03 Education;Brain Games : 0.03 Education;Action & Adventure : 0.03 Adventure;Action & Adventure : 0.03 Video Players & Editors;Music & Video : 0.02 Sports;Action & Adventure : 0.02 Simulation;Pretend Play : 0.02 Puzzle;Creativity : 0.02 Music;Music & Video : 0.02 Entertainment;Pretend Play : 0.02 Casual;Education : 0.02 Board;Action & Adventure : 0.02 Video Players & Editors;Creativity : 0.01 Trivia;Education : 0.01 Travel & Local;Action & Adventure : 0.01 Tools;Education : 0.01 Strategy;Education : 0.01 Strategy;Creativity : 0.01 Strategy;Action & Adventure : 0.01 Simulation;Education : 0.01 Role Playing;Brain Games : 0.01 Racing;Pretend Play : 0.01 Puzzle;Education : 0.01 Parenting;Brain Games : 0.01 Music & Audio;Music & Video : 0.01 Lifestyle;Pretend Play : 0.01 Lifestyle;Education : 0.01 Health & Fitness;Education : 0.01 Health & Fitness;Action & Adventure : 0.01 Entertainment;Education : 0.01 Communication;Creativity : 0.01 Comics;Creativity : 0.01 Casual;Music & Video : 0.01 Card;Action & Adventure : 0.01 Books & Reference;Education : 0.01 Art & Design;Pretend Play : 0.01 Art & Design;Action & Adventure : 0.01 Arcade;Pretend Play : 0.01 Adventure;Education : 0.01
The difference between the Genres
and the Category
columns is not crystal clear, but one thing we can notice is that the Genres
column is much more granular (it has more categories). We're only looking for the bigger picture at the moment, so we'll only work with the Category
column moving forward.
Up to this point, we found that the App Store is dominated by apps designed for fun, while Google Play shows a more balanced landscape of both practical and for-fun apps. Now we'd like to get an idea about the kind of apps that have most users.
One way to find out what genres are the most popular (have the most users) is to calculate the average number of installs for each app genre. For the Google Play data set, we can find this information in the Installs
column, but this information is missing for the App Store data set. As a workaround, we'll take the total number of user ratings as a proxy, which we can find in the rating_count_tot
app.
Below, we calculate the average number of user ratings per app genre on the App Store:
genres_ios = freq_table(ios_final, -5)
avg_genre_ios = []
for genre in genres_ios:
total = 0
len_genre = 0
for app in ios_final:
genre_app = app[-5]
if genre_app == genre:
n_ratings = float(app[5])
total += n_ratings
len_genre += 1
avg_n_ratings = total / len_genre
avg_genre_ios.append((avg_n_ratings, genre))
avg_gen_ios_sorted = sorted(avg_genre_ios, reverse=True)
for ele in avg_gen_ios_sorted:
print(ele[1], ': {:,.2f}'.format(ele[0]))
Navigation : 86,090.33 Reference : 74,942.11 Social Networking : 71,548.35 Music : 57,326.53 Weather : 52,279.89 Book : 39,758.50 Food & Drink : 33,333.92 Finance : 31,467.94 Photo & Video : 28,441.54 Travel : 28,243.80 Shopping : 26,919.69 Health & Fitness : 23,298.02 Sports : 23,008.90 Games : 22,788.67 News : 21,248.02 Productivity : 21,028.41 Utilities : 18,684.46 Lifestyle : 16,485.76 Entertainment : 14,029.83 Business : 7,491.12 Education : 7,003.98 Catalogs : 4,004.00 Medical : 612.00
On average, navigation apps have the highest number of user reviews, but this figure is heavily influenced by Waze and Google Maps, which have close to half a million user reviews together:
for app in ios_final:
if app[-5] == 'Navigation':
reviews = int(app[5])
print(app[1], ': {:,}'.format(reviews))
Waze - GPS Navigation, Maps & Real-time Traffic : 345,046 Google Maps - Navigation & Transit : 154,911 Geocaching® : 12,811 CoPilot GPS – Car Navigation & Offline Maps : 3,582 ImmobilienScout24: Real Estate Search in Germany : 187 Railway Route Search : 5
The same pattern applies to social networking apps, where the average number is heavily influenced by a few giants like Facebook, Pinterest, Skype, etc. Same applies to music apps, where a few big players like Pandora, Spotify, and Shazam heavily influence the average number.
Our aim is to find popular genres, but navigation, social networking or music apps might seem more popular than they really are. The average number of ratings seem to be skewed by very few apps which have hundreds of thousands of user ratings, while the other apps may struggle to get past the 10,000 threshold. We could get a better picture by removing these extremely popular apps for each genre and then rework the averages, but we'll leave this level of detail for later.
Reference apps have 74,942 user ratings on average, but it's actually the Bible and Dictionary.com which skew up the average rating:
for app in ios_final:
if app[-5] == 'Reference':
print(app[1], ': {:,}'.format(int(app[5])))
Bible : 985,920 Dictionary.com Dictionary & Thesaurus : 200,047 Dictionary.com Dictionary & Thesaurus for iPad : 54,175 Google Translate : 26,786 Muslim Pro: Ramadan 2017 Prayer Times, Azan, Quran : 18,418 New Furniture Mods - Pocket Wiki & Game Tools for Minecraft PC Edition : 17,588 Merriam-Webster Dictionary : 16,849 Night Sky : 12,122 City Maps for Minecraft PE - The Best Maps for Minecraft Pocket Edition (MCPE) : 8,535 LUCKY BLOCK MOD ™ for Minecraft PC Edition - The Best Pocket Wiki & Mods Installer Tools : 4,693 GUNS MODS for Minecraft PC Edition - Mods Tools : 1,497 Guides for Pokémon GO - Pokemon GO News and Cheats : 826 WWDC : 762 Horror Maps for Minecraft PE - Download The Scariest Maps for Minecraft Pocket Edition (MCPE) Free : 718 VPN Express : 14 Real Bike Traffic Rider Virtual Reality Glasses : 8 教えて!goo : 0 Jishokun-Japanese English Dictionary & Translator : 0
However, this niche seems to show some potential. One thing we could do is take another popular book and turn it into an app where we could add different features besides the raw version of the book. This might include daily quotes from the book, an audio version of the book, quizzes about the book, etc. On top of that, we could also embed a dictionary within the app, so users don't need to exit our app to look up words in an external app.
This idea seems to fit well with the fact that the App Store is dominated by for-fun apps. This suggests the market might be a bit saturated with for-fun apps, which means a practical app might have more of a chance to stand out among the huge number of apps on the App Store.
Other genres that seem popular include weather, book, food and drink, or finance. The book genre seem to overlap a bit with the app idea we described above, but the other genres don't seem too interesting to us:
Weather apps — people generally don't spend too much time in-app, and the chances of making profit from in-app adds are low. Also, getting reliable live weather data may require us to connect our apps to non-free APIs.
Food and drink — examples here include Starbucks, Dunkin' Donuts, McDonald's, etc. So making a popular food and drink app requires actual cooking and a delivery service, which is outside the scope of our company.
Finance apps — these apps involve banking, paying bills, money transfer, etc. Building a finance app requires domain knowledge, and we don't want to hire a finance expert just to build an app.
Now let's analyze the Google Play market a bit.
For the Google Play market, we actually have data about the number of installs, so we should be able to get a clearer picture about genre popularity. However, the install numbers don't seem precise enough — we can see that most values are open-ended (100+, 1,000+, 5,000+, etc.):
display_table(android_final, 5,
"Frequency table by number of installs - Android")
Frequency table by number of installs - Android ----------------------------------------------- 1,000,000+ : 15.73 100,000+ : 11.55 10,000,000+ : 10.55 10,000+ : 10.2 1,000+ : 8.39 100+ : 6.92 5,000,000+ : 6.83 500,000+ : 5.56 50,000+ : 4.77 5,000+ : 4.51 10+ : 3.54 500+ : 3.25 50,000,000+ : 2.3 100,000,000+ : 2.13 50+ : 1.92 5+ : 0.79 1+ : 0.51 500,000,000+ : 0.27 1,000,000,000+ : 0.23 0+ : 0.05 0 : 0.01
One problem with this data is that is not precise. For instance, we don't know whether an app with 100,000+ installs has 100,000 installs, 200,000, or 350,000. However, we don't need very precise data for our purposes — we only want to get an idea which app genres attract the most users, and we don't need perfect precision with respect to the number of users.
We're going to leave the numbers as they are, which means that we'll consider that an app with 100,000+ installs has 100,000 installs, and an app with 1,000,000+ installs has 1,000,000 installs, and so on.
To perform computations, however, we'll need to convert each install number to float — this means that we need to remove the commas and the plus characters, otherwise the conversion will fail and raise an error. We'll do this directly in the loop below, where we also compute the average number of installs for each genre (category).
categories_android = freq_table(android_final, 1)
categories_installs_android = []
for category in categories_android:
total = 0
len_category = 0
for app in android_final:
category_app = app[1]
if category_app == category:
n_installs = app[5]
n_installs = n_installs.replace('+', '')
n_installs = n_installs.replace(',', '')
total += float(n_installs)
len_category += 1
avg_n_installs = total / len_category
categories_installs_android.append((avg_n_installs, category))
avg_cat_android_sorted = sorted(categories_installs_android, reverse = True)
for ele in avg_cat_android_sorted:
print(ele[1], ': {:,.2f}'.format(ele[0]))
COMMUNICATION : 38,456,119.17 VIDEO_PLAYERS : 24,727,872.45 SOCIAL : 23,253,652.13 PHOTOGRAPHY : 17,840,110.40 PRODUCTIVITY : 16,787,331.34 GAME : 15,588,015.60 TRAVEL_AND_LOCAL : 13,984,077.71 ENTERTAINMENT : 11,640,705.88 TOOLS : 10,801,391.30 NEWS_AND_MAGAZINES : 9,549,178.47 BOOKS_AND_REFERENCE : 8,767,811.89 SHOPPING : 7,036,877.31 PERSONALIZATION : 5,201,482.61 WEATHER : 5,074,486.20 HEALTH_AND_FITNESS : 4,188,821.99 MAPS_AND_NAVIGATION : 4,056,941.77 FAMILY : 3,695,641.82 SPORTS : 3,638,640.14 ART_AND_DESIGN : 1,986,335.09 FOOD_AND_DRINK : 1,924,897.74 EDUCATION : 1,833,495.15 BUSINESS : 1,712,290.15 LIFESTYLE : 1,437,816.27 FINANCE : 1,387,692.48 HOUSE_AND_HOME : 1,331,540.56 DATING : 854,028.83 COMICS : 817,657.27 AUTO_AND_VEHICLES : 647,317.82 LIBRARIES_AND_DEMO : 638,503.73 PARENTING : 542,603.62 BEAUTY : 513,151.89 EVENTS : 253,542.22 MEDICAL : 120,550.62
On average, communication apps have the most installs: 38,456,119. This number is heavily skewed up by a few apps that have over one billion installs (WhatsApp, Facebook Messenger, Skype, Google Chrome, Gmail, and Hangouts), and a few others with over 100 and 500 million installs:
for app in android_final:
if app[1] == 'COMMUNICATION' and (app[5] == '1,000,000,000+'
or app[5] == '500,000,000+'
or app[5] == '100,000,000+'):
print(app[0], ':', app[5])
WhatsApp Messenger : 1,000,000,000+ imo beta free calls and text : 100,000,000+ Android Messages : 100,000,000+ Google Duo - High Quality Video Calls : 500,000,000+ Messenger – Text and Video Chat for Free : 1,000,000,000+ imo free video calls and chat : 500,000,000+ Skype - free IM & video calls : 1,000,000,000+ Who : 100,000,000+ GO SMS Pro - Messenger, Free Themes, Emoji : 100,000,000+ LINE: Free Calls & Messages : 500,000,000+ Google Chrome: Fast & Secure : 1,000,000,000+ Firefox Browser fast & private : 100,000,000+ UC Browser - Fast Download Private & Secure : 500,000,000+ Gmail : 1,000,000,000+ Hangouts : 1,000,000,000+ Messenger Lite: Free Calls & Messages : 100,000,000+ Kik : 100,000,000+ KakaoTalk: Free Calls & Text : 100,000,000+ Opera Mini - fast web browser : 100,000,000+ Opera Browser: Fast and Secure : 100,000,000+ Telegram : 100,000,000+ Truecaller: Caller ID, SMS spam blocking & Dialer : 100,000,000+ UC Browser Mini -Tiny Fast Private & Secure : 100,000,000+ Viber Messenger : 500,000,000+ WeChat : 100,000,000+ Yahoo Mail – Stay Organized : 100,000,000+ BBM - Free Calls & Messages : 100,000,000+
If we removed all the communication apps that have over 100 million installs, the average would be reduced roughly ten times:
under_100_m = []
for app in android_final:
n_installs = app[5]
n_installs = n_installs.replace('+', '')
n_installs = n_installs.replace(',', '')
if (app[1] == 'COMMUNICATION') and (float(n_installs) < 100000000):
under_100_m.append(float(n_installs))
print('{:,.2f}'.format(sum(under_100_m) / len(under_100_m)))
3,603,485.39
We see the same pattern for the video players category, which is the runner-up with 24,727,872 installs. The market is dominated by apps like Youtube, Google Play Movies & TV, or MX Player. The pattern is repeated for social apps (where we have giants like Facebook, Instagram, Google+, etc.), photography apps (Google Photos and other popular photo editors), or productivity apps (Microsoft Word, Dropbox, Google Calendar, Evernote, etc.).
Again, the main concern is that these app genres might seem more popular than they really are. Moreover, these niches seem to be dominated by a few giants who are hard to compete against.
The game genre seems pretty popular, but previously we found out this part of the market seems a bit saturated, so we'd like to come up with a different app recommendation if possible.
The books and reference genre looks fairly popular as well, with an average number of installs of 8,767,811. It's interesting to explore this in more depth, since we found this genre has some potential to work well on the App Store, and our aim is to recommend an app genre that shows potential for being profitable on both the App Store and Google Play.
Let's take a look at some of the apps from this genre and their number of installs:
book_ref_android = []
for app in android_final:
if app[1] == 'BOOKS_AND_REFERENCE':
n_installs = app[5]
n_installs = n_installs.replace('+', '')
n_installs = n_installs.replace(',', '')
book_ref_android.append((app[0], int(n_installs)))
br_android_sorted = sorted(book_ref_android, key=lambda x: (x[1], x[0]), reverse=True)
for app in br_android_sorted:
print(app[0], ': {:,}'.format(app[1]))
Google Play Books : 1,000,000,000 Wattpad 📖 Free Books : 100,000,000 Bible : 100,000,000 Audiobooks from Audible : 100,000,000 Amazon Kindle : 100,000,000 Wikipedia : 10,000,000 Spanish English Translator : 10,000,000 Quran for Android : 10,000,000 Oxford Dictionary of English : Free : 10,000,000 NOOK: Read eBooks & Magazines : 10,000,000 Moon+ Reader : 10,000,000 JW Library : 10,000,000 HTC Help : 10,000,000 FBReader: Favorite Book Reader : 10,000,000 English Hindi Dictionary : 10,000,000 English Dictionary - Offline : 10,000,000 Dictionary.com: Find Definitions for English Words : 10,000,000 Dictionary - Merriam-Webster : 10,000,000 Dictionary : 10,000,000 Cool Reader : 10,000,000 Aldiko Book Reader : 10,000,000 Al-Quran (Free) : 10,000,000 Al'Quran Bahasa Indonesia : 10,000,000 Al Quran Indonesia : 10,000,000 Read books online : 5,000,000 English to Hindi Dictionary : 5,000,000 Ebook Reader : 5,000,000 Dictionary - WordWeb : 5,000,000 Bible KJV : 5,000,000 Ancestry : 5,000,000 AlReader -any text book reader : 5,000,000 Al Quran : EAlim - Translations & MP3 Offline : 5,000,000 50000 Free eBooks & Free AudioBooks : 5,000,000 wikiHow: how to do anything : 1,000,000 eBoox: book reader fb2 epub zip : 1,000,000 Stats Royale for Clash Royale : 1,000,000 Satellite AR : 1,000,000 ReadEra – free ebook reader : 1,000,000 Oxford A-Z of English Usage : 1,000,000 My Little Pony AR Guide : 1,000,000 Koran Read &MP3 30 Juz Offline : 1,000,000 Hafizi Quran 15 lines per page : 1,000,000 Golden Dictionary (EN-AR) : 1,000,000 Free Books - Spirit Fanfiction and Stories : 1,000,000 FamilySearch Tree : 1,000,000 English-Myanmar Dictionary : 1,000,000 EGW Writings : 1,000,000 Cloud of Books : 1,000,000 Brilliant Quotes: Life, Love, Family & Motivation : 1,000,000 Book store : 1,000,000 All Maths Formulas : 1,000,000 All Language Translator Free : 1,000,000 Al Quran Al karim : 1,000,000 Youboox - Livres, BD et magazines : 500,000 SDA Sabbath School Quarterly : 500,000 Recipes of Prophetic Medicine for free : 500,000 Only 30 days in English, the guideline is guaranteed : 500,000 Offline: English to Tagalog Dictionary : 500,000 NOOK Audiobooks : 500,000 NOOK App for NOOK Devices : 500,000 Google I/O 2018 : 500,000 Golden Dictionary (FR-AR) : 500,000 Flybook : 500,000 English to Urdu Dictionary : 500,000 English Persian Dictionary : 500,000 English Grammar Complete Handbook : 500,000 Azpen eReader : 500,000 Al-Quran 30 Juz free copies : 500,000 Al Quran (Tafsir & by Word) : 500,000 cloudLibrary : 100,000 V Made : 100,000 URBANO V 02 instruction manual : 100,000 Surah Al-Waqiah : 100,000 Sabbath School : 100,000 Pdf Book Download - Read Pdf Book : 100,000 Offline English Dictionary : 100,000 Litnet - E-books : 100,000 Hymnes et Louanges : 100,000 How to Write CV : 100,000 Hisnul Al Muslim - Hisn Invocations & Adhkaar : 100,000 Guide (for X-MEN) : 100,000 Free Panda Radio Music : 100,000 Free Book Reader : 100,000 English translation from Bengali : 100,000 EGW Writings 2 : 100,000 Download free book with green book : 100,000 Bible with EGW Comments : 100,000 BakaReader EX : 100,000 Aab e Hayat Full Novel : 100,000 eBoox new: Reader for fb2 epub zip books : 50,000 SH-02J Owner's Manual (Android 8.0) : 50,000 La citadelle du musulman : 50,000 Fertilizer Removal By Crop : 50,000 EZ Quran : 50,000 E-Book Read - Read Book for free : 50,000 DV 2019 - EDV Photo & Form : 50,000 C Programs and Reference : 50,000 C Programs Handbook : 50,000 Bible du Semeur-BDS (French) : 50,000 Al-Muhaffiz : 50,000 TN Patta Citta & EC : 10,000 R Language Reference Guide : 10,000 Kristian Hla Bu : 10,000 Kinot & Eichah for Tisha B'Av : 10,000 Guide for DB Xenoverse 2 : 10,000 Guide for DB Xenoverse : 10,000 English To Shona Dictionary : 10,000 Easy Cv maker 2018 : 10,000 DV 2019 Entry Guide : 10,000 DM Screen : 10,000 Bulgarian French Dictionary Fr : 10,000 Borneo Bible, BM Bible : 10,000 Bootable Methods(USB-CD-DVD) : 10,000 BR Ambedkar Biography & Quotes : 10,000 BD All Sim Offer : 10,000 B&H Kids AR : 10,000 Ay Mohabbat Teri Khatir Novel : 10,000 Ay Hasnain k Nana Milad Naat : 10,000 Anonymous caller detection : 10,000 Ag PhD Field Guide : 10,000 Ag PhD Deficiencies : 10,000 Ae Allah na Dai (Rasa) : 10,000 AP Stamps and Registration : 10,000 Learn R Programming Full : 5,000 Learn CT Scan Of Head : 5,000 Fanfic-FR : 5,000 FA Part 1 & 2 Past Papers Solved Free – Offline : 5,000 EC - AP & Telangana : 5,000 Duaa Ek Ibaadat : 5,000 DC HSEMA : 5,000 CA Laws 2018 (California Laws and Codes) : 5,000 Browsery by Barnes & Noble : 5,000 Bilingual Dictionary Audio App : 5,000 B y H Niños ES : 5,000 AY Sing : 5,000 AW Tozer Devotionals - Daily : 5,000 AC Air condition Troubleshoot,Repair,Maintenance : 5,000 bp e-store : 1,000 Tozer Devotional -Series 1 : 1,000 The SCP Foundation DB fr nn5n : 1,000 The Pursuit of God : 1,000 SA HLA BU : 1,000 R Quick Reference Big Data : 1,000 R Programing Offline Tutorial : 1,000 Painting Lulu DC Super Friends : 1,000 La Fe de Jesus : 1,000 Greek Bible FP (Audio) : 1,000 Florida Statutes (FL Code) : 1,000 Florida - Pocket Brainbook : 1,000 Fix Error Google Playstore : 1,000 EU Data Protection : 1,000 EU Charter : 1,000 EP Research Service : 1,000 EB Annual Meetings : 1,000 Dr. Doug's Tips : 1,000 DV 2018 Winners Guide : 1,000 DC Public Library : 1,000 D. H. Lawrence Poems FREE : 1,000 Chemin (fr) : 1,000 CW Nuclear : 1,000 C Offline Tutorial : 1,000 BM Box : 1,000 BD Fishpedia : 1,000 Arizona Statutes, ARS (AZ Law) : 1,000 Ag PhD Soybean Diseases : 1,000 Ag PhD Planting Population Calculator : 1,000 AE Bulletins : 1,000 SDA Collegiate Quarterly : 500 Modlitební knížka CZ : 500 Learn SAP BW on HANA : 500 Learn SAP BW : 500 Le Fe de Jesus : 500 La Fe de Jesús : 500 Catholic La Bu Zo Kam : 500 MOD Black for BM : 100 EU IP Codes : 100 Cypress College Library : 100 CompactiMa EC pH Calibration : 100 BU Alsace : 100 Anime Mod for BM : 100 GATE 21 years CS Papers(2011-2018 Solved) : 50 A-J Media Vault : 50 Learn R Programming : 10 Khrifa Hla Bu (Solfa) : 10 Guide for IMS DB : 10 CY Spray nozzle : 10 Guide for R Programming : 5 EW PDF : 5 CZ-Help : 5 BibleRead En Cy Zh Yue : 5
The book and reference genre includes a variety of apps: software for processing and reading ebooks, various collections of libraries, dictionaries, tutorials on programming or languages, etc. It seems there's still a small number of extremely popular apps that skew the average:
for br_app in br_android_sorted:
if br_app[1] >= 100000000: # >= 100'000'000
print(br_app[0], ': {:,}'.format(br_app[1]))
Google Play Books : 1,000,000,000 Wattpad 📖 Free Books : 100,000,000 Bible : 100,000,000 Audiobooks from Audible : 100,000,000 Amazon Kindle : 100,000,000
However, it looks like there are only a few very popular apps, so this market still shows potential. Let's try to get some app ideas based on the kind of apps that are somewhere in the middle in terms of popularity (between 1,000,000 and 100,000,000 downloads):
for br_app in br_android_sorted:
if br_app[1] >= 1000000 and br_app[1] < 100000000:
print(br_app[0], ': {:,}'.format(br_app[1]))
Wikipedia : 10,000,000 Spanish English Translator : 10,000,000 Quran for Android : 10,000,000 Oxford Dictionary of English : Free : 10,000,000 NOOK: Read eBooks & Magazines : 10,000,000 Moon+ Reader : 10,000,000 JW Library : 10,000,000 HTC Help : 10,000,000 FBReader: Favorite Book Reader : 10,000,000 English Hindi Dictionary : 10,000,000 English Dictionary - Offline : 10,000,000 Dictionary.com: Find Definitions for English Words : 10,000,000 Dictionary - Merriam-Webster : 10,000,000 Dictionary : 10,000,000 Cool Reader : 10,000,000 Aldiko Book Reader : 10,000,000 Al-Quran (Free) : 10,000,000 Al'Quran Bahasa Indonesia : 10,000,000 Al Quran Indonesia : 10,000,000 Read books online : 5,000,000 English to Hindi Dictionary : 5,000,000 Ebook Reader : 5,000,000 Dictionary - WordWeb : 5,000,000 Bible KJV : 5,000,000 Ancestry : 5,000,000 AlReader -any text book reader : 5,000,000 Al Quran : EAlim - Translations & MP3 Offline : 5,000,000 50000 Free eBooks & Free AudioBooks : 5,000,000 wikiHow: how to do anything : 1,000,000 eBoox: book reader fb2 epub zip : 1,000,000 Stats Royale for Clash Royale : 1,000,000 Satellite AR : 1,000,000 ReadEra – free ebook reader : 1,000,000 Oxford A-Z of English Usage : 1,000,000 My Little Pony AR Guide : 1,000,000 Koran Read &MP3 30 Juz Offline : 1,000,000 Hafizi Quran 15 lines per page : 1,000,000 Golden Dictionary (EN-AR) : 1,000,000 Free Books - Spirit Fanfiction and Stories : 1,000,000 FamilySearch Tree : 1,000,000 English-Myanmar Dictionary : 1,000,000 EGW Writings : 1,000,000 Cloud of Books : 1,000,000 Brilliant Quotes: Life, Love, Family & Motivation : 1,000,000 Book store : 1,000,000 All Maths Formulas : 1,000,000 All Language Translator Free : 1,000,000 Al Quran Al karim : 1,000,000
This niche seems to be dominated by software for processing and reading ebooks, as well as various collections of libraries and dictionaries, so it's probably not a good idea to build similar apps since there'll be some significant competition.
We also notice there are quite a few apps built around the book Quran, which suggests that building an app around a popular book can be profitable. It seems that taking a popular book (perhaps a more recent book) and turning it into an app could be profitable for both the Google Play and the App Store markets.
However, it looks like the market is already full of libraries, so we need to add some special features besides the raw version of the book. This might include daily quotes from the book, an audio version of the book, quizzes on the book, a forum where people can discuss the book, etc.
Now, let's analyze the average Installs
and Rating
by Genre
from the Google Play dataset and see if we can find any useful patterns.
But before we begin, let's check the values in the Rating
column using a frequency table.
display_table(android_final, 2, "Frequency table by rating - Android")
Frequency table by rating - Android ----------------------------------- NaN : 14.64 4.3 : 9.52 4.4 : 9.28 4.5 : 8.81 4.2 : 8.47 4.6 : 6.84 4.1 : 6.68 4.0 : 5.52 4.7 : 4.32 3.9 : 3.87 3.8 : 3.01 5.0 : 2.74 3.7 : 2.4 4.8 : 2.06 3.6 : 1.77 3.5 : 1.65 3.4 : 1.31 3.3 : 1.07 4.9 : 0.89 3.0 : 0.82 3.1 : 0.73 3.2 : 0.69 2.9 : 0.44 2.8 : 0.42 2.6 : 0.25 2.7 : 0.24 2.5 : 0.21 2.3 : 0.2 2.4 : 0.19 2.2 : 0.16 1.0 : 0.16 2.0 : 0.12 1.9 : 0.12 2.1 : 0.09 1.8 : 0.08 1.7 : 0.08 1.6 : 0.05 1.5 : 0.03 1.4 : 0.03 1.2 : 0.01
Next, we calculate the average of Rating
and Installs
by Genres
(we replace the values of 'NaN' with 0 in the Rating
column)
genres_android = freq_table(android_final, -4)
genres_installs_ratings_android = []
for genre in genres_android:
t_installs = 0
t_ratings = 0
len_genre = 0
for app in android_final:
genre_app = app[-4]
if genre_app == genre:
n_ratings = app[2]
if n_ratings == 'NaN':
n_ratings = 0
n_installs = app[5]
n_installs = n_installs.replace('+', '')
n_installs = n_installs.replace(',', '')
t_installs += float(n_installs)
t_ratings += float(n_ratings)
len_genre += 1
avg_n_installs = t_installs / len_genre
avg_n_ratings = t_ratings / len_genre
genres_installs_ratings_android.append((avg_n_installs, avg_n_ratings, genre))
genres_ri_android_sorted = sorted(genres_installs_ratings_android, key=lambda x: (x[0], x[1]), reverse = True)
print("Genres\t:\tInstalls\t:\tRating", "-" * 46, sep='\n')
for genre in genres_ri_android_sorted:
print(genre[2], ': {:,.2f}'.format(genre[0]), ': {:.2f}'.format(genre[1]))
Genres : Installs : Rating ---------------------------------------------- Communication : 38,456,119.17 : 3.36 Adventure;Action & Adventure : 35,333,333.33 : 4.40 Video Players & Editors : 24,947,335.80 : 3.68 Social : 23,253,652.13 : 3.62 Arcade : 22,888,365.49 : 4.01 Casual : 19,569,221.60 : 3.93 Puzzle;Action & Adventure : 18,366,666.67 : 4.30 Photography : 17,840,110.40 : 3.96 Educational;Action & Adventure : 17,016,666.67 : 4.23 Productivity : 16,787,331.34 : 3.42 Racing : 15,910,645.68 : 3.96 Travel & Local : 14,051,476.15 : 3.52 Casual;Action & Adventure : 12,916,666.67 : 4.18 Action : 12,603,588.87 : 4.13 Strategy : 11,199,902.53 : 3.97 Tools : 10,802,461.25 : 3.53 Tools;Education : 10,000,000.00 : 4.50 Card;Action & Adventure : 10,000,000.00 : 4.30 Role Playing;Brain Games : 10,000,000.00 : 4.30 Casual;Music & Video : 10,000,000.00 : 4.10 Adventure;Education : 10,000,000.00 : 4.10 Lifestyle;Pretend Play : 10,000,000.00 : 4.00 News & Magazines : 9,549,178.47 : 3.28 Music : 9,445,583.33 : 3.91 Educational;Pretend Play : 9,375,000.00 : 4.30 Puzzle;Brain Games : 9,280,666.67 : 4.33 Word : 9,094,458.70 : 4.13 Racing;Action & Adventure : 8,816,666.67 : 4.31 Books & Reference : 8,767,811.89 : 3.64 Puzzle : 8,302,861.91 : 3.61 Video Players & Editors;Music & Video : 7,500,000.00 : 4.00 Shopping : 7,036,877.31 : 3.78 Role Playing;Action & Adventure : 7,000,000.00 : 4.33 Casual;Pretend Play : 6,957,142.86 : 4.11 Entertainment;Music & Video : 6,413,333.33 : 4.18 Action;Action & Adventure : 5,888,888.89 : 4.29 Entertainment : 5,602,792.78 : 3.44 Education;Brain Games : 5,333,333.33 : 4.43 Casual;Creativity : 5,333,333.33 : 4.35 Role Playing;Pretend Play : 5,275,000.00 : 4.12 Personalization : 5,201,482.61 : 3.41 Weather : 5,074,486.20 : 3.87 Sports;Action & Adventure : 5,050,000.00 : 4.50 Music;Music & Video : 5,050,000.00 : 4.45 Video Players & Editors;Creativity : 5,000,000.00 : 4.10 Adventure : 4,922,785.33 : 3.99 Simulation;Action & Adventure : 4,857,142.86 : 4.34 Education;Education : 4,759,517.00 : 4.30 Board : 4,759,209.12 : 4.02 Sports : 4,596,842.62 : 3.35 Educational;Brain Games : 4,433,333.33 : 4.22 Health & Fitness : 4,188,821.99 : 3.62 Maps & Navigation : 4,056,941.77 : 3.65 Entertainment;Creativity : 4,000,000.00 : 4.53 Role Playing : 3,965,645.42 : 4.13 Card : 3,815,462.50 : 3.83 Trivia : 3,475,712.70 : 2.93 Simulation : 3,475,484.09 : 4.00 Casino : 3,427,910.53 : 4.05 Entertainment;Brain Games : 3,314,285.71 : 4.30 Arcade;Action & Adventure : 3,190,909.18 : 4.00 Board;Action & Adventure : 3,000,000.00 : 4.05 Entertainment;Pretend Play : 3,000,000.00 : 4.00 Education;Creativity : 2,875,000.00 : 4.38 Educational;Creativity : 2,333,333.33 : 4.20 Entertainment;Action & Adventure : 2,333,333.33 : 4.20 Art & Design : 2,122,850.94 : 4.17 Education;Music & Video : 2,033,333.33 : 4.13 Food & Drink : 1,924,897.74 : 3.49 Education;Pretend Play : 1,800,000.00 : 4.10 Educational;Education : 1,737,143.14 : 3.98 Business : 1,712,290.15 : 2.55 Casual;Brain Games : 1,425,916.67 : 4.47 Lifestyle : 1,412,998.34 : 3.29 Finance : 1,387,692.48 : 3.64 House & Home : 1,331,540.56 : 3.46 Parenting;Music & Video : 1,118,333.33 : 4.33 Strategy;Action & Adventure : 1,000,000.00 : 4.60 Arcade;Pretend Play : 1,000,000.00 : 4.50 Racing;Pretend Play : 1,000,000.00 : 4.50 Entertainment;Education : 1,000,000.00 : 4.40 Strategy;Creativity : 1,000,000.00 : 4.40 Education;Action & Adventure : 1,000,000.00 : 4.27 Casual;Education : 1,000,000.00 : 4.25 Health & Fitness;Action & Adventure : 1,000,000.00 : 3.90 Parenting;Brain Games : 1,000,000.00 : 3.80 Dating : 854,028.83 : 3.16 Comics : 831,873.15 : 4.01 Puzzle;Creativity : 750,000.00 : 4.40 Auto & Vehicles : 647,317.82 : 3.67 Libraries & Demo : 638,503.73 : 3.22 Education : 550,185.44 : 3.70 Simulation;Pretend Play : 550,000.00 : 4.55 Beauty : 513,151.89 : 3.39 Strategy;Education : 500,000.00 : 4.50 Music & Audio;Music & Video : 500,000.00 : 4.30 Communication;Creativity : 500,000.00 : 4.20 Art & Design;Pretend Play : 500,000.00 : 3.90 Parenting : 467,977.50 : 3.79 Parenting;Education : 452,857.14 : 1.66 Educational : 411,184.85 : 3.55 Board;Brain Games : 407,142.86 : 4.23 Art & Design;Creativity : 285,000.00 : 4.35 Events : 253,542.22 : 3.17 Medical : 120,550.62 : 3.02 Health & Fitness;Education : 100,000.00 : 4.70 Puzzle;Education : 100,000.00 : 4.60 Lifestyle;Education : 100,000.00 : 4.30 Travel & Local;Action & Adventure : 100,000.00 : 4.10 Art & Design;Action & Adventure : 100,000.00 : 0.00 Comics;Creativity : 50,000.00 : 4.80 Books & Reference;Education : 1,000.00 : 3.70 Simulation;Education : 500.00 : 4.40 Trivia;Education : 100.00 : 0.00
Let us remember that the genres with the highest average installations and rating (communication, video players, social, video games, etc.) are already dominated by giants such as WhatsApp, Facebook, YouTube, etc. with which it would be very difficult to compete.
If we focus on a genre similar to Books and reference works which registers an average of 8,767,811.89 installations and an average rating of 3.64, we find the genre Comic which has an average of 831,873.15 installations and a average rating of 4.01.
comic_android = []
for app in android_final:
if app[-4] == 'Comics':
rating = app[2]
if rating == 'NaN':
rating = 0
n_installs = app[5]
n_installs = n_installs.replace('+', '')
n_installs = n_installs.replace(',', '')
comic_android.append((app[0], int(n_installs), float(rating)))
comic_android_sorted = sorted(comic_android, key=lambda x: (x[2], x[1]), reverse=True)
print("Comic App\t:\tInstalls\t:\tRating", "-" * 54, sep='\n')
for app in comic_android_sorted:
print(app[0], ': {:,}'.format(app[1]), ':', app[2])
Comic App : Installs : Rating ------------------------------------------------------ Superheroes, Marvel, DC, Comics, TV, Movies News : 5,000 : 5.0 Hojiboy Tojiboyev Life Hacks : 1,000 : 5.0 WebComics : 1,000,000 : 4.8 GANMA! - All original stories free of charge for all original comics : 1,000,000 : 4.7 Röhrich Werner Soundboard : 500,000 : 4.7 Faustop Sounds : 100,000 : 4.7 Dragon Ball Wallpaper - Ringtones : 10,000 : 4.7 Best Wallpapers Backgrounds(100,000+ 4K HD) : 10,000 : 4.7 Manga Master - Best manga & comic reader : 500,000 : 4.6 Children's cartoons (Mithu-Mina-Raju) : 100,000 : 4.6 Laftel - Watching and Announcing Snooping, Streaming : 100,000 : 4.6 Manga - read Thai translation : 10,000 : 4.6 LINE WEBTOON - Free Comics : 10,000,000 : 4.5 Narrator's Voice : 5,000,000 : 4.5 Tapas – Comics, Novels, and Stories : 1,000,000 : 4.5 Buff Thun - Daily Free Webtoon / Comics / Web Fiction / Mini Game : 500,000 : 4.5 Emmanuella Funny Videos 2018 : 100,000 : 4.5 The Vietnam Story - Fun Stories : 10,000 : 4.5 Truyện Vui Tý Quậy : 10,000 : 4.5 Perfect Viewer : 5,000,000 : 4.4 Manga Rock - Best Manga Reader : 1,000,000 : 4.4 pixiv comic - everyone's manga app : 1,000,000 : 4.4 Memes Button : 1,000,000 : 4.4 Q Avatar (Avatar Maker) : 100,000 : 4.4 think Comics : 50,000 : 4.4 Funny Jokes Photos : 10,000 : 4.4 Manga Mania - Best online manga reader : 10,000 : 4.4 CJ - BR MEMES : 10,000 : 4.3 Manga Zero - Japanese cartoon and comic reader : 1,000,000 : 4.2 DC Comics : 1,000,000 : 4.2 Funny Jokes and Stories 2018 : 5,000 : 4.2 Comics : 5,000,000 : 4.1 漫咖 Comics - Manga,Novel and Stories : 1,000,000 : 4.1 Manga Net – Best Online Manga Reader : 50,000 : 4.1 Ba dum tss - Rimshot widget : 50,000 : 4.1 Make your Be Like Bill : 5,000 : 4.0 Comic Es - Shojo manga / love comics free of charge ♪ ♪ : 100,000 : 3.9 Comics Reader : 100,000 : 3.9 MangaToon - Comics updated Daily : 50,000 : 3.9 Manga Books : 500,000 : 3.8 Archie Comics : 100,000 : 3.8 Marvel Unlimited : 1,000,000 : 3.7 2000 AD Comics and Judge Dredd : 50,000 : 3.7 TappyToon Comics & Webtoons : 100,000 : 3.5 - Free Comics - Comic Apps : 10,000 : 3.5 Manga-FR - Anime Vostfr : 10,000 : 3.4 Izneo, Read Manga, Comics & BD : 500,000 : 3.3 Manga AZ - Manga Comic Reader : 5,000 : 3.3 comico Popular Original Cartoon Updated Everyday Comico : 5,000,000 : 3.2 Daily Manga - Comic & Webtoon : 100,000 : 3.2 Lezhin Comics - Daily Releases : 1,000,000 : 3.0 AF Comics Reader - Free : 100 : 2.8 【Ranobbe complete free】 Novelba - Free app that you can read and write novels : 50,000 : 0.0 Pepsi Cards DC : 50 : 0.0
We note that there are some apps that have the highest rating. However, they only fit into a single genre. The interesting thing here is that an app can be included in more than one genre and can even open a new niche that does not yet exist.
This new niche could be the combination of the 'Comic' and 'Books & Reference' genres that would result in a kind of 'Graphic Novel', as there are certain similarities between books and comics.
Similar to a book app, the graphic novel can be turned into an appl; always keeping in mind that special features must be added to the raw version.
Additional features could be implemented that may be available to premium users in the app.
In the case of the App Store, it would fall into the 'Book' category, which registers a frequency of 0.43% (not very competitive)
In this project, we analyze data in the App Store and Google Play mobile apps in order to recommend an app profile that can be profitable for both markets.
We concluded that taking a popular book (maybe a newer book) or popular graphic novel and turning it into an app could be profitable for the Google Play and App Store markets. The markets are already full of libraries, so it is recommended to add some special features in addition to the raw version of the book or graphic novel.
In addition, extra features can be added that may be available to premium users in the application.