<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[3rd corner - Medium]]></title>
        <description><![CDATA[We provide services for clients interested in the intersection of experience design, data analytics &amp; strategic management. - Medium]]></description>
        <link>https://medium.com/3rd-corner?source=rss----aeec2ab6726d---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>3rd corner - Medium</title>
            <link>https://medium.com/3rd-corner?source=rss----aeec2ab6726d---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 16:09:55 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/3rd-corner" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Frameworks for Design Research in Diverse Scenarios]]></title>
            <link>https://medium.com/3rd-corner/frameworks-for-design-research-in-diverse-scenarios-8fe1c88b0a7b?source=rss----aeec2ab6726d---4</link>
            <guid isPermaLink="false">https://medium.com/p/8fe1c88b0a7b</guid>
            <category><![CDATA[user-research]]></category>
            <category><![CDATA[design-process]]></category>
            <category><![CDATA[design-research]]></category>
            <category><![CDATA[research]]></category>
            <category><![CDATA[multidisciplinary]]></category>
            <dc:creator><![CDATA[Julian Jordan]]></dc:creator>
            <pubDate>Thu, 27 Oct 2022 23:06:29 GMT</pubDate>
            <atom:updated>2022-10-27T23:06:54.596Z</atom:updated>
            <content:encoded><![CDATA[<p>A reference, not to determine, but to inspire and guide decisions</p><p>Frameworks and templates should not simply be looked to for pre-baked, ready-to-go answers.</p><p>Their value lies in their ability to inspire and/or stimulate us:</p><ul><li>to remember what we have forgotten</li><li>to make new connections and apply what we know towards a vision;</li><li>to seek out ways to fill gaps in our knowledge</li></ul><p>I recently was speaking with a designer and a researcher who were struggling to convince their team to engage in extensive, in-depth qualitative interviews. The cross-functional team was hesitant because of the time investment. Part of our chat went something like the following.</p><p>I asked — <em>“why do you think you should dive into a lot of qualitative interviews?”</em></p><p>They responded — <em>“because we need to do some needfinding to understand the users, it’s the beginning of the project…”</em></p><p>I asked — <em>“you believe you don’t understand the users enough? Do you have a sense for what problems you might be solving for? Are they the right problems? Are there no explicit problems to solve?</em></p><p>Silence. For a bit. Then we had a great conversation about what the team knew and didn’t know, blindspots, the reason the new project had been created, what success meant, etc.</p><p>The duo was not completely wrong in their instinct to jump into interviews. At the same time, our back and forth conversation served as a good reminder of something important. Good research methods (and their correct execution) are essential to problem solving, but trying to implement them without first thinking critically about the challenge at hand and how best to build towards relevant findings can result in a reluctant team, or worse, a waste of time.</p><p>It is important to think critically about why we research at all and the phase of the product we are researching.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*RTyp0Q8yQ5cF8LDhe5WUUg.jpeg" /></figure><p>Sometimes <em>thinking critically</em> is not as easy as it sounds when dealing with the pressures of a fast-paced environment where “we don’t have time for deep research” and “we need to ship yesterday” mindsets prevail. I have several thoughts on the deep research vs. delivery speed debate, but I will save that for another post. Here, I share some frameworks that can help support the conversations and critical thinking that guide decisions about research approaches.</p><p>The frameworks present a variety of approaches (sometimes we forget what is out there). More importantly, they nudge one to consider a research approach within the context of product phases, needs, goals and timeframes. Basic usage of the frameworks could be to simply use them as reminders of when a given approach might be useful. Better usage would be to leverage them to jump start critical questions like “What do I want to know?”, “How will I know when I’ve learned it?”, “What decisions or actions will this knowledge enable?”. With these questions in hand, one can again look to the frameworks to reflect on which approaches, or which elements of them, will best lead to achieving the goal at hand. I created these frameworks some time ago and have used different versions of them over time.</p><p><strong>This first framework</strong> presents research approaches across a fidelity spectrum while also matching these approaches to a given product’s maturity. Product maturity (vertical axis, left) is relatively straightforward — as a product / service spends more time in the market and collects more users, its goals, and thus its research needs, often change as well. Fidelity (horizontal axis, top) refers to the <em>technical implementation complexity</em> of a given research approach. More than just a synonym for “execution time”, implementation complexity conveys the point that some research approaches require more advanced artifacts, sophisticated coding / sensing tools, or quantitative modeling, all of which stretch complexity. I don’t mean to imply that “Card-sorting, Co-creation” always take less time than “Resonance tests with Max-diff, Conjoint analysis”, but while the former can be implemented with tools in hand, the latter more likely requires coding or purchasing dynamic surveys.</p><p>The resulting framework offers a matrix that stimulates reflection about where one is in the product cycle, one’s technical capacity and, above all, what one’s research goals are and how they might be reached.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4ZHwx1yTXkJuXqtCUecAmw.jpeg" /></figure><p><strong>This second framework</strong> puts a twist on the first by explicitly introducing the element of time constraints. A former design professor of mine used to assign projects with an initial timeframe but before the end of the class he would cut this timeframe in half. It was a forcing mechanism that pushed me and other students to think about what was essential to the project and how to go about obtaining optimal impact and learning. It was a great exercise. I used it as inspiration for this second framework which presents a number of approaches to address two research goals while considering time constraints and product maturity. While it can serve as a “quick reference menu” in a time crunch, I mainly appreciate how it encourages a reflection of how different approaches can expand or condense into others to reach a given goal when time is a factor.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*41o1FlvWirxmfOAbsTekGA.jpeg" /></figure><p>The above content is not earth-shattering, but I have found it extremely useful when leading teams or in my own work. In my experience, it engages multidisciplinary teams and enhances the conceptualization, planning, and communication of design research. The reality is that in different contexts, for different reasons, a clean line from goals/questions to approach does not always exist. Instead, something of an iterative dance takes hold — from goals to approach and from approach to implied goals — and it moves the researchers (and their teams) towards crystalizing what it is they really want to accomplish and how. In the case of the duo mentioned above, it stimulated rich thinking around their main questions and goals and reminded them of a simple but helpful point: <em>deep thinking about key research goals and questions should come first and shape one’s chosen research approach, but it never hurts to have some approaches in mind or on the table.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8fe1c88b0a7b" width="1" height="1" alt=""><hr><p><a href="https://medium.com/3rd-corner/frameworks-for-design-research-in-diverse-scenarios-8fe1c88b0a7b">Frameworks for Design Research in Diverse Scenarios</a> was originally published in <a href="https://medium.com/3rd-corner">3rd corner</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[World Cup 2018 Clustering Analysis]]></title>
            <link>https://medium.com/3rd-corner/world-cup-2018-clustering-analysis-7db563aa8b66?source=rss----aeec2ab6726d---4</link>
            <guid isPermaLink="false">https://medium.com/p/7db563aa8b66</guid>
            <category><![CDATA[sports-statistics]]></category>
            <category><![CDATA[world-cup]]></category>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[python-programming]]></category>
            <dc:creator><![CDATA[Julian Jordan]]></dc:creator>
            <pubDate>Tue, 28 Dec 2021 15:30:13 GMT</pubDate>
            <atom:updated>2021-12-28T16:45:33.458Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vWv0MGk1JV2HWfgI_MvzMg.jpeg" /><figcaption>Clustering communicated via a sieve metaphor</figcaption></figure><h4>In search of clusters and patterns within team data from the world&#39;s greatest tournament using unsupervised machine learning</h4><p>As a design researcher with experience applying qualitative and quantitative approaches, I like blending the worlds of design and data science where I can. Over the last six months I decided to return to studying Python. I am not a refined nor expert programmer by any means, but I enjoy learning Python to better collaborate with data scientists and to perform my own personal and professional analyses. In this article I share the thinking and coding process I used to run an unsupervised clustering algorithm on teams from the 2018 World Cup.</p><p>Football (soccer, in the USA where I grew up) has always been a part of my life — I played organized soccer from kindergarten until graduating from college. Every four years the World Cup produces my <strong>favorite</strong> <strong>30 days</strong> of sport full of interesting data. So when I found a dataset for the 2018 World Cup, I was eager to dive in and test my evolution as a Python beginner. At a high level, I wanted to perform a clustering analysis using average team stats as variables. What would I find? Perhaps teams would cluster by “style of play”, by region, or something else. I used Google Colab, a Google Research product that is a hosted Jupyter notebook service allowing anybody to write and execute arbitrary Python code through a browser. It’s dope.</p><p>The dataset I used was from<strong> </strong><a href="https://gitlab.com/djh_or/2018-world-cup-stats/blob/master/world_cup_2018_stats.csv"><strong>a cool person called DH</strong></a><strong>. </strong>I downloaded the csv and then uploaded it into Colab to get started. <em>Improvement Note: arguably a more efficient way to do this would be to insert the url of the file directly into my Python script with a df =pd.read_csv(url).</em></p><h3>Outline of Objective</h3><ol><li>explore data; clean and preprocess features needed for clustering</li><li>run k-means clustering algorithm to see what clusters emerge <strong>(note to reader: jump here if you just want to see clustering output + analysis)</strong></li><li>create 2x2 visualizations to see how different teams/clusters compare</li></ol><h3>(1) Exploring, Cleaning, Preprocessing</h3><h4>🗃 (1A) Importing Data, Initial Looks and Adjustments</h4><p>First, I import the data.</p><pre>#import the necessary libraries and the data<br>import numpy as np<br>import seaborn as sns<br>from google.colab import files<br>import io<br>import pandas as pd<br>data = files.upload()<br>import warnings<br>warnings.filterwarnings(‘ignore’)</pre><p>The above prompts me to upload the csv file and I do so with the line of code displayed below. This pulls the data in as a pandas dataframe (think of a dataframe as an excel table).</p><pre>df=pd.read_csv(“world_cup_2018_stats.csv”)</pre><p>To look at the first and last rows of the dataframe(df) I use the <em>.head()</em> and <em>.tail() </em>functions.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*5wEdcOsaOcYl7gnd" /></figure><p><strong>What I see:</strong></p><ul><li>each game is represented by 2 rows of stats — one row for each team that played (thus, there are 128 rows for the 64 World Cup games)</li><li>“Group” column shows at what tournament stage a given game occurred</li></ul><p><strong>What I do:</strong></p><ul><li>I like having the option to investigate aggregate differences between tournament stages, so I create a simple dataframe which shows each team and the most advanced tournament stage that team reached</li><li>I filter the original dataframe based on stage (“Group” column) to see which teams got to which stages (Group, Round of 16, Quarterfinals, Semifinals/Final).</li><li>I create a new dataframe matching each team to its latest stage</li></ul><p><strong>Here is the code I used for filtering:</strong></p><pre>dfrsixteen = df.loc[df[‘Group’] == “Round of 16”,:]<br>dfquarter = df.loc[df[‘Group’] == “Quarter-finals”,:]<br>dfsemi = df.loc[df[‘Group’] == “Semi-finals”,:]</pre><p><strong>I then use what this filtering code produced to create a new dataframe, <em>dfround</em>, for potential use later on.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*GJC4IrlDq7IviN0N" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/856/1*i8106tT7asOJfh_T4CtbcA.png" /><figcaption>Simple output of the new dataframe, dfround</figcaption></figure><h4>👾 (1B) Exploring the Main Dataset</h4><p>I use <em>df.info()</em> to see what data types I have. I do this because k-means clustering only works with numeric data and I want to see if I need to convert any data types.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*jT7nHe7HgxjLWyYU" /></figure><p>The variables I will want to use are integers. &quot;Pen Shootouts&quot; are <em>floats</em> and &quot;Group&quot;, &quot;Team&quot;, &quot;WDL&quot; are <em>objects. </em>I will remove these for clustering.</p><p>Then I use <em>df.describe().transpose()</em> to see a summary of the distribution of all numeric data.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*rJ8dFAiaH_-8GCS0" /></figure><p>In general, I see expressive standard deviations, given each variable&#39;s max and min, as well as relevant quartile values. For many variables there is a nice difference between min and max values — this is good. What would <strong><em>not</em></strong> be good is if there was not much distance between max and min values (as would be the case if a variable only had values like 1,2,3). Because k-means is a distance-based algorithm, it is preferable to have variables which have expressive differences (not 1,2,3) and are continuous.</p><p><strong>To decide which variables I&#39;ll want to isolate for clustering later on I ask three questions:</strong></p><ul><li>which variables will best differentiate teams?</li><li>which variables are more descriptive of how a team plays?</li><li>which variables have an expressive range of values?</li></ul><p><strong>I settle on the following list of variables:</strong><br><em>‘Goals For’, ‘Goals Against’, ‘Attempts’, ‘On-Target’,’Blocked’, ‘Woodwork’, ‘Corners’, ‘Offsides’, ‘Ball possession %’, ‘Pass Accuracy %’, ‘Passes’, <br>‘Distance Covered km’, ‘Balls recovered’, ‘Tackles’, ‘Blocks’, ‘Clearances’, ‘Yellow cards’, ‘Red Cards’, ‘Fouls Committed’</em></p><h4>🔩 (1C) Dataframe Manipulation</h4><p>I choose to <strong>create a team-based view of the data</strong> in order to more clearly compare teams. Essentially, I want to calculate a given team’s average game stats based on all the games that said team played. The downside to this: since not all teams played the same amount of games, the average stats of teams that went further in the Cup will consider more data. But since I already don’t have that much data to work with and since I don&#39;t want to overcomplicate things, I decide to accept that inefficiency.</p><p>I create a new dataframe with a team-based view using the following code.</p><pre>df_teamsort1 = df.sort_values([“Team”], ascending=True)</pre><p><em>Improvement Note: with variable names it is usually preferred to not use numbers, so &quot;df_team_sorted&quot; might have been better than what I chose above.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Ki-xjUn_BIWyshia" /><figcaption>Note: I only show part of the output here as there are still a lot variables that are off-screen to the right</figcaption></figure><p>This team-based view is interesting not only because it moves me closer to comparing and clustering teams, but also because, if I want, I can see what each team does over the course of the Cup.</p><p>Next, I officially <strong>select the variables that I want to use for clustering.</strong></p><pre>#selecting variable for clustering (minus Group, Team, WDL)</pre><pre>df_teamsort1_redux = df_teamsort1[[‘Group’,’Team’, ‘WDL’,’Goals For’, ‘Goals Against’, ‘Attempts’, ‘On-Target’,’Blocked’, ‘Woodwork’, ‘Corners’, ‘Offsides’, ‘Ball possession %’,’Pass Accuracy %’, ‘Passes’, ‘Distance Covered km’,’Balls recovered’, ‘Tackles’,’Blocks’, ‘Clearances’, ‘Yellow cards’,’Red Cards’, ‘Fouls Committed’,]]</pre><p><strong>I need to rename certain columns </strong>so they are amenable to potential manipulation later on. For example, if I want to filter or execute operations on a column like <em>“Pass Accuracy %” </em>Python may very well give me syntax errors because of the spaces and symbols. So, I change <em>“Pass Accuracy %”</em> to <em>“Pass_Accuracy_pct”</em>.</p><pre>#renaming columns</pre><pre>df_teamsort1_redux.columns = [‘Group’, ‘Team’, ‘WDL’, ‘Goals_For’, ‘Goals_Against’, ‘Attempts’, ‘On_Target’,’Blocked’, ‘Woodwork’, ‘Corners’, ‘Offsides’, ‘Possession_pct’,’Pass_Accuracy_pct’, ‘Passes’, ‘Distance_km’, ‘Balls_recovered’,’Tackles’, ‘Blocks’, ‘Clearances’, ‘Yellows’, ‘Reds’, ‘Fouls’]</pre><p><em>Improvement Note: this line of code is long and hardcoded parameters can block future code flexibility and expansion. I could have used a list to solve this with something like the following</em></p><p><em>variables_of_interest = [&#39;Group&#39;, ….]<br>df_teamsort1_redux = [variables_of_interest]</em></p><p>I also <strong>perform some operations / add new columns</strong> that will be useful for clustering. First, I create a <em>“Goals_delta”</em> variable which gives me, per game, goals a team scored minus goals a team allowed. This tells more of the story per game (and per team) than simply how many goals a team scored. Second, I create a <em>“On_target_pct”</em> variable, which is nice for k-means because percentages are continuous variables. I set this variable&#39;s type to integer (intuitively this should be a float, but for some odd reason the first time I executed the code I got a type error, one that went away after converting its type to integer. Anyway, onward).</p><pre>df_teamsort1_redux[‘Goals_delta’] = <br>(df_teamsort1_redux[‘Goals_For’] - df_teamsort1_redux[‘Goals_Against’])<br> <br>df_teamsort1_redux[‘On_target_pct’] = <br>(df_teamsort1_redux[‘On_Target’] / df_teamsort1_redux[‘Attempts’])*100<br> <br>df_teamsort1_redux[‘On_target_pct’] = df_teamsort1_redux[‘On_target_pct’].astype(int)</pre><h4>🍩😐 (1D) Normalizing Data</h4><p>The next steps are noteworthy because I <strong>aggregate and normalize the data</strong>, making operations less painful going forward.</p><p>First, I take the variables (columns) that I want to use for clustering and turn them into <em>one</em> variable, <em>columnslist_normalized</em>. This is efficient because I can drop this one variable into future functions as well as use it to alter all the cluster-relevant columns in just one place.</p><pre>columnslist_normalized = [‘Goals_For’, ‘Goals_Against’, ‘Attempts’,<br>‘On_Target’, ‘Blocked’, ‘Woodwork’, ‘Corners’, ‘Offsides’,<br>‘Possession_pct’, ‘Pass_Accuracy_pct’, ‘Passes’, ‘Distance_km’,<br>‘Balls_recovered’, ‘Tackles’, ‘Blocks’, ‘Clearances’, ‘Yellows’, ‘Reds’,‘Fouls’, ‘Goals_delta’, ‘On_target_pct’]</pre><p>I put this new variable, <em>columnslist_normalized</em>, to use when I create <em>df_teamavg</em>, a new dataframe that will house average (mean) stats for each team. Here, I use the <em>groupby</em> function in order to pull all stats for a given team into one row.</p><pre>df_teamavg = df_teamsort1_redux.groupby(‘Team’, as_index=False)</pre><pre>[columnslist_normalized].mean()</pre><p><em>Process note: I create new dataframes (or copies) throughout my work as it helps me keep track of the progression of my data transformations. For me, it makes step-by-step issue diagnosis easier.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*f99QjBRF5qfcqzHw6QlHww.png" /><figcaption>Note: the above copy/paste job from Colab shows all mean variables for only 9 teams just to give a general sense of the transformed data</figcaption></figure><p><strong>What I see:</strong></p><ul><li>the variables have different ranges and scales</li></ul><p><strong>What I want to do:</strong></p><ul><li>remove this variation and make the variables more comparable. This calls for <strong>normalization,</strong> the act of rescaling data so that all values are within a new, comparable range of 0–1.</li></ul><p><a href="https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering">This post</a> helps to explain why normalization is relevant for k-means - it helps avoid implicit, unwanted variable weighting which could impact clustering.</p><p>To <strong>execute normalization</strong> I use the scikit-learn class <em>MinMaxScaler</em>. When one instantiates a class like <em>MinMaxScaler, </em>said class transforms into an object.</p><p>SAY WHAT?</p><p>Think of scikit-learn as a “library” with a bunch of “books” (classes). When these &quot;books&quot; are “opened” (instantiated into objects) one can put &quot;ideas and info&quot; (data) into them. Then one can do cool things with said data. So, we are going to pull <em>MinMaxScaler</em> from scikit-learn, instantiate <em>MinMaxScaler</em> and then put some data into <em>MinMaxScaler </em>so that it (<em>MinMaxScaler</em>) can do its thing with said data.</p><p>When we put a variable (the data from a column) into <em>MinMaxScaler,</em> it takes each value in that column, subtracts the min value of the column and then divides by the range.</p><p>y = (x - min) /(max - min)</p><p>From my research, a favorable trait of <em>MinMaxScaler</em> is that although it scales the values to the 0–1 range, it doesn&#39;t mess with the variable itself too much, meaning it preserves the shape of the original distribution.</p><p>Below, I show that once <em>MinMaxScaler </em>is defined, I call the <em>fit_transform()</em> function and use it on my main dataset (x) to create a <em>transformed</em> version of my main dataset (x_scaled).</p><pre><strong>#import preprocessing, object housing MinMaxScaler</strong><br>from sklearn import preprocessing </pre><pre><strong>#take desired columns from df_teamavg, convert the df to a numpy array with .values method and store it as a variable, x</strong><br>x = df_teamavg[columnslist_normalized].values <br> <br><strong>#define a MinMaxScaler instance with default hyperparameters and store it as a variable, scaler</strong><br>scaler = preprocessing.MinMaxScaler()<br> <br><strong>#call fit_transform() function and pass it to my dataset, x, to create a transformed version of the dataset, which will be x_scaled</strong><br>x_scaled = scaler.fit_transform(x)<br><br><strong>#convert dataset x_scaled, still a numpy array, back to a pandas DataFrame, X_norm, so I can keep rocking with it</strong> <br>X_norm = pd.DataFrame(x_scaled)<br><br><strong>#make a copy of original df_teamavg because I dont want to “back-modify” it</strong> <br>df_teamavg_normalized = df_teamavg.copy() <br><br><strong>#take X_norm DataFrame (which has all the nice normalized data) and “pass” its data to the recently-made df_teamavg_normalized, only inserting the numeric data </strong><br>df_teamavg_normalized[columnslist_normalized] = X_norm<br><br><strong>#since X_norm and df_teamavg_normalized[columnslist_normalized] have the same dimensions they fit together<br>#I regain the Team column via df_teamavg_normalized</strong></pre><p>Normalized Output:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Dil13ilj3uK-IE5h6hiz-g.png" /></figure><p><em>Improvement Note: a friend and expert data scientist told me that the above bit of code is somewhat complex and arguably should be a function — one with inputs (the original DataFrame and columns to be transformed) and an output (the new DataFrame). I havent done that yet, clearly, but i&#39;ll get there :)</em></p><h3>(2) Running the K-means Algorithm</h3><h4>👷🏾 (2A) The Coding of K-means</h4><p>Now I run the k-means algorithm on the normalized data. First, a quick attempt at explaining some of the terminology and code below (thanks to a friend&#39;s &quot;cookie&quot; analogy).</p><p>kmeans = an object, think of it as a “cookie with certain magical traits”<br>KMeans = a class, think of it as a “cookie maker” or a “factory of different types of kmeans cookies”</p><pre>import sklearn.cluster as cluster</pre><pre><strong>#make a kmeans “cookie” from the KMeans “factory” and instantiate it/give it attributes of 4 clusters (n_clusters=k)</strong><br>kmeans = cluster.KMeans(n_clusters=4,init=’k-means++’,max_iter=100,random_state=22)<br> <br><strong>#fit my input data to the kmeans model<br></strong>kmeans = kmeans.fit(df_teamavg_normalized[columnslist_normalized]) </pre><pre><strong>#get cluster labels based on how the model groups my data (my teams, based on their average stats)</strong><br>labels = kmeans.predict(df_teamavg_normalized[columnslist_normalized])</pre><p>I could have also done the above by writing the following code,</p><pre>kmeans = cluster.KMeans(n_clusters=4).fit(df_teamavg_normalized[columnslist_normalized])</pre><p>, but I wanted to break it into step-by-step parts to make sure I was following what was going on <em>and</em> so that I could explain it to others more easily.</p><p><strong><em>Important Note on my choosing 4 clusters:</em></strong><em> there are several methods available to estimate the optimal number of clusters. The </em><a href="https://en.wikipedia.org/wiki/Elbow_method_(clustering)"><em>elbow</em></a><em> and silhouette methods are most common. While not perfect, they are good a starting point and sanity check when used in conjunction with subject matter knowledge and project goals. I have executed both methods in other situations, but I elected not to get into the details here as it was not my main focus. Here, I chose 4 clusters because I felt that more that 4 would make analysis confusing and spread the data too thin. Additionally, 4 is half the number of tournament groups (8) and also potentially forces interesting pattern finding among the 6 FIFA continental zones that participate in the tournament.</em></p><p>I now add a column called <em>“Cluster”</em> to my dataframe. <em>“Cluster” </em>is going to populate the dataframe with the clusters that the kmeans algorithm assigned to each team (recall &quot;labels&quot; from the code snippet above). For visualization purposes I use the <em>.pop()</em> function to move the cluster labels to the start (the left) of the dataframe, next to the <em>“Team” </em>column. Then I sort by cluster.</p><pre>df_teamavg_normalized[‘Cluster’] = kmeans.labels_</pre><pre>first_column = df_teamavg_normalized.pop(‘Cluster’)</pre><pre><strong>#insert column using insert(position,column_name,first_column) <br></strong>df_teamavg_normalized.insert(1, ‘Cluster’, first_column)</pre><pre>df_teamavg_normalized = df_teamavg_normalized.sort_values([‘Cluster’], ascending=True)</pre><p><strong>A view of the output</strong>:<strong> </strong>the normalized average stats of each team and their assigned k-means clusters</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*w651TFKtWH4oDcaB" /><figcaption>Fruit of the transformations and k-means process — normalized average stats of each team and their assigned k-means cluster (second column)</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/818/1*qLBlhzpaKK-7gaqk-EkaBA.png" /><figcaption>Because there are 30 teams and still lots of variables, I quickly transferred some of the data to excel to facilitate visualizations.</figcaption></figure><p><strong>A last adjustment</strong> before analyzing the clusters - I want to be able to see each team, and its cluster, connected to the the non-normalized data (which is easier to interpret) in addition to the normalized data. The normalized data served its purpose in that it made clustering easier, but analyzing differences between clusters and drawing conclusions will be easier with the original, non-normalized data. To do this, I create a new, small dataframe that I can &quot;attach&quot; to the front of the non-normalized stats. This new &quot;attachable&quot; dataframe is called <em>df_team_clusters</em>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*pbeVlo2TbuhlgNzZ" /></figure><p>I &quot;attach&quot;, or merge, the above dataframe (<em>df_team_clusters)</em> to my earlier dataframe of non-normalized stats <em>(df_teamavg) </em>to create <em>df_teamavg_withclusters</em></p><pre>df_teamavg_withclusters = <br>df_team_clusters.merge(df_teamavg, on=”Team”, how = ‘inner’)</pre><p><em>df_teamavg_withclusters</em> contains teams, their clusters and their average, non-normalized stats.</p><p>In order to get a look at the average stats of each cluster I use <em>grouby.()</em></p><pre>Cluster_StatsActual = df_teamavg_withclusters.groupby(‘Cluster’, as_index=False).mean()</pre><pre>Cluster_StatsActual</pre><p>Below I show (1) the clusters and their respective teams after some formatting in excel, and (2) the excel-modified output of Cluster_StatsActual, showing average stats per game for each cluster.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ywDi7IWhaVtCePCP5GWQGQ.png" /><figcaption>Clusters and their respective teams after some formatting in excel</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_EXPPQAt3FPHsTbr6BY8fw.png" /><figcaption>Excel-modified output of Cluster_StatsActual, showing average stats for each cluster</figcaption></figure><h4>🔮 (2B) Analyzing the Output</h4><p>Before visualizing the data, I want to address the clusters produced.</p><p><strong>Cluster 0 - &quot;target practice&quot; teams that clearly struggled most in the Cup</strong>:</p><ul><li>only one of its member teams, Denmark, got out of the Group stage</li><li>performed worst in stats related to goals (Attempts, On Target %, Corners)</li><li>always “on the defensive”, recording the most clearances, fouls, blocks</li></ul><p><strong>Cluster 1 - “powerhouses” with different journeys , unified by key stats:</strong></p><ul><li>score high in the “attractive football” categories — logging the most Possession, Passes, Attempts, and Corners</li><li>ran (distance_km) quite a bit, so we cant say they weren’t trying</li><li>didn&#39;t recover the ball very much (this could be because they had it more) and they were not as efficient with their chances as Cluster 2</li><li>do a lot of things better than field, but not enough to get to the Semis</li></ul><p><strong>Cluster 2 - “get it done” teams that advanced most and did well overall</strong></p><ul><li>didn&#39;t turn heads with “attractive football”, but put the ball in the net</li><li>ran hard, fouled hard, and recovered the ball well</li><li>on_Target_% and Goals_delta stats were tops - they were <em>mad</em> efficient</li><li>makes me wonder if Goals_delta was an overpowering variable</li></ul><p><strong>Cluster 3 - “good” teams that, by the stats, didn&#39;t do anything remarkable</strong></p><ul><li>achieved 2nd or 3rd place in all categories, which is not…&quot;bad&quot;</li><li>do not seem to like running</li><li>give up the most goals</li></ul><p><strong>There were a few things in the data that peaked my curiosity, made me wonder about the impact of outliers. <br>1)</strong> Who is pulling the distance_km stat up so high for Cluster 2?<br><strong>2) </strong>What were Sweden, Russia doing so well to get that far in the Cup?<br><strong>3) </strong>Did France, Croatia, Belgium really foul that much?</p><p>To quickly try to gain insight into these questions I filtered the dataframe to look at specific teams and compare them to the aggregate data. I used the following code to filter, for example.</p><pre>df_teamavg_withclusters[(df_teamavg_withclusters.Team == ‘Sweden’)| (df_teamavg_withclusters.Team == ‘Denmark’)|(df_teamavg_withclusters.Team == ‘Croatia’)|(df_teamavg_withclusters.Team == ‘France’)|(df_teamavg_withclusters.Team == ‘Russia’)]</pre><p><strong>Some answers to my above questions:<br>1) </strong>Russia and Croatia ran their assess off, averaging 125km and 118km per game, respectively. Russia, the host, punched above their weight throughoutt the Cup (likely due to being hopped up on excitement etc). Croatia just seemed to roll like that - they ran <em>all the time, </em>as was evidenced by their multiple come from behind wins. They really were the hard-working, cinderella of the tourney. France, the champion, actually ran much less that others, with 101km per game, on average.</p><p><strong>2)</strong> Sweden really showed nothing too impressive… oh wait, they nearly had the highest average On_Target_% and were shot blocking machines. Russia was a typical Cluster 2 team and their hard, steady play worked out for them.</p><p><strong>3)</strong> Yes, France, Croatia, and Belgium (3 of the 4 semi-finalists) fouled <em>a lot</em>, between 13 and 16 time per game. That is higher than I would have imagined for such skilled teams.</p><h3>(3) 2x2 Visualization Comparisons</h3><h4>📈 (3A) Importing Viz Libraries and Plotting</h4><p>Now, on to what I enjoy even more than clustering - the visualization of clusters and their related data. Here, I write code to visualize each team (tied to their clusters by color) in 2-by-2 plots.</p><p>First, I import the necessary libraries.</p><pre>import seaborn as sns<br>import matplotlib.pyplot as plt</pre><p>The code below contains the parameters needed to produce a readable visualization of clusters grouped by color. It also contains a for loop / iterator that allows me to print the name of each team near its respective data point.</p><p><strong>The first question I was trying to answer was “Does Aggression pay off”?</strong><br>In other words, do teams that foul more score more goals?</p><pre><strong>#viz parameters <br></strong>plt.figure(figsize=(20,12))<br>sns.scatterplot(data=df_teamavg_withclusters,x=’Fouls’,y=’Goals_For’, hue=’Cluster’, legend=True, alpha=1, palette=”bright”, s=50)</pre><pre><strong>#for loop to print the name of each team near dots<br></strong>for i in range(df_teamavg_withclusters.shape[0]):<br>plt.text(x=df_teamavg_withclusters.Fouls[i]+0.09,y=df_teamavg_withclusters.Goals_For[i],s=df_teamavg_withclusters.Team[i],fontdict=dict(color=’black’, alpha=1, size=10))<br> <br><strong>#set x limit<br></strong>plt.xlim(df_teamavg_withclusters.Fouls.min()-0.1,df_teamavg_withclusters.Fouls.max()+1)</pre><pre><strong>#title<br></strong>plt.title(‘“Converted Agression” — Goals For x Fouls (Actual)’, fontsize=20) </pre><pre><strong>#x label<br></strong>plt.xlabel(‘Fouls’, fontsize=15) </pre><pre><strong>#y label<br></strong>plt.ylabel(‘Goals_For’, fontsize=15) <br>plt.show()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*0_5Gxi_QlATLqYLD" /><figcaption>Do teams that foul more score more goals?</figcaption></figure><p>There is no strong correlation between fouls and goals. But we can see that Russia clearly outperformed with respect to “converted aggression”. Croatia did as well, to a degree. Morocco and Korea were just hacking for fun it seems, while England and Spain were nice guys.</p><p><strong>My second question was “Does running (distance_km) pay off in the form of a good Goals_delta stat?” </strong>In other words, are the teams running the most outsourcing their opponents? <em>(I wont insert the code here — it is the same as above except for the new parameters related to this question).</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*DFZcEQ9d_MAxO7fc" /></figure><p>There seems to be a <em>slight, slight</em> positive correlation… but it&#39;s a stretch. Another potential stretch — this particular 2x2 <em>sort of</em> shows me the clusters grouped together (greens near greens, reds near reds).</p><p>What this definitely does show that intrigues me is that teams like France, Belgium, and Brazil did not run an absurd amount but were still able to outscore teams. On the other hand, it seems Russia, Croatia and England really &quot;worked hard for their money&quot;. Remember that song?</p><p><strong>My third question was “Does passing perfection tie to shooting perfection?” </strong>In other words, if a team has great pass accuracy are most of their shots on target?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*7PwxC2QlIbUw20YB" /></figure><p>Again, it seems this 2x2 <em>sort of </em>shows me the clusters grouped together. What is noteworthy here is something I mentioned earlier. Fucking Sweden! They are an outlier of sorts — they cannot pass for shit, but man their shots are on target. Peru surprised me too! Croatia, interestingly enough, was not an overly accurate team — Modrić tried his best, but he couldn’t do it alone.</p><p>After seeing these 3 visualizations I can see why France got it done. They are always among the top performers.</p><p>The last question that interested me was &quot;did the amount teams ran change over the course of the Cup?&quot; Remember when waaay back in the beginning of this article I connected each team to its furthest stage in the tournament? Now, I join that data (“Round”) with the cluster data in order to create a new dataframe, <em>df_withclusters_rounds. </em>With this I will be able to visualize a bloxplot showing me each round of the Cup and how much the teams that got to that round were running. Each dot represents a team at its furthers stage and the color of that dot represents their cluster.</p><pre>plt.figure(figsize=(20,5))<br> <br><strong>#define data to populate boxplot and formatting<br></strong>ax = sns.boxplot(data=df_withclusters_rounds, x=’Round’, y=’Distance_km’, orient=’v’, color=’lightgray’, showfliers=False)<br>plt.setp(ax.artists, alpha=0.5)<br> <br><strong>#Add in points to show each observation</strong><br>sns.stripplot(x=’Round’, y=’Distance_km’, data=df_withclusters_rounds, jitter=True, size=6, linewidth=0, hue = ‘Cluster’, alpha=0.7)<br> <br>ax.axes.set_title(‘Distance per Round with ClusterDots’, fontsize=30)<br>ax.set_xlabel(‘Round’,fontsize=20)<br>ax.set_ylabel(‘Distance_km’,fontsize=20)<br> <br><strong>#Define where to place the legend<br></strong>ax.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)</pre><pre>plt.show()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*smw9bU2zhPDwzOi9" /></figure><p>Nothing too earth-shattering here, but let&#39;s finish it out. In the <strong>Group</strong> stage and the <strong>Round of 16</strong> teams run about the same amount. Seems like in the <strong>Quarterfinals</strong> they really take their foot off the gas (this surprised me). However, maybe a better interpretation is that teams just condensed to the same amount of running. See that green dot way up high in the <strong>Quarterfinals</strong> column? It has got to be crazy running Russia or Croatia, both had overtime drama. In the <strong>Semis </strong>and<strong> Finals</strong> the median and the upper limit pops up — perhaps because teams are so close to total victory that they run until they drop.</p><p>Wow. Well, that was a mouthful.</p><p>I hope this, one of my early attempts to put Python into practice with sports data, was at least a little bit interesting to someone. If you made it this far, I hope you enjoyed it. Until next time.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7db563aa8b66" width="1" height="1" alt=""><hr><p><a href="https://medium.com/3rd-corner/world-cup-2018-clustering-analysis-7db563aa8b66">World Cup 2018 Clustering Analysis</a> was originally published in <a href="https://medium.com/3rd-corner">3rd corner</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Design and Data Processes — 3rd Corner View]]></title>
            <link>https://medium.com/3rd-corner/design-and-data-processes-3rd-corner-view-85ab565b9d3a?source=rss----aeec2ab6726d---4</link>
            <guid isPermaLink="false">https://medium.com/p/85ab565b9d3a</guid>
            <category><![CDATA[quantitative-strategies]]></category>
            <category><![CDATA[experience-design]]></category>
            <category><![CDATA[data-analytics]]></category>
            <category><![CDATA[podcast]]></category>
            <category><![CDATA[data-science]]></category>
            <dc:creator><![CDATA[Julian Jordan]]></dc:creator>
            <pubDate>Sun, 14 Jun 2020 23:10:42 GMT</pubDate>
            <atom:updated>2020-06-14T23:12:48.312Z</atom:updated>
            <content:encoded><![CDATA[<h3>Design &amp; Data Processes - 3rd Corner View</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-gWARDswq26aYtlqqf2ZOA.jpeg" /><figcaption>Art by Aline Valek</figcaption></figure><p>Early in 2020 I was explaining to a client my vision for a new podcast I planned on launching — Under Crossing. The basic idea was to look at events and phenomena in the world around us and interprete them using different lenses (human-centered design and data analytics, Brazilian and North American, science-based and mystical, etc). I explained that it was natural for me to think this way and that this is the type of thinking that inspired 3rd Corner.</p><p>The client asked if I would present the idea of the podcast and the inspiration for 3rd Corner to teams at the company who didnt know me and were not working with me. She just wanted me to spread this type of thinking at the company.</p><h3>Presentation</h3><p>You can see the presentation here</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.slideshare.net%2Fslideshow%2Fembed_code%2Fkey%2F3c7VnJjQ7HaJYf&amp;display_name=SlideShare&amp;url=https%3A%2F%2Fwww.slideshare.net%2FJulianJordan2%2Fdesign-and-data-processes-unified-3rd-cornerview&amp;image=https%3A%2F%2Fcdn.slidesharecdn.com%2Fss_thumbnails%2Fdatadesign-3rdcornerapril2020final-200614230041-thumbnail-4.jpg%3Fcb%3D1592175751&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=slideshare" width="600" height="500" frameborder="0" scrolling="no"><a href="https://medium.com/media/95621da543871cbd4f8df98f6e218fd8/href">https://medium.com/media/95621da543871cbd4f8df98f6e218fd8/href</a></iframe><h3>Reach Out and Stay Tuned</h3><p>If you are interested in learning more, <a href="/service/mailto:contact@3rdcorner.studio">reach out</a> at <a href="/service/mailto:contact@3rdcorner.studio">contact@3rdcorner.studio</a></p><p>And watch for future posts about 3rd Corner thinking, doing, learning and presentations.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IVPhA65qScg_1AAbdFXxtA.jpeg" /><figcaption>drawing by Marcos Felipe</figcaption></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=85ab565b9d3a" width="1" height="1" alt=""><hr><p><a href="https://medium.com/3rd-corner/design-and-data-processes-3rd-corner-view-85ab565b9d3a">Design and Data Processes — 3rd Corner View</a> was originally published in <a href="https://medium.com/3rd-corner">3rd corner</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Towards unifying Data Analytics & Experience Design — a 3rd Corner introduction]]></title>
            <link>https://medium.com/3rd-corner/towards-unifying-data-analytics-experience-design-a-3rd-corner-introduction-1350820cbbc9?source=rss----aeec2ab6726d---4</link>
            <guid isPermaLink="false">https://medium.com/p/1350820cbbc9</guid>
            <category><![CDATA[strategy]]></category>
            <category><![CDATA[data-analytics]]></category>
            <category><![CDATA[design]]></category>
            <category><![CDATA[latin-america]]></category>
            <category><![CDATA[data-science]]></category>
            <dc:creator><![CDATA[Julian Jordan]]></dc:creator>
            <pubDate>Mon, 02 Mar 2020 21:23:28 GMT</pubDate>
            <atom:updated>2020-03-02T21:23:27.896Z</atom:updated>
            <content:encoded><![CDATA[<h3><em>Unifying Data Analytics &amp; Experience Design: a 3rd Corner introduction</em></h3><h3><strong>Joining two approaches</strong></h3><p>Over the past decade, two disciplines have grown in popularity and relevance — data analytics and human-centered design.</p><p>Their rise was largely tied to the fact that both helped us understand and unravel problems in new ways. This was, and is, a positive thing.</p><p>The less positive thing is that we created separate worlds for these two disciplines. We often viewed data analytics and human-centered design as separate approaches dealing with two different types of data, the quantitative and qualitative, respectively.</p><p><strong>Quantitative data,</strong> that which:</p><ul><li>answers questions like “<em>What</em> are they doing?”<strong><em>, </em></strong>“How much?”, “How many?”, “How often?”.</li><li>comes in the form of numbers, can be verified upon review and can be evaluated using mathematical techniques and statistical analysis.</li><li>is collected via surveys, databases, Customer Relationship Management (CRM) data and behavioral analytics.</li><li>has “consistency of measurement” — when the question is “how many apples do you have?”, the difference between 6 and 8 is easy and always the same.</li></ul><p><strong>Qualitative data,</strong> that which</p><ul><li>answers questions like “<em>Why</em> are they doing it?”, “How?”, “What type?”, “What for?”.</li><li>is non-numerical and collected via interviews, contextual observations, focus groups, etc.</li><li>approximates and characterizes how people feel about themselves and the properties of phenomena around them.</li><li>often lacks “consistency of measurement” — when the question is “on a scale of 1–10, how much pain are you in?”, the difference between 6 and 8 is not so clear and rarely the same.</li></ul><p>When tackling a problem, <strong>data analysts and data scientists often take a quantitative approach</strong> to build hypotheses, refine a point-of-view and offer solutions. This involves data preparation and exploration, model creation and insight generation, and finally, refinement, validation and embedding of actionable analyses.</p><p><strong>Human-centered designers</strong> frequently look to do the same thing via a <strong>qualitative</strong> <strong>approach</strong> (the <a href="https://www.designcouncil.org.uk/news-opinion/what-framework-innovation-design-councils-evolved-double-diamond">double diamond</a> is a common reference). This takes the form of user research, insights and principles synthesis, point-of-view construction, ideation and prototyping, and finally pre-launch refinement of a service or experience.</p><p>Yes, data analysts/scientists and the human-centered designers represent two different disciplines. But at a closer look, the essence of their approaches is quite similar.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IlDWfuPNByTReRNFluRMqQ.jpeg" /></figure><p><strong>Both aim to organize, structure and present data so that it becomes useful information.</strong> Both explore context, develop hypotheses and points-of-view, and refine solutions to solve complex problems.</p><p><strong>Yet, at large corporations and even startups, it is all too common for data analysts/scientists and human-centered designers to treat each other like service providers, to work divided, and to not collaborate holistically and consistently.</strong></p><p>I do not want to imply that analysts or designers always choose one approach and ignore the other. I do not want to imply that I am the first person to propose a mixed quant-qual approach.</p><p><strong>But I <em>do</em> want to propose the following: to build digital products, data analysts/scientists and designers need to leverage each other’s processes and work as a unit. </strong>This unit should research, empathize, hypothesize, synthesize, think of variables and model approaches, sketch and prototype together.</p><p>Many companies do not successfully balance and blend mindsets from the quantitative and qualitative worlds. Many more do not even try. But marrying these two mindsets is critical, even necessary, for us to appreciate and make calibrated decisions in our increasingly nuanced and data-rich existence.</p><p><strong>The Whats. The Whys.<br>The numbers. The feelings.<br>Two types of data.<br>Together they improve how we approach daily activities, challenges, and conclusions.</strong></p><p>This was the inspiration for 3rd Corner.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BVpijzjjbaMzZPTRsKVl7g.jpeg" /></figure><h3><strong>3rd Corner &amp; the road ahead</strong></h3><p>In August 2019, I started 3rd Corner, a consultancy that helps clients blend the lenses of data analytics, data science and human-centered design to see and solve challenges with a new focus. We work with designers, data scientists and strategists to deliver this.</p><p>Understanding people and the world around them became a primary interest of mine while studying anthropology in my last two years of college. This interest not only pushed me to live in West Africa, Europe and Latin America but it also colored my professional pursuits. Years working with financial strategy and quantitative analysis, and then human-centered research and design strategy, helped me develop different tools with which to perceive the data all around me. The more opportunities I had to combine these tools, the more I saw the potential to blend experience design, data analytics and data science.</p><p>When orchestrated well, this blend brings the rigor, the creativity and the balance that is essential to our work at 3rd Corner.</p><h4>The Work</h4><p>Some of the challenges we have worked on / are working on in our first year (client specifics are currently confidential):</p><ul><li>We are leading a <strong>quantified user insights initiative</strong> for a platform that aims to democratize investing. We are implementing a process that quantifies user behavior, characteristics, and journeys as well as identifies actionable data in user clusters. We are setting the groundwork for multidisciplinary data science and design teams to leverage quant and qual data to prioritize value and problem-solving efforts.</li><li>We collaborated with an Artificial Intelligence (AI) firm to help a medical network use Natural Language Processing (NLP) to <strong>extract meaningful information from language data</strong>. We recognized that while AI is a powerful tool, alone it cannot determine which human problems to tackle. Thus, to best leverage NLP, we <strong>designed data ideation workshops and mapped data workflows</strong> to strategically enhance doctor, administrative and patient experiences.</li><li>We are coaching product designers and data analysts at a financial services company to establish <strong>data-driven Design Research Operations</strong>. At its core, this involves developing quant/qual research tools relevant to all phases of the product lifecycle — discovery, development and delivery. We believe this will enhance how exploratory and strategic research improve company-wide product decisions.</li><li>We are leading a fashion design company in the implementation of agile-inspired routines. Our goal is to <strong>improve how data flows from collection-to-use across analytics and design squads</strong>, as well as how experiment with a focus on iterative measurement.</li><li>We worked with a sustainability-focused agency to help them strategize the prototyping of new business models as well as <strong>how to creatively think about new metrics and data collection.</strong></li><li>We advised a digital media company aiming to <strong>enhance their qualitative research by collecting new types of data via quantitative methods.</strong></li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*VmwqJoVbrbLxk4G0lS7gDQ.jpeg" /></figure><h4>Why Now</h4><p>We realize that companies vary in their ability to blend the efforts of designers, data analysts and data scientists. But this does not stop us from helping clients understand why joining these disciplines is relevant now.</p><p><strong>1. It turns out that</strong> <strong>opposites attract. </strong>Over the last decade, human-centered designers and data scientists and analysts have become the popular kids at school. Unfortunately they are often on different, if not opposite, sides of problem-solving and decision processes. But by bringing them together into collaboration units, designers and data scientists and analysts can unlock new insights born out of leveraging their differences: data-informed ideation, machine learning segmentation and outlier-inspired research, prototypes that consume and produce analyzable data, etc.</p><p><strong>2. Alone, traditional needs-focused UX work is less and less differentiating. </strong>Good User Experience (UX) patterns are no longer secrets; the “design thinker” explosion means in-depth interviews and empathy maps are the norm. As a result, we should not expect differentiation to solely come from how emotionally in-touch, contextual or beautiful our digital services are.</p><p>Because many of these services are (at least partially) “fueled” by data that users provide (via direct responses, trigger events, inference of behaviors, etc.) it is increasingly critical to tie the data to the user in actionable ways. Differentiation will come from how we combine contextual empathy work with an understanding of quantitative variables that approximate human sentiment and behavior. This way our products can manifest an understanding of how the data implies intentions, aspirations and desires of individuals.</p><p><strong>3. The abundance of quantitative data demands more considered, empathetic treatment. </strong><em>“More data, more problems” </em>becomes our reality if we are careless. Technical capacity to track and ingest rich, large sets of data is only worth so much if we are not considerate about how we select, transform and display it. Consistent collaboration between analysts, scientists and designers helps us ask better questions to filter and frame this data, aligning powerful systems with human needs.</p><p>This collaboration also helps us design products with “data journeys” better suited to receive, share, and leverage users&#39; data in ways that solve functional needs as well as respect privacy and transparency.</p><p><strong>4. We are increasingly aware of the real complexity of challenges. </strong>Whether it is increasing employment for low-income workers via an app or educating young parents about child development via a service, the challenges we face are nuanced. Individuals have more access to opinions, emotions, facts, and numbers than ever before. Implicitly, many individuals expect “problem-solvers” to synthesize these multiple sources and perspectives.</p><p><strong>If data analysts, data scientists and human-centered designers work as a unit, we get closer to reaching the expectation for more holistic solutions to complex challenges.</strong></p><p>We look forward to the challenges ahead.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*U9nW2LlR--nDA89hKXaS0Q.jpeg" /></figure><h4>Reach Out and Stay Tuned</h4><p>If you are interested in learning more, <a href="/service/mailto:contact@3rdcorner.studio">reach out</a> at <a href="/service/mailto:contact@3rdcorner.studio">contact@3rdcorner.studio</a></p><p>And watch for future posts about how we think, what we are doing, and what we are learning.</p><p>A sincere thanks is owed to several people for their support, collaboration, feedback, and edits: Talita Di Iorio, Noah Norman, Dave Zaretsky, Will Heidrich, Muamer Cisija, Rafael Fernandes.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1350820cbbc9" width="1" height="1" alt=""><hr><p><a href="https://medium.com/3rd-corner/towards-unifying-data-analytics-experience-design-a-3rd-corner-introduction-1350820cbbc9">Towards unifying Data Analytics &amp; Experience Design — a 3rd Corner introduction</a> was originally published in <a href="https://medium.com/3rd-corner">3rd corner</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>