29 11월 2022

[python][머신러닝] Scikit-learn Tutorial: Machine Learning in Python

[python][머신러닝] Scikit-learn Tutorial: Machine Learning in Python

Scikit-learn Tutorial: Machine Learning in Python

Scikit-learn is a free machine learning library for Python. It features various algorithms like support vector machine, random forests, and k-neighbours, and it also supports Python numerical and scientific libraries like NumPy and SciPy.

In this tutorial we will learn to code python and apply Machine Learning with the help of the scikit-learn library, which was created to make doing machine learning in Python easier and more robust.

To do this, we’ll be using the Sales_Win_Loss data set from IBM’s Watson repository. We will import the data set using pandas, explore the data using pandas methods like head()tail()dtypes(), and then try our hand at using plotting techniques from Seaborn to visualize our data.

Then we’ll dive into scikit-learn and use preprocessing.LabelEncoder() in scikit-learn to process the data, and train_test_split() to split the data set into test and train samples. We will also use a cheat sheet to help us decide which algorithms to use for the data set. Finally we will use three different algorithms (Naive-Bayes, LinearSVC, K-Neighbors Classifier) to make predictions and compare their performance using methods like accuracy_score() provided by the scikit-learn library. We will also visualize the performance score of different models using scikit-learn and Yellowbrick visualization.

To get the most out of this post, you should probably already be comfortable with:

  • pandas fundamentals
  • Seaborn and matplotlib basics

If you need to brush up on these topics, check out these pandas and data visualization blog posts.

The data set

For this tutorial, we will use the Sales-Win-Loss data set available on the IBM Watson website. This data set contains the sales campaign data of an automotive parts wholesale supplier.

We will use scikit-learn to build a predictive model to tell us which sales campaign will result in a loss and which will result in a win.

Let’s begin by importing the data set.

Importing the data set

First we will import the pandas module and use a variable url to store the url from which the data set is to be downloaded.

#import necessary modules
import pandas as pd
#store the url in a variable
url = "https://community.watsonanalytics.com/wp-content/uploads/2015/04/WA_Fn-UseC_-Sales-Win-Loss.csv"

Next, we will use the read_csv() method provided by the pandas module to read the csv file which contains comma separated values and convert that into a pandas DataFrame.

# Read in the data with `read_csv()`
sales_data = pd.read_csv(url)

The code snippet above returns a variable sales_data where the dataframe is now stored.

For those who are new to pandas, the pd.read_csv() method in the above code creates a tabular data-structure known as a Dataframe, where the first column contains the index which marks each row of data uniquely and the first row contains a label/name for each column, which are the original column names retained from the data set. The sales_data variable in the above code snippet will have a structure similar to the diagram represented below.

dataframe-1

Source: Stack Overflow

In the above diagram the row0, row1, row2 are the index for each record in the data set and the col0, col1, col2 etc are the column names for each columns(features) of the data set.

Now that we have downloaded the data set from its source and converted that into a pandas Dataframe, let’s display a few records from this dataframe. For this we will use the head() method.

# Using .head() method to view the first few records of the data set
sales_data.head()
  Opportunity Number Supplies Subgroup Supplies Group Region Route To Market Elapsed Days In Sales Stage Opportunity Result Sales Stage Change Count Total Days Identified Through Closing Total Days Identified Through Qualified Opportunity Amount USD Client Size By Revenue Client Size By Employee Count Revenue From Client Past Two Years Competitor Type Ratio Days Identified To Total Days Ratio Days Validated To Total Days Ratio Days Qualified To Total Days Deal Size Category
0 1641984 Exterior Accessories Car Accessories Northwest Fields Sales 76 Won 13 104 101 0 5 5 0 Unknown 0.69636 0.113985 0.154215 1
1 1658010 Exterior Accessories Car Accessories Pacific Reseller 63 Loss 2 163 163 0 3 5 0 Unknown 0.00000 1.000000 0.000000 1
2 1674737 Motorcycle Parts Performance & Non-auto Pacific Reseller 24 Won 7 82 82 7750 1 1 0 Unknown 1.00000 0.000000 0.000000 1
3 1675224 Shelters & RV Performance & Non-auto Midwest Reseller 16 Loss 5 124 124 0 1 1 0 Known 1.00000 0.000000 0.000000 1
4 1689785 Exterior Accessories Car Accessories Pacific Reseller 69 Loss 11 91 13 69756 1 1 0 Unknown 0.00000 0.141125 0.000000 4

As can be seen from the above display, the head() method shows us the first few records from the data set. The head() method is a very nifty tool provided by pandas that helps us to get a feel of the content of a data set. We will talk more about the head() method in the next section.

Data Exploration

Now that we have got the data set downloaded and converted into a pandas dataframe, lets do a quick exploration of the data see what stories the data can tell us so that we can plan our course of action.

Data exploration is a very important step in any Data Science or Machine Learning project. Even a quick exploration of the data set can give us important information that we might otherwise miss, and that information can suggest important questions we can try to answer through our project.

For exploring the data set, we will use some third party Python libraries to help us process the data so that it can be effectively used with scikit-learn’s powerful algorithms. But we can start with the same head() method we used in the previous section to view the first few records of the imported data set, because head() is actually capable of doing much more than that! We can customize the head() method to show only a specific number of records as well:

# Using head() method with an argument which helps us to restrict the number of initial records that should be displayed
sales_data.head(n=2)
  Opportunity Number Supplies Subgroup Supplies Group Region Route To Market Elapsed Days In Sales Stage Opportunity Result Sales Stage Change Count Total Days Identified Through Closing Total Days Identified Through Qualified Opportunity Amount USD Client Size By Revenue Client Size By Employee Count Revenue From Client Past Two Years Competitor Type Ratio Days Identified To Total Days Ratio Days Validated To Total Days Ratio Days Qualified To Total Days Deal Size Category
0 1641984 Exterior Accessories Car Accessories Northwest Fields Sales 76 Won 13 104 101 0 5 5 0 Unknown 0.69636 0.113985 0.154215 1
1 1658010 Exterior Accessories Car Accessories Pacific Reseller 63 Loss 2 163 163 0 3 5 0 Unknown 0.00000 1.000000 0.000000 1

In the code snippet above, we used an argument inside the head() method to display only the first two records from our data set. The integer ‘2’ in the argument n=2 actually denotes the second index of the Dataframe Sales_data. Using this we can get a quick look into the kind of data we have to work with. For example, we can see that columns like ‘Supplies Group’ and ‘Region’ contain string data, while columns like Opportunity Result, Opportunity Number etc. contain integers. Also, we can see that the ‘Opportunity Number’ column contains unique identifiers for each record.

Now that we have viewed the initial records of our dataframe, let’s try to view the last few records in the data set. This can be done using the tail() method, which has similar syntax as the head() method. Let’s see what the tail() method can do:

# Using .tail() method to view the last few records from the dataframe
sales_data.tail()
  Opportunity Number Supplies Subgroup Supplies Group Region Route To Market Elapsed Days In Sales Stage Opportunity Result Sales Stage Change Count Total Days Identified Through Closing Total Days Identified Through Qualified Opportunity Amount USD Client Size By Revenue Client Size By Employee Count Revenue From Client Past Two Years Competitor Type Ratio Days Identified To Total Days Ratio Days Validated To Total Days Ratio Days Qualified To Total Days Deal Size Category
78020 10089932 Batteries & Accessories Car Accessories Southeast Reseller 0 Loss 2 0 0 250000 1 1 3 Unknown 0.0 0.0 0.0 6
78021 10089961 Shelters & RV Performance & Non-auto Northeast Reseller 0 Won 1 0 0 180000 1 1 0 Unknown 0.0 0.0 0.0 5
78022 10090145 Exterior Accessories Car Accessories Southeast Reseller 0 Loss 2 0 0 90000 1 1 0 Unknown 0.0 0.0 0.0 4
78023 10090430 Exterior Accessories Car Accessories Southeast Fields Sales 0 Loss 2 0 0 120000 1 1 0 Unknown 1.0 0.0 0.0 5
78024 10094255 Interior Accessories Car Accessories Mid-Atlantic Reseller 0 Loss 1 0 0 90000 1 1 0 Unknown 0.0 0.0 0.0 4

The tail() method in the code snippet above returns us the last few records from the dataframe sales_data. We can pass an argument to the tail() method to view only a limited number of records from our dataframe, too:

# Using .tail() method with an argument which helps us to restrict the number of initial records that should be displayed
sales_data.tail(n=2)
Opportunity Number Supplies Subgroup Supplies Group Region Route To Market Elapsed Days In Sales Stage Opportunity Result Sales Stage Change Count Total Days Identified Through Closing Total Days Identified Through Qualified Opportunity Amount USD Client Size By Revenue Client Size By Employee Count Revenue From Client Past Two Years Competitor Type Ratio Days Identified To Total Days Ratio Days Validated To Total Days Ratio Days Qualified To Total Days Deal Size Category
78023 10090430 Exterior Accessories Car Accessories Southeast Fields Sales 0 Loss 2 0 0 120000 1 1 0 Unknown 1.0 0.0 0.0 5
78024 10094255 Interior Accessories Car Accessories Mid-Atlantic Reseller 0 Loss 1 0 0 90000 1 1 0 Unknown 0.0 0.0 0.0 4

We can now view only the last two records from the dataframe, as indicated by the argument n=2 inside the tail() method. Similar to the head() method, the integer ‘2’ in the argument n=2 in the tail() method points to the second index from the last two records in the data set sales_data.

What story do these last two records tell us? Looking at the ‘Opportunity Number’ column of the trailer records from the dataframe, it becomes clear to us that a total of 78,024 records are available. This is evident from the ‘index’ number of the records displayed with the tail() method.

Now, it would be good if we could see the different datatypes that are available in this data set; this information can be handy in case we need to do some conversion later on. We can do that with the dtypes() method in pandas:

# using the dtypes() method to display the different datatypes available
sales_data.dtypes
Opportunity Number int64
Supplies Subgroup object
Supplies Group object
Region object
Route To Market object
Elapsed Days In Sales Stage int64
Opportunity Result object
Sales Stage Change Count int64
Total Days Identified Through Closing int64
Total Days Identified Through Qualified int64
Opportunity Amount USD int64
Client Size By Revenue int64
Client Size By Employee Count int64
Revenue From Client Past Two Years int64
Competitor Type object
Ratio Days Identified To Total Days float64
Ratio Days Validated To Total Days float64
Ratio Days Qualified To Total Days float64
Deal Size Category int64
dtype: object

As we can see in the code snippet above, using the dtypes method, we can list the different columns available in the Dataframe along with their respective datatypes. For example, we can see that the Supplies Subgroup column is an object datatype and the ‘Client Size By Revenue’ column is an integer datatype. So, now we know which columns have integers in them and which columns have string data in them.

Data Visualization

Now that we’ve done some basic data exploration, let’s try to create some nice plots to visually represent the data and uncover more stories hidden in the data set.

There are many python libraries that provide functions for doing data visualization; one such library is Seaborn. To use Seaborn plots, we should make sure that this python module is downloaded and installed.

Let’s set up the code to use the Seaborn module:

# import the seaborn module
import seaborn as sns
# import the matplotlib module
import matplotlib.pyplot as plt
# set the background colour of the plot to white
sns.set(style="whitegrid", color_codes=True)
# setting the plot size for all plots
sns.set(rc={'figure.figsize':(11.7,8.27)})
# create a countplot
sns.countplot('Route To Market',data=sales_data,hue = 'Opportunity Result')
# Remove the top and down margin
sns.despine(offset=10, trim=True)
# display the plotplt.show()

output_16_0

Now that we’ve got Seaborn set up, let’s take a deeper look at what we just did.

First we imported the Seaborn module and the matplotlib module. The set() method in the next line helps to set different properties for our plot, like ‘styles’, ‘color’ etc. Using the sns.set(style="whitegrid", color_codes=True) code snippet we set the background of the plot to a light color. Then we set the plot size with the sns.set(rc={'figure.figsize':(11.7,8.27)})code snippet, which defines the plot figure size to be 11.7px and 8.27px.

Next, we create the plot using sns.countplot('Route To Market',data=sales_data,hue = 'Opportunity Result'). The countplot() method helps us to create a countplot and it exposes several arguments to customize the countplot per our needs. Here, in the first argument of the countplot() method, we defined the X-axis as the column ‘Route To Market’ from our data set. The second argument is the data source, which in this case is the dataframe sales_data that we created in the first section of this tutorial. The third argument is the color of the barplots which we assigned to ‘blue’ for the label ‘won’ and ‘green’ for the label ‘loss’ from the ‘Opportunity Result’ column of the sales_data dataframe.

More details about Seaborn countplots can be found here.

So, what does the countplot tell us about the data? The first thing is that the data set has more records of the type ‘loss’ than records of the type ‘won’, as we can see from the size of the bars. Looking at the x axis and the corresponding bars for each label on the x axis, we can see that most of the data from our data set is concentrated towards the left side of the plot: towards the ‘Field Sales’ and ‘Reseller’ categories. Another thing to notice is that the category ‘Field Sales’ has more losses than the category ‘Reseller’.

