In [1]:
import pandas as pd
filepath = "Resources/purchase_data.csv"
game = pd.read_csv(filepath)
game.head(10)
Out[1]:
Purchase ID SN Age Gender Item ID Item Name Price
0 0 Lisim78 20 Male 108 Extraction, Quickblade Of Trembling Hands 3.53
1 1 Lisovynya38 40 Male 143 Frenzied Scimitar 1.56
2 2 Ithergue48 24 Male 92 Final Critic 4.88
3 3 Chamassasya86 24 Male 100 Blindscythe 3.27
4 4 Iskosia90 23 Male 131 Fury 1.44
5 5 Yalae81 22 Male 81 Dreamkiss 3.61
6 6 Itheria73 36 Male 169 Interrogator, Blood Blade of the Queen 2.18
7 7 Iskjaskst81 20 Male 162 Abyssal Shard 2.67
8 8 Undjask33 22 Male 21 Souleater 1.10
9 9 Chanosian48 35 Other / Non-Disclosed 136 Ghastly Adamantite Protector 3.58
In [2]:
totalN = pd.DataFrame({"Total Players":[len(game["SN"].unique())]})
totalN
Out[2]:
Total Players
0 576
In [3]:
purch = pd.DataFrame({
    "Number of Unique Items":[len(game["Item ID"].unique())],
    "Average Price":[game["Price"].mean()],
    "Number of Purchases":[len(game.index)],
    "Total Revenue":[game["Price"].sum()],
})
purch = purch.style.format({
    "Average Price":"${:0,.2f}",
    "Total Revenue":"${:0,.2f}"
})
purch
Out[3]:
Number of Unique Items Average Price Number of Purchases Total Revenue
0 183 $3.05 780 $2,379.77
In [4]:
gendemoTC = game.groupby(["Gender"])[["SN"]].nunique()
gendemoPC = game.groupby(["Gender"])[["SN"]].nunique()
gendemo = pd.merge(gendemoTC,gendemoPC,on=["Gender"])
gendemo["SN_y"]=(gendemo["SN_y"]/(len(game["SN"].unique())))*100
gendemo.rename(columns={"SN_x":"Total Count",
    "SN_y":"Percentage of Players"},inplace=True)
gendemo = gendemo.style.format({
    "Percentage of Players":"{:0,.2f}%"
})
gendemo
Out[4]:
Total Count Percentage of Players
Gender
Female 81 14.06%
Male 484 84.03%
Other / Non-Disclosed 11 1.91%
In [5]:
genpurchPC = game.groupby(["Gender"])[["Purchase ID"]].count()
genpurchAPP = game.groupby(["Gender"])[["Price"]].mean()
genpurchTPV = game.groupby(["Gender"])[["Price"]].sum()
genpurchATPP = game.groupby(["Gender"])[["SN"]].nunique()

genpurch = pd.merge(genpurchPC,genpurchAPP,on=["Gender"])
genpurch = pd.merge(genpurch,genpurchTPV,on=["Gender"])
genpurch = pd.merge(genpurch,genpurchATPP,on=["Gender"])

genpurch["SN"]=genpurch["Price_y"]/genpurch["SN"]

genpurch.rename(columns={
    "Purchase ID":"Purchase Count",
    "Price_x":"Average Purchase Price",
    "Price_y":"Total Purchase Value",
    "SN":"Avg Total Purchase per Person"}
    ,inplace=True)

genpurch = genpurch.style.format({
    "Average Purchase Price":"${:0,.2f}",
    "Total Purchase Value":"${:0,.2f}",
    "Avg Total Purchase per Person":"${:0,.2f}"
})

genpurch
Out[5]:
Purchase Count Average Purchase Price Total Purchase Value Avg Total Purchase per Person
Gender
Female 113 $3.20 $361.94 $4.47
Male 652 $3.02 $1,967.64 $4.07
Other / Non-Disclosed 15 $3.35 $50.19 $4.56
In [6]:
bins = [0,9,14,19,24,29,34,39,game["Age"].max()]
nameobins = ["<10","10-14","15-19","20-24","25-29","30-34","35-39","40+"]
game["Age Range"] = pd.cut(game["Age"],bins, labels=nameobins, include_lowest=True)
In [7]:
TC = game.groupby(["Age Range"])[["SN"]].nunique()
Percent = game.groupby(["Age Range"])[["SN"]].nunique()
agedemo = pd.merge(TC,Percent,on=["Age Range"])
agedemo["SN_y"]=(agedemo["SN_y"]/len(game["SN"].unique()))*100

agedemo.rename(columns = {"SN_x":"Total Count","SN_y":"Percentage of Players"},inplace=True)

agedemo = agedemo.style.format({
    "Percentage of Players":"{:0,.2f}%"
})

agedemo
Out[7]:
Total Count Percentage of Players
Age Range
<10 17 2.95%
10-14 22 3.82%
15-19 107 18.58%
20-24 258 44.79%
25-29 77 13.37%
30-34 52 9.03%
35-39 31 5.38%
40+ 12 2.08%
In [8]:
PC = game.groupby(["Age Range"])[["Purchase ID"]].count()
APP = game.groupby(["Age Range"])[["Price"]].mean()
TPV = game.groupby(["Age Range"])[["Price"]].sum()
personz = game.groupby(["Age Range"])[["SN"]].nunique()

