Introduction to Me!

Hi, I’m Kaitlyn Straight. I’m a recent graduate from UC San Diego, and am excited to work hands-on with Business Analytics throughout this MSBA program! I am interested in the cosmetics industry, particularly suncare and dermatology, and hope to hone my skills in operations and supply chain management, as well as machine learning and portfolio management. I am from Northern California, and enjoy working out, reading, and ceremonial-grade matcha.

Academic Background

Professional Background

I recently concluded a Marketing & Analytics Internship with the Center for Community Energy, during which I managed social media content schedules, outreach to other nonprofits and organizations within the Clean Energy sector, and headed recruitment efforts. I performed analytics and created a marketing strategy to increase public engagement, supporting CCE’s mission to educate and pioneer sustainable energy solutions.

I also work part-time as a Shift Lead at Arteazen Cafe, where I manage inventory, onboarding, and aid in marketing as well as day-to-day function of the shop.

Experience with R

I have been programming with R for just over 1 year, having my first exposure to the language during my studies at UC San Diego in “Business Analytics” and “R for Social Sciences” courses. Prior to—and alongside—R, I have experience with Microsoft Excel, JavaScript, Python, SQL, and Tableau for visualization.

Part 2

Blood Transfusion Questions

  1. What are the dimensions of this data (number of rows and columns)?
    • What are the data types of each column?
# import data and the message print out will also tell you
# what the data types are
df <- readr::read_csv("C:\\Users\\kaitl\\Documents\\U Cincinnati\\Fall 2025\\BANA7025 Data Wrangling\\Module2\\blood_transfusion.csv")
## Rows: 748 Columns: 5
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): Class
## dbl (4): Recency, Frequency, Monetary, Time
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
  1. Are there any missing values?
sum(is.na(df))
## [1] 0
  1. What are the dimensions of this data? (Duplicate question)
dim(df)
## [1] 748   5
  1. Check out the first 10 rows
head(df, 10)
## # A tibble: 10 × 5
##    Recency Frequency Monetary  Time Class      
##      <dbl>     <dbl>    <dbl> <dbl> <chr>      
##  1       2        50    12500    98 donated    
##  2       0        13     3250    28 donated    
##  3       1        16     4000    35 donated    
##  4       2        20     5000    45 donated    
##  5       1        24     6000    77 not donated
##  6       4         4     1000     4 not donated
##  7       2         7     1750    14 donated    
##  8       1        12     3000    35 not donated
##  9       2         9     2250    22 donated    
## 10       5        46    11500    98 donated
  1. Check out the last 10 rows
tail(df, 10)
## # A tibble: 10 × 5
##    Recency Frequency Monetary  Time Class      
##      <dbl>     <dbl>    <dbl> <dbl> <chr>      
##  1      23         1      250    23 not donated
##  2      23         4     1000    52 not donated
##  3      23         1      250    23 not donated
##  4      23         7     1750    88 not donated
##  5      16         3      750    86 not donated
##  6      23         2      500    38 not donated
##  7      21         2      500    52 not donated
##  8      23         3      750    62 not donated
##  9      39         1      250    39 not donated
## 10      72         1      250    72 not donated
  1. Index for the 100th row and just the Monetary column. What is the value?
df[100, 'Monetary']
## # A tibble: 1 × 1
##   Monetary
##      <dbl>
## 1     1750
  1. Index for just the Monetary column. What is the mean of this vector?
mean(df[['Monetary']])
## [1] 1378.676
  1. Subset this data frame for all observations where Monetary is greater than the mean value. How many rows are in the resulting data frame?
above_avg <- df[['Monetary']] > mean(df[['Monetary']])

df[above_avg, 'Monetary']
## # A tibble: 267 × 1
##    Monetary
##       <dbl>
##  1    12500
##  2     3250
##  3     4000
##  4     5000
##  5     6000
##  6     1750
##  7     3000
##  8     2250
##  9    11500
## 10     5750
## # ℹ 257 more rows
sum(above_avg)
## [1] 267

Police Data Questions

  1. What are the dimensions of this data (number of rows and columns)?