We selected the Route To Market column for our plot because it seemed like it would provide helpful information after our initial study of the head() and tail() methods’ output. But other fields like ‘Region’ , ‘Supplies Group’ etc. can also be used to make plots in the same manner.

Now that we have got a pretty good visualization of what our overall data looks like, let’s see what more information can we dig out with the help of other Seaborn plots. Another popular option is violinplots, so let’s create a violin plot and see what that style of plot can tell us.

We will use the violinplot() method provided by the Seaborn module to create the violin plot. Let’s first import the seaborn module and use the set() method to customize the size of our plot. We will seet the size of the plot as 16.7px by 13.27px:

# import the seaborn module
import seaborn as sns
# import the matplotlib module
import matplotlib.pyplot as plt
# setting the plot size for all plots
sns.set(rc={'figure.figsize':(16.7,13.27)})

Next, we will use the violinplot() method to create the violinplot and then use the show() mehtod to display the plot –

# plotting the violinplot
sns.violinplot(x="Opportunity Result",y="Client Size By Revenue", hue="Opportunity Result", data=sales_data);
plt.show()
output_20_0

Now, that our plot is created, let’s see what it tells us. In its simplest form, a violin plot displays the distribution of data across labels. In the above plot we have labels ‘won’ and ‘loss’ on the x-axis and the values of ‘Client Size By Revenue’ in the y-axis. The violin plot shows us that the largest distribution of data is in the client size ‘1’, and the rest of the client size labels have less data.

This violin plot gives us very valuable insight into how the data is distributed and which features and labels have the largest concentration of data, but there is more than what meets the eye in case of violin plots. You can dig deeper into the additional uses of violin plots via the official documentation of the Seaborn module

Preprocessing Data

Now that we have a good understanding of what our data looks like, we can move towards preparing it to build prediction models using scikit-learn.

We saw in our initial exploration that most of the columns in our data set are strings, but the algorithms in scikit-learn understand only numeric data. Luckily, the scikit-learn library provides us with many methods for converting string data into numerical data. One such method is the LabelEncoder() method. We will use this method to convert the categorical labels in our data set like ‘won’ and ‘loss’ into numerical labels. To visualize what we are trying to to achieve with the LabelEncoder() method let’s consider the images below.

The image below represents a dataframe that has one column named ‘color’ and three records ‘Red’, ‘Green’ and ‘Blue’.

dataframe_before-1

Since the machine learning algorithms in scikit-learn understand only numeric inputs, we would like to convert the categorical labels like ‘Red, ‘Green’ and ‘Blue’ into numeric labels. When we are done converting the categorical labels in the original dataframe, we would get something like this:

dataframe_after-1

Now, let’s start the actual conversion process. We will use the fit_transform() method provided by LabelEncoder() to encode the labels in the categorical column such as ‘Route To Market’ in the sales_data dataframe and convert them into numeric labels similar to what we visualized in the above diagrams. The fit_transform() function takes user defined labels as input and then returns encoded labels. Let’s go through a quick example to understand how the encoding is done. In the code example below we have a list of cities i.e. ["paris", "paris", "tokyo", "amsterdam"] and we will try to encode these string labels into something similar to this – [2, 2, 1,3].

#import the necessary module
from sklearn import preprocessing
# create the Labelencoder object
le = preprocessing.LabelEncoder()
#convert the categorical columns into numeric
encoded_value = le.fit_transform(["paris", "paris", "tokyo", "amsterdam"])
print(encoded_value)
[1 1 2 0]

Voila! We have successfully converted the string labels into numeric labels. How’d we do that? First we imported the preprocessing module which provides the LabelEncoder() method. Then we created an object which represents the LabelEncoder() type. Next we used this object’s fit_transform() function to differentiate between different unique classes of the list ["paris", "paris", "tokyo", "amsterdam"] and then return a list with the respective encoded values, i.e. [1 1 2 0].

Notice how the LabelEncoder() method assigns the numeric values to the classes in the order of the first letter of the classes from the original list: “(a)msterdam” gets an encoding of ‘0’ , “(p)aris gets an encoding of 1” and “(t)okyo” gets an encoding of 2.

There are many more functions provided by LabelEncoder() that are handy under a variety of encoding requirements. We won’t need them here, but to learn more, a good place to start is the official page of scikit-learn where the LabelEncoder() and its related functions are described in detail.

Since, we now have a good idea of how the LabelEncoder() works, we can move forward with using this method to encode the categorical labels from the sales_data dataframe and convert them into numeric labels. In the previous sections during the initial exploration of the data set we saw that the following columns contain string values: ‘Supplies Subgroup’, ‘Region’, ‘Route To Market’, ‘Opportunity Result’, ‘Competitor Type’, and ‘Supplies Group’. Before we start encoding these string labels, let’s take a quick look into the different labels that these columns contain:-

print("Supplies Subgroup' : ",sales_data['Supplies Subgroup'].unique())
print("Region : ",sales_data['Region'].unique())
print("Route To Market : ",sales_data['Route To Market'].unique())
print("Opportunity Result : ",sales_data['Opportunity Result'].unique())
print("Competitor Type : ",sales_data['Competitor Type'].unique())
print("'Supplies Group : ",sales_data['Supplies Group'].unique())
Supplies Subgroup' : ['Exterior Accessories' 'Motorcycle Parts' 'Shelters & RV'
'Garage & Car Care' 'Batteries & Accessories' 'Performance Parts'
'Towing & Hitches' 'Replacement Parts' 'Tires & Wheels'
'Interior Accessories' 'Car Electronics']
Region : ['Northwest' 'Pacific' 'Midwest' 'Southwest' 'Mid-Atlantic' 'Northeast'
'Southeast']
Route To Market : ['Fields Sales' 'Reseller' 'Other' 'Telesales' 'Telecoverage']
Opportunity Result : ['Won' 'Loss']
Competitor Type : ['Unknown' 'Known' 'None']
'Supplies Group : ['Car Accessories' 'Performance & Non-auto' 'Tires & Wheels'
'Car Electronics']

We have now laid out the different categorical columns from the sales_data dataframe and the unique classes under each of these columns. Now, it’s time to encode these strings into numeric labels. To do this, we will run the code below and then do a deep dive to understand how it works:

#import the necessary module
from sklearn import preprocessing
# create the Labelencoder object
le = preprocessing.LabelEncoder()
#convert the categorical columns into numeric
sales_data['Supplies Subgroup'] = le.fit_transform(sales_data['Supplies Subgroup'])
sales_data['Region'] = le.fit_transform(sales_data['Region'])
sales_data['Route To Market'] = le.fit_transform(sales_data['Route To Market'])
sales_data['Opportunity Result'] = le.fit_transform(sales_data['Opportunity Result'])
sales_data['Competitor Type'] = le.fit_transform(sales_data['Competitor Type'])
sales_data['Supplies Group'] = le.fit_transform(sales_data['Supplies Group'])
#display the initial records
sales_data.head()
  Opportunity Number Supplies Subgroup Supplies Group Region Route To Market Elapsed Days In Sales Stage Opportunity Result Sales Stage Change Count Total Days Identified Through Closing Total Days Identified Through Qualified Opportunity Amount USD Client Size By Revenue Client Size By Employee Count Revenue From Client Past Two Years Competitor Type Ratio Days Identified To Total Days Ratio Days Validated To Total Days Ratio Days Qualified To Total Days Deal Size Category
0 1641984 2 0 3 0 76 1 13 104 101 0 5 5 0 2 0.69636 0.113985 0.154215 1
1 1658010 2 0 4 2 63 0 2 163 163 0 3 5 0 2 0.00000 1.000000 0.000000 1
2 1674737 5 2 4 2 24 1 7 82 82 7750 1 1 0 2 1.00000 0.000000 0.000000 1
3 1675224 8 2 1 2 16 0 5 124 124 0 1 1 0 0 1.00000 0.000000 0.000000 1
4 1689785 2 0 4 2 69 0 11 91 13 69756 1 1 0 2 0.00000 0.141125 0.000000 4

So what did we just do? First we imported the preprocessing module which provides the LabelEncoder() method. Then we created an object le of the type labelEncoder(). In the next couple of lines we used the fit_transform() function provided by LabelEncoder() and converted the categorical labels of different columns like ‘Supplies Subgroup’, ‘Region’, Route To Market’ into numeric labels. In doing this, we successfully converted all the categorical (string) columns into numeric values.

Now that we have our data prepared and converted it is almost ready to be used for building our predictive model. But we still need to do one critical thing:

Training Set & Test Set

A Machine Learning algorithm needs to be trained on a set of data to learn the relationships between different features and how these features affect the target variable. For this we need to divide the entire data set into two sets. One is the training set on which we are going to train our algorithm to build a model. The other is the testing set on which we will test our model to see how accurate its predictions are.

But before doing all this splitting, let’s first separate our features and target variables. As before in this tutorial, we will first run the code below, and then take a closer look at what it does:

# select columns other than 'Opportunity Number','Opportunity Result'cols = [col for col in sales_data.columns if col not in ['Opportunity Number','Opportunity Result']]
# dropping the 'Opportunity Number'and 'Opportunity Result' columns
data = sales_data[cols]
#assigning the Oppurtunity Result column as target
target = sales_data['Opportunity Result']
data.head(n=2)
  Supplies Subgroup Supplies Group Region Route To Market Elapsed Days In Sales Stage Sales Stage Change Count Total Days Identified Through Closing Total Days Identified Through Qualified Opportunity Amount USD Client Size By Revenue Client Size By Employee Count Revenue From Client Past Two Years Competitor Type Ratio Days Identified To Total Days Ratio Days Validated To Total Days Ratio Days Qualified To Total Days Deal Size Category
0 2 0 3 0 76 13 104 101 0 5 5 0 2 0.69636 0.113985 0.154215 1
1 2 0 4 2 63 2 163 163 0 3 5 0 2 0.00000 1.000000 0.000000 1

OK, so what did we just do? First, we don’t need the ‘Opportunity Number’ column as it is just a unique identifier for each record. Also, we want to predict the ‘Opportunity Result’, so it should be our ‘target’ rather than part of ‘data’. So, in the first line of the code above, we selected only the columns which didn’t match ‘Opportunity Number’and ‘Opportunity Result’ and assigned them to a variable cols. Next, we created a new dataframe data with the columns in the list cols. This will serve as our feature set. Then we took the ‘Opportunity Result’ column from the dataframe sales_data and created a new dataframe target.

That’s it! We are all set with defining our features and target into two separate dataframes. Next we will divide the dataframes data and target into training sets and testing sets. When splitting the data set we will keep 30% of the data as the test data and the remaining 70% as the training data. But keep in mind that those numbers are arbitrary and the best split will depend on the specific data you’re working with. If you’re not sure how to split your data, the 80/20 principle where you keep 80% of the data as training data and use the remaining 20% as test data is a decent default. However, for this tutorial, we are going to stick with our earlier decision of keeping aside 30% of the data as test data. The train_test_split() method in scikit-learn can be used to split the data:

#import the necessary module
from sklearn.model_selection import train_test_split
#split data set into train and test setsdata_train, data_test, target_train, target_test = train_test_split(data,target, test_size = 0.30, random_state = 10)

With this, we have now successfully prepared a testing set and a training set. In the above code first we imported the train_test_split module. Next we used the train_test_split() method to divide the data into a training set (data_train,target_train) and a test set (data_test,data_train). The first argument of the train_test_split() method are the features that we separated out in the previous section, the second argument is the target(‘Opportunity Result’). The third argument ‘test_size’ is the percentage of the data that we want to separate out as training data . In our case it’s 30% , although this can be any number. The fourth argument ‘random_state’ just ensures that we get reproducible results every time.

Now, we have everything ready and here comes the most important and interesting part of this tutorial: building a prediction model using the vast library of algorithms available through scikit-learn.

Building The Model

There’s a machine_learning_map available on scikit learn’s website that we can use as a quick reference when choosing an algorithm. It looks something like this:

ML-cheat-sheet-1

We can use this map as a cheat sheet to shortlist the algorithms that we can try out to build our prediction model. Using the checklist let’s see under which category we fall:

  • More than 50 samples – Check
  • Are we predicting a category – Check
  • We have labeled data? ( data with clear names like opportunity amount etc.) – Check
  • Less than 100k samples – Check

Based on the checklist that we prepared above and going by the machine_learning_map we can try out the below mentioned algorithms.

  • Naive Bayes
  • Linear SVC
  • K-Neighbours Classifier

The real beauty of the scikit-learn library is that it exposes high level APIs for different algorithms, making it easier for us to try out different algorithms and compare the accuracy of the models to see what works best for our data set.

Let’s begin trying out the different algorithms one by one.

Naive-Bayes

Scikit-learn provides a set of classification algorithms which “naively” assumes that in a data set every pair of features are independent. This assumption is the underlying principle of Bayes theorem. The algorithms based on this principle are known as Naive-Bayes algorithms.

