This analysis was performed for a company that builds iOS and Android applications. The company outreached us because they wanted to enable their team of developers to make data-driven decisions with respect to the kind of apps they build.
The company builds free to install applications with a built-in add as a principal source of revenue. This means that the revenue generated by an app mostly depends on the number of its users. The goal of this project is to analyze the data related to the AppleStore and GooglePlay markets to help their developers understand what kinds of apps are likely to 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, we decided to see if we can find any relevant existing data at no cost. Luckily, we´ve found these 2 data sets that seem to be suitable for out goals:
Let's start by opening the two data sets and then continue with exploring the data.
from csv import reader
###The GooglePlay data set###
opened_file = open('googleplaystore.csv', encoding="utf8")
read_file = reader(opened_file)
android = list(read_file)
android_header = android[0]
android = android[1:]
###The AppleStore data set###
opened_file = open('AppleStore.csv', encoding="utf8")
read_file = reader(opened_file)
ios = list(read_file)
ios_header = ios[0]
ios = ios[1:]
To make it easier to explore the data sets, first we creat a function named explore_data()
which allows us to print rows in a readable way. Also we add it an optional feature 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]))
print(android_header)
print('\n')
explore_data(android, 0, 5, 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'] ['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'] ['Pixel Draw - Number Art Coloring Book', 'ART_AND_DESIGN', '4.3', '967', '2.8M', '100,000+', 'Free', '0', 'Everyone', 'Art & Design;Creativity', 'June 20, 2018', '1.1', '4.4 and up'] Number of rows: 10841 Number of columns: 13
As we can see, the Google Play data set has 10841 apps and 13 columns. The most interesting columns for us might be: 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, 5, 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'] ['420009108', 'Temple Run', '65921024', 'USD', '0.0', '1724546', '3842', '4.5', '4.0', '1.6.2', '9+', 'Games', '40', '5', '1', '1'] ['284035177', 'Pandora - Music & Radio', '130242560', 'USD', '0.0', '1126879', '3594', '4.0', '4.5', '8.4.1', '12+', 'Music', '37', '4', '1', '1'] Number of rows: 7197 Number of columns: 16
There are 7197 apps in the Apple Store data set, and the columns of interest are: track_name
,currency
, price
, rating_count_tot
, rating_count_ver
and prime_genre
. Not all the columns´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 10472. 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[20])
['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'] ['Logo Maker - Small Business', 'ART_AND_DESIGN', '4.0', '450', '14M', '100,000+', 'Free', '0', 'Everyone', 'Art & Design', 'April 20, 2018', '4.0', '4.1 and up']
The row 10472 corresponds to the app Life Made WI-Fi Touchscreen Photo Frame, and we can see that there´s a column 'Category'
missing for this app and the column 'Genres'
doesn´t have any value. By checking on Google Play we found out that the application belogns to the 'Lifestyle' category. We proceed to correct this entry. After the correction is done, let´s print this row and compare it against the header and another row that is correct to make sure that there´re no more issues left with this row.
corrected_10472 = []
index_count = 0
for index_count in range(12):
#adding category column to the list. The index number of the column should be 1.
if index_count < 1:
corrected_10472.append(android[10472][index_count])
elif index_count == 1:
corrected_10472.append('LIFESTYLE')
else:
corrected_10472.append(android[10472][index_count-1])
#adding the content to the empty 'genre' column
corrected_10472[9] = 'Lifestyle'
#substituting the wrong entry with a correct one
android[10472] = corrected_10472
print(android[10472])
print('\n')
print(android_header)
print('\n')
print(android[20])
['Life Made WI-Fi Touchscreen Photo Frame', 'LIFESTYLE', '1.9', '19', '3.0M', '1,000+', 'Free', '0', 'Everyone', 'Lifestyle', 'February 11, 2018'] ['App', 'Category', 'Rating', 'Reviews', 'Size', 'Installs', 'Type', 'Price', 'Content Rating', 'Genres', 'Last Updated', 'Current Ver', 'Android Ver'] ['Logo Maker - Small Business', 'ART_AND_DESIGN', '4.0', '450', '14M', '100,000+', 'Free', '0', 'Everyone', 'Art & Design', 'April 20, 2018', '4.0', '4.1 and up']
Actually, we see that the last two columns ('Current Ver' and 'Android Ver') are missing as well. But for the purpose of our research these columns are not cruicial, so, we´ll just add two empty values at the end in order to avoid errors in the lenght of the row if compare to the rest of the data set.
for index_count in range(2):
android[10472].append('')
print(android[10472])
print('\n')
print(android_header)
['Life Made WI-Fi Touchscreen Photo Frame', 'LIFESTYLE', '1.9', '19', '3.0M', '1,000+', 'Free', '0', 'Everyone', 'Lifestyle', 'February 11, 2018', '', ''] ['App', 'Category', 'Rating', 'Reviews', 'Size', 'Installs', 'Type', 'Price', 'Content Rating', 'Genres', 'Last Updated', 'Current Ver', 'Android Ver']
Thanks to the discussion section we found one wrong entry. Let´s check all the entries of both of our data sets for the same type of error (a column missing). To do this, we´ll compare the length of each row to the length of the header rows.
android_errorlist = []
for app in android:
if len(app) != len(android_header):
android_errorlist.append(app)
print(android.index(app))
if len(android_errorlist) != 0:
for app in android_errorlist:
print(app)
print('\n')
else:
print('No error found')
No error found
ios_errorlist = []
for app in ios:
if len(app) != len(ios_header):
ios_errorlist.append(app)
print(ios.index(app))
if len(ios_errorlist) != 0:
for app in ios_errorlist:
print(app)
print('\n')
else:
print('No error found')
No error found
for app in android:
name = app[0]
if name =='Tumblr':
print(app)
['Tumblr', 'SOCIAL', '4.4', '2955326', 'Varies with device', '100,000,000+', 'Free', '0', 'Mature 17+', 'Social', 'August 1, 2018', 'Varies with device', 'Varies with device'] ['Tumblr', 'SOCIAL', '4.4', '2955325', 'Varies with device', '100,000,000+', 'Free', '0', 'Mature 17+', 'Social', 'August 1, 2018', 'Varies with device', 'Varies with device'] ['Tumblr', 'SOCIAL', '4.4', '2953886', 'Varies with device', '100,000,000+', 'Free', '0', 'Mature 17+', 'Social', 'August 1, 2018', 'Varies with device', 'Varies with device']
In total, there are 1181 entries for the applications which appear more than once in the data set.
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: ', duplicate_apps[10:20])
Number of duplicate apps: 1181 Examples of duplicate apps: ['FreshBooks Classic', 'Insightly CRM', 'QuickBooks Accounting: Invoicing & Expenses', 'HipChat - Chat Built for Teams', 'Xero Accounting Software', 'MailChimp - Email, Marketing Automation', 'Crew - Free Messaging and Scheduling', 'Asana: organize team projects', 'Google Analytics', 'AdWords Express']
Counting certain apps when analyzing data may lead to the confusing results, that´s why we need to remove the duplicate entries and keep only one entry per app. Before removing the duplicate rows randomly, let´s try to find a better way.
If we re-examine the rows we printed for Tumblr, we´ll see that the main difference is in the fourth position of each row which corresponds to a number of reviews. The different numbers show that the data was collected at different times. It´s a logical conclusion that instead of removing the rows randomly we´d rather keep the rows that have the highest number of reviews because the higher the number of reviews, the more reliable the ratings.
To do that, we´ll:
We 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
if name not in reviews_max:
reviews_max[name] = n_reviews
Previously we found that there´re 1181 cases where an app occurs more than once. So the length of the dictionary of unique apps should be equal to the difference bethween the lengths of the data set and 1181.
print('Expected length: ', len(android) - 1181)
print('Actual length: ', len(reviews_max))
Expected length: 9660 Actual length: 9660
Now we can use the dictionary reviews_max
to remove the dublicates. For the duplicate cases, we´ll only keep the entries with the highest number of reviews. In the code cell below:
android_clean
where we´ll store our new clean data set and the already_added
where we´ll just store the app namesandroid
data set, and for every iteration we:app
in the android_clean
list and the app name
to the already_added
list only if:reviews_max
dictionary; andalready_added
list. We need this condition in order to be sure that we don´t add the duplicate rows with the same number of reviews. For example, some of the duplicate cases have got the same number of reviews and the match with the reviews_max
dictionary is not sufficient condition, because all of them would meet it and would be added to the android_clean
list.android_clean = []
already_added = []
for app in android:
name = app[0]
n_reviews = float(app[3])
if n_reviews == reviews_max[name] 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,660.
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: 9660 Number of columns: 13
We have 9660 rows, just as expected.
If we explore the data long enough, we'll find that both data sets have apps with names that suggest they are not directed toward an English-speaking audience. Below there´re couple examples from both data sets
print(android[3750][0])
print(android[4193][0])
print('\n')
print(ios[2010][1])
print(ios[2049][1])
РИА Новости صور حرف H 央视影音-海量央视内容高清直播 百度视频HD-高清电视剧、电影在线观看神器
As our company develops the applications for the English-speaking users we are not interested in keeping these kind of apps, so we´ll remove them. One way to go about this is to remove each app with a name containing a symbol that is not commonly used in English text. — English text usually includes letters from the English alphabet, numbers composed of digits from 0 to 9, punctuation marks (., !, ?, ;, etc.), and other symbols (+, *, /, etc.).
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 check_for_english(app_name):
for character in app_name:
if ord(character) > 127:
return False
return True
Let´s check if the function works accurately.
print(check_for_english('Instagram'))
print(check_for_english('爱奇艺PPS -《欢乐颂2》电视剧热播'))
print(check_for_english('Docs To Go™ Free Office Suite'))
print(check_for_english('Instachat 😜'))
True False False False
We see that the function returned a correct result for the 'Instagram'
and '爱奇艺PPS -《欢乐颂2》电视剧热播'
, but it didn´t work as expected for the last two apps. It happened because the last two apps have got special symbols (i.e. emojis, em dash, etc.) in its names. These symbols fall outside the ASCII range. If we use the function as it is right now, we´ll remove some usefull apps.
To minimize the impact of data loss, we'll only remove an app if its name has more than three non-ASCII characters:
def check_for_english(app_name):
non_english = 0
for character in app_name:
if ord(character) > 127:
non_english += 1
if non_english > 3:
return False
else:
return True
Let´s check the function after its perfection.
print(check_for_english('爱奇艺PPS -《欢乐颂2》电视剧热播'))
print(check_for_english('Docs To Go™ Free Office Suite'))
print(check_for_english('Instachat 😜'))
False 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 check_for_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 check_for_english(name):
android_english.append(app)
for app in ios:
name = app[1]
if check_for_english(name):
ios_english.append(app)
explore_data(android_english, 100, 105, True)
print('\n')
explore_data(ios_english, 100, 105, True)
['Hairstyles step by step', 'BEAUTY', '4.6', '4369', '14M', '100,000+', 'Free', '0', 'Everyone', 'Beauty', 'July 25, 2018', '1.9', '4.0.3 and up'] ['Filters for Selfie', 'BEAUTY', '4.3', '8572', '25M', '1,000,000+', 'Free', '0', 'Everyone', 'Beauty', 'May 10, 2018', '1.1.0', '4.0 and up'] ['Tie - Always be happy', 'BEAUTY', '4.7', '964', '9.0M', '50,000+', 'Free', '0', 'Everyone', 'Beauty', 'June 21, 2018', '4.0', '4.2 and up'] ['Ulta Beauty', 'BEAUTY', '4.7', '42050', 'Varies with device', '1,000,000+', 'Free', '0', 'Everyone', 'Beauty', 'June 5, 2018', '5.4', '5.0 and up'] ['Prom MakeUp Tutorial', 'BEAUTY', '4.8', '104', '12M', '10,000+', 'Free', '0', 'Everyone', 'Beauty', 'June 26, 2018', '1.3', '4.0.3 and up'] Number of rows: 9615 Number of columns: 13 ['303849934', 'Beer Pong Game', '188956672', 'USD', '0.0', '187315', '9', '2.0', '4.0', '17.05.15', '17+', 'Games', '37', '5', '9', '1'] ['346453382', 'Glow Hockey 2 FREE', '34056767', 'USD', '0.0', '186653', '226', '3.5', '3.5', '2.2.9', '4+', 'Games', '43', '0', '1', '1'] ['600674056', "Pictoword: Fun 2 Pics Guess What's the Word Trivia", '126216192', 'USD', '0.0', '186089', '1010', '5.0', '4.5', '2.4.2', '4+', 'Games', '37', '5', '1', '1'] ['431946152', 'ROBLOX', '115178496', 'USD', '0.0', '183621', '300', '4.5', '4.5', '2.293.126451', '12+', 'Games', '37', '5', '1', '1'] ['342792525', 'IMDb Movies & TV - Trailers and Showtimes', '88702976', 'USD', '0.0', '183425', '4724', '4.5', '5.0', '7.11', '12+', 'Entertainment', '37', '5', '10', '1'] Number of rows: 6183 Number of columns: 16
We can see that we're left with 9615 Android apps and 6183 iOS apps.
As mentioned in the introduction, the Customer company onñy builds free to download and install application, its revenue mainly consists of in-app adds. That´s why for the analysis we need to isolate only the free apps. Below, we isolate the free apps from both data sets, using the values from the 'price'
columns.
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('android_final length: ', len(android_final))
print('ios_final length: ', len(ios_final))
android_final length: 8865 ios_final length: 3222
We're left with 8864 Android apps and 3222 iOS apps, which should be enough for our analysis. But before moving forward, let´s recall that in the discussion section there was a thread mentioning some error in the columns 'price'
and 'type'
in the Google Play data set. The 'type'
column only show if the app is paid or free, so ideally, the result we´ve got analysing the 'price'
column should be the same as for the 'type'
column.
android_final_type_based=[]
for app in android_english:
type = app[6]
if type == 'Free':
android_final_type_based.append(app)
print(len(android_final_type_based))
8864
As we can see, according the 'type'
column there´s one app less. Let´s see why it could happen by analyzing the unique values.
type_dictionary = {}
for app in android_english:
type = app[6]
if type in type_dictionary:
type_dictionary[type] += 1
else:
type_dictionary[type] = 1
print(type_dictionary)
{'Free': 8864, 'Paid': 750, 'NaN': 1}
There´s 1 application which has got the 'NaN' value instead of 'Free' or 'Paid'. Let´s see what application it is and what price it has got.
for app in android_english:
type = app[6]
if type == 'NaN':
index_typeNaN = android_english.index(app)
print(index_typeNaN)
print(android_english[index_typeNaN])
7939 ['Command & Conquer: Rivals', 'FAMILY', 'NaN', '0', 'Varies with device', '0', 'NaN', '0', 'Everyone 10+', 'Strategy', 'June 28, 2018', 'Varies with device', 'Varies with device']
The application above besides the non-available type has got the rating information non-available as well. If the error in the 'type'
column could be considered as a minor error, its value for the 'rating'
column could cause some errors in the future analysis of the rating information. But we can easily correct these errors and after doing it we´ll start with the analysis.
android_english[7939][2] = '0' #rating
android_english[7939][6] = 'Free' #type
print(android_english[7939])
['Command & Conquer: Rivals', 'FAMILY', '0', '0', 'Varies with device', '0', 'Free', '0', 'Everyone 10+', 'Strategy', 'June 28, 2018', 'Varies with device', 'Varies with device']
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 is comprised of three steps:
Because our end goal is to add the app on both the App Store and Google Play, we need to find app profiles that are successful on both markets. For instance, a profile that might work well for both markets might be a productivity app that makes use of gamification.
Let's begin the analysis by getting a sense of the most common genres for each market. For this, we'll build a frequency table for the prime_genre
column of the App Store data set, and the Genres
and Category
columns of the Google Play data set.
We'll build two functions we can use to analyze the frequency tables:
def freq_table(dataset, index):
table = {}
for app in dataset:
value = app[index]
if value in table:
table[value] += 1
else:
table[value] = 1
table_percentages = {}
total = len(dataset)
for key in table:
percentage = (table[key] / total) * 100
table_percentages[key] = percentage
return table_percentages
def display_table(dataset, index):
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)
for entry in table_sorted:
print(entry[1], ':', entry[0])
Let´s start by examining the column 'prime_genre'
in Apple Store data set.
display_table(ios_final, -5)
Games : 58.16263190564867 Entertainment : 7.883302296710118 Photo & Video : 4.9658597144630665 Education : 3.662321539416512 Social Networking : 3.2898820608317814 Shopping : 2.60707635009311 Utilities : 2.5139664804469275 Sports : 2.1415270018621975 Music : 2.0484171322160147 Health & Fitness : 2.0173805090006205 Productivity : 1.7380509000620732 Lifestyle : 1.5828677839851024 News : 1.3345747982619491 Travel : 1.2414649286157666 Finance : 1.1173184357541899 Weather : 0.8690254500310366 Food & Drink : 0.8069522036002483 Reference : 0.5586592178770949 Business : 0.5276225946617008 Book : 0.4345127250155183 Navigation : 0.186219739292365 Medical : 0.186219739292365 Catalogs : 0.12414649286157665
As we can see more than half of the apps, 58%, in our data set belong to the 'Games' genre followed by 7.8% of the apps from the 'Entertainment' genre. In general, if we count all the fun-aimed applications (such as games, entertainment, social networking, sports, music, photo and video), they would build almost up to 80% of all the free English apps. The apps dedicated to the education, productivity, useful tools are less common, none of them account for more than 4%, the most numerous would be the educational apps which ammount for 3.66% of applications in the data set.
In further steps we should investigate if the fun-aimed application besides being widely-presented on the free market are the most popular among iOS-device users as well.
To continue, we examine the Google Play data set. First, let´s check the 'Category'
column.
display_table(android_final, 1) # Category
FAMILY : 18.905809362662154 GAME : 9.723632261703328 TOOLS : 8.460236886632826 BUSINESS : 4.591088550479413 LIFESTYLE : 3.914269599548787 PRODUCTIVITY : 3.8917089678511 FINANCE : 3.699943598420756 MEDICAL : 3.5307388606880994 SPORTS : 3.395375070501974 PERSONALIZATION : 3.3164128595600673 COMMUNICATION : 3.2374506486181613 HEALTH_AND_FITNESS : 3.0795262267343486 PHOTOGRAPHY : 2.9441624365482233 NEWS_AND_MAGAZINES : 2.7975183305132543 SOCIAL : 2.662154540327129 TRAVEL_AND_LOCAL : 2.33502538071066 SHOPPING : 2.2447828539199097 BOOKS_AND_REFERENCE : 2.143260011280316 DATING : 1.8612521150592216 VIDEO_PLAYERS : 1.793570219966159 MAPS_AND_NAVIGATION : 1.3987591652566271 FOOD_AND_DRINK : 1.2408347433728144 EDUCATION : 1.161872532430908 ENTERTAINMENT : 0.9588268471517203 LIBRARIES_AND_DEMO : 0.9362662154540328 AUTO_AND_VEHICLES : 0.924985899605189 HOUSE_AND_HOME : 0.8234630569655951 WEATHER : 0.8009024252679076 EVENTS : 0.7106598984771574 PARENTING : 0.6542583192329385 ART_AND_DESIGN : 0.6429780033840948 COMICS : 0.6204173716864072 BEAUTY : 0.5978567399887197
For Google Play apps the overall picture seems to be a litle bit different. Almost a fifth part of the free English applications is the Family applications (18,9 %) followed by only 9,7% of the Game apps. But if we check the Google Play Market, we´ll see that most of the Family apps are the children educational games as well. So we can confirm that although the fun applications are widely represented on the free English Google Play niche, they´ve got a smaller part if to compare with the Apple Store. 7 out of 10 first groups of applications are designed for practical purposes (tools, business, lifestyle, productivity, etc.) and account for more than 30% of total number of analysed apps.
Let´s analyze now the 'genre'
column of the Google Play data set.
display_table(android_final, -4)
Tools : 8.44895657078398 Entertainment : 6.068809926677947 Education : 5.346869712351946 Business : 4.591088550479413 Lifestyle : 3.902989283699944 Productivity : 3.8917089678511 Finance : 3.699943598420756 Medical : 3.5307388606880994 Sports : 3.4630569655950363 Personalization : 3.3164128595600673 Communication : 3.2374506486181613 Action : 3.102086858432036 Health & Fitness : 3.0795262267343486 Photography : 2.9441624365482233 News & Magazines : 2.7975183305132543 Social : 2.662154540327129 Travel & Local : 2.323745064861816 Shopping : 2.2447828539199097 Books & Reference : 2.143260011280316 Simulation : 2.0417371686407217 Dating : 1.8612521150592216 Arcade : 1.849971799210378 Video Players & Editors : 1.7710095882684715 Casual : 1.7597292724196276 Maps & Navigation : 1.3987591652566271 Food & Drink : 1.2408347433728144 Puzzle : 1.1280315848843767 Racing : 0.9926677946982515 Role Playing : 0.9362662154540328 Libraries & Demo : 0.9362662154540328 Auto & Vehicles : 0.924985899605189 Strategy : 0.9137055837563453 House & Home : 0.8234630569655951 Weather : 0.8009024252679076 Events : 0.7106598984771574 Adventure : 0.676818950930626 Comics : 0.6091370558375634 Beauty : 0.5978567399887197 Art & Design : 0.5978567399887197 Parenting : 0.49633389734912575 Card : 0.4512126339537508 Casino : 0.42865200225606315 Trivia : 0.4173716864072194 Educational;Education : 0.39481105470953193 Board : 0.3835307388606881 Educational : 0.3722504230118443 Education;Education : 0.338409475465313 Word : 0.25944726452340666 Casual;Pretend Play : 0.23688663282571912 Music : 0.20304568527918782 Racing;Action & Adventure : 0.1692047377326565 Puzzle;Brain Games : 0.1692047377326565 Entertainment;Music & Video : 0.1692047377326565 Casual;Brain Games : 0.1353637901861252 Casual;Action & Adventure : 0.1353637901861252 Arcade;Action & Adventure : 0.12408347433728144 Action;Action & Adventure : 0.10152284263959391 Educational;Pretend Play : 0.09024252679075014 Simulation;Action & Adventure : 0.07896221094190638 Parenting;Education : 0.07896221094190638 Entertainment;Brain Games : 0.07896221094190638 Board;Brain Games : 0.07896221094190638 Parenting;Music & Video : 0.0676818950930626 Educational;Brain Games : 0.0676818950930626 Casual;Creativity : 0.0676818950930626 Art & Design;Creativity : 0.0676818950930626 Education;Pretend Play : 0.05640157924421885 Role Playing;Pretend Play : 0.04512126339537507 Education;Creativity : 0.04512126339537507 Role Playing;Action & Adventure : 0.0338409475465313 Puzzle;Action & Adventure : 0.0338409475465313 Entertainment;Creativity : 0.0338409475465313 Entertainment;Action & Adventure : 0.0338409475465313 Educational;Creativity : 0.0338409475465313 Educational;Action & Adventure : 0.0338409475465313 Education;Music & Video : 0.0338409475465313 Education;Brain Games : 0.0338409475465313 Education;Action & Adventure : 0.0338409475465313 Adventure;Action & Adventure : 0.0338409475465313 Video Players & Editors;Music & Video : 0.022560631697687534 Sports;Action & Adventure : 0.022560631697687534 Simulation;Pretend Play : 0.022560631697687534 Puzzle;Creativity : 0.022560631697687534 Music;Music & Video : 0.022560631697687534 Entertainment;Pretend Play : 0.022560631697687534 Casual;Education : 0.022560631697687534 Board;Action & Adventure : 0.022560631697687534 Video Players & Editors;Creativity : 0.011280315848843767 Trivia;Education : 0.011280315848843767 Travel & Local;Action & Adventure : 0.011280315848843767 Tools;Education : 0.011280315848843767 Strategy;Education : 0.011280315848843767 Strategy;Creativity : 0.011280315848843767 Strategy;Action & Adventure : 0.011280315848843767 Simulation;Education : 0.011280315848843767 Role Playing;Brain Games : 0.011280315848843767 Racing;Pretend Play : 0.011280315848843767 Puzzle;Education : 0.011280315848843767 Parenting;Brain Games : 0.011280315848843767 Music & Audio;Music & Video : 0.011280315848843767 Lifestyle;Pretend Play : 0.011280315848843767 Lifestyle;Education : 0.011280315848843767 Health & Fitness;Education : 0.011280315848843767 Health & Fitness;Action & Adventure : 0.011280315848843767 Entertainment;Education : 0.011280315848843767 Communication;Creativity : 0.011280315848843767 Comics;Creativity : 0.011280315848843767 Casual;Music & Video : 0.011280315848843767 Card;Action & Adventure : 0.011280315848843767 Books & Reference;Education : 0.011280315848843767 Art & Design;Pretend Play : 0.011280315848843767 Art & Design;Action & Adventure : 0.011280315848843767 Arcade;Pretend Play : 0.011280315848843767 Adventure;Education : 0.011280315848843767
The analysis of this column gives us somewhat different results. The first place with 8,4% belogns to the Tools applications followed by only 6% of the Entertainment apps. But there´s nothing to be surprised about. If we take a more carefull look of the genres presented we´ll see that there´re no such genres as Games and Family. The applications wiche belogn to these categories in the 'genre'
column are granted the more specific genres, i.e. racing, arcade instead of more generic 'Games' and pretend play, brain game instead of 'Family'. We are not going to deep into the more details right now, but we always can come back to it later, if it´s crucial for our further analysis.
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 for the App Store data set this information is missing. As a workaround, we'll take the total number of user ratings as a proxy, which we can find in the rating_count_tot
column.
Below, we calculate the average number of user ratings per app genre on the App Store and print the genres in a descending order of their average number of user ratings.
genres_ios = freq_table(ios_final,-5)
genre_n_rating_table = []
for genre in genres_ios:
total = 0
len_genre = 0
for app in ios_final:
genre_app = app[-5]
if genre_app == genre:
rating_count_tot = float(app[5])
total += rating_count_tot
len_genre += 1
avg_rating_count = total / len_genre
#Sorting and printing in a descending order
genre_n_rating_tuple = (avg_rating_count, genre)
genre_n_rating_table.append(genre_n_rating_tuple)
genre_n_rating_table_sorted = sorted(genre_n_rating_table, reverse = True)
for entry in genre_n_rating_table_sorted:
print(entry[1], ':', entry[0])
Navigation : 86090.33333333333 Reference : 74942.11111111111 Social Networking : 71548.34905660378 Music : 57326.530303030304 Weather : 52279.892857142855 Book : 39758.5 Food & Drink : 33333.92307692308 Finance : 31467.944444444445 Photo & Video : 28441.54375 Travel : 28243.8 Shopping : 26919.690476190477 Health & Fitness : 23298.015384615384 Sports : 23008.898550724636 Games : 22788.6696905016 News : 21248.023255813954 Productivity : 21028.410714285714 Utilities : 18684.456790123455 Lifestyle : 16485.764705882353 Entertainment : 14029.830708661417 Business : 7491.117647058823 Education : 7003.983050847458 Catalogs : 4004.0 Medical : 612.0
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':
print(app[1], ':', app[5]) # print name and number of ratings
Waze - GPS Navigation, Maps & Real-time Traffic : 345046 Google Maps - Navigation & Transit : 154911 Geocaching® : 12811 CoPilot GPS – Car Navigation & Offline Maps : 3582 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´ve decided to try to get a better picture by removing these extremely popular apps for each genre and then rework the averages.
In order to recalulate the averages without 'big fishes' like Facebook, Pandora, Google Maps, etc., we are going to take into the calculations only those apps which account for less 25% of total number of reviews in a genre.
genres_ios = freq_table(ios_final,-5)
genre_n_rating_table_new = []
for genre in genres_ios:
apps_per_genre = {} #this dictionary will keep temporaly the names of all the apps of the same genre ->
#->with the corresponding number of user reviews
total = 0
for app in ios_final:
genre_app = app[-5]
if genre_app == genre:
rating_count_tot = float(app[5])
total += rating_count_tot
app_name = app[1]
apps_per_genre[app_name] = rating_count_tot
#leaving out the apps with more than 25% of total number of user reviews
total_new = 0
len_genre_new = 0
for app in apps_per_genre:
app_rate = apps_per_genre[app] / total
if app_rate < 0.25:
total_new += apps_per_genre[app]
len_genre_new += 1
avg_rating_count_new = total_new / len_genre_new
#Sorting and printing in a descending order
genre_n_rating_tuple_new = (avg_rating_count_new, genre)
genre_n_rating_table_new.append(genre_n_rating_tuple_new)
genre_n_rating_table_sorted_new = sorted(genre_n_rating_table_new, reverse = True)
for entry in genre_n_rating_table_sorted_new:
print(entry[1], ':', entry[0])
Social Networking : 43899.514285714286 Music : 40871.876923076925 Weather : 35859.666666666664 Finance : 31467.944444444445 Shopping : 26919.690476190477 Book : 23426.384615384617 Sports : 23008.898550724636 Games : 22812.602564102563 Reference : 21355.176470588234 Productivity : 21028.410714285714 Travel : 17527.358974358973 Health & Fitness : 15729.140625 Photo & Video : 15025.716981132075 Entertainment : 14029.830708661417 News : 13323.97619047619 Utilities : 12925.0125 Food & Drink : 12675.083333333334 Lifestyle : 9956.1 Education : 7003.983050847458 Business : 5541.75 Navigation : 4146.25 Catalogs : 890.3333333333334 Medical : 9.666666666666666
As we expected the picture has changed. After leaving out the giant apps navigation, reference, food&drink don´t seem that popular now. But social networking keep been one of the most popular genres. Social networking together with suche genres as misuc, weather, finance, shopping, book kept their position in the first 10 of our table. Below we are going to print out up to 20 apps representing each genre just to get an idea what kind of apps they are. In the original AppleStore data sets the apps are located in a descending orden by total number of user reviews. The apps that we are going to see will be the most popular in their genre.
limit_20 = 0
for app in ios_final:
if app[-5] == 'Social Networking' and limit_20 <= 20:
limit_20 += 1
print(app[1], ':', app[5]) # print name and number of ratings
Facebook : 2974676 Pinterest : 1061624 Skype for iPhone : 373519 Messenger : 351466 Tumblr : 334293 WhatsApp Messenger : 287589 Kik : 260965 ooVoo – Free Video Call, Text and Voice : 177501 TextNow - Unlimited Text + Calls : 164963 Viber Messenger – Text & Call : 164249 Followers - Social Analytics For Instagram : 112778 MeetMe - Chat and Meet New People : 97072 We Heart It - Fashion, wallpapers, quotes, tattoos : 90414 InsTrack for Instagram - Analytics Plus More : 85535 Tango - Free Video Call, Voice and Chat : 75412 LinkedIn : 71856 Match™ - #1 Dating App. : 60659 Skype for iPad : 60163 POF - Best Dating App for Conversations : 52642 Timehop : 49510 Find My Family, Friends & iPhone - Life360 Locator : 43877
Social Networking has got its leaders which are almost imposible to compete with. Moreover to create a new social network is an extremely ambitious challenge. But we should keep in mind that people like social networking, most of us has got accounts in 5 to 10 social networks at a time. That´s why introducing some elements of social networking in our app might be an interesting idea.
limit_20 = 0
for app in ios_final:
if app[-5] == 'Music' and limit_20 <= 20:
limit_20 += 1
print(app[1], ':', app[5]) # print name and number of ratings
Pandora - Music & Radio : 1126879 Spotify Music : 878563 Shazam - Discover music, artists, videos & lyrics : 402925 iHeartRadio – Free Music & Radio Stations : 293228 SoundCloud - Music & Audio : 135744 Magic Piano by Smule : 131695 Smule Sing! : 119316 TuneIn Radio - MLB NBA Audiobooks Podcasts Music : 110420 Amazon Music : 106235 SoundHound Song Search & Music Player : 82602 Sonos Controller : 48905 Bandsintown Concerts : 30845 Karaoke - Sing Karaoke, Unlimited Songs! : 28606 My Mixtapez Music : 26286 Sing Karaoke Songs Unlimited with StarMaker : 26227 Ringtones for iPhone & Ringtone Maker : 25403 Musi - Unlimited Music For YouTube : 25193 AutoRap by Smule : 18202 Spinrilla - Mixtapes For Free : 15053 Napster - Top Music & Radio : 14268 edjing Mix:DJ turntable to remix and scratch music : 13580
Music genre hos got its leaders as well and the last apps of the top 20 don´t have that much reviews, barely over 10000. So, it doesn´t seem like a genre with lots of persepctive. We could tell the same about the Finance free apps.
limit_20 = 0
for app in ios_final:
if app[-5] == 'Finance' and limit_20 <= 20:
limit_20 += 1
print(app[1], ':', app[5]) # print name and number of ratings
Chase Mobile℠ : 233270 Mint: Personal Finance, Budget, Bills & Money : 232940 Bank of America - Mobile Banking : 119773 PayPal - Send and request money safely : 119487 Credit Karma: Free Credit Scores, Reports & Alerts : 101679 Capital One Mobile : 56110 Citi Mobile® : 48822 Wells Fargo Mobile : 43064 Chase Mobile : 34322 Square Cash - Send Money for Free : 23775 Capital One for iPad : 21858 Venmo : 21090 USAA Mobile : 19946 TaxCaster – Free tax refund calculator : 17516 Amex Mobile : 11421 TurboTax Tax Return App - File 2016 income taxes : 9635 Bank of America - Mobile Banking for iPad : 7569 Wells Fargo for iPad : 2207 Stash Invest: Investing & Financial Education : 1655 Digit: Save Money Without Thinking About It : 1506 IRS2Go : 1329
The position of Shopping apps has gone up 6 points. We can see that the popularity of the shopping apps is more evenly distributed.
limit_20 = 0
for app in ios_final:
if app[-5] == 'Shopping' and limit_20 <= 20:
limit_20 += 1
print(app[1], ':', app[5]) # print name and number of ratings
Groupon - Deals, Coupons & Discount Shopping App : 417779 eBay: Best App to Buy, Sell, Save! Online Shopping : 262241 Wish - Shopping Made Fun : 141960 shopkick - Shopping Rewards & Discounts : 130823 Amazon App: shop, scan, compare, and read reviews : 126312 Target : 108131 Zappos: shop shoes & clothes, fast free shipping : 103655 Walgreens – Pharmacy, Photo, Coupons and Shopping : 88885 Best Buy : 80424 Walmart: Free 2-Day Shipping,* Easy Store Shopping : 70286 OfferUp - Buy. Sell. Simple. : 57348 Apple Store : 55171 Shop Savvy Barcode Scanner - Price Compare & Deals : 54630 Ibotta: Cash Back App, Grocery Coupons & Shopping : 44313 letgo: Buy & Sell Second Hand Stuff : 38424 CVS Pharmacy : 35981 Victoria’s Secret – The Sexiest Bras & Lingerie : 34507 Etsy: Shop Handmade, Vintage & Creative Goods : 30434 Gilt : 26353 Mercari: Shopping Marketplace to Buy & Sell Stuff : 24244 Shopular Coupons, Weekly Deals for Target, Walmart : 22729
This niche seems to show some potential. One thing we could offer is to create a crowd-powered app where everyone could public, consult and validate discounts or special offers available in the shops of their area. This kind of app will have a social networking element, belogn to a popular niche offers a lot of possibility of built-in addvertisments to generate a revenue for its developers.
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.
limit_20 = 0
for app in ios_final:
if app[-5] == 'Book' and limit_20 <= 20:
limit_20 += 1
print(app[1], ':', app[5]) # print name and number of ratings
Kindle – Read eBooks, Magazines & Textbooks : 252076 Audible – audio books, original series & podcasts : 105274 Color Therapy Adult Coloring Book for Adults : 84062 OverDrive – Library eBooks and Audiobooks : 65450 HOOKED - Chat Stories : 47829 BookShout: Read eBooks & Track Your Reading Goals : 879 Dr. Seuss Treasury — 50 best kids books : 451 Green Riding Hood : 392 Weirdwood Manor : 197 MangaZERO - comic reader : 9 ikouhoushi : 0 MangaTiara - love comic reader : 0 謎解き : 0 謎解き2016 : 0
At a first sight it seems that the Book genre is only heavily influenced by big players like Kindle and Audible. But also it´s true to say that there are very few applications on the market of free book English applications. And if we come up with some free book application, it will be easier to stand out. Creating some kind of library means a lot of expenses related with copyrights. There're only 4 reader application, 2 of them is for reading manga. This niche is not saturated. Keeping in mind a social networking element, we could offer to develop a reader application with an integrated readers club inside the application where every month there'll be offered some books to read (it could be a built-in sale as an additional source of revenue) and to discuss afterwards.
limit_20 = 0
for app in ios_final:
if app[-5] == 'Sports' and limit_20 <= 20:
limit_20 += 1
print(app[1], ':', app[5]) # print name and number of ratings
ESPN: Get scores, news, alerts & watch live sports : 290996 Yahoo Fantasy Sports : 190670 WatchESPN : 159735 The Masters Tournament : 148160 Yahoo Sports - Teams, Scores, News & Highlights : 137951 ESPN Fantasy Football Baseball Basketball Hockey : 64925 CBS Sports App - Sports Scores, News, Stats, Watch : 59639 FOX Sports Mobile : 57500 2016 U.S. Open Golf Championship : 54192 NBC Sports : 47172 NBA : 43682 ESPN Tournament Challenge : 39642 2016 US Open Tennis Championships : 37522 NFL : 27317 MLB.com At Bat : 21830 The Championships, Wimbledon 2016 - Tennis Grand Slam : 20953 DraftKings - Daily Fantasy Golf, Baseball, & More : 20251 Bleacher Report: Sports news, scores, & highlights : 16979 Univision Deportes: Liga MX, MLS, Fútbol En Vivo : 16683 NASCAR MOBILE : 16385 NHL : 15554
Sports niche is too specific, the apps here are either made by professinal sport federations, championships, etc. or bets and news. Betting requires special licenses and news apps require keeping a good up-to-date content which means many people working at the backend, which is not our idea.
limit_20 = 0
for app in ios_final:
if app[-5] == 'Games' and limit_20 <= 20:
limit_20 += 1
print(app[1], ':', app[5]) # print name and number of ratings
Clash of Clans : 2130805 Temple Run : 1724546 Candy Crush Saga : 961794 Angry Birds : 824451 Subway Surfers : 706110 Solitaire : 679055 CSR Racing : 677247 Crossy Road - Endless Arcade Hopper : 669079 Injustice: Gods Among Us : 612532 Hay Day : 567344 PAC-MAN : 508808 DragonVale : 503230 Head Soccer : 481564 Despicable Me: Minion Rush : 464312 The Sims™ FreePlay : 446880 Sonic Dash : 418033 8 Ball Pool™ : 416736 Tiny Tower - Free City Building : 414803 Jetpack Joyride : 405647 Bike Race - Top Motorcycle Racing Games : 405007 Kim Kardashian: Hollywood : 397730
We already demonstrated that the Games niche is very saturated, so it´s going to be extremely difficult to outstand in this area.
limit_20 = 0
for app in ios_final:
if app[-5] == 'Reference' and limit_20 <= 20:
limit_20 += 1
print(app[1], ':', app[5]) # print name and number of ratings
Bible : 985920 Dictionary.com Dictionary & Thesaurus : 200047 Dictionary.com Dictionary & Thesaurus for iPad : 54175 Google Translate : 26786 Muslim Pro: Ramadan 2017 Prayer Times, Azan, Quran : 18418 New Furniture Mods - Pocket Wiki & Game Tools for Minecraft PC Edition : 17588 Merriam-Webster Dictionary : 16849 Night Sky : 12122 City Maps for Minecraft PE - The Best Maps for Minecraft Pocket Edition (MCPE) : 8535 LUCKY BLOCK MOD ™ for Minecraft PC Edition - The Best Pocket Wiki & Mods Installer Tools : 4693 GUNS MODS for Minecraft PC Edition - Mods Tools : 1497 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
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. It´s also seems to fit well with the idea to outstand from the numerous for-fun apps.
limit_20 = 0
for app in ios_final:
if app[-5] == 'Productivity' and limit_20 <= 20:
limit_20 += 1
print(app[1], ':', app[5]) # print name and number of ratings
Evernote - stay organized : 161065 Gmail - email by Google: secure, fast & organized : 135962 iTranslate - Language Translator & Dictionary : 123215 Yahoo Mail - Keeps You Organized! : 113709 Google Docs : 64259 Google Drive - free online storage : 59255 Dropbox : 49578 Microsoft Word : 47999 Microsoft OneNote : 39638 Microsoft Outlook - email and calendar : 32807 Hotspot Shield Free VPN Proxy & Wi-Fi Privacy : 32499 Documents 6 - File manager, PDF reader and browser : 29110 Google Sheets : 24602 Microsoft Excel : 24430 Inbox by Gmail : 21561 T-Mobile : 19977 Paper by FiftyThree - Sketch, Diagram, Take Notes : 18219 MyScript Calculator - Handwriting calculator : 16555 VPN Proxy Master - Unlimited WiFi security VPN : 13674 Microsoft OneDrive – File & photo cloud storage : 12797 Ever - Capture Your Memories : 12755
The productivity applications in our final dataset are represented by such a giant and well-known companies like Google, Microsoft, etc. and it´s doubtful that users would rather use some tool app from a company which is an amature in the field than a tool app from well-known brand.
To sum up shrotly, after analyzing the popularity of the apps of different genres on Apple Store, we came up with possible 3 profiles for a new app: a crowd-powered app where everyone could public, consult and validate discounts or special offers available in the shops of their area, a reader of ebooks with an option to participate in a readers club and to transform a popular book into an app with an audible version, daily quotes, quizzes on the book and a forum. 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)
1,000,000+ : 15.724760293288211 100,000+ : 11.551043429216017 10,000,000+ : 10.547095318668923 10,000+ : 10.197405527354766 1,000+ : 8.403835307388608 100+ : 6.91483361534123 5,000,000+ : 6.824591088550479 500,000+ : 5.561195713479977 50,000+ : 4.771573604060913 5,000+ : 4.512126339537507 10+ : 3.542019176536943 500+ : 3.248730964467005 50,000,000+ : 2.3011844331641287 100,000,000+ : 2.131979695431472 50+ : 1.9176536943034406 5+ : 0.7896221094190639 1+ : 0.5076142131979695 500,000,000+ : 0.2707275803722504 1,000,000,000+ : 0.2256063169768754 0+ : 0.04512126339537507 0 : 0.011280315848843767
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)
category_n_installs_table = []
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(',', '')
n_installs = float(n_installs)
total += n_installs
len_category += 1
avg_category = total / len_category
#Sorting and printing in a descending order
category_n_installs_tuple = (avg_category, category)
category_n_installs_table.append(category_n_installs_tuple)
category_n_installs_table_sorted = sorted(category_n_installs_table, reverse = True)
for entry in category_n_installs_table_sorted:
print(entry[1], ':', entry[0])
COMMUNICATION : 38456119.167247385 VIDEO_PLAYERS : 24727872.452830188 SOCIAL : 23253652.127118643 PHOTOGRAPHY : 17840110.40229885 PRODUCTIVITY : 16787331.344927534 GAME : 15588015.603248259 TRAVEL_AND_LOCAL : 13984077.710144928 ENTERTAINMENT : 11640705.88235294 TOOLS : 10801391.298666667 NEWS_AND_MAGAZINES : 9549178.467741935 BOOKS_AND_REFERENCE : 8767811.894736841 SHOPPING : 7036877.311557789 PERSONALIZATION : 5201482.6122448975 WEATHER : 5074486.197183099 HEALTH_AND_FITNESS : 4188821.9853479853 MAPS_AND_NAVIGATION : 4056941.7741935486 FAMILY : 3695641.8198090694 SPORTS : 3638640.1428571427 ART_AND_DESIGN : 1986335.0877192982 FOOD_AND_DRINK : 1924897.7363636363 EDUCATION : 1833495.145631068 BUSINESS : 1712290.1474201474 LIFESTYLE : 1433675.5878962537 FINANCE : 1387692.475609756 HOUSE_AND_HOME : 1331540.5616438356 DATING : 854028.8303030303 COMICS : 817657.2727272727 AUTO_AND_VEHICLES : 647317.8170731707 LIBRARIES_AND_DEMO : 638503.734939759 PARENTING : 542603.6206896552 BEAUTY : 513151.88679245283 EVENTS : 253542.22222222222 MEDICAL : 120550.61980830671
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+
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.
So let´s remove all the apps which have over 100 millon of installs and which may skew up the popularity of some categories.
categories_android = freq_table(android_final, 1)
category_n_installs_table = []
for category in categories_android:
total = 0
len_category = 0
for app in android_final:
category_app = app[1]
n_installs = app[5]
n_installs = n_installs.replace('+', '')
n_installs = n_installs.replace(',', '')
n_installs = float(n_installs)
if category_app == category and n_installs < 100000000:
total += n_installs
len_category += 1
avg_category = total / len_category
#Sorting and printing in a descending order
category_n_installs_tuple = (avg_category, category)
category_n_installs_table.append(category_n_installs_tuple)
category_n_installs_table_sorted = sorted(category_n_installs_table, reverse = True)
for entry in category_n_installs_table_sorted:
print(entry[1], ':', entry[0])
PHOTOGRAPHY : 7670532.29338843 GAME : 6272564.694894147 ENTERTAINMENT : 6118250.0 VIDEO_PLAYERS : 5544878.133333334 WEATHER : 5074486.197183099 SHOPPING : 4640920.541237113 COMMUNICATION : 3603485.3884615386 PRODUCTIVITY : 3379657.318885449 TOOLS : 3191461.128987517 SOCIAL : 3084582.5201793723 SPORTS : 2994082.551839465 TRAVEL_AND_LOCAL : 2944079.6336633665 PERSONALIZATION : 2549775.832167832 MAPS_AND_NAVIGATION : 2484104.7540983604 FAMILY : 2342897.527075812 HEALTH_AND_FITNESS : 2005713.6605166052 ART_AND_DESIGN : 1986335.0877192982 FOOD_AND_DRINK : 1924897.7363636363 EDUCATION : 1833495.145631068 NEWS_AND_MAGAZINES : 1502841.8775510204 BOOKS_AND_REFERENCE : 1437212.2162162163 HOUSE_AND_HOME : 1331540.5616438356 BUSINESS : 1226918.7407407407 LIFESTYLE : 1148801.8179190753 FINANCE : 1086125.7859327218 DATING : 854028.8303030303 COMICS : 817657.2727272727 AUTO_AND_VEHICLES : 647317.8170731707 LIBRARIES_AND_DEMO : 638503.734939759 PARENTING : 542603.6206896552 BEAUTY : 513151.88679245283 EVENTS : 253542.22222222222 MEDICAL : 120550.61980830671
As we expected the communication apps are not the most popular anymore, now the leader is photography with games as a runner up. Photography applications didn´t seem to be very popular on Apple Store and we need an app profile popular for both markets.
After the analysis of the free English apps on Apple Store we came up with 3 possible profiles, 1 was of the Shopping genre and 2 were related with the books. So let´s see what happen with these categories on Google Play.
Before removing the giant apps witn more than 100 million of installs the Shopping and Books&Refernces category stayed right behind the top 10 most installed categories. But after removing the 'big fishes' the Shopping apps went up to the 6th position from the top and the Books&References apps, on the contrary, went down to the second half of the table.
It's interesting to explore Shopping category 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:
shopping_app_table = []
for app in android_final:
if app[1] == 'SHOPPING':
#using the len() function to define place value
#adding 0.5 in order to diferentiate the numbers with equal place values, giving a higher order ->
## ->to those starting with a bigger digit ('5' in our case)
if app[5][0] == '5':
shopping_app_tuple = (len(app[5]) + 0.5, app[0], app[5])
shopping_app_table.append(shopping_app_tuple)
else:
shopping_app_tuple = (len(app[5]), app[0], app[5])
shopping_app_table.append(shopping_app_tuple)
shopping_app_sorted = sorted(shopping_app_table, reverse = True)
for entry in shopping_app_sorted:
print(entry[1], ':', entry[2])
eBay: Buy & Sell this Summer - Discover Deals Now! : 100,000,000+ Wish - Shopping Made Fun : 100,000,000+ Flipkart Online Shopping App : 100,000,000+ Amazon Shopping : 100,000,000+ AliExpress - Smarter Shopping, Better Living : 100,000,000+ letgo: Buy & Sell Used Stuff, Cars & Real Estate : 50,000,000+ The birth : 50,000,000+ OLX - Buy and Sell : 50,000,000+ Myntra Online Shopping App : 50,000,000+ Mercado Libre: Find your favorite brands : 50,000,000+ Lazada - Online Shopping & Deals : 50,000,000+ Groupon - Shop Deals, Discounts & Coupons : 50,000,000+ eBay Kleinanzeigen for Germany : 10,000,000+ cPro Marketplace: Buy. Sell. Rent. Date. Jobs. : 10,000,000+ ZALORA Fashion Shopping : 10,000,000+ Wemep - Special price representative (special / shopping / shopping app / coupon / shipping) : 10,000,000+ Walmart : 10,000,000+ Tophatter - 90 Second Auctions : 10,000,000+ The Coupons App : 10,000,000+ Target - now with Cartwheel : 10,000,000+ Stocard - Rewards Cards Wallet : 10,000,000+ Shopkick: Free Gift Cards, Shop Rewards & Deals : 10,000,000+ Shopfully - Weekly Ads & Deals : 10,000,000+ Shopee: No.1 Online Shopping : 10,000,000+ Shopee: No.1 Belanja Online : 10,000,000+ Shopee - No. 1 Online Shopping : 10,000,000+ ShopSavvy Barcode & QR Scanner : 10,000,000+ RetailMeNot - Coupons, Deals & Discount Shopping : 10,000,000+ Real Estate, Car, Shopping and Others : 10,000,000+ ROMWE - Women's Fashion : 10,000,000+ Poshmark - Buy & Sell Fashion : 10,000,000+ OfferUp - Buy. Sell. Offer Up : 10,000,000+ Mercari: The Selling App : 10,000,000+ Magazine Luiza Online Shopping : 10,000,000+ Jumia online shopping : 10,000,000+ Jabong Online Shopping App : 10,000,000+ Ibotta: Cash Back Savings, Rewards & Coupons App : 10,000,000+ IKEA Store : 10,000,000+ Home & Shopping - Only in apps. 10% off + 10% off : 10,000,000+ GS SHOP : 10,000,000+ Flipp - Weekly Shopping : 10,000,000+ Etsy: Handmade & Vintage Goods : 10,000,000+ Coupang : 10,000,000+ Club Factory Everything, Unbeaten Price : 10,000,000+ Checkout 51: Grocery coupons : 10,000,000+ Carousell: Snap-Sell, Chat-Buy : 10,000,000+ CJmall : 10,000,000+ Buscapé - Offers and discounts : 10,000,000+ Bukalapak - Buy and Sell Online : 10,000,000+ Blibli.com Online Shopping : 10,000,000+ Amazon for Tablets : 10,000,000+ ASOS : 10,000,000+ 11st : 10,000,000+ bigbasket - online grocery : 5,000,000+ Zappos – Shoe shopping made simple : 5,000,000+ Wayfair - Shop All Things Home : 5,000,000+ The Home Depot : 5,000,000+ Shrimp skin shopping: spend less, buy better : 5,000,000+ Sam's Club: Wholesale Shopping & Instant Savings : 5,000,000+ Rossmann PL : 5,000,000+ Postings (Craigslist Search App) : 5,000,000+ Lotte Home Shopping LOTTE Homeshopping : 5,000,000+ LivingSocial - Local Deals : 5,000,000+ LightInTheBox Online Shopping : 5,000,000+ Kroger : 5,000,000+ Kohl's: Scan, Shop, Pay & Save : 5,000,000+ GearBest Online Shopping : 5,000,000+ FirstCry Baby & Kids Shopping, Fashion & Parenting : 5,000,000+ Fancy : 5,000,000+ Dollar General - Digital Coupons, Ads And More : 5,000,000+ DHgate-Shop Wholesale Prices : 5,000,000+ Best Buy : 5,000,000+ zulily - Shop Daily Deals in Fashion and Home : 1,000,000+ Wanelo Shopping : 1,000,000+ The wall : 1,000,000+ SnipSnap Coupon App : 1,000,000+ Slickdeals: Coupons & Shopping : 1,000,000+ Slice: Package Tracker : 1,000,000+ Shopular: Coupons, Weekly Ads & Shopping Deals : 1,000,000+ SavingStar - Grocery Coupons : 1,000,000+ Receipt Hog - Receipts to Cash : 1,000,000+ Overstock – Home Decor, Furniture Shopping : 1,000,000+ Ouedkniss : 1,000,000+ Nike : 1,000,000+ Newegg Mobile : 1,000,000+ MiniInTheBox Online Shopping : 1,000,000+ Life market : 1,000,000+ Lalafo Pulsuz Elanlar : 1,000,000+ Krazy Coupon Lady : 1,000,000+ Key Ring: Cards Coupon & Sales : 1,000,000+ Jingdong - pick good things, go to Jingdong : 1,000,000+ Jiji.ng : 1,000,000+ JackThreads: Men's Shopping : 1,000,000+ Horn, free country requirements : 1,000,000+ FidMe Loyalty Cards & Deals at Grocery Supermarket : 1,000,000+ Family Dollar : 1,000,000+ Extreme Coupon Finder : 1,000,000+ Ebates: Cash Back, Coupons, Rewards & Savings : 1,000,000+ EHS Dongsen Shopping : 1,000,000+ Coupons.com – Grocery Coupons & Cash Back Savings : 1,000,000+ Chilindo : 1,000,000+ CheckPoints 🏆 Rewards App : 1,000,000+ CL Mobile - Classifieds for Craigslist : 1,000,000+ Boxed Wholesale : 1,000,000+ B&H Photo Video Pro Audio : 1,000,000+ AE + Aerie: Jeans, Dresses, Swimsuits & Bralettes : 1,000,000+ tutti.ch - Free Classifieds : 500,000+ ricardo.ch : 500,000+ ePN Cashback AliExpress : 500,000+ WICShopper : 500,000+ Urban Outfitters : 500,000+ Sharaf DG : 500,000+ Pro App for Craigslist : 500,000+ Nordstrom : 500,000+ Modcloth – Unique Indie Women's Fashion & Style : 500,000+ La La-Shop Designer Brands Street : 500,000+ HauteLook : 500,000+ Gyft - Mobile Gift Card Wallet : 500,000+ Find&Save - Local Shopping : 500,000+ DX : 500,000+ Coupon Sherpa : 500,000+ CIRCLE K : 500,000+ BJ’s Mobile App : 500,000+ Alzashop.com : 500,000+ efootwear.eu - online store : 100,000+ Twice: Buy, Sell Clothing : 100,000+ Strava.cz : 100,000+ Shop 'n Save : 100,000+ Savory - Deals,Freebies,Sales : 100,000+ Save.ca : 100,000+ Remix Second Hand : 100,000+ Ratings by Consumer Reports : 100,000+ REI – Shop Outdoor Gear : 100,000+ OLX Uganda Sell Buy Cellphones : 100,000+ O Shopping : 100,000+ My College Bookstore : 100,000+ Grabo.bg : 100,000+ Find Fast Food : 100,000+ DG Coupon : 100,000+ CL Mobile Pro - Classifieds for Craigslist : 100,000+ CJ WOW SHOP : 100,000+ BJ's Wholesale Club : 100,000+ B&M Stores : 100,000+ AB Click2Shop : 100,000+ SPEED L : 50,000+ DZ PROMOS - Promotions & Sale Alerts in Algeria : 50,000+ Calvin Klein – US Store : 50,000+ Blidz - Hunt Free Deals On Trending Items! : 50,000+ Šmelina .cz inzeráty inzerce : 10,000+ foody Cyprus - online ordering : 10,000+ Foods Co : 10,000+ DZ Mobile Market : 10,000+ DG - Digital Coupons - Free Coupon and Discount : 10,000+ CL Pro App for Craigslist : 10,000+ BJ's Express Scan : 10,000+ All States Ag Parts : 10,000+ AJ Percent Off Calculator : 10,000+ AE Checkout Plugin : 10,000+ ck-modelcars-UK Shop : 5,000+ ck-modelcars Shop : 5,000+ R Studio : 5,000+ Eshopcy.com.cy : 5,000+ CL Pro Client for Craigslist : 5,000+ ePazar.bg : 1,000+ TattooSupplies.eu : 1,000+ Go Go Coupons - Free Coupon and Discount : 1,000+ Dine In CT - Food Delivery : 1,000+ DTPay : 1,000+ Co-op Connections : 1,000+ BU Bookstore : 1,000+ Annonces.ci : 1,000+ postit.bm : 500+ dekoreko-dz : 500+ Hilverda De Boer B.V. App : 500+ E.W. James & Sons : 500+ CY Digital Net : 500+ CK Multimedia - Gaming Accessories : 500+ Bazar.af : 500+ BZ Delivery : 500+ BJ Toys : 500+ Schulman B.V. : 100+ EP Mobil : 100+ DM Collection : 100+ Coupon Mob - Discount Coupons : 100+ C.B. Shop : 100+ Bar BQ Night Middlesbrough : 100+ BL Flowers Digital : 100+ AzadBazar.af : 100+ AJ Nails Supply : 100+ A-Y Collection : 100+ Tenh Ey : 10+ GITZ.bz : 10+ DT Technologies : 10+ DT CLOTHINGS : 10+ DG OFF - 100% Free Coupons & Deals : 10+ Compas BP Store : 10+ AJ RETAILS : 10+ 4-T's Bar-BQ & Catering : 10+ BM CRM : 5+
The shopping genre includes a variety of apps: online shopping platforms, shop deals and coupon services, online shops, etc. However, it looks like there are only a few very popular apps, so this market still shows potential.
This niche seems to be dominated by online shops and multiseller platforms. Definitely, it´s not a good idea to create an online shop because we don´t have any goods to sell, nether a multiseller platform because of the very high competition.
Also we´ve noticed that there´re quite a few applications that offer different coupons or special deals which suggests that building an app with some kind of promotions could be profitable. But it´s necessary to outstand from the exsiting apps. Generally this kind of apps offer a campaign planned beforehead to attract new customers. And the goods and services that are offered there are not something that we buy on a daily or a weekly basis. It seems that it could be profitable for both the Google Play and the App Store markets to creating an app where the deales are announced not by the retailer but by their clients (a crowd-powered) and where a user can get a notification of a last-moment deal like "Cuttlefish eggs for only 9€ in the Carrefour of X street".
In this project, we analyzed data about the App Store and Google Play mobile apps with the goal of recommending an app profile that can be profitable for both markets.
We concluded that creating a crowd-powered app with last-minute special deals and discounts could be profitable for both the Google Play and the App Store markets. The markets are already full of different discounts and coupon apps, but we suggest that the deals are listed by users (a social-networking element) and mostly oriented for daily purchases . And it's possible to add location and category filters so that the users only recieve relevant deals.