ultima = pd.merge(PC,APP,on=["Age Range"])
ultima = pd.merge(ultima,TPV,on=["Age Range"])
ultima = pd.merge(ultima,personz,on=["Age Range"])
ultima["SN"] = ultima["Price_y"]/ultima["SN"]

ultima.rename(columns = {"Purchase ID":"Purchase Count","Price_x":"Average Purchase Price","Price_y":"Total Purchase Value","SN":"Avg Total Purchase per Person"},inplace=True)

ultima = ultima.style.format({
    "Average Purchase Price":"${:20,.2f}",
    "Total Purchase Value":"${:20,.2f}",
    "Avg Total Purchase per Person":"${:20,.2f}"
})

ultima
Out[8]:
Purchase Count Average Purchase Price Total Purchase Value Avg Total Purchase per Person
Age Range
<10 23 $ 3.35 $ 77.13 $ 4.54
10-14 28 $ 2.96 $ 82.78 $ 3.76
15-19 136 $ 3.04 $ 412.89 $ 3.86
20-24 365 $ 3.05 $ 1,114.06 $ 4.32
25-29 101 $ 2.90 $ 293.00 $ 3.81
30-34 73 $ 2.93 $ 214.00 $ 4.12
35-39 41 $ 3.60 $ 147.67 $ 4.76
40+ 13 $ 2.94 $ 38.24 $ 3.19
In [9]:
spenderzC = game.groupby(["SN"])[["Purchase ID"]].count()
spenderzS = game.groupby(["SN"])[["Price"]].mean()
spenderzM = game.groupby(["SN"])[["Price"]].sum()
spenderz_merge = pd.merge(spenderzC,spenderzS,on=["SN"])
spenderz_merge = pd.merge(spenderz_merge,spenderzM,on=["SN"])
spenderz_merge = spenderz_merge.rename(columns = {"Purchase ID":"Purchase Count","Price_x":"Average Purchase Price","Price_y":"Total Purchase Value"})
top5_spenderz = spenderz_merge.nlargest(5, "Total Purchase Value", keep='first')
top5_spenderz = top5_spenderz.style.format({
    "Average Purchase Price":"${:20,.2f}",
    "Total Purchase Value":"${:20,.2f}"
})
top5_spenderz
Out[9]:
Purchase Count Average Purchase Price Total Purchase Value
SN
Lisosia93 5 $ 3.79 $ 18.96
Idastidru52 4 $ 3.86 $ 15.45
Chamjask73 3 $ 4.61 $ 13.83
Iral74 4 $ 3.40 $ 13.62
Iskadarya95 3 $ 4.37 $ 13.10
In [10]:
top5itemsC = game.groupby(["Item ID","Item Name"])[["Purchase ID"]].count()
top5itemsM = game.groupby(["Item ID","Item Name"])[["Price"]].mean()
top5itemsS = game.groupby(["Item ID","Item Name"])[["Price"]].sum()
top5_merge = pd.merge(top5itemsC,top5itemsM,on=["Item ID","Item Name"])
top5_merge = pd.merge(top5_merge,top5itemsS,on=["Item ID","Item Name"])
top5_merge.rename(columns = {"Purchase ID":"Purchase Count","Price_x":"Item Price","Price_y":"Total Purchase Value"},inplace=True)
pop_items = top5_merge.sort_values(by=['Purchase Count'],ascending=False).head(5)
pop_items = pop_items.style.format({
    "Item Price":"${:20,.2f}",
    "Total Purchase Value":"${:20,.2f}",
})
pop_items
Out[10]:
Purchase Count Item Price Total Purchase Value
Item ID Item Name
178 Oathbreaker, Last Hope of the Breaking Storm 12 $ 4.23 $ 50.76
145 Fiery Glass Crusader 9 $ 4.58 $ 41.22
108 Extraction, Quickblade Of Trembling Hands 9 $ 3.53 $ 31.77
82 Nirvana 9 $ 4.90 $ 44.10
19 Pursuit, Cudgel of Necromancy 8 $ 1.02 $ 8.16
In [11]:
prof_items = top5_merge.sort_values(by=['Total Purchase Value'],ascending=False).head(5)
prof_items = prof_items.style.format({
    "Item Price":"${:20,.2f}",
    "Total Purchase Value":"${:20,.2f}",
})
prof_items
Out[11]:
Purchase Count Item Price Total Purchase Value
Item ID Item Name
178 Oathbreaker, Last Hope of the Breaking Storm 12 $ 4.23 $ 50.76
82 Nirvana 9 $ 4.90 $ 44.10
145 Fiery Glass Crusader 9 $ 4.58 $ 41.22
92 Final Critic 8 $ 4.88 $ 39.04
103 Singed Scalpel 8 $ 4.35 $ 34.80