On a very high level a Naive-Bayes algorithm calculates the probability of the connection of a feature with a target variable and then it selects the feature with the highest probability. Let’s try to understand this with a very simple problem statement: Will it rain today? Suppose we have a set of weather data with us that will be our feature set, and the probability of ‘Rain’ will be our target. Based on this feature set we can create a table to show us the number of times a particular feature/target pair occur. It would look something like this:

NB_occurancetable-1

In the table above the feature (column) ‘Weather’ contains the labels (‘Partially Cloudy’ and ‘Cloudy’) and the column ‘Rain’ contains the occurrence of rain coinciding with the feature ‘Weather’ (Yes/No). Whenever a feature lcoincides with rain, it’s recorded as a ‘Yes’ and when the feature didn’t lead to rain it is recorded as a ‘No’. We can now use the data from the occurrence table to create another table known as the ‘Frequency table’ where we can record the number of ‘Yes’ and the number of ‘No’ answers that each feature relates to:

NB-Frequency_Table

Finally, we combine the data from the ‘occurrence table’ and the ‘frequency table’ and create a ‘likelihood table’. This table lists the amount of ‘Yes’ and ‘No’ for each feature and then uses this data to calculate the probability of contibution of each feature towards the occurrence of rain:

NB-Probability_Table

Notice the ‘Individual Probability’ column in the table above. We had 6 occurrences of the features ‘Partially Cloudy’ and ‘Cloudy’ from the ‘Occurrence table’ and from the ‘Likelihood table’ it was clear that the feature ‘Partially Cloudy’ had 4 occurrences (2 for ‘No’ and 2 for ‘yes’). When we divide the number of occurrences of ‘No’ and ‘Yes’ of a particular feature with the ‘total’ of the ‘occurrence table’, we get the probability of that particular feature. In our case if we need to find out that which feature has the strongest probability of contributing to the occurrence of Rain then we take the total number of ‘No’ of each feature and add it to their respective number of ‘Yes’ from the ‘frequency table’ and then divide the sum with the ‘Total’ from the óccurances table’. This gives us the probability of each of these features coinciding with rain.

The algorithm that we are going to use for our sales data is the Gaussian Naive Bayes and it is based on a concept similar to the weather example we just explored above, although significantly more mathematically complicated. A more detailed explanation of ‘Naive-Bayes’ algorithms can be found here for those who wish to delve deeper.

Now let’s implement the Gaussian Naive Bayes or GaussianNB algorithm from scikit-learn to create our prediction model:

# import the necessary module
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score
#create an object of the type GaussianNB
gnb = GaussianNB()
#train the algorithm on training data and predict using the testing data
pred = gnb.fit(data_train, target_train).predict(data_test)
#print(pred.tolist())
#print the accuracy score of the model
print("Naive-Bayes accuracy : ",accuracy_score(target_test, pred, normalize = True))
Naive-Bayes accuracy : 0.759056732741

Now let’s take a closer look at what we just did. First, we imported the GaussianNB method and the accuracy_score method. Then we created an object gnb of the type GaussianNB. After this, we trained the algorithm on the testing data(data_train) and testing target(target_train) using the fit() method, and then predicted the targets in the test data using the predict() method. Finally we printed the score using the accuracy_score() method and with this we have successfully applied the Naive-Bayes algorithm to build a prediction model.

Now lets see how the other algorithms in our list perform as compared to the Naive-Bayes algorithm.

LinearSVC

LinearSVC or Linear Support Vector Classification is a subclass of the SVM (Support Vector Machine) class. We won’t go into the intricacies of the mathematics involved in this class of algorithms, but on a very basic level LinearSVC tries to divide the data into different planes so that it can find a best possible grouping of different classes. To get a clear understanding of this concept let’s imagine a data set of ‘dots’ and ‘squares’ divided into a two dimensional space along two axis, as shown in the image below:

SVM-1
Source:StackOverflow

In the image above a LinearSVC implementation tries to divide the two-dimensional space in such a way that the two classes of data i.e the dots and squares are clearly divided. Here the two lines visually represent the various division that the LinearSVC tries to implement to separate out the two available classes.

A very good writeup explaining a Support Vector Machine(SVM) can be found here for those who’d like more detail, but for now, let’s just dive in and get our hands dirty:

#import the necessary modules
from sklearn.svm import LinearSVC
from sklearn.metrics import accuracy_score
#create an object of type LinearSVC
svc_model = LinearSVC(random_state=0)
#train the algorithm on training data and predict using the testing data
pred = svc_model.fit(data_train, target_train).predict(data_test)
#print the accuracy score of the model
print("LinearSVC accuracy : ",accuracy_score(target_test, pred, normalize = True))
LinearSVC accuracy : 0.777811004785

Similar to what we did during the implementation of GaussianNB, we imported the required modules in the first two lines. Then we created an object svc_model of type LinearSVC with random_state as ‘0’. Hold on! What is a “random_state” ? Simply put the random_state is an instruction to the built-in random number generator to shuffle the data in a specific order.

Next, we trained the LinearSVC on the training data and then predicted the target using the test data. Finally, we checked the accuracy score using the accuracy_score() method.

Now that we have tried out the GaussianNB and LinearSVC algorithms we will try out the last algorithm in our list and that’s the K-nearest neighbours classifier

K-Neighbors Classifier

Compared to the previous two algorithms we’ve worked with, this classifier is a bit more complex. For the purposes of this tutorial we are better off using the KNeighborsClassifier class provided by scikit-learn without worrying much about how the algorithm works. (But if you’re interested, a very detailed explanation of this class of algorithms can be found here)

Now, let’s implement the K-Neighbors Classifier and see how it scores:

#import necessary modules
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
#create object of the lassifier
neigh = KNeighborsClassifier(n_neighbors=3)
#Train the algorithm
neigh.fit(data_train, target_train)
# predict the response
pred = neigh.predict(data_test)
# evaluate accuracy
print ("KNeighbors accuracy score : ",accuracy_score(target_test, pred))
KNeighbors accuracy score : 0.814550580998

The above code can be explained just like the previous implementations. First we imported the necessary modules, then we created the object neigh of type KNeighborsClassifier with the number of neighbors being n_neighbors=3. Then we used the fit() method to train our algorithm on the training set, then we tested the model on the test data. Finally, we printed out the accuracy score.

Now that we have implemented all the algorithms in our list, we can simply compare the scores of all the models to select the model with the highest score. But wouldn’t it be nice if we had a way to visually compare the performance of the different models? We can use the yellowbrick library in scikit-learn, which provides methods for visually representing different scoring methods.

Performance Comparison

In the previous sections we have used the accuracy_score() method to measure the accuracy of the different algorithms. Now, we will use the ClassificationReport class provided by the Yellowbrick library to give us a visual report of how our models perform.

GaussianNB

Let’s start off with the GaussianNB model:

from yellowbrick.classifier import ClassificationReport
# Instantiate the classification model and visualizer
visualizer = ClassificationReport(gnb, classes=['Won','Loss'])
visualizer.fit(data_train, target_train) # Fit the training data to the visualizer
visualizer.score(data_test, target_test) # Evaluate the model on the test data
g = visualizer.poof() # Draw/show/poof the data

output_38_0

In the code above, first we import the ClassificationReport class provided by the yellowbrick.classifier module. Next, an object visualizer of the type ClassificationReport is created. Here the first argument is the GaussianNB object gnb that was created while implementing the Naive-Bayes algorithm in the ‘Naive-Bayes’ section. The second argument contains the labels ‘Won’ and ‘Loss’ from the ‘Opportunity Result’ column from the sales_data dataframe.

Next, we use the fit() method to train the visualizer object. This is followed by the score() method, which uses gnb object to carry out predictions as per the GaussianNB algorithm and then calculate the accuracy score of the predictions made by this algorithm. Finally, we use the poof() method to draw a plot of the different scores for the GaussianNB algorithm. Notice how the different scores are laid out against each of the labels ‘Won’ and ‘Loss’; this enables us to visualize the scores across the different target classes.

LinearSVC

Similar to what we just did in the previous section, we can also plot the accuracy scores of the LinearSVC algorithm:

from yellowbrick.classifier import ClassificationReport
# Instantiate the classification model and visualizer
visualizer = ClassificationReport(svc_model, classes=['Won','Loss'])
visualizer.fit(data_train, target_train) # Fit the training data to the visualizer
visualizer.score(data_test, target_test) # Evaluate the model on the test data
g = visualizer.poof() # Draw/show/poof the data

output_41_0

In the code above, first we imported the ClassificationReport class provided by the yellowbrick.classifier module. Next, an object visualizer of the type ClassificationReport was created. Here the first argument is the LinearSVC object svc_model, that was created while implementing the LinearSVC algorithm in the ‘LinearSVC’ section. The second argument contains the labels ‘Won’ and ‘Loss’ from the ‘Opportunity Result’ column from the sales_data dataframe.

Next, we used the fit() method to train the ‘svc_model’ object. This is followed by the score() method which uses the svc_model object to carry out predictions according to the LinearSVC algorithm and then calculate the accuracy score of the predictions made by this algorithm. Finally, we used the poof() method to draw a plot of the different scores for the LinearSVC algorithm.

KNeighborsClassifier

Now, let’s do the same thing for the K-Neighbors Classifier scores.

from yellowbrick.classifier import ClassificationReport
# Instantiate the classification model and visualizer
visualizer = ClassificationReport(neigh, classes=['Won','Loss'])
visualizer.fit(data_train, target_train) # Fit the training data to the visualizer
visualizer.score(data_test, target_test) # Evaluate the model on the test data
g = visualizer.poof() # Draw/show/poof the data

output_43_0

Once again, we first import the ClassificationReport class provided by the yellowbrick.classifier module. Next, an object visualizer of the type ClassificationReport is created. Here the first argument is the KNeighborsClassifier object neigh, that was created while implementing the KNeighborsClassifier algorithm in the ‘KNeighborsClassifier’ section. The second argument contains the labels ‘Won’ and ‘Loss’ from the ‘Opportunity Result’ column from the sales_data dataframe.

Next, we use the fit() method to train the ‘neigh’ object. This is followed by the score() method which uses the neigh object to carry out predictions according to the KNeighborsClassifier algorithm and then calculate the accuracy score of the predictions made by this algorithm. Finally we use the poof() method to draw a plot of the different scores for the KNeighborsClassifier algorithm.

Now that we’ve visualized the results, it’s much easier for us to compare the scores and choose the algorithm that’s going to work best for our needs.

Conclusion

The scikit-learn library provides many different algorithms which can be imported into the code and then used to build models just like we would import any other Python library. This makes it easier to quickly build different models and compare these models to select the highest scoring one.

In this tutorial, we have only scratched the surface of what is possible with the scikit-learn library. To use this Machine Learning library to the fullest, there are many resources available on the official page of scikit-learn with detailed documentation that you can dive into. The quick start guide for scikit-learn can be found here, and that’s a good entry point for beginners who have just started exploring the world of Machine Learning.

But to really appreciate the true power of the scikit-learn library, what you really need to do is start using it on different open data sets and building predictive models using these data sets. Sources for open data sets include Kaggle and Data.world. Both contain many interesting data sets on which one can practice building predictive models by using the algorithms provided by the scikit-learn library.

[출처] https://www.dataquest.io/blog/sci-kit-learn-tutorial/

Loading

25 8월 2022

[산업] ‘데이터센터’를 계속 운영해야 하는 10가지 이유 

[산업] ‘데이터센터’를 계속 운영해야 하는 10가지 이유  

점점 더 많은 기업이 워크로드의 대부분 또는 전부를 클라우드로 이동하면서 서버 랙을 직접 설치 및 운영해야 할 이유는 줄어들고 있지만 (이는) 여전히 중요하다. 

클라우드로 인해 데이터센터가 서서히 빛을 잃고 있다. IT의 핵심 구성요소인 데이터센터에서 멀어지는 실질적인 이유가 있다. 클라우드 업체가 놀라운 코드를 간단하게 작성할 수 있는 놀라운 제품과 시간을 절약하는 서비스를 계속해서 선보이고 있기 때문이다. 그 편의성은 경이롭다. 

하지만 클라우드로 전환해야 하는 명백한 이유에도 불구하고, 이 트렌드에 역행하여 자체 데이터센터를 계속 운영해야 하는 몇 가지 이유가 있다(아마도 모든 워크로드는 아니더라도 일부에 해당될 수 있다). 여기서는 자체 랙에서 온프레미스로 코드를 실행해야 하는 이유 10가지를 살펴본다.
 

ⓒGetty Images

로컬 속도(Local speed)
클라우드는 전 세계에 퍼져 있는 기업에 적합한 자산이다. 먼 곳 또는 집에서 근무하는 직원들을 지원할 때도 적합하다. 하지만 직원들이 같은 건물에 있고, 같은 서버를 사용한다면 서버를 멀리 떨어진 곳에 두는 것은 그다지 적합하지 않다. 기업의 자산이 (이를테면) 우편번호도 모르는 먼 곳의 클라우드 기반 기기까지 가로질러 이동할 수 있어서다. 로컬 서버는 다른 곳에 있는 서버보다 빠르다. 게다가 네트워크 홉이 적기 때문에 장애 지점도 적다. 데이터가 건물 밖으로 나갈 일이 없다면 작은 인터넷 파이프로도 충분하다. 이게 바로 서버를 가까이 둬야 하는 이유다. 직원들이 한 곳에 있다면 필요한 서버를 가까이 두는 게 낫다.

