Aim - Working as Data analysts for a company that builds Andriod and iOS apps. We make our apps available on Google Play and the App Store.
We only build apps that are free to download and install, and our main source of revenue consists of in-app ads. This means our revenue for any given app is mostly influenced by the number of users who use our app — the more users that see and engage with the ads, the better. Our goal for this project is to analyze data to help our developers understand what type 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, 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.
The datasets used in the analysis:
from csv import reader
## iOS appstore data:
open_file = open('AppleStore.csv')
read_file = reader(open_file)
iOS_data = list(read_file)
ios_header = iOS_data[0]
ios = iOS_data[1:]
## Google Play Store data:
open_file = open('googleplaystore.csv')
read_file = reader(open_file)
andro_data = list(read_file)
android_header = andro_data[0]
android = andro_data[1:]
#ios[1:]
#android[1:]
In order to print the dataset in a more legible manner we define a function 'explore_dataset'
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, 1, 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'] Number of rows: 10841 Number of columns: 13
Most of the columns are self explanatory and are easy to decipher from the hearder row. The play store also has a dedicated section for better explanation of the data.
print(ios_header)
print('\n')
explore_data(ios, 0, 1, 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'] Number of rows: 7197 Number of columns: 16
The discussion section for the Google Playstore describes an error for the row : 10472. Let's check the given error.
## printing the required row for error correction:
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']
## checking the length of the given row and the header row:
if len(android_header) == len(android[10472]):
print("The length is same.")
else:
print("There is a data missing.")
There is a data missing.
We see that there has been a column shift in the row 10472 when we compare the header row with the given row as: -'Catergory' does not have a numerical value of ('1.9'), therefore we delete the row.
## deleting the required row:
del android[10472]
## creating two lists to get a seperate entry for duplicate apps:
unique_apps = []
duplicate_apps = []
for app in android:
if app[0] in unique_apps:
duplicate_apps.append(app[0])
else:
unique_apps.append(app[0])
print('Number of Unique app entries = ', len(unique_apps))
print('\n')
print('Number of duplicate app entries = ', len(duplicate_apps))
print('\n')
print('Examples of duplicate entries :', duplicate_apps[:15])
Number of Unique app entries = 9659 Number of duplicate app entries = 1181 Examples of duplicate entries : ['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']
## Let's examine one of the duplicate app entries :
for app in android:
if app[0] == 'Google Ads':
print(app, '\n')
print(android_header)
['Google Ads', 'BUSINESS', '4.3', '29313', '20M', '5,000,000+', 'Free', '0', 'Everyone', 'Business', 'July 30, 2018', '1.12.0', '4.0.3 and up'] ['Google Ads', 'BUSINESS', '4.3', '29313', '20M', '5,000,000+', 'Free', '0', 'Everyone', 'Business', 'July 30, 2018', '1.12.0', '4.0.3 and up'] ['Google Ads', 'BUSINESS', '4.3', '29331', '20M', '5,000,000+', 'Free', '0', 'Everyone', 'Business', 'July 30, 2018', '1.12.0', '4.0.3 and up'] ['App', 'Category', 'Rating', 'Reviews', 'Size', 'Installs', 'Type', 'Price', 'Content Rating', 'Genres', 'Last Updated', 'Current Ver', 'Android Ver']
We don't want to count certain apps more than once when we analyze data, so we need to remove the duplicate entries and keep only one entry per app.
The higher the number of reviews, the more recent the data should be. Rather than removing duplicates randomly, we'll only keep the row with the highest number of reviews and remove the other entries for any given app.
## checking the index for app reviews:
index = 0
for heads in android_header:
if heads != 'Reviews':
index += 1
else:
break
print('Index of the reviews = ', index)
Index of the reviews = 3
To remove the duplicates, we will:
Create a dictionary, where each dictionary key is a unique app name and the corresponding dictionary value is the highest number of reviews of that app.
Use the information stored in the dictionary and create a new data set, which will have only one entry per app (and for each app, we'll only select the entry with the highest number of reviews).
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
print(len(reviews_max))
9659
## comparing the number of duplicate app entries to the ones we found earlier:
if len(reviews_max) == (len(android) - len(duplicate_apps)):
print ('The number of unique apps is: ', len(reviews_max) )
The number of unique apps is: 9659
Using the 'reviews_max' dictionary we can remove all the duplicate apps from the given dataset by using the max number of reviews as our determing factor.
android_clean = []
already_added = []
for app in android:
name = app[0]
n_reviews = float(app[3])
if (name not in already_added) and (reviews_max[name] == n_reviews):
android_clean.append(app)
already_added.append(name)
print("The dataset cleaned successfully ")
print('\n')
print('The length of the cleaned dataset :', len(android_clean))
print('\n')
explore_data(android_clean,0,3,True)
The dataset cleaned successfully The length of the cleaned dataset : 9659 ['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
## checking for duplicate entries in ios dataset:
unique_iapps = []
duplicate_iapps = []
for app in ios:
if app[0] in unique_iapps:
duplicate_iapps.append(app[0])
else:
unique_iapps.append(app[0])
print('Number of Unique app entries = ', len(unique_iapps))
print('\n')
print('Number of duplicate app entries = ', len(duplicate_iapps))
Number of Unique app entries = 7197 Number of duplicate app entries = 0
## there are non-english apps in our dataset eg.:
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 kind of apps, so we'll remove them. All the 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.
## defining a function is_eng that tells if the given string has characters that lie out of ASCII range:
def is_eng(string):
for character in string:
if ord(character) > 127:
return False
return True
## checking our funtion :
print('Instagram -' + str(is_eng('Instagram')))
print('爱奇艺PPS -《欢乐颂2》电视剧热播 - ' + str(is_eng('爱奇艺PPS -《欢乐颂2》电视剧热播')))
print('Instachat 😜 -' + str(is_eng('Instachat 😜')))
Instagram -True 爱奇艺PPS -《欢乐颂2》电视剧热播 - False Instachat 😜 -False
We see that some of the english apps like ('Instachat 😜') were not correctly identified as some of its characters were outside the given ASCII range.
## altering the function above :
def is_english(string):
number = 0
for character in string:
if ord(character) > 127:
number += 1
if number > 3:
return False
return True
## checking our funtion :
print('Instagram -' + str(is_english('Instagram')))
print('爱奇艺PPS -《欢乐颂2》电视剧热播 - ' + str(is_english('爱奇艺PPS -《欢乐颂2》电视剧热播')))
print('Instachat 😜 -' + str(is_english('Instachat 😜')))
Instagram -True 爱奇艺PPS -《欢乐颂2》电视剧热播 - False Instachat 😜 -True
## Exploring the dataset to find the number of non-english apps:
android_english = []
ios_english = []
for app in android_clean:
name = str(app[0])
if is_english(name):
android_english.append(app)
for app in ios:
name = str(app[1])
if is_english(name):
ios_english.append(app)
explore_data(android_english, 0, 2, True)
print('\n')
explore_data(ios_english, 0, 2, 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'] Number of rows: 9614 Number of columns: 13 ['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'] Number of rows: 6183 Number of columns: 16
Since we only build apps that are free to download and install, and our main source of revenue consists of in-app ads. Our data sets contain both free and non-free apps; we'll need to isolate only the free apps for our analysis.
## looping through and finding the index of price:
index_andro = 0
for heads in android_header:
if heads != 'Price':
index_andro += 1
else:
break
print('Index of the Prices = ', index_andro)
index_ios = 0
for heads in ios_header:
if heads != 'price':
index_ios += 1
else:
break
print('Index of the Prices = ', index_ios)
print('\n')
print(android_header)
print(ios_header)
Index of the Prices = 7 Index of the Prices = 4 ['App', 'Category', 'Rating', 'Reviews', 'Size', 'Installs', 'Type', 'Price', 'Content Rating', 'Genres', 'Last Updated', 'Current Ver', 'Android Ver'] ['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']
## final datasets:
andro_final = []
ios_final = []
for app in android_english:
price = app[7]
if price == '0':
andro_final.append(app)
for app in ios:
price = app[4]
if price == '0.0':
ios_final.append(app)
print(len(andro_final))
print(len(ios_final))
8864 4056
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 Google Play and the App Store, we need to find app profiles that are successful on both markets. For instance, a profile that works well for both markets might be a productivity app that makes use of gamification.
We need two functions to produce usable information from the dataset
# creating a function for frequency table:
def freq_table(dataset,index):
table = {}
for app in dataset:
value = app[index]
if value in table:
table[value] += 1
else:
table[value] = 1
percentages = {}
for app in table:
percentages[app] = (table[app] / len(dataset))*100
return percentages
## to arrange the values in descending order:
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])
We start our analysis by checking the prime_genre column of the App Store dataset.
## this function will give us the percentages of the popular genres in the app store:
display_table(ios_final, -5)
Games : 55.64595660749507 Entertainment : 8.234714003944774 Photo & Video : 4.117357001972387 Social Networking : 3.5256410256410255 Education : 3.2544378698224854 Shopping : 2.983234714003945 Utilities : 2.687376725838264 Lifestyle : 2.3175542406311638 Finance : 2.0710059171597637 Sports : 1.947731755424063 Health & Fitness : 1.8737672583826428 Music : 1.6518737672583828 Book : 1.6272189349112427 Productivity : 1.5285996055226825 News : 1.4299802761341223 Travel : 1.3806706114398422 Food & Drink : 1.0601577909270217 Weather : 0.7642998027613412 Reference : 0.4930966469428008 Navigation : 0.4930966469428008 Business : 0.4930966469428008 Catalogs : 0.22189349112426035 Medical : 0.19723865877712032
Here we 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.
## checking the same for teh google play store:
display_table(andro_final,1)
FAMILY : 18.907942238267147 GAME : 9.724729241877256 TOOLS : 8.461191335740072 BUSINESS : 4.591606498194946 LIFESTYLE : 3.9034296028880866 PRODUCTIVITY : 3.892148014440433 FINANCE : 3.7003610108303246 MEDICAL : 3.531137184115524 SPORTS : 3.395758122743682 PERSONALIZATION : 3.3167870036101084 COMMUNICATION : 3.2378158844765346 HEALTH_AND_FITNESS : 3.0798736462093865 PHOTOGRAPHY : 2.944494584837545 NEWS_AND_MAGAZINES : 2.7978339350180503 SOCIAL : 2.6624548736462095 TRAVEL_AND_LOCAL : 2.33528880866426 SHOPPING : 2.2450361010830324 BOOKS_AND_REFERENCE : 2.1435018050541514 DATING : 1.861462093862816 VIDEO_PLAYERS : 1.7937725631768955 MAPS_AND_NAVIGATION : 1.3989169675090252 FOOD_AND_DRINK : 1.2409747292418771 EDUCATION : 1.1620036101083033 ENTERTAINMENT : 0.9589350180505415 LIBRARIES_AND_DEMO : 0.9363718411552346 AUTO_AND_VEHICLES : 0.9250902527075812 HOUSE_AND_HOME : 0.8235559566787004 WEATHER : 0.8009927797833934 EVENTS : 0.7107400722021661 PARENTING : 0.6543321299638989 ART_AND_DESIGN : 0.6430505415162455 COMICS : 0.6204873646209386 BEAUTY : 0.5979241877256317
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 have been 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.
## analysing the genres category for the play store data we see:
display_table(andro_final, -4)
Tools : 8.449909747292418 Entertainment : 6.069494584837545 Education : 5.347472924187725 Business : 4.591606498194946 Productivity : 3.892148014440433 Lifestyle : 3.892148014440433 Finance : 3.7003610108303246 Medical : 3.531137184115524 Sports : 3.463447653429603 Personalization : 3.3167870036101084 Communication : 3.2378158844765346 Action : 3.1024368231046933 Health & Fitness : 3.0798736462093865 Photography : 2.944494584837545 News & Magazines : 2.7978339350180503 Social : 2.6624548736462095 Travel & Local : 2.3240072202166067 Shopping : 2.2450361010830324 Books & Reference : 2.1435018050541514 Simulation : 2.0419675090252705 Dating : 1.861462093862816 Arcade : 1.8501805054151623 Video Players & Editors : 1.7712093862815883 Casual : 1.7599277978339352 Maps & Navigation : 1.3989169675090252 Food & Drink : 1.2409747292418771 Puzzle : 1.128158844765343 Racing : 0.9927797833935018 Role Playing : 0.9363718411552346 Libraries & Demo : 0.9363718411552346 Auto & Vehicles : 0.9250902527075812 Strategy : 0.9138086642599278 House & Home : 0.8235559566787004 Weather : 0.8009927797833934 Events : 0.7107400722021661 Adventure : 0.6768953068592057 Comics : 0.6092057761732852 Beauty : 0.5979241877256317 Art & Design : 0.5979241877256317 Parenting : 0.4963898916967509 Card : 0.45126353790613716 Casino : 0.42870036101083037 Trivia : 0.41741877256317694 Educational;Education : 0.39485559566787 Board : 0.3835740072202166 Educational : 0.3722924187725632 Education;Education : 0.33844765342960287 Word : 0.2594765342960289 Casual;Pretend Play : 0.236913357400722 Music : 0.2030685920577617 Racing;Action & Adventure : 0.16922382671480143 Puzzle;Brain Games : 0.16922382671480143 Entertainment;Music & Video : 0.16922382671480143 Casual;Brain Games : 0.13537906137184114 Casual;Action & Adventure : 0.13537906137184114 Arcade;Action & Adventure : 0.12409747292418773 Action;Action & Adventure : 0.10153429602888085 Educational;Pretend Play : 0.09025270758122744 Simulation;Action & Adventure : 0.078971119133574 Parenting;Education : 0.078971119133574 Entertainment;Brain Games : 0.078971119133574 Board;Brain Games : 0.078971119133574 Parenting;Music & Video : 0.06768953068592057 Educational;Brain Games : 0.06768953068592057 Casual;Creativity : 0.06768953068592057 Art & Design;Creativity : 0.06768953068592057 Education;Pretend Play : 0.056407942238267145 Role Playing;Pretend Play : 0.04512635379061372 Education;Creativity : 0.04512635379061372 Role Playing;Action & Adventure : 0.033844765342960284 Puzzle;Action & Adventure : 0.033844765342960284 Entertainment;Creativity : 0.033844765342960284 Entertainment;Action & Adventure : 0.033844765342960284 Educational;Creativity : 0.033844765342960284 Educational;Action & Adventure : 0.033844765342960284 Education;Music & Video : 0.033844765342960284 Education;Brain Games : 0.033844765342960284 Education;Action & Adventure : 0.033844765342960284 Adventure;Action & Adventure : 0.033844765342960284 Video Players & Editors;Music & Video : 0.02256317689530686 Sports;Action & Adventure : 0.02256317689530686 Simulation;Pretend Play : 0.02256317689530686 Puzzle;Creativity : 0.02256317689530686 Music;Music & Video : 0.02256317689530686 Entertainment;Pretend Play : 0.02256317689530686 Casual;Education : 0.02256317689530686 Board;Action & Adventure : 0.02256317689530686 Video Players & Editors;Creativity : 0.01128158844765343 Trivia;Education : 0.01128158844765343 Travel & Local;Action & Adventure : 0.01128158844765343 Tools;Education : 0.01128158844765343 Strategy;Education : 0.01128158844765343 Strategy;Creativity : 0.01128158844765343 Strategy;Action & Adventure : 0.01128158844765343 Simulation;Education : 0.01128158844765343 Role Playing;Brain Games : 0.01128158844765343 Racing;Pretend Play : 0.01128158844765343 Puzzle;Education : 0.01128158844765343 Parenting;Brain Games : 0.01128158844765343 Music & Audio;Music & Video : 0.01128158844765343 Lifestyle;Pretend Play : 0.01128158844765343 Lifestyle;Education : 0.01128158844765343 Health & Fitness;Education : 0.01128158844765343 Health & Fitness;Action & Adventure : 0.01128158844765343 Entertainment;Education : 0.01128158844765343 Communication;Creativity : 0.01128158844765343 Comics;Creativity : 0.01128158844765343 Casual;Music & Video : 0.01128158844765343 Card;Action & Adventure : 0.01128158844765343 Books & Reference;Education : 0.01128158844765343 Art & Design;Pretend Play : 0.01128158844765343 Art & Design;Action & Adventure : 0.01128158844765343 Arcade;Pretend Play : 0.01128158844765343 Adventure;Education : 0.01128158844765343
We see that the genres category has a more granular approach towards the classificatioon of the apps. Since we are looking for the bigger picture here, we will focus more towards the 'Category' of the landscape.
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_column app.
Let's start with calculating the average number of user ratings per app genre on the App Store. To do that, we'll need to:
## generating the keys (genres) for the apps in app store:
genres = freq_table(ios_final, -5)
genres_ios = genres.keys()
## the index of rating_counts_total = 5 & prime_genre = -5 in the app store:
app_ratings = {}
for genre in genres_ios:
total = 0 # will store the sum of user ratings for each genre
len_genre = 0 # no.of apps specific to each genre
for app in ios_final:
genre_app = app[-5]
if genre_app == genre:
ratings = float(app[5])
total += ratings
len_genre += 1
avg_user_ratings = total / len_genre
app_ratings[genre] = avg_user_ratings
print(genre + ' - ' + str(avg_user_ratings))
Social Networking - 53078.195804195806 Photo & Video - 27249.892215568863 Games - 18924.68896765618 Music - 56482.02985074627 Reference - 67447.9 Health & Fitness - 19952.315789473683 Weather - 47220.93548387097 Utilities - 14010.100917431193 Travel - 20216.01785714286 Shopping - 18746.677685950413 News - 15892.724137931034 Navigation - 25972.05 Lifestyle - 8978.308510638299 Entertainment - 10822.961077844311 Food & Drink - 20179.093023255813 Sports - 20128.974683544304 Book - 8498.333333333334 Finance - 13522.261904761905 Education - 6266.333333333333 Productivity - 19053.887096774193 Business - 6367.8 Catalogs - 1779.5555555555557 Medical - 459.75
## to find the maximum rated genre:
print(max(app_ratings.values()))
67447.9
We see that the reference apps have the most user ratings. Let's check the user ratings of each app in the reference section:
## freq table of the reference genre:
refr = {}
for app in ios_final:
if app[-5] == 'Reference':
refr[app[1]] = float(app[5])
## producing the refr dictionary in descending order:
from collections import OrderedDict
refr = OrderedDict(sorted(refr.items(), key=lambda t: t[1] , reverse=True))
for key, value in refr.items():
print(key, ' - ', value)
Bible - 985920.0 Dictionary.com Dictionary & Thesaurus - 200047.0 Dictionary.com Dictionary & Thesaurus for iPad - 54175.0 Google Translate - 26786.0 Muslim Pro: Ramadan 2017 Prayer Times, Azan, Quran - 18418.0 New Furniture Mods - Pocket Wiki & Game Tools for Minecraft PC Edition - 17588.0 Merriam-Webster Dictionary - 16849.0 Night Sky - 12122.0 City Maps for Minecraft PE - The Best Maps for Minecraft Pocket Edition (MCPE) - 8535.0 LUCKY BLOCK MOD ™ for Minecraft PC Edition - The Best Pocket Wiki & Mods Installer Tools - 4693.0 GUNS MODS for Minecraft PC Edition - Mods Tools - 1497.0 Guides for Pokémon GO - Pokemon GO News and Cheats - 826.0 WWDC - 762.0 Horror Maps for Minecraft PE - Download The Scariest Maps for Minecraft Pocket Edition (MCPE) Free - 718.0 VPN Express - 14.0 Real Bike Traffic Rider Virtual Reality Glasses - 8.0 教えて!goo - 0.0 彩库宝典-【官方版】 - 0.0 Jishokun-Japanese English Dictionary & Translator - 0.0 無料で音楽や写真・カメラの裏技アプリ for iPhone7 - 0.0
The best conclusion therefore is, to take a 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.
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(andro_final, 5) # the Installs columns
1,000,000+ : 15.726534296028879 100,000+ : 11.552346570397113 10,000,000+ : 10.548285198555957 10,000+ : 10.198555956678701 1,000+ : 8.393501805054152 100+ : 6.915613718411552 5,000,000+ : 6.825361010830325 500,000+ : 5.561823104693141 50,000+ : 4.7721119133574 5,000+ : 4.512635379061372 10+ : 3.5424187725631766 500+ : 3.2490974729241873 50,000,000+ : 2.3014440433213 100,000,000+ : 2.1322202166064983 50+ : 1.917870036101083 5+ : 0.78971119133574 1+ : 0.5076714801444043 500,000,000+ : 0.2707581227436823 1,000,000,000+ : 0.22563176895306858 0+ : 0.04512635379061372 0 : 0.01128158844765343
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.
print(android_header)
['App', 'Category', 'Rating', 'Reviews', 'Size', 'Installs', 'Type', 'Price', 'Content Rating', 'Genres', 'Last Updated', 'Current Ver', 'Android Ver']
## going over the catergory data:
cat = freq_table(andro_final,1)
category = cat.keys()
app_installs = {}
for cat in category:
total = 0 # sum of installs for that category
len_category = 0 # store the number of apps in that category
for app in andro_final:
if cat == app[1]:
installs = app[5]
installs = installs.replace('+','')
installs = installs.replace(',','')
installs = float(installs)
total += installs
len_category += 1
avg_app_installs = total / len_category
app_installs[cat] = avg_app_installs
print(cat + ' - ' + str(avg_app_installs))
ART_AND_DESIGN - 1986335.0877192982 AUTO_AND_VEHICLES - 647317.8170731707 BEAUTY - 513151.88679245283 BOOKS_AND_REFERENCE - 8767811.894736841 BUSINESS - 1712290.1474201474 COMICS - 817657.2727272727 COMMUNICATION - 38456119.167247385 DATING - 854028.8303030303 EDUCATION - 1833495.145631068 ENTERTAINMENT - 11640705.88235294 EVENTS - 253542.22222222222 FINANCE - 1387692.475609756 FOOD_AND_DRINK - 1924897.7363636363 HEALTH_AND_FITNESS - 4188821.9853479853 HOUSE_AND_HOME - 1331540.5616438356 LIBRARIES_AND_DEMO - 638503.734939759 LIFESTYLE - 1437816.2687861272 GAME - 15588015.603248259 FAMILY - 3695641.8198090694 MEDICAL - 120550.61980830671 SOCIAL - 23253652.127118643 SHOPPING - 7036877.311557789 PHOTOGRAPHY - 17840110.40229885 SPORTS - 3638640.1428571427 TRAVEL_AND_LOCAL - 13984077.710144928 TOOLS - 10801391.298666667 PERSONALIZATION - 5201482.6122448975 PRODUCTIVITY - 16787331.344927534 PARENTING - 542603.6206896552 WEATHER - 5074486.197183099 VIDEO_PLAYERS - 24727872.452830188 NEWS_AND_MAGAZINES - 9549178.467741935 MAPS_AND_NAVIGATION - 4056941.7741935486
## App installs in descending category:
app_installs = OrderedDict(sorted(app_installs.items(), key=lambda t: t[1] , reverse=True))
for key, value in app_installs.items():
print(key, ' - ', value)
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 - 1437816.2687861272 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
We see that, on average, communication apps have most installs. 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 andro_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+
All the apps in this category have been downloaded over million times, therefore we need to check for a category where there isn't tough competition from these social media giants.
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:
for app in andro_final:
if app[1] == 'BOOKS_AND_REFERENCE':
print(app[0], ':', app[5])
E-Book Read - Read Book for free : 50,000+ Download free book with green book : 100,000+ Wikipedia : 10,000,000+ Cool Reader : 10,000,000+ Free Panda Radio Music : 100,000+ Book store : 1,000,000+ FBReader: Favorite Book Reader : 10,000,000+ English Grammar Complete Handbook : 500,000+ Free Books - Spirit Fanfiction and Stories : 1,000,000+ Google Play Books : 1,000,000,000+ AlReader -any text book reader : 5,000,000+ Offline English Dictionary : 100,000+ Offline: English to Tagalog Dictionary : 500,000+ FamilySearch Tree : 1,000,000+ Cloud of Books : 1,000,000+ Recipes of Prophetic Medicine for free : 500,000+ ReadEra – free ebook reader : 1,000,000+ Anonymous caller detection : 10,000+ Ebook Reader : 5,000,000+ Litnet - E-books : 100,000+ Read books online : 5,000,000+ English to Urdu Dictionary : 500,000+ eBoox: book reader fb2 epub zip : 1,000,000+ English Persian Dictionary : 500,000+ Flybook : 500,000+ All Maths Formulas : 1,000,000+ Ancestry : 5,000,000+ HTC Help : 10,000,000+ English translation from Bengali : 100,000+ Pdf Book Download - Read Pdf Book : 100,000+ Free Book Reader : 100,000+ eBoox new: Reader for fb2 epub zip books : 50,000+ Only 30 days in English, the guideline is guaranteed : 500,000+ Moon+ Reader : 10,000,000+ SH-02J Owner's Manual (Android 8.0) : 50,000+ English-Myanmar Dictionary : 1,000,000+ Golden Dictionary (EN-AR) : 1,000,000+ All Language Translator Free : 1,000,000+ Azpen eReader : 500,000+ URBANO V 02 instruction manual : 100,000+ Bible : 100,000,000+ C Programs and Reference : 50,000+ C Offline Tutorial : 1,000+ C Programs Handbook : 50,000+ Amazon Kindle : 100,000,000+ Aab e Hayat Full Novel : 100,000+ Aldiko Book Reader : 10,000,000+ Google I/O 2018 : 500,000+ R Language Reference Guide : 10,000+ Learn R Programming Full : 5,000+ R Programing Offline Tutorial : 1,000+ Guide for R Programming : 5+ Learn R Programming : 10+ R Quick Reference Big Data : 1,000+ V Made : 100,000+ Wattpad 📖 Free Books : 100,000,000+ Dictionary - WordWeb : 5,000,000+ Guide (for X-MEN) : 100,000+ AC Air condition Troubleshoot,Repair,Maintenance : 5,000+ AE Bulletins : 1,000+ Ae Allah na Dai (Rasa) : 10,000+ 50000 Free eBooks & Free AudioBooks : 5,000,000+ Ag PhD Field Guide : 10,000+ Ag PhD Deficiencies : 10,000+ Ag PhD Planting Population Calculator : 1,000+ Ag PhD Soybean Diseases : 1,000+ Fertilizer Removal By Crop : 50,000+ A-J Media Vault : 50+ Al-Quran (Free) : 10,000,000+ Al Quran (Tafsir & by Word) : 500,000+ Al Quran Indonesia : 10,000,000+ Al'Quran Bahasa Indonesia : 10,000,000+ Al Quran Al karim : 1,000,000+ Al-Muhaffiz : 50,000+ Al Quran : EAlim - Translations & MP3 Offline : 5,000,000+ Al-Quran 30 Juz free copies : 500,000+ Koran Read &MP3 30 Juz Offline : 1,000,000+ Hafizi Quran 15 lines per page : 1,000,000+ Quran for Android : 10,000,000+ Surah Al-Waqiah : 100,000+ Hisnul Al Muslim - Hisn Invocations & Adhkaar : 100,000+ Satellite AR : 1,000,000+ Audiobooks from Audible : 100,000,000+ Kinot & Eichah for Tisha B'Av : 10,000+ AW Tozer Devotionals - Daily : 5,000+ Tozer Devotional -Series 1 : 1,000+ The Pursuit of God : 1,000+ AY Sing : 5,000+ Ay Hasnain k Nana Milad Naat : 10,000+ Ay Mohabbat Teri Khatir Novel : 10,000+ Arizona Statutes, ARS (AZ Law) : 1,000+ Oxford A-Z of English Usage : 1,000,000+ BD Fishpedia : 1,000+ BD All Sim Offer : 10,000+ Youboox - Livres, BD et magazines : 500,000+ B&H Kids AR : 10,000+ B y H Niños ES : 5,000+ Dictionary.com: Find Definitions for English Words : 10,000,000+ English Dictionary - Offline : 10,000,000+ Bible KJV : 5,000,000+ Borneo Bible, BM Bible : 10,000+ MOD Black for BM : 100+ BM Box : 1,000+ Anime Mod for BM : 100+ NOOK: Read eBooks & Magazines : 10,000,000+ NOOK Audiobooks : 500,000+ NOOK App for NOOK Devices : 500,000+ Browsery by Barnes & Noble : 5,000+ bp e-store : 1,000+ Brilliant Quotes: Life, Love, Family & Motivation : 1,000,000+ BR Ambedkar Biography & Quotes : 10,000+ BU Alsace : 100+ Catholic La Bu Zo Kam : 500+ Khrifa Hla Bu (Solfa) : 10+ Kristian Hla Bu : 10,000+ SA HLA BU : 1,000+ Learn SAP BW : 500+ Learn SAP BW on HANA : 500+ CA Laws 2018 (California Laws and Codes) : 5,000+ Bootable Methods(USB-CD-DVD) : 10,000+ cloudLibrary : 100,000+ SDA Collegiate Quarterly : 500+ Sabbath School : 100,000+ Cypress College Library : 100+ Stats Royale for Clash Royale : 1,000,000+ GATE 21 years CS Papers(2011-2018 Solved) : 50+ Learn CT Scan Of Head : 5,000+ Easy Cv maker 2018 : 10,000+ How to Write CV : 100,000+ CW Nuclear : 1,000+ CY Spray nozzle : 10+ BibleRead En Cy Zh Yue : 5+ CZ-Help : 5+ Modlitební knížka CZ : 500+ Guide for DB Xenoverse : 10,000+ Guide for DB Xenoverse 2 : 10,000+ Guide for IMS DB : 10+ DC HSEMA : 5,000+ DC Public Library : 1,000+ Painting Lulu DC Super Friends : 1,000+ Dictionary : 10,000,000+ Fix Error Google Playstore : 1,000+ D. H. Lawrence Poems FREE : 1,000+ Bilingual Dictionary Audio App : 5,000+ DM Screen : 10,000+ wikiHow: how to do anything : 1,000,000+ Dr. Doug's Tips : 1,000+ Bible du Semeur-BDS (French) : 50,000+ La citadelle du musulman : 50,000+ DV 2019 Entry Guide : 10,000+ DV 2019 - EDV Photo & Form : 50,000+ DV 2018 Winners Guide : 1,000+ EB Annual Meetings : 1,000+ EC - AP & Telangana : 5,000+ TN Patta Citta & EC : 10,000+ AP Stamps and Registration : 10,000+ CompactiMa EC pH Calibration : 100+ EGW Writings 2 : 100,000+ EGW Writings : 1,000,000+ Bible with EGW Comments : 100,000+ My Little Pony AR Guide : 1,000,000+ SDA Sabbath School Quarterly : 500,000+ Duaa Ek Ibaadat : 5,000+ Spanish English Translator : 10,000,000+ Dictionary - Merriam-Webster : 10,000,000+ JW Library : 10,000,000+ Oxford Dictionary of English : Free : 10,000,000+ English Hindi Dictionary : 10,000,000+ English to Hindi Dictionary : 5,000,000+ EP Research Service : 1,000+ Hymnes et Louanges : 100,000+ EU Charter : 1,000+ EU Data Protection : 1,000+ EU IP Codes : 100+ EW PDF : 5+ BakaReader EX : 100,000+ EZ Quran : 50,000+ FA Part 1 & 2 Past Papers Solved Free – Offline : 5,000+ La Fe de Jesus : 1,000+ La Fe de Jesús : 500+ Le Fe de Jesus : 500+ Florida - Pocket Brainbook : 1,000+ Florida Statutes (FL Code) : 1,000+ English To Shona Dictionary : 10,000+ Greek Bible FP (Audio) : 1,000+ Golden Dictionary (FR-AR) : 500,000+ Fanfic-FR : 5,000+ Bulgarian French Dictionary Fr : 10,000+ Chemin (fr) : 1,000+ The SCP Foundation DB fr nn5n : 1,000+
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 app in andro_final:
if app[1] == 'BOOKS_AND_REFERENCE' and (app[5] == '1,000,000,000+'
or app[5] == '500,000,000+'
or app[5] == '100,000,000+'):
print(app[0], ':', app[5])
Google Play Books : 1,000,000,000+ Bible : 100,000,000+ Amazon Kindle : 100,000,000+ Wattpad 📖 Free Books : 100,000,000+ Audiobooks from Audible : 100,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 an audio version of the book, quizzes on the book, a forum where people can discuss the book, etc.
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 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. The markets are already full of libraries, so we need to add some special features besides the raw version of the book. This might include an audio version of the book, quizzes on the book, a forum where people can discuss the book, etc.