Strommen Tutoring

Transcription

Strommen Tutoring
Strommen Tutoring
Final Presentation
May 3, 2013
Group #7
Ian Herbert
Link Doucedame
Ben Vibhagool
Marlen Knusel
Joncarlo Putman
Max Eady
Organization Overview.
Garrett Strommen President/Founder
Strommen Tutoring: private language
tutoring company
Los Angeles, CA
Founded 2009
2 full-time Employees
Over 70 contracted Teachers
Over 1,700 students
Clients include Sylvester Stallone’s
kids
Garrett Strommen
President/Founder
Organization Overview.
Provided Services:
Group Classes:
Recurring classes scheduled for certain times
in certain locations.
Private Tutoring:
One-on-one or small group tutoring.
Translation Services:
Translations for documents or books.
Project Goals.
Existing Database Support:
MySQL web database and PHP
back end
New Database Support:
Microsoft Access
Observe Company Operations
Track Company Transactions
Manage Marketing Campaigns
Analysis and Reporting
Project Progress.
DP 1
• Preliminary database design
• Simplified EER Diagram (25 entities)
• Familiarization with the Strommen
business model
DP 2
•
•
•
•
5 Queries conceptualized
EER expanded, a lot
Relational design schema developed
Relations implemented in Access
Project Progress.
DP 3
•
•
•
•
Major query revision
Complexities added with AMPL and sub-queries
Query implementation in SQL
Relations defined in database
Final Result
•
•
•
•
Queries implemented in Access
Practical forms and reports created
Relationships altered slightly
Normalization analysis
eer diagram.
eer diagram.
relational schema.
Relational Schema.
1. Person (PersonID, FName, LName, MInitial, Address, Phone, Email, Gender, BirthDate)
2. Prospect (ProspectID, PersonID1, ContactMethod, DateAdded)
3. EmployeeProspect (EmployeeProspectID, ProspectID2, YearsExperience, Skills, Position)
4. TeacherProspect (TeacherProspectID, ProspectID2, YearsExperience, Occupation)
5. ContractorProspect (ContractorProspectID, ProspectID2, YearsExperience, CompanyName ContractorType)
6. ClientProspect (ClientProspectID, ProspectID2, EventID17, ZipCode14)
7. Contractor (ContractorID, PersonID1, ContractorProspectID5, CompanyName, ContractorType)
8. Employee (EmployeeID, PersonID1, EmployeeProspectID3, Skills, Position, StartDate, Salary,
BankAccount)
9. Client (ClientID, PersonID1, EventID17, ClientProspectID6, ZipCode14, ReferredByID9)
10. Teacher (TeacherID, PersonID1, TeacherProspectID4)
11. TeacherEvaluation (TeacherEvaluationID, TeacherID10, ClientID9, TopicID21, EvaluationDate,TeacherRating, Comments)
12. Reward (RewardID, ClientID9, RewardType, Description, DateAwarded, Received)
13. Translation (TranslationID, InitialLanguage, FinalLanguage, ClientID9, EstCost, FinalCost, StartDate,FinishDate, TeacherID10,
ContractorID7)
14. ZipCode (ZipCode, City, Description, Latitude, Longtitude)
15. TimeSlot (TimeSlotID, TimeSlotDate, TimeSlotTime)
16. Campaign (CampaignID, CampaignName, StartDate, EndDate, Budget, EmployeeID8)
17. Event (EventID, CampaignID16, Date, Cost, Location, ZipCode14)
18. Bonus (BonusID, Amount, EmployeeID8, TeacherID10, DateEarned)
19. ContractJob (ContractJobID, ContractJobName, Description, EstCost, FinalCost, ContractorID7,StartDate, FinishDate)
20. ContractItem (ContractItemID, ContractJobID19, Description, EstHours, FinalHours, HourlyRate,EstCost, FinalCost)
Relational Schema Continued.
21. Topic (TopicID, TopicName, TopicType, Description)
22. Session (SessionID, SessionName, ExperienceLevel29, TopicID21, TeacherID10, ZipCode14, PrivateSessionID23, GroupClassID24)
23. PrivateSession (PrivateSessionID,TravelDistance, AtClientHome)
24. GroupClass (GroupClassID, Location, Capacity)
25. SessionMaterial (SessionMaterialID, SessionID22, MaterialName, Cost, Description, Required, Provided)
26. Transaction (TransactionID, Amount, OpenDate, CloseDate, Paid, WithdrawalID28, DepositID27)
27. Deposit (DepositID, SessionID22, TranslationID13, ClientID9)
28. Withdrawal (WithdrawalID, CampaignID16, BonusID18, SessionID22, TranslationID13, ContractJobID19, EmployeeID8)
29. ExperienceLevel (ExperienceLevelID, Level, Description)
30. Event_TimeSlot (EventID17, TimeSlotID15)
31. Session_Client (SessionID22, ClientID9)
32. Session_TimeSlot (SessionID22, TimeSlotID15)
33. Teacher_TimeSlot (TeacherID10, TimeSlotID15)
34. Teacher_Topic (TeacherID10, TopicID21)
35. Teacher_ZipCode (TeacherID10,ZipCodeID14)
36. TeacherProspect_Topic (TeacherProspectID4, TopicID21)
37. TeacherProspect_ZipCode (TeacherProspectID4, ZipCode14)
38. Client_Topic (ClientID9, TopicID21)
39. ClientProspect_Topic (ClientProspectID6, TopicID21)
Relationship Diagram.
normalization.
Normalization.
12. Reward (RewardID, ClientID9, RewardType, Description,
DateAwarded, Received)
Functional Dependencies
{RewardID}  {RewardType}
{RewardID, ClientID}  {DateAwarded, Received, Description}
Normalization.
1NF There are no multi-valued attributes.
Reward (RewardID, ClientID9, RewardType, Description,
DateAwarded, Received)
2NF & 3NF & BCNF
RewardType (RewardID, RewardType)
RewardInfo (RewardID, ClientID9, Description, DateAwarded,
Received)
Normalization.
25. SessionMaterial (SessionMaterialID, SessionID22,
MaterialName, Cost, Description, Required, Provided)
Functional Dependencies
{SessionMaterialID}{MaterialName}
{SessionMaterialID, SessionID} {Required, Provided}
{MaterialName} {Cost, Description}
Normalization.
1NF Currently in 1NF because there are no multi-valued
attributes.
SessionMaterial (SessionMaterialID, SessionID22,
MaterialName, Cost, Description, Required, Provided)
2NF Removes partial dependencies that non-prime attributes
have on the Candidate Key
SessionMaterial (SessionMaterialID, SessionID22, Required,
Provided)
Material (SessionMaterialID, MaterialName, Cost,
Description)
Normalization.
3NF Removes transitive dependency from Material Name
determining cost and description
SessionMaterial (SessionMaterialID, SessionID22, Required,
Provided)
Material (SessionMaterialID, MaterialName)
MaterialInfo (MaterialName, Cost, Description)
This is also in BCNF!
queries.
Query 1:
ROI for Marketing Campaigns
Objective: Determine the most cost effective
marketing campaigns and events in terms of
Return on Investment.
High ROI
Campaigns
?
?
Profitable Clients
Query 1:
ROI for Marketing Campaigns
Purpose: Marketing Campaigns with the
highest ROI are the most cost effective. ROI
analysis would allow Strommen Tutoring to
replicate the design of effective campaigns to
better target profitable clients.
Query 1:
ROI for Marketing Campaigns
Query: Select the name, cost, revenue, and ROI for
each Marketing Campaign.
Campaign Cost
Campaign
Campaign
Events
Net Profit
Events
Clients
Net Profit
Cost
Query 1:
ROI for Marketing Campaigns
SQL>
SELECT RevenueQuery.Campaign AS CampaignID, RevenueQuery.CampName AS CampaignName,
CostQuery.Cost AS TotalCost, RevenueQuery.Revenue AS TotalRevenue, IIF(TotalCost >0,
TotalRevenue*100 / TotalCost & "%",0 & "%") AS ROI
FROM (
SELECT c.CampaignID AS Campaign, c.CampaignName AS CampName,
IIF(SUM(dt.amount)>0, 0.3*SUM(dt.amount),0) AS Revenue
FROM Campaign AS c, Event AS e, Client AS cl, Session_Client AS sc, [Session] AS s,
(SELECT * FROM Deposit AS d, [Transaction] AS t1 WHERE
d.DepositID = t1.DepositID) AS dt
WHERE dt.Paid = TRUE AND c.CampaignID = e.CampaignID AND e.EventID = cl.EventID AND
cl.ClientID = sc.ClientID AND sc.SessionID = s.SessionID AND dt.SessionID =s.SessionID
AND dt.ClientID = cl.ClientID
GROUP BY c.CampaignID, c.CampaignName) AS RevenueQuery,
(SELECT c2.CampaignID AS Campaign, IIF(SUM(wt.Amount) > 0, SUM(wt.Amount), 0) AS Cost
FROM Campaign AS c2,
(SELECT * FROM Withdrawal AS w, [Transaction] AS t2 WHERE
w.WithdrawalID=t2.WithdrawalID) AS wt
WHERE wt.CampaignID = c2.CampaignID
GROUP BY c2.CampaignID) AS CostQuery
WHERE RevenueQuery.Campaign = CostQuery.Campaign
GROUP BY RevenueQuery.Campaign, RevenueQuery.CampName, CostQuery.Cost,
RevenueQuery.Revenue;
Query 1:
ROI for Marketing Campaigns
Results:
Query 2:
Optimal Teacher Assignment
Objective: Find the best-suited teacher for each
session not yet assigned a teacher based on
Teacher Rating, Zip Code, Availability and
Topic.
Query 2:
Optimal Teacher Assignment
Purpose: To reward the most
highly-rated
teachers by assigning them the most new clients,
while also providing the best possible first
impression of Strommen Tutoring.
Query 2:
Optimal Teacher Assignment
Query: Select a teacher for each session not yet
assigned a teacher that can teach for the entire
session and in the same zipcode. If there are
multiple feasible teachers, select the one with
the highest average teacher rating from teacher
evaluations.
Query 2:
Optimal Teacher Assignment
SQL>
SELECT FinalQuery.SuperSession AS SessionID, (SELECT TOP 1 FName & ' ' & LName FROM
Person p, Teacher t2, Session s2, Teacher_Topic tt2, Teacher_ZipCode tzc2 WHERE s2.SessionID
= FinalQuery.SuperSession AND FinalQuery.MaxRating = (SELECT AVG(te2.TeacherRating)
FROM TeacherEvaluation te2 WHERE te2.TeacherID = t2.TeacherID) AND tzc2.ZipCode =
s2.ZipCode AND tzc2.TeacherID = t2.TeacherID AND tt2.TeacherID = t2.TeacherID AND tt2.TopicID
= s2.TopicID AND p.PersonID = t2.PersonID ORDER BY t2.TeacherID ASC) AS TeacherName,
(SELECT TOP 1 t3.TeacherID FROM Teacher t3, Session s3, Teacher_Topic tt3, Teacher_ZipCode
tzc3 WHERE s3.SessionID = FinalQuery.SuperSession AND FinalQuery.MaxRating = (SELECT
AVG(te3.TeacherRating) FROM TeacherEvaluation te3 WHERE te3.TeacherID = t3.TeacherID)
AND tzc3.ZipCode = s3.ZipCode AND tzc3.TeacherID = t3.TeacherID AND tt3.TeacherID =
t3.TeacherID AND tt3.TopicID = s3.TopicID ORDER BY t3.TeacherID ASC) AS TeacherID
FROM (
SELECT SuperQuery.SubSession AS SuperSession, Max(SuperQuery.SubRating) AS MaxRating
FROM (SELECT SubQuery.Sessions AS SubSession, SubQuery.Teachers AS SubTeacher,
(SELECT Avg(te.TeacherRating) FROM TeacherEvaluation te WHERE te.TeacherID
=SubQuery.Teachers) AS SubRating FROM (SELECT s.SessionID AS Sessions, t.TeacherID AS
Teachers FROM Teacher AS t, [Session] AS s, Teacher_ZipCode AS tzc, Teacher_Topic AS tt
WHERE t.TeacherID = tzc.TeacherID AND tt.TopicID = s.TopicID AND tt.TeacherID = t.TeacherID
AND tzc.ZipCode = s.ZipCode AND s.TeacherID Is NULL AND (SELECT COUNT(*) FROM
Session_Timeslot AS sts2 WHERE sts2.SessionID = s.SessionID) = (SELECT COUNT(*) FROM
Session_TimeSlot AS sts, Teacher_TimeSlot AS tts WHERE t.TeacherID = tts.TeacherID AND
tts.TimeSlotID = sts.TimeSlotID AND sts.SessionID = s.SessionID )) AS SubQuery) AS
SuperQuery GROUP BY SuperQuery.SubSession) AS FinalQuery;
Query 2:
Optimal Teacher Assignment
Sessions without Teachers assigned
Query 2:
Optimal Teacher Assignment
Results
Query 3:
Reward Allocation System
Objective: Find clients who are eligible for
rewards and what rewards they are eligible for.
Query 3:
Reward Allocation System
Purpose: Rewards are a way to encourage
customer loyalty, through a variety of different
incentives that may appeal to the clients.
Rewards also draw new clients.
Query 3:
Reward Allocation System
Reward Types Examples
After 5 Sessions
Shirts
After 10 Sessions
Water Bottle
Every 10 Sessions
Sessions
Query 3:
Reward Allocation System
Query: For each client, determine the number of rewards
he/she is eligible for but has not yet been assigned.
n = # sessions a client has purchased
T Shirt
= 1 if n >= 5
0 otherwise
Water Bottle = 1 if n >= 10
0 otherwise
Sessions
= Floor(n / 10)
-
# of Each Reward
Already Assigned
Query 3:
Reward Allocation System
SQL>
SELECT Final.Client AS Client, (SELECT Fname & ' ' & LName FROM Person,Client WHERE Client.ClientID = Final.Client AND
Person.PersonID = Client.PersonID) AS ClientName, Final.WaterBottle, Final.TShirt, INT(ClientSCount/10) +RefCountFreeSCount AS EligibleFreeSession
FROM (
SELECT CountCalc.Client AS Client, RefCount, FreeSCount, ClientSCount, WaterBottle, TShirt
FROM (SELECT DISTINCT Refer.Client AS Client, Refer.RCount AS RefCount, IIF(ISNULL(Free.FCount),0,Free.FCount) AS
FreeSCount FROM (SELECT c1.ClientID AS Client, Count(*) AS RCount FROM Client AS c1, Client AS c2 WHERE
c1.ClientID=c2.ReferredByID GROUP BY c1.ClientID) AS Refer LEFT JOIN (SELECT DISTINCT r.ClientID AS Client,
Count(*) AS FCount FROM Reward AS r WHERE r.RewardType = 'Free Session' GROUP BY r.ClientID) AS Free ON
Refer.Client = Free.Client) AS CountCalc INNER JOIN (SELECT itemRe.Client, IIF((NeverWater > 0 AND ClientSCount >
10), 1 , 0) AS WaterBottle, IIF((NeverTShirt > 0 AND ClientSCount > 5), 1 , 0) AS TShirt, itemRe.ClientSCount FROM
(SELECT SesCount.Client
AS Client, ClientSCount, NeverWater, NeverTShirt FROM (SELECT DISTINCT ClientSessions.ClientID AS Client,
IIF(NOT EXISTS (SELECT r.ClientID FROM Reward AS r WHERE r.ClientID = ClientSessions.ClientID AND
RewardType = 'Water Bottle'), 1, 0) AS NeverWater, IIF(NOT EXISTS (SELECT r.ClientID FROM Reward AS r
WHERE r.ClientID = ClientSessions.ClientID AND
RewardType = 'T-Shirt') , 1, 0) AS NeverTShirt FROM (SELECT sc.ClientID AS ClientID FROM Client AS c INNER JOIN
Session_Client AS sc ON sc.ClientID = c.ClientID) AS ClientSessions) AS ItemCheck INNER JOIN (SELECT
ClientSessions.ClientID AS Client, Count(*) AS ClientSCount FROM (SELECT sc.ClientID AS ClientID FROM Client AS c
INNER JOIN Session_Client AS sc ON sc.ClientID = c.ClientID) AS ClientSessions GROUP BY ClientSessions.ClientID)
AS SesCount ON SesCount.Client = ItemCheck.Client) AS itemRe) AS ItemCalc ON CountCalc.Client = ItemCalc.Client)
AS Final;
Query 3:
Reward Allocation System
Results
Query 3:
Reward Allocation System
Form Application:
Click this Button!
Query 3:
Reward Allocation System
Query updates
the # of eligible
rewards to 0 for
each Reward
Type.
New Rewards are created in the
database using Visual Basic.
Query 4:
Monthly Session Process Control
Objective: Determine trends concerning the # of
sessions for different topics over the last 2 years.
Analyze the significance of outliers in the data
and actions to support or prevent these outliers.
Query 4:
Monthly Session Process Control
Purpose: Help target appropriate
markets at appropriate times. Adjust
hiring practices to seasonal trends.
Query 4:
Monthly Session Process Control
Query: For each topic for each month (for the
last 24 months) find the # of sessions provided
and the deviation from the average.
Query Results:
E[xi] = μ
Var[xi] = σ 2 / n
Deviation = xi – μ
for all i months for
each topic
Statistical Process Control:
X-Chart
μ ± 2σ/√n
Upper and Lower Control Limits
for 95% Probability Range
Query 4:
Monthly Session Process Control
SQL>
SELECT tc.TopicID, tc.TopicName, tc.Year, tc.Month, DateValue(tc.Month & "/1/" & tc.Year) AS ProcessDate, TopicCount,
AverageTopicCount, TopicCount - AverageTopicCount AS DeviationFromAverage, StandardDeviation AS SD, IIF(
StandardDeviation >0 And (DeviationFromAverage / StandardDeviation <= -2 OR DeviationFromAverage /
StandardDeviation >= 2), "Out Of Control", "In Control") AS Status
FROM (
SELECT t.TopicID AS TopicID, t.TopicName AS TopicName, Year(ts.TimeSlotDate) AS [Year], Month(ts.TimeSlotDate) AS
[Month], COUNT(s.SessionID) AS TopicCount
FROM Topic AS t, [Session] AS s, TimeSlot AS ts, Session_TimeSlot AS sts
WHERE sts.SessionID = s.SessionID AND s.TopicID = t.TopicID AND sts.TimeSlotID = ts.TimeSlotID AND
((Month(ts.TimeSlotDate) >= Month(Date()) AND Year(Date()) - Year(ts.TimeSlotDate) = 2) OR (Year(Date()) –
Year(ts.TimeSlotDate) < 2))
GROUP BY t.TopicID, t.TopicName, Year(ts.TimeSlotDate), Month(ts.TimeSlotDate)) AS tc
INNER JOIN (
SELECT TopicID, ROUND(Avg(TopicCount), 2) AS AverageTopicCount, ROUND(StDev(TopicCount),2) AS
StandardDeviation
FROM ((SELECT t.TopicID AS TopicID, Year(ts.TimeSlotDate) AS [Year], Month(ts.TimeSlotDate) AS [Month],
COUNT(s.SessionID) AS TopicCount
FROM Topic AS t, [Session] AS s, TimeSlot AS ts, Session_TimeSlot AS sts
WHERE sts.SessionID = s.SessionID AND s.TopicID = t.TopicID AND sts.TimeSlotID = ts.TimeSlotID AND
((Month(ts.TimeSlotDate) >= Month(Date()) AND Year(Date()) - Year(ts.TimeSlotDate) = 2) OR (Year(Date()) –
Year(ts.TimeSlotDate) < 2))
GROUP BY t.TopicID, Year(ts.TimeSlotDate), Month(ts.TimeSlotDate)) AS SubQuery)
GROUP BY TopicID) AS atc
ON tc.TopicID = atc.TopicID)
ORDER BY tc.TopicID, tc.Year DESC , tc.Month DESC;
Query 4:
Monthly Session Process Control
Results:
Query 4:
Monthly Session Process Control
Report Application:
Query 4:
Monthly Session Process Control
Report Application:
Query 5:
Optimal Class Location
Objective: Find the optimal location (zip
code) for future group classes based on the
number of current clients and prospective
clients who have expressed interest in the
topic in each zip code (Set Packing Problem)
Query 5:
Optimal Class Location
Purpose: Strommen Tutoring would like to
expand their group class services. Optimization
of class location will increase the probability of
high attendance (and profitability) by offering
classes in areas with more interested people.
Query 5:
Optimal Class Location
Goal: Choose Best Zipcode – Topic pairs that Maximize #
Interested Clients / Prospective Clients within a given radius
7
12
6
User Defined
Parameters:
3
4
9
12
8
- Radius
- # of Classes
Query 5:
Optimal Class Location
SQL>
SELECT UnionQuery.ZipCode AS ZipCode, UnionQuery.Topic AS Topic, UnionQuery.Latitude AS Latitude,
UnionQuery.Longitude AS Longitude, SUM(UnionQuery.NumberofClients) AS NumberofClients FROM (SELECT
SubQuery.ZipCode AS ZipCode, SubQuery.Topic AS Topic, SubQue
FROM (SELECT ry.Latitude AS Latitude,SubQuery.Longitude AS Longitude , COUNT(SubQuery.Client) AS
NumberofClients ZipCodeDistances.ZipCode AS ZipCode, ZipCodeDistances.Topic AS Topic,
ZipCodeDistances.Latitude AS Latitude, ZipCodeDistances.Longitude AS Longitude, ZipCodeDistances.Client AS
Client FROM (SELECT z1.ZipCode AS ZipCode, t1.TopicID AS Topic, z1.Latitude AS Latitude, z1.Longitude AS
Longitude, c1.ClientID AS Client FROM ZipCode AS z1, Topic AS t1, Client AS c1, Client_Topic AS ct WHERE
c1.ZipCode = z1.ZipCode AND ct.TopicID = t1.TopicID AND ct.ClientID = c1.ClientID) AS ZipCodeDistances) AS
SubQuery GROUP BY SubQuery.ZipCode, SubQuery.Topic, SubQuery.Latitude, SubQuery.Longitude UNION
SELECT SubQuery2.ZipCode AS ZipCode, SubQuery2.Topic AS Topic, SubQuery2.Latitude AS Latitude,
SubQuery2.Longitude AS Longitude, COUNT(SubQuery2.ClientProspect) AS NumberofClients FROM( SELECT
ZipCodeDistances2.ZipCode AS ZipCode, ZipCodeDistances2.Topic AS Topic, ZipCodeDistances2.Latitude AS
Latitude, ZipCodeDistances2.Longitude AS Longitude, ZipCodeDistances2.ClientProspect AS ClientProspect FROM
(SELECT z3.ZipCode AS ZipCode, t2.TopicID AS Topic, z3.Latitude AS Latitude, z3.Longitude AS Longitude,
cp1.ClientProspectID AS ClientProspect FROM ZipCode AS z3, Topic AS t2, ClientProspect AS cp1,
ClientProspect_Topic AS cpt WHERE cp1.ZipCode = z3.ZipCode AND cpt.TopicID = t2.TopicID AND
cpt.ClientProspectID = cp1.ClientProspectID AND NOT EXISTS(SELECT * FROM Client AS c3 WHERE
c3.ClientProspectID = cp1.ClientProspectID)) AS ZipCodeDistances2) AS SubQuery2 GROUP BY
SubQuery2.ZipCode, SubQuery2.Topic, SubQuery2.Latitude, SubQuery2.Longitude) AS UnionQuery
GROUP BY UnionQuery.ZipCode, UnionQuery.Topic, UnionQuery.Latitude, UnionQuery.Longitude
ORDER BY SUM(UnionQuery.NumberofClients) DESC;
Query 5:
Optimal Class Location
Results (Access)
Query 5:
Optimal Class Location
spherical distance formula.
linear program variables.
Query 5:
Optimal Class Location
linear program formulation.
Query 5:
Optimal Class Location
Formulation of LP in AMPL
model file.
data file.
Query 5:
Optimal Class Location
Results (AMPL)
optimal solution output
user interface.
Report: Prospective Clients List
Report: Pending Transactions
Form: Teacher Annual
Performance Report
Form: New Person
questions?.

Similar documents

East Cobber

East Cobber July 2-6* - Holiday Hullaballoo (*NO camp July 4th) July 9-13 - Myths and Legends

More information