기술적 균형(Technical tradeoffs)
일각에서는 눈에 보이지 않는 클라우드가 서버 운영, 기기 구매, 소프트웨어 설치 등 모든 일을 처리하기 때문에 이를 선호한다. 분명 클라우드는 부담을 덜어줄 수 있다. 하지만 때로는 이 모든 책임을 스스로 지는 것이 더 편안할 수 있다. 진짜? 물론 때에 따라 다르다. 중요하지 않은 작업이고, 클라우드 업체의 접근을 허용할 수 있다면 클라우드 업체가 알아서 하도록 하고 (이에 따라) IT를 조정하는 것만으로 충분하다. 그러나 자체적인 방식이 있다면 클라우드로의 이동에 수반되는 마찰로 인해 절약되는 시간만큼의 가치가 없을 수 있다.

이전 버전의 파이썬을 기반으로 한 레거시 코드를 사용했던 프로젝트를 예로 들어보자. 하지만 클라우드 업체는 최신 버전의 우분투와 새로운 버전의 파이썬을 사용하고 있었다. 다른 버전과 씨름하거나 연구실의 컴퓨터에 쓰고 있는 버전의 파이썬을 설치할 수 있었지만 코드를 다시 작성하는 것보다 컴퓨터를 구매하는 것이 더 간단했다.

이웃(Neighbors)
클라우드 업체는 모든 고객을 만족시켜야 한다. 그리고 서비스를 구매하는 기업(혹은 사용자)은 수없이 많다. 따라서 클라우드 서비스 가입은 개인 소유의 섬에 사는 것과는 다르다. 이웃과 잘 지내야 한다. 클라우드의 이웃이 악의적일 수 있다는 게 가장 극단적인 사례다. 이를테면 로우해머(Rowhammer) 공격은 같은 하드웨어의 다른 사용자에게 침입할 수 있다. 심각한 문제가 될까? 해커가 다른 클라우드 인스턴스를 자주 공격하는가? 아마 그렇지는 않을 것이다. 하지만 자체 하드웨어를 구매하는 가장 큰 장점은 데이터센터의 이웃을 걱정하지 않아도 된다는 것이다.

통제(Control)
오늘날의 계약은 돌판 위에 새겨지지 않는다. 심지어 종이에도 작성되지 않는다. 문제가 발생하면 클라우드 업체는 서비스 약관에 명시되지 않은 일부 조항을 위반했다는 모호한 주장을 하면서 사용자를 차단하는 경우가 많다. 서비스 업체에게 이러한 이메일을 받게 된 개발자와 기업의 슬픈 사연이 많다. 심지어 때로는 클라우드 업체가 이메일조차 보내지 않는다. 그리곤 모든 것이 작동을 멈춘다.

어쩌면 (이러한 문제에 대응할) 믿을 만한 변호사가 있을 수 있다. 어쩌면 이 모든 이야기가 과장됐으며, 남의 일이라고 생각할 수도 있다. 허나 클라우드 업체가 비합리적으로 행동하고, 매출을 날려버릴 가능성은 높아 보인다. 그러나 하드웨어를 통제하면 법적 장애 지점이 줄어든다는 건 확실하다.

권력(Power)
때때로 클라우드 업체는 서비스가 엉망이라는 비난을 받는다. 일부는 의도적으로 전화번호를 공개하지 않는 것 같다. 일부는 이메일에 절대 답신하지 않는 것 같다. 게시판엔 고생하는 클라우드 업체 직원에 관한 이야기도 있지만 이름을 밝히지 않은 정체불명의 악당에 관한 불평불만도 있다. 데이터센터에서 보고한다면 훨씬 더 쉽게 답변을 받을 수 있다. 물론 사라진 IT 직원에 관해 분노하는 이야기가 많은 것도 사실이다. 내부 기술 지원 인력이 멸종위기종인 것처럼 잘 보이지 않는다는 농담도 있다. 하지만 기업이 (내부 기술 지원 인력에게) 급여를 지급한다는 점에서 이는 더 나은 서비스를 확보하는 방법 중 하나다.

비용(Price)
최신 하드웨어는 항상 비싸다. 만약 (작업에서) 성능이 중요하다면 클라우드를 활용하는 게 가장 합리적일 수 있다. 하지만 다소 반복적이고 예측 가능한 작업이라면 구형 서버를 사용하여 비용을 절약할 수 있다. 물론 잠재적으로 숨겨진 비용이 있다. 구형 기기는 더 자주 고장 난다. 워크로드가 예상치 못한 다운타임을 처리할 수 있는가? 직원들이 기기를 수리할 수 있는가? 그렇게 할 수 있다면 구식 하드웨어를 사용하는 게 훨씬 더 저렴하다. 

일정한 부하(Steady loads)
클라우드에 적합한 기업은 컴퓨팅 부하가 매우 가변적이면서도 일반적으로 예측할 수 있는 곳이다. 예를 들면 스트리밍 비디오 서비스는 금요일과 토요일 밤에 대부분의 연산을 수행한다. 다시 말해, 몇 시간 동안 사용한 후 모두가 잠자리에 드는 즉시 전원을 끈다. 하지만 이 반대라면 자체 데이터센터를 운영하는 게 더 합리적일 수 있다. 할인을 받더라도 클라우드 기기를 하루 24시간, 주 7일 동안 실행하면 비싸기 마련이다. 기기를 계속 가동한다면 비용 경쟁력이 있는 로컬 데이터센터 예산을 책정하는 것이 낫다.

여분의 부동산(Extra real estate)
팬데믹으로 인해 상업용 부동산 세계가 요동쳤지만 일부 기업에는 쉽게 없앨 수 없는 여분의 공간이 있을 것이다. 이를테면 몇 년 동안 임대료가 발생하지 않는 건물을 소유하고 있을 수 있다. 클라우드 비용의 일부는 하드웨어를 보관하는 건물이다. 부동산 비용으로 인한 수익이 낮거나 심지어 없다면 빈 공간에 몇 개의 랙을 설치하는 것이 예산 대비 효과가 있을 수 있다.

저렴한 지역 전기 요금(Cheaper local power)
전기 요금은 데이터센터 운영의 큰 부분을 차지하며, 대부분의 경우 전력 비용이 하드웨어 비용보다 크다. 일부 주 또는 지방자치단체에서 로컬 비즈니스를 유치하려고 할 때 일부는 세제 혜택을 활용하지만 지역 전기 요금을 할인하여 신규 기업에 간접적으로 보조금을 지급하는 곳도 있다. 이에 따라 기존의 전기 요금이 이미 매우 저렴할 수 있으며, 그렇다면 자체 데이터센터를 운영하는 게 더 합리적일 수 있다.

할인을 받을 필요 없이 전기가 저렴한 지역도 있다. 풍부한 바람 또는 끝없는 햇빛 때문에 신재생 에너지를 더 쉽게 생산하는 곳도 있다. 비용이 저렴한 이유는 중요하지 않다. 기업의 전기 요금이 합리적인 경우 자체 시스템을 호스팅하여 클라우드 컴퓨팅 비용을 크게 절약할 수 있다는 게 중요하다.

지역 인재(Local talent)
몇몇 기업은 데이터센터 관리 인력을 최소화하고 싶어 한다. 하지만 인적 자본을 중시하는 곳도 있다. 한 기업은 일반적으로 예측할 수 없는 시기에 필요한 데이터센터 관리 인력을 확보할 수 있도록 여유 있게 채용하는 것을 선호했다. 그리고 비상사태가 발생했을 때 이 회사는 준비가 돼 있었다. 

물론 자체 데이터센터 인력을 확보하는 일은 비용이 많이 들 수 있으며, 이는 CIO들이 정당화하기 가장 어려운 비용 가운데 하나다. 하지만 데이터센터를 운영하면서 효과적으로 수행할 수 있는 다른 역할이 있지 않을까? 지역 인재를 원하고 스마트한 인력을 채용하고 싶다면 컴퓨팅 예산의 일부를 투입해 (데이터센터) 인력을 유지하는 게 바람직하다. 몇몇 클라우드 업체는 휴게실에서 소통하거나 7월 4일(편집자 주: 미국 독립기념일) 소풍을 계획하거나 회사 소프트볼장을 청소하거나 인적 자본이 기업에 제공할 수 있는 다른 일을 하지 않을 것이다. ciokr@idg.co.kr

원문보기:
https://www.ciokorea.com/news/231169#csidx609d036e3dc76bc91a1d44d46762ecd 

Loading

20 11월 2021

[비즈니스 경영] 삼성 6년만에 ‘가을야구’ 이끈 새 연봉제의 4가지 비결 한국 최고 인사전문가 원기찬 사장이 설계 “연봉 선택지는 3개, 선수가 직접 고른다”

삼성 6년만에 ‘가을야구’ 이끈 새 연봉제의 4가지 비결

한국 최고 인사전문가 원기찬 사장이 설계
“연봉 선택지는 3개, 선수가 직접 고른다”

한국의 '야구 명가'로 꼽히는 삼성 라이온즈는 이번 시즌 6년 만에 '가을야구'에 진출하며 부활했다. 한국시리즈 진출엔 실패했지만 '확실히 달라졌다'는 평가가 많다. 그 배경엔 새로 도입된 '뉴타입 인센티브' 제도가 있다. 사진은 지난달 대구 삼성라이온즈파크에서 열린 경기 종류 후 기뻐하는 라이온즈 선수들. /스포츠조선
 
한국의 ‘야구 명가’로 꼽히는 삼성 라이온즈는 이번 시즌 6년 만에 ‘가을야구’에 진출하며 부활했다. 한국시리즈 진출엔 실패했지만 ‘확실히 달라졌다’는 평가가 많다. 그 배경엔 새로 도입된 ‘뉴타입 인센티브’ 제도가 있다. 사진은 지난달 대구 삼성라이온즈파크에서 열린 경기 종류 후 기뻐하는 라이온즈 선수들. /스포츠조선

올해 한국 프로야구가 KT 위즈의 창단 첫 통합우승으로 지난 18일 막을 내렸다. 창단 최단기간 통합우승이라는 KT의 성과를 필두로 다른 의미 있는 기록도 여럿 나왔다. 그중 하나가 한국 프로야구의 명문 구단임에도 지난 5년 동안 ‘가을 야구’를 하지 못한 삼성 라이온즈의 부활이다.

라이온즈는 2016년 이후 포스트시즌 진출 ‘제로’로 암흑기에 빠졌다가 올해 성적이 급반등해 정규시즌 2위로 시즌을 마무리했다. 6년 만에 포스트시즌 진출이다. 플레이오프에서 당시 기세가 절정이었던 두산 베어스에 패했지만 이번 시즌 라이온즈가 ‘확실히 달라졌다’는 평가가 많다.

올해 라이온즈의 부활에 원기찬 라이온즈 사장이 주도해 설계한 새로운 연봉제가 큰 동력(動力)으로 작용했다는 목소리가 야구계 안팎에서 많이 들렸다. 삼성전자에 입사한 1984년 이후 30년 넘게 줄곧 인사 라인에서만 일해온 원 사장은 삼성전자 인사 담당 부사장, 삼성카드 사장 등을 거친 한국 최고의 ‘HR(인재관리) 전문가’로 꼽힌다.

지난해 사장 부임 직후부터 설계를 시작해 올해 도입한 라이온즈 새 연봉제의 핵심은 ‘선수가 스스로 자신의 연봉 체계를 선택한다’는 것이다. 미리 정한 연봉만큼만 받을 것인가, 기본급은 다소 낮추더라도 성적이 좋으면 줄인 기본급의 몇 배에 달하는 높은 성과급을 받을 것인가. 선택지를 여럿 만들고, 선택을 선수에게 맡겼다.

효율적인 인사 평가와 연봉 체계 수립은 한국 경영계의 큰 화두이기도 하다. 한국 최고 인사 전문가는 라이온즈를 어떻게 바꿨을까. 전모를 들어보았다.

◇①기본급 vs 성과급, 여러 선택지를 만들다

라이온즈 선수들은 올해 연봉 협상을 할 때 중요한 선택을 해야 했다. “기본형, 목표형, 도전형 연봉제 중 무엇을 고르겠습니까?” 구단이 제시한 세 연봉제 중 하나를 직접 고르라는 지침을 받았다. 선택지는 아래와 같다.

1) 기본형: 정해진 연봉을 시즌 성적과 무관하게 받는다.
 
2) 목표형: 기준 연봉에서 10%를 낮춘 금액으로 기본 연봉을 정하고, 이후 좋은 성적을 내면 차감한 금액의 몇 배를 더 받을 수 있다.
 
3) 도전형: 기준 연봉에서 20%를 낮춘 금액에서 기본 연봉을 정하고, 기준점 이상의 성적을 내면 차감한 금액의 몇 배를 더 인센티브로 받을 수 있다.