df <- readr::read_csv("C:\\Users\\kaitl\\Documents\\U Cincinnati\\Fall 2025\\BANA7025 Data Wrangling\\Module2\\PDI__Police_Data_Initiative__Crime_Incidents.csv")
## Rows: 15155 Columns: 40
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (34): INSTANCEID, INCIDENT_NO, DATE_REPORTED, DATE_FROM, DATE_TO, CLSD, ...
## dbl  (6): UCR, LONGITUDE_X, LATITUDE_X, TOTALNUMBERVICTIMS, TOTALSUSPECTS, ZIP
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
  1. What are the dimensions of this data? (Duplicate question)
dim(df)
## [1] 15155    40
  1. Are there any missing data?
sum(is.na(df))
## [1] 95592

Definitely.

  1. If so, how many missing values are in each column?
colSums(is.na(df))
##                     INSTANCEID                    INCIDENT_NO 
##                              0                              0 
##                  DATE_REPORTED                      DATE_FROM 
##                              0                              2 
##                        DATE_TO                           CLSD 
##                              9                            545 
##                            UCR                            DST 
##                             10                              0 
##                           BEAT                        OFFENSE 
##                             28                             10 
##                       LOCATION                     THEFT_CODE 
##                              2                          10167 
##                          FLOOR                           SIDE 
##                          14127                          14120 
##                        OPENING                      HATE_BIAS 
##                          14508                              0 
##                      DAYOFWEEK                       RPT_AREA 
##                            423                            239 
##               CPD_NEIGHBORHOOD                        WEAPONS 
##                            249                              5 
##              DATE_OF_CLEARANCE                      HOUR_FROM 
##                           2613                              2 
##                        HOUR_TO                      ADDRESS_X 
##                              9                            148 
##                    LONGITUDE_X                     LATITUDE_X 
##                           1714                           1714 
##                     VICTIM_AGE                    VICTIM_RACE 
##                              0                           2192 
##               VICTIM_ETHNICITY                  VICTIM_GENDER 
##                           2192                           2192 
##                    SUSPECT_AGE                   SUSPECT_RACE 
##                              0                           7082 
##              SUSPECT_ETHNICITY                 SUSPECT_GENDER 
##                           7082                           7082 
##             TOTALNUMBERVICTIMS                  TOTALSUSPECTS 
##                             33                           7082 
##                      UCR_GROUP                            ZIP 
##                             10                              1 
## COMMUNITY_COUNCIL_NEIGHBORHOOD               SNA_NEIGHBORHOOD 
##                              0                              0
  1. Using the DATE_REPORTED column, what is the range of dates included in this data?
range(df[['DATE_REPORTED']])
## [1] "01/01/2022 01:08:00 AM" "06/26/2022 12:50:00 AM"
  1. Using table(), what is the most common age range for known SUSPECT_AGEs?
table(df[['SUSPECT_AGE']])
## 
##    18-25    26-30    31-40    41-50    51-60    61-70  OVER 70 UNDER 18 
##     1778     1126     1525      659      298      121       16      629 
##  UNKNOWN 
##     9003
  1. Use table() to get the number of incidents per zip code. Sort this table # for those zip codes with the most activity to the least activity.
sort(table(df['ZIP']), decreasing = TRUE)
## ZIP
## 45202 45205 45211 45238 45229 45219 45225 45214 45237 45223 45206 45220 45232 
##  2049  1110  1094   956   913   863   811   774   699   653   616   477   477 
## 45224 45209 45208 45204 45216 45227 45207 45203 45230 45213 45239 45226 45217 
##   429   380   359   348   302   286   245   226   214   190   169   112   100 
## 45221 45233 45212 45215 45231 45228 42502 45236 45244 45248  4523  5239 
##    90    77    61    47     7     5     3     3     3     3     2     1
  1. Using the DAYOFWEEK column, which day do most incidents occur on? What is the proportion of incidents that fall on this day?
table(df[['DAYOFWEEK']]) / sum(table(df[['DAYOFWEEK']]))
## 
##    FRIDAY    MONDAY  SATURDAY    SUNDAY  THURSDAY   TUESDAY WEDNESDAY 
## 0.1369807 0.1438365 0.1542221 0.1448547 0.1363019 0.1432935 0.1405105