기업으로 치면 미리 정한 기본급만 받을지, 기본급은 다소 낮추더라도 성과에 따라 연봉이 결과적으로는 많이 높아질 가능성이 있는 성과급제로 계약할지를 직원이 정하도록 한 것이다. 라이온즈는 이런 새 연봉제에 ‘뉴타입 인센티브 제도’라는 이름을 붙였다.

원기찬 사장은 새 연봉제를 설계한 취지를 이렇게 설명했다. “저는 야구를 잘 몰랐습니다. 그런데 라이온즈에 와서 보니 시즌 중에 선수들에게 동기 부여를 할 수단이 거의 없었습니다. 시즌 시작 전에 연봉 계약을 하고 나면 한해 연봉은 그것으로 끝이니까요. 많은 선수는 연봉이 크게 뛰는 FA(프리에이전트, 다른 구단이 영입할 자격을 얻은 선수)만 보고 그전의 몇 해를 견딥니다. 시즌 중에 선수들이 더 열심히 뛰도록 만들 방법은 없을까 하는 고민 끝에 삼성경제연구소와 새로운 연봉 체계를 만들었습니다.”

선수들이 새 제도를 충분히 이해할 수 있도록 원 사장을 필두로 구단 관계자들이 여러 차례 설명회를 열었다. 한 번 유형을 선택한 후에도, 선수가 원할 경우 KBO(한국야구위원회) 등록 전까지는 얼마든지 선택지를 바꿀 수 있도록 여지를 주었다.

지난 5월 28일 대구 삼성 라이온즈파크에서 열린 경기 전 라이온즈 투수 오승환 300세이브 기념 시상식 모습. 왼쪽부터 정지택 KBO 총재, 오승환 선수, 원기찬 라이온즈 사장. 원 사장은 1980년대 초반 삼성전자 입사 때부터 줄곧 인사 라인에서 일한 한국 최고의 HR 전문가로 꼽힌다. /스포츠조선
 
지난 5월 28일 대구 삼성 라이온즈파크에서 열린 경기 전 라이온즈 투수 오승환 300세이브 기념 시상식 모습. 왼쪽부터 정지택 KBO 총재, 오승환 선수, 원기찬 라이온즈 사장. 원 사장은 1980년대 초반 삼성전자 입사 때부터 줄곧 인사 라인에서 일한 한국 최고의 HR 전문가로 꼽힌다. /스포츠조선

◇②선택은 전적으로 선수가 한다

구단은 새 연봉제를 도입하며 ‘구단이 일방적으로 강요한다’는 느낌을 주지 않으려고 애썼다고 한다. 이를 위해 ‘기본형’이라는, 이전과 같은 시스템의 연봉제를 남겨두었고 선택은 전적으로 선수에게 맡겼다. 기업으로 치면, 호봉제·연봉제·성과급제 등을 뷔페처럼 차려 놓고 직원이 고를 수 있게 한 것이다.홍준학 라이온즈 단장의 설명이다.

“프로야구는 연봉제라고는 하지만 슈퍼스타급 선수 몇 명을 빼면 대부분 선수가 구단으로부터 연봉 통보를 받는 게 그동안의 관행이었습니다. 선수 입장에선 너무 일방적이라고 느끼고 불만이 생길 수 있죠. 그래서 이번 새 연봉제는 선수의 자율적 선택권을 부여한다는 데 의미를 부여했습니다. 기본 연봉 제시는 나름의 분석을 거쳐 구단이 하지만, 기본형·목표형·도전형 중 무엇을 선택할지는 선수들에게 맡겼죠. 도전형 같은 성과급제가 모든 선수에게 좋다고는 저도 생각하지 않습니다. 오히려 그런 성적 압박에 부담을 느끼는 성격의 선수들도 있으니까요.”

통상적으로 기업이 연봉을 성과급제로 바꾸면 노조 등의 반발이 따라오기 마련이다. 하지만 라이온즈의 경우엔 ‘기본형’이라는 기존 제도의 선택지를 남겨 놓았기 때문에 새 제도 도입이 비교적 순조롭게 이뤄졌다.

선수 28명 중 FA 계약 선수 5명을 제외하면 23명인데 7명이 목표형을, 6명이 도전형을 선택했다.(FA 선수는 보통 수년에 걸친 연봉 계약을 사전에 하므로 새 연봉 계약을 하기는 어렵다.) 대상 선수 23명 중 절반이 넘는 13명이 비(非)기본형을 선택한 것이다.

선수와 감독 누구도, 어느 선수가 무슨 연봉제를 선택했는지는 모른다. 홍 단장은 “팀의 승리를 위해선 선수는 때로 희생 번트를 치는 식으로, 자신을 희생해야 할 때가 있다. 이런 상황에 감독 등이 선수의 성과 부담을 생각해 작전에 영향을 받지 않도록 하려고 철저히 비밀 유지를 하도록 했다”라고 설명했다.

2021 KBO리그 포스트시즌 플레이오프 1차전 두산과 삼성의 경기가 열린 지난 9일 라이온즈 구자욱이 1타점 2루타를 치고 환호하는 모습. 구자욱은 이번 시즌 3할6리라는 좋은 성적을 올리며 지난 몇 년 동안의 부진을 떨쳐냈다는 평가를 받는다. /스포츠조선
 
2021 KBO리그 포스트시즌 플레이오프 1차전 두산과 삼성의 경기가 열린 지난 9일 라이온즈 구자욱이 1타점 2루타를 치고 환호하는 모습. 구자욱은 이번 시즌 3할6리라는 좋은 성적을 올리며 지난 몇 년 동안의 부진을 떨쳐냈다는 평가를 받는다. /스포츠조선

◇③성과 측정의 기준, 모든 선수가 다르다

새 연봉제 중 목표형과 도전형에 따르면 선수는 구단과 협의한 ‘성적의 기준선’을 넘을 경우 기본급보다 더 많은 연봉을 받게 된다. 그런데 이 ‘기준선’은 어떻게 정할까.

홍 단장은 “다른 구단에서도 알아내려고 하는 중이어서 너무 자세히 설명하긴 어렵지만, 일단 선수마다 모두 다르다는 점은 밝힐 수 있다”라고 했다. 타자는 타율, 투수는 방어율 등 일괄적인 잣대로 인센티브를 정하는 것이 아니라 선수 개인마다 부여된 세부적인 기준에 따라 성과급이 정해진다는 것이다.

그 이유는 간단하다. 구단은 특정 선수를 뽑을 때 그 선수가 팀의 승리를 위해 어떤 역할을 해줬으면 한다는 ‘기대’가 있다. 예를 들어 메이저리그 휴스턴 애스트로스의 마틴 말도나도는 명포수로 꼽히지만 시즌 중 타율은 1할대로 엉망이었다. 하지만 도루 저지 등 수비 능력은 압도적인 세계 최고다. 이런 선수에게 타율이란 ‘잣대’로 평가하자고 해봤자 팀에도, 선수에게도 도움이 되지 않는다.

홍 단장은 “선수별로 구단이 성과를 측정할 기준을 3~5개 정도 제시했다. 선수의 어떤 점에 강점이 있고, 어느 부분의 성과를 끌어올리면 팀의 성적이 전반적으로 올라갈지를 고려해서 정했다”라고 했다. 이런 평가 기준은 원 사장이 정한 슬로건 ‘원팀 원바디 혼연일체’와도 연결이 된다. 선수 개인의 성과와 팀 전체의 성과가 최대한 연동되어야 한다는 것이다.

메이저리그 휴스턴 애스트로스의 포수 마틴 말도나도. 최고의 수비형 포수로 꼽히지만 타율은 1할대로 매우 낮다. 사진은 지난달 29일 애틀랜타 브라이브스와의 월드시리즈 3차전 모습. /AFP 연합뉴스
 
메이저리그 휴스턴 애스트로스의 포수 마틴 말도나도. 최고의 수비형 포수로 꼽히지만 타율은 1할대로 매우 낮다. 사진은 지난달 29일 애틀랜타 브라이브스와의 월드시리즈 3차전 모습. /AFP 연합뉴스

◇④성과급은 분기마다 지급한다

원기찬 사장은 경기에 패한 감독들이 인터뷰할 때 “사이클이 안 좋은데 선수들이 이겨내야 한다”라거나, “운이 좋지 않았고 분위기가 가라앉아서”라는 등의 이야기가 나오면 조금 의아했다고 했다. 그의 이야기다.

“야구를 알게 되니 흔히 말하는 ‘운’이라는 것이 팀 분위기와 상당히 연결되어 있더군요. 그런데 그동안은 시즌 중에 구단이 이 분위기를 살릴 방법이 사실 많지 않았습니다. 예전엔 승리 수당이라는 것이 있었지만 구단 간 경쟁이 과열된다며 KBO가 이를 사실상 막았더군요. 그렇다면 방법은 무엇일까. 그것이 저의 가장 큰 고민 중 하나였어요.”

그 고민의 결과가 ‘분기별 성과급 지급’이다. 목표형이나 도전형을 선택한 선수들에겐 분기마다 인센티브가 지급된다. 야구엔 ‘분기’ 개념이 없다지만 문제는 없었다. 새로 만들었다. 총 144경기를 4로 나누어, 36경기마다 성과를 측정하고 목표를 달성했을 경우엔 이에 상응하는 인센티브를 지급했다. 코치진과 구단도 한 분기가 끝날 때마다 강점과 약점을 분석하는 리뷰 시간을 가졌다. 경영학의 QBR(quarterly business review), 즉 ‘분기별 심층 분석’을 야구에 접목한 것이다.

홍준학 단장은 “아무리 날고 기는 선수도 ‘업앤드다운(up & down, 실력이 오르락내리락하는 것)’이 있다 ‘다운’이 길어지면 선수도 구단도 괴로운데, 분기제는 1년을 4분의 1로 쪼개 집중할 계기를 부여함으로써 부진한 시기를 제도적으로 줄이려는 시도였다”라고 했다.

라이온즈는 내년에도 올해의 새 연봉제를 이어가되, 첫해에 발견된 맹점은 일부 보완할 계획이다. 예를 들어 선수가 시즌 초반에 부상으로 뛰지 못하게 될 경우 성과를 만회할 방법이 없어 의욕이 떨어진다는 문제 등에 대한 보완책을 마련 중이다.

원기찬 사장은 “운과 분위기는 다르다”고 했다. “운은 어쩔 수 없다는 의미를 내포합니다. 하지만 사람들이 ‘운’이라고 할 때 사실은 분위기와 기세를 뜻할 때가 많아요. 분위기 그리고 기세라는 변수는, 뭔가 기업경영식 해법으로 풀 수 있지 않을까 생각합니다.” 그의 카카오톡 프로필엔 이렇게 적혀 있었다. ‘악으로 깡으로 부활한다 라이온즈.’

삼성전자 인사팀장(부사장) 시절인 2012년 9월 당시 원기찬 삼성 라이온즈 사장의 모습. 그는 1984년 삼성에 입사한 후 30년 넘게 인사 한 분야에서만 일했다. 라이온즈에 인센티브를 강화하되 선수 선택권을 넓힌 새 연봉제를 도입한 그는 "야구에 와서 보니 분위기와 기세가 매우 중요함을 느꼈고, 이 분야는 경영적 솔루션으로 풀어갈 부분이 많은 것 같았다"라고 했다. /이진한 기자
 
삼성전자 인사팀장(부사장) 시절인 2012년 9월 당시 원기찬 삼성 라이온즈 사장의 모습. 그는 1984년 삼성에 입사한 후 30년 넘게 인사 한 분야에서만 일했다. 라이온즈에 인센티브를 강화하되 선수 선택권을 넓힌 새 연봉제를 도입한 그는 “야구에 와서 보니 분위기와 기세가 매우 중요함을 느꼈고, 이 분야는 경영적 솔루션으로 풀어갈 부분이 많은 것 같았다”라고 했다. /이진한 기자

[출처] https://www.chosun.com/economy/2021/11/20/MZPJC2IYEVBHBGTZG3VD4YKBHA/

Loading

23 9월 2021

[一日30分 인생승리의 학습법] [알쓸IT잡] 가상현실(VR), 증강현실(AR), 혼합현실(MR)을 아우르는 확장현실(XR, eXtended Reality)

[一日30分 인생승리의 학습법] [알쓸IT잡] 가상현실(VR), 증강현실(AR), 혼합현실(MR)을 아우르는 확장현실(XR, eXtended Reality)

[알쓸IT잡] 가상현실(VR), 증강현실(AR), 혼합현실(MR)을 아우르는 확장현실(XR, eXtended Reality)

나이앤틱(Niantic)은 2016년 7월에 위치 기반 증강현실(Augmented Reality, AR) 모바일 게임인 ‘포켓몬 GO’를 출시했다. 이 게임은 스마트폰에 있는 GPS를 통해 실제 세계에 포켓몬과 세계관 내에 존재했던 시설들을 구현했다. 8090세대에게는 다시 한번 포켓몬에 대한 추억의 향기를 느낄 수 있었던 혁명적인 게임이다. 게임 유저들은 실제로 만화 및 게임 속의 주인공이 되어 출퇴근 및 산책을 하면서 어릴 때 한 번쯤 상상했던 포켓몬 트레이너가 되는 꿈을 실현할 수 있었다. 

 

증강현실과 비슷한 개념으로 가상현실(Virtual Reality, VR)과 혼합현실(Mixed Reality)이 있고, 세 가지 현실을 포괄적으로 부르는 확장현실(Extended Reality, XR)이 있다. 비록 게임 및 엔터테인먼트 산업이 몰입 경험 기술의 얼리 어답터였으나, 최근에는 의료, 제조, 및 군사 산업 등이 그 가치를 알아보기 시작했다. 본 글은 앞서 언급한 몰입 경험을 제공하는 현실(Reality) 관련 용어들을 짧게 소개하고 이 기술들이 꼭 게임 시장에만 국한되지 않는다는 것을 쉽게 설명하고자 한다.

100% 디지털 세계, 가상현실 (VR)

사용자는 시야를 완전히 차단하는 HMD 웨어러블 장치를 착용하여 가상으로 만들어진 세계를 감상할 수 있다. 우리가 사는 현실과 다른 현실이라는 의미로 생긴 ‘가상현실’은 가상의 공간에 360도 카메라로 찍은 사진이나 동영상을 입힌 것이다.  

출처: TMF(The Medical Futurist)

실제로 VR은 임산부의 출산에 대한 고통을 덜었다는 사례가 있다. 런던의 한 병원의 VR 출산 참가자들로부터 받은 설문조사에 따르면, 100%의 참석자들은 VR 덕분에 전체적인 병원의 경험이 개선되었다고 했고, 그중 94%는 편안함을 느꼈다고 한다. 또한, 80%는 VR가 보여주는 콘텐츠를 보면서 고통을 덜 느낀다고 말했고, 73%는 출산에 대한 걱정이 줄었다고 한다.  

VR 훈련 시스템 (출처: ETRI)

ETRI가 개발한 ‘초실감 가상훈련시스템’은 대테러전, 해적 진압, 인질 구출 작전 등 소규모 부대 작전의 성공률을 높이기 위해 국방부에 투입되었다. 이 시스템은 위성영상 등의 정보를 모아 미지의 작전지역을 가상공간으로 구축하여 체험자에게 실전과 같은 훈련을 제공한다. 

스마트 장치에 의존하는 증강현실 (AR)

‘증강현실’이란 실제로 존재하는 사물 또는 환경에 가상의 사물이나 환경을 덧입혀서, 마치 실제로 존재하는 것처럼 보여주는 컴퓨터 그래픽 기술이다. 주로 안경, 헤드셋, 휴대폰 및 태블릿에 장착된 카메라를 통해 접근할 수 있다. 포켓몬 GO 또는 Snapchat의 필터가 AR 기술의 대표적인 예시다. 

스마트폰 카메라에 입힌 AR

차량 내비게이션 화면에도 증강현실을 볼 수 있다. 아이나비는 카메라로부터 받은 영상 위에 교통 정보를 입혀 충돌 위험시, 알람을 줄 수 있는 기능이 탑재되어있어, 운전자는 더 안정적으로 도로를 주행 할 수 있다.  

 네비게이션에도 적용 가능한 AR (출처: 아이나비 X3)

제조업은 AR을 활용하여 생산성과 정밀도를 높일 수 있다. 실제로 구글 글라스를 통해 공장 직원의 업무능력을 향상시킨 경우도 있다. 아래 그림의 직원은 공장의 설비를 다루기 전에 컴퓨터에 연결된 안경을 통해 설치 메뉴얼과 같은 기능을 확인하는 모습을 볼 수 있다. 

구글 글라스를 통해 장치의 설치 매뉴얼을 보는 공장 직원 (출처: npr)

현실과 가상현실을 융합한 혼합현실 (MR)

위에 설명한 VR은 사이버 공간의 물체를 움직일 수 있고, AR은 현실에 일부적인 정보를 보여주는 것이라면, ‘혼합현실’은 현실 공간에 가상의 물체를 배치하거나, 현실의 물체를 인식하여 가상의 공간을 구성하는 것이다. MR의 장점은 물체적인 재료 낭비가 없다는 것이다. 그 덕분에 많은 기업은 MR를 사용하여 초기 작업에 대한 비용을 절약할 수 있게 되었다.

HoloLens를 이용한 MR 사례

포드(Ford)는 마이크로소프트의 홀로렌즈(HoloLens)를 활용하여 기존의 자동차에 디지털 색을 입히거나 부분적으로 디자인을 새롭게 했고, 발포어 비티(Balfour Beatty)라는 국제 엔지니어링 및 건설 그룹은 공사 현장에 디지털 물체를 배치하여 현실 공간에 건축하고자 하는 구조물의 크기와 길이를 확실하게 파악할 수 있었다.

모든 몰입 경험을 포함할 확장현실 (XR)    

‘확장현실’은 설명했던 세 가지 현실을 모두 의미하며, 미래에 등장할 수도 있는 또 다른 변수의 몰입 경험 기술을 포괄할 수 있는 용어다. 즉, VR, AR, MR과 후에 나올 수 있는 ‘x(변수)’ 현실을 XR로 표현할 수 있다.

2022년까지 향상할 XR 시장 (출처: Visual Capitalist)

글로벌 투자자들을 위한 온라인 콘텐츠 출판매체인 Visual Capitalist는 2022년까지 XR 시장이 8배 성장하여 2022년까지 2,900억 달러 이상의 시장 규모에 도달할 것으로 예상했다. 

B2B와 B2C에도 적용할 수 있는 XR 

XR은 MR에서 확장된 개념으로 볼 수도 있다. 현실과 가상 간의 상호작용이 더욱 강화되어 현실 공간에 배치된 가상의 물체를 손으로 만질 수 있다. 예를 들어 원격 회의를 할 때, 나라와 회사 출근 여부에 상관없이 XR 사용자들은 하나의 디지털 공간에 모여서 바로 자료를 띄우거나, 데이터에 접속할 수 있다. 또한, 부동산 자산관리사는 집을 구경하고 싶은 잠재적인 세입자들에게 디지털 공간을 투어 시켜주면서, 인테리어 디자인도 한꺼번에 시범을 보일 수 있다. 

 

B2B에서 XR이 가장 많이 사용될 것으로 예상되는 산업은 의료, 제조 및 군사 산업 등이다. 의료 전문가, 공장 직원, 그리고 군인들이 위험에 도사리는 상황에 대처할 수 있도록 그들을 훈련 할 수 있는 교육 도구로도 사용될 수 있으며, 자신이나 타인을 위험에 빠뜨리지 않거나, 물체적인 재료 낭비 없이 훈련 및 교육을 시뮬레이션으로 임할 수 있다.  

 

Immersive Web Community Group은 기존에 개발 중이던 WebVR을 중단하고 AR 및 다양한 확장 사용을 위해 WebXR Device API를 개발했다. WebXR는 VR/AR 하드웨어 장비를 통해 웹으로 고성능 VR과 AR를 다룰 수 있다. 이 API를 통해 위 그림처럼 디지털 회의 공간을 구현할 수 있으며 재택 근무자와 해외 근무자들이 한 공간에서 같이 자료를 나눌 수 있는 혜택을 제공한다. 

WebXR를 지원하는 오큘러스 브라우저로 디지털 회의 공간을 구현

더불어, 키네비즈(Kineviz)의 GraphXR는 시각화된 그래프 데이터를 VR과 연동하여 2D 또는 3D로 볼 수 있는 애플리케이션을 제공한다. 현재까지는 Neo4j 데스크톱을 통해 사용할 수 있는 확장 애플리케이션이며, 이는 WebXR의 VR 기능과 연동할 수 있다. WebXR의 개발은 아직 현재 진행형이기 때문에 GraphXR의 VR 기능은 아직 베타 버전에 있다고 한다. 다가오는 미래에 XR 기술이 정규화 및 상용화된다면, 그래프XR 같은 애플리케이션이 늘어나 그래프 DB 기반 분석 솔루션에 새로운 모습을 입혀줄 것으로 기대된다. 

XR 산업과 5G의 시너지 효과

지난 알쓸IT잡에서 5G를 소개한 바 있다.  

5G의 이동통신 속성 중 초고속 광대역 통신을 구현하는 eMBB는 빠른 데이터 전송속도를 제공하여 UHD 기반 VR/AR 및 홀로그램 등 대용량 영상처리에 용이하다. 또한, 높은 신뢰를 자랑하는 URLLC는 지연시간을 최소화하여 사람의 신경 반응을 요구하는 AR의 데이터 송수신 불량 문제를 해결할 수 있다. 신경 자극의 인체 내 최대 속도는 100m/s로, 손에서 뇌까지 신호를 전하는데 소용되는 시간은 대략 10ms, 눈과 머리 움직임을 조정하는데 약 7ms가 소요된다. 즉, 5G의 초저지연성이 확보되어야 VR/AR를 원활하게 즐길 수 있고, 지연 속도의 차이로 방향 감각을 잃거나, 어지럼증을 피할 수 있다. 이처럼 다량의 영상 데이터를 실시간으로 전송하기 위해서는 5G가 확장현실(XR)의 핵심 기술임을 알 수 있다. 

 

5G를 비롯한 차세대 통신 기술이 도입되면 XR 콘텐츠가 더 현실적인 모습으로 다가올 것이다. 이를테면 재택근무 중 디지털 공간에서 PPT 발표회의를 진행한 후, 점심시간에 미국에 있는 콘서트를 잠깐 관람하거나, 앉은 자리에서 바로 화성 관광을 다녀올 수도 있을 것이다. 

몰입경험은 여러 산업에 변화를 가져올 것

또한 의과대학 학생들은 디지털 인체로 해부학을 공부하고, 공장의 엔지니어들은 설명서를 보고 들으면서 설비를 관리할 수 있을 것이다. 

 

5G 기술의 발전은 앞으로도 시도하기 어려웠던 XR 기반의 새로운 서비스 등장을 예고하고 있으며, 이는 의료 분야, 군사나 산업 분야에서도 다양하게 활용될 수 있을 것으로 기대되고 있다. 


자료 및 이미지 출처

1) https://medicalfuturist.com/5-ways-medical-vr-is-changing-healthcare/

2) https://www.samsungsds.com/global/ko/support/insights/VR-AR-MR-XR.html

3) https://www.youtube.com/watch?v=fagZfbohBW0&feature=emb_logo

4) https://www.youtube.com/watch?v=3QyA7HhIYkg&feature=emb_logo

5)https://www.npr.org/sections/alltechconsidered/2017/03/18/514299682/google-glass-didnt-disappear-you-can-find-it-on-the-factory-floor

6) https://www.visualcapitalist.com/extended-reality-xr/

7)https://static1.squarespace.com/static/5c58b86e8dfc8c2d0d700050/t/5df2bc684c2e38505cf2be1c/1576189042217/GraphXR_User_Guide_v2_2_1.pdf

8) https://www.youtube.com/watch?v=b0KglUkvEak

9) https://it.donga.com/28741/

 
 
[출처] https://bitnine.tistory.com/418

Loading

22 8월 2021

KT의 프로젝트 [KT MY KT 엡] 마이 케이티 앱 프로젝트 2021-06 : 비정상, 접속오류, 고객센터

KT의 프로젝트 [KT MY KT 엡] 마이 케이티 앱 프로젝트 2021-06 : 비정상, 접속오류, 고객센터

 : 오늘의 유머 : 일간베스트(일베) 

아래 자료문서 

2021-06 [KT 온라인채널 고객경험 혁신 my kt앱 고도화 프로젝트] 결론 자료파일 다운

2021-06 [KT 온라인채널 고객경험 혁신 my kt앱 고도화 프로젝트] 결론
 
  1. 우선 예상하는 KT 에서 기획한 내용을 나름 분석하면
    1. 기존 MY KT 앱의 analytics를 분석하여, 사용자가 가장 많이 사용하는 기능(통신 사용량조회, 영화예메, 포인트 활용, 쿠폰 사용: 혜택)만들 남기고 최대한 사용성 (UX)를 이끈다는 기획이였던것으로 여겨지나.
    2. 문제는 미래지향적인 사용자 통계 분석(analytics에 기반한) 에 비해
    3. 아마추어적인 UX 기획으로 풀다운 메뉴에 길들여진 사용자들에게 하단 에니메이션 메뉴바를 도입
    4. 메뉴바에서 사용자들이 가장 궁금해하고 많이 사용하는 “사용량 조회”의 기능을 보여주는 메뉴를 “마이”라는 개발이나 IT 전문가에게 예상할 수 있는 이름을 붙여 일반사용자에게 “사용량조회”를 찾지못하는 설계가 되었고
    5. 한페이지에 고정된 것이 아닌, 세로방향 무한스크롤 같은 모바일 앱 에서 하단 메뉴에 사용자들이 익숙지도 않으며 ,
      1. 하단에 네이게이션 메뉴가 나오며 , 메뉴가 좌우 상으로 펼쳐지며
      2. 좌우 메뉴을 터치시 화면 전환이 되며,
      3. 좌 또는 우 메뉴로 갔다가 메인으로 돌아오려면 다시 하단에 x 표시로 된 메뉴로  화면을 닫는다는
      4. 방식은 개발자가 아니면 알기 쉽지 않는 네비게이션이며
      5. 사용자들이 가장 보고싶어하는 “사용량”조회시
      6. 무리한 정준기의 카드시스템 도입으로, 화면이 껌뻑이는 플리킹 발생 및 표출되는 데이터가 맞지 않는 앱이됨
      7.  
    6. 화면설계도 KT의 매출액 증대가 목적인지 대부분 카드광고로 이루어져, 사용자는 사용량 및 계약관계 정보를 얻으려 MY KT app을 구동하지, 마케팅 광고 구독 목적이 아닌데도 80%이상을 마케팅 광고로 도배된 앱을 기획했으며
    7. 게다가 기존 기능을 디자인만 바꾼다는 명목으로 개발하면서, 기존 기능과 호환되지 않는
    8. 사용량조회 내역을 도입, 표출되는 정보가 정확하지도 않고, (데이터 함께 쓰기 회선에 통화량출력)
    9. LTE 에그 사용량이 모바일 웹에서는 나오는데, 모바일 앱 화면에서는 나오지 않으며
    10. 사용자가 사용량조회에서 원하는 것은 결국 사용량 조회가 아니라 남!은! 가용한 사용량 조회에 더 관심이 있는데도, 사용량 조회에 초점을 맞추며
    11. 기획에도 없고 설계에도 없는 카드 시스템을 정준기가 꿋꿋이 요구하면서
    12. 개발된 기능에 막대한 장애와 정준기 지가 스스로 개발해도 퍼블에 맞지않고
    13. 로그인 기능을 IMUI(아이엠 유아이) 에서 기능 변경(개선)으로 작업을 했으나 로그인 불안정을 초래하여 사용자가 로그인 할 수 없는 결과(네이티브 모바일 앱과 부정합)를 초래하고
    14. 네이티브 모바일 앱 개발자들의 개발 실수(오류)로 앱이 불안정하여 비정상 종료를 반복하며
    15. 새로 KT에서 투입한 개발진(고급,특급) 을 몰아내려는 기존 유지보수 개발자의 욕심으로 투입된 개발진이 개발 정보를 얻지못하여 개발 진행이 공전되고
    16. 급기야는 투입된 고급 개발자들 몰아내고 유지보수개발진이  자신있게 개발하려다, 유지보수 개발진 (에이엔티 솔루션 (주))의 역량을 검토한 결과 저비용을 위해서 초급, 하급 개발진으로 (서울공고_조형예술대출신, 전남대 재료공학, 신학대학_방통대)의 역량 미숙의 유지보수 개발진이 나서서 개발하여 시스템과 앱의 완성도가 형편없이 되었으며
    17. PM을 맡은 정인섭(서울공고, 계원 조형예술대학출신)이 몰엽치한, 비양심적 거짓말 행각으로 추진하는 사업이니, 결과야 안봐도 뻔하다.
    18. 앱에 게임처럼 게이미피케이션인지 이리저리 터치구동해보고 기능을 깨닫은 앱을 기획한 어처구니 없는 실수로 게이머가 대부분이 아닌 모바일 앱 사용에 사용자들은 원하는게 메뉴에 있고 메뉴를 클릭하여 해당정보를 얻는다는 게시판 식 문회의 게이머 이외의 사용자에겐 어처구니 없는 앱이 되버림
    19. 개발 중에서도 로컬 개발 노트북과 테스트를 위한 개발 서버를 교차 할 때, ctrl H 로 기존 로그인 캐쉬 비워야 로그인 되더니, 업데이트 하니까. 기존 로그인 정보가 새 로그인 정보와 맞지 않고, 업데이트로 되지 않아 로그인 불안정 생김
    20. 2021-07-26 아직 저속 저용량의 3G 사용자와 블루투스 테더링 사용자도 존재하는데 마케팅 광고 대용량의 이미지 베너 도배로 50mb에 달하는 트래픽 유발로  느린 최악의 앱으로 사용자들에게 윈성을 삼

Loading

23 4월 2020

‘파이썬’의 인기가 떨어지면 어떤 개발 언어가 뜨게 될까.

‘파이썬’의 인기가 떨어지면 어떤 개발 언어가 뜨게 될까.

01_뉴스센터 페이스북

지난 몇 년 동안 파이썬에 대한 수요가 급격하게 증가하면서, 그 인기가 식을 줄 모르고 있습니다. 파이썬이 상당한 인기를 얻으면서, PYPL에서는 2019년의 프로그래밍 언어 1순위로 ‘파이썬’을 선정했고, 스택오버플로(StackOverflow)도 개발자들을 대상으로 한 설문조사에 따라 2번째로 인기 있는 언어로 ‘파이썬’을 손꼽았는데요. 2009년부터 2020년까지 파이썬, C#, C++, 자바, 자바스크립트, R의 인기를 나타낸 도표를 보면, 2018년부터 파이썬이 계속해서 최고의 위치를 차지하고 있는 것을 볼 수 있습니다.


R은 지난 몇 년 동안 정체되어 있고, 다른 많은 언어들은 꾸준히 감소하는 추세에 있지만, 파이썬의 오름세는 막을 수 없는 것처럼 보입니다. 스택오버플로의 질문 게시판에 올라온 글들의 거의 14%에 ‘파이썬’이라는 태그가 달려 있고, 이러한 트렌드는 계속해서 지속되고 있습니다. 그렇다면 지금의 파이썬을 인기 있게 만든 요인은 무엇일까요? 그 요인으로 몇 가지를 꼽아보자면, 다음과 같습니다.

오래되었다.

파이썬은 90년대부터 존재해왔습니다. 이 말은 파이썬이 하나의 개발 언어로 성장하기에 충분한 시간이 있었다는 것만을 의미하지 않습니다. 거대한 커뮤니티들에서 파이썬에 힘을 실어주기도 했다는 것을 뜻하는데요. 파이썬으로 코딩을 하다가 문제가 생기면, 구글 검색 한 번으로 금방 해결할 수 있을 만큼 관련 정보가 방대합니다. 개발자들끼리 마주했던 문제와 해결 방법을 공유하고, 더 많은 데이터가 축적되고 사용자가 늘어나는 선순환의 구조가 파이썬의 성장을 도모한 것이죠.

사용자 친화적이다.

파이썬의 문법은 사람이 읽기에 매우 편하다는 장점을 가지고 있습니다. 우선, 데이터 타입을 지정할 필요가 없습니다. 그저 변수를 선언하기만 하면 됩니다. 그러면 파이썬은 변수의 데이터 타입이 정수(integer)인지, 부동소수점(float)인지, 불(boolean)인지, 아니면 다른 것인지를 문맥을 파악해서 이해합니다. 이 점이 초보자들에게는 엄청난 매력이죠. 여러분이 만약 C++로 프로그래밍을 해본 적이 있다면, 변수의 데이터 타입을 부동소수점에서 정수로만 바꾸어도 이곳저곳에서 컴파일 에러가 생기는 경험을 해보셨을 것입니다.

파이썬과 C++의 코드를 나란히 놓고 읽어본 적이 있다면, 파이썬이 얼마나 이해하기 쉬운 지도 이해하실 겁니다. C++는 영어를 염두에 두고 만들어진 언어임에도 불구하고, 파이썬의 코드에 비하면 도무지 해석하기가 쉽지 않습니다.

다재다능하다.

파이썬이 오랫동안 발전해왔기 때문에, 개발자들은 수없이 많은 용도로 사용할 수 있는 패키지를 만들었습니다. 그래서 요즘에는 거의 모든 것을 만들 수 있는 패키지를 찾을 수 있습니다.

숫자와 벡터, 행렬을 완벽하게 정복하고 싶다면? 넘파이(NumPy)가 여러분을 도와줄 것입니다.
과학기술과 공학을 위한 복잡한 계산을 원한다면? 사이파이(SciPy)를 써보세요.
빅데이터 조작과 분석을 해야 한다면? 판다스(Pandas)를 사용해보세요
인공지능을 시작해보고 싶다면? 사이킷런(Scikit-Lean)을 사용해볼 수 있습니다.

​여러분이 컴퓨터를 이용해서 어떤 작업을 하고 싶든지, 그것을 위한 파이썬 패키지가 어딘가에는 있을 것입니다. 최근 몇 년 동안 머신러닝(Machine Learning)이 급증하고 있는 것에서 볼 수 있듯이 말입니다.

앞에서 자세히 살펴본 내용을 기반으로, 여러분은 파이썬이 앞으로도 오랫동안 정상의 자리에 머물 것이라고 생각할 수도 있습니다. 그러나 다른 모든 기술들과 마찬가지로, 파이썬에도 약점들은 있습니다. 위시켓과 파이썬의 가장 주요한 결점들을 하나씩 살펴보고, 이것들이 얼마나 치명적인지를 평가해보세요.

속도

파이썬은 느립니다. 사실 매우 느립니다. 다른 언어들보다 파이썬을 사용해서 업무를 처리하면 평균적으로 2-10배는 더 오랜 시간이 걸립니다. 여기에는 여러 가지 이유가 있습니다. 그중 하나는 ‘동적인 데이터 타입’입니다. 다른 언어에서처럼 변수의 데이터 타입을 지정할 필요가 없다는 점을 생각해보세요. 이는 프로그램이 변수의 데이터 타입에 관계없이 작동할 수 있게 하기 위해 훨씬 더 많은 메모리를 필요로 한다는 것을 의미하는데요. 메모리를 많이 사용하게 되면 결국 컴퓨팅 시간이 오래 걸리게 됩니다.

또 하나의 이유는 파이썬이 한 번에 오직 한 개의 작업만을 실행할 수 있다는 것입니다. 이는 파이썬의 유연한 데이터 타입 때문입니다. 파이썬은 각각의 변수가 오직 하나의 데이터 타입만 가지고 있어야 합니다. 만약 병력적인 다른 프로세스가 있다면 엉망이 될 수도 있습니다.

하지만 속도라는 것은 어떻게 보면 전혀 문제가 되지 않을 수도 있습니다. 컴퓨터와 서버가 아주 저렴해졌기도 하고, 우리는 지금 1초도 안 걸리는 속도를 두고 이야기하고 있기 때문입니다. 그리고 최종 사용자들도 앱의 로딩 시간이 0.001초인지 0.01초인지에 대해서는 거의 신경을 쓰지 않습니다.

변수의 범위

원래 파이썬에서는 변수의 범위가 아주 넓었습니다. 이는 기본적으로 표현식을 평가하기 위해서 컴파일러가 우선 현재의 블록을 검색한 다음, 그곳에서 호출하는 모든 함수들을 차례로 검색한다는 것을 의미합니다. 이러한 동적인 범위의 문제는 모든 표현식들이 가능한 모든 맥락에서 검사되어야 한다는 것이며, 이는 상당히 지루한 작업입니다. 그래서 대부분의 현대적인 프로그래밍 언어들이 정적인(stastic) 변수 범위를 사용하고 있는 이유입니다.

파이썬도 정적인 범위로 전환하려고 시도했지만, 실패하고 말았습니다. 일반적으로 내부(inner) 범위에서는 외부에서 선언된 변수를 보고 그 값을 바꿀 수도 있습니다. 파이썬에서는 외부의 변수를 참조할 수는 있지만, 그 값을 바꿀 수는 없습니다. 이것이 많은 혼란을 초래하죠.

람다(Lambdas)

파이썬의 모든 유연성에도 불구하고, 람다의 사용에 있어서는 다소 제한적입니다. 파이썬에서 람다는 표현식(expression)이 될 수 있을 뿐 구문(statement)이 될 수는 없습니다. 반면에 변수는 선언하든 구문으로 표현하든 언제나 구문이 됩니다. 이는 람다가 이런 변수에서는 사용될 수 없다는 것을 의미합니다. 파이썬에서 이렇게 표현식과 구문을 나누는 것은 다소 자의적이며, 다른 언어에서는 보이지 않는 특징입니다.

공백

공백은 코드를 읽기 쉽게 만들어 주지만, 유지 보수를 어렵게 만듭니다. 파이썬에서는 공백과 들여 쓰기를 사용해서 코드의 레벨을 구분합니다. 따라서 시각적으로도 보기 좋고, 직관적이어서 이해하기 쉽죠. 다른 언어들을 예로 들면, C++은 중괄호”{ }”와 세미콜론”;”을 사용해야 합니다. 이것은 시각적으로도 복잡하고 초보자들이 보기에도 쉽지 않지만, 코드를 유지 보수하기에는 훨씬 더 좋습니다. 대형 프로젝트에서는 이것이 훨씬 더 유용합니다.

하스켈(Haskell)과 같은 새로운 언어에서는 이런 문제를 해결하고 있습니다. 이런 새로운 언어들도 공백에 의존하고 있기는 하지만, 이런 단점을 커버할 수 있는 다른 대체적인 문법도 제공하고 있습니다.

모바일 개발

데스크톱에서부터 스마트폰으로의 전환이 일어나고 있지만 파이썬으로 개발되고 있는 모바일 앱은 많지 않습니다. 그렇다고 불가능하다는 것은 아닙니다. 파이썬으로 앱을 개발하기 위한 키비(Kivy)라는 패키지가 있기 때문입니다.

하지만 파이썬은 모바일을 염두에 두고 만들어진 언어가 아닙니다. 그래서 기본적인 기능들을 만들어낼 수는 있겠지만, 모바일 앱 개발을 할 거라면 용도에 맞는 다른 언어를 사용하는 것이 좋습니다. 모바일 용도로 널리 사용되는 프로그래밍 프레임워크로는 리액트 네이티브(React Native), 플러터(Flutter), 아이코닉(Iconic), 코르도바(Cordova) 등이 있습니다.

런타임 에러(Runtime Errors)

파이썬 스크립트를 실행하려면 먼저 컴파일 할 필요가 없습니다. 대신에 실행될 때마다 매번 컴파일을 하기 때문에, 혹시나 코딩 에러가 있다고 하더라도 런타임에서 나타나게 됩니다. 이는 성능 저하와 시간 소모로 이어지며, 수많은 테스트가 필요합니다. 정말 많은 테스트를 해야 하기 때문에 초보자들에게는 좋을 수도 있지만 노련한 개발자들에게는 파이썬에서 복잡한 프로그램을 디버깅(debug)한다는 것은 매우 번거로운 일이 아닐 수 없죠.

앞으로 파이썬을 대체할 수 있는 것은 무엇일까?

러스트(Rust)는 파이썬만큼의 안전성을 제공하며, 어떤 변수도 우연히 중복해서 작성되지 않습니다. 하지만 러스트는 소유(ownership)와 차용(borrowing)이라는 개념으로 성능과 관련된 이슈를 해결하고 있습니다. 그리고 스택오버플로 인사이트(insight)에 따르면, 러스트는 지난 몇 년 동안 가장 사랑받고 있는 프로그래밍 언어라고 합니다.

고(Go)도 파이썬처럼 초보자에게 좋은 언어입니다. 그리고 아주 간단해서 코드를 유지 보수하는 일도 훨씬 더 쉽습니다. 재미있는 점은 고(GO) 개발자들이 취업시장에서 가장 많은 연봉을 받는다는 것입니다.

줄리아(Julia)는 파이썬과 정면으로 경쟁하는 아주 새로운 언어입니다. 대규모로 기술적인 컴퓨팅에서의 단점을 메워주는데요. 줄리아가 아니라면 보통은 파이썬이나 매트랩(MatLab)을 사용해서 C++ 라이브러리로 완전히 패치했을 텐데, 그 자체가 대규모의 작업이 필요한 것입니다.

시장에는 다른 언어들도 있기는 하지만, 파이썬의 약점을 보완할 수 있는 언어들은 러스트, 고, 줄리아입니다. 이 언어들은 아직 발전하고 있는 기술들, 특히 인공지능(AI)에서 뛰어난 활약을 보이고 있습니다. 스택오버플로의 태그 개수에 반영되어 있는 것처럼, 이들의 시장 점유율은 아직 미미하기는 하지만, 모두 뚜렷한 성장세를 보이고 있습니다.

어디에서나 볼 수 있는 파이썬의 인기를 감안할 때, 적어도 앞으로 5년 동안, 어쩌면 2020년대가 끝날 때까지도 새로운 언어가 파이썬을 대체하기는 쉽지 않습니다. 지금은 미래의 새로운 언어들 중에서 어떤 것이 파이썬을 대체할 수 있을지에 대해서 명확하게 말하기 힘들기 때문에 앞으로도 더욱 지켜봐야 할 것입니다.

[출처] https://www.wishket.com/news-center/detail/442/

Loading

21 4월 2020

8초 안에 청중의 귀를 사로잡는 ‘발표’의 황금법칙

8초 안에 청중의 귀를 사로잡는 ‘발표’의 황금법칙

01_뉴스센터 페이스북


지금 여러분에게는 8초의 시간이 있습니다.
그 시간 안에 사람들의 시선을 사로잡아야 합니다.

8초.

이 시간 동안에 여러분의 발표가 들을 만한 가치가 있다는 것을 사람들에게 납득시키지 못한다면, 여러분은 실패한 것입니다. 그래서 미국의 비영리단체에서 운영하는 강연회인, TED에서는 강연자들에게 표나 그래프를 보여주면서 시작하지 말고, 이야기, 대담한 선언, 질문 등으로 시작하고 조언하기도 합니다.

청중들이 호기심을 보이는 시간이 아주 짧다는 사실을 알지 못한다면 발표라는 것이 어려울 수밖에 없습니다. 사실, 대부분의 사람들은 청중들 앞에서 말하는 것을 두려워한다고 말합니다. 그렇다면 발표를 보다 쉽게 성공적인 것으로 만들 수 있는 방법을 만들면 어떨까요? 이번 시간 IT 아웃소싱 플랫폼, 위시켓은 강연 전문가 가이 가와사키가 말하는 ‘발표의 황금법칙’에 대해 알아보겠습니다.


10-20-30 법칙

애플의 Chief Evangelist인 가이 가와사키는 열 권이 넘는 베스트셀러를 쓴 작가이기도 하며, 수십 개의 기업들에게 자문가로 활동하고 있기도 합니다. 그는 애플, 나이키, 구글, 아우디, 마이크로소프트, 브라이틀링 등의 기업에서 매년 50차례가 넘는 기조 연설을 하고 있는데요. 청중들의 관심을 사로잡고, 유지하는 방법에 관해서는 그 누구보다 잘 알고 있는 전문가라고 볼 수 있습니다.

가이 가와사키는 자신이 프레젠테이션에서 사용하는 황금법칙을 공개했습니다. 그는 이것을 ’10-20-30 법칙’이라고 부르죠. 이 법칙에는 크게 3가지의 원칙이 있습니다. 하나, 슬라이드를 10페이지 이상 사용하지 않는다. 둘, 20분 이상 이야기하지 않는다. 그리고 마지막은 30포인트 보다 작은 폰트를 사용하지 않는다는 것입니다. 구체적으로 어떻게 10-20-30 법칙을 사용해볼 수 있을지 알아보겠습니다.


슬라이드를 10페이지 이상 사용하지 않는다.

마케팅에서는 명확하고 간결한 메시지가 좋은 결과를 이끌어낸다는 것을 알고 계실 겁니다. 사람들은 그러한 원칙을 기억하고 그에 따라서 행동합니다. 그런데 사람들 앞에서 발표를 하는 것도 하나의 마케팅 도구가 아닐까요? 프레젠테이션은 상대를 설득하여 원하는 바를 이끌어낸다는 점에서 마케팅의 한 형태로 볼 수 있습니다. 따라서 핵심 메시지가 명확하고 간결하게 이해될 수 있도록 다듬고 정리하는 과정이 필요합니다.

이러한 원칙을 기반으로 우리는 ’10’의 법칙을 이끌어낼 수 있습니다. 파워포인트와 같은 시각적인 보조 수단을 활용한다면 슬라이드는 최대 10장 이내로 해야 합니다. 켈로그의 시리얼인 프룻룹스(Froot Loops)에 대해서 발표를 해야 한다고 생각해보시죠.

옵션 A: 프룻룹스의 다양한 색상에 대해서 이야기를 하는데, 제품이 가진 수많은 컬러들을 각각 한 페이지씩 보여주고, 또 보여주고, 넘겨서 또 보여주고 그러고 나서 이렇게 이야기합니다. ‘자, 이제 포장에 대해서 설명해보겠습니다.’

옵션 B: 수많은 컬러들을 한 페이지씩 보여주지 말고, 그릇에 담긴 프룻룹스의 사진을 한 장의 슬라이드로 보여주는 것은 어떨까요? 색깔은 달라도 맛은 모두 똑같으니까, 그렇게 해도 된다는 말입니다.

화면에 새로운 내용이 나타날 때마다, 사람들의 집중은 여러분의 말이 아닌 화면으로 옮겨갑니다. 즉, 여러분의 이야기가 관심받는 게 아니라 여러분의 발표도구만 보이게 되는 것이죠. 또한, 슬라이드를 계속해서 넘기게 되면, 청중들은 쉽게 피로감을 느끼게 됩니다. 그러면 집중력이 금방 흐트러진 상태에서 발표가 진부하다고 생각할 수 있습니다.

슬라이드가 10장 밖에 없다면 가장 중요하고 영향력이 큰 내용에 집중할 수밖에 없습니다. 그래야지만 청중들의 관심을 슬라이드 화면에 빼앗기지 않을 수 있죠. 영양가 있는 내용의 발표 자료를 준비하고, 그것이 청중에게 잘 전달될 수 있도록 꾸준하게 연습하세요. 연습을 더 많이 할수록, 여러분이 말하는 내용을 더 잘 이해할 수 있고, 보다 편안하게 이야기를 할 수 있습니다.

프레젠테이션에서는 슬라이드가 10페이지를 넘어가지 않도록 하세요. 그 이상을 넘기게 되면 청중들의 관심도가 떨어지게 됩니다. 한 장 한 장 넘길 때마다 사람들의 흥미를 고취시킬 수 있는 발표 자료를 만드세요.


20분을 넘기지 않는다.

사람들이 집중력은 부족합니다. 사실입니다. 그래서 대부분의 강연 전문가들은 문서에서 공백을 최대한 활용하라고 말합니다.

집중력이 좋지 않다는 것은 다시 말해, 사람들이 한 가지 주제에 집중할 수 있는 시간이 한정되어 있다는 것을 의미합니다. 프레젠테이션의 경우에는 20분 정도가 적당합니다.

그 시간을 넘어간다면 여러분은 아마도 부연 설명을 하고 있거나, 옆길로 새고 있거나, 횡설수설하고 있을 가능성이 높습니다. 그리고 앞서 나온 TED에서도 강연자들에게 프레젠테이션 시간을 절반으로 줄이라고 권고하고 있습니다. 그러고 나서 또 반으로 줄이라고 이야기하죠. 슬라이드와 마찬가지로 시간을 간결하게 줄이는 것이 보다 전달력을 키우는 방법입니다.

발표가 20분을 넘기는지 아닌지 확인하고 싶다면, 여러분이 발표 연습하는 장면을 동영상으로 촬영해서 보세요. 그러게 하면 적절한 타이밍에 대해서도 파악할 수 있고, 또한 여러분의 발표가 과연 얼마큼의 매력이 있는지, 목소리는 어떻게 조절하고 있는지, 어떤 말버릇이 있는지 들을 직접 확인할 수 있습니다.


30포인트보다 작은 폰트는 사용하지 않는다.

폰트가 커지면 글자 수가 줄어들 수밖에 없습니다. 그리고 글자 수가 줄어들게 되면, 청중의 관심을 잘 유도할 수 있는 단어들을 보다 신중하게 선택하게 됩니다. 그래서 발표 화면의 내용을 더욱 명확하고 간결하게 만들 수밖에 없습니다.

슬라이드 화면에 글자가 너무 많다면 청중들은 이렇게 생각할 겁니다.’발표하는 사람의 말을 들어야 하는 거야, 아니면 저걸 다 읽어야 하는 거야?’ 청중들로 하여금 이런 고민을 하게 만들지 마세요. 작은 글씨로 꽉 차있는 발표 자료를 본다면 누구라도 여러분의 말을 귀담아듣는 것 대신 읽는 것에 집중할 것입니다.

​여러분이 프룻룹스에 대한 설명회이든, 수여식에서의 연설이든, 또는 팀 내의 주간회의이든 관계없이, 10-20-30 법칙을 활용한다면 발표를 성공적으로 진행할 수 있습니다. 기존에 어떤 방식으로 발표를 진행했든 10-20-30 법칙은 그 어떤 방식 보다 훨씬 더 효과적일 것이고, 이야기를 듣는 사람들의 관심을 끄는 일도 더 잘해낼 수 있습니다.

요약해보자면 이 원칙은 ‘장황한 것보다 간단한 핵심이 더 좋다’라는 것으로 압축해 말할 수 있겠는데요. 적은 슬라이드, 적은 시간, 적은 단어, 이것이 바로 프레젠테이션에 성공하는 공식입니다. 여러분이 충분한 연습과 함께 이 방법을 꾸준히 사용한다면, 사람들 앞에서 연설하는 것을 즐길 수 있을 겁니다.

[출처] https://www.wishket.com/news-center/detail/440/

Loading

18 8월 2018

텐서플로우 인공지능으로 소설쓰기.Writing novels with tensor flow artificial intelligence

텐서플로우 인공지능으로 소설쓰기.

Writing novels with tensor flow artificial intelligence

텐서플로우 많이들 아시죠? 텐서플로우 설치와 기본은 하였는데, 구체적인 실습을 위하여 동영상으로 시연을 작성하여 보았습니다. 실습 데이터는 깃허브에 올려진 예제인 https://github.com/crazydonkey200/ten… 입니다. 제작과 편집은 “에스테크스타닷컴” http://www.stechstar.com / http://www.stechstar.com/user/zbxe/ 에서 하였습니다. 생애 처음 발표한 동영상강좌입니다. 부족하지만 앞으로 좋은 품질의 강좌를 연재할 계획입니다. 감사합니다.